Comunicación por cable entre dos ESP8266

Buenos días a todos.

Estoy liado con un proyecto de regulación automática. Para ello, necesito leer dos señales analógicas a la vez (mediante transformadores de corriente), hacer una resta y subirla a internet posteriormente.

He dispuesto un dispositivo Master con un ESP8266 (Wemos), pero sólo tiene una entrada analógica. Como necesito otra, utilizo otro ESP8266 como esclavo y que le esté enviando información al primero POR CABLE (están uno al lado del otro).

He pensado en utilizar un protocolo serial, pero simplificando mucho, me ocurre algo muy extraño:

CODIGO EMISOR----------------


#include <SoftwareSerial.h>

#define TXD2 12   // TX  (D6)
#define RXD2 13   // RX  (D7)
SoftwareSerial transmisorserie(RXD2, TXD2); // RX, TX

int datos;


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

  pinMode(LED_BUILTIN, OUTPUT);
}


void loop()
{

  datos=888;


  transmisorserie.write(datos);

  digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
  delay(100);
  digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH


  Serial.println(datos);

  delay(1000);
}

CODIGO RECEPTOR -------

/*
   OJO: LOS GND DE AMBOS DISPOSITIVOS SON COMUNES
*/

#include <SoftwareSerial.h>

#define TXD2 12   // TX  (D6)
#define RXD2 13   // RX  (D7)
SoftwareSerial mySerial(RXD2, TXD2); // RX, TX

int datos;

void setup() {

  pinMode(LED_BUILTIN, OUTPUT);

  Serial.begin(115200);

  mySerial.begin(9600);

}


void loop()

{
  if (mySerial.available() > 0) {

    digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
    delay(100);
    digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH

    datos = mySerial.read();

    Serial.println(datos);
  }
}

Hago pruebas simplificando al máximo para evitar otros errores.
El sistema transmite datos y son recibidos sin problemas. Pero cuando envío el entero "888", me recibe siempre "212" ¿¿??

Podría pasar a un protocolo I2C o Modbus, pero si no soy capaz de manejar ni éste serial, me preocupa seguir complicándolo.....

¿Alguna amable sugerencia? :thinking:

Voy avanzando....

Ya he entendido que el problema es intentar enviar directamente un entero sin pasarlo a carácter. Utilizo ahora la función sprintf:

#include <SoftwareSerial.h>

#define TXD2 12   // TX  (D6)
#define RXD2 13   // RX  (D7)
SoftwareSerial mySerial(RXD2, TXD2); // RX, TX

int i;

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  mySerial.begin(9600);
}


void loop()
{

  i = i + 50;

  char buffer[10] = " ";
  char* formato = "%i"; // d or i  Signed decimal integer
  sprintf(buffer, formato, i);

  Serial.println(buffer);


  mySerial.write(buffer);


  digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
  delay(100);
  digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH

  delay(1000);
}


Y en el receptor...:
#include <SoftwareSerial.h>

#define TXD2 12   // TX  (D6)
#define RXD2 13   // RX  (D7)
SoftwareSerial mySerial(RXD2, TXD2); // RX, TX

String datos;
int value;


void setup() {

  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  mySerial.begin(9600);

}


void loop()

{



  if (mySerial.available())

  {
    //datos = mySerial.read();
    //value = datos.toInt();  //convierte de char a int

    Serial.write(mySerial.read());

    //Serial.println("");

    //value = value + 1;
    //Serial.print("value ");
    //Serial.println(value);

    digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
    delay(100);
    digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH

    yield();
  }


}

Hasta aquí vale. Pero,....cómo deconstruyo otra vez de char a int para manejar los datos ¿¿?? con toInt no me funciona bien..

Para que usar 2 esp? usa un multiplexor analogico y amplia la entrada o usa un AD i2C que es mas cómodo. Ejemplo un ADS1115 solo para dar un ejemplo.
No tienes que estar comunicándote mas que con el ADC directamente.

1 Like

SOLUCIONADO:

/*
   OJO: LOS GND Y +5V DE AMBOS DISPOSITIVOS DEBEN SER COMUNES
*/

#include <SoftwareSerial.h>

#define TXD2 12   // TX  (D6)
#define RXD2 13   // RX  (D7)
SoftwareSerial mySerial(RXD2, TXD2); // RX, TX

void setup() {

  Serial.begin(115200);
  mySerial.begin(9600);
}


void loop()

{
  if (mySerial.available())

  {
   int value = mySerial.parseInt();  //convierte de char a int

    value = value + 1; //para comprobar que es un entero
    Serial.println(value);
  }
}

PD.- gracias de todos modos surbyte

Pues aunque parezca absurdo, tengo como 30 Wemos que compré en una oferta a 2€ y lo utilizo como "procesador estándar".

Extraño no parece ahora si te sobran y quieres vender algunos te compro.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.