eDOT:高精度Arduino時計・気象ステーション(IRリモコン・自動輝度調整内蔵)
必要な部品と用品
| ATmega328P-PU(マイクロチップ) | ×1 |
| MAX7219 LEDドライバ | ×6 |
| BME280 温湿度・気圧センサー(GY-BMEPブレークアウト) | ×1 |
| Adafruit 8×8 ドットマトリクスLED(Luckylight M1603095 白色) | ×6 |
| DS3231 RTC(高精度リアルタイムクロック) | ×1 |
| Arduino Nano R3 | ×1 |
| Arduino UNO | ×1 |
| eDOTcore 自作PCB | ×1 |
必要な工具・機器
- Flashforge Dreamer(3Dプリンタ)
使用ソフトウェア
- Arduino IDE
プロジェクト概要
eDOTとは
Arduinoベースの高精度時計・気象ステーションです。内蔵IRリモコン受信機と自動輝度調整機能を備え、6枚の8×8ドットマトリクスLEDで時刻、温度、湿度、気圧、曜日、日付を順次表示します。将来的にWi-Fiモジュール等で拡張可能な設計です。
- 消費電力が非常に低い
- ガラス前面パネルと3Dプリントボディのシンプルでエレガントなデザイン
- 内部センサー、カスタムスクロールメッセージ、無線経由の情報(RSS等)表示に対応予定
- 開発中プロジェクト(随時更新)
3Dプリントパーツ: Thingiverse からダウンロード可能


YouTubeチャンネル: UCbIomyFKzBiLHqEb2xv9GHQ
部品表(BOM)
- 3Dプリント左半身ボディ ×1
- 3Dプリント右半身ボディ ×1
- 3Dプリント左カバー ×1
- 3Dプリント右カバー ×1
- 3Dプリント脚 ×2
- 3Dプリントディスプレイサポート ×12
- バーニッシュガラス 240×75×5mm ×1
- オレンジフィルター ×1
- Adafruit 8×8ドットマトリクス(白) ×6
- MAX7219コントローラ基板 ×6
- USBブレークアウト基板 ×1
- BME280ブレークアウト ×1
- DS3231チップ ×1
- IRレシーバー(IRM-56384) ×1
- フォトレジスタ(LDR-07) ×1
- ATmega328P-PU(自作ボード用) ×1
- OMRON 12mmタクトスイッチ ×6
eDOTcore PCB
制御基板の最初のプロトタイプが完成。詳細は eDOTcoreプロジェクトページ 参照。

