前回に紹介したATtiny202を使って、何か 実用的なものが作れないかと思い、 今回はラーメン タイマーを制作してみました。
計る時間は3分と4分で、初めは1秒間隔でLEDが点滅し、どちらも残り30秒は0.5秒間隔で点滅します。
時間を計り終わると、最後にチャルメラ風の音を出します。
操作ボタンは4分、3分のスタートボタン2個です。
揃える部品
- ATtiny202書き込み装置 (USB-シリアル変換モジュール)
- ミニブレッドボード
- LED
- 圧電スピーカー
- タクトスイッチ2個
- コンデンサー 0.1マイクロ(なくても大丈夫です)
- ブレッドボードジャンパー線数本
ATtiny202書き込み装置
今回はアマゾンで購入で購入したFT232RLを使いました、秋月電子で販売されてるCH340E、FT234Xなどでも大丈夫でが、CH340Eは別途ドライバーをインストールしないとWindowsパソコンでは認識しません。
またこの書き込み機はSLOWだけでなく、SenialUPDI-230400の高速書き込みレートでも、問題なく書き込めました。

ラーメンタイマー
配線図とプログラム
配線図
こちらがラーメンタイマーattiny202の配線図です。
0.1μのコンデンサーは簡易チャタリング防止のため入れましたが、入れなくても動きます。

このようになりました。

プログラム
プログラムはタクトスイッチ1、2の割り込みでスタートし計測します。
タクトスイッチ1で3分、2で4分計ります。
割り込みルーチンプログラムが動作してるときは、割り込みはできません。
下記がプログラムです。
#include <util/delay.h>
const byte ledPin = 4;
const byte interruptPin = A1;
const byte interruptPin2 = A2;
const byte pin = A6;
static unsigned int val = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
pinMode(interruptPin2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), keisan3, FALLING);
attachInterrupt(digitalPinToInterrupt(interruptPin2), kei4, FALLING);
}
void loop() {
_delay_ms(100);
if (val == 1){
tone(pin,262,400) ; // ド
_delay_ms(400); // 音がなっている間待機
tone(pin,294,400) ; // レ
_delay_ms(400);
tone(pin,329,900) ;
_delay_ms(900);
tone(pin,249,400) ;
_delay_ms(400);
tone(pin,262,800);
_delay_ms(800);
}
val =0;
}
void keisan3() {
for (int k = 0;k<=180; k++){
if (k<=150) {
digitalWrite(ledPin, HIGH);
_delay_ms(500);
digitalWrite(ledPin, LOW);
_delay_ms(500);
}else{
digitalWrite(ledPin, HIGH);
_delay_ms(250);
digitalWrite(ledPin, LOW);
_delay_ms(250);
digitalWrite(ledPin, HIGH);
_delay_ms(250);
digitalWrite(ledPin, LOW);
_delay_ms(250);
}
}
val =1;
}
void kei4() {
for (int k = 0;k<=240; k++){
if (k<=210) {
digitalWrite(ledPin, HIGH);
_delay_ms(500);
digitalWrite(ledPin, LOW);
_delay_ms(500);
}else{
digitalWrite(ledPin, HIGH);
_delay_ms(250);
digitalWrite(ledPin, LOW);
_delay_ms(250);
digitalWrite(ledPin, HIGH);
_delay_ms(250);
digitalWrite(ledPin, LOW);
_delay_ms(250);
}
}
val =1;
}
Attiny202の仕様を詳しく理解してない初心者がプログラムしたので、コードが汚いと思いますので、ご了承ください。
簡単にプログラムを説明します。
割り込みはピンをインプットでプルアップして、電圧が0のなった時に割り込みが起こります。
インターラプトピンはA1 4番ピン、A2 5番ピンです、何でもいいようではないようでA7では割り込みができませんでした。
また、TONE関数の挙動がパラメターをふくめて詳しく理解できませんでした、またこの関数を割り込む処理関数の中に書くとうまく動きませんでした。
TONE関数も割り込みを使ているからなのか、よくわかりません。
あとはval変数で割り込み処理の後で音を鳴らす判断をしていますが、私の場合割り込み処理を2個使う仕様にすると、コンパイルではエラーがなく書き込みできても、うまく動かず音が出なくて苦労しました。
loop()処理の初めに_delay_ms(100);入れないと音が鳴るときと、ならない時がありました。
また、にエラーがなく書き込みができても、動かないこともあり、再度書き込みをすると動きました。
最後に何とかこのプログラムでうまく動きました、興味がありましたら色々改良してくみてださい。
Arduino 設定
最後にAttinyに書き込みする時のアルディーノのツールの設定を載せておきます。

検証コンパイルが終了すると、問題がなければ下記のメセッセージが出ます。
最大2048バイトのフラッシュメモリのうち、スケッチが1872バイト(91%)を使っています。
最大128バイトのRAMのうち、グローバル変数が41バイト(32%)を使っていて、ローカル変数で87バイト使うことができます。