基于Blinker程序编写的小爱同学控制双色温吸顶灯程序
硬件:ESP8266、MOS管、双色温LED灯
程序如下:
#define BLINKER_PRO_ESP
#define BLINKER_WITHOUT_SSL
#define BLINKER_BUTTON
#define BLINKER_BUTTON_LONGPRESS_POWERDOWN
#if defined(ESP32)
#define BLINKER_BUTTON_PIN 4
#else
#define BLINKER_BUTTON_PIN D7
#endif
#define BLINKER_OTA_VERSION_CODE "0.1.1"
#define BLINKER_MIOT_LIGHT
#include <Blinker.h>
char type[] = "EjtbFjnSLpL6"; //不需要修改
char auth[] = "AU1ldFdhHy7z"; //不需要修改
//定义灯接口
#define ColdLED D2
#define WarmLED D3
//定义冷暖色温输出值
int CVal,WVal;
// 设备状态
String switchState = "on";
int modeState = 0;
int brightvalue = 0; //brightness定义和小爱回调及blinker库有冲突,故采用brightvalue
int colortemp = 0;
bool oState = false;
//定义小爱电源类回调函数
void miotPowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON)
{
digitalWrite(LED_BUILTIN, HIGH);
analogWrite(ColdLED,CVal);
analogWrite(WarmLED,WVal);
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();
switchState = "on"; //给APP反馈按钮状态
oState = true; //给小爱同学反馈按钮状态
}
else if (state == BLINKER_CMD_OFF)
{
digitalWrite(LED_BUILTIN, LOW);
analogWrite(ColdLED,LOW);
analogWrite(WarmLED,LOW);
BlinkerMIOT.powerState("off");
BlinkerMIOT.print();
switchState = "off";
oState = false;
}
BUILTIN_SWITCH.print(switchState);
}
//定义小爱亮度回调函数
void miotBright(const String & bright)
{
//BLINKER_LOG("need set Brightness:",bright); //调试过程串口监视器观察用
brightvalue = bright.toInt();
//BLINKER_LOG("now set brightness:", brightvalue); //调试过程串口监视器观察用
BlinkerMIOT.brightness(brightvalue);
BlinkerMIOT.print();
}
//定义小爱色温回调函数
void miotColoTemp(int32_t colorTemperature)
{
//BLINKER_LOG("need set colorTemperature:",colorTemperature);
colortemp = map(colorTemperature,1000,10000,0,255); //小爱同学默认色温范围是1000~10000,APP中为0~255
BlinkerMIOT.colorTemp(colorTemperature);
BlinkerMIOT.print();
}
//定义小爱状态回调函数
void miotQuery(int32_t queryCode)
{
//BLINKER_LOG("MIOT Query codes: ", queryCode);
switch (queryCode)
{
case BLINKER_CMD_QUERY_ALL_NUMBER :
//BLINKER_LOG("MIOT Query All");
BlinkerMIOT.powerState(oState ? "on" : "off");
BlinkerMIOT.print();
break;
default :
break;
}
}
//用户自定义模式设置的回调函数
void miotMode(uint8_t mode)
{
//BLINKER_LOG("need set mode: ", mode);
switch(mode)
{
case BLINKER_CMD_MIOT_DAY:
sunMode();
break;
case BLINKER_CMD_MIOT_NIGHT:
moonMode();
break;
case BLINKER_CMD_MIOT_WARMTH:
warmMode();
break;
case BLINKER_CMD_MIOT_TV:
TVMode();
break;
case BLINKER_CMD_MIOT_READING:
readMode();
break;
case BLINKER_CMD_MIOT_COMPUTER:
compuerMode();
break;
default :
break;
}
changeLight();
feedbackData();
BlinkerMIOT.mode(mode);
BlinkerMIOT.print();
}
bool dataParse(const JsonObject & data)
{
String getData;
serializeJson(data, getData);
//BLINKER_LOG("Get user command: ", getData);
modeState = data["set"]["mode"];
brightvalue = data["set"]["brt"];
colortemp = data["set"]["crt"];
changeMode();
// if you parsed this data, return TRUE.
// return true;
return true;
}
//APP端模式选择
void changeMode() {
switch(modeState)
{
case 0:
sunMode();
break;
case 1:
moonMode();
break;
case 2:
starMode();
break;
}
changeLight();
feedbackData();
}
void sunMode() {
brightvalue = 255;
colortemp = 128;
}
void moonMode() {
brightvalue = 255;
colortemp = 0;
}
void starMode() {
brightvalue = 128;
colortemp = 0;
}
void warmMode(){
brightvalue = 200;
colortemp = 0;
}
void TVMode(){
brightvalue = 128;
colortemp = 128;
}
void readMode(){
brightvalue = 200;
colortemp = 150;
}
void compuerMode(){
brightvalue = 200;
colortemp = 200;
}
void changeLight(){
//根据brightvalue,colortemp两参数调整灯
if(switchState == "on"){
CVal =map(brightvalue*colortemp/255,0,(colortemp+1),0,1023);
WVal =map(brightvalue*(255-colortemp)/255,0,(256-colortemp),0,1023);
analogWrite(ColdLED,CVal);
analogWrite(WarmLED,WVal);
switchState = "on";
oState = true;
}
else if(switchState == "off"){
analogWrite(ColdLED,LOW);
analogWrite(WarmLED,LOW);
switchState = "off";
oState = false;
}
BUILTIN_SWITCH.print(switchState);
}
void feedbackData(){
Blinker.print("mode", modeState);
Blinker.print("brt", brightvalue);
Blinker.print("crt", colortemp);
}
void heartbeat()
{
BUILTIN_SWITCH.print(switchState);
feedbackData();
}
#if defined(BLINKER_BUTTON)
ICACHE_RAM_ATTR void buttonTick()
{
Blinker.tick();
}
void singleClick()
{
BLINKER_LOG("Button clicked!");
}
void doubleClick()
{
BLINKER_LOG("Button double clicked!");
}
void longPressStart()
{
BLINKER_LOG("Button long press start!");
}
void duringLongPress()
{
// BLINKER_LOG("During button long press!");
uint16_t pressed_time = Blinker.pressedTime();
if (pressed_time >= 5000 && Blinker.configType() != BLINKER_AP_CONFIG)
{
Blinker.apConfigInit();
}
}
#endif
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
}
void switch_callback(const String & state)
{
if (state == BLINKER_CMD_ON) {
digitalWrite(LED_BUILTIN, HIGH);
analogWrite(ColdLED,CVal);
analogWrite(WarmLED,WVal);
switchState = "on";
oState = true;
}
else {
digitalWrite(LED_BUILTIN, LOW);
analogWrite(ColdLED,LOW);
analogWrite(WarmLED,LOW);
switchState = "off";
oState = false;
}
BUILTIN_SWITCH.print(switchState);
}
void setup()
{
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
pinMode(ColdLED, OUTPUT);
digitalWrite(ColdLED, LOW);
pinMode(WarmLED, OUTPUT);
digitalWrite(WarmLED, LOW);
Blinker.begin(auth,type);
Blinker.apConfigInit();
Blinker.attachData(dataRead);
Blinker.attachParse(dataParse);
Blinker.attachHeartbeat(heartbeat);
BUILTIN_SWITCH.attach(switch_callback);
//注册小爱回调函数
BlinkerMIOT.attachBrightness(miotBright);
BlinkerMIOT.attachColorTemperature(miotColoTemp);
BlinkerMIOT.attachPowerState(miotPowerState);
BlinkerMIOT.attachQuery(miotQuery);
BlinkerMIOT.attachMode(miotMode);
#if defined(BLINKER_BUTTON)
Blinker.attachClick(singleClick);
Blinker.attachDoubleClick(doubleClick);
Blinker.attachLongPressStart(longPressStart);
Blinker.attachDuringLongPress(duringLongPress);
attachInterrupt(BLINKER_BUTTON_PIN, buttonTick, CHANGE);
#endif
}
void loop()
{
Blinker.run();
}