首先硬件部分:主控采用node MCU,灯光采用双色LED灯管,由于MCU输出电压有限不能完美驱动LED灯管,所以外加两个MOS管模块给灯管提供电源,电路简单,可玩性很高
软件方面采用Arduino IDE开发,配合点灯Blinker实现手机控制
目前已经实现了手机APP控制led灯管的亮度,色温控制,接入米家后可实现小爱同学控制开灯,关灯,亮度,色温控制
**
程序如下
**
// An highlighted block
#define BLINKER_PRINT Serial //用于打开串口
#define BLINKER_WIFI //wifi接入
#define BLINKER_MIOT_LIGHT
#include <Blinker.h>//blinker库
#define ColdLED 5 //定义led引脚,对应node MCU的D1引脚
#define WarmLED 4 //定义led引脚,对应node MCU的D2引脚
float colorW;//获取亮度x
int colorT;//获取色温y
int cold;//白光输出值
int warm;//黄光输出值
unsigned char led_power; //小灯状态
char auth[] = "7f32e0e9c032"; //密钥
char ssid[] = "FAST_6B26";//wifi名称
char pswd[] = "18839153429";//WiFi密码
BlinkerSlider Slider1("br"); //绑定亮度滑动条组件
BlinkerSlider Slider2("ct"); //绑定色温滑动条组件
//亮度滑动条回调函数
void Slider1_callback(int32_t value) {
BLINKER_LOG("亮度滑动条的值: ", value);
colorW = value;
}
//色温滑动条回调函数
void Slider2_callback(int32_t value2) {
BLINKER_LOG("色温滑动条的值: ", value2);
colorT = value2;
}
//电源类操作的回调函数
void miotPowerState(const String & state)
{
BLINKER_LOG("电源状态 : ", state);
if (state == BLINKER_CMD_ON) {
colorW = 100;
led_power = 1;
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();
}
else if (state == BLINKER_CMD_OFF) {
colorW = 0;
led_power = 0;
BlinkerMIOT.powerState("off");
BlinkerMIOT.print();
}
}
//亮度控制的回调函数
void miotBright(const String & bright)
{
colorW = bright.toInt();
Slider1.print(colorW);
BLINKER_LOG("当前亮度: ", colorW);
BlinkerMIOT.brightness(colorW);
BlinkerMIOT.print();
Slider1.print(colorW);
}
//设备查询的回调函数:
void miotQuery(int32_t queryCode)
{
BLINKER_LOG("MIOT查询代码 : ", queryCode);
switch (queryCode)
{
case 0: //查询设备的情况
BLINKER_LOG("查询亮度 : ", colorW);
BLINKER_LOG("查询色温 : ", colorT);
BlinkerMIOT.brightness(colorW);
BlinkerMIOT.brightness(colorT); //反馈灯的亮度
BlinkerMIOT.powerState(led_power ?"on":"off"); //反馈灯的亮灭
BlinkerMIOT.print(); //反馈至小爱
break;
}
}
//色温回调函数
void miotColoTemp(int32_t colorTemp)
{
BLINKER_LOG("需要设置色温 : ", colorTemp);
colorT = map(colorTemp,1000,10000,0,100);
Slider2.print(colorT);
BlinkerMIOT.colorTemp(colorTemp);
BlinkerMIOT.print();
}
//灯光控制函数
void LedControl(float x,int y){
cold = x/100*y;
warm = x/100*(100-y);
analogWrite(ColdLED, cold);
analogWrite(WarmLED, warm);
}
void setup()
{
Serial.begin(115200); //串口波特率115200
BLINKER_DEBUG.stream(Serial); //串口打印调试信息
Blinker.begin(auth, ssid, pswd);//初始化blinker
//初始化LED引脚
pinMode(ColdLED,OUTPUT);
pinMode(WarmLED,OUTPUT);
digitalWrite(ColdLED,LOW);
digitalWrite(WarmLED,LOW);
//注册电源回调函数
BlinkerMIOT.attachPowerState(miotPowerState);
//设置灯的亮度调节范围
analogWriteRange(100);
//注册设备查询
BlinkerMIOT.attachQuery(miotQuery);
//注册亮度回调函数
BlinkerMIOT.attachBrightness(miotBright);
//注册亮度滑动条回调函数
Slider1.attach(Slider1_callback);
//注册色温滑动条回调函数
Slider2.attach(Slider2_callback);
//注册色温回调函数
BlinkerMIOT.attachColorTemperature(miotColoTemp);
}
void loop()
{
Blinker.run();
LedControl(colorW,colorT);
}