ソースコード
eDOT: Versatile precision weather station and clock
// eDOT: Versatile precision weather station and clock
// HISTORY
// 11/12/2015 Added measurement calibration coefficients
// 09/06/2016 Added automatic display brightness
// 09/06/2016 Added task scheduler
// 07/08/2016 Added eDOT splashscreen
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <Average.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "RTClib.h"
#include <EasyScheduler.h>
Adafruit_BME280 bme; // I2C
RTC_DS3231 rtc;
int pinCS = 10;
int numberOfHorizontalDisplays = 7;
int numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
#define TEMPERATURE 0
#define HUMIDITY 1
#define PRESSURE 2
#define TIME 3
#define DAY 4
#define DATE 5
float temp, tempavg, hum, humavg, press, pressavg;
char tempf[8], humf[8], pressf[8];
int screen = 0;
long previousLEDMillis = 0;
long LEDInterval = 5000;
int screenMax = 5;
bool screenChanged = true;
float lightsens, screenBrt = 0, lightsensavg;
Average<float> avetemp(60);
Average<float> avehum(60);
Average<float> avepress(60);
Average<float> avelightsens(40);
// キャリブレーション係数
float temp_o = -1.70, temp_s = 1.0, temp_lin;
float hum_o = 2.45, hum_s = 1.0, hum_lin;
float press_o = 0.0, press_s = 1.0, press_lin;
float brt_o = -4, brt_s = 1.35;
Scheduler Task1, Task2;
void setup() {
Task1.start(); Task2.start();
Wire.begin();
bme.begin(0x76);
matrix.setIntensity(screenBrt);
// 7枚のディスプレイ回転設定
for (int i = 0; i <= 7; i++) matrix.setRotation(i, 1);
rtc.begin();
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // 初回のみ時刻合わせ
// スプラッシュスクリーン
matrix.fillScreen(0); matrix.write();
matrix.setCursor(12,0); matrix.print("eDOT");
for (screenBrt = 0; screenBrt <= 15; screenBrt++) {
delay(25); matrix.setIntensity(screenBrt); matrix.write();
}
delay(250);
for (screenBrt = 15; screenBrt >= 0; screenBrt--) {
delay(50); matrix.setIntensity(screenBrt); matrix.write();
}
delay(500);
matrix.fillScreen(0); matrix.write();
delay(1000);
}
void loop() {
Task1.check(acq1, 500);
Task2.check(acq2, 20);
}
void acq1() {
// データ取得と移動平均
temp = bme.readTemperature(); avetemp.push(temp); tempavg = avetemp.mean();
hum = bme.readHumidity(); avehum.push(hum); humavg = avehum.mean();
press = bme.readPressure(); avepress.push(press); pressavg = avepress.mean();
DateTime now = rtc.now();
outSec = now.second(); outMin = now.minute(); outHour = now.hour();
outday = now.day(); outmonth = now.month(); outyear = now.year() - 2000;
dow = now.dayOfTheWeek();
}
void acq2() {
// 光センサー読み取り・輝度自動調整
lightsens = analogRead(A3);
avelightsens.push(lightsens);
lightsensavg = avelightsens.mean();
screenBrt = constrain(((lightsensavg / 1023.0 * 15) * brt_s + brt_o), 0, 15);
matrix.setIntensity(screenBrt);
// 線形化補正
temp_lin = tempavg * temp_s + temp_o;
hum_lin = humavg * hum_s + hum_o;
press_lin = pressavg * press_s + press_o;
unsigned long currentLEDMillis = millis();
if (currentLEDMillis - previousLEDMillis > LEDInterval) {
previousLEDMillis = currentLEDMillis;
screen++; if (screen > screenMax) screen = 0;
screenChanged = true;
}
if (screenChanged) {
screenChanged = false;
switch (screen) {
case TEMPERATURE:
dtostrf(temp_lin, 4, 2, tempf);
matrix.setCursor(6,0); matrix.setTextSize(1); matrix.setTextColor(255);
matrix.print(tempf); matrix.drawRect(37,0,2,2,255); matrix.setCursor(40,0); matrix.print("C");
matrix.write(); matrix.fillScreen(0); break;
case HUMIDITY:
dtostrf(hum_lin, 4, 2, humf);
matrix.setCursor(6,0); matrix.setTextSize(1); matrix.setTextColor(255);
matrix.print(humf); matrix.setCursor(37,0); matrix.print("%");
matrix.write(); matrix.fillScreen(0); break;
case PRESSURE:
dtostrf(press_lin, 6, 0, pressf);
matrix.setCursor(0,0); matrix.setTextSize(1); matrix.setTextColor(255);
matrix.print(pressf); matrix.setCursor(37,0); matrix.print("Pa");
matrix.write(); matrix.fillScreen(0); break;
case TIME:
matrix.setCursor(0,0); matrix.setTextSize(1); matrix.setTextColor(255);
if (outHour < 10) matrix.print("0");
matrix.print(outHour); matrix.print(":");
if (outMin < 10) matrix.print("0");
matrix.print(outMin); matrix.print(":");
if (outSec < 10) matrix.print("0");
matrix.print(outSec);
matrix.write(); matrix.fillScreen(0); break;
case DATE:
matrix.setCursor(0,0); matrix.setTextSize(1); matrix.setTextColor(255);
if (outday < 10) matrix.print("0");
matrix.print(outday); matrix.print("/");
if (outmonth < 10) matrix.print("0");
matrix.print(outmonth); matrix.print("/");
matrix.print(outyear);
matrix.write(); matrix.fillScreen(0); break;
case DAY:
matrix.setCursor(15,0); matrix.setTextSize(1); matrix.setTextColor(255);
matrix.print(daysOfTheWeek[dow]);
matrix.write(); matrix.fillScreen(0); break;
}
}
}
製造プロセス
- Raspberry Pi搭載DIYソーラー駆動気象ステーション
- Raspberry Pi 2とADS-WS1で屋外気象観測ステーションを構築
- 高度気象ステーション v2.0:温度・気圧・湿度・高度のリアルタイム監視
- Arduino POVクロック:残像効果で浮かび上がるLED時計を自作する
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- Arduino Dueと3.2インチTFTで作る温度監視付きリアルタイムクロック
- 10ドルで作る携帯型Arduino気象観測ステーション – Nano、DHT22、BMP180、LCDで簡単DIY
- Arduino Nanoと128x64 OLEDで実行するセルラーオートマトン「ライフゲーム」
- ArduinoとThingSpeakで作るリアルタイム気象モニタリングシステム
- ArduinoとGoogleスプレッドシート連携 リアルタイムRFID勤怠管理システム
- Arduino + Windows IoT + Azure クラウドによる高度な転倒検知システム