【arduino】nodemcu连接阿里云上传温湿度

本博客是使用nodemcu连接温湿度传感器,并上传数据到阿里云。


#include "DHT.h"   //导入别人封装好的DHT包,在arduino就可下载
#include <ESP8266WiFi.h>//wifi功能包
#include <ArduinoJson.h>//json包
#include <AliyunIoTSDK.h>//GitHub上一个封装好的阿里云数据传输包,特别好用
AliyunIoTSDK iot;
static WiFiClient espClient;

//阿里云设备三元组,能够唯一确定设备
#define PRODUCT_KEY "xxxxxxxxxxx"
#define DEVICE_NAME "xxxxxxxxxxxx"
#define DEVICE_SECRET "xxxxxxxxxxxxxxxxxxxxxxxx"
//地区
#define REGION_ID "cn-shanghai"
//wifi信息
#define WIFI_SSID "xxxxx"
#define WIFI_PASSWD "xxxxxxxxxxx"

//定义接入的引脚为Gpio5
#define DHTPIN 5
//定义传感器类型为DHT11,因为DHT.h中封装了多种温湿度传感器的功能
#define DHTTYPE DHT11
//定义对象
DHT dht(DHTPIN, DHTTYPE);

//初始化wifi信息
void wifiInit(const char *ssid, const char *passphrase)
{
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, passphrase);
    WiFi.setAutoConnect (true);
    WiFi.setAutoReconnect (true);
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(1000);
        Serial.println("WiFi not Connect");
    }
    Serial.println("Connected to AP");
}


void setup()
{
    Serial.begin(115200);
    dht.begin(); //DHT开始工作
    //连接网络
    wifiInit(WIFI_SSID, WIFI_PASSWD);
	
	//连接阿里云
    AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);

    // 绑定属性回调,即确定从阿里云向设备发送信息后触发的方法
    AliyunIoTSDK::bindData("temp", powerCallback);
}

unsigned long lastMsMain = 0;
//StaticJsonBuffer<200> jsonBuffer;
//JsonObject& object = jsonBuffer.createObject();
DynamicJsonDocument doc(1024);
void loop()
{
    AliyunIoTSDK::loop();
    if (millis() - lastMsMain >= 3000)
    {
        lastMsMain = millis();
        doc["humi"] = dht.readHumidity();//读湿度
        doc["temp"] = dht.readTemperature();//读温度,默认为摄氏度
        String output;
        //这里需要将数据json序列化,因为send方法的参数是const char*类型。
        //具体可参考文章末尾<AliyunIoTSDK.h>源码链接
        serializeJson(doc, output);
        const char *str = output.c_str(); 
        //将数据发送至阿里云,使用的topic类列表中的物模型通信topic中的
        //  /sys/a1pjDXR6L0q/${deviceName}/thing/event/property/post
        // 这个是阿里云自带的topic。
        AliyunIoTSDK::send(str); 
        
    }
    
}

//回调函数
void powerCallback(JsonVariant p)
{
    int PowerSwitch = p["PowerSwitch"];
    if (PowerSwitch == 1)
    {
        Serial.println("11111111111111111111");
    }
    else
    {
        Serial.println("000000000000000000");
    }
}

源码链接:
<AliyunIoTSDK.h>

不懂得地方可以留言或私信。

### 实现ESP8266温湿度传感器数据上传阿里云物联网平台 为了实现这一目标,需要完成几个关键部分的工作:硬件准备、软件编程以及阿里云物联网平台配置。 #### 硬件准备 - **开发板**:选用NodeMCU (ESP8266) 开发板。 - **传感器**:采用SHTC3或其他兼容的温湿度传感器。 - **连接方式**:确保传感器与ESP8266之间正确连线,通常涉及VCC, GND, SDA, 和 SCL引脚[^1]。 #### 软件编程 使用Arduino IDE作为开发环境来编写控制逻辑。以下是具体操作: ##### 安装必要的库文件 在Arduino IDE中安装`PubSubClient`, `ArduinoJson`, 及`SparkFun SHTC3`三个外部库。这些库用于处理MQTT通信协议解析JSON消息格式和支持特定型号温度湿度感应器的操作[^4]。 ##### 编写代码示例 下面给出一段简单的代码片段展示如何初始化设备并发送温湿度信息给云端服务器: ```cpp #include <ESP8266WiFi.h> #include <PubSubClient.h> #include <Adafruit_Sensor.h> #include <DHT.h> // WiFi credentials. const char* ssid = "yourSSID"; const char* password = "yourPASSWORD"; // MQTT Broker settings. const char* mqtt_server = "mqtt://iot-as-mqtt.cn-shanghai.aliyuncs.com"; // 替换成实际地址 const int mqtt_port = 1883; const char* client_id = "YourClientId|securemode=2,signmethod=hmacsha1|timestamp="; // 需要替换为自己的client id String deviceName = "deviceName"; // 设备名称 char topic[50]; void setup_wifi() { delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } randomSeed(micros()); Serial.println(""); Serial.println("WiFi connected"); } void reconnect(PubSubClient& client) { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); if (client.connect(client_id)) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void setup() { pinMode(D7, OUTPUT); // LED pin for status indication digitalWrite(D7, LOW); // Turn off the onboard LED initially Serial.begin(9600); setup_wifi(); sprintf(topic,"/sys/%s/%s/thing/event/property/post", deviceName.c_str(), productKey.c_str()); // 构建发布主题路径 PubSubClient client(WiFiClient(), mqtt_server, mqtt_port, callbackFunction); DHT dht(D4,DHT11); // 初始化DHT对象,假设DHT接到了GPIO2上即D4端口 dht.begin(); // 启动DHT传感器 } void loop() { static unsigned long lastMillis = millis(); float h = dht.readHumidity(); float t = dht.readTemperature(); if(isnan(h) || isnan(t)){ Serial.println(F("Failed to read from DHT sensor!")); return; } StaticJsonDocument<200> doc; JsonObject payload = doc.to<JsonObject>(); payload["params"]["temperature"] = t; payload["params"]["humidity"] = h; String output; serializeJson(doc,output); if(!client.connected()){ reconnect(client); } client.publish(topic,output.c_str()); delay(30000-(millis()-lastMillis)); // 每隔三十秒更新一次数据 } ``` 此段代码实现了每隔30秒钟向指定的主题推送当前测量得到的温度和相对湿度值,并且包含了错误处理机制以应对可能发生的异常情况。 #### 平台设置 登录到阿里云官网创建相应的IoT应用实例,在产品定义页面添加新的Device Type(例如:“Temperature Humidity Monitor”),接着按照指引注册具体的物理设备实体。注意记录下分配给该装置的身份验证参数如Product Key、Device Name等重要信息以便后续编码时调用[^3]。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值