基于Arduino的NodeMCU(ESP8266)上报温湿度及烟感值到物联网平台

功能点

  • MQTT连接到UCloud IoT 物联网云平台
  • 通过设备影子上报温度、湿度、烟感值到云平台
  • 通过云平台M2M实现数据的上行下行交换
  • smartconfig 通过手机APP一键配置WiFi连接
  • 将WiFi连接信息存储到片上flash

开发准备

硬件

  • NodeMCU开发板 x 1
    NodeMCU是一款基于乐鑫ESP8266的开发板,将ESP8266上的片上资源引出来方便外界传感器,片上资源包括IO、UART、I2C、SPI、AD等,原先作者做了移植以基于lua开发,现在也支持Ardiuno环境的开发。
    目前市面上的NodeMCU有两种,CH-340和CP2102分别对应的是不同的串口芯片,CP2102稍微稳定些,价格也会贵些;
  • DHT11温湿度传感器 x 1
    DHT11采用单总线是,1秒钟更新一次温度及湿度数据
  • MQ-2烟感传感器 x 1
    MQ-2可以探测液化气、丁烷、丙烷、 甲烷、酒精、氢气、烟雾等,有两路信号,可以为开关量,也可以是模拟值,通过AD采样。MQ-2的工作电压为5V。
  • microUSB线 x 1
  • 2.3mm杜邦线若干
  • 3.3v-5v TTL电平转换模块 x 1

软件

IDE

  • Arduino开发环境

Lib

  • EspMQTTClient
  • Arduino_JSON
  • FS(FileSystem)
  • DHTesp (DHT11)
  • JustWifi (SmartConfig)

开发流程

Arduino开发简介

Arduino新建工程时,只有两个函数setup()loop(),一个用于初始化,只执行一次,另一个是死循环,用于循环执行的任务;

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

在Arduino的main()函数中,就知道为什么只需要实现这两个函数了:

#include 

