Problema inizializzazione serial1

Salve sto usando arduino mega per la comunicazione con l'esp il problema sta nell'inizializzazione della Serial1 del mega

const int buttonPin = 11;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin
int buttonstate = digitalRead(buttonPin);

String Button = ("ciao");

/*//
*/
void setup() {
  // Inizializzo le seriali
  // Serial.begin(9600);
  Serial2.begin(115200);
  Serial.begin(115200);
  Serial1.begin(115200);


  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  Serial.flush();//svuoto il buffer
}

void loop() {
  //------------------
  if (Serial1.available()) {
    buttonstate = digitalRead(buttonPin);
    if (buttonstate == HIGH) {
      digitalWrite(ledPin, HIGH);

     Serial.print("prova");

      Serial1.print("leedon");//Questo è il dato che dovrei inviare


    }
    if (buttonstate == LOW) {
      digitalWrite(ledPin, LOW);
    }
  }




  //..........
  if (Serial.available()) {
    char a = Serial.read();
    delay(1000);
    Serial1.print(a);
    Serial1.print(buttonstate);

    delay(1000);
    Serial.flush();//svuoto il buffer




    char b = Serial1.read();
    Serial.print(F("Arduino UNO ha risposto "));
    Serial.println(b);

    char c = Serial2.read();
    Serial.print(F("esp ha risposto "));
    Serial.println(c);



  }
  delay (10);

}

Questo è lo scheck che sto provando, come inserisco if (Serial1.available()) non mi si accende più il led e non stampa neanche sul monitor,riesco solo ad inviare dati scrivendo direttamente sul monitor seriale.All'invio dei dati pero mi trasmette sia quelli scritti che la parola leedon del tasto premuto.Debbo di volta in volta premere sempre invio per visualizzare lo stato del tasto.

Normale, visto che ( Serialx.available() ) è sempre FALSO e diventa TRUE solo quando hai dei dati in ricezione sulla porta Serialx. Tutto quello che metti fra le due { } attinenti all'if ( Serialx.available() ) viene eseguito solo se e quando hai dati in ingresso sulla Serialx.

Etabeta2018:
Questo è lo scheck che sto provando, come inserisco if (Serial1.available()) non mi si accende più il led e non stampa neanche sul monitor,riesco solo ad inviare dati scrivendo direttamente sul monitor seriale.All’invio dei dati pero mi trasmette sia quelli scritti che la parola leedon del tasto premuto.Debbo di volta in volta premere sempre invio per visualizzare lo stato del tasto.

è proprio quello che hai programmato.
Serial1.available() non dice se la seriale é pronta per l’ uso.
Il Serial1.available() Ti dice quanti dati sono nel buffer di entrata. Percui Stampa solo qualcosa quando é arrivato qualcosa da fuori.

Ciao Uwe

Salve.Ho tolto il ( Serial1.available() ) ed ho lasciato solo serial1.print. Il tasto va bene ma comunque sul esp ed in particolare su blynk non mi arriva nulla solo alla pressione del tasto invio del pc riesco a leggere i dati su blynk,mentre io vorrei che partissero sempre quando premo il tasto su arduino

Stessa cosa del Serial1.available() Hai lo stesso problema con Serial perchè anche li hai messo un available. La logica che usi è errata. Forse se spieghi bene che devi fare ti si può aiutare (non fare il programma al posto tuo però)

P.S. 1. i numero del pin basta byte quindi const byte buttonPin = 11; 2. String Button = ("ciao"); non serve a nulla, le parentesi sono inutili; le String danno sempre problemi, impara ad usare le stringhe classiche del C (array di char) 3. NON puoi eseguire comandi prima del setup(), questa riga è sbagliata. int buttonstate = digitalRead(buttonPin);

  1. usa CTRL+T nell'IDE che indenta meglio e togli tutte quelle [u]inutili[/u] righe vuote

Ti consiglio di comprare un libro o cercare una guida su internet per procedere a piccoli passi.

Salve scusa ma come avrai gia capito non sono un programmatore ma un appassionato Ho seguito i tuoi consigli ma adesso non ricevo più nulla su blynk.Il mio scopo è quello di fare in modo che alla pressione del tasto o all’accensione del led invii la comunicazione dell’accensione sull’app Blynk. Lo scheck riscritto, è questo

const int buttonPin = 11;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin
int  buttonstate;
void setup() {
  // initialize both serial ports:
  // Serial.begin(9600);
  Serial2.begin(115200);
  Serial.begin(115200);
  Serial1.begin(115200);


  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  Serial.flush();//svuoto il buffer
  Serial1.flush();
}

