led verde e rosso sulla seriale

ciao ragazzi,

oggi sono alle prese con due led per la precisione uno rosso e uno verde, ma evidentemento ho qualche problema

ecco qui il codice:

const unsigned int verde = 52;
const unsigned int rosso = 53;
char rx = 0;
void setup()
	{
	Serial.begin(9600); 
	pinMode(verde, OUTPUT);
        pinMode(rosso, OUTPUT);
	Serial.flush();
        
	}
 
void loop()
	{
 
	if (Serial.available() >0)
		{
                  rx = Serial.read();
                  Serial.flush();
                  
                  if (rx = ('ledverdeon'));{
                    digitalWrite(verde, HIGH);
                  }
                  
                  if (rx = ('ledrosson'));{
                    digitalWrite(rosso, HIGH);
                  }
                  
                  if (rx = ('ledverdeoff'));{
                    digitalWrite(verde, LOW);
                  }
                  
                   if (rx = ('ledrossoff'));{
                    digitalWrite(rosso, LOW);
                  }
                  
}
}

quando cllego i led il verde 52 rimane acceso anche se sulla seriale gli dico di spegnersi e il rosso non si accende

Parli di una mega?
hai la eth-shield + sd card? (impegna il 53)
perchè usi proprio quei 2 pin che sono 52(SCK) e 53(SS)?
ciao

a parte quello, c'è un errore di concetto.

Con

char rx = 0;
rx = Serial.read();

ricevi solo un carattere, che non puoi confrontare con una stringa (per esempio: 'ledverdeon').

guardati l'esempio PhysicalPixel

C'è pure un errore di sintassi:

if (rx = ('ledverdeon'));{

A parte il fatto che non è possibile fare una IF direttamente su una stringa nella sua interezza, va usato strcmp(), l'eguaglianza si esprime con " ==" e non con "=", nel secondo caso non si fa altro che assegnare il secondo valore al primo e la if risulta sempre vera.

giusto, aggiungiamo anche che ha messo i ";" dopo l'IF...

...diciamo che c'è poco di giusto, e ho pensato che fosse meglio consigliargli un esempio da cui partire e gettare completamente questo codice, senza fare da demoralizzatore :slight_smile:

direi che sei condannato a morte ahahahahahahahahahhahah

pablos71:
direi che sei condannato a morte ahahahahahahahahahhahah

Ognuno ha il diritto di chiedere aiuto e gli si aiuta nel possibile di tempo e conoscenze di ognuno. In questo caso il codice é pieno di errori e CarloMaragno siccuramente ha bisogno di capire e saper meglio il linguaggio C. Per aiutarlo abbiamo il diritto di segnare gli errori ma non abbiamo diritto ne di offendere ne di fare delle considerazioni spiritose negative.
pablos71 La Tua risposata é inopportuna e Ti chiedo di cancellarla.
Ciao Uwe

grazie a tutti sopratutto a Pablos71 per la sua tranciatissima risposta, ma dato che ero in svizzera e che per disgraziati motivi non sapevo se il messaggio era partino non ho controllato il topic;

ma scusate se il codice è tanto sbagliato come mai l'IDE melo compila...

spero in vostre altre risposte carlo

Il IDE Te lo compila perché interpreta il codice in un altro diverso di quello che Tu pesi di aver scritto. Sotto la spiegazione. Il fatto che non fa quello che pensi che dovrebbe fare non vuol dire che il codice é sbaglaito da dare dei messaggi di warning o errore. Alcune cose come caricare troppi elementi in un array, oppure mettere un numero troppo grande in una veriabile di tipo byte o int non genera errore. Vengono rispettivamente sovvrascritte le variabili che si trovano dopo l' array oppure ignorate le cifre di troppo.

char rx = 0; // variabile di 1 Bit con valori da 0 a 255, un carattere in codice ascii

rx = Serial.read(); // legge 1 carattere dalla seriale, nel Tuo caso la "l"
Serial.flush(); // toglie tutti gli altri caratteri spediti sulla serale
if (rx = ('ledverdeon')) // carica nella variabile rx la stringa "ledverdeon"; non so cosa finisce nella variabile ma per definizione un caricamento é vero percui la if é vera.
; // conclude la prima riga dopo il IF e percui é quella che viene eseguito. Visto che é niente scritto non fa niente.
{ // possono essere messi le prentesi per raguppare delle righe anche se non ha nessuna conseguenza
digitalWrite(verde, HIGH); // funzione eseguita sempre perché non dipendente dalla if precedente a causa del puntovirgola prima della parentesi.
}
La stesa cosa vale per i 3 seguenti IF.

Non mi spiego perché hai il led verde acceso e quello rosso spento. Dovresti avere su entrambi un lampo brevissimo e poi spenti.

Ciao Uwe

Per fugare ogni dubbio lato codice, sarebbe il caso di mettere un paio di digitalWrite(...., LOW) per entrambi i led in modo che all'inizio dello sketch siano sicuramente spenti. Se uno dei 2 è acceso, allora è un problema HW (collegamenti).

CarloMaragno:
ma scusate se il codice è tanto sbagliato come mai l'IDE melo compila...

Il compilatore controlla la sintassi, l'uso delle variabili e altre cose, non controlla, e non ha modo per farlo, la logica del programma che nel tuo caso è sbagliata.