Problema con readStringUntil (seriale)

Salve, vorrei realizzare una cli per accendere/spengere/statare un LED. ora ho scritto cosi:

const int PIN_LED = 9;
int state = 0;
void setup() {

  pinMode(PIN_LED, OUTPUT);
  Serial.begin(115200);
  Serial.print("Input:");
  delay(100);
}
String code = "";
void loop() {

  if (Serial.available() > 0) {
    code = Serial.readStringUntil(10);
    delay(10);
    Serial.println(code);
  }
  if (code == "SET LED") {
    if (code == 'ON') {
      Serial.println("ON");
      digitalWrite(PIN_LED, HIGH);
      state = 1;
    } else if (code == 'OFF') {
      Serial.println("OFF");
      digitalWrite(PIN_LED, LOW);
      state = 0;
    }
  }
  if (code == "GET LED") {
    state = digitalRead(PIN_LED);
    Serial.println(state);
  }
  code = "";
}

Ma non riesco ad accendere il LED, e spengerlo e vedere lo stato.

Il mio risultato vorrei fare:

>SET LED ON
ON
>GET LED
1
>SET LED OFF
OFF
>GET LED
0
>SET LED BLINK 5
1, 2, 3, 4, 5
>

Qualcuno mi sa dire come passare al code un secondo argomento ? Perché ho provato ad fare una sotto if, ma non funziona.

Idea come fare senza utilizzare librerie esterne?
Grazie mille e buon fine settimana.

E perché? Ce ne è, che ho scritto tempo fa, ben ottimizzata e fa esattamente quello che cerchi ... SerialCmd e c'è un thread dedicato QUI ... poi, fai come vuoi :wink:

Guglielmo

ma senza librerie non si può ?. Con dei semplici if dici che non si può fare?.
grazie e buon pomeriggio.

OK, riuscito con un code.equals .. in questo modo funziona.

Continui però ad usare quella schifezza della classe String ... :roll_eyes:

Se avessi dedicato un po' di tempo a studiare la libreria che ti ho indicato, avresti scoperto che si fa tutto usando le stringhe classiche del 'C' ... evitando così, specie su piccole MCU, la possibilità di bei problemi con la memoria.

Guglielmo

Scusa, mi spiegi quasta "idiosincasia" verso le librerie (che sono la cosa più semplice da usare, piuttosto che reinventare l'acqua calda)?

Oltretutto Arduino è OpenSource e le librerie vengono fornite come codice "sorgente" (quindi ben leggibile) ... ottimo strumento per imparare come gli altri hanno risolto un problema e magari anche tecniche che non si conoscono ...

Guglielmo

1 Like

"statare"? :thinking:

Dubito che basti, almeno basandomi sul primo codice non è sufficiente.
Ci fai vedere come hai risolto?

ok, avevo fatto cosi:

String code;

#define PIN_LED 9
#define tempo 2000
int blink;
void setup() {
  Serial.begin(115200);
  pinMode(PIN_LED, OUTPUT);
  help();
  Serial.println(">");
}

void help() {
  Serial.println(" SET LED ON / SET LED OFF / GET LED / SET LED BLINK :NUM");
}

void loop() {
  if (Serial.available() > 0) {
    code = Serial.readStringUntil('\n');

    if (code.equals("SET LED ON")) {
      digitalWrite(PIN_LED, HIGH);
    }
    if (code.equals("SET LED OFF")) {
      digitalWrite(PIN_LED, LOW);
    }
    if (code.equals("GET LED")) {
      Serial.println(digitalRead(PIN_LED));
    }
    int blink;
    if (sscanf(code.c_str(), "SET LED BLINK : %d", &blink) > 0) {
      for (int i = 0; i < blink; i++) {
        digitalWrite(PIN_LED, HIGH);
        delay(tempo);
        digitalWrite(PIN_LED, LOW);
        delay(tempo);
      }
    }
  }
}

ma non mi piace.. proverò ad studiare la libreria..
grazie lo stesso e scusate del ritardo ma stavo male.

per statare e che vedo il valore dello stato del LED ovvero 0 e 1 con digitalread

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.