Arduino al pomodoro

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);
}

2 risposte a “Arduino al pomodoro”

  1. 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.

I commenti sono chiusi