Datos de puerto serial (Arduino y módulo nodemcu lolin v3)

Buenas a tod@s. He aquí molestando de nuevo con una pequeña duda que no he podido resolver a ver quien me podría ayudar.

(Primero que nada, desconozco si existe algún tema similar a este, si es así hacérmelo saber).

Resulta que entre un proyecto que tengo que hacer esta que tengo que tomar lecturas de un sensor ultrasónico que esta conectado a un Arduino UNO, y que las lecturas que este reciba las envié por puerto serial hacia un modulo nodemcu lolin v3 igual por puerto serial. Las configuraciones que hice en cada modulo son las siguientes:

  • Arduino UNO

  • Los puertos serie los deje por defecto (Tx y Rx) aunque en realidad solo ocupo Tx para enviar los datos, ya que no necesito retornar datos a Arduino. Este a su vez esta conectado con el Tx de nodemcu a resistencias (Leí en algún otro foro que se tenia que hacer por la diferencia de voltajes en cada placa.)

  • El puerto 2 y 3 los ocupo para recibir los datos del sensor ultrasónico, Trigger y Echo, respectivamente

-Nodemcu

  • Los puertos D7(13) y D8(15) los configuro vía SoftwareSerial para leer los datos que envía Arduino, Tx y Rx respectivamente.
  • El puerto Tx esta en serie con resistencias por la variación de voltaje, nada mas.
  • Configure una pagina web en modo punto de acceso, la cual ocupo para poder visualizar los datos que Arduino envía hacia el nodemcu

De momento, via Monitor serial puedo apreciar correctamente los datos que Arduino envia y que el nodemcu lee. El problema surge cuando los quiero mostrar en la página web, ya que no los muestra como debe.

Anteriormente ocupaba este código para visualizar los datos del sensor vía monitor serie y me funciona bien:

void checkSerialCom(){
     if(SerialEsp.available() > 0){
         Serial.println("Recibido: ");
         while(SerialEsp.available() > 0){
             data = (char)SerialEsp.read(); //Aqui parseo los datos para que los muestre en forma de un caracter el momento de leerlo
             Serial.println(data);
         }
     }
}

El problema viene cuando los quiero mostrar en la pagina web, ya que muestra los datos de forma consecutiva y no se pueden apreciar los datos reales o las mediciones que el sensor hace. Se me ocurre pensar que tengo que hacer un parseo de datos (algo como lo que hice en el código anterior, pero no tengo mucha idea de como hacerlo).

Adjunto los códigos que cargo en cada placa, y si alguien me pudiera orientar a como visualisar los datos, se los agradeciera bastante :smiley:

Codigo módulo nodemcu lolin v3

#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>

//Creacion de AP
const char ssid[] = "NodeMCU";
const char password[] = "123456789.";

WiFiServer server(80);
IPAddress ip(192,168,1,10);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

//Puerto serial Nodemcu
SoftwareSerial SerialEsp(13, 15); //RX, TX
int data;

void setup(){
  Serial.begin(115200);
  SerialEsp.begin(9600);

  server.begin();

  WiFi.softAP(ssid, password);
  WiFi.softAPConfig(ip, gateway, subnet);
  Serial.print("Iniciando AP:\t");
  Serial.println(ssid);
  Serial.print("Direccion IP:\t");
  Serial.println(WiFi.softAPIP());
}

void loop(){
  WiFiClient client = server.available();
  if(!client){
    return;
  }

  Serial.println("Nuevo cliente");
  while(!client.available()){
    delay(10);
  }
  
    while(SerialEsp.available() > 0 ){
      data = (int)SerialEsp.read(); //Lee el dato del puerto serial
      Serial.println(data);
      delay(3000);
    }
  
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("");
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.println("<head><meta charset=uft-8 http-equiv='refresh' content='10'></head>");
  client.println("<body>");
  client.print("<h1>Distancia del agua: ");
  client.println(data);
  client.println(" cm</h1></body></html>");
}

Código Arduino UNO

const int Trigger = 2;
const int Echo = 3;

void setup() {
  Serial.begin(9600);
  pinMode(Trigger, OUTPUT);
  pinMode(Echo, INPUT);
  digitalWrite(Trigger, LOW);
}

void loop() {
  char t;
  char d;

  digitalWrite(Trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trigger, LOW);

  t = pulseIn(Echo, HIGH);
  d = t/59;

  Serial.print(d);
  delay(1000);
}

abrahm9414:
solo ocupo Tx para enviar los datos, ya que no necesito retornar datos a Arduino. Este a su vez esta conectado con el Tx de nodemcu

Ese es tu primer error, los puertos serie se deben conectar cruzados Tx -> Rx. Ten en cuanta que mientras subes el boceto no debe haber nada conectado en los pines 0 y 1 por conflicto. Yo usuario mejor otro par de pines con la libreria SoftwareSerial.h

En el NodeMCU:

while(SerialEsp.available() > 0 ){
      data = (int)SerialEsp.read();    //Solo capturaste el primer byte
      Serial.println(data);
      delay(3000);                           //Perderas los proximos 2 datos
}

Debes leer cada byte e ir reconstruyecdo la cadena completa que el UNO envía.

En el código en el UNO:

  1. La función pulseln() retorna un unsigned long y tu lo quieres recibir en un char t; ? no entra !
  2. Si un numero entero lo divides entre 59 lo mas probable es que el resultado sea un decimal y tu lo quieres meter en char d; ? yo usaría float.