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

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 <Blinker.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#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 <DHT.h>
 
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.效果

在这里插入图片描述

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值