esp8266 通过arduino使用aliyuntosdk如何将两个温湿度传感器(第一个dht11 温湿度传感器(引脚为D4),第二个dht11 温湿度传感器(引脚为D7))分别传入阿里云物联网平台的两个设备中并且将两台设备的数据打印在串口和0.96 存显示屏 (驱动 ssd1306,SCL D1 ,SDA D2)每隔一秒刷新发送一次数据并刷新一次显示屏,给出完整代码请仔细想想,不需要topic
时间: 2023-06-16 12:05:45 浏览: 111
以下是完整代码,注释已经说明了每一步操作:
```c++
#include <DHT.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <AliyunIoTSDK.h>
// WiFi连接信息
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
// 阿里云物联网平台参数
const char* productKey = "your_PRODUCT_KEY";
const char* deviceName1 = "your_DEVICE_NAME1";
const char* deviceSecret1 = "your_DEVICE_SECRET1";
const char* deviceName2 = "your_DEVICE_NAME2";
const char* deviceSecret2 = "your_DEVICE_SECRET2";
const char* region = "cn-shanghai";
const char* broker = "tcp://your_PRODUCT_KEY.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883";
const char* subTopic = "/sys/" + String(productKey) + "/" + String(deviceName1) + "/thing/event/property/post";
const char* pubTopic1 = "/sys/" + String(productKey) + "/" + String(deviceName1) + "/thing/event/property/post";
const char* pubTopic2 = "/sys/" + String(productKey) + "/" + String(deviceName2) + "/thing/event/property/post";
// DHT传感器信息
#define DHTPIN1 2 // 第一个传感器接口
#define DHTPIN2 4 // 第二个传感器接口
#define DHTTYPE DHT11 // DHT11传感器类型
DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
float temperature1, humidity1, temperature2, humidity2;
// OLED显示屏信息
#define SCREEN_WIDTH 128 // OLED显示屏宽度
#define SCREEN_HEIGHT 64 // OLED显示屏高度
#define OLED_RESET -1 // OLED重置引脚
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// 阿里云物联网平台参数
AliyunIoTSDK iot;
// WiFi客户端和MQTT客户端
WiFiClientSecure wifiClient;
PubSubClient mqttClient(wifiClient);
// WiFi连接函数
void connectWiFi() {
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
// MQTT连接函数
void connectMQTT() {
mqttClient.setServer(broker, 1883);
while (!mqttClient.connected()) {
Serial.println("Connecting to MQTT broker...");
String clientId = "ESP8266Client-" + String(random(0xffff), HEX);
if (mqttClient.connect(clientId.c_str(), deviceName1, deviceSecret1)) {
Serial.println("MQTT broker connected");
mqttClient.subscribe(subTopic);
} else {
Serial.print("MQTT broker connection failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
// OLED显示函数
void displayData() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Device 1:");
display.print("Temperature: ");
display.print(temperature1);
display.println("C");
display.print("Humidity: ");
display.print(humidity1);
display.println("%");
display.println();
display.println("Device 2:");
display.print("Temperature: ");
display.print(temperature2);
display.println("C");
display.print("Humidity: ");
display.print(humidity2);
display.println("%");
display.display();
}
// 阿里云物联网平台上报函数
void reportData() {
Serial.println("Reporting data...");
String payload = "{\"id\":\"1\",\"params\":{\"Temperature\":" + String(temperature1) + ",\"Humidity\":" + String(humidity1) + "},\"method\":\"thing.event.property.post\"}";
mqttClient.publish(pubTopic1, payload.c_str());
payload = "{\"id\":\"1\",\"params\":{\"Temperature\":" + String(temperature2) + ",\"Humidity\":" + String(humidity2) + "},\"method\":\"thing.event.property.post\"}";
mqttClient.publish(pubTopic2, payload.c_str());
}
void setup() {
Serial.begin(9600);
// OLED显示屏初始化
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 initialization failed");
while (true);
}
display.display();
delay(2000);
display.clearDisplay();
// DHT传感器初始化
dht1.begin();
dht2.begin();
// WiFi连接
connectWiFi();
// 阿里云物联网平台初始化
iot.begin(region, productKey, deviceName1, deviceSecret1);
wifiClient.setCACert(iot.getCACert());
wifiClient.setCertificate(iot.getCertificate());
wifiClient.setPrivateKey(iot.getPrivateKey());
// MQTT连接
connectMQTT();
}
void loop() {
// 读取传感器数据
humidity1 = dht1.readHumidity();
temperature1 = dht1.readTemperature();
humidity2 = dht2.readHumidity();
temperature2 = dht2.readTemperature();
// 如果读取失败,则重试
if (isnan(humidity1) || isnan(temperature1) || isnan(humidity2) || isnan(temperature2)) {
Serial.println("Failed to read sensor data");
delay(1000);
return;
}
// 将数据打印到串口和OLED显示屏
Serial.print("Device 1 - Temperature: ");
Serial.print(temperature1);
Serial.print("C, Humidity: ");
Serial.print(humidity1);
Serial.println("%");
Serial.print("Device 2 - Temperature: ");
Serial.print(temperature2);
Serial.print("C, Humidity: ");
Serial.print(humidity2);
Serial.println("%");
displayData();
// 上报数据到阿里云物联网平台
reportData();
// 每隔一秒刷新数据和OLED显示屏
delay(1000);
}
```
需要注意的几点:
1. 代码中使用了两个DHT11传感器,分别连接在D4和D7引脚上,可以根据实际情况修改。
2. OLED显示屏使用了SSD1306驱动,连接在D1和D2引脚上,可以根据实际情况修改。
3. 需要将WiFi连接信息、阿里云物联网平台参数、DHT传感器信息等修改为实际情况。
4. 代码中使用了阿里云物联网平台的SDK,需要在Arduino IDE中安装AliyunIoTSDK库。