Per trasformare il mio Arduino in un conta-pomodori ho seguito le facili istruzioni di Mike Stok, grazie al quale ho scoperto l’esistenza di Fritzing, un tool di prototipazione dedicato al mondo Arduino che mi permette di disegnare queste cose:
Per adesso mi limito ad accendere il led rosso per 25 minuti alla pressione del bottone, con lampeggio nel minuto finale e passaggio al giallo per i 5 minuti successivi; quindi il led verde.
Prossimi passi: regolare automaticamente l’intansità del led in base alla luminosità dell’ambiente. Il codice l’ho messo dopo il salto.
// #define TEST_INTERVALS #define HEARTBEAT_LED 13 #define INITIAL_TCNT1 (65536 - 16000000 / 256) #define PUSHBUTTON_INT 0 #define WORK_STATE 0 #define REST_STATE 1 #define FREE_STATE 2 #define N_STATES 3 #define INITIAL_STATE FREE_STATE int ledFor[] = { 3, 11, 5 }; #ifndef TEST_INTERVALS int secsFor[] = { 25 * 60, 5 * 60, 0 * 60 }; #else int secsFor[] = { 15, 10, 0 }; #endif int nextStateTimer[] = { REST_STATE, FREE_STATE, FREE_STATE }; int nextStateButton[] = { FREE_STATE, FREE_STATE, WORK_STATE }; volatile boolean heartbeatOn = false; volatile int brightnessFor[N_STATES]; volatile int state; volatile int secsDuration; volatile int secsLeft; ISR(TIMER1_OVF_vect) { noInterrupts(); TCNT1 = INITIAL_TCNT1; heartbeatOn = !heartbeatOn; digitalWrite(HEARTBEAT_LED, heartbeatOn ? HIGH : LOW); updateLeds(); if (secsLeft > 0) { if (--secsLeft == 0) { enterState(nextStateTimer[state]); } } interrupts(); } void buttonReleased() { noInterrupts(); enterState(nextStateButton[state]); interrupts(); } void updateLeds() { int i; // Clear all the "other" state leds for (i = 0; i < N_STATES; i++) { if (i != state) { brightnessFor[i] = 0; } } if (state == FREE_STATE) { brightnessFor[FREE_STATE] = 255; } else { int rampDownPeriod = 180; if (secsLeft > rampDownPeriod || heartbeatOn) { brightnessFor[state] = 255; } else { brightnessFor[state] = map(secsLeft, 0, rampDownPeriod, 64, 255); } } } void enterState (int newState) { state = newState; secsDuration = secsLeft = secsFor[newState]; updateLeds(); } void setup() { int i; pinMode(HEARTBEAT_LED, OUTPUT); enterState(INITIAL_STATE); attachInterrupt(PUSHBUTTON_INT, buttonReleased, RISING); TIMSK1 = 0x01; TCCR1A = 0x00; TCNT1 = INITIAL_TCNT1; TCCR1B = 0x04; } void loop () { int i; for (i = 0; i < N_STATES; i++) { analogWrite(ledFor[i], brightnessFor[i]); } delay(50); }
attento che stai risvegliando i miei istinti di perito elettronico e quella basetta è nel cassetto della mia scrivania a casa dei miei che sta aspettando solo che la vada a riprendere.
Roberto, che aspetti? Corri a prenderla! 🙂