You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
2.0 KiB
C++

//
// ±êÖ¾ÎïͨÐÅ - ·µÆ - IR
//
#include "RodeLightCommand.h"
void RodeLightCommand::Swap(uint16_t& a, uint16_t& b)
{
uint16_t c = a;
a = b;
b = c;
}
byte RodeLightCommand::CalcLevel(uint16_t* sorted_arr, uint16_t curr)
{
if (curr >= sorted_arr[3])
return 4;
else if (curr >= sorted_arr[2])
return 3;
else if (curr >= sorted_arr[1])
return 2;
else
return 1;
}
RodeLightCommand::RodeLightCommand()
{
ir_cmd[0] = 0x00;
ir_cmd[1] = 0xFF;
ir_cmd[2] = 0x00;
ir_cmd[3] = 0x00;
}
byte* RodeLightCommand::CMD_LightPlusOne()
{
ir_cmd[2] = 0x0C;
ir_cmd[3] = 0xF3;
return ir_cmd;
}
byte* RodeLightCommand::CMD_LightPlusTwo()
{
ir_cmd[2] = 0x18;
ir_cmd[3] = 0xE7;
return ir_cmd;
}
byte* RodeLightCommand::CMD_LightPlusThree()
{
ir_cmd[2] = 0x5E;
ir_cmd[3] = 0xA1;
return ir_cmd;
}
byte RodeLightCommand::GetCurrentLevel()
{
RodeLightCommand cmd;
uint16_t light_arr[4] = { 0 };
uint16_t current = BH1750.ReadLightLevel(), last = 0;
for (int i = 0; i < 4; i++)
{
Infrare.Transmition(cmd.CMD_LightPlusOne(), 4);
light_arr[i] = BH1750.ReadLightLevel(true);
while(abs(last - light_arr[i]) <= 200)
{
Infrare.Transmition(cmd.CMD_LightPlusOne(), 4);
light_arr[i] = BH1750.ReadLightLevel(true);
delay(1500);
}
last = light_arr[i];
delay(1500);
}
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
if (light_arr[i] < light_arr[j])
Swap(light_arr[i], light_arr[j]);
/*DataTool::PrintDataArray(light_arr, 4);
//Serial.print("Current: ");
//Serial.println(current, HEX);*/
return CalcLevel(light_arr, current);
}
void RodeLightCommand::SetToSpeclevel(byte target_lv, byte current_lv)
{
uint8_t times = 0;
RodeLightCommand cmd;
if (target_lv > current_lv)
times = target_lv - current_lv;
else
times = 4 - (current_lv - target_lv);
switch (times)
{
case 1:
Infrare.Transmition(cmd.CMD_LightPlusOne(), 4);
break;
case 2:
Infrare.Transmition(cmd.CMD_LightPlusTwo(), 4);
break;
case 3:
Infrare.Transmition(cmd.CMD_LightPlusThree(), 4);
break;
default:
return;
}
}