void loop() {
  
  buttonstate = digitalRead(buttonPin);
  if (buttonstate == HIGH) {
    digitalWrite(ledPin, HIGH);

    Serial.print("d");
    Serial1.print("d");

  }
  if (buttonstate == LOW) {
    digitalWrite(ledPin, LOW);
  }

  char a = Serial.read();
  Serial1.print(a);

delay(1000);

//Serial.flush();//svuoto il buffer

}

Vorrei capire dove sbaglio e perchè lo so che è tosta ma ormai ci sono entrato troppo dentro,ed ho voglia di capirci di più.Riguardo ai libri li ho abbandonati una quarantina di anni fa e non saprei da dove cominciare se dal binario o dall’elettronica.(Ho creato alcuni scheck molto semplici ma funzionanti
con arduino ed adesso ho preso questa fissa).Grazie anticipato per la vostra pazienza.
Auguroni di buon natale a tutto lo staff

Ci spieghi cosa è collegato a Serial1 e cosa a Serial ? Accenni ad un esp... cosa c'e' caricato sopra ? Io non uso Blinky. Hai app Blinky su cellulare e sull'esp un firmware/sketch di blinky ? Senza info... non andiamo da nessuna parte. Ho capito benissimo che sei un amatore, ma devi darci info.

Io ti consiglio di fare un pezzo alla volta. Prima di tutto leggi il bottone e lo stato lo mandi su serial monitor. Se funziona allora DOPO metti l'invio della info a ... esp o blinky non ho capito.

Ok, sul mega ho lo scheck menzionato prima ,sulla seriale leggo il monitor seriale mentre sulla serial1 e collegato a questo modulo ESP 12E ESP8266 UART WIFI Wireless Shield per Arduino UNO R3 Bouclier Sans filfr : rispettivamente ai pin 0,1 ed lo scheck relativo è questo

[code]

#define BLYNK_PRINT Serial

//SoftwareSerial EspSerial(2, 3); // RX, TX
//SoftwareSerial SwSerial(4, 5); // RX, TX// in Blynk app writes values to the Virtual Pin 1
//#define BLYNK_PRINT SwSerial
//#include <ESP8266WiFi.h>

#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
WidgetTerminal terminal(V1);


// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
// Go to the Project Settings (nut icon).
char auth[] = "xxxxxxxxxxxxxxxxxxxxxx";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "xxxxxxxxx";

char pass[] = "xxxxxxxxxxxxxxxxxxxxxxxxx";
//----------
// This function will be called every time Slider Widget



//.........................
String content = "";
char character;
BlynkTimer timer;
//................
WidgetLED led1(V1); //register to virtual pin 1
void blinkLedWidget()
{
  if (led1.getValue()) {
    led1.off();
    //Serial.println("LED on V1: off");
  } else {
    led1.on();
    // Serial.println("LED on V1: on");
  }
}
//..................
BLYNK_WRITE(V2)
{
  int pinValue = param.asInt();
  if (pinValue == HIGH) {
    Blynk.virtualWrite(V0, "clr");//resetto il terminale
  }
}
//............
/*
  BLYNK_WRITE(V1)
  {
  int pinValue = param.asInt(); // assigning incoming value from pin V1 to a variable
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("V1 Slider value is: ");
  Serial.println(pinValue);
  }
*/
//............
void setup()
{

  // Debug console
  Serial.begin(115200);
 // SwSerial.begin(115200);
  //EspSerial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  // ----------------------------

  //.....................
  timer.setInterval(10L, SerialInput);  // Run every 10ms
  Blynk.virtualWrite(V0, "clr");  // Clear the terminal from past info.
  //----------------------------------


}
void SerialInput() {
  if (Serial.available()) {  // Watch for Serial data
    character = Serial.read();  // Read Serial character
    content.concat(character);  // Add character to holding String
    if (character == '\n') { // If last character is new line...
      //..............

      //...............
      Blynk.virtualWrite(V0, content);  // ...send string to terminal

    }
    content = "";  // Clear holding String

  }
}

void loop()
{
  Blynk.run();
  timer.run();
}

[/code]
Ripeto riesco a vedere i dati che invio dal mega sul terminale di blynk solo dopo che ho aperto il monitor seriale e premendo il tasto invio vedo i dati su terminale blynk del telefono.Il mio intento è quello di comunicare a blynk e quindi vederlo da terminale se il led è acceso o spento

Se devi spedire (e basta) NON devi mettere parti che fanno Serial.read() perchè quello vuol dire che DEVI leggere qualcosa dal serial monitor. Parte che secondo me hai aggiunto dopo. Per quello ti consiglio di fare un pezzo alla volta.

Salve ,la parte della lettura si l ho aggiunta dopo che avevo gia fatto delle prove ma con esito negativo. Stasera ho riprovato e non so coma ma funziona benissimo,sia togliendo la lettura della serial che con essa. Grazie per la vostra pazienza

