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++
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;
|
|
}
|
|
} |