亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino 实时天气时钟:OLED 显示时间、日期与温度

核心硬件清单

电路连接详解

OLED (SPI 模式)

OLED 引脚Arduino 引脚功能
CSD10片选
DCD9数据/命令
RESD8复位
D1 (MOSI)D11数据
D0 (SCK)D13时钟
VCC5V供电(模块自带 3.3V LDO)
GNDGND共地

DS3231 (I2C 模式)

DS3231 引脚Arduino 引脚
SDAA4
SCLA5
VCC5V
GNDGND

LM35

软件库依赖

完整固件代码(已修正语法、添加注释)


#include <Wire.h>
#include <DS3231.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// ===== OLED SPI 引脚 =====
#define OLED_MOSI  11
#define OLED_CLK   13
#define OLED_DC    9
#define OLED_CS    10
#define OLED_RESET 8
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// ===== 传感器与 RTC =====
DS3231 rtc(Wire); // 使用 Wire (A4/A5)
const int sensorPin = A0;
float temperature;

void setup() {
  pinMode(sensorPin, INPUT);
  rtc.begin();
  display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay();
  display.setTextColor(WHITE);

  // 首次运行取消注释设置时间
  // rtc.setDOW(WEDNESDAY);
  // rtc.setTime(19, 2, 0);     // 24小时制
  // rtc.setDate(7, 12, 2017);  // 日,月,年

  // 启动画面
  display.setTextSize(2);
  display.setCursor(0, 0);
  display.println(" Weather");
  display.setCursor(0, 17);
  display.println(" Clock ");
  display.display();
  delay(5000);
}

void loop() {
  // 读取 LM35 温度
  int raw = analogRead(sensorPin);
  temperature = raw * 500.0 / 1024.0; // 5V/1024 * 100 = 500/1024 ≈ 0.488 mV/LSB → °C

  // 刷新显示
  display.clearDisplay();
  
  // 时间 (大字体)
  display.setTextSize(2);
  display.setCursor(20, 0);
  display.print(rtc.getTimeStr()); // "HH:MM:SS"
  
  // 日期 + 星期 (小字体)
  display.setTextSize(1);
  display.setCursor(0, 15);
  display.print(rtc.getDateStr()); // "DD/MM/YYYY"
  display.setCursor(70, 15);
  display.print(rtc.getDOWStr());  // "MON" 等
  
  // 温度
  display.setCursor(20, 25);
  display.print("Temp: ");
  display.print(temperature, 1); // 1位小数
  display.print(" C");
  
  display.display();
  delay(1000);
}

关键技术细节

温度计算公式推导

LM35 输出 10mV/°C,Arduino 10-bit ADC 参考 5V:

Voltage = raw * 5.0 / 1024.0 (V)

Temp(°C) = Voltage / 0.01 = raw * 500.0 / 1024.0

代码中 500/1023 为近似,建议用 500.0/1024.0 提升精度。

DS3231 优势

OLED 显示优化

常见问题与调试

现象原因对策
OLED 不亮/花屏SPI 接线错误、供电不足、库版本不匹配核对引脚、外接 5V 供电、更新 Adafruit_SSD1306 库
时间不准/重置后归零DS3231 备用电池耗尽、未首次设置时间更换 CR2032、上传带设置时间的代码运行一次再注释
温度读数偏高LM35 自热、面包板接触电阻、ADC 参考电压偏差传感器离 MCU 远一点、用 3.3V 基准+分压、或改用 DS18B20
中文/星期乱码库默认英文星期缩写手动映射:const char* dow[]={"SUN","MON",...};

进阶扩展功能

教学价值总结

本项目集成了 RTC 实时时钟、模拟传感器读取、SPI/OLED 图形显示、字符串格式化 等核心嵌入式技能,代码量精简(<100 行),硬件成本低(~¥60),是「万年历/环境监测」类入门项目的标准范式。通过替换传感器与显示模块,可快速衍生智能家居面板、工业现场仪表、车载行车电脑等应用。

制造工艺

  1. Satellite CCRMA 套件:构建传感器驱动的音频效果器
  2. 复古 Numitron 管时钟:Arduino Nano 驱动,低温可靠省电
  3. 自制 Arduino 伊斯兰祷告时间实时时钟
  4. 用 Arduino UNO 和 OLED 显示屏制作经典 Pong 游戏:分步教程
  5. 精准文字时钟:分钟级文字显示时间
  6. 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
  7. Arduino Due 驱动 3.2″ TFT 实现温度监测与实时时钟
  8. 用 Arduino UNO 制作柏林时钟 – DIY LED 矩阵时钟
  9. 基于 Arduino Mega 与 Nextion 显示屏的交互式气象站
  10. TM1637 数码管时钟:Arduino Nano 实现时间设定与闹钟
  11. BME280 环境数据实时显示于 Nextion 触摸屏——Visuino 图形化开发
  12. 用 DS1302 RTC 和 Arduino UNO 制作可靠闹钟