int main(void)
{
	init();
 
	initVariant();
 
	setup();  //  setup()
    
	for (;;) {
		loop();  //  loop()
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

连接UCloud IoT物联网平台

UCloud物联网平台提供海量的设备连接,支持MQTT、规则引擎等功能,目前公测阶段,还是免费的,具体可以参考使用教程创建产品设备,设备注册分为动态注册和静态注册两种:

  • 静态注册

    MQTT Server IP: mqtt-cn-sh2.iot.ucloud.cn
    Client ID:      #productsn#.#devicesn#             //     比如:7y94syp89zig70fi.421o3357z4nojejj     
    User Name:      #productsn#|#devicesn#|#authmode#      //比如:7y94syp89zig70fi|421o3357z4nojejj|1
    Password:       #devicesecret#                     //     比如:wurajvme8rdh5tp7      
    
    注:authmode为1时为静态注册,使用设备密钥作为password;
                为2时为动态注册,使用产品密钥作为password
    
  • 动态注册(需在控制台打开动态注册)

    1. 动态注册需要打开控制台注册开关。
    2. 动态注册和静态注册是一致的,但是#devicesn#需要自己生成,字符 串长度<64字符,禁止使用*#/|.:等字符,若发生和已经激活的设备重 复,会登录失败,需要更换新的#devicesn#
    3. 动态注册成功后,需要订阅/$system/#productsn#/#devicesn#/password获取#devicesecret#,用户在本地做持久化保存,下次即可使用#devicesecret#按照静态注册的方式登录。
    4. 一旦使用静态的方式登录后,该设备不能再使用动态注册的方式登录。
    MQTT Server IP: mqtt-cn-sh2.iot.ucloud.cn
    Client ID:      #productsn#.#devicesn#             //     比如:7y94syp89zig70fi.00016C06A629     
    User Name:      #productsn#|#devicesn#|#authmode#      //比如:7y94syp89zig70fi|00016C06A629|2
    Password:       #productsecret#                    //     比如:sqx0eltqbj402z7z      
    
    注:1. authmode为1时为静态注册,使用设备密钥作为password;
                为2时为动态注册,使用产品密钥作为password
    
Arduino实现MQTT连接到云端

EspMQTTClient Library

  1. 创建一个EspMQTTClient对象,包含
    EspMQTTClient client(
      "mqtt-cn-sh2.iot.ucloud.cn",  // MQTT Server IP
      1883,              // MQTT Server Port
      "7y94syp89zig70fi|pcur1q7jm2lb57rj|1",   // User Name
      "hly3dk1u5x8fq0b9",   // Password
      "7y94syp89zig70fi.pcur1q7jm2lb57rj"    // Client ID
    );
    
  2. 打开串口Log
    void setup()
    {
      Serial.begin(115200);
    
      // Enable debugging messages sent to serial output
      client.enableDebuggingMessages(); 
    }
    
  3. 开启MQTT Client Task,此时可以看到MQTT可以连接成功
    void loop()
    {
      client.loop();
    }
    
  4. 几个常用的函数
    // MQTT连接成功后的回调
    void onConnectionEstablished()
    {
    }
    
    // 订阅某个Topic,以及收到该Topic后的回调
    void subscribe(const String &topic, MessageReceivedCallback     messageReceivedCallback)
    {
    }
    
    // 发布消息到某个Topic
    void publish(const String &topic, const String &payload, bool     retain)
    {
    }
    

设备影子

设备影子可以保证设备在断线的情况下用户应用程序还能获取到设备的属性状态,同时也能帮助应用程序在不需要频繁访问设备的情况下直接获取到设备的状态。

上报温度,湿度,烟感值到设备影子:

// msg packet
snprintf(msg, 150, "{\"Method\":\"update\",\"St\":{\"Reported\":{\"temperature\":%.1f,\"humidity\":%.1f,\"smoke\":%.1f}},\"Version\":%d}", temperature, humidity, smoke, shadow_v);
// publish to shadow topic
client.publish("/$shadow/upstream/7y94syp89zig70fi/pcur1q7jm2lb57rk", msg); 

M2M规则引擎配置

基于Arduino的NodeMCU(ESP8266)上报温湿度及烟感值到物联网平台_第1张图片

读取温度、湿度、烟感值

DHT11 Library

读取DHT11的值
#define DHT11_IO 5 // GPIO5 DHT11
void setup()
{
    dht.setup(DHT11_IO, DHTesp::DHT11); // Connect DHT sensor to GPIO 5
}
void loop()
{
  // 获取温度和湿度
  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();
}
读取MQ-2的值
void loop()
{   
    // 使用AD获取烟感值,ESP8266的ADC是一个10位ADC,默认为读取外部电压
    float smoke = (float)analogRead(A0) * 100 / 1024; // 换算成百分比
}

SmartConfig一键配网

SmartConfig的原理是利用已经具备 Wi-Fi 网络接入能力的设备(例如智能手机)向接入点 (AP) 发送一系列 UDP 包,使用每一包的长度(即 Length 字段按照一定的通信协议(乐鑫叫做ESP-TOUCH)进行编码,SSID 和密码就包含在 Length字段中,随后设备便便可以获得并解析出所需的信息。
基于Arduino的NodeMCU(ESP8266)上报温湿度及烟感值到物联网平台_第2张图片

基于Arduino的NodeMCU(ESP8266)上报温湿度及烟感值到物联网平台_第3张图片

SmartConfig Library

乐鑫实现SmartConfig的叫ESP-TOUCH 技术,乐鑫已经在ESP8266WiFi实现了该技术。主要分为下面三部:

  • WiFi.beginSmartConfig()
  • WiFi.smartConfigDone()
  • WiFi.stopSmartConfig()
  • 获取到ssid和password,WiFi.SSID().c_str()WiFi.psk().c_str()

具体实现:

#include 
#include 

void dosmartconfig(char* wifissid, char* password) {
    // do smart config
    unsigned long _start = 0;
    justwifi_states_t _state = STATE_SMARTCONFIG_START;
    while (_state != STATE_IDLE) {
      switch (_state) {
        case STATE_SMARTCONFIG_START:
          if (!WiFi.beginSmartConfig()) {
            _state = STATE_SMARTCONFIG_FAILED;
          }
          _state = STATE_SMARTCONFIG_ONGOING;
          _start = millis();
          break;
        case STATE_SMARTCONFIG_ONGOING:
          if (WiFi.smartConfigDone()) {
            _state = STATE_SMARTCONFIG_SUCCESS;
          } else if (millis() - _start > JUSTWIFI_SMARTCONFIG_TIMEOUT) {
            _state = STATE_SMARTCONFIG_FAILED;
          }
          break;
        case STATE_SMARTCONFIG_FAILED:
          WiFi.stopSmartConfig();
          WiFi.enableSTA(false);
          _state = STATE_IDLE;
          break;
        case STATE_SMARTCONFIG_SUCCESS:
          strncpy(wifissid, WiFi.SSID().c_str(), 20);
          strncpy(password, WiFi.psk().c_str(), 20);
          infoWifi();
          _state = STATE_IDLE;
          break;
      }
      delay(20);
    }
}
使用介绍
  • 移植好上述代码后,配网时会进入该循环,等待配网
  • 下载乐鑫SmartConfig APP
    安装后的如下图:
    基于Arduino的NodeMCU(ESP8266)上报温湿度及烟感值到物联网平台_第4张图片
  • SSID为当前WiFi的SSID,Password为WiFi密码
  • 点击"Confirm"即可
  • 等待设备联网成功

读写SPI Flash

  1. 引用头文件

    #include "FS.h"
    
  2. 打开文件

    // load
    File configFile = SPIFFS.open("/config.json", "r");
    // save
    File configFile = SPIFFS.open("/config.json", "w+");
    
  3. 读写文件

    File.read()
    File.write()
    

你可能感兴趣的:(物联网平台,物联网,传感器)