ESP8266 + DHT11 + OLED0.96温湿度中文显示和MQTT(二)

本文接上文 ESP8266 + DHT11 + OLED0.96温湿度中文显示和MQTT 数据传输(一)

本章节主要接上节,增加OLED0.96 温湿度中文显示的代码逻辑,硬件参数,和接线,请看上文

增加代码步骤如下:

1)我们采用U8g2lib库,优点是代码量少,支持中文

我们在开头引用U8g2lib库 头文件


#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

2)加入定义

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,SCL,SDA,U8X8_PIN_NONE);

3)在setup函数里增加以下代码:

  u8g2.begin();
  u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function 

4)在loop函数里增加以下代码:

  u8g2.setFont(u8g2_font_wqy14_t_gb2312); //中文支持
  u8g2.setFontDirection(0);
  u8g2.firstPage();
  do {
    u8g2.setCursor(30, 15); //指定显示位置
    u8g2.print("智能温湿计"); //使用print来显示字符串
    u8g2.setCursor(0, 30); //指定显示位置
    u8g2.print(localIp); //使用print来显示字符串
    u8g2.setCursor(0, 45); //指定显示位置
    u8g2.print("当前温度:"); //使用print来显示字符串
    u8g2.print(temperature);
    u8g2.print("℃");
    u8g2.setCursor(0, 60); //指定显示位置
    u8g2.print("当前湿度:"); //使用print来显示字符串
    u8g2.print(humidity);
    u8g2.print("%");
  } while (u8g2.nextPage());

5) 编译,上传

6) 实际呈现

本节内容结束,我们将在下章节,增加MQTT 发送数据到服务器

以下是完整代码,注释已经说明了每一步操作: ```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传感器,分别连接在D4D7引脚上,可以根据实际情况修改。 2. OLED显示屏使用了SSD1306驱动,连接在D1D2引脚上,可以根据实际情况修改。 3. 需要将WiFi连接信息、阿里云物联网平台参数、DHT传感器信息等修改为实际情况。 4. 代码中使用了阿里云物联网平台的SDK,需要在Arduino IDE中安装AliyunIoTSDK
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值