#define BLINKER_BUTTON
#define BLINKER_BUTTON_PIN D1//外部中断引脚
#define BLINKER_WIFI
#define BLINKER_ESP_SMARTCONFIG//EspTouch配网
#include <Blinker.h>
#include <DHT.h>
#define DHTTYPE DHT11
#define DHTPIN D4
#define RGB_Red D5
#define RGB_Green D6
#define RGB_Blue D7
char auth[] = "ff0e913b8883";
DHT dht(DHTPIN, DHTTYPE);
float num_hum_read = 0;
float num_tem_read = 0;
uint32_t read_time = 0;
int keyval = 0;//按键开关值暂存,临时保存按键的扫描值
int old_val = 0;//按键开关值备份,保存前一次的扫描值
int Switch[7] = {};//用于储存各个开关的状态,1表示开启,0表示关闭
// 新建组件对象
BlinkerButton Button1("btn-led");
BlinkerButton Button2("btn-f5");
BlinkerButton Button3("btn-rgb");
BlinkerButton Button4("btn-atmo");
BlinkerNumber Temperature("num-tem");
BlinkerNumber Humidity("num-hum");
BlinkerNumber red("num-red");
BlinkerNumber green("num-green");
BlinkerNumber blue("num-blue");
BlinkerRGB RGB("col-rgb");
void colorRGB(int r_val , int g_val , int b_val)//控制RGB的颜色
{
analogWrite(RGB_Red, r_val);
analogWrite(RGB_Green, g_val);
analogWrite(RGB_Blue, b_val);
}
void button1_callback(const String & state)// 按下按键即会执行该函数(选用开关模式),用于控制板载LED
{
BLINKER_LOG("get button state: ", state);
if (state == BLINKER_CMD_ON)
{
digitalWrite(LED_BUILTIN, LOW);
Switch[0] = 1;
Button1.color("#FF0000"); Button1.text("LED"); Button1.print("on");
}
else if(state == BLINKER_CMD_OFF)
{
digitalWrite(LED_BUILTIN, HIGH);
Switch[0] = 0;
Button1.color("#808080"); Button1.text("LED"); Button1.print("off");
}
}
void button2_callback(const String & state)// 按下按键即会执行该函数(选用普通模式),用于刷新app各组件的状态
{
/***********************板载LED**************************/
if(Switch[0] == 1)
{ Button1.color("#FF0000"); Button1.text("LED"); Button1.print("on"); }
else if(Switch[0] == 0)
{ Button1.color("#808080"); Button1.text("LED"); Button1.print("off");}
/***********************RGB开关状态************************/
if(Switch[5] == 1)
{ Button3.color("#FF0000"); Button3.text("RGB"); Button3.print("on"); }
else if(Switch[5] == 0)
{ Button3.color("#808080"); Button3.text("RGB"); Button3.print("off");}
/***********************氛围灯状态**************************/
if(Switch[6] == 1)
{ Button4.color("#FF0000"); Button4.text("氛围灯"); Button4.print("on"); }
else if(Switch[6] == 0)
{ Button4.color("#808080"); Button4.text("氛围灯"); Button4.print("off");}
/********************RGB的数值和调色盘***********************/
red.print(Switch[1]); green.print(Switch[2]); blue.print(Switch[3]);
RGB.print(Switch[1], Switch[2], Switch[3], Switch[4]);
}
void button3_callback(const String & state)// 按下按键即会执行该函数(选用开关模式),用于控制RGB灯的亮灭
{
BLINKER_LOG("get button state: ", state);
if (state == BLINKER_CMD_ON)
{
Switch[1] = 255; Switch[2] = 255; Switch[3] = 255; Switch[5] = 1;
colorRGB( Switch[1] , Switch[2] , Switch[3] );
Button3.color("#FF0000"); Button3.text("RGB"); Button3.print("on");
red.print(Switch[1]); green.print(Switch[2]); blue.print(Switch[3]);
RGB.print(Switch[1], Switch[2], Switch[3], Switch[4]);
}
else if (state == BLINKER_CMD_OFF)
{
Switch[1] = 0; Switch[2] = 0; Switch[3] = 0; Switch[5] = 0;
colorRGB( Switch[1] , Switch[2] , Switch[3] );
Button3.color("#808080"); Button3.text("RGB"); Button3.print("off");
Button4.color("#808080"); Button4.text("氛围灯"); Button4.print("off");
red.print(Switch[1]); green.print(Switch[2]); blue.print(Switch[3]);
RGB.print(Switch[1], Switch[2], Switch[3], Switch[4]);
}
}
void button4_callback(const String & state)// 按下按键即会执行该函数(选用开关模式),用于控制氛围灯的亮灭
{
BLINKER_LOG("get button state: ", state);
if (state == BLINKER_CMD_ON)
{
Switch[6] = 1; Switch[5] = 1;
Button4.color("#FF0000"); Button4.text("氛围灯"); Button4.print("on");
}
else if(state == BLINKER_CMD_OFF)
{
Switch[1] = 0; Switch[2] = 0; Switch[3] = 0; Switch[5] = 0; Switch[6] = 0;
colorRGB( Switch[1] , Switch[2] , Switch[3] );
Button4.color("#808080"); Button4.text("氛围灯"); Button4.print("off");
}
while( Switch[6] == 1 && Switch[5] == 1 )
{
colorRGB(random(0,255),random(0,255),random(0,255));
Blinker.delay(1000);
}
}
void rgb_callback(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value)// 调色板用于控制RGB灯的颜色,不能改变亮度
{
BLINKER_LOG("R value: ", r_value);
BLINKER_LOG("G value: ", g_value);
BLINKER_LOG("B value: ", b_value);
BLINKER_LOG("Rrightness value: ", bright_value);
Switch[1] = (int)r_value; Switch[2] = (int)g_value; Switch[3] = (int)b_value; Switch[4] = 127;
colorRGB( Switch[1] , Switch[2] , Switch[3] );
Switch[5] = 1;
Button3.color("#FF0000"); Button3.text("RGB"); Button3.print("on");
RGB.print(Switch[1], Switch[2], Switch[3], Switch[4]);
red.print(Switch[1]); green.print(Switch[2]); blue.print(Switch[3]);
}
void buttonTick()// 外部中断函数,通过按键可以控制RGB灯的状态
{
int keyval = digitalRead(D1);
if(keyval!= old_val)
{
if( old_val == 1) //如果前次值为1,则说明当前是弹起动作
{
if( Switch[5] == 1 )
{
Switch[1] = 0; Switch[2] = 0; Switch[3] = 0; Switch[5] = 0; Switch[6] = 0;
colorRGB( Switch[1] , Switch[2] , Switch[3] );
Button3.color("#808080"); Button3.text("RGB"); Button3.print("off");
Button4.color("#808080"); Button4.text("氛围灯"); Button4.print("off");
red.print(Switch[1]); green.print(Switch[2]); blue.print(Switch[3]);
RGB.print(Switch[1], Switch[2], Switch[3], Switch[4]);
}
else if( Switch[5] == 0 )
{
Switch[1] = 255; Switch[2] = 255; Switch[3] = 255; Switch[5] = 1;
colorRGB( Switch[1] , Switch[2] , Switch[3] );
Button3.color("#FF0000"); Button3.text("RGB"); Button3.print("on");
red.print(Switch[1]); green.print(Switch[2]); blue.print(Switch[3]);
RGB.print(Switch[1], Switch[2], Switch[3], Switch[4]);
}
}
old_val=keyval;//更新备份为当前值,以备进行下次比较
}
}
void heartbeat()
{
/***********************温湿度传感器****************************/
if (read_time == 0 || (millis() - read_time) >= 2000)
{
read_time = millis();
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f))
{
BLINKER_LOG(F("Failed to read from DHT sensor!"));
return;
}
num_hum_read = h;
num_tem_read = t;
}
Temperature.print(num_tem_read);
Humidity.print(num_hum_read);
}
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate();
uint32_t BlinkerTime = millis();
Blinker.print(BlinkerTime);
Blinker.print("millis", BlinkerTime);
}
void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化IO
pinMode(RGB_Red, OUTPUT);
pinMode(RGB_Green, OUTPUT);
pinMode(RGB_Blue, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
colorRGB(0,0,0);
// 初始化blinker
Blinker.begin(auth);
Blinker.attachData(dataRead);
Blinker.attachHeartbeat(heartbeat);
Button1.attach(button1_callback);
Button2.attach(button2_callback);
Button3.attach(button3_callback);
Button4.attach(button4_callback);
RGB.attach(rgb_callback);
#if defined(BLINKER_BUTTON)
attachInterrupt(BLINKER_BUTTON_PIN, buttonTick, CHANGE);
#endif
dht.begin();
}
void loop()
{
Blinker.run();
}