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 !!!

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/mokarduino-moka-arduino.html

17 commenti

Vai al modulo dei commenti

    • daniele il 22 Aprile 2013 alle 15:50
    • Rispondi

    ciao… ho visto che fai tanti progetti .. io sono uno studente di informatica al 5 anno e vorrei realizzare qualcosa con arduino e magari una ethernet shield pero non so cosa non sono un grand esperto di arduino … cerco qualcosa di semplice da realizzare che magari si colleghi anche a un data base o altro che riguardi l’informatica..

    1. Ciao Daniele,
      mi fa piacere leggere della tua buona volontà.
      Ti consiglio di iniziare a leggere le prime lezioni del corso-arduino on-line che ho pubblicato gratuitamente e se vuoi a fine mese 27 aprile e 04 maggio terrò un corso a Milano in cui ho disponibile gli ultimi 2 posti.
      Oggi ho pubblicato un articolo sulla comunicazione di Arduino, Ethernet e DataBase puoi dargli un occhio, ma non scoraggiarti se non comprendi tutto, se sei alle prime armi è normale.

      Mauro

    • daniele il 30 Aprile 2013 alle 01:01
    • Rispondi

    non preoccuparti diciamo che qualcosina conosco di arduino… non sono molto pratico ma le basi penso di conoscerle.. pensavo che tu magari potevi darmi qualche suggerimento su cosa fare di semplice… pero vorrei usare anche database e magari una ethernet shield(visto che la wi-fi costa un sacco ho visto..)conosco le basi dell’elettronica e me la cavicchio con i circuiti.. avrei qualcosa da suggerirmi..?? io ho visto che fai cose stupende ma mi sembrano al quanto difficili magari poi mi sbaglio…

    ps conosco il php, mysql , html e il c 🙂

    1. Ciao Daniele,
      ti suggerisco di iniziare con qualcuno dei progetti che trovi sul Blog, leggerli tutti attentamente e prendere confidenza con le shield che vuoi utilizzare.
      La tua conoscenza di HTML,Php e sopratutto C ti sarà utilissima.

      Mauro

    • daniele il 12 Maggio 2013 alle 11:15
    • Rispondi

    come le dicevo devo sviluppare un qualcosa per la maturita.. quindi mi ha interessato molto il video sulla domotica e vorrei fare un modellino se ci riesco.. da pero utilizzare in locale(senza internet) quindi trammite ethernet shield e un router wifi casalingo ho sviluppato un sketch per comandare 4 led e gia qui ho un problema.. i led funzionano tutti tranne l’ultimo…

    seconda cosa oltre i led vorrei mettere sensori di temperatura e altro il problema che non ho piu spazzi… nelle porte digitali di arduino.. non potento usare 1 e 2 che sono tx e rx e 13 12 11 10 che servono per il controllo della ethernet.. sn a corto 🙁

    terzo problema come faccio a trasformare questa singola pagina web in un web server?

    quarto problema come passo i dati al php per il database? (a questo file dovrei mettere l’autenticazione mediante una password quindi creare un database utenti e magari uno accessi per registrare gli accessi e uno per registrare tutto quello che si fa accendere dei led ecc ecc ecc o quando la temperatura supera una certa sogna far accendere dei led rossi e nel contempo fare la query che registra questa fatto.. mettendo anche un if per una ventola o altro (anche se nn so in che stanza piazzarla )

    #include
    #include
    byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0Xc4, 0x93 };
    byte ip[] = { 192, 168, 1, 2 };
    EthernetServer server(80);
    String readString;
    byte led_1 = 3;
    byte led_2 = 4;
    byte led_3 = 5;
    byte led_4 = 6;

    void setup()
    {
    Ethernet.begin(mac, ip);
    pinMode(led_1, OUTPUT);
    pinMode(led_2, OUTPUT);
    pinMode(led_3, OUTPUT);
    pinMode(led_4, OUTPUT);
    }

    void loop(){

    EthernetClient client = server.available();

    if (client) {
    boolean currentLineIsBlank = true;

    while (client.connected()) {
    if (client.available()) {
    char c = client.read();
    readString.concat(c);
    if (c == ‘\n’ && currentLineIsBlank) {

    if(readString.indexOf(“on_1”) > 0) {
    digitalWrite(led_1, HIGH);
    delay(500);
    digitalWrite(led_1, LOW);
    delay(500);
    digitalWrite(led_1, HIGH);
    delay(500);
    digitalWrite(led_1, LOW);
    delay(500);
    digitalWrite(led_1, HIGH);
    delay(500);
    digitalWrite(led_1, LOW);
    delay(500);
    digitalWrite(led_1, HIGH);
    }
    if(readString.indexOf(“off_1”) > 0) digitalWrite(led_1, LOW);
    if(readString.indexOf(“on_2”) > 0) digitalWrite(led_2, HIGH);
    if(readString.indexOf(“off_2”) > 0) digitalWrite(led_2, LOW);
    if(readString.indexOf(“on_3”) > 0) digitalWrite(led_3, HIGH);
    if(readString.indexOf(“off_3”) > 0) digitalWrite(led_3, LOW);
    if(readString.indexOf(“on_4”) > 0) digitalWrite(led_4, HIGH);
    if(readString.indexOf(“off_4”) > 0) digitalWrite(led_4, LOW);

    // PAGINA HTML
    client.println(“HTTP/1.1 200 OK”);
    client.println(“Content-Type: text/html”);
    client.println();
    client.print(“Progetto Arduino”);
    client.print(“”);

    client.print(” Pagina di controllo “);
    client.print(“”);
    client.print(“”);
    client.print(“”);

    client.print(“”);
    client.print(“”);
    client.print(“”);

    client.print(“Led 1“);

    client.print(“”);
    client.print(“”);

    if (digitalRead(led_1)== true) client.print(“”);
    else client.print(“”);

    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);

    client.print(“”);

    client.print(“”);
    client.print(“”);

    client.print(“”);

    client.print(“”);
    client.print(“”);
    client.print(“”);

    client.print(“”);
    client.print(“”);

    client.print(“”);
    client.print(“”);
    client.print(“”);

    client.print(“Led 2“);

    client.print(“”);
    client.print(“”);

    if (digitalRead(led_2)== true) client.print(“”);
    else client.print(“”);

    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);

    client.print(“”);

    client.print(“”);
    client.print(“”);

    client.print(“”);

    client.print(“”);
    client.print(“”);
    client.print(“”);

    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);

    client.print(“Led 3“);

    client.print(“”);
    client.print(“”);

    if (digitalRead(led_3)== true) client.print(“”);
    else client.print(“”);

    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);

    client.print(“”);

    client.print(“”);
    client.print(“”);

    client.print(“”);

    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);

    client.print(“Led 4“);

    client.print(“”);
    client.print(“”);

    if (digitalRead(led_4)== true) client.print(“”);
    else client.print(“”);

    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);

    client.print(“”);

    client.print(“”);
    client.print(“”);

    client.print(“”);

    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);
    client.print(“”);
    readString=””;

    delay(1);
    client.flush();
    client.stop();
    }
    }
    }
    }
    }

    1. Ciao Daniele,
      progetto interessante e complesso allo stesso tempo.
      Cerco di darti qualche info:

      1. se solo un led non funziona prova se si tratta di un led bruciato o collegato male spostando lo al posto di uno funzionante.

      2. Se sei a corto di pin digitali, usa sensori analogici o qualcosa sull’I2C come le sonde della Dallas, ance se penso sia più semplice l’uso di quelli analogici.

      3. Arduino può essere usato come webserver se te lo scrivi tu, o se trovi un webserver già fatto da usare, in ogni caso non avrà mai grandi performance a causa dei suoi limiti Hw, io ti consiglierei una Rasperry come webserver su cui puoi installare Php, mySql ecc… Non so come te la cavi con Linux

      4. Per inviare dati puoi prendere uno dei miei esempi fatti per la GPRS schield o il primo degli articoli sul l’irrigazione arduino di un paio di settimane fa 🙂

      Mauro

    • daniele il 13 Maggio 2013 alle 15:00
    • Rispondi

    conosci qualcosa di gia pronto da usare come web server?.(non ho molto tempo a disposizione) e non vorrei spendere altri soldi per raspberry..

    ho provato a cambiare led ma non funziona comunque o meglio il led se lo sposto va quindi non e bruciato se cambio i pin e uguale l’ultimo nn funziona mai se riduco a tre led funziona tutto ….

    1. Ciao Daniele,
      per il server non so aiutarti, prova magari con un servizio esterno su internet di quelli gratuiti,
      un Web Server su arduino è certamente limitato.
      Per il led, prov a controllare lo sketch a volte è solo una variabile sbagliata.

      Mauro

        • daniele il 13 Maggio 2013 alle 23:44
        • Rispondi

        pultroppo non posso usare internet quindi deve essere tutto in locale durante la presentazione.. :((
        ho visto che hai fatto un bel articolo su come mettere piu pagine htm su la sd e se facessi anch’io cosi poi riesco a comandare i led o inviare e ricevere i dati?

        a….in quel procetto c’e anche Client e Server al posto di EthernetClient e EthernetServer con la sintassi nuova..
        e se la porto cambiata non mi funziona manco la parte che visualizza le pagine 🙁

        1. Ciao Daniele,
          comprendo.
          Purtroppo Arduino non possiede funzioni di web server e tantomeno di interprete per linguaggi php o Database Mysql.

          Questo significa che per farlo tu devi scriverti tutto, in entrati un metalinguaggio e un modo di memorizzare dati su file.
          Tutto fattibile ma con uno sforzo non da poco.

          Se non puoi usare altro che arduino e la Ethernet shield trova un tuo metodo di memorizzare i dati su SD, tipo file txt, e scrivi tutto il codice necessario.

          Mauro

            • daniele il 15 Maggio 2013 alle 15:54

            una info… ho provato a collegare un sensore di temperatura lm35dz ma quando collego…. la gnd a gnd , il pin vcc a 5 volt su arduino e il pin centrale del sensore a un pin analogico di arduino…. appena attacco arduino con usb ha un brusco calo di alimentazione tanto che si scollega dal pc -.- perche? e non funziona piu niente 🙁

    • daniele il 11 Giugno 2013 alle 00:21
    • Rispondi

    ciao posso chiederti un favorone? sono riuscito a fare una pagina html dentro lo sketch di arduino che comanda due led e se la temperatura sale piu di 28 gradi parte la ventola… ora pero vorrei aggiungere l’ultimo pezzo se riesco ho terminato..: ) ti spiego magari sai come aiutarmi e se vuoi ti posto tutto il codice…
    allora vorrei aggiungere la creazione di un file di log e forse qui riesco da solo.. non so come visualizzare il file di log sulla pagina html.. nel file vorrei mettere ora data e temperatura ho un rtc se puo essere utile ma non so come fare :(( rtc che uso e il ds1307 mi help??

    1. Ciao Daniele,
      uno dei miei articoli più letti é il DataLogger che trovi sul blog ed usa quello che hai tu.
      Per leggere un file via HTML puoi usare uno degli esempi forniti con la libreria SD di Arduino.

      Mauro

    • Franco il 16 Gennaio 2014 alle 21:09
    • Rispondi

    ciao ma non ho capito delle cose:

    in teoria e in pratica arduino e sempre attivo e se non ha una shield per capire quando e l’ora di attivazione come fa?

    non vedo contatori e anche se ci fossero dopo quanto va in overflow?

    se io volessi azionare un rele 230v ogni 24 ore cosa mi converrebbe fare senza shield?
    grazie anticipatamente Mauro.

    1. Ciao Franco,
      senza l’uso di una shield esterna di tipo RTC che ti restituisca l’ora l’unica cosa a cui puoi affidarti è al contatore interno con un delay.
      Resta chiaro che per qualunque fattore esterno arduno dovesse resettarsi il tuo conteggio ricomincierebbe sfalsando completamente i tuoi calcoli.

      Mauro

    • Roby il 10 Ottobre 2016 alle 18:17
    • Rispondi

    Ciao Mauro,
    sono interessato allo sketch della Moka ma provando a caricarlo nel microcontrollore, IDE di da errore.
    Da questo messaggio:
    ‘DS1307_HR’ was not declared in this scope
    per tutte le voci dell RTC.
    E’ possibile fare qualcosa?
    Grazie.

    Saluti

    1. Ciao Roby,
      verifica di possedere la medesima libreria usata dall’autore del progetto, se non sai dove reperirla chiedila all’autore stesso.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

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