当前位置: 首页 > article >正文

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

文章目录

  • 前言
  • 一、硬件连接
  • 二、代码解析
    • 1.库的引入
    • 2.DHT11传感器和OLED初始化:
    • 3.Wi-Fi连接与NTPClient配置:
    • 4.显示日期和时间:
    • 5.读取并显示温湿度:
  • 三、代码示例
  • 总结


前言

在这个项目中,我们将使用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-温湿度检测


http://www.kler.cn/news/327463.html

相关文章:

  • Jmeter常用函数、逻辑控制器
  • 025.Oracle_DBMS_job定时任务
  • 单片机在控制和自动化任务中的应用场景广泛
  • 关于区块链的安全和隐私
  • 国外问卷调查匠哥已经不带人了,但是还可以交流
  • Windows平台如何实现RTSP|RTMP流录像?
  • STM32F1+HAL库+FreeTOTS学习14——数值信号量
  • 如何创建一个包含多个列的表?
  • PHP的guzzlehttp/guzzle库在碰到各种异常时的场景
  • 前端框架对比和选择:Vue、React 和 Angular 谁更适合你的项目?
  • Java 死锁及避免讲解和案例示范
  • 初识Linux · O(1)调度算法
  • 新品 | Teledyne FLIR IIS 推出Forge 1GigE SWIR 短波红外工业相机系列
  • 【d57】【sql】1661. 每台机器的进程平均运行时间
  • 【AI学习笔记】基于Unity+DeepSeek开发的一些BUG记录解决方案
  • 【YashanDB知识库】YashanDB-OCI-快速上手
  • 仿真设计|基于51单片机的路口交通灯控制系统仿真
  • sudo 命令:掌握系统权限控制,实现安全高效管理
  • C++----类和对象(一)
  • SpringBoot集成-RocketMQ快速入门
  • 使用 SSH 连接 Docker 服务器:IntelliJ IDEA 高效配置与操作指南
  • Day48_SpringSecurity
  • 上海市计算机学会竞赛平台2024年9月月赛丙组材料组合
  • sql 时间交集
  • C# 变量与常量
  • Unity3D Shader的阴影部分法线效果详解
  • Android Studio | 无法识别Icons.Default.Spa中的Spa
  • 软件设计师——计算机网络
  • 【有啥问啥】卡尔曼滤波(Kalman Filter):从噪声中提取信号的利器
  • 【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上)