NodeMcu连接阿里云平台,加BMP280模块,主灯开关控制,实现温度压强数据的上云。

成果演示

NodeMcu连接阿里云平台,加BMP280模块,主灯开关控制,实现温度压强数据的上云。_第1张图片


利用按钮操作可以直接控制nodemcu的led灯的亮灭,实时显示室内的温度和压强

硬件组成

一块Nodemcu开发板,bmp280模块
NodeMcu连接阿里云平台,加BMP280模块,主灯开关控制,实现温度压强数据的上云。_第2张图片
注意:在连接电路的时候要注意,SCL连接GPIO5,SDA连接GPIO4,利用IIC通信将数据传送给nodemcu开发板。

代码组成

这里只列举部分代码,这些代码也是借鉴别人自己改的,完整代码在
链接:https://pan.baidu.com/s/1oqfne9qCfDU2OLHqCQaZ_g
提取码:th87


#include    //安装esp8266arduino开发环境
#include   //安装PubSubClient库
#include    //json  V5版本
#include "aliyun_mqtt.h"
//需要安装crypto库
#include 
//#include 
#include 
#include 

#define LED     D4
#define WIFI_SSID        "TP-LINK_6B29"//替换自己的WIFI
#define WIFI_PASSWD      "wg15385778716.."//替换自己的WIFI

#define PRODUCT_KEY      "a1QA2EMzdKC" //替换自己的PRODUCT_KEY
#define DEVICE_NAME      "esp8266" //替换自己的DEVICE_NAME
#define DEVICE_SECRET    "12Q7UFMSloyEPxtJoKxewT2li7UMXw4i"//替换自己的DEVICE_SECRET

#define DEV_VERSION       "S-TH-WIFI-v1.0-20190220"        //固件版本信息

#define ALINK_BODY_FORMAT         "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"%s\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST     "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
#define ALINK_TOPIC_PROP_POSTRSP  "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post_reply"
#define ALINK_TOPIC_PROP_SET      "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"
#define ALINK_METHOD_PROP_POST    "thing.event.property.post"
#define ALINK_TOPIC_DEV_INFO      "/ota/device/inform/" PRODUCT_KEY "/" DEVICE_NAME ""    
#define ALINK_VERSION_FROMA      "{\"id\": 123,\"params\": {\"version\": \"%s\"}}"
unsigned long lastMs = 0;

WiFiClient   espClient;
PubSubClient mqttClient(espClient);

Adafruit_BMP280 bme; // I2C
unsigned  bme280_status;
float RoomTemp;

void init_wifi(const char *ssid, const char *password)      //连接WiFi
{
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED)
    {
        Serial.println("WiFi does not connect, try again ...");
        delay(500);
    }

    Serial.println("Wifi is connected.");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
}

void mqtt_callback(char *topic, byte *payload, unsigned int length) //mqtt回调函数
{
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    payload[length] = '\0';
    Serial.println((char *)payload);
   // https://arduinojson.org/v5/assistant/  json数据解析网站

    
    Serial.println("   ");
  Serial.println((char *)payload);
   Serial.println("   ");
    if (strstr(topic, ALINK_TOPIC_PROP_SET))
    {
        StaticJsonBuffer<100> jsonBuffer;
        JsonObject &root = jsonBuffer.parseObject(payload);
        int params_LightSwitch = root["params"]["LightSwitch"];
        if(params_LightSwitch==0)
        {Serial.println("led off");
        digitalWrite(LED, HIGH); 
        }
        else
        {Serial.println("led on");
        digitalWrite(LED, LOW); }
        if (!root.success())
        {
            Serial.println("parseObject() failed");
            return;
        }
    }
}
void mqtt_version_post()//主题的发布
{
    char param[512];
    char jsonBuf[1024];

    //sprintf(param, "{\"MotionAlarmState\":%d}", digitalRead(13));
    sprintf(param, "{\"id\": 123,\"params\": {\"version\": \"%s\"}}", DEV_VERSION);
   // sprintf(jsonBuf, ALINK_BODY_FORMAT, ALINK_METHOD_PROP_POST, param);
    Serial.println(param);
    mqttClient.publish(ALINK_TOPIC_DEV_INFO, param);
}
void mqtt_check_connect()//检查mqtt服务器是否连接
{
    while (!mqttClient.connected())//
    {
        while (connect_aliyun_mqtt(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET))
        {
            Serial.println("MQTT connect succeed!");
            //client.subscribe(ALINK_TOPIC_PROP_POSTRSP);
            mqttClient.subscribe(ALINK_TOPIC_PROP_SET);
            
            Serial.println("subscribe done");
            mqtt_version_post();
        }
    }
    
}

