文章目录
- 前言
- 一、硬件连接
- 二、代码解析
- 1.库的引入
- 2.DHT11传感器和OLED初始化:
- 3.Wi-Fi连接与NTPClient配置:
- 4.显示日期和时间:
- 5.读取并显示温湿度:
- 三、代码示例
- 总结
前言
在这个项目中,我们将使用ESP8266微控制器,通过DHT11传感器获取温度和湿度数据,并将这些信息以及当前时间在SSD1315 OLED显示屏上实时显示。以下是详细的实现步骤。
提示:以下是本篇文章正文内容,下面案例可供参考
一、硬件连接
- ESP8266:主控芯片。
- DHT11传感器:连接至GPIO5,用于读取温度和湿度数据。
- SSD1315 OLED显示屏:
SDA连接至GPIO2
SCL连接至GPIO14
二、代码解析
1.库的引入
#include <Wire.h>
#include <U8g2lib.h>
#include <DHT.h>
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
这些库提供了I2C通信、OLED显示、温湿度传感器操作以及Wi-Fi和NTP时间同步的支持。
2.DHT11传感器和OLED初始化:
DHT dht(DHTPIN, DHTTYPE);
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
初始化DHT11传感器和SSD1315 OLED显示屏,指定其I2C地址。
3.Wi-Fi连接与NTPClient配置:
WiFi.begin(ssid, password);
NTPClient timeClient(ntpUDP, "pool.ntp.org", 28800);
通过指定的SSID和密码连接Wi-Fi,并设置NTP客户端以获取当前时间。
4.显示日期和时间:
if (showDateTimePage && wifiConnected) {timeClient.update();unsigned long epochTime = timeClient.getEpochTime();struct tm *timeInfo = localtime(&epochTime);snprintf(dateText, sizeof(dateText), "%04d/%02d/%02d", timeInfo->tm_year + 1900, timeInfo->tm_mon + 1, timeInfo->tm_mday);String formattedTime = timeClient.getFormattedTime();
}
每10秒切换显示页面,更新并显示当前的日期和时间。
5.读取并显示温湿度:
float h = dht.readHumidity();
float t = dht.readTemperature();
snprintf(humidityText, sizeof(humidityText), "Humidity: %.1f%%", h);
snprintf(tempText, sizeof(tempText), "Temp: %.1f°C", t);
从DHT11传感器读取温湿度数据,并将其格式化后显示在OLED上。
三、代码示例
以下是完整的代码示例:
#include <Wire.h>
#include <U8g2lib.h>
#include <DHT.h>
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>#define DHTPIN 5
#define DHTTYPE DHT11
#define OLED_ADDRESS 0x3CDHT dht(DHTPIN, DHTTYPE);
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);// Wi-Fi配置
const char* ssid = "77777777";
const char* password = "88888888";// NTPClient配置
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 28800);unsigned long previousMillis = 0;
const long interval = 10000;
bool showDateTimePage = true;
bool wifiConnected = false;void setup() {Serial.begin(9600);dht.begin();Wire.begin(2, 14);u8g2.begin();Serial.print("Connecting to WiFi...");WiFi.begin(ssid, password);int attempts = 0;while (WiFi.status() != WL_CONNECTED && attempts < 10) {delay(1000);Serial.print(".");attempts++;}if (WiFi.status() == WL_CONNECTED) {Serial.println("Connected to WiFi");wifiConnected = true;} else {Serial.println("Failed to connect to WiFi");}if (wifiConnected) {timeClient.begin();timeClient.setTimeOffset(28800);}u8g2.clearBuffer();u8g2.setFont(u8g2_font_ncenB08_tr);u8g2.setCursor((128 - u8g2.getStrWidth("OLED Ready!")) / 2, 10);u8g2.print("OLED Ready!");u8g2.sendBuffer();delay(2000);
}void loop() {unsigned long currentMillis = millis();if (currentMillis - previousMillis >= interval) {previousMillis = currentMillis;showDateTimePage = !showDateTimePage;}if (showDateTimePage && wifiConnected) {timeClient.update();unsigned long epochTime = timeClient.getEpochTime();struct tm *timeInfo = localtime(&epochTime);char dateText[30];snprintf(dateText, sizeof(dateText), "%04d/%02d/%02d", timeInfo->tm_year + 1900, timeInfo->tm_mon + 1, timeInfo->tm_mday);String formattedTime = timeClient.getFormattedTime();u8g2.clearBuffer();u8g2.setFont(u8g2_font_ncenB10_tr);int dateX = (128 - u8g2.getStrWidth(dateText)) / 2;u8g2.setCursor(dateX, 30);u8g2.print(dateText);int timeX = (128 - u8g2.getStrWidth(formattedTime.c_str())) / 2;u8g2.setCursor(timeX, 50);u8g2.print(formattedTime.c_str());u8g2.sendBuffer();} else {float h = dht.readHumidity();float t = dht.readTemperature();if (isnan(h) || isnan(t)) {Serial.println("Read Failed!");return;}u8g2.clearBuffer();u8g2.setFont(u8g2_font_ncenB10_tr);char humidityText[20];snprintf(humidityText, sizeof(humidityText), "Humidity: %.1f%%", h);int humidityX = (128 - u8g2.getStrWidth(humidityText)) / 2;u8g2.setCursor(humidityX, (64 / 2) - 10 + 10);u8g2.print(humidityText);char tempText[20];snprintf(tempText, sizeof(tempText), "Temp: %.1f°C", t);int tempX = (128 - u8g2.getStrWidth(tempText)) / 2;u8g2.setCursor(tempX, (64 / 2) + 10 + 10);u8g2.print(tempText);u8g2.sendBuffer();}
}
总结
通过这个项目,我们实现了使用ESP8266和相关组件显示温湿度和当前时间的功能。该系统不仅简单易用,还具备实时更新的能力。未来,可以考虑增加更多传感器或者联网功能,以提升项目的功能性和实用性。
工程下载链接:ESP8266-OLED-DHT11-温湿度检测