ESP8266+DHT11+SW2812+点灯Blinker-物联网小结

在之前就了解了点灯科技,这次对比了MIXIO,点灯在物联APP个性化设置上更丰富完善些,但是只支持免费绑定一个设备。查看Blinker.h源码看到最常用的Blinker_DHT、Blinker_RGB、Blinker_button等等。button组件已经能很好理解,但关于switch组件在源码中没理解怎么使用,这里只用button代替。 这次不分那么多单一的组件,直接是将多个组件写到一起了,分别是显示温湿度DHT11、ws2812色盘调色、三Led灯模拟交通灯间隔点亮同时也能手动单独点亮和蜂鸣器警报开关。原理都差不多,将就看。

对MIXIO 感兴趣欢迎查看其他博文:掌控板+Mixly+MixIO 初试物联网1-摇杆篇

1.安装和设置blinker APP

1.1安装blinker

可点击链接https://www.diandeng.tech/dev到官网下载新版本的应用

1.2 在blinker APP中创建并绑定新设备

打开安装好的blinker APP,新注册一个账号,然后完成登录。点击“+”开始新建设备。过程中需要记下Secret Key。也可以在后面查看Secret Key。 点击右上角“编辑”图标即可个性化自定义界面(如右下图)。需要注意的是每一个小组件都有唯一的组件名ID,如“num-6fm”,在编程代码中要与之对应,否则组件无效。 选择底部想要的组件,再拖拽到合适的位置。接着点击组件即可编辑样式和参数。(下图以数据类型组件为例) 还有更快捷的方法可以复制之前创建好的界面: 点击“界面配置”,将内容复制出来粘贴到一个txt文档保存。 想要用的时候就可以再复制到新的设备上,点击确认更新配置再刷新即可获得相同的界面设置。

1.3界面配置完成

2.程序代码

2.1添加相应的库文件

Adafruit_NeoPixel.zip blinker.zip DHT.zip

2.2详细代码

修改auth[]为自己的设备密钥修改WiFi名称和密码组件名与Blinker APP中组件名保持一致

// #define BLINKER_PRINT Serial

#define BLINKER_WIFI //放在Blinker.h的前面,否则报错

#define BLINKER_MIOT_LIGHT

#include

#include

#ifdef __AVR__

#include

#endif

#define PIN 15 // DIN PIN (GPIO15, D8)

#define NUMPIXELS 12 // Number of you led

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

#define RGB_1 "col-83q"

BlinkerRGB WS2812(RGB_1); //新建RGB灯组件对象

#define BLINKER_MIOT_SENSOR //Xiao Ai defined it as sensor equipment

#include

char auth[] = "81404c68e552"; //Lamp APP to obtain the device

char ssid[] = "xxx"; //WiFi name

char pswd[] = "xxxxxx"; //WiFi password

#define BUTTON_G "btn-k8a" //绿灯组件

#define BUTTON_Y "btn-i0k" //黄灯组件

#define BUTTON_R "btn-8jv" //红灯组件

#define BUILTIN_SW "btn-rml" //自动交通灯开关组件

#define Music_SW "btn-7co" //蜂鸣器开关组件

const int ledPin_G = 5; //GPIO5==>D1

const int ledPin_Y = 4; //GPIO4==>D2

const int ledPin_R = 0; //GPIO0==>D3

const int buzzerPin = 13; //GPIO13==>D7

bool ledG_state = false;

bool ledY_state = false;

bool ledR_state = false;

bool TrafficState = false;

bool MusicState = false;

BlinkerNumber HUMI("num-6fm"); //Define the humidity data key name

BlinkerNumber TEMP("num-7tk"); //Define the temperature data key name

#define DHTPIN 2 //Define pin GPIO2(D4) for DHT11 module connection

#define DHTTYPE DHT11 // Use the DHT 11 temperature and humidity module

//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321

//#define DHTTYPE DHT21 // DHT 21 (AM2301)

BlinkerButton ButtonG(BUTTON_G); // 绿灯按钮实例化

BlinkerButton ButtonY(BUTTON_Y); // 黄灯按钮实例化

