Progetto distributore bevande

Salve ragazzi, è da poco che sono entrato in questo mondo e volevo chiedere il vostro aiuto per realizzare il progetto di un distributore automatico. Volevo creare un distributore che una volta inserita una moneta dava la possibilità ,di sceglere quale bevanda erogare , attraverso dei pulsanti e ripartire da capo. Fino ad ora sono riuscito a programmare il display e i pulsanti con i relativi tempi di erogazione, tutto questo però deve avvenire dopo l'imput della gettoniera, cosa che non riesco a programmare. Qualcuno di voi saprebbe dirmi come fare? Grazie in anticipo per l'aiuto!

questo è quello che sono riuscito a fare fino ad ora :

#include <Bridge.h>
#include <Console.h>
#include <FileIO.h>
#include <HttpClient.h>
#include <Mailbox.h>
#include <Process.h>
#include <YunClient.h>
#include <YunServer.h>
#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(52, 51, 25, 24, 23, 22);

#define led_1 44
#define led_2 45
#define btn_pin1 4
#define btn_pin2 5


void setup()

{
  digitalWrite(led_1, LOW);
  digitalWrite(led_2, LOW);
  pinMode (led_1, OUTPUT);
  pinMode(btn_pin1, INPUT);
  pinMode (led_2, OUTPUT);
  pinMode(btn_pin2, INPUT);

  lcd.begin(20, 4);
  lcd.setCursor(0, 1);
  lcd.write(" Machine  V 1.0");
  delay(5000);

  lcd.clear();
  lcd.setCursor(2, 1);
  lcd.write("MACCHINA PRONTA");
  delay(4000);
  lcd.clear();
  lcd.setCursor(6, 0);
  lcd.write("Prova");
  lcd.setCursor(1, 2);
  lcd.write("INSERIRE LA MONETA");
}



void loop() {

  if ( digitalRead(btn_pin1) == HIGH ) {
    digitalWrite( led_1, HIGH );
    delay(2000);
  } else {
    digitalWrite( led_1, LOW );
  }
  if ( digitalRead(btn_pin2) == HIGH ) {
    digitalWrite( led_2, HIGH );
    delay(2000);
  } else {
    digitalWrite( led_2, LOW );
  }
}

Domanda, perché uno Yun?

Ripeto che sono inesperto ho solo caricato una libreria

posso anche eliminare lo yun?

Allora devi tenere conto che la progettazione funziona al rovescio rispetto al tuo approccio, le librerie si includono solo in caso di necessità, sopratutto su Arduino dove lo spazio è molto limitato.
Dovresti prima di tutto decidere l'HW, sia quello imposto dal progetto che quello scelto per preferenza piu o meno imposta da te. Poi si passa alla discussione sul codice.

RobertoBochet:
Allora devi tenere conto che la progettazione funziona al rovescio rispetto al tuo approccio, le librerie si includono solo in caso di necessità, sopratutto su Arduino dove lo spazio è molto limitato.
Dovresti prima di tutto decidere l'HW, sia quello imposto dal progetto che quello scelto per preferenza piu o meno imposta da te. Poi si passa alla discussione sul codice.

Io da qualche giorno mi sono cimentato in questo progetto, ti spiego quello che ho e quello che vorrei realizzare:

ho arduino mega collegato a dei relè ed un liquid crystal, una gettoniera ALEX F20 , e delle elettrovalvole collegate ai relè. Attualmente alla pressione del pulsante si apre l'elettrovalvola per 2 sec.

Quello che vorrei fare è abilitare i pulsanti solo dopo aver inserito la moneta, come un vero e proprio di stributore.
So che molte cose che ho scritto, per ora, sono sbagliate , ma piano piano sto cercando di imparare. Da quanto sto vedendo il giro dovrei inserire uno switch , giusto?

Mhh livello di conoscenza del C? (te lo chiedo, non è strettamente correlato a quanto tempo si sviluppa con Arduino)

@giacomo89:

Se ti può interessare, sui numero 197 e 198 di Elettronica-In (vedi QUI e QUI) c'è il progetto Drink-Maker così descritto: "prepara cocktail prelevando da appositi dispenser le quantità di bevande previste dalle ricette memorizzate nella pagina web dalla quale si richiede la preparazione".

Magari potresti dargli un'occhiata e trovare degli spunti o scoprire che può andare bene per te :wink:

Guglielmo

P.S.: A scanso di equivoci ... non lavoro per Elettronica In e non sono in alcun modo collegato con loro.

RobertoBochet:
Mhh livello di conoscenza del C? (te lo chiedo, non è strettamente correlato a quanto tempo si sviluppa con Arduino)

Il mio livello di C è molto basso.. Sono un Architetto, non ho mai fatto programmazione. :frowning:

Anche Ranellucci e un architetto ma ha fatto un lavoro per il quale è conosciuto in tutto il mondo

La connetti in cc Talk o in un altro sistema?

icio:
La connetti in cc Talk o in un altro sistema?

No, la mia gettoniera è alimentata a 12V ed ha un cavo per l' output che ho collegato ad Arduino, questo cavo manda degli impulsi che variano in base alla moneta ( 50 cent 1 pulse, 1 € 2 pulse, 2 € 4 pulse, della durata di 60ms). Dovrei creare un sistema di conteggio degli impulsi, impostando che ogni impulso è uguale a 1 , e la mia variabile di partenza è = 0, però non so come fare.

ho elaborato un altro sketch con delle variabili ma non capisco perchè non va ..

#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(52, 51, 25, 24, 23, 22);

#define Rel_1 2
#define Rel_2 3
#define Rel_3 4
#define Rel_4 5
#define P_1 10
#define P_2 11

int P_3 = 12;
int b = 0;
int c = 0;



void setup()
{

  digitalWrite(Rel_1, LOW);
  digitalWrite(Rel_2, LOW);
  digitalWrite(Rel_3, LOW);
  digitalWrite(Rel_4, LOW);
  digitalWrite(P_3, 1);
  pinMode (Rel_1, OUTPUT);
  pinMode (Rel_2, OUTPUT);
  pinMode (Rel_3, OUTPUT);
  pinMode (Rel_4, OUTPUT);
  pinMode(P_1, INPUT);
  pinMode(P_2, INPUT);
  pinMode(P_3, INPUT);

  lcd.begin(20, 4);
  lcd.setCursor(0, 1);
  lcd.write(" Machine  V 1.0");
  delay(5000);

  lcd.clear();
  lcd.setCursor(2, 1);
  lcd.write("MACCHINA PRONTA");
  delay(4000);
  lcd.clear();
  lcd.setCursor(6, 0);
  lcd.write("Prova");
  lcd.setCursor(1, 2);
  lcd.write("INSERIRE LA MONETA");

}




void loop() {

  c=digitalRead(P_3);
  if ( c== 1){b=b+1; delay(500);}
 lcd.setCursor(14, 1); 
  lcd.print(b);
}



  

if ( (b>= 2)&& ( digitalRead(P_1) == HIGH )) {
    digitalWrite( Rel_1, HIGH );
        lcd.clear();
    lcd.setCursor(1, 0);
    lcd.write("POMPA 1 ");
    delay(2000);
 

  } else {
    digitalWrite( Rel_1, LOW );
  }
if ( (b>= 2) &&  ( digitalRead(P_2) == HIGH )) {
    digitalWrite( Rel_2, HIGH );
        lcd.clear();
    lcd.setCursor(1, 0);
    lcd.write("POMPA 2 ");
    delay(2000);


  } else {
    digitalWrite( Rel_2, LOW );
  }
  }

giacomo89:
ma non capisco perchè non va ..

Troppo generico, spiegati.

Cioe', in pratica, la prima cosa che devi fare e' ancora riuscire a contare gli impulsi ?

La gettoniera manda sempre impulsi di 60ms, intervallati in modo regolare ? ...

Se si, secondo me o usi un'interrupt (ma con tempi cosi lunghi non lo vedo indispensabile, stare ad implementare un'interrupt), o usi un ciclo che conta in base allo stato di un pin, ma ignorando la permanenza dello stato (perche' altrimenti con 60mS lo sketch ti aggiungerebbe uno ad ogni loop per tutto il tempo in cui dura l'impulso) ... una cosa tipo questa, ad esempio, che fa in modo che la variabile monete venga incrementata una sola volta per ogni impulso, indifferentemente dalla sua durata ...

   st = digitalRead(pin-gettoniera)
   if ((st != stp) && (stp == 0))
   {
      monete++
      stp = st;	
   }
   if ((st != stp) && (stp == 1))
   {
      stp = st;
   }

... st e' lo stato dell'ingresso (byte), stp e' un flag di controllo ingresso (byte), monete e' il contatore dei soldi (int)

