ATTiny404を使用して、LCD表示と複数のボタンを組み合わせたキッチンタイマーを作成してみました。設定時間は90分から1分で、セット、スタート、ストップ、クリアの操作ができ、終了時に通知音を鳴らします。
概要
- LCD表示: 残り時間やステータスを表示
- 設定ボタン(2つ): 時間の設定(10分、1分)
- スタートボタン: タイマーの開始
- ストップボタン: タイマーの一時停止
- クリアボタン: 設定のリセット
- お知らせブザー: タイマー終了時に通知音を鳴らす
必要な部品
- ATTiny404 マイクロコントローラー(秋月電子90円)
- LCDモジュール(I2C通信)AE-AQM0802
- タクトスイッチ 5個
- 圧電スピーカー 1個
- ブレッドボード、ジャンパワイヤ
- UPDI書き込み装置 (FT232RL) アマゾン 3.3Vでも書き込み可能です
回路図の説明
以下は回路の接続方法です
- LCDモジュール
- SCLピンをATTiny404のPB0ピンに接続。
- SDAピンをATTiny404のPB1ピンに接続。
- LCDのVCCとGNDをそれぞれ電源とGNDに接続。
- ボタン
- 各タクトスイッチの片側をATTiny404のピン(設定ボタン1: PA3, 設定ボタン2: PA2, スタート: PA5, ストップ: PA6, クリア: PA7)に接続。
- 各タクトスイッチのもう一方をGNDに接続。
- 終了お知らせ
- 圧電スピーカーをATTiny404のPA1ピンに接続。

ソフトウェア
Arduino IDEの準備
- Arduino IDEをインストール(インストールしていない方はインストールしてください)
- ATtinyCoreライブラリをインストール(ATtinyCore GitHub)
- ST7032_asukiaaa ライブラリーをインストール
- ボード 自分のCOMポート
- ツール、ボードマネージャからATtiny404を選択
- ツール、chip から404選択
- クロック 10Mインターナル
- 書き込み装置 シリアルUPDI 高速 低速どちらでも書き込めました。
- UPDIの書き込みについてはこちらのブログを参考にしてください
プログラム例
以下は基本的なタイマーのコード例です
#include <ST7032_asukiaaa.h>
ST7032_asukiaaa lcd(0x3E);
// ピンの定義
const byte BTN_INC = A3;
const byte BTN_INC10 = A2;
const byte BTN_START = A5;
const byte BTN_STOP = A6;
const byte BTN_CLEAR = A7;
const byte BUZZER = A1;
// タイマーの状態
int timerCount = 0;
bool timerRunning = false;
void setup() {
// lcd初設定
lcd.begin(8, 2); // LCD columns and rows.
lcd.setContrast(30); //
// If lcd become black, reduced value for contrast
// lcd.setContrast(20);
lcd.setCursor(0, 0);
lcd.print("K-Timer");
lcd.setCursor(0, 1);
lcd.print("00 : 00");
// ピンモード設定
pinMode(BTN_INC, INPUT_PULLUP);
pinMode(BTN_INC10, INPUT_PULLUP);
pinMode(BTN_START, INPUT_PULLUP);
pinMode(BTN_STOP, INPUT_PULLUP);
pinMode(BTN_CLEAR, INPUT_PULLUP);
pinMode(A1, OUTPUT);
digitalWrite(BUZZER, 0);
}
void loop() {
// 時間10分
if (digitalRead(BTN_INC10) == LOW) {
delay(300); // チャタリング防止
timerCount += 600; // 10分追加
if (timerCount > 5400) {
timerCount = 5400;
}
updateLCD();
}
if (digitalRead(BTN_INC) == LOW) {
delay(300);
timerCount += 60; // 1分
if (timerCount > 5400) {
timerCount = 5400;
}
updateLCD();
}
// ストップ
if (digitalRead(BTN_STOP) == LOW) {
delay(200);
timerRunning = false;
}
// スタート
if (digitalRead(BTN_START) == LOW) {
delay(200);
timerRunning = true;
}
// クリアー
if (digitalRead(BTN_CLEAR) == LOW) {
delay(200);
timerRunning = false;
timerCount = 0;
updateLCD();
}
// タイマースタート
if (timerRunning && timerCount > 0) {
delay(1000); // 1秒待つ 時間のずれはここで調整
timerCount--;
updateLCD();
}
// 終了確認
if (timerRunning && timerCount == 0) {
timerRunning = false;
buzzAlert();
delay(100);
}
}
// LCD 表示
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("K-Timer");
lcd.setCursor(0, 1);
int minutes = timerCount / 60;
int seconds = timerCount % 60;
lcd.print(minutes);
lcd.print(" :");
if (seconds < 10) {
lcd.setCursor(4, 1);
lcd.print(0);
lcd.print(seconds);
} else {
lcd.setCursor(4, 1);
lcd.print(seconds);
}
}
void buzzAlert() {
//digitalWrite(BUZZER, 1);
tone(BUZZER,523,800); //圧電スピーカー鳴らす
delay(800);
//digitalWrite(BUZZER, 0);
}

プログラム説明
ここでプログラムの説明はしませんが、プログラムの中にコメントを入れておきましたのでそれを参考にプログラムを見てください。
あとがき
こちらのプログラムを作るのに結構苦労して、丸2日以上を費やしてしまいました。
わからないことはチャットgptに質問し、回答プログラムはそのままで動きませんが、大変参考になりました。最初はアラームに圧電ブザーを使おうと思いましたが、うまくいかないので圧電スピーカーに変更しました。
また、今回A4ピンを使おうとしたところ動かなかったので、そのピンを除外しました原因は分かりませんチップのせいなのかな。
404は安くてピン数も多いので簡単な電子工作には良いと思いますが、残念ながら情報が少ないので使うのに少し難しいかもしれません。
皆さんもいろいろ試してみてください。