昭和レトロ・温度湿度時刻計
2023.12.16
YouTube でも紹介しています。画像をクリックすると再生できます。
うぷ主の猫がトイレでずっと踏ん張っていたので、行きつけの動物病院に連れて行ったところ、軽い膀胱炎と診断されました。
急に寒くなるこの季節にはよくあることのようで、注射を打たれて帰宅しました。
そこで今回は猫が快適に過ごせるように温度管理を強化すべく、温度・湿度表示のできる時計を作ってみました。
温湿度センサーやリアルタイムクロックモジュールの使い方はすでに多くのサイトで取り上げられているので、
ここでは「昭和レトロ」なニキシー管風表示をテーマに解説します。
ニキシー管(Nixie Tube)は数字あるいは文字・記号の情報を表示する一種の冷陰極放電管(冷陰極管)です。
ガラス製で、数字あるいは文字などの形状をした多数の陰極と1つのメッシュ状陽極から構成され、内部は少量のアルゴンあるいはさらに少量の水銀を添加した0.15気圧以下のネオンガスで満たされています。
各陰極と陽極との間に約140 - 170Vの直流電圧が印加されると陰極から電子放出が起こり、陰極を覆うように赤橙色のグロー放電発光が生じるので数字などを認識することができます。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
【Hardware】
温湿度センサー、リアルタイムクロック、TFTディスプレイ、マイコンを用意します。
マイコンは、FLASHメモリとPSRAMを実装しているものが必要です。
参考までにうぷ主が使用したモジュールを列挙しておきます。適当に読み飛ばしてください。
●Adafruit HTS221 - Temperature & Humidity Sensor Breakout Board - STEMMA QT / Qwiic
HTS221 は、相対湿度0% ~ 100% rHを感度 0.004%、精度 20 ~ 80% で 3.5% で測定できます。また、-40 ~ 120 ℃の温度を 0.016 ℃の分解能で、15 ~ +40 ℃の範囲で ±0.5 ℃の精度で測定できます。
Adafruit HTS221
●Adafruit PCF8523 Real Time Clock (RTC) Breakout Board - STEMMA QT / Qwiic
PCF8523 RTC を搭載 - 3.3V または 5V の電源とロジックから実行できます。
CR1220リチウムボタン電池でバックアップされたリアルタイムクロックモジュールです。
Adafruit PCF8523
●Adafruit 0.96" 160x80 Color TFT Display w/ MicroSD Card Breakout - ST7735
●Adafruit QT Py ESP32-S2 WiFi Dev Board with STEMMA QT
・ESP32-S2 240MHz
・4 MB Flash & 2 MB PSRAM
・2.4 GHz Wi-Fi (SoC)
・Two I2C ports
・Hardware UART
・Hardware SPI
・Hardware I2S on any pins
・3.3V regulator with 600mA peak output
Adafruit QT Py ESP32-S2
各モジュールを下記のように配線しました。

| ST7735 | - | QT Py ESP32S2 | - | HTS221/PCF8523 |
| | | A0 | | (PUSH SWITCH) |
| DC | - | A1 | | |
| TFTCS | - | A2 | | |
| LIT | - | A3 | | |
| | | SDA | - | SDA |
| | | SCL | - | SCL |
| SCK | - | SCK | - | |
| | | MISO | - | |
| MOSI | - | MOSI | - | |
| Vin | - | 3.3V | - | VIN |
| GND | - | GND | - | GND |
【Software】
開発は、Arduino言語(C言語)で行います。
ソースコードのビルドには、PlatformIOを使用しています。
Arduino開発環境構築 PlatformIO
・adafruit/Adafruit GFX Library
・adafruit/Adafruit ST7735 and ST7789 Library
・adafruit/Adafruit BusIO
上記ライブラリの他に各種センサ・モジュール用のコードを gitHub から入手します。

Adafruit_HTS221 - GitHub
・Adafruit_HTS221.cpp
・Adafruit_HTS221.h
を使用します。

adafruit/Adafruit_Sensor
・Adafruit_Sensor.cpp
・Adafruit_Sensor.h
を使用します。

adafruit/RTClib
・RTClib.cpp
・RTClib.h
・RTC_PCF8523.cpp
を使用します。
【ニキシー管画像の編集】
ここからが本題です。まずはニキシー管画像を入手します。
●nixietubeM5
nixietubeM5 はM5 Stack用のニキシー管を模した数字画像を表示するアプリです。
真っ暗な部屋で実行すると、まさにニキシー管です。

nixietubeM5
このアプリをダウンロードして解凍すると、alldigits.c というファイルがあります。
このファイルの中に記載されている配列が、ニキシー管の数字を表したJPEG画像です。
const unsigned char d0[4721] = {
0xff,0xd8,0xff,0xe0,0x00,0x10,0x4a,0x46,0x49,0x46,0x00,0x01,0x01,0x01,
0x00,0x64,0x00,0x64,0x00,0x00,0xff,0xdb,0x00,0x43,0x00,0x10,0x0b,0x0c,
0x0e,0x0c,0x0a,0x10,0x0e,0x0d,0x0e,0x12,0x11,0x10,0x13,0x18,0x28,0x1a,
・・・・・
};
const unsigned char d1[3926] = {
0xff,0xd8,0xff,0xe0,0x00,0x10,0x4a,0x46,0x49,0x46,0x00,0x01,0x01,0x01,
0x00,0x64,0x00,0x64,0x00,0x00,0xff,0xdb,0x00,0x43,0x00,0x10,0x0b,0x0c,
0x0e,0x0c,0x0a,0x10,0x0e,0x0d,0x0e,0x12,0x11,0x10,0x13,0x18,0x28,0x1a,
・・・・・
};
const unsigned char d9[4704] = {
0xff,0xd8,0xff,0xe0,0x00,0x10,0x4a,0x46,0x49,0x46,0x00,0x01,0x01,0x01,
0x00,0x64,0x00,0x64,0x00,0x00,0xff,0xdb,0x00,0x43,0x00,0x10,0x0b,0x0c,
0x0e,0x0c,0x0a,0x10,0x0e,0x0d,0x0e,0x12,0x11,0x10,0x13,0x18,0x28,0x1a,
・・・・・
};
この配列を先頭からファイルに書き出すとJPEG画像になります。
画像編集アプリで数字の上下左右の余白を調整して、縦48x横32に縮小、BMP画像形式で保存します。
このBMP画像を配列に変換します。
const unsigned char d0_data[4662] PROGMEM = {
0x42,0x4d,0x36,0x12,0x00,0x00,0x00,0x00,
0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00,
0x00,0x00,0x20,0x00,0x00,0x00,0x30,0x00,
0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x0f,
0x00,0x00,0x61,0x0f,0x00,0x00,0x00,0x00,
・・・・・
時刻表示の際の時と分を区切るコロン(:)は数字の8から切り出して使用します。
●温度表示

・10秒間隔でセンサーから値を取得する
・前回表示した数字と異なる桁のみを再描画する
・先頭の桁が0の場合は先頭桁を表示しない(黒で塗りつぶす)
数字描画部分
if (last[0]!=temperature[0]) {
last[0] = temperature[0];
RGB = (BMP_RGB*)digits[last[0]-0x30];
for(int y=0; y < digit_height; y++) {
for(int x=0; x < digit_width; x++, RGB++) {
if (last[0]=='0') {
tft.drawPixel(x+10,y+16,0x0000); // black
} else {
tft.drawPixel(x+10,y+16,tft.color565(RGB->R,RGB->G,RGB->B));
}
}
}
}
●湿度表示

処理内容は基本的に温度表示と同じですが、表示色をRGBの並びを変更することにより変えています。
tft.drawPixel(x+10,y+16,tft.color565(RGB->R,RGB->G,RGB->B));
↓
tft.drawPixel(x+10,y+16,tft.color565(RGB->B,RGB->G,RGB->R));
●時刻表示

処理内容は基本的に温度表示と同じですが、表示色をRGBの並びを変更することにより変えています。
tft.drawPixel(x+10,y+16,tft.color565(RGB->R,RGB->G,RGB->B));
↓
tft.drawPixel(x+10,y+16,tft.color565(RGB->B,RGB->R,RGB->G));
時刻は初期処理でタイムサーバから取得してリアルタイムモジュールに設定しています。
●夜に映えるレトロな表示

照明を落とした夜の部屋にニキシー管風な表示がとても映えます。
●表示更新間隔とモード切替
表示更新制御とプッシュボタンによる温度→湿度→時刻のモード切替は、割り込みは使用せず、loop_delay()関数内で行っています。
void show_temperature() {
・・・・・
loop_delay();
}
void show_humidity() {
・・・・・
loop_delay();
}
void show_clock() {
・・・・・
loop_delay();
}
温度・湿度・時刻表示後に休止させるようにしています。
void loop_delay()
{
for (int interval=0; interval<KEEP_TIME; interval+=100) {
if ( digitalRead(BTN_PIN)==LOW ) {
delay(100); ←チャタリング防止
if (++mode > MODE_CLOCK) mode = MODE_TEMPERATURE;
memset(last,0x0,5);
break;
} else {
delay(100);
}
}
}
この関数内のdelay(100)で0.1秒を100回ループさせることにより、10秒の休止状態を作っています。
0.1秒単位でプッシュボタンの状態を確認して、プッシュボタンが押されているとモードを切り替えて、
即座に休止状態を抜け出し、次のモードでの情報を表示させます。
●数字の書き換え処理にもっさり感をもたせる
数字の書き換えにもっさり感をもたせることで昭和レトロをさらに強調します。
void setup(void)
{
・・・・・
setCpuFrequencyMhz(40);
}
クロック周波数を240MHz→40MHzに変更しています。

240MHzでは0.1A消費していましたが、40MHzにすると0.06Aまで下がりました。
それでも乾電池駆動は辛いです。

【参考】定電流連続放電時の持続時間
●ソースコード

昭和レトロ 温度・湿度・時刻計
|
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」
「一念発起して何かを始めても、いつも三日坊主で終わってしまう」
「色んなことを先延ばしにしたまま、時間だけが過ぎていく」
そこで本書では、そんな著者が独自に開発した、
まったく新しい目標達成メソッド「100日デザイン」について、
その知識と技術を、余すところなくご紹介します。
まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。
ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。
今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。
ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。
29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!
【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。
基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。
Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説!
500以上のサンプルを掲載。実行結果も確認。
全24章の包括的なチュートリアル。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。
Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード
電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)
|