Go Down

Topic: Comunicación serie entre Arduino uno y Nodemcu falla (Read 87 times) previous topic - next topic

dalme

Estoy con un problema al momento de enviar datos de sensores desde arduino uno y recibirlos en un nodeMCU, el problema es que  el node MCU lee solo una vez los datos que le llegan, y se quedan esos, el momento que deberia recibir los siguientes, siguen apareciendo los que leyo por primera vez. Uso software serial para poder visualizar los datos entre los dos dispositivos.
Cualquier ayuda les agradesco mucho

Codigo de Arduino
Code: [Select]

#include <DHT.h>
#include <DHT_U.h>
#include <SoftwareSerial.h>
SoftwareSerial espSerial(2, 3); // RX, TX
int temperatura=25;
int humedad=60;
int radiacionUV=0;
char datos[12];
int posicion=0,RUVINDEX=0;
String EnviaraEsp="",T="",H="",UvIndex="",DatosFromEsp,MedicionUVM30A="",volt="";
unsigned long Tiempo_Tx;
unsigned int contador_lecturas=1;
int voltaje=0;
float total_lecturas=0.0;

boolean TransmitirUV=false;
String UV_index = "0";
DHT dht(A0, 11);//Dht pin,DhtType el pin A0 es usado como entrada analogica para leer los datos del sensor DHT11.
int sensorPinUV = A1;

void setup() {
  // put your setup code here, to run once:
    espSerial.begin(9600);//Puerto serial para comunicacion con NodeMCU
    Serial.begin(9600);//Puerto Serial par visualizad datos de ingreso y salida en el Monitor Serial
    dht.begin();//inicializo el sensor dht(Libreria)
    Tiempo_Tx=millis();
 
}

void loop() {
  // put your main code here, to run repeatedly:
  if((millis()-Tiempo_Tx)>2000){//Transmision cada cierto intervalo de tiempo
    leerSensores();
    TransmitirDatos();
    Tiempo_Tx=millis();
    Calcula_nivel_UV();
  }
}

void leerSensores(){
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
    humedad = dht.readHumidity();
  // Read temperature as Celsius (the default)
    temperatura = dht.readTemperature();
    //radiacionUV=analogRead(sensorPinUV);
    radiacionUV=radiacionUV+1;
  }

void Calcula_nivel_UV()
{
 
  //Calcula tension em milivolts
 

  voltaje = (radiacionUV * (5.0 / 1023.0)) * 1000;
  if (voltaje > 0 && voltaje < 50)
  {
    UV_index = "0";
    RUVINDEX=0;
   
  }
  else if (voltaje > 50 && voltaje <= 227)
  {
    UV_index = "0";
    RUVINDEX=0;
   
  }
  else if (voltaje > 227 && voltaje <= 318)
  {
    UV_index = "1";
    RUVINDEX=1;
   
  }
  else if (voltaje > 318 && voltaje <= 408)
  {
    UV_index = "2";
    RUVINDEX=2;
   
  }
  else if (voltaje > 408 && voltaje <= 503)
  {
    UV_index = "3";
    RUVINDEX=3;
   
  }
  else if (voltaje > 503 && voltaje <= 606)
  {
    UV_index = "4";
    RUVINDEX=4;
 
  }
  else if (voltaje > 606 && voltaje <= 696)
  {
    UV_index = "5";
    RUVINDEX=5;
 
  }
  else if (voltaje > 696 && voltaje <= 795)
  {
    UV_index = "6";
    RUVINDEX=6;
   
  }
  else if (voltaje > 795 && voltaje <= 881)
  {
    UV_index = "7";
    RUVINDEX=7;
 
  }
  else if (voltaje > 881 && voltaje <= 976)
  {
    UV_index = "8";
    RUVINDEX=8;
 
  }
  else if (voltaje > 976 && voltaje <= 1079)
  {
    UV_index = "9";
    RUVINDEX=9;
  }
  else if (voltaje > 1079 && voltaje <= 1170)
  {
    UV_index = "10";
    RUVINDEX=10;
   
  }
  else if (voltaje > 1170)
  {
    UV_index = "11+";
    RUVINDEX=11;

  }
}



 
void TransmitirDatos(){
    T=String(temperatura,DEC);
    H=String(humedad,DEC);
    UvIndex=String(RUVINDEX,DEC);
    MedicionUVM30A=String(radiacionUV,DEC);
    volt=String(voltaje,DEC);

   
    EnviaraEsp=H+"-"+T+"-"+UvIndex+"-"+MedicionUVM30A;
    Serial.println(EnviaraEsp);
    espSerial.println(EnviaraEsp);
    Serial.println("Valores de los Sensores: ");
    Serial.println("Temperatura: "+T);
    Serial.println("Voltaje: "+volt);
    Serial.println("Humedad: "+H);
    Serial.println("Uv Index: "+UvIndex);
    Serial.println("Medicion Radiacion: "+MedicionUVM30A);
    int temperatura=0;
    int humedad=0;
    int radiacionUV=0;
   

 }



Codigo de MCU
Code: [Select]

#include "SoftwareSerial.h"
#include "ThingSpeak.h"
#include "secrets.h"
#include <ESP8266WiFi.h>
char ssid[] = SECRET_SSID;   // your network SSID (name)
char pass[] = SECRET_PASS;   // your network password
int keyIndex = 0;            // your network key Index number (needed only for WEP)
WiFiClient  client;
unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;
String myStatus = "";
int prueba=0,TempThingspeak=0,HumiThingSpeak=0,RadUVThingSpeak=0,MedicionUVM30AThingSpeak=0;

SoftwareSerial mySerial(13, 15, false, 256);//(D7,D8)
volatile char tokenChar = '-';
char datos[12];
String CadenaDatosArrive="",Temperatura="",Humedad="",UVindex="",MedicionUVM30A="",dataReceived="";
unsigned long Tiempo_Tx;
int posicion=0;
void setup() {
  // put your setup code here, to run once:
 
    Serial.begin(9600);
    mySerial.begin(9600);
    Tiempo_Tx=millis();
    WiFi.mode(WIFI_STA);
    ThingSpeak.begin(client);  // Initialize ThingSpeak
}

void loop() {
  // put your main code here, to run repeatedly:
  if((millis()-Tiempo_Tx)>2000){
        RecibirDatos();
        SepararDatos();
       // thingSpeak();
        Tiempo_Tx=millis();
       
  }
}
void RecibirDatos(){
        while(mySerial.available()>0){
        //delay(200);
        datos[posicion]=mySerial.read();
        CadenaDatosArrive+= datos[posicion];
        posicion++;}
        //dataReceived=CadenaDatosArrive;
        Serial.println("Los datos que llegan juntos son: "+CadenaDatosArrive);
        dataReceived=CadenaDatosArrive;
       
}
void SepararDatos(){
 
  Humedad=dataReceived.substring(0, dataReceived.indexOf(tokenChar));
  dataReceived = dataReceived.substring(Humedad.length() + 1);
  Temperatura = dataReceived.substring(0, dataReceived.indexOf(tokenChar));
  dataReceived = dataReceived.substring(Temperatura.length() + 1);
  UVindex = dataReceived.substring(0, dataReceived.indexOf(tokenChar));
  dataReceived = dataReceived.substring(UVindex.length() + 1);
  MedicionUVM30A= dataReceived.substring(0, dataReceived.indexOf(tokenChar));

 
  Serial.println("Los datos que llegaron desde Arduino son: ");
  Serial.println("Humedad: "+Humedad );
  Serial.println("Temperatura: "+Temperatura );
  Serial.println("RadiacionUV: "+UVindex );
  Serial.println("MedicionUVM30A: "+MedicionUVM30A );
  TempThingspeak=Temperatura.toInt();
  HumiThingSpeak=Humedad.toInt();
  RadUVThingSpeak=UVindex.toInt();
  MedicionUVM30AThingSpeak=MedicionUVM30A.toInt();
}

void thingSpeak(){
  if(WiFi.status() != WL_CONNECTED){
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(SECRET_SSID);
    while(WiFi.status() != WL_CONNECTED){
      WiFi.begin(ssid, pass);  // Connect to WPA/WPA2 network. Change this line if using open or WEP network
      Serial.print(".");
      delay(5000);     
    }
    Serial.println("\nConnected.");
  }

  // set the fields with the values
  ThingSpeak.setField(1, HumiThingSpeak);
  ThingSpeak.setField(2, TempThingspeak);
  ThingSpeak.setField(3, RadUVThingSpeak);
  ThingSpeak.setField(4, MedicionUVM30AThingSpeak);
  ThingSpeak.setStatus(myStatus);
 
  // write to the ThingSpeak channel
  int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
  if(x == 200){
    Serial.println("Channel update successful.");
  }
  else{
    Serial.println("Problem updating channel. HTTP error code " + String(x));
  }
 
  }


surbyte

No veo en el Nodemcu que el indice posicion lo vuelvas a poner a 0 con cada nueva lectura.

dalme

Gracias amigo, tenias razon, olvide poner en blanco las variables en la recepcion, con eso funciona todo correctamente. Realmente gracias por darte el tiempo en ayudarme.

Go Up