Pages: [1]   Go Down
Author Topic: If o non if , it is the problem...  (Read 680 times)
0 Members and 1 Guest are viewing this topic.
Cagliari
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

All'interno di un progettino per pilotare delle resistenze elettriche per il riscaldamento mi si pone il seguente problema:
voglio che quando sulla seriale arriva un valore >5 il led (il pin digitale) sia alimentato, quando inferiore invece sia spento.
Però con questo codice funziona solo il primo if... dove sbaglio?
(la questione è talmente banale che non sto neppure a dire che sono pre-beginner...)
Più avanti le cose si complicheranno perché devo gestire 4 stati per diverse resistenze, ma credo che utilizzerò l'istruzione Switch.
Grazie per chi avrà la pazienza di aiutarmi

Ciao, Salvatore

 
#define led 13  // led connesso al pin n°13
int rx = 0;    // variabile per contenere il carattere ricevuto
 
void setup()
   {
   Serial.begin(9600); // imposto la UART per lavorare a 9600
   pinMode(led, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
   Serial.flush(); // svuoto il buffer di ricezione seriale
   }
 
void loop()
     {
           if (Serial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
         {
         rx = Serial.read(); // leggo il carattere ricevuto e lo memorizzo in rx
         Serial.flush(); // svuoto il buffer di ricezione seriale
              if (rx>5) // ho ricevuto un valore maggiore di 5
          {
                    digitalWrite(led,HIGH); // accendo il led
          }
               
        if (rx<4) // il valore è inferiore a 4
          {            
          digitalWrite(led,LOW); // spengo il led
          Serial.println("Led spento");
                    }
         }
          }
Logged

Offline Offline
Sr. Member
****
Karma: 7
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

imho il secondo if funziona ma funziona solo per il 0,1,2,3... non per il 4 perchè il test è < e non <=
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

All'interno di un progettino per pilotare delle resistenze elettriche per il riscaldamento mi si pone il seguente problema:
voglio che quando sulla seriale arriva un valore >5 il led (il pin digitale) sia alimentato, quando inferiore invece sia spento.
Però con questo codice funziona solo il primo if... dove sbaglio?
(la questione è talmente banale che non sto neppure a dire che sono pre-beginner...)
Più avanti le cose si complicheranno perché devo gestire 4 stati per diverse resistenze, ma credo che utilizzerò l'istruzione Switch.
Grazie per chi avrà la pazienza di aiutarmi

Ciao, Salvatore

 
#define led 13  // led connesso al pin n°13
int rx = 0;    // variabile per contenere il carattere ricevuto
 
void setup()
   {
   Serial.begin(9600); // imposto la UART per lavorare a 9600
   pinMode(led, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
   Serial.flush(); // svuoto il buffer di ricezione seriale
   }
 
void loop()
     {
           if (Serial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
         {
         rx = Serial.read(); // leggo il carattere ricevuto e lo memorizzo in rx
         Serial.flush(); // svuoto il buffer di ricezione seriale
              if (rx>5) // ho ricevuto un valore maggiore di 5
          {
                    digitalWrite(led,HIGH); // accendo il led
          }
               
        if (rx<4) // il valore è inferiore a 4
          {            
          digitalWrite(led,LOW); // spengo il led
          Serial.println("Led spento");
                    }
         }
          }

mah a parte che non si capisce come e  dove   vuoi aiuto  lo sketc è incomprensibile      Serial.flush();  non funziona più

s
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Cagliari
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusate, forse sono stato sintetico o poco chiaro.
Il codice di cui sopra non mi presenta errori formali al debug di verifica del compilatore Arduino.
Ma quando lo carico se digito un valore >5 sul monitor della seriale del programma Arduino il led si accende (corretto), ma se dopo digito un valore <5, per es. 2, il led non si spegne.
Perché?
La sintassi degli if sembra corretta...

Da cosa è stato sostituito Serial.flush ?

Spero di essere stato più chiaro  smiley-confuse
Logged

Cagliari
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Risolto, grazie.

Ora passo allo studio di Case...
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2747
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
mah a parte che non si capisce come e  dove   vuoi aiuto  lo sketc è incomprensibile      Serial.flush();  non funziona più
i tuoi interventi sono utili come un dito in un occhio
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20221
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
mah a parte che non si capisce come e  dove   vuoi aiuto  lo sketc è incomprensibile      Serial.flush();  non funziona più
i tuoi interventi sono utili come un dito in un occhio
State calmi tutti due.
Ciao Uwe
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@gingardu:
non è che flush() non funziona più, serve ad un'altra cosa rispetto a prima.
Bisogna leggere la documentazione del Reference:
Quote
flush()

Description
Waits for the transmission of outgoing serial data to complete. (Prior to Arduino 1.0, this instead removed any buffered incoming serial data.)

Quindi "attende il completamento della trasmissione dei dati da spedire. (fino all'Arduino 1.0 rimuoveva invece qualsiasi dato in arrivo presente nel buffer).

L'equivalente del flush può essere questa mini-funzione:

Code:
void serialFlush() {
  byte tempByte;
  while (Serial.available()) {
    tempByte = Serial.read();
  }
}
Chiamandola, svuota il buffer di ricezione un byte alla volta.
Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20221
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Chiamandola, svuota il buffer di ricezione un byte alla volta.
Faccio una precisazione:
Svuota il buffer del tutto leggendo un byte alla volta.
Ciao Uwe
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

L'ho scritto  smiley-razz
"Svuotare" significa "vuotare completamente"
Logged


Cagliari
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sono molto newbbie in questo forum (o meglio, proprio su tutta la materia...) ma qui si spacca il byte in otto!
E d'altronde se così non fosse sarebbe (infatti "è") facile sbagliare per una virgola mal posta...

Ed ecco il codice funzionante "quasi" bene...

Dico quasi perché c'è qualcosa forse nella dichiarazione iniziale "int", o non so cosa, che fa passare solo i valori ad una cifra (da 0 a 9), per cui il valore 982 viene passato come 9, poi come 8 e quindi come 2. Ovviamente in questo caso il led rimane spento perché l'ultimo valore è <2…
mah…

Ciao, sm


Code:
/* accendere o spegnere un led in funzione del valore ricevuto sulla seriale */

#define led 13  // led connesso al pin n°13
int rx = 0;    // variabile per contenere il carattere ricevuto

void setup()
{
Serial.begin(9600); // imposto la UART per lavorare a 9600
pinMode(led, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
Serial.flush(); // svuoto il buffer di ricezione seriale
}

void loop()
{

if (Serial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
{
rx = Serial.read(); // leggo il carattere ricevuto e lo memorizzo in rx
Serial.flush(); // svuoto il buffer di ricezione seriale

if (rx>'5') // se ho ricevuto un valore maggiore di 5

{
digitalWrite(led,HIGH); // accendo il led
Serial.println("Led Acceso"); e stampo a video lo stato del led
}

else // se invece

if (rx<'4') // ho ricevuto un valore inferiore a 5

{
digitalWrite(led,LOW); // spengo il led
Serial.println("Led spento"); e stampo a video lo stato del led
}

}
}
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il byte va spaccato in 8 bit perché l'informatica non è una religione ma una scienza esatta  smiley-wink
Ad esempio, ricordati che la seriale spedisce 1 byte alla volta. Quindi se spedisci una stringa, essa verrà scomposta nei singoli caratteri. Se spedisci "982" verranno spediti i 3 caratteri "9", "8" e "2".
Tu poi non fai un confronto su valori numeri ma su caratteri, '2' indica il carattere ASCII 50, non il valore 2, quindi mi viene da pensare che tu spedisca stringhe. Se spedisci il carattere ',' il controllo sarà valido lo stesso perché nella tabella ASCII ',' è minore di '4'
Logged


Offline Offline
Sr. Member
****
Karma: 7
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il byte va spaccato in 8 bit perché l'informatica non è una religione ma una scienza esatta  smiley-wink
Ad esempio, ricordati che la seriale spedisce 1 byte alla volta. Quindi se spedisci una stringa, essa verrà scomposta nei singoli caratteri. Se spedisci "982" verranno spediti i 3 caratteri "9", "8" e "2".
Tu poi non fai un confronto su valori numeri ma su caratteri, '2' indica il carattere ASCII 50, non il valore 2, quindi mi viene da pensare che tu spedisca stringhe. Se spedisci il carattere ',' il controllo sarà valido lo stesso perché nella tabella ASCII ',' è minore di '4'


aggiungo... immagino che  salvato voleva premere 982 e che venisse passato all'arduino il numero 982... ma ciò non avviene perchè come ha detto Leo il tuo pc invia in realtà il carattere "9" e poi il carattere "8" e poi il carattere "2". Per fare che trasmetta il byte con valore 9 dovresti (forse... non so manco se funziona) premere sul computer alt+9. In ogni caso penso che lo scopo non sia quello di inviare per forza un numero ma che possa andare bene una stringa che poi verrà convertita. Per fare ciò l'arduino deve leggere il serial fintanto che non arriva l'invio che è fatto da 2 byte "0D 0A"(... a volte  smiley-grin  smiley-mr-green ) e convertire man mano che arrivano i byte il carattere in numero moltiplicando per 10 il risultato precedente oppure (più facile) buttare tutto in una stringa e poi convertire la stringa quando ti arriva il carriage return.
... una cosa di questo genere qua che ho scopiazzato dal forum non so manco dove... cambiando magari il "\r" con un \n

Code:
void appendSerialData (char *strArray)
{
   while (Serial.available())
   {
      char readChar = Serial.read();
      if (readChar == '\r')
      {
         EOS = true;
         break;
      }
      else
      {
         strArray[strIndex] = readChar;
         strIndex++;
         strArray[strIndex] = '\0]; // Keep the array NULL-terminated
      }
   }
}


alla fine del codice quando eos è vero hai in strArray la stringa "982"... pronta per la conversione ad intero.


Logged

Pages: [1]   Go Up
Jump to: