mokArduino: Moka + Arduino

Nevigando in rete mi sono imbattuto nel progetto: mokArduino che ho trovato davvero interessante. Ti sarà capitato di pensare ad un oggetto che fa tutto e aver chiesto: fa pure il caffè ?

mokArduino fatti un caffè con Arduino

e allora perchè non farlo fare ad Aduino, ora si che potrai dire il mio Arduino fa proprio tutto, anche il caffè !!!

Come nasce mokArduino

la nascita del progetto puoi leggerla direttamente dall’autore del progetto: Ivan

Tutto nasce dalla mia svogliatezza cronica. Sarà colpa mia o sarà che la sveglia è alle 7:00, ma io la mattina facevo fatica anche a farmi un caffè. Facevo, appunto; d’ora in poi non avrò più questo peso immane grazie a mokArduino.

l’idea è forse quella che anche tu avresti voluto realizzare e si basa sul controllo di un relay con arduino ad un orario specifico.

Come funziona mokArduino

La base è composta da Arduino, un relay con il suo circuito, un RTC tipo DS1307 ed una moka elettrica.

Allo scoccare dell’ora stabilita mokArduino provvede ad eccitare il relay ed accendere la moka colegata.

Certo come dice Ivan: l’unico sbattimento resta quello di provvedere alla preparazione della macchinetta la sera prima in modo che all’accensione possa fare il suo dovere.

Aggiungo che se invece di una moka utilizzi una macchina da caffè espresso a cialde non devi preparare nulla, ma non puoi chiamare il tuo progetto mokArduino … magari expressduino o qualcosa di simile.

Cosa mi occorre per realizzare il mio mokArduino

Sul Blog di Ivan, segui il link, puoi trovare:

  • la lista dei componenti necesari
  • gli schemi per il relay, l’RTC e l’LCD
  • gli sketch per impostare l’ora e per il mokArduino

Se non sei un esperto di elettronica o non hai dimestichezza con la tensione di rete ( 220v ) ti consiglio di evitare l’autocostruzione dello schema relay e di scegliere una shield relay dedicata con almeno un relay da 250VA 10A o 16A

Anche l’RTC puoi trovalo come shield già assemblata o solo da saldare.

Non ti riporto tutti gli schemi disegnati da Ivan perchè tu possa andare sul suo blog a leggere l’intero articolo.

Lo sketch del mokArduino

Gli sketch rilasciati da Ivan sono due:

Il primo serve per impostare l’ora nell’RTC DS1307 non lo commento in quanto trovi in questo stesso Blog altri articoli dedicati all’impostazione dell’orario sul DS1307 e potrai scegliere quale utilizzare.

Il secondo è lo sketch del mokarduino:

/*

mokArduino - versione 1.1.1

display LCD, impostazione sveglia con tasti

*/

#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>
#include <LiquidCrystal.h>

#define DELTA_ALARM 6

int alarm_h=6;
int alarm_m=58;
int fine_alarm_h;
int fine_alarm_m;
int active = false;
LiquidCrystal lcd (5,6,7,8,9,10);

void setup()
{
  /*
  RTC.stop();
  RTC.set(DS1307_SEC,0);        //set the seconds
  RTC.set(DS1307_MIN,30);     //set the minutes
  RTC.set(DS1307_HR,17);       //set the hours
  RTC.set(DS1307_DOW,3);       //set the day of the week
  RTC.set(DS1307_DATE,8);       //set the date
  RTC.set(DS1307_MTH,2);        //set the month
  RTC.set(DS1307_YR,12);         //set the year

  RTC.start();
  */

  pinMode(2, OUTPUT);    //al Relè
  pinMode(3, INPUT);    //pushbutton  hh++
  pinMode(4, INPUT);    //pushbutton  mm++

  pinMode(5, OUTPUT);    //LCD RS
  pinMode(6, OUTPUT);    //LCD EN
  pinMode(7, OUTPUT);    //LCD D4
  pinMode(8, OUTPUT);    //LCD D5
  pinMode(9, OUTPUT);    //LCD D6
  pinMode(10, OUTPUT);    //LCD D7

  pinMode(12, INPUT);    //alarm set switch
  pinMode(11, INPUT);    //enable

  digitalWrite(3, HIGH);      //
  digitalWrite(4, HIGH);      //  resistenze di
  digitalWrite(11, HIGH);     //  pullup
  digitalWrite(12, HIGH);    //

  set_fine_alarm(DELTA_ALARM);

  lcd.begin(16,2);
  lcd.print("mokArduino");
  lcd.setCursor(0,1);
  lcd.print("V 1.1.1");
  delay(2000);
}

