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
#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
#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));
}
}