Actividad 3#

Adaptación del sistema de monitoreo de temperatura y humedad del ambiente con sensor DHT22

Objetivo: Poner en practica los conceptos de interrupciones y comunicación serial en el sistema de monitoreo desarrollado en la Actividad 1.

Descripción: En esta actividad, se realizará una adaptación del sistema de monitoreo de temperatura y humedad del ambiente utilizando el sensor DHT22. Se partirá del código de Arduino desarrollado en la actividad mencionada y se realizarán las modificaciones necesarias. El sistema debe obtener datos precisos de temperatura y humedad del ambiente utilizando el sensor DHT22 e implementará una tasa de muestreo fija para tomar las mediciones en intervalos regulares. Además, se debe añadir la funcionalidad de enviar los datos recopilados por el puerto serial únicamente cuando se reciba un comando específico.

También, además del LED que se enciendecuando la temperatura supere un umbral predefinido, se debe agregar un LED adicional que parpadeará constantemente, simulando un indicador de funcionamiento del sistema.

Para llevar a cabo esta adaptación, se realizarán modificaciones en el código de Arduino, incorporando interrupciones para manejar la toma de datos el estado del LED.

A continuación se presenta la solución

#include <DHT.h>

// Declaración de pines
#define DHTPIN 2         // Pin digital para el sensor DHT22
#define IND_LEDPIN 3     // Pin digital para el LED indicador
#define OT_LEDPIN 4      // Pin digital para el LED de sobre temperatura

// Constante para el tipo de sensor DHT
#define DHTTYPE DHT22         // Tipo de sensor DHT22

// Umbral de temperatura para encender el LED
const float TEMPERATURE_THRESHOLD = 25.0;    // Umbral de temperatura en grados Celsius

// Banderas y contadores para las interrupciones
volatile int measureCounter = 0;
volatile int ledCounter = 0;
volatile int measureFlag = 0;
volatile int LedFlag = 0;

// Bandera para el envio de datos
int sendFlag = 0;

// Variables a medir
float temperature = 0;
float humidity = 0;

// Inicialización del sensor DHT
DHT dht(DHTPIN, DHTTYPE);

void setup() {
    // Iniciar comunicación serial
    Serial.begin(115200);

    // Configurar el pin del LED como salida
    pinMode(OT_LEDPIN, OUTPUT);
    pinMode(IND_LEDPIN, OUTPUT);

    // Iniciar el sensor DHT
    dht.begin();
    init_Timer();
    Serial.println("Sistema inciado");
}

void loop() {

    if (measureFlag == 1){
        measureFlag = 0;
        measure();
    }

    if (sendFlag == 1){
        sendFlag = 0;
        send_measurement();
    }

    if (LedFlag == 1){
        LedFlag = 0;
        digitalWrite(IND_LEDPIN, !digitalRead(IND_LEDPIN));
    }

    // Encender el LED si la temperatura supera el umbral
    if (temperature > TEMPERATURE_THRESHOLD) {
        digitalWrite(OT_LEDPIN, HIGH);    // Encender el LED
    } else {
        digitalWrite(OT_LEDPIN, LOW);     // Apagar el LED
    }

}


void init_Timer(){
    /* Con esta configuración se creara una interrupción cada 100 ms usando el Timer1
        y un preescalar de 256.
        Calculos:
        clock --> 16 Mhz
        Prescalar --> 256;
        velocidad de Timer 1= 16Mhz/256 = 62500 Hz
        Pulso = 1/62500 hz =    16us
        Contador = 100 ms / 16us = 6250
    */
    cli();                // Se deshabilitan las interrupciones 
    TCNT1 = 0;	          // Se reinicia el contador del Timer 1.
    TCCR1A = 0;           // Se reinicia todo el registro TCCR1A
    TCCR1B = 0;           // Se reinicia todo el registro TCCR1A
    TCCR1B |= B00001000;    // Se pone el bit WGM12 en 1 para habilitar el modo Compare Match
    TCCR1B |= B00000100;	// Se pone CS12 en 1 y los demás en cero, es decir un preescalar de 256
    TIMSK1 |= B00000010;	// Se habilita la interrupción por compare mathc
    OCR1A = 6250;        // Se define el registo de comparacion A en este valor
    sei();                // Se habilitan las interrupciones
}

ISR(TIMER1_COMPA_vect){
    measureCounter++;

    // Frecuencia de muestreo de 200 ms
    if (measureCounter == 2){
        measureCounter = 0;
        measureFlag = 1;
    }

    // Frecuencia del Led indicador de 0.5s
    ledCounter++;
    if (ledCounter == 5)
    {
        ledCounter = 0;
        LedFlag = 1;
    }
}


void serialEvent(){
    // Si llega algo por el puerto serial se lee y se verifica si corresponde al comando ENVIAR
    String cmd = Serial.readStringUntil("\r\n");
    if (cmd == "ENVIAR") sendFlag = 1;
}


void measure(){
    // Leer la temperatura y la humedad del sensor DHT
    temperature = dht.readTemperature();
    humidity = dht.readHumidity();
}


void send_measurement(){
    // Envia la temperatura y la humedad por serial
    Serial.print("Temperatura (°C): " + String(temperature));
    Serial.print(",");
    Serial.println("Humedad (%): " + String(humidity));
}

Note

Tenga en cuenta que hay que verificar con que caracter de finalización de linea se envían los comandos en su implementación. En algunas ocaciones puede ser \n, mientras que en otras es \r\n. De acuerdo a esto, adapte la rutina de recepción del comando ENVIAR.

Opcional

Puede tratar de implementar la escritura de los pines por medio de los registros.