Domanda Macchina per cocktail in Arduino

LiLp

Utente Silver
23 Aprile 2021
186
9
21
60
Premetto che ho appena iniziato con l'elettronica e implementazioni in arduino ma ho basi nei linguaggi di programmazione.

Sono al primo anno del c.d.l in ITPS(Informatica e Tecnologia per la Produzione del Software) e parlando del più e del meno con altri frequentanti ci è venuta in mente questa piccola idea.
Di per sè abbiamo già pensato a come "implementarlo" ma si sa che più menti, anche più esperte, potrebbero facilitare e migliorare il lavoro.
Per questo ho deciso di condividere con voi questo piccolo progetto per dare nuove idee alla community e cogliere qualche consiglio.

Il progetto è ideato come segue:
  • Schermo LCD I2C per l'interfaccia grafica con l'utente dove può vedere il cocktail selezionato e lo stato di preparazione di esso una volta selezionato;
  • 3 pulsanti: avanti e indietro per scorrere la lista, OK per selezionare;
  • Pompe peristaltiche a 12V per prelevare il "liquido" dalle bottiglie e versarlo nel bicchiere (una per ogni bottiglia). [ancora devono arrivare]
Ho provato inoltre a buttar giù qualche riga di codice anche se non ho ancora tutti i componenti a disposizione per poterlo provare in quanto è necessario anche di:
  • relè 12v per comandare le pompe peristaltiche con arduino;
  • tubicini per convogliare i liquidi

Il codice per ora implementato è questo:

C:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <string.h>

int pump1=2;  //pin digitale 2 a cui è collegata la pompa N1  //RUM
int pump2=3;  //pin digitale 3 a cui è collegata la pompa N2  //GIN
int pump3=4;  //pin digitale 4 a cui è collegata la pompa N3  //VODKA
int pump4=5;  //pin digitale 5 a cui è collegata la pompa N4  //APEROL

int buzz=10; //pin digitale 10 a cui è collegato il buzzer

int pulsanteSX=11;  //pin digitale 11 a cui è collegato il pulsante sinistro
int pulsanteDX=12;  //pin digitale 12 a cui è collegato il pulsante destro
int pulsanteOK=13;  //pin digitale 13 a cui è collegato il pulsante di selezione
//dichiarazione delle variabili in cui verrà memorizzato il valore della digitalRead (0 non premuto, 1 premuto)
int valDX,valOK,valSX;

//inizializzazione delle variabili in cui verrà memorizzato lo stato precedente del pulsante
int valDXOld=0,valOKOld=0,valSXOld=0;

const int nCocktail=5;  //numero dei cocktail memorizzati
char* cocktail[nCocktail]={"Mojito","Americano","Moscow Mule","Gin Tonic","Aperol Spritz"};  //array di stringhe
int puntaCocktail=-1; //indica il numero del cocktail selezionato, inizializzato a -1 perchè nessuno è selezionato

//inizializzazione della libreria in cui è descritta la modalità di utilizzo dei pin
LiquidCrystal_I2C lcd(0x27,16,2); // impostazione dell'indirizzo dell'LCD 0x27 di 16 caratteri e 2 linee

//inizializzazione delle variabili per il multithreading
const int RSdelay = 10000;   //ReStart delay, tempo da trascorrere prima di resettare la selezione (in ms)
unsigned long RStime = millis();  //ReStart time, inizializzato al tempo trascorso dall'avvio del programma (in ms)

