Problema con seriale

Ciao a tutti ragazzi, sto cercando di fare un progetto per la maturità in cui automatizzo una macchinetta del caffè.. Mi sto occupando del lato software per ora e per simulare i tasti della macchinetta (3 tasti che lavorano a 220 opportunamente saldati e collegati a relè) sto usando tre led e un interuttore (in sostanza si preme il primo bottone della macchinetta ovvero l'accensione si e si accendono sia il primo che il secondo che però non è stato premuto siccome sta ad indicare se la macchinettà è calda o meno per fare il caffè; Una volta spento se si preme il secondo bottone la macchinettà farà scendere il caffè. ); l'ìnterruttore l'ho messo per simulare l'accensione della lampadina del secondo bottone.

Di seguito lo sketch

/*
  ########################################################################################################################################################################################
   COFFEDUINO VERS. 1.0 TEST CON LED PER CAFFE' E ACCENSIONE E SERIALE PER COMANDI DA REMOTO

  BACKUP 02/06/2016 h. 12:00
  ########################################################################################################################################################################################
*/

/* ##ASSOCIAZIONE PIN A NOMI## */

#define ONbutton 11
#define COFFEEbutton 12
#define VAPbutton 13
#define LEDCOFFEEbutton 8


/* ## DICHIARAZIONE VARIABILI## */


int RitardoAccensione = 0;
int CaffeCorto = 0;
int CaffeMedio = 0;
int CaffeLungo = 0;



void setup() {
  pinMode(ONbutton, OUTPUT); // Come output perchè da seriale devo inviare ad arduino e quindi al pin
   pinMode(ONbutton, INPUT); //Come input perchè devo leggere il valore del bottone
   
  pinMode(COFFEEbutton, OUTPUT);    // NON DOVREBBE ESSERE NECESSARIO DICHIARARLI COME IN O OUT
  pinMode(VAPbutton, OUTPUT);
  pinMode(LEDCOFFEEbutton, INPUT);
  Serial.begin(9600);

}

void loop() {

  /*
    digitalWrite(ONbutton, HIGH); //invio il segnale di accensione alla macchinetta
    int MacchinettaAccesa = digitalRead (ONbutton); // leggo stato bottone ONbutton e lo assegno alla variabile MacchinettaAccesa che mi serve solo in questo contesto
    if (MacchinettaAccesa == 1) {       //Se la macchinetta è accesa
      Serial.print("La macchinetta é accesa");  //stampa su seriale "la macchinetta è accesa"
      Serial.println(" ");
    }
    int StatoLEDb2 = digitalRead(LEDCOFFEEbutton);  //Leggi lo stato del led del bottone del caffè e assegnalo a StatoLED2
    if (StatoLEDb2 == 1) {
      digitalWrite(COFFEEbutton, LOW);

    }
    else if (StatoLED2 == 0) { */


    
    
  while (Serial.available() > 0) {  // prima c'era l'if, while è per prova

/*Serial.print("Selezionare #A# per accendere la macchinetta, #S# per spegnere la macchinetta");
Serial.println("   "); */
    byte daSerialeaArduinoAcc = Serial.read();
    switch (daSerialeaArduinoAcc) {
      case 65:                                          //la codifica ASCII del carattere A è 65
        digitalWrite(ONbutton, HIGH);                   // Accendo la macchinetta se schiaccio tasto A
        break;
      case 83:                                         //la codifica ASCII del carattere S è 83
        digitalWrite(ONbutton, LOW);                   // Spengo la macchinetta se schiaccio tasto S
        break;

        byte MacchinettaAccesa = digitalRead (ONbutton);  // leggo stato bottone ONbutton e lo assegno alla variabile MacchinettaAccesa che mi serve solo in questo contesto
        if (MacchinettaAccesa == 1) {                    //Se la macchinetta è accesa
          Serial.print("La macchinetta é accesa");       //stampa su seriale "la macchinetta è accesa"
          Serial.println(" ");
        }
        else { //sennò
          Serial.print ("La macchinetta è spenta");  //stampa su seriale "la macchinetta è accesa"
        }
    }

    int StatoLEDb2 = digitalRead(LEDCOFFEEbutton);  //Leggi lo stato del led del bottone del caffè e assegnalo a StatoLED2
    if (StatoLEDb2 == 1) {
      digitalWrite(COFFEEbutton, LOW);

    }
    else if (StatoLEDb2 == 0) {


      int daSerialeaArduino = Serial.read();

      switch (daSerialeaArduino) {
        case 67:                                  //la codifica ASCII del carattere C è 67
          digitalWrite(COFFEEbutton, HIGH);       //manda a lv alto il bottone 2
          delay(5000);                            //tempo ipotetico per un caffè corto
          Serial.println("Il caffè è pronto");
          digitalWrite(COFFEEbutton, LOW);
          break;

        case 77:                                  //la codifica ASCII del carattere M è 77
          digitalWrite(COFFEEbutton, HIGH);       //manda a lv alto il bottone 2
          delay(10000);                           //tempo ipotetico per un caffè medio
          Serial.println("Il caffè è pronto");
          digitalWrite(COFFEEbutton, LOW);
          break;


        case 76:                                  //la codifica ASCII del carattere L è 76
          digitalWrite(COFFEEbutton, HIGH);       //manda a lv alto il bottone 2
          delay(15000);                           //tempo ipotetico per un caffè Lungo
          Serial.println("Il caffè è pronto");
          digitalWrite(COFFEEbutton, LOW);
          break;
      }
    }
  }


}

Inoltre siccome l'idea è di farlo con arduino uno ed ethernet shield con sd di modo da comandarlo da browser, qualcuno avrebbe del materiale consultabile sull'argomento? purtroppo ho trovato poco niente. Grazie in anticipo!

**@andand997: **ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More → Modify) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Guglielmo

