Ciao,
sto cercando di pilotare un led via bluetooth.
Per testare un po' il codice per convertire le stringhe ricevute ho notato che non riesco a spegnere il led una volta acceso.
Ho aggiunto qualche Serial.print per cercare di capire dove si ferma il codice ma nonostante questo non riesco a trovare l'errore.
Sapete dirmi dove sbaglio?
L'ho testato senza successo su circuit di thinkercad (come detto sopra si accende il led ma non si spegne).
Questo è quello che ottengo nel monitor seriale:
bulb
start
HIGH
bulb
HIGH
bulb
HIGH
...
mentre questo è il codice dello sketch:
int LED = 13;
char Mystring[50] = "bulb,start";
char strings[2][10] = {0};
char * token;
void setup()
{
Serial.begin(9600);
Serial.println();
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
creazioneArray();
}
void loop()
{
//nothing to do
}
void creazioneArray(){
byte index = 0;
token = strtok(Mystring, ",");
while (token != NULL )
{
strcpy(strings[index], token);
Serial.println( strings[index] );
index++;
token = strtok(NULL, ",");
}
if (String(strings[0]) == "bulb"){
checkBulbArray();
}
else if (String(strings[0]) == "drop"){
Serial.println("error #001");
}
else {
Serial.println("error #002");
}
}
void checkBulbArray(){
if (String(strings[1]) == "start"){
//LED ON
Serial.println("HIGH");
digitalWrite(LED, HIGH);
delay(1000);
char Mystring[50] = "bulb,stop";
creazioneArray();
}
else if (String(strings[1]) == "stop"){
//LED OFF
Serial.println("LOW");
digitalWrite(LED, LOW);
delay(1000);
char Mystring[50] = "bulb,start";
creazioneArray();
} else{
Serial.println("error #003");
}
}
Per semplificarti la vista ti segnalo la libreria SerialCmd che sicuramente rende molto più facile la cosa ...
Il thread sul forum, relativo a detta libreria, è QUI, su GitHub la trovi QUI e, naturalmente, la puoi installare direttamente dal "Library Manager". Consiglio un'attenta lettura del "readme" che l'accompagna e degli esempi
quanto detto da Guglielmo è verissimo...libreria molto bella... come sempre tocca studiare un poco...resta da chiarire cosa "non va" in quel che hai fatto.
prova a mettere in stampa il registro a cui punta il puntatore "token" (quindi il valore di "token")...intendo per ogni chiamata di strtok()...se intuisco come hai ragionato pensi che la funzione creazioneArray() consideri la variabile Mystring globale o locale a seconda di dove la invochi...prova e facci sapere.
PS: fare attenzione con la riccorsione delle funzioni...rischi di farti "male".
Purché siano stringhe classiche del 'C' (char array) e NON oggetti della classe String (che abbiamo detto molte volte di NON usare per i problemi che può creare).
quello che stampi a video mi pare poco utile. aggiungi info:
Invece del solo Serial.println( strings[index] );
metti: Serial.print(index); Serial.print("="); Serial.println( strings[index] );
un pò usi le funzioni strxxx delle stringhe classiche del C e poi String.
Questo if(String(strings[1]) == "stop")
meglio se usi strcmp() if( strcmp(strings[1],"stop")==0)
Hai già dichiarato in testa la programma Mystring da 50 caratteri. Ed è globale. Poi per fare le ulterioriori prove in checkBulbArray() ridichiari la Mystring (locale poi). Non ha senso.
Dentro la checkBulbArray() devi solo riassegnare i valori, quindi
sostituisci: char Mystring[50] = "bulb,stop";
con: strcpy(Mystring,"bulb,stop");
Funziona, ma è una brutta cosa da fare.... if (strcmp(strings[0], "bulb") == 0) fa la stessa cosa, ma non chiama in causa il costruttore String che è inutile visto che stai usando tutti char array.
Questo invece cosa vorrebbe fare? Se pensi di modificare la variabile globale Mystring in questo modo sei completamente fuori strada: stai semplicemente creando un nuovo char array locale che non ha nulla a che vedere con il primo usato invece nella funzione creazioneArray()
ok, grazie ai vostri suggerimenti ho risolto il problema.
Forse è meglio se invece di usare le stringhe utilizzi dei numeri...in questo modo oltre ad essere più semplice potrei usare anche degli switch e non solo degli if...comunque per correttezza indico il codice corretto, non si sa mai che serva ad altri.