Maker Faire 2014出展情報4 ハルロック 無駄時間可視化ツール改
ハルロック本家が猫twitterなどで出展されるのでおこがましいのですが
ひっそりと展示しときます。
今のところ今回自分(sakehito)の唯一の作品なので。
・仕様
作中の解説と脳内保管から機能仕様は下記にしました。
・ボタン押下で時間計測をON/OFFし、計測値はATtiny45内のEEPROMに保存する
・計測結果の確認はAttiny45を取り外して、ライター環境で読み出すことで、取得する
=>長押しで2進数でEEPROMデータ表示(追加機能!)
・1週間バッテリー交換無で動作すること
・未計測時はパワーセーブモードに移行して省電力化すること
・結果
https://docs.google.com/spreadsheets/d/1EGX-QOQUUa8TQil_8735L1fB2xrmEzw_FKDFe1B-3QM/edit#gid=0
・ソフト
Attiny45をArduino化して下記のように書いてます。
あまりきれいなコードではないですが参考に。
//HARUROCK 9ohm //2014.7.24 //長押し時に毎回binを点滅表示 //sakehito@ngitigadget #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include <EEPROM.h> //外部割込み端子(D2)にタクトスイッチ接続 #define SW 2 #define LED 1 #define LOOP_WAIT 1 #define BUTTON_COUNT 40 #define BUTTON_WAIT 32 #define BUTTON_LONGWAIT 150 #define STOP 0 #define START 1 #define EEPADD 0 unsigned long now1 = 0, now2 = 0; unsigned long wastetime = 0; unsigned long newtime = 0; unsigned char swcount = 0, initial_flag = 0; byte hours = 0; byte minutes = 0; byte seconds = 0; boolean ledblink = 0; byte status = START; int blink_counter = 0; volatile unsigned int sw = 1; unsigned char i = 0, j = 0; byte eeptemp=0; boolean eep1bit=0; unsigned long ledwait =0; //Timer1 void initTimerCounter1(void); void setup() { //EEPROM initiarize //00:hour,01:minute,02:secondに割り当て //00がFFなら、出荷時かMAX値と判断して、3byte00に初期化 if ( EEPROM.read(EEPADD) == 0xFF) initial_flag = 1; else initial_flag = 0; if (initial_flag) { for (i=EEPADD ; i<EEPADD+3 ; i++) { EEPROM.write(i,0x00); } } // Pin initiarize pinMode(SW, INPUT); digitalWrite(SW,HIGH); pinMode(LED, OUTPUT); digitalWrite(LED,HIGH); //timer1 initTimerCounter1(); //Sleep initiarize set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); delay(500); attachInterrupt(0, wakeup, LOW); //割り込み開始 sleep_mode(); //sleepに移行 } //Timer1設定 void initTimerCounter1(void) { TCCR1 = 0; //stop the timer TCNT1 = 0; //zero the timer GTCCR = _BV(PSR1); //reset the prescaler OCR1A = 243; //set the compare value 1sec TIMSK &= ~0x40; TCCR1 = _BV(CTC1) | _BV(CS13) | _BV(CS12); } //LED極性反転 ISR(TIMER1_COMPA_vect) { ledblink = ~ledblink; digitalWrite(LED,ledblink); } //LED消灯 void off() { digitalWrite(LED,HIGH); } //外部割込みピンに繋がったタクトスイッチでsleepから復帰) void wakeup(){ } //swが押されている期間をカウント void switched(){ for(i=0;i<BUTTON_COUNT;i++){ sw = digitalRead(SW); if (sw ==0) swcount++; else swcount =0; } } //EEPROMの内容をLED点滅で表示 void bin_display() { for(i=0;i<3;i++){ eeptemp = EEPROM.read(i); for(j=0;j<8;j++){ eep1bit = bitRead(eeptemp, 7-j) ; if (eep1bit) ledwait = 1000; else ledwait = 300; digitalWrite(LED,LOW); delay(ledwait); digitalWrite(LED,HIGH); delay(1000); } delay(2000); } } void loop() { delay(LOOP_WAIT); // check SW and avoid chatterin switched(); if(swcount >= BUTTON_LONGWAIT){ TIMSK &= ~0x40; bin_display(); off(); swcount = 0; } if(swcount >= BUTTON_WAIT){ switch(status){ case START: //割り込み停止 detachInterrupt(0); now1 = millis(); hours = EEPROM.read(EEPADD); minutes = EEPROM.read(EEPADD+1); seconds = EEPROM.read(EEPADD+2); delay(10); wastetime = hours * 3600 + minutes*60 + seconds; //割り込み再開 attachInterrupt(0, wakeup, LOW); //Timer1 active TIMSK |= 0x40; delay(100); status = STOP; break; case STOP: detachInterrupt(0); off(); TIMSK &= ~0x40; //Timer1 nonactive now2 = millis(); newtime = wastetime + (now2 - now1)/1000; //秒を時、分、秒に変換 hours = newtime / 3600; minutes = (newtime - (hours * 3600) ) / 60; seconds = newtime - ( hours * 3600 ) -( minutes *60 ); //EEPROM WRITE EEPROM.write(EEPADD,hours); EEPROM.write(EEPADD+1,minutes); EEPROM.write(EEPADD+2,seconds); attachInterrupt(0, wakeup, LOW); delay(100); status = START; sleep_mode(); break; } } }