BlinkerButton ButtonR(BUTTON_R); // 红灯按钮实例化

BlinkerButton ButtonSW(BUILTIN_SW); // 蜂鸣器开关按钮实例化

BlinkerButton MusicSW(Music_SW); // 蜂鸣器开关按钮实例化

DHT dht(DHTPIN, DHTTYPE); // dht温湿度传感器实例化

float humi_read = 0, temp_read = 0; // 温湿度变量

unsigned long previousMillis; // 红绿灯开关前一刻时间截

int lightNumber = 1; // 第几盏灯

const long interval = 3000; // 红绿灯切换间隔时间3秒

//绿灯开关回调函数

void buttonG_callback(const String & state)

{

MusicState = false;//要先关掉自动交通灯开关

if(!TrafficState){

ledG_state = !ledG_state;

if (ledG_state) {

ButtonG.icon("fas fa-lightbulb");

ButtonG.color("#00FF00");

ButtonG.print();

}else{

ButtonG.icon("far fa-lightbulb");

ButtonG.color("#008800");

ButtonG.print();

}

}

}

//黄灯开关回调函数

void buttonY_callback(const String & state)

{

MusicState = false;//要先关掉自动交通灯开关

if(!TrafficState){

ledY_state = !ledY_state;

if (ledY_state) {

ButtonY.icon("fas fa-lightbulb");

ButtonY.color("#FFFF00");

ButtonY.print();

}else{

ButtonY.icon("far fa-lightbulb");

ButtonY.color("#888800");

ButtonY.print();

}

}

}

//红灯开关回调函数

void buttonR_callback(const String & state)

{

MusicState = false;//要先关掉自动交通灯开关

if(!TrafficState){

ledR_state = !ledR_state;

if (ledR_state) {

ButtonR.icon("fas fa-lightbulb");

ButtonR.color("#FF0000");

ButtonR.print();

}else{

ButtonR.icon("far fa-lightbulb");

ButtonR.color("#660000");

ButtonR.print();

}

}

}

//交通灯开关回调函数

void switch_callback(const String & state)

{

MusicState = false;

TrafficState =!TrafficState;

if(TrafficState){

ButtonSW.icon("fas fa-toggle-on");

ButtonSW.color("#fa0000");

ButtonSW.print("on");

lightNumber = 2;

previousMillis = millis(); //每次打开或关闭开关都获取一次当前时间截

ledG_state =HIGH;ledY_state =LOW;ledR_state =LOW; //打开自动红绿灯开关时默认绿灯状态亮起

LEDcontrol();

}else{

ledG_state =LOW;ledY_state =LOW;ledR_state =LOW; //关闭自动红绿灯开关时默认绿灯状态亮起

ButtonSW.icon("fas fa-toggle-off");

ButtonSW.color("#880000");

ButtonSW.print("off");

}

}

//蜂鸣器开关回调函数

void MusicSW_callback(const String & state)

{

MusicState = !MusicState;

if(MusicState){

MusicSW.icon("far fa-stop-circle");//

MusicSW.color("#0000FF");

MusicSW.print("on");

}else{

MusicSW.icon("fas fa-play-circle");

MusicSW.color("#000088");

MusicSW.print("off");

}

}

//APP RGB颜色设置回调函数

void ws2812_callback(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value)

{

// digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));

BLINKER_LOG("R value: ", r_value);

BLINKER_LOG("G value: ", g_value);

BLINKER_LOG("B value: ", b_value);

BLINKER_LOG("Rrightness value: ", bright_value);

pixels.setBrightness(bright_value);

for(int i = 0; i < NUMPIXELS; i++){

pixels.setPixelColor(i, r_value, g_value, b_value);

}

// Blinker.delay(200);

pixels.show();

}

void heartbeat()

{

HUMI.print(humi_read); //Return humidity data to blinkerapp

TEMP.print(temp_read); //Return temperature data to blinkerapp

}

void miotQuery(int32_t queryCode) //Xiao Ai classmates voice command feedback

{

int humi_read_int = humi_read; //Remove humidity floating point

BlinkerMIOT.humi(humi_read_int); //Little love receives humidity

BlinkerMIOT.temp(temp_read); //Little love receives the temperature

}

