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");
}
}
}
salvato:
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ù
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...
@gingardu:
non è che flush() non funziona più, serve ad un'altra cosa rispetto a prima.
Bisogna leggere la documentazione del Reference:
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:
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
/* 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
}
}
}
Il byte va spaccato in 8 bit perché l'informatica non è una religione ma una scienza esatta
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'
leo72:
Il byte va spaccato in 8 bit perché l'informatica non è una religione ma una scienza esatta
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 ) 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
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.