Descripción

Esta vez paso a explicar como realicé este mecanismo de aviso acústico-luminoso, compuesto por tres partes fundamentales.

  1. Un sensor de lluvia de intemperie (parte exterior de la ventana).
  2. Un emisor de RF con indicador luminoso (interior de la ventana).
  3. Un receptor de RF con indicador sonoro-luminoso y programable (en otra habitación). 

La idea surgió cuando mi esposa cansada de los días primaverales en los que el tiempo atmosférico está como loco, acababa enfadada porque  la ropa del tendedero se le mojaba y prefería recogerla para tenderla más tarde cuando el pequeño chaparrón hubiera pasado.

Lógicamente, el asunto sería más fácil sin usar señales de radio frecuencia pues así solo se necesitaría un sensor y un aparato receptor, pero como mi naturaleza es aventurera  pensé que este sería un gran reto y además mejoraría la estética del artefacto pues el receptor podría colocarse en cualquier parte o habitación sin necesidad de estar junto a la ventana. Además se eliminarían cables antiestéticos.

[ngd-single-post-view]

/**********************************
   Juan Carlos Pedrajas del Molino
   20/02/2021

   Termómetro de pared
/**********************************

*/

#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <TM1637.h>
TM1637 pantalla(4, 5);

Adafruit_MLX90614 termometro = Adafruit_MLX90614();

int rojo = 7;
int verde = 8;
int buzz = 2;
int ir = 12;
int pinpresencia = 3;

int brillo = 4;
float tempe;
float ambiente;
boolean presencia = 0;
boolean activado = 0;

float maxima;
float errormaximo = 45;
float errorminimo = 30.0;
float fiebre = 36.3;

void setup() {
  pinMode (rojo, OUTPUT);
  pinMode (verde, OUTPUT);
  pinMode (buzz, OUTPUT);
  pinMode (ir, OUTPUT);
  pinMode (pinpresencia, INPUT);
  Serial.begin(9600);
  delay (1500);
  termometro.begin();
  Serial.println("Inicio");               //Serial
  Serial.println("Testeando...");
  delay (150);
  tone (buzz, 1500);                      // sonido
  delay (100);
  noTone (buzz);
  pantalla.begin();                       //Pantalla 7 segmentos
  pantalla.setBrightness(brillo);
  pantalla.display("HOLA");
  delay(1500);
  pantalla.clearScreen();
  digitalWrite (verde, HIGH);             // Luces indicadoras
  digitalWrite (rojo, LOW);
  delay(200);
  digitalWrite (verde, LOW);
  digitalWrite (rojo, HIGH);
  delay (200);
  digitalWrite (rojo, LOW);
  digitalWrite (ir, HIGH);
  pantalla.display(00.00);
  tone (buzz, 1500);                      // sonido
  delay (100);
  noTone (buzz);
}

void loop() {
  //   ambiente = termometro.readAmbientTempC();
  // tempe = termometro.readObjectTempC();
  presencia = digitalRead (pinpresencia);
  while (presencia == 0) {
    activado = 1;
    digitalWrite (ir, LOW);
    delay (200);
    tempe = termometro.readObjectTempC();
    pantalla.display(tempe);
    if (tempe > maxima) {
      maxima = tempe;
    }
    digitalWrite (ir, HIGH);
    delay (500);
    presencia = digitalRead (pinpresencia);
  }
  if (presencia == 1 && activado == 1) {
    activado = 0;
    //   Serial.println("maxima:");
    //   Serial.println(maxima);
    pantalla.display(maxima);
    delay (200);
    if (maxima <= errorminimo || maxima >= errormaximo) {     // cuando la medida sea demasiado baja o demasiado alta
      tone (buzz, 250);
      delay (400);
      noTone (buzz);
      digitalWrite (verde, HIGH);
      digitalWrite (rojo, HIGH);
      delay(150);
      digitalWrite (verde, LOW);
      digitalWrite (rojo, LOW);
      delay (150);
      digitalWrite (verde, HIGH);
      digitalWrite (rojo, HIGH);
      delay(150);
      digitalWrite (verde, LOW);
      digitalWrite (rojo, LOW);
      delay (150);
      digitalWrite (verde, HIGH);
      digitalWrite (rojo, HIGH);
      tone (buzz, 250);
      delay (1000);
      noTone (buzz);
      digitalWrite (rojo, LOW);
      digitalWrite (verde, LOW);
      pantalla.clearScreen();
    }
    if (maxima <= fiebre && maxima > errorminimo) {  //cuando la medida sea correcta
      digitalWrite (verde, HIGH);
      tone (buzz, 1250);
      delay (100);
      noTone (buzz);
      delay (1500);
      digitalWrite (verde, LOW);
      pantalla.clearScreen();
    }

    if (maxima <= errormaximo && maxima > fiebre) {  //cuando la medida sea de fiebre
      digitalWrite (rojo, HIGH);
      tone (buzz, 250);
      delay (150);
      noTone (buzz);
      delay (150);
      digitalWrite (rojo, LOW);
      delay (150);
      digitalWrite (rojo, HIGH);
      tone (buzz, 250);
      delay (150);
      noTone (buzz);
      delay (150);
      digitalWrite (rojo, LOW);
      delay (150);
      digitalWrite (rojo, HIGH);
      tone (buzz, 250);
      delay (1000);
      noTone (buzz);
      delay (550);
      digitalWrite (rojo, LOW);
      pantalla.clearScreen();
    }
    maxima = 0;
  }
}