基于ESP8266使用OLED显示温湿度和时间
文章目录
- 前言
- 一、硬件连接
- 二、代码解析
- 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 0x3C
DHT 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-温湿度检测