RobertoBochet:
Troppo generico, spiegati.

Arduino dice che c'è un errore sull' if ma non so come aggiustarlo

Etemenanki:
Cioe', in pratica, la prima cosa che devi fare e' ancora riuscire a contare gli impulsi ?

La gettoniera manda sempre impulsi di 60ms, intervallati in modo regolare ? ...

Se si, secondo me o usi un'interrupt (ma con tempi cosi lunghi non lo vedo indispensabile, stare ad implementare un'interrupt), o usi un ciclo che conta in base allo stato di un pin, ma ignorando la permanenza dello stato (perche' altrimenti con 60mS lo sketch ti aggiungerebbe uno ad ogni loop per tutto il tempo in cui dura l'impulso) ... una cosa tipo questa, ad esempio, che fa in modo che la variabile monete venga incrementata una sola volta per ogni impulso, indifferentemente dalla sua durata ...

   st = digitalRead(pin-gettoniera)

if ((st != stp) && (stp == 0))
  {
      monete++
      stp = st;
  }
  if ((st != stp) && (stp == 1))
  {
      stp = st;
  }




... st e' lo stato dell'ingresso (byte), stp e' un flag di controllo ingresso (byte), monete e' il contatore dei soldi (int)

ho provato ad inserirlo in questo modo ma mi da un errore sul rigo 83, cioè nel IF che mi fa accendere la pompa 2...

come mai???

#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(52, 51, 25, 24, 23, 22);

#define Rel_1 2
#define Rel_2 3
#define Rel_3 4
#define Rel_4 5
#define P_1 10
#define P_2 11


int monete = 0;
byte st = 0;
byte stp = 0;


void setup()
{

  digitalWrite(Rel_1, LOW);
  digitalWrite(Rel_2, LOW);
  digitalWrite(Rel_3, LOW);
  digitalWrite(Rel_4, LOW);

  pinMode (Rel_1, OUTPUT);
  pinMode (Rel_2, OUTPUT);
  pinMode (Rel_3, OUTPUT);
  pinMode (Rel_4, OUTPUT);
  pinMode(P_1, INPUT);
  pinMode(P_2, INPUT);
  pinMode(12, INPUT);

  lcd.begin(20, 4);
  lcd.setCursor(0, 1);
  lcd.write(" Machine  V 1.0");
  delay(5000);

  lcd.clear();
  lcd.setCursor(2, 1);
  lcd.write("MACCHINA PRONTA");
  delay(4000);
  lcd.clear();
  lcd.setCursor(6, 0);
  lcd.write("Prova");
  lcd.setCursor(1, 2);
  lcd.write("INSERIRE LA MONETA");

}




void loop() {

  st = digitalRead(12);
  if ((st != stp) && (stp == 0))
  {
    monete++;
    stp = st;
  }
  if ((st != stp) && (stp == 1))
  {
    stp = st;
  }
}





if ( (monete >= 2) && ( digitalRead(P_1) == HIGH )) {
  digitalWrite( Rel_1, HIGH );
  lcd.clear();
  lcd.setCursor(1, 0);
  lcd.write("POMPA 1 ");
  delay(2000);


} else {
  digitalWrite( Rel_1, LOW );
}
if ( (monete >= 2) &&  ( digitalRead(P_2) == HIGH )) {
  digitalWrite( Rel_2, HIGH );
  lcd.clear();
  lcd.setCursor(1, 0);
  lcd.write("POMPA 2 ");
  delay(2000);


} else {
  digitalWrite( Rel_2, LOW );
}
}

... secondo me, prima di tutto gli if delle pompe sono fuori dal loop ...

...
stp = st;
}
} <-- questa graffa chiude il void loop !! ... prova a toglierla, poi si vede il resto :wink:

Etemenanki:
... secondo me, prima di tutto gli if delle pompe sono fuori dal loop ...

...
stp = st;
}
} <-- questa graffa chiude il void loop !! ... prova a toglierla, poi si vede il resto :wink:

SEI UN MITOO!!! funzionaaa!! ora per far in modo che ogni pulsante "POMPA" diminuisca il valore di 2 basta che scrivo

monete = -2;

Giusto?

Se scrivi cosi, e' unassegnazione, cioe' assegni a monete il valore -2, quindi monete diventa di valore negativo "-2" ... o fai due volte di seguito

monete--

o scrivi

monete = monete - 2