IF e Serial.print non collaborano

Buon giorno a tutti ho collegato un led verde al pin digitale 9 ed un led giallo al pin 8, ciascuno con un resistore di 270 ohm, in serie (con le rispettive gambette corte sulla GND). Non altro. Lo sketch parte accendendo il led giallo e sta bene. Se vado a scrivere la lettera "a"nel campo del monitor seriale, premendo poi il pulsante "invia", mi aspetterei di vedere accendersi il led verde. Invece, pur leggendo sul monitor, la "a", continua a rimanere acceso il led giallo. Non riesco a capire! Mi date una spinta? Grazie!

char valoreseriale="";
int pinVerde=9;
int pinGiallo=8;

void setup() {
  Serial.begin(9600);
  pinMode(pinVerde,OUTPUT);
  pinMode(pinGiallo,OUTPUT);
}
void loop() 
{
valoreseriale=Serial.read();
Serial.println(valoreseriale);
delay(1000);
if(valoreseriale =="a")
{
digitalWrite(9, HIGH);
Serial.println("verde acceso");
delay(2000);
}
else
{
  digitalWrite(8, HIGH);
  Serial.println("giallo acceso");
delay(2000);
Serial.flush();
}
}
/code]

prova con gli apici singoli == 'a'

Ciao saggittario,

non sapendo esattamente cosa vuoi io farei così:

char valoreseriale;
int pinVerde = 9;
int pinGiallo = 8;

void setup() {
  Serial.begin(9600);
  pinMode(pinVerde, OUTPUT);
  pinMode(pinGiallo, OUTPUT);
}

void loop() {

  while (Serial.available()) {
    char messaggio = Serial.read();
    if (messaggio != '\n') {
      valoreseriale = messaggio;
    }

    if (valoreseriale == 'a')
    {
      digitalWrite(9, HIGH);
      Serial.println("verde acceso");
      delay(2000);
    }
    else
    {
      digitalWrite(8, HIGH);
      Serial.println("giallo acceso");
      delay(2000);
    }
  }
}

nel monitor seriale, in basso a destra, seleziona "nessun fine riga"....

In C e C++ le costanti carattere si scrivono con apici singoli esempio: 'A' se usi apici doppi stai dichiarando stringhe (frasi) e il C lo accetta ma è errato (dovrebbe segnalare warning se attivi il verbose della compilazione nelle opzioni).

Infatti funziona. Andando a leggere nel REFERENCE, leggo

nid69ita: il C lo accetta ma è errato (dovrebbe segnalare warning se attivi il verbose della compilazione nelle opzioni).

ORSO2001:

Dove spegni i LED?

Ciao Uwe

Ciao saggittario...mi quoti in/per cosa?

per essere chiari lo sketch che ho postato è un po' diverso dal tuo...

@Uwe: infatti nel mio post avevo scritto "non sapendo cosa vuoi fare..."

il mio messaggio precedente è partito accidentalmente, incompleto. Vogliate ritenerlo nullo.

Dunque sì, con gli apici semplici funziona. Intanto, per imparare, faccio alcune prove:

if(valoreseriale == 'abc')

mi stampa le tre lettere una per volta, ma la luce verde non si accende, neanche alla prima lettera (la "a"). Evidentemente, avendo dichiarato la variabile "char", il valore seriale può leggere soltanto un carattere (per volta). Ma al ripetersi del ciclo, perché non legge nuovamente la 'a'? Perché legge la 'b' e poi la 'c' ? Non capisco il meccanismo. Inoltre mi chiedo se si possa fare in modo che legga più lettere insieme? Potrei cioè scrivere, ad esempio.

if(valore seriale == 'ciao') ?

nid69ita: In C e C++ le costanti carattere si scrivono con apici singoli esempio: 'A' se usi apici doppi stai dichiarando stringhe (frasi) e il C lo accetta ma è errato (dovrebbe segnalare warning se attivi il verbose della compilazione nelle opzioni).

che significa "il verbose nella compilazione...." ?

ORSO2001: void loop() {

while (Serial.available()) { char messaggio = Serial.read(); if (messaggio != '\n') { valoreseriale = messaggio;

che significa quel '\n' ?

Grazie!

No, non hai capito. Ora usi sempre gli apici singoli. Le costanti DEVONO essere apici singoli per i SINGOLI caatteri. esempio 'A' Se metti da due lettere in poi DEVI usare doppi apici. Esempio "ABC" '\n' è il carattere speciale di newline, \r il ritorno carrello

Serial.read() legge un carattere (lettera alla volta) Quindi puoi solo controllare 1 carattere. Se però memorizzi i caratteri in una stringa (vettore di caratteri) poi allora potrai verificare una frase. In questo caso però bisogna sapere quando finisce la frase. Di solito si invia '\n' e/o '\r' a fine frase (settaggio nel monitor seriale) Puoi semplificare usando Serial.readStringUntil()

http://www.leonardomiliani.com/2013/arduino-invio-seriale-di-dati-da-e-per-il-computer/

... o per specificare ancora meglio, i singoli apici identificano un singolo byte che può essere espersso in una infinità di modi ... la lettera A, codificata in ASCII, può essere indicata come : 'A' con l'uso dei singoli apici, oppure 0x41 se in esadecimale, oppure 65 se in decimale, ecc, ma, in ogni caso, nel byte dove si mette una di quelle forme, sempre 01000001 ci va a finire.

I doppi apici identificano invece quella che in C è una stringa di caratteri (un array di bytes), ovvero un insieme di char terminati dal carattere speciale 0x00. Quindi, se si mette qualche cosa tra doppi apici, si occupa sempre un byte in più di quanti se ne mettono racchiusi tra i doppi apici ... esempio: "AB" in memoria, rappresentando in esadecimale, occuperà tre bytes 0x41 0x42 0x00, così come un singolo carattere "A" ne occuperà comunque due 0x41 0x00.

Non solo, nel caso di singoli apici, abbiamo un'assegnazione per valore, nel caso di doppi, essendo in realtà un insieme di bytes (ovvero un array), abbiamo un'assegnazione per puntatore ... ma mi sa che qui già entriamo in un campo un po' più complicato per chi è agli inizi.

Guglielmo

0x00 carattere speciale, scritto anche '\0'

nid69ita: 0x00 carattere speciale, scritto anche '\0'

... quello utilizzando le "escape sequences" :D

Guglielmo

ringrazio tutti ma mi chiedo dove dovrei imparare queste strane istruzioni: \n, \r, \0 (detto anche 0x00)... Ho cercato nelle Reference, ma non le trovo neanche in further sintax, Dunque le Reference non sono sufficienti per imparare il linguaggio di Arduino? Oppure ancora non ho ben capito? Francesco

sagittario0342: ma mi chiedo dove dovrei imparare queste strane istruzioni: \n, \r, \0 (detto anche 0x00)...

NON sono istruzioni, ma simboli per rappresentare alcune sequenze di caratteri standard nel C e di cui ti ho messo un link (... che evidentemente non hai letto) al post #11 ... si chiamano "escape sequences".

sagittario0342: Dunque le Reference non sono sufficienti per imparare il linguaggio di Arduino?

Non del tutto, quello è solo, come dice il nome, un "reference", un buon libro sul linguaggio 'C', per cominciare e sul 'C++' in seconda battuta, sono molto più adatti.

Guglielmo

ancora grazie Guglielmo ho tanto da imparare ! Francesco