//#################################################
void setup()
{
  lcd.begin();  //inizializzazione dell'LCD
  lcd.backlight();  //attivazione della retroilluminazione

  //imposta i pin a cui sono collegate le pompe ad OUTPUT
  pinMode(pump1,OUTPUT);
  pinMode(pump2,OUTPUT);
  pinMode(pump3,OUTPUT);
  pinMode(pump4,OUTPUT);

  pinMode(buzz,OUTPUT); //imposta il pin collegato al buzzer come OUTPUT

  //imposta i pin a cui sono collegati i pulsanti ad INPUT
  pinMode(pulsanteDX,INPUT);
  pinMode(pulsanteOK,INPUT);
  pinMode(pulsanteSX,INPUT);

  avvio();
}
//####################################################
void loop()
{
  valDX=digitalRead(pulsanteDX);  //lettura dell'input (pulsante) e memorizzazione in valDX
  valOK=digitalRead(pulsanteOK);  //lettura dell'input (pulsante) e memorizzazione in valOK
  valSX=digitalRead(pulsanteSX);  //lettura dell'input (pulsante) e memorizzazione in valSX

  //viene controllato se l'input sia HIGH (pulsante premuto) e prima prima fosse LOW (non premuto)
  if((valDX==HIGH)&&(valDXOld==LOW)){
    buzzer(); //il buzzer riproduce un suono al click del pulsante
    puntaCocktail++;  //incrementa il contatore dei cocktail
    if(puntaCocktail>nCocktail-1) puntaCocktail=0;  //se è maggiore del numero dei cocktail, torna al primo
    cambiococktail(); 
    delay(250); //antirimbalzo, si attende che l'input si stabilizzi
  }
  valDXOld=valDX; //imposta lo stato precedente del pulsande destro al valore attuale

  if((valSX==HIGH)&&(valSXOld==LOW)){
    buzzer(); //il buzzer riproduce un suono al click del pulsante
    puntaCocktail--;  //decrementa il contatore dei cocktail
    if(puntaCocktail<0) puntaCocktail=nCocktail-1;  //se è minore di 0, torna all'ultimo
    cambiococktail();
    delay(250); //antirimbalzo, si attende che l'input si stabilizzi
  }
  valSXOld=valSX; //imposta lo stato precedente del pulsande sinistro al valore attuale

  if((valOK==HIGH)&&(valOKOld==LOW)){
    if(puntaCocktail==-1){
      digitalWrite(buzz,HIGH);  //imposta ad HIGH (passa corrente) il pin del buzzer
      delay(60); //aspetta
      digitalWrite(buzz,LOW); //imposta a LOW (non passa corrente) il pin del buzzer
      delay(40); //aspetta
      digitalWrite(buzz,HIGH);  //imposta ad HIGH (passa corrente) il pin del buzzer
      delay(60); //aspetta
      digitalWrite(buzz,LOW); //imposta a LOW (non passa corrente) il pin del buzzer
      delay(40); //aspetta
      digitalWrite(buzz,HIGH);  //imposta ad HIGH (passa corrente) il pin del buzzer
      delay(60); //aspetta
      digitalWrite(buzz,LOW); //imposta a LOW (non passa corrente) il pin del buzzer

      lcd.clear();  //pulisce lo schermo
      lcd.setCursor(0,0); //posiziona cursore in colonna 0 e riga 0
      lcd.print("Prima seleziona"); //stampa del testo su display
      lcd.setCursor(0,1); //posiziona cursore in colonna 0 e riga 1
      lcd.print("il cocktail"); //stampa del testo su display
      delay(4000);  //aspetta 4 secondi
      avvio();
    }
    else{
      //riproduce il suono per 350ms
      digitalWrite(buzz,HIGH);
      delay(350);
      digitalWrite(buzz,LOW);

      lcd.setCursor(0,0); //posiziona cursore in colonna 0 e riga 0
      lcd.print("Sto preparando: ");  //stampa del testo su display
      prepara(puntaCocktail);
      delay(250); //antirimbalzo, si attende che l'input si stabilizzi
    }
  }
  valOKOld=valOK;
  if(puntaCocktail!=-1) restart();
}
//#########################################################
void buzzer(){
  //riproduce il suono per 150ms
  digitalWrite(buzz,HIGH);  //imposta ad HIGH (passa corrente) il pin del buzzer
  delay(150); //aspetta
  digitalWrite(buzz,LOW); //imposta a LOW (non passa corrente) il pin del buzzer
}
void pulisciriga1(){
  //pulisce la riga 1
  lcd.setCursor(0,1); //posiziona cursore in colonna 0 e riga 1
  lcd.print("                ");  //stampa 16 spazi (riga vuota)
}
void cambiococktail(){
  RStime = millis();  //aggiorna il tempo passato dall'avvio del programma nella sua variabile
  pulisciriga1();
  lcd.setCursor(0,1); //posiziona cursore in colonna 0 e riga 1
  lcd.print(cocktail[puntaCocktail]); //stampa testo dell'array in posizione selezionata
}
void restart(){
  if( (millis() - RStime) > RSdelay ){  //se è passato più tempo del
    puntaCocktail=-1; //resetta la selezione del cocktail
    avvio();
  }
}
void avvio(){
  //testo iniziale
  lcd.setCursor(0,0); //posiziona cursore in colonna 0 e riga 0
  lcd.print("COCKTAIL MACHINE");  //stampa testo su display
  lcd.setCursor(0,1); //posiziona cursore in colonna 0 e riga 1
  lcd.print("Selezionane uno!"); //stampa testo su display
}
void prepara(int x){
  switch(x){
    case 0:
      digitalWrite(pump1,HIGH); //attiva la prima pompa (RUM)
      digitalWrite(pump3,HIGH); //attiva la terza pompa (VODKA)
      delay(2000);  //eroga per 2 secondi (1sec=1ml)
      digitalWrite(pump1,LOW);  //disattiva la prima pompa  //2ml
      delay(1000);  //eroga per 1 secondo (1sec=1ml)
      digitalWrite(pump3,LOW);  //disattiva la terza pompa (VODKA)  //3ml
    break;
  }
  puntaCocktail=-1;
  delay(3000);
  lcd.clear();
  lcd.setCursor(0,0); //posiziona cursore in colonna 0 e riga 0
  lcd.print("COCKTAIL PRONTO!");  //stampa testo su display
  lcd.setCursor(0,1); //posiziona cursore in colonna 0 e riga 1
  lcd.print("    Goditelo!"); //stampa testo su display
  delay(7000);
  avvio();
}

Mi sto inoltre informando su come alimentarlo e su come creare la struttura.

Seguiranno aggiornamenti, nel frattempo fatemi sapere cosa ne pensate e se c'è qualcosa di sbagliato o che posso migliorare.
 
A prima vista il consiglio che ti posso dare è di non scrivere il codice tutto nel main ma di strutturartelo ad esempio una classe che controlla il display, una le pompe ecc...
 
Buongiorno,
Parto con una serie di note, il progetto di per sé non è semplicissimo ma è realizzabile, tuttavia per un qualcosa di così grande dovete avere chiaro fin da subito la disposizione meccanica delle cose. Dove mettere le bottiglie? Come cambiare una bottiglia una volta finita? E anche delle domande intermedie come ad esempio, come faccio a sapere che una bottiglia è finita? Ma anche cose semplici tipo, su che pin di Arduino ho la pompa X? Mi basta un Arduino uno o serve un Mega?

Da quanto ho capito siete dei ragazzi giovani e leggendo il codice, palesemente generato da chatGPT o AI analoghe capisco che non avete tutta questa confidenza con la materia. I commenti che vi hanno fatto sopra sono molto corretti, gestire le pompe o il display con una classe dedicata è giusto. E probabilmente se scriveste tali richieste su chatGPT otterrete anche un codice passabile. Ma se non siete in grado di capire cosa fa il codice è inutile che iniziate proprio, studiate un po' di elettronica e informatica di base poi pensate di approcciarvi ad un progetto simile. Ci sono molti altri progetti carini per novizi

Comunque se volete informarvi vi lascio il link di qualcuno che ha già fatto questo progetto e ha fatto la spiegazione passo passo.

Cliccando qui trovate il video
 
  • Mi piace
Reazioni: Max Fridman