Controllo led via Seriale

Ho appena ricevuto le mie arduino uno e mi sono subito tuttato nel provarle 8) 8) tuttavia ho grossi problemi infatti questo codice, che non mi sembra troppo complesso non mi funziona, non produce l'effetto sperato, ovvero accendere il pin se spento e contrario. L'effetto prodotto è di accendere il pin desiderato, solo che poi resta in quello stato; inoltre il monitor seriale restituisce giusto "ok" ma il low e l'high mi da solo le finali w e h. =( =(

int statoLed[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
void setup(){
    Serial.begin(9600);
    pinMode(1,OUTPUT);
    pinMode(2,OUTPUT);
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    pinMode(5,OUTPUT);
    pinMode(6,OUTPUT);
    pinMode(7,OUTPUT);
    pinMode(8,OUTPUT);
    pinMode(9,OUTPUT);
    pinMode(10,OUTPUT);
    pinMode(11,OUTPUT);
    pinMode(12,OUTPUT);
    pinMode(13,OUTPUT);
}

int controlla(int Led){
  if (statoLed[Led]==0){
    statoLed[Led]==1;
    //Serial.println("Ok");
    return('HIGH');
  }
  else {
    statoLed[Led]==0;
    return('LOW');
  }
}
void loop(){
  if (Serial.available()){
    char nLed=Serial.read();
    digitalWrite(int(nLed), controlla(nLed));
    //Serial.write(int(nLed)+4);
    Serial.println(controlla(nLed));
  }
}

penso che il problema sia legato al tipo di variabili ma non so, la mia attuale esperienza di programmazione è su python XD XD

Grazie

il loop viene eseguito solo quando il serial monitor è aperto e attende nella riga di immissione il numero del pin al quale vuoi cambiare lo stato

void loop(){

if (Serial.available()){ //se la seriale è aperta char nLed=Serial.read(); // leggi il carattere immesso e mettilo nella variab nLed digitalWrite(int(nLed), controlla(nLed)); // commuta a 1 se è 0 o viceversa //Serial.write(int(nLed)+4); Serial.println(controlla(nLed)); } }

ciao

appunto, è quello il mio scopo, solo che se ho un led su mettiamo pin 2, nel serial monitor scrivo 2 e invio: lui riceve 2 controlla se quel pin è acceso o spento e agisce di conseguenza, poi rimane in quello stato fino a quando io gli scrivo di nuovo due e lui dovrebbe invertire (high e low). Tuttavia eseguendo il programma la parte in cui il led deve di nuovo cambiare stato non va :disappointed_relieved:, e allo stesso modo ho problemi nella visualizzazione dei "debug" via serial :astonished:

lo devo caricare, adesso non ho arduino sottomano, piu' tardi a casa ci do un occhio ciao

credo di aver trovato un problema con la scheda, infatti non funziona neanche con del codice che ho trovato su internet:

#define LEDPIN 13

int state = LOW;
char incomingByte = 0;

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

void loop() {
  
  // send data only when you receive data:
  if (Serial.available() > 0) {
     // we receive a char representing an integer. let's converto to int
    int incomingState = (Serial.read() == '1');
    
    // say what you got:
    Serial.print("I received: ");
    Serial.println(incomingState, DEC);
    
    if(incomingState != state) {
      state = incomingState;
      digitalWrite(LEDPIN, state); // turns the LED on or off
      Serial.print("Setting LED as: ");
      Serial.println(state);
    }
    else {
      Serial.print("Doing nothing. LED already: ");
      Serial.println(state);
    }
  }
}

praticamente se io immetto 1 ottengo:

I received: 1 Setting LED as: 1 e subito dopo I received: 0 Setting LED as: 0

come se dopo il char 1 venisse inviato un char 0 mentre in teoria doveva esserci solo il primo, adesso provo con un'altra scheda XD

Ci sono degli errori di sintassi: quando devi assegnare un valore ad una variabile devi usare l'operatore =, non ==

statoLed[Led]==0; // Questo è un confronto (gli chiedi se la variabile è uguale a 0)
statoLed[Led]=0; // Questa è un'assegnazione.

Inoltre le stringhe di caratteri usano con i doppi apici, mentre l'apice singolo indica un carattere, quindi è ovvio che non ti stampa la stringa intera. Anzi mi pare strano che non ti dia errori in compilazione...

Tu cerchi anche di ritornare una stringa quando dovresti ritornare un valore intero. Sicuramente intendevi questo:

return('HIGH'); // ERROREEE!
return HIGH; // Questo va meglio

HIGH e LOW sono dei placeholder per i valori interi 0, 1, in poche parole sono costanti, quindi vanno richiamate non tra apici.

mi sento un idiota a non aver visto i doppi ==, ormai è un anno che faccio informatica e non dovrei cascare più in questi errori, grazie per avermelo fatto notare, grazie anche per l'info su HIGH e LOW, non avevo compreso bene come funzionassero. :cold_sweat: :cold_sweat:

Perfetto, adesso funziona, tuttavia non capisco perchè debba “stabilizzarsi”, infatti le prime volte che inserisco il numero del pin ha qualche reazione strana per poi dalla 4° in poi stabilizzarsi(reazioni solo a livello di serial monitor, perchè i led si accendono giusti).

Ok1
-->Ko111<--
Ko0
Ok1
Ko0
...

P.S.
i → li ho aggiunti io XD