da arduino uno > esp >broker

ciao a tutti, la mia intenzione è leggere con arduino uno il valore di luce con una fotoresistenza, inviare il numero tramite seriale all’esp01 e da lì inviare il numero al mio broker.
ci ho provato ma non funziona :frowning:
la parte di arduino funziona se la leggo da seriale pc, ma quando lo collego all’esp, leggo nel broker numeri a caso

questo il codice di arduino:

#include <SoftwareSerial.h>
SoftwareSerial Seriale(7,8); 

void setup() {
  Serial.begin(9600);
Seriale.begin (9600);

  int v = analogRead(A0);

}

void loop() {
  int v = analogRead(A0);
  Serial.println(v);
  Seriale.print(v);


  
  delay(5000);
}

e questo quello dell’esp:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>



const char* ssid = "******";
const char* password = "*******";
const char* mqtt_server = "**********";
#define mqtt_user "************"
#define mqtt_password "**********"
int luminosit;

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network


  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);

  }

  randomSeed(micros());


}

void callback(char* topic, byte* payload, unsigned int length) {

  for (int i = 0; i < length; i++) {

  }


  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is active low on the ESP-01)
  } else {
    digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH
  }

}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {

    // Attempt to connect
    // If you do not want to use a username and password, change next line to
    // if (client.connect("ESP8266Client")) {
    if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {

    } else {

      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  Serial.begin(9600);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();



  if (Serial.available())
  {
    luminosit = Serial.read();
    snprintf (msg, 50, "#%ld", luminosit);
    client.publish("outTopic", msg);

  }

}

premetto che per l’esp ho preso spunto da esempi online ed ho paura che il problema sia proprio lì.
potete illuminarmi per favore?

mi potete aiutare per favore?
penso di aver capito che la ricezione sull'esp non è come quella del monitor seriale, ovvero invece di ricevere il numero intero compreso di 2 o 3 cifre, ne vede una sola e in qualche altro formato.
è giusta la mia intuizione?
ora io so per certo che su arduino il valore della fotoresistenza è un INT
e nell'esempio di invio al broker che ho trovato sull'IDE è un char (?)

long lastMsg = 0;
char msg[50];
int value = 0;





long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    ++value;
    snprintf (msg, 50, "hello world #%ld", value);
    Serial.print("Publish message: ");
    Serial.println(msg);
    client.publish("outTopic", msg);

ora il broker riceve messaggi tipo:
#51
#255
#252

sembra sia riuscito a fare un passo, ora solo quando la fotoresistenza ha valori sotto a 255 riesco a visualizzarli correttamente nel broker, sopra tale valore arrivano altre cifre.

arduino:

#include <SoftwareSerial.h>
#define RISCRX 6 //pin ricevitore seriale 
#define RISCTX 7 //pin trasmettitore seriale

SoftwareSerial Serialint(RISCRX, RISCTX); //seriale secondaria

void setup() {

  pinMode(RISCTX, OUTPUT);
  pinMode(RISCRX, INPUT);

  Serial.begin(9600);
  Serialint.begin (9600);

  int v = analogRead(A0);

}

void loop() {
  int v = analogRead(A0);
  Serial.println(v);
  Serialint.write(v);
  delay(5000);
}

esp:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "*******";
const char* password = "********";
const char* mqtt_server = "**";
#define mqtt_user "*****"
#define mqtt_password "*******"
int luminosit;

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  randomSeed(micros());
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {

    // Attempt to connect
    // If you do not want to use a username and password, change next line to
    // if (client.connect("ESP8266Client")) {
    if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {

    } else {

      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  Serial.begin(9600);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  //---------------------------------------------------
  if (Serial.available())
  {
    luminosit = Serial.read();
    snprintf (msg, 50, "%ld", luminosit);
    client.publish("luminosità_esterna", msg);
    delay(100);
  }
  //------------------------------------------
}

Probabilmente il problema è di come invii il dato.
La parte ESP fa una solo ed unica .read() quindi (probabilmente) il codice che hai copiato da per scontato che viene inviato un solo byte con il valore da 0-255
Se tu spedisci da Arduino con Seriale.print(v); stai inviando un testo, ovvero v=123 viene spedito NON il valore 123 ma il carattere '1' poi '2' e poi '3'. Da esp ne leggi solo uno

Da Arduino devi usare Seriale.write(v); MA non puoi inviare v che è grosso 2 byte
Dovresti rimappare il valore analogico 0-1023 in un range 0-255 usando map()

Oppure lato esp devi leggere più di un carattere inviando da Arduino testo.
Ma devi ricomporre il valore visto che ti vengono spediti i singoli caratteri. E non sai quanti sono perché 123 sono 3 caratteri 1023 sono 4, 10 sono 2.
La cosa migliore se fai spedizione del dato con println(v) che aggiunge new line '\n'
Da esp prova a leggere con Serial.parseInt()

nid69ita:
Probabilmente il problema è solo di come invii il dato.
La parte ESP fa una solo ed unica .read() quindi (probabilmente) il codice che hai copiato da per scontato che viene inviato un solo byte con il valore da 0-255
Se tu spedisci da Arduino con Seriale.print(v); stai inviando un testo, ovvero v=123 viene spedito NON il valore 123 ma il carattere '1' poi '2' e poi '3'. Da esp ne leggi solo uno
Da Arduino invia usando Seriale.write(v);

grazie nid69ita!
esatto, infatti su arduino sono passato da serial.print a serial.write e così i primi 255 li leggo.

e come faccio a far capire all'esp che potrebbero esserci più byte in arrivo e poi metterli insieme?