void mqtt_interval_post()//向mqttt服务器发送数据
{
    char param[512];
    char jsonBuf[1024];
    RoomTemp = bme.readTemperature();
    int inte1,frac1;
    inte1 = (int)(RoomTemp);
    frac1 = (RoomTemp - inte1) * 100;
    int Pressure=bme.readPressure();



    //sprintf(param, "{\"MotionAlarmState\":%d}", digitalRead(13));
    sprintf(param, "{\"LightSwitch\":%d,\"CurrentTemperature\":%d.%02d,\"pressure\":%d}", !digitalRead(LED),inte1,frac1,Pressure);
    sprintf(jsonBuf, ALINK_BODY_FORMAT, ALINK_METHOD_PROP_POST, param);
    Serial.println(jsonBuf);
    mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
}


void setup()
{

   

    pinMode(LED, OUTPUT);
    /* initialize serial for debugging */
    Serial.begin(115200);

    Serial.println("Demo Start");
   // Serial.println(F("BMP280 test"));

  //传感器初始化
  if (!bme.begin(0x76)) {  
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    while (1);
  }
  //WiFi初始化
    init_wifi(WIFI_SSID, WIFI_PASSWD);

//mqtt回调函数
    mqttClient.setCallback(mqtt_callback);
    
 
  
}

// the loop function runs over and over again forever
void loop()
{
    if (millis() - lastMs >= 5000)  //5S
    {
        lastMs = millis();
        mqtt_check_connect();
        /* Post */        
        mqtt_interval_post();
    }

    mqttClient.loop();

   

阿里云平台的配置

STEP1 创建产品
https://iot.console.aliyun.com/lk/summary
访问以上链接登录阿里云物联网平台,若没有账户,可使用支付宝扫码快 速注册
NodeMcu连接阿里云平台,加BMP280模块,主灯开关控制,实现温度压强数据的上云。_第3张图片
服务器选择华东 2,左侧的设备管理中找到产品。单击进入产品管理界面。 在产品管理界面的右上角找到蓝色的创建产品,新建产品如图。
NodeMcu连接阿里云平台,加BMP280模块,主灯开关控制,实现温度压强数据的上云。_第4张图片
单击完成后等待几秒,在产品列表中将看到新创建的智慧小屋,单击查看
进入产品详情界面。

NodeMcu连接阿里云平台,加BMP280模块,主灯开关控制,实现温度压强数据的上云。_第5张图片
在自定义功能里选择,添加自定义功能
NodeMcu连接阿里云平台,加BMP280模块,主灯开关控制,实现温度压强数据的上云。_第6张图片
注意标识符必须和代码里定义的变量相同否则会出现错误,主灯开关类型是布尔型
NodeMcu连接阿里云平台,加BMP280模块,主灯开关控制,实现温度压强数据的上云。_第7张图片
Ø STEP2 添加设备
在左侧导航栏中找到设备,单击进入设备管理页面,单击添加设备。添加
设备如图。
NodeMcu连接阿里云平台,加BMP280模块,主灯开关控制,实现温度压强数据的上云。_第8张图片

单击确认后,会弹出设备的三元组信息窗口,如下图所示,单击一键复
制。
NodeMcu连接阿里云平台,加BMP280模块,主灯开关控制,实现温度压强数据的上云。_第9张图片
这里的三元组就是替换在代码里的三元组

代码烧录及检查运行状态

NodeMcu连接阿里云平台,加BMP280模块,主灯开关控制,实现温度压强数据的上云。_第10张图片
通过串口排查错误
NodeMcu连接阿里云平台,加BMP280模块,主灯开关控制,实现温度压强数据的上云。_第11张图片

总结

利用nodemcu开放板类似于小型的arduino,自己集成了esp8266并且还有多种引脚可以使用对于新手比较友好。本例从物联网三个层次,感知层,网络层,应用层,分别进行了展示,bmp280采集数据,通过wifi传输到mqtt服务器,在阿里云平台进行应用层的开发。
NodeMcu连接阿里云平台,加BMP280模块,主灯开关控制,实现温度压强数据的上云。_第12张图片

你可能感兴趣的:(自己的小实验,arduino,物联网,wifi)