Arduinoリアルタイム気象時計 - OLEDに時刻/日付/温度を表示
必要な部品と材料
| 部品 |
数量 |
| Arduino UNO |
1 |
| DS3231 RTCモジュール(高精度リアルタイムクロック) |
1 |
| OLEDディスプレイ(SSD1306、128×64、SPI接続) |
1 |
| LM35 温度センサー |
1 |
| ブレッドボード & ジャンパーワイヤー |
1式 |
プロジェクト概要
Arduino UNO、DS3231 RTC、LM35温度センサー、SSD1306 OLEDを組み合わせ、時刻・日付・曜日・温度をリアルタイム表示する気象時計を作ります。DS3231は温度補償水晶発振器内蔵で高精度、コイン電池バックアップで停電時も時刻を保持します。OLEDはSPI接続で高速描画、バックライト不要で視認性良好です。
回路図・配線
OLED (SSD1306) → Arduino UNO (SPI接続)
| OLEDピン |
Arduinoピン |
| CS |
D10 |
| DC |
D9 |
| RES (RST) |
D8 |
| D1 (MOSI/SDA) |
D11 |
| D0 (CLK/SCL) |
D13 |
| VCC |
5V |
| GND |
GND |
DS3231 RTC → Arduino UNO (I2C接続)
| RTCピン |
Arduinoピン |
| SDA |
A4 |
| SCL |
A5 |
| VCC |
5V |
| GND |
GND |
LM35 → Arduino UNO
| LM35ピン |
Arduinoピン |
| VCC (左) |
5V |
| OUT (中) |
A0 |
| GND (右) |
GND |
配線イメージ(フルサイズ回路図は記事参照)
コード解説
ライブラリとピン定義
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DS3231.h> // RTCライブラリ(例: rinky-dink等)
DS3231 rtc(SDA, SCL);
#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);
const int sensor_pin = A0;
float temp, output;
setup()
void setup() {
pinMode(sensor_pin, INPUT);
rtc.begin();
display.begin(SSD1306_SWITCHCAPVCC);
// 初回のみ:日時設定(コメントアウト解除して一度実行)
// rtc.setDOW(WEDNESDAY);
// rtc.setTime(19, 2, 0); // 19:02:00 (24h)
// rtc.setDate(7, 12, 2017); // 2017/12/7
// 起動スプラッシュ
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0, 0); display.print(" Weather ");
display.setCursor(0, 17); display.print(" Clock ");
display.display();
delay(5000);
}
loop()
void loop() {
output = analogRead(sensor_pin);
temp = (output * 500.0) / 1023.0; // LM35: 10mV/℃, 5V基準で 5000mV/1024 ≈ 4.88mV/LSB → *500/1023 ≈ ℃
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(temp, 1); // 小数点1桁
display.print("C");
display.display();
delay(1000);
}
完全スケッチ
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
#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);
const int sensor_pin = A0;
float temp, output;
void setup() {
pinMode(sensor_pin, INPUT);
rtc.begin();
display.begin(SSD1306_SWITCHCAPVCC);
// 初回のみ日時設定(実行後はコメントアウト)
// rtc.setDOW(WEDNESDAY);
// rtc.setTime(19, 2, 0);
// rtc.setDate(7, 12, 2017);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0, 0); display.print(" Weather ");
display.setCursor(0, 17); display.print(" Clock ");
display.display();
delay(5000);
}
void loop() {
output = analogRead(sensor_pin);
temp = (output * 500.0) / 1023.0;
display.clearDisplay();
display.setTextSize(2);
display.setCursor(20, 0);
display.print(rtc.getTimeStr());
display.setTextSize(1);
display.setCursor(0, 15);
display.print(rtc.getDateStr());
display.setCursor(70, 15);
display.print(rtc.getDOWStr());
display.setCursor(20, 25);
display.print("Temp: ");
display.print(temp, 1);
display.print("C");
display.display();
delay(1000);
}
ポイント・改良案
- 温度計算:
(analogRead * 500.0) / 1023.0 は 5V基準・10mV/℃ の近似。より正確には (analogRead * 5.0 / 1023.0) * 100.0 または内部1.1V基準使用で精度向上
- DS3231ライブラリ: 複数種類あり(
RTClib 等)。API(getTimeStr()等)が異なる場合は適宜調整
- OLEDライブラリ: Adafruit_SSD1306 は SPI/Hardware SPI 両対応。高速化にはハードウェアSPI推奨
- 表示レイアウト: フォントサイズ、座標、追加情報(湿度、気圧、予報等)への拡張が容易
- 省電力: ディープスリープ+RTC割り込み起床で電池駆動化可能
- ケース化: 3Dプリントケースやアクリル板で実用的な置き時計に
回路図
配線図