wayabi が 2021年01月17日18時08分51秒 に編集
初版
タイトルの変更
おふろタイマー
タグの変更
ATtiny
タイマー
省電力
小型化
秋葉原2021
かわいい
メイン画像の変更
本文の変更
# おふろタイマー @[twitter](https://twitter.com/wayabi3/status/1350730763503763461) ## 動機 筆者の家のお風呂にはタイマー機能が無い。 湯船にお湯を溜める場合にはスマホでタイマーを設定するか、時計を眺めてその都度お湯の状況を確認しに行かなければならない。 この問題を解決するためのガジェットを作った。 100均タイマーの存在は忘れる。 ## 設計 盛り込みたい機能は下記である。 - かわいい - ワンボタンでタイマー開始 - 5分~15分、1分刻みでタイマーセットできること 同じ設定温度でも季節によってお湯の溜まる時間が変化するため。 - タイマー開始と終了時に大きめの音が出ること - 電池で動作 - 省電力消費。数か月間電池交換をする必要がないこと お風呂場にアヒルのおもちゃがあったのでそれをケースにすることにした。 単純なタイマー機能のみなのでATTiny13Aを使用することにした。音の出力はaP23085というオーディオICを使用する。  ATTiny13AにはADCがあるので、可変抵抗の目盛り(電圧変化)でタイマー時間を設定できるようにする。 ## 実装 ### ソフトウェア ```arduino:arduino_ATTiny13A #include <avr/io.h> #include <avr/sleep.h> #include <util/delay.h> #include <BasicSerial3.h> uint16_t data[] = {92, 102, 112, 128, 146, 170, 204, 256, 341, 512, 1024}; uint8_t ADread(uint8_t ch) { ADCSRA |= 0b10000110; ADMUX |= 0b00100000; ADMUX |= ch; ADCSRA |= 0b01000000; loop_until_bit_is_set(ADCSRA,ADIF); return ADCH; } void wakeUpNow() { // here the interrupt is handled after wakeup } void sleepNow() { // here we put the arduino to sleep pinMode(4, INPUT); ADCSRA &= ~(1<<ADEN); //Disable ADC ACSR = (1<<ACD); //Disable the analog comparator DIDR0 = 0x3F; //Disable digital input buffers on all ADC0-ADC5 pins. set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here sleep_enable(); // enables the sleep bit in the mcucr register attachInterrupt(0, wakeUpNow, LOW ); // use interrupt 0 (pin 1) sleep_mode(); // here the device is actually put to sleep!! sleep_disable(); // first thing after waking from sleep: detachInterrupt(0); // disables interrupt 0 on pin 1 } int pin_start = 2; int pin_end = 0; void setup() { PORTB = B10010; pinMode(pin_start, OUTPUT); pinMode(pin_end, OUTPUT); } void loop() { delay(500); //スリープモード中の消費電力は数μAでボタン電池でも数か月保つ想定 sleepNow(); delay(10); //ボタン押下時の音再生+ADC用回路をONに digitalWrite(pin_start,HIGH); delay(1000); uint16_t analog = analogRead(2); //可変抵抗値はメモリ回転量と線形に変化する。 //オームの法則により分圧電圧は線形変化しないので目盛りとタイマー時間が線形対応するように補正する char a; for(a=0;a<11;++a){ if(analog <= data[a]) break; } digitalWrite(pin_start,LOW); delay(1000); for(char i=0;i<a;++i){ //1分刻みでスリープ delay(60000); } //タイマーカウント0時の音再生 digitalWrite(pin_end,HIGH); delay(100); digitalWrite(pin_end,LOW); } ``` #### 分圧電圧 R1は可変(100KΩ) R2は固定(10KΩ)  R1(0Ω~100KΩ)を10等分した時のV1を配列にし、プログラムから参照することで可変抵抗回転量と線形にタイマー設定できるようにした。 ``` uint16_t data[] = {92, 102, 112, 128, 146, 170, 204, 256, 341, 512, 1024}; ``` ### ハードウェア  ## 感想 単純なタイマーの実装だったが、日常的な使用に耐えるために、ボタン電池での小型化、省電力消費を満たす為に考えることが多かった。勉強になった。 中華製の可変抵抗を使ったが抵抗値が可変せずに上手く動かなかった。原因究明に時間が掛かった。