Comunicación serial entre Arduino y NodeMCU

Buen día!
Vengo a hacer una consulta!
Contextualizo: Tengo un Arduino UNO recibiendo mucha información (utilizo casi todos los pines de e/s digitales y entradas análogas), y quiero enviarla a un NodeMCU v1.0 (Fabricante: Amica).
Lo quiero hacer a través de comunicación serial, ya que físicamente se encuentra uno al lado del otro siempre).

Alguien tiene un sketch de programación donde pueda ejecutar mi idea?, o alguien tiene disposición a querer ayudarme? Tengo algunos sketch sobre el tema, ya que he investigado, pero no me resulta nada completo/al 100% aún. :frowning:

De antemano, gracias.

Comunicar en serie dos Arduinos esta explicado en todo la web

Google: 2 Arduinos serial

https://www.hackster.io/harshmangukiya/serial-communication-between-two-arduino-boards-d423e9

Google: Arduino Esp8266 serial

http://www.martyncurrey.com/arduino-to-esp8266-serial-commincation/

https://forum.arduino.cc/index.php?topic=462829.0

Desde luego gracias por tu respuesta.
En el último párrafo cuando te refieres a TX y RX normales, son los (0,1) de Arduino UNO y (GPIO1 GPIO3) de NodeMCU? o te refieres a otro?

Algunas aclaraciones: 1. Efectivamente, dispongo solo de esta version de esp8266 (Nodemcu v1.0) 2. Voy a alimentar externamente el módulo a 3.3 Vcc para no tener problemas!

  1. Voy a alimentar externamente el módulo a 3.3 Vcc para no tener problemas!

Como es que lo vas a alimentar con 3.3V si requiere 5V por su entrada Vin.

Arduino UNO tiene solamente un puerto Serie físico en 0, 1
Pudes tener otros usando SoftwareSerial pero son virtuales.

Cuando trabajas con dos dispositivos te conviene usar SoftwareSerial para poder ver que ocurre en tu Arduino via Monitor Serie, es decir sin usar 0,1 o no verás nada.

Bien, he sacado varias cosas en limpio, tenía mucha información dando vueltas por mi cabeza y la he podido aterrizar con sus comentarios. Agradecido.

Si bien estoy decidido a realizar comunicación serial entre Arduino UNO y NodeMCU, ahora puedo decir que en Arduino UNO lo necesito hacer con puertos que no involucren TX y RX (0,1), porque estoy en otro lío, tengo algunas acciones de control que dependen de que en mi Monitor Serie se visualicen las variables y una especie de reloj que tengo programado.

Sin ir mas lejos en lo anterior, como dije anteriormente, necesitaré configurar, por ejemplo, (2,3) como pines de comunicación en UNO. NodeMCU puede quedar con las (GPIO1 GPIO3). Comenzaré a buscar como configurar dichos pines (de Arduino UNO) como puertos de comunicación.

Espero se haya entendido! jaja.

Simple, usa SoftwareSerial

Acá un ejemplo

/*
  Software serial multple serial test

 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.

 The circuit:
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)

 Note:
 Not all pins on the Mega and Mega 2560 support change interrupts,
 so only the following can be used for RX:
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

 Not all pins on the Leonardo and Micro support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 created back in the mists of time
 modified 25 May 2012
 by Tom Igoe
 based on Mikal Hart's example

 This example code is in the public domain.

 */
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

He avanzado en la programación para conectar mis dos dispositivos, pero me he encontrado con trabas y creo que son errores míos. De un par de páginas y vídeos he encontrado dos sketch de programación que me han servido, creo, momentáneamente, pero algo ha pasado que ya no me andan.

Se trata de dos sketch, uno para Arduino UNO y otro para NodeMCU v1.0. Anticipo que estoy usando DHT11, sensores de humedad a tierra y LDR's, pero para esta etapa, he suprimido algunos y una vez que los tenga funcionando (entiéndase funcionando como: enviando datos de Arduino y NodeMCU hacia un servidor web), seguir colocando sensores ya que necesito más.
Se los adjunto:

Codigo Arduino

 #include "DHT.h"
#define DHTPIN1 2   
#define DHTPIN2 3
#define DHTPIN3 4
#define sensor A0
#define LDR A1
#define DHTTYPE DHT11   

DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
DHT dht3(DHTPIN3, DHTTYPE);