Se vuoi spedire ANCHE quello che scrivi da monitor seriale,

if (Serial.available()) 
{ int c = Serial.read();
  Serial1.print(c);
}

ma... separato da tutto il resto, tu invece li dentro avevi messo l'invio dello stato del bottone. Inoltre non ci devono essere nella loop i delay(1000)

Salve e scusa se approfitto di te.Sono quasi riuscito nel mio intento debbo solo rifinirlo,funziona quasi tutto bene.Ora voglio capire perché. Quello che ho fatto fino ad adesso erano delle prove che debbo inserire su uno scheck che è su Arduino uno,per cui ho spostato la stampa da serial 1 sulla porta serial 0 del mega e fin qui tutto bene sono riuscito lo stesso a comunicare con la shield e con blynk. Il problema e che adesso me ne sono accorto i cavo di connessione della seriale non sono incrociati,cioè lo 0 della shield va sullo 0 del mega e 1 sullo 1 del mega e funziona tutto bene.Ok può essere che sulla shield essendo un prodotto cinese hanno invertiti i pin. Pero il fatto strano è come sempre letto è che se impegno la seriale per comunicare non posso vederlo poi sul monitor,ed invece riesco sia comunicare che a vedere sul monitor seriale(il che mi sembra che vada oltre ogni logica)

Da una certa versione di Arduino IDE il serial monitor non blocca

La mia è la 1.8.7 Quindi tutto cio è normale ,OK

Non dare per scontato nulla. fai debug mettendo un pò di Serial.println() nei posti dove sei sicuro passa e dove pensi non passa. Stampa anche le variabili per sicurezza.

Non mi piace la classe String, non la uso. In teoria dovrebbe funzionare con == Ci sono anche i metodi/funzioni .startsWith() e .CompareTo()

Ciao,

se per secondo if intendi:

if (content == "Cucina")

secodno me non ritorna vero perchè tu ad ogni lettura "concateni" la char content alla tua Stringa...e poi fai la verifica se content == '\n'...il che vuol dire che la tua Stringa sarà molto probabilmente "cucina\n"... dovresti cambiare un po' il codice e prima verificare che content NON sia '\n' e "concatenarlo" alla Stringa...nel caso fosse '\n' verifichi cosa contiene la tua Stringa.

Spero di essere stato chiaro

PS: concordo con nid69ita...in Arduino la classe String meglio evitarla...se proprio vuoi una cosa del genere cerca la classe PString...rende possibile maneggiare le classiche stringhe del C (array di char) quasi fosse una Stringa.

Etabeta2018: La mia è la 1.8.7 Quindi tutto cio è normale ,OK

Avrei un'altra domanda da farti.Puoi spiegarmi con parole molto molto semplici la comparazione di due stringhe?Ho scritto queste righe il primo serial.print(content) stampa bene il secondo dopo l'if non va per cui deduco che l'if è sempre false ,perché mi puoi spigare? Ho letto qualcosa in giro ma è un po troppo complicato per me,di conseguenza mi sono solo incasinato di più.Queste sono le righe Code: [Select]

void SerialInput() {
 //.................


 //.....................
 if (Serial.available()) {  // Guarda sulla seriali se ci sono dati in arrivo
   character = Serial.read();  // Leggi il carattere seriale

   content.concat(character);  // Aggiungi carattere a stringere String
   if (character == '\n') { // Carattere speciale che indica fine riga
     Blynk.virtualWrite(V0, content);  // invia una stringa al terminale

     // content = "";  // Clear holding String
      //Serial.print(content);// fin qui ci siamo mi stampa la parola Cucina
     //________________

     if (content == "Cucina")

     {
       Serial.print(content);// Questo invece non va,percui deduco che l'if precedente è false
       Blynk.virtualWrite(V1, 255);
       led1.on();
     }
     else{
       led1.off();

Scusate ma l'avevo cancellato per sbaglio

Quindi se ho capito bene l'istruzione dovrebbe diventare if (content == "Cucina\n") altrimenti non ho capito cosa intendi ,il carattere \n è un carattere di fine riga ,ho anche qui ho interpretato male? Dalla lettura della prima serial.print quella barrata quando l'abilito leggo bene la stringa Cucina che io invio. Riguardo all'istruzione compare to ho cercato di usarla ma comunque non andava o meglio credo di non aver capito come dovrebbe funzionare

Ciao, Si '\n' è un carattere di escape che vuol dire "fine riga"... Ma è comunque un carattere e, per com'è il tuo codice, lo aggiungi alla Stringa...se vuoi mantenere il codice così com'è devi cambiare il confronto...basta una \ in meno di quelle che ho messo prima...però è meglio se cambi la funzione...inserendo il char letto solo se diverso da '\n'.

>Etabeta2018: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post #16 (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo