Problemi di comunicazione seriale

Salve,
È qualche giorno che sto sbattendo la testa su un problema di comunicazione seriale tra due Wemos.
I codici che ho scritto per “l’emettitore” ed il “ricevitore” sono i seguenti (vi risparmio il void setup):

EMETTITORE

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on and write string:
    Serial.write("PROVA");
    Serial.println();
    digitalWrite(ledPin, LOW);
  } else {
    // turn LED off:
    digitalWrite(ledPin, HIGH);
  }
}

RICEVITORE

void loop() {

     inputString = Serial.readString();

     if (inputString.equals("PROVA")) {
        digitalWrite(ledPin, HIGH);
     } else {
        digitalWrite(ledPin, LOW);
     }

   }

Quando premo il pulsante sull’emettitore, vedo dal monitor seriale la stringa “PROVA”, mentre sul monitor seriale del ricevitore non vedo nulla.
Se provo a “debuggare” semplicemente con un Serial.println(Serial.read()) il valore che vedo stampato a monitor è -1, mentre se premo il pulsante non leggo più niente…
Avete qualche idea? Sicuramente sto sbagliando qualcosa, ma non capisco cosa…

come hai collegato le wemos tra di loro?
come hai inizializzato la libreria Softwareserial?
come hai stampato sulla Softwareserial?

Cosa numero uno:
Mi sembra di vedere che tu usi la stessa seriale sia per il debug che per la comunicazione vera e propria. Io non te lo consiglio, perché con uno disturbi l'altra. Apri piuttosto una seriale software (se possibile, non conosco le macchine, ma prova a cercare una libreria softwareSerial), ed usa quest'ultima come seriale tra le due macchine.

Cosa numero due:
Devo ammettere che mi pare sia un problema semplice per il quale si é scelta una soluzione complessa. Per comunicazioni di un dato monodirezionali io, se non potessi fondere le macchine, userei un filo attaccato tra un pin del trasmettitore (oitput) e uno del ricevitore (input). Se corrente su filo->tasto premuto->led da accendere (e si fa con una riga di codice sola). Poi attacco le macchine (+ e -) in nodo da far passare quella corrente.

Cosa numero tre:
Non so come si comporta la Serial.write con array di char. Personalmente per scrivere userei una Serial.print che traduce in ASCII i caratteri, e che accetta ogni cosa ti possa venire in mente. Farei ciò perché poi la macchina ricevente non sa se quello che riceve é ASCII o valore byte, e lo tratta sempre cone ASCII.

Cosa nunero quattro:
Personalmente aborro le String e le funzioni che le riguardano. Preferisco di gran lunga usare array di char, così so che cosa fa e come.

Cosa cinque:
Dopo la Serial.write(), della quale già detto dubito, vedo una Serial.println(). Questo introduce nella comunicazione un ulteriore carattere, il carattere '\n'. Così facendo su Seriale si vede una nuova riga, ma Arduino riceve un \n, che é un carattere come gli altri.
Non so se é conteggiato o meno, comunque per quanto ne so Arduino ricevente mette anche quel carattere nella String, che poi confronta con una che non lo contiene. In quel momento si domanda ""PROVA\n" é uguale a "PROVA"? E credo la risposta sia no

Non avevo letto l'ultima partr.
A questo non so dare risposta. Controlla soltanto i collegamenti e la velocità a cui hai aperto la Seriale su ambo ke macchine.
E continuo a consigliare il mio punto due, che é certo come é certo che Arduino legge un tasto

Buongiorno, ringrazio tutti le risposte. Stasera ci rimetto le mani e vi tengo aggiornati.
Per Silente: questo è solo l’inizio, devo poter comunicare molto altro e non mi basta il semplice tasto, in quel caso confermo che sarebbe stata una soluzione molto complessa per un problema più che semplice.

Io non ho mai usato la SoftwareSerial sulle WeMos ma credo che non sia proprio possibile usare la libreria standard.

Ma credo che tu possa usare qualcosa come QUESTA ossia una SoftwareSerial fatta appositamente per ESP. Non l'ho provata, come detto, quindi non so le sue caratteristiche o limitazioni ma puoi provarla.

Scusa la curiosità, ma se usi le WeMos perché vuoi farle parlare via seriale e non via WiFi?

Mi sembra di averla provata io, va bene. Non permette il funzionamento attivo alto, ma chi lo usa?

Standardoil:
Mi sembra di averla provata io, va bene. Non permette il funzionamento attivo alto, ma chi lo usa?

Parli della SoftwareSerial Arduino usata su una WeMos?

No, di quella citata da te
Se serve stasera guardo quale esattamente ho installata

... mmm ... guardate che il core ESP8266 che si installa nel IDE includa la sua libreria "SoftwareSerial" già adattata per ESP8266 quindi ... basta includerla come al solito :slight_smile:

Andate nella cartella del "core" esp8266/hardware/esp8266/2.4.1/libraries/ e la trovate li :wink:

Guglielmo

Buonasera,
Vi aggiorno che ho risolto il problema utilizzando la libreria SoftwareSerial ed utilizzando i pin D1 e D2 come TX/RX.
Ora ho soltanto un'ultima domanda:
La stringa che vedo sul secondo ESP è una stringa "PROVAPROVAPROVAPROVAPROVA", quindi quando leggo attraverso il comando "sWSrl.readString" ovviamente non accade nulla, perché la stringa che invio non è solo "PROVA", ma sono tanti prova a seconda di quanto tengo premuto il pulsante.
Più che cercare la parola "PROVA" all'interno della stringa mi piacerebbe - ammesso ci sia il modo - inviare solo la stringa "PROVA" e non "PROVAPROVAPROVAPROVA".
Come fare?

Ringrazio in anticipo e ringrazio tutto per avermi suggerito di usare la SoftwareSerial.

per risolverlo in ricezione basta uasare la funzione .find() invece della .readstring()
per risolverlo in trasmissione devi fare un debounce hardware e trasmettere al rilascio del pulsante invece che alla pressione

Logicamente ricevi un insieme di "prova", tanti quanti i cicli che la macchina (che mi scapperà di chiamare Arduino) sente il tasto.
Se vuoi riceverne solo uno, confrontarlo e operare di conseguenza, devi riscrivere da capo il programma.
Devi creare una stringa per accendere il ked ed una per spegnerlo, accettate dal ricevente.
Sul trasmettitore poi crei una variabile stato_precedente che conservi l'ultima lettura del pulsante.
Se le letture sono differenti allora invii la stringa corrispondente allo stato attuale e aggiorni lo stato precedente si che siano uguali.
Poi sul ricevente ricevi la stringa, la confronti ed agisci.

Per semplificare ti consiglio di usare un array bidimensionale di char che contenga le stringhe (insiemi di caratteri) accettati, ed un array di char che contenga il messaggio letto.
Poi fai una funzione che confronta i due array ottenendo per risultato l'indice della riga di uguaglianza +1(così 0=falso), e da li vai di switch case

Non finirò mai di ringraziarvi! Saluti! :slight_smile: