单片机学习心得(2)-利用ESP32和LED屏幕显示现在时间日期和温度的方法

初学者练习作品,不难但是还是要点心思。

硬件包括:面包板,esp32,DHT22温度传感器,SSD1306屏幕,DS1307时钟模块。

以下是模拟运行的效果。

 运行需要的库和代码:

#include "DHTesp.h"
#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_SSD1306.h>

RTC_DS1307 rtc;
const char* daysOfTheWeek[7] = {"Sun*7", "Mon*1", "Tue*2", "Wed*3", "Thu*4", "Fri*5", "Sat*6"};
const int DHT_PIN = 15;

#define SCREEN_WIDTH 128   // OLED 显示宽度(以像素为单位)
#define SCREEN_HEIGHT 64   // OLED 显示高度(以像素为单位)

DHTesp dhtSensor;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void printLocalTime() {   //初始化DS1307模块
  if (!rtc.begin()) {
    Serial.println("RTC connection failed.");
    return;
  }
  
  if (!rtc.isrunning()) {
    Serial.println("RTC is not running.");
    return;
  }
  
  DateTime now = rtc.now();
  
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  Serial.print(" ");
  Serial.print(now.year(), DEC);
  Serial.print("/");
  Serial.print(now.month(), DEC);
  Serial.print("/");
  Serial.print(now.day(), DEC);
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(":");
  Serial.print(now.minute(), DEC);
  Serial.print(":");
  Serial.println(now.second(), DEC);
}

void setup() {
  Serial.begin(115200);
  
  // 初始化SSD1306显示
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {  // 128x64 I2C的地址 0x3C
    Serial.println("SSD1306 allocation failed.");
    for (;;)
      ;
  }
  
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  
  dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
  
  printLocalTime();
}

void loop() {
  TempAndHumidity data = dhtSensor.getTempAndHumidity();
  DateTime now = rtc.now();
  
  //显示时间
  display.clearDisplay();
  display.setCursor(0, 0);
  display.print("NowTime: ");
  display.printf("%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  
  //显示日期
  display.setCursor(0, 10);
  display.print(daysOfTheWeek[now.dayOfTheWeek()]);
  display.print(" ");
  display.print(now.year(), DEC);
  display.print("/");
  display.print(now.month(), DEC);
  display.print("/");
  display.println(now.day(), DEC);
  
  //显示温度
  display.setCursor(0, 30);
  display.print("Temp: ");
  display.print(data.temperature, 2);
  display.print("°C");
  
  //显示湿度
  display.setCursor(0, 40);
  display.print("Humidity: ");
  display.print(data.humidity, 1);
  display.print("%");
  
  display.display();

  Serial.println("Temp: " + String(data.temperature, 2) + "°C");
  Serial.println("Humidity: " + String(data.humidity, 1) + "%");
  Serial.println("---");

  delay(1000);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Arduino ESP32的示例代码,展示了如何使用定时器来采集数据,并在每个定时器周期之后修改定时器时间以进行下一次采集。 ```c++ #include <WiFi.h> #include <Wire.h> #include <RTClib.h> #define TIMER_INTERVAL_MS 5000 // 定时器周期为5秒 #define DATA_PIN 4 // 数据采集引脚 hw_timer_t * timer = NULL; volatile bool timerFlag = false; RTC_DS3231 rtc; // 实时时钟 void IRAM_ATTR onTimer(){ timerFlag = true; } void setup() { Serial.begin(115200); pinMode(DATA_PIN, INPUT); rtc.begin(); // 初始化定时器 timer = timerBegin(0, 80, true); timerAttachInterrupt(timer, &onTimer, true); timerAlarmWrite(timer, TIMER_INTERVAL_MS * 1000, true); timerAlarmEnable(timer); } void loop() { if(timerFlag){ // 采集数据 int data = digitalRead(DATA_PIN); Serial.println("Data: " + String(data)); // 设置下一次定时器 DateTime now = rtc.now(); int secondsToNextInterval = TIMER_INTERVAL_MS / 1000 - (now.second() % (TIMER_INTERVAL_MS / 1000)); DateTime nextInterval = now + TimeSpan(0, 0, secondsToNextInterval); Serial.println("Next interval: " + nextInterval.timestamp(DateTime::TIMESTAMP_FULL)); timerWrite(timer, nextInterval.unixtime() * 1000000); timerFlag = false; } } ``` 上述代码使用ESP32的硬件定时器来启动一个每5秒执行一次的定时器。在每个定时器周期内,它将读取数据引脚的值,将数据打印到串行监视器中,并计算下一个定时器周期的时间。然后,它使用`timerWrite()`函数将下一个定时器周期的时间写入定时器,以便在下一次定时器到期时执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值