void loop()
{
  if((!active) && (RTC.get(DS1307_HR,true) == alarm_h) && (RTC.get(DS1307_MIN,false) == alarm_m) && (digitalRead(11) == LOW) && (digitalRead(12) == HIGH))
  {
    lcd.clear();
    lcd.print("Buongiorno!");
    digitalWrite(2, HIGH);
    active = true;
    delay(5000);
  }

  if((active) && (RTC.get(DS1307_HR,true) == fine_alarm_h) && (RTC.get(DS1307_MIN,false) == fine_alarm_m))
  {
    active = false;
    digitalWrite(2, LOW);
  }

  if(digitalRead(12) == LOW){   //alarm set ON
    lcd.clear();
    lcd.print("Alarm Set:");

    lcd.setCursor(0,1);
    lcd.print("A ");
    lcd.print(alarm_h);
    lcd.print(":");
    lcd.print(alarm_m);
    lcd.setCursor(8,1);
    lcd.print("f ");
    lcd.print(fine_alarm_h);
    lcd.print(":");
    lcd.print(fine_alarm_m);

    if(digitalRead(3) == LOW){   //hh++
      if(alarm_h != 23)
        alarm_h++;
      else
        alarm_h = 0;
      set_fine_alarm(DELTA_ALARM);
    }
    if(digitalRead(4) == LOW){   //mm++
      if(alarm_m != 59)
        alarm_m++;
      else
        alarm_m = 0;
      set_fine_alarm(DELTA_ALARM);
    }

  }else{                      //alarm set OFF - mostra l'ora attuale
    lcd.clear();
    if(active){
      lcd.setCursor(3,0);
      lcd.print("[");
    }else
      lcd.setCursor(4,0);
    lcd.print(RTC.get(DS1307_HR,true));
    lcd.print(" : ");
    lcd.print(RTC.get(DS1307_MIN,false));
    if(active)
      lcd.print("]");

    lcd.setCursor(0,1);
    lcd.print(RTC.get(DS1307_DATE,false));
    lcd.print("/");
    lcd.print(RTC.get(DS1307_MTH,false));
    lcd.print("/");
    lcd.print(RTC.get(DS1307_YR,false));

    if(digitalRead(11) ==LOW){
      lcd.setCursor(15,0);
      lcd.print("*");
    }

    if(digitalRead(3) == LOW){                         //hh++
      if(RTC.get(DS1307_HR, true) != 23)
        RTC.set(DS1307_HR, RTC.get(DS1307_HR, false) + 1);
      else
        RTC.set(DS1307_HR, 0);

    }
    if(digitalRead(4) == LOW){                          //mm++
      if(RTC.get(DS1307_MIN, true) != 59)
        RTC.set(DS1307_MIN, RTC.get(DS1307_MIN, false) + 1);
      else
        RTC.set(DS1307_MIN, 0);

    }
  }
  delay(500);
  if(active)
    delay(1500);
}

void set_fine_alarm(int delta){
  int delta_m=delta%60;
  int delta_h=int(delta/60);

  fine_alarm_m=alarm_m+delta_m;
  if(fine_alarm_m>=60){
    delta_h+=int(fine_alarm_m/60);
    fine_alarm_m%=60;
  }
  fine_alarm_h=alarm_h+delta_h;
  if(fine_alarm_h>=24){
    fine_alarm_h%=24;
  }
}

lo sketch si occupa di molte funzioni, prima di tutto va detto che questo sketch è scritto per Arduino 0022 e che dovrai adattarlo per usarlo con un IDe di versione successiva.

Concentrati sui passaggi fondamentali alle linee 09-012: includi le classi che ti servono per comunicare con il Display e con l’RTC;

linee 016-017: definisci l’orario di sveglia, ossia l’orario in cui attivare il relay e la preparazione del caffè;

linea 021: imposta la comunicazione con l’LCD sui pin 5,6,7,8,9 e 10;

linea 38: definisci la modalità di OUTPUT per il pin 2 a cui avrai collegato il circuito relay, se utilizzi una shield relay di quelle in commercio assicurati che nessuno dei pin usati dalla shield sia tra quelli usati dal display LCD;

linee 39-40: imposta la modalità INPUT per i pulsanti connessi ai pin 3 e 4 utilizzati rispettivamente come incremento delle ore e dei minuti;

linee 42-43: imposti la modalità OUTPUT per i pin a cui è collegato l’LCD, questa parte è superflua;

linea 49: imposta come pin di INPUT il pin 12 a cui hai collegato il pulsante con cui controllare l’impostazione della sveglia;

linea 57: richiami la funzione set_fine_alarm() che imposta dopo quanto tempo dal momento in cui è scattato l’allarme deve interrompersi, questa impostazione è molto importante per lo sketch in modo che interrompa il ciclo di allarme ma lo è ancora di più per il tuo caffè che potrebbe avere un gusto bruciato se mokArduino restasse acceso oltre il tempo necessario a produrre un caffé;

linee 59-62: pulisci il display LCD e scrivi il nome del progetto e la versione: mokArduino  V 1.1.1

linee 68-75: in queste linee è racchiuso il cuore del mokArduino, verifica se l’ora ed i minuti letti sull’LCD coincidono con quelli impostati e se la variabile active è false, ossia se mokarduino non è in funzione, in questo caso scrive sul display “Buongirorno” ( linea 71 ) e inizia la preparazione del caffé ( linea 72 ) reimpostando la variabile active a true;

linee 77-81: solo le linee che si occupano di spegnere mokarduino quando il tempo di allarme giunge a termine, confronta l’ora ed i minuti con quelli ricavati con la funzione set_fine_alarm() e se la variabile active è true ossia mokarduino è attivo, provvede a spegnere la moka e resettare il valore di active;

linee 83-113: è il codice in cui premendo il pulsante connesso al pin 12 di arduino e tenendolo premuto puoi impostare l’ora di sveglia;

linee 114-152: è il normale funzionamento in cui ad ogni loop() mostra l’ra sul display.

Alcuni consigli o possibilità di miglioramento dello sketch li vedremo in un futuro articolo, ti accenno che sarebbe ottima cosa memorizzare l’impostazione sulla EEPROM di Arduino per essere certo che anche se la mancanza di corrente causasse un riavvio di Arduino, tutte le tue impostazioni resterebbero invariate ed avresti comunque il caffè all’ora stabilita; l’altra modifica riguarda le librerie usate e l’adeguamento del codice per l’IDE 1.0 o successivo.

Il video del primo caffè con mokArduino

Grazie Ivan per il tuo progetto !!!

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/mokarduino-moka-arduino.html

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.