#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <TimerOne.h>
// Definimos el pin analógico donde se conecta el sensor
#define DHTPIN A0
// Dependiendo del tipo de sensor
#define DHTTYPE DHT22 // Cambiado a DHT22
// Inicializamos el sensor DHT22
DHT dht(DHTPIN, DHTTYPE);
const char EQUIPO_ID = '1';
const int NUM_SAMPLES = 30;
int Temperatura_Leida = 0;
char flag_1_seg = 0;
int samples[NUM_SAMPLES];
int sampleIndex = 0;
// Variables para el promedio analógico
char Buf[30];
long Suma = 0;
long Promedio = 0;
int contador = 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)
int nuevaLectura = dht.readTemperature();
// Añadimos la nueva lectura al array de muestras
samples[sampleIndex] = nuevaLectura;
sampleIndex = (sampleIndex + 1) % NUM_SAMPLES;
// Calculamos el promedio de las muestras
Temperatura_Leida = calcularPromedio(samples, NUM_SAMPLES);
// Enviamos la temperatura por el puerto serial
enviarTemperaturaSerial(Temperatura_Leida);
}
// Leer el valor analógico de A0
int cuenta = analogRead(A0);
Suma += cuenta;
contador++;
if (contador >= 10)
{
Promedio = Suma / 10;
contador = 0;
Suma = 0;
int Voltage = ((long)Promedio * 5 * 1000) / 1023;
// Imprimir el valor leído en el monitor serie
sprintf(Buf, "Cuentas: %d Volt: %d.%d", cuenta, (Voltage / 1000), (Voltage % 1000));
Serial.println(Buf);
}
delay(1000); // Ajusta este valor según sea necesario
}
int calcularPromedio(int* array, int size)
{
int suma = 0;
for(int i = 0; i < size; i++)
{
suma += array[i];
}
return suma / size;
}
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 q 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]);
}
}
void enviarTemperaturaSerial(int temperatura)
{
char buffer[20];
sprintf(buffer, "Temp: %d C", temperatura);
Serial.println(buffer);
}