Nessuno che possa darmi una mano? :O

  pinMode(ONbutton, OUTPUT); // Come output perchè da seriale devo inviare ad arduino e quindi al pin
   pinMode(ONbutton, INPUT); //Come input perchè devo leggere il valore del bottone
int StatoLEDb2 = digitalRead(LEDCOFFEEbutton);  //Leggi lo stato del led del bottone del caffè e assegnalo a StatoLED2
    if (StatoLEDb2 == 1) {
      digitalWrite(COFFEEbutton, LOW);

Un pin non puó essere sia entrata che uscita.

Se hai un pulsante con un indicatore luminoso che devi leggere allora devi usare 2 pin distinti.

switch (daSerialeaArduinoAcc) {
      case 65:                                          //la codifica ASCII del carattere A è 65
        digitalWrite(ONbutton, HIGH);                   // Accendo la macchinetta se schiaccio tasto A
        break;
      case 83:                                         //la codifica ASCII del carattere S è 83
        digitalWrite(ONbutton, LOW);                   // Spengo la macchinetta se schiaccio tasto S
        break;

        byte MacchinettaAccesa = digitalRead (ONbutton);  // leggo stato bottone ONbutton e lo assegno alla variabile MacchinettaAccesa che mi serve solo in questo contesto
        if (MacchinettaAccesa == 1) {                    //Se la macchinetta è accesa
          Serial.print("La macchinetta é accesa");       //stampa su seriale "la macchinetta è accesa"
          Serial.println(" ");
        }
        else { //sennò
          Serial.print ("La macchinetta è spenta");  //stampa su seriale "la macchinetta è accesa"
        }
    }

Tutta la parte da byte MacchinettaAccesa in poi non viene MAI eseguito. Perché l'hai messa nello switch?

 else if (StatoLEDb2 == 0) {


      int daSerialeaArduino = Serial.read();

Perché fai una lettura della seriale senza controllare se c'é qualcosa da leggere?

Ciao Uwe

GRazie Uwe per la risposta. Ora ho un’altro problema, ovvero che innanzi tutto il serial.println("…scegli il bottone per l’accensione o spegnimento…") viene stampato di continuo e non so come farlo isualizzare una sola volta, all’inizio a schermo. L’altro invece è il “WHILE” perchè non rispetta la condizione e nel momento in cui schiaccio “C”, “M” o “L” non accade nulla.
Vi sarei molto grato se mi deste una mano :slight_smile:

/*
  ########################################################################################################################################################################################
   COFFEDUINO VERS. 1.0 TEST CON LED PER CAFFE' E ACCENSIONE E SERIALE PER COMANDI DA REMOTO

  BACKUP 04/06/2016 h. 17:22
  ########################################################################################################################################################################################
*/

/* ##ASSOCIAZIONE PIN A NOMI## */

#define ONbutton 11
#define COFFEEbutton 12
#define VAPbutton 13
#define LEDCOFFEEbutton 8


/* ## DICHIARAZIONE VARIABILI## */

int daSerialeaArduinoAcc = 0; //variabile alla quale viene assegnato il valore letto da seriale per l'accensione della macchinetta



void setup() {
  // SETTO I PIN

  pinMode(ONbutton, OUTPUT); // Come output perchè da seriale devo inviare ad arduino e quindi al pin
  pinMode(COFFEEbutton, OUTPUT);    // NON DOVREBBE ESSERE NECESSARIO DICHIARARLI COME IN O OUT
  pinMode(VAPbutton, OUTPUT);
  pinMode(LEDCOFFEEbutton, INPUT);


  //AVVIO LA COMUNICAZIONE SERIALE A 9600 Baud/s
  Serial.begin(9600);

}

void loop() {



  /*
    for (int i=0; i<1; i++){
    Serial.print("Selezionare #A# per accendere la macchinetta, #S# per spegnere la macchinetta");
    Serial.println("   ");
    }
  */

  if (Serial.available() > 0) {  //Se sulla porta seriale ci sono dei byte

    daSerialeaArduinoAcc = Serial.read();
    Serial.println(daSerialeaArduinoAcc);      //Stampa ciò che è stato premuto

    switch (daSerialeaArduinoAcc) {
      case 65:                                          //la codifica ASCII del carattere A è 65
        digitalWrite(ONbutton, HIGH);                   // Accendo la macchinetta se schiaccio tasto A
        Serial.print("La macchinetta è stata accesa");
        Serial.println("");
        break;
      case 83 :                                         //la codifica ASCII del carattere S è 83
        digitalWrite(ONbutton, LOW);                   // Spengo la macchinetta se schiaccio tasto S
        Serial.print("La macchinetta è stata spenta");
        Serial.println("");

        break;
    }


  }


  int StatoLEDb2 = digitalRead(LEDCOFFEEbutton);  //Leggi lo stato del led del bottone del caffè e assegnalo a StatoLED2
  
  if (Serial.available() > 0) {  //Se sulla porta seriale ci sono dei byte


    /* int StatoLEDb2 = digitalRead(LEDCOFFEEbutton);  //Leggi lo stato del led del bottone del caffè e assegnalo a StatoLED2*/

    while (StatoLEDb2 = 0) {

      Serial.println("E' possibile fare il caffè");

      int daSerialeaArduino = Serial.read();
      Serial.println(daSerialeaArduino);      //Stampa ciò che è stato premuto

      switch (daSerialeaArduino) {

        case 67:                                  //la codifica ASCII del carattere C è 67
          digitalWrite(COFFEEbutton, HIGH);       //manda a lv alto il bottone 2
          Serial.println("sta per essere fatto un caffè corto");
          delay(1000);                            //tempo ipotetico per un caffè corto
          Serial.println("Il caffè è pronto");
          digitalWrite(COFFEEbutton, LOW);
          break;

        case 77:                                  //la codifica ASCII del carattere M è 77
          digitalWrite(COFFEEbutton, HIGH);       //manda a lv alto il bottone 2
          Serial.println("sta per essere fatto un caffè medio");
          delay(1500);                           //tempo ipotetico per un caffè medio
          Serial.println("Il caffè è pronto");
          digitalWrite(COFFEEbutton, LOW);
          break;


        case 76:                                  //la codifica ASCII del carattere L è 76
          digitalWrite(COFFEEbutton, HIGH);       //manda a lv alto il bottone 2
          Serial.println("sta per essere fatto un caffè lungo");
          delay(2000);                           //tempo ipotetico per un caffè Lungo
          Serial.println("Il caffè è pronto");
          digitalWrite(COFFEEbutton, LOW);
          break;
      }

    }
    /*
      for (int i=0; i<1; i++){
        Serial.print("la macchinetta si sta ancora scaldando");
        Serial.println("   ");
      } */



  }
}

while (StatoLEDb2 = 0) { deve esserci un "==" non un "="

poi non puoi usare nel while una variabile che non si modifica nel While. Questo é un ciclo infinito.

Ciao Uwe