// Serial Data Transmision
char Data[26];
void setup() {
  Serial.begin(9600);
  dht1.begin();
  dht2.begin();
  dht3.begin();
  pinMode(sensor, INPUT);
  pinMode(LDR, INPUT);
}
long tiempoUltimaLectura=0;; //Para guardar el tiempo de la última lectura
void loop() {
  if(millis()-tiempoUltimaLectura>15000)
    {    
        float h1 = dht1.readHumidity(); //Leemos la Humedad
        float t1 = dht1.readTemperature(); //Leemos la temperatura en grados Celsius

        float h2 = dht2.readHumidity(); //Leemos la Humedad
        float t2 = dht2.readTemperature(); //Leemos la temperatura en grados Celsius

        float h3 = dht3.readHumidity(); //Leemos la Humedad
        float t3 = dht3.readTemperature(); //Leemos la temperatura en grados Celsius

        int valorHumedad = map(analogRead(sensor), 0, 1023, 100, 0);
        
        float ValorLDR = (analogRead(LDR)*5.0)/1023.0; //Valor digital de la diferencia de potencial
        //--------Enviamos las lecturas por el puerto serial-------------
        /*Serial.print("Humedad_1 ");
        Serial.print(h1);
        Serial.print(" %t");
        Serial.print("Temperatura_1: ");
        Serial.print(t1);
        Serial.println(" *C ");
        Serial.print("Humedad_2 ");
        Serial.print(h2);
        Serial.print(" %t");
        Serial.print("Temperatura_2: ");
        Serial.print(t2);
        Serial.println(" *C ");
        Serial.print("Humedad_3 ");
        Serial.print(h3);
        Serial.print(" %t");
        Serial.print("Temperatura_3: ");
        Serial.print(t3);
        Serial.println(" *C ");
        */
        char str_temp1[5];
        char str_temp2[5];
        char str_temp3[5];
        char str_temp4[5];
        dtostrf(((h1+h2+h3)/3), 3, 0, str_temp1);
        dtostrf(((t1+t2+t3)/3), 2, 1, str_temp2);
        dtostrf(valorHumedad, 2, 0, str_temp3);
        dtostrf(ValorLDR, 2, 1, str_temp4);
        sprintf(Data, "H:%s,T:%s,HT:%s,V:%s\n",str_temp1,str_temp2,str_temp3,str_temp4);
        Serial.print(Data);
        digitalWrite(13,~digitalRead(13));
        /*Serial.print("H:");
        Serial.print("%s",((h1+h2+h3)/3));
        Serial.print("Promedio temperatura: ");
        Serial.print((t1+t2+t3)/3);
        Serial.print("Humedad_Tierra: ");
        Serial.print(valorHumedad);
        Serial.println("%");
        Serial.print("Voltaje: ");
        Serial.println(ValorLDR);
        */
        tiempoUltimaLectura=millis(); //actualizamos el tiempo de la última lectura
    }
}

Sketch NodeMCU

 #include <ESP8266WiFi.h>
#include <SoftwareSerial.h>
SoftwareSerial ARD_ESP(2, SW_SERIAL_UNUSED_PIN); // RX, TX
String apiKey = "apidelapagina"; 
const char* ssid = "nombrewifi";
const char* password = "clavewifi";
const char* server = "api.thingspeak.com";
WiFiClient client;
void setup() {
  Serial.begin(115200);
  ARD_ESP.begin(9600);
  delay(10);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected");
}
void loop() {
  int i;
  static char data1=0,data2=0,data3=0;
  static char Data_recibido[25];
  if(ARD_ESP.available()>24) {
    Serial.println("Recibiendo Datos...");
    for(i=0;i<25;i++){
      Data_recibido[i]=ARD_ESP.read();
      Serial.write(Data_recibido[i]);
    }
    int Humedad = (((Data_recibido[3]-48)*10) + (Data_recibido[4]-48));
    float Temperatura = (((Data_recibido[8]-48)*10) + (Data_recibido[9]-48) + ((Data_recibido[11]-48)*0.1));
    int Humedad_T= (((Data_recibido[16]-48)*10) + (Data_recibido[17]-48));
    float Luminosidad = ((Data_recibido[21]-48) + ((Data_recibido[23]-48)*0.1));
    if (client.connect(server,80)) {
    String postStr = apiKey;
    postStr +="&field1=";
    postStr += String(Humedad);
    postStr +="&field2=";
    postStr += String(Temperatura);
    postStr +="&field3=";
    postStr += String(Luminosidad);
    postStr +="&field4=";
    postStr += String(Humedad_T);
    postStr += "\r\n\r\n";
    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(postStr.length());
    client.print("\n\n");
    client.print(postStr);
    }
    client.stop();
  }
  
  delay(500);
}

El resultado es que en el MonitorSerie de Arduino estoy visualizando datos, pero en el MonitorSerie de NodeMCU solo tengo signos de interrogación (????...) y en el servidor web ningún dato se observa.

2 Likes