基于ESP8266使用OLED显示温湿度和时间


前言

在这个项目中,我们将使用ESP8266微控制器,通过DHT11传感器获取温度和湿度数据,并将这些信息以及当前时间在SSD1315 OLED显示屏上实时显示。以下是详细的实现步骤。


提示:以下是本篇文章正文内容,下面案例可供参考

一、硬件连接

  1. ESP8266:主控芯片。
  2. DHT11传感器:连接至GPIO5,用于读取温度和湿度数据。
  3. 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-温湿度检测

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值