void dataRead(const String & data)

{

BLINKER_LOG("Blinker readString: ", data);

Blinker.vibrate();

uint32_t BlinkerTime = millis();

Blinker.print("millis", BlinkerTime);

}

void setup()

{

Serial.begin(115200);

pinMode(ledPin_G, OUTPUT);

pinMode(ledPin_Y, OUTPUT);

pinMode(ledPin_R, OUTPUT);

pinMode(buzzerPin, OUTPUT);

digitalWrite(ledPin_G, LOW);

digitalWrite(ledPin_Y, LOW);

digitalWrite(ledPin_R, LOW);

digitalWrite(buzzerPin, LOW);

BLINKER_DEBUG.stream(Serial);

// 初始化blinker

Blinker.begin(auth, ssid, pswd);

pixels.begin(); //WS2812初始化

WS2812.attach(ws2812_callback); //注册调节颜色的回调函数

Blinker.attachHeartbeat(heartbeat); //每隔一分钟刷新一次温湿度到APP

dht.begin();

BlinkerMIOT.attachQuery(miotQuery);

Blinker.attachData(dataRead);

//三个LED的icon图标和文本初始化设置

ButtonG.color("#008800");

ButtonG.text("green light");

ButtonY.color("#888800");

ButtonY.text("yellow light");

ButtonR.color("#880000");

ButtonR.icon("far fa-lightbulb");

ButtonG.attach(buttonG_callback);//手动控制G灯回调函数

ButtonY.attach(buttonY_callback);//手动控制Y灯回调函数

ButtonR.attach(buttonR_callback);//手动控制R灯回调函数

ButtonSW.attach(switch_callback);//自动交通灯开关回调函数

MusicSW.attach(MusicSW_callback);//音乐开关回调函数

}

void loop()

{

Blinker.run();

dhtReadData();

LEDcontrol();

traffic_run();

MusicControl();

}

//三个LED控制函数

void LEDcontrol(){

if(ledG_state){

digitalWrite(ledPin_G,HIGH);

}else{

digitalWrite(ledPin_G,LOW);

}

if(ledY_state){

digitalWrite(ledPin_Y,HIGH);

}else{

digitalWrite(ledPin_Y,LOW);

}

if(ledR_state){

digitalWrite(ledPin_R,HIGH);

}else{

digitalWrite(ledPin_R,LOW);

}

}

//温湿度读取函数

void dhtReadData(){

float h = dht.readHumidity();

float t = dht.readTemperature();

if (isnan(h) || isnan(t))

{

BLINKER_LOG("Failed to read from DHT sensor!");

}else{

BLINKER_LOG("Humidity: ", h, " %");

BLINKER_LOG("Temperature: ", t, " *C");

humi_read = h;

temp_read = t;

}

Blinker.delay(2000);

}

//红绿灯开关函数

void traffic_run(){

if (TrafficState) {

unsigned long currentMillis = millis();

if(currentMillis - previousMillis >= interval){ //非阻塞延时

previousMillis = currentMillis;

switch (lightNumber){

case 1:ledG_state =HIGH;ledY_state =LOW;ledR_state =LOW;break;

case 2:ledG_state =LOW;ledY_state =HIGH;ledR_state =LOW;break;

case 3:ledG_state =LOW;ledY_state =LOW;ledR_state =HIGH;break;

}

lightNumber+=1;

if(lightNumber>3){

lightNumber = 1;

}

}

LEDcontrol();

}else{

LEDcontrol();

}

}

//蜂鸣器控制函数

void MusicControl(){

// Serial.println(MusicState);

if(MusicState){

digitalWrite(buzzerPin,HIGH);

delay(500);

digitalWrite(buzzerPin,LOW);

delay(500);

}else{

digitalWrite(buzzerPin,LOW);

}

}

模拟交通灯间隔数秒钟循环亮起不同的灯,避免干扰其他控制,加上之前在论坛看了这种非阻塞写法,就用上了。

免费下载附件:界面配置txt

3.引脚接线情况

4.效果

相关阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: