#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <TimerOne.h>
// Definimos el pin digital donde se conecta el sensor
#define DHTPIN 2
// Dependiendo del tipo de sensor
#define DHTTYPE DHT22 // Cambiado a DHT22
// Inicializamos el sensor DHT22
DHT dht(DHTPIN, DHTTYPE);
const char EQUIPO_ID = '1';
int Temperatura_Leida = 0;
char flag_1_seg = 0;
void setup()
{
// Inicializamos el timer1
Timer1.initialize(1000); // 1ms
Timer1.attachInterrupt(Systick_Handler);
// Inicializamos el puerto serial
Serial.begin(9600);
// Comenzamos el sensor DHT
dht.begin();
}
void Systick_Handler(void)
{
// Aca entro cada 1ms = 1000Hz
static int divisor = 1000;
divisor--;
if(divisor == 0)
{
divisor = 1000; // Corrección: usar = en lugar de ==
flag_1_seg = 1;
}
}
void loop()
{
// Analizamos la recepcion de la trama
PSerial_Recibir();
if(flag_1_seg)
{
// Aca entramos cada 1 seg
flag_1_seg = 0;
// Leemos la temperatura en grados centígrados (por defecto)
Temperatura_Leida = dht.readTemperature();
// Enviamos la temperatura por el puerto serial
enviarTemperaturaSerial(Temperatura_Leida);
}
}
void enviarTemperaturaSerial(int temperatura)
{
char checksum = EQUIPO_ID + (temperatura / 10) + (temperatura % 10); // Sumar los valores para el checksum
Serial.print('>');
Serial.print(EQUIPO_ID);
Serial.print(temperatura);
Serial.print(checksum);
Serial.println('<');
}
void PSerial_Recibir(void)
{
if (Serial.available() > 0)
{ // Comprueba si hay datos disponibles en el buffer del puerto serial
char receivedChar = Serial.read(); // Lee el primer byte de datos del buffer
Serial.print("Caracter recibido: ");
Serial.println(receivedChar); // Muestra el carácter recibido en el puerto serial
PSerial_Analisis(receivedChar);
}
}
void PSerial_Analisis(char dato)
{
// Voy a recibir [>][id][T][?][chk][<]
// chk = Suma de los bytes anteriores
static int estadoRecepcion = 0;
switch(estadoRecepcion)
{
case 0:
if(dato == '>')
{
estadoRecepcion = 1;
}
break;
case 1:
if(dato == EQUIPO_ID)
{
estadoRecepcion = 2;
}
else
{
estadoRecepcion = 0;
}
break;
case 2:
if(dato == 'T')
{
estadoRecepcion = 3;
}
else
{
estadoRecepcion = 0;
}
break;
case 3:
if(dato == '?')
{
estadoRecepcion = 4;
}
else
{
estadoRecepcion = 0;
}
break;
case 4:
if(dato == (char)('>' + EQUIPO_ID + 'T' + '?')) // En este caso no hace falta el checksum ya que todos los datos recibidos son fijos
{
estadoRecepcion = 5;
}
else
{
estadoRecepcion = 0;
}
break;
case 5:
if(dato == '<')
{
// Si recibimos la trama completa debemos enviar la temperatura
PSerial_Enviar();
}
estadoRecepcion = 0;
break;
}
}
void PSerial_Enviar(void)
{
// La trama a enviar es [>][id][T][temp max 5 digitos][chk][<]
// Indices 0 1 2 3 4 5 6 7 8 9
char Buf[12]; // El tamaño del buffer depende del tamaño maximo de la trama + un extra por las dudas
sprintf(Buf, ">%cT%05d", EQUIPO_ID, Temperatura_Leida); // Armo la trama
char checksum = 0;
for(int i = 0 ; i < 8 ; i++)
{
checksum += Buf[i];
}
Buf[8] = checksum;
Buf[9] = '<';
// Envio la trama generada
for(int i = 0 ; i < 10 ; i++)
{
Serial.write(Buf[i]);
}
}