arduino在之前灯的基础上再添加两个库
Adafruit_Sensor,#include “DHT.h”
代码如下
#include <ESP8266WiFi.h> // 引入Arduino ESP8266核心库
#include <ArduinoJson.h> // 引入JSON处理库
#include <Ticker.h> // 引入定时库
#include "PubSubClient.h" // 引入MQTT处理库
#include "AliyunIoTSDK.h" // 引入阿里云 IoT SDK
#include "DHT.h" // 引入DHT11库
const char* WIFI_SSID = ""; // WiFi账号密码,注意wifi有时候5G频的不行要连24的
const char* WIFI_PASSWORD = ""; // WiFi密码
//-------- 设置产品和设备的信息,从阿里云生活物联网设备信息里查看 -------//
#define PRODUCT_KEY "a" //产品key 从产品详情获取
#define DEVICE_NAME "te" //设备deviceName 从设备详情获取
#define DEVICE_SECRET "82531"
#define REGION_ID "cn-shanghai"
//-------- 设置产品和设备的信息,从阿里云生活物联网设备信息里查看 -------//
//-------- 引脚定义 -----------------------//
#define DHT_TYPE DHT11 // DHT类型为DHT11
#define DHT_PIN D5 // DHT11
//---------------------------------------//
DHT dht(DHT_PIN, DHT_TYPE); //DHT11
float temp = 0.0; // 记录当前温度
float humi = 0.0; // 记录当前湿度
unsigned long previousMillis = 0; // 上一次时间
const long interval = 10000; // 读取时间间隔,默认10s
char param[100]; //存储上传到阿里云的结构数据
static WiFiClient espClient; // TCP Client
void doWiFiTick();
void setup() {
// 延时2s,让电源稍微稳定一下
delay(2000);
// 初始化串口
Serial.begin(115200);
Serial.println("");
// 初始化网络
wifi_station_set_auto_connect(0);//关闭自动连接
ESP.wdtEnable(5000); // 启用看门狗
doWiFiTick();
// 初始化 iot,需传入 wifi 的 client,和设备产品信息
AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
}
void loop() {
// 定时喂狗
ESP.wdtFeed();
// wifi连接状态检测以及重连
doWiFiTick();
// 获取当前时间戳
unsigned long currentMillis = millis();
// 每隔一段时间读取一下传感器数据 interval为时间间隔,当前为10s
if (currentMillis - previousMillis >= interval) {
// 记录当前时间戳
previousMillis = currentMillis;
// 读取 DHT11 数据
DHT11_Read();
// 组装上传到阿里云的数据
clrEsp8266Buffer();
sprintf(param, "{\"temp\":%.2f,\"humi\":%.2f}", temp, humi);
Serial.print("param:");
Serial.println(param);
// 发送数据到阿里云
AliyunIoTSDK::send(param);
}
// Wifi处于连接状态
if (WiFi.status() == WL_CONNECTED) {
// 检测MQTT 阿里云
AliyunIoTSDK::loop();
}
delay(1000);
}
/**
* 功能:连接Wifi路由心跳函数
*/
void doWiFiTick() {
static bool taskStarted = false;
static bool startSTAFlag = false;
static uint32_t lastWiFiCheckTick = 0;
if (!startSTAFlag) {
startSTAFlag = true;
Serial.print("connect to ap:");
Serial.println(WIFI_SSID);
WiFi.disconnect();
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.printf("Heap size:%d\r\n", ESP.getFreeHeap());
int cnt = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
cnt++;
Serial.print(".");
if(cnt>=40){
cnt = 0;
//重启系统
delayRestart(1);
}
}
}
//未连接1s重连
if ( WiFi.status() != WL_CONNECTED ) {
if (millis() - lastWiFiCheckTick > 1000) {
lastWiFiCheckTick = millis();
Serial.print(".");
}
}
//连接成功建立
else {
if (taskStarted == false) {
taskStarted = true;
Serial.print(F("\r\nGet IP Address: "));
Serial.println(WiFi.localIP());
}
}
}
/**
* 读取 DHT11
*/
void DHT11_Read(void) {
// 读取温度
float newT = dht.readTemperature();
// 判断数据是否非法
if (isnan(newT)) {
Serial.println(F("Failed to read temp from DHT sensor!"));
}else {
temp = newT;
Serial.print("temp:");
Serial.println(temp);
}
// 读取湿度
float newH = dht.readHumidity();
if (isnan(newH)) {
Serial.println(F("Failed to read humi from DHT sensor!"));
}else {
humi = newH;
Serial.print("humi:");
Serial.println(humi);
}
}
Ticker delayTimer;
/*
* 延时重启
*/
void delayRestart(float t) {
Serial.print(F("Restart after "));
Serial.print(t);
Serial.println("s");
delayTimer.attach(t, []() {
Serial.println(F("\r\nRestart now!"));
ESP.restart();
});
}
/**
* 清除缓存
*/
void clrEsp8266Buffer(void){
memset(param, 0, 100); //清空
}
可以使用阿里云上原来灯的设备,添加温度和湿度的物模型,即可获取数值显示在阿里云的平台上
物模型的自定义在产品里,前往编辑草稿,标识符注意是代码中的temp和humi,数据类型也要保持一致,然后发布上线