Muestra la hora y dispone de un luminoso que avisa de la falta de administración del medicamento como por ejemplo colirio.

A casi todos los medicados crónicos, (en mi caso un colirio para los ojos diario) nos ha pasado que nos acostamos y no recordamos si nos hemos aplicado la medicación o se nos ha olvidado hacerlo.

El reloj que presento se ha encargado de cubrir esa carencia.

Consta de dos partes:

Emisor (bote de cápsulas de desecho de colirio)

Un emisor, que se encuentra en el baño y que actuará cuando detecte que aplico el colirio mediante un led infrarrojo, enviando la señal de medicación tomada al receptor que se encuentra en la mesilla de noche del dormitorio.

Lista de materiales del emisor:

  • Bluethoot HC-05 en modo master.
  • led infrarojo.
  • fotorresistencia infrarrojos (led receptor de infrarrojos).
  • 2 resistencias de 100 ohms.
  • Arduino Nano.
Aspecto del emisor de datos y portador de desechos de colirio.

Receptor (reloj)

Un receptor, que es el reloj de la mesilla de noche en sí mismo con una bombilla led que se ilumina cuando a cierta hora no ha recibido la señal del emisor de medicación tomada.

Lista de materiales para el receptor:

  • Display 7 segmentos grande (50x20mm) TM1637
  • Bluethoot HC-05 en modo esclavo
  • 2 leds y sus resistencias
  • 3 pulsadores
  • Reloj DS3231
  • Fotoresistencia
  • Arduino Nano
  • 1 resistencia de 10k
  • Fuente de alimentación a 5V
Reloj de mesilla de noche receptor de datos. Luz roja indica alarma de medicación.

El reloj de mesilla de noche se encarga de marcar la hora, y la intensidad del display depende de la luz de la habitación, pues cuenta con un sensor de luminosidad que se adaptará a las necesidades lumínicas de la habitación.

Además, dispone de unos leds rojos en las esquinas que se encenderán a una hora determinada para indicar que debe aplicarse la medicación, y permanecerán así encendidas hasta que esto suceda.

Aquí entra en juego el emisor, que consta de un bote dotado con un sensor de infrarrojos que almacenará las dosis sobrantes de colirio. De tal manera que al introducir una cápsula desechable en este tarro, emitirá una señal al reloj de la mesilla de noche para que las luces leds rojas se apaguen, dando así por aplicada la medicación.

De esta manera siempre puedes acostarte con la tranquilidad de que te has aplicado la medicación, pues a veces se olvida y lo recuerdas una vez ya a costado. O piensas que la has aplicado y no es así.

Esquema eléctrico.

Para el emisor

Esquema electrónico del emisor.

En el esquema aparece un led rojo que representa el emisor infrarrojo. El led azul representa el IR (receptor infrarrojo).

Para el receptor

Obsérvese en el esquema que aparece una resistencia lumínica (LDR) que servirá para controlar el brillo de la pantalla dependiendo de la luz de la habitación, procurando un mejor descanso cuando en la habitación haya poca luz.


Partes imprimibles

Receptor:

Se trata de una carcasa de reloj de mesilla de noche, que contiene la fuente de alimentación en su interior, lo que hace un poco peligroso el montaje. Para evitar accidentes, se ha diseñado un seguro contra tirones y caidas en el cable de alimenta con 220V.

Detalle del seguro mordedor.

Como pieza especial tener en cuenta los portadores de los pulsadores, deben acoplarse como en la siguiente imagen.

Estos pulsadores permitirán poder ajustar los minutos y horas del reloj cuando se desajuste, además de poder apagar la alarma desde el propio reloj sin tener que usar el emisor.

Imprimir las piezas de las esquina con forma piramidal que albergarán los leds rojos con material traslúcido.

Emisor

Consta de dos partes unidas por rosca; el bote contenedor y la tapadera que contiene la electrónica.


Programación

Como es lógico antes de programar deberemos vincular los dispositivos Bluetooth. Poner cada uno de ellos en el rol correspondiente (master y esclavo), para ello debemos usar los comandos AT y realizar unos cambios en la configuración de los módulos bluetooth. Como este tema se ha tratado ya en otras entradas del blog, lo pasaremos por alto.

Librerías

Se ha detectado cierto error en la carga del programa de forma aleatoria, ver imagen.

Error aleatorio que desaparece de vez en cuando.

Programación del emisor:

#include <SoftwareSerial.h>
SoftwareSerial BT1(3, 2); // RX | TX
void setup() {
  pinMode (A0, INPUT);
  Serial.begin (9600);
  BT1.begin(9600);
}
void loop() {
  Serial.println (analogRead (A0));
  if (analogRead (A0) >= 720) {
    BT1.write (1);
  }
}

Cuando detecta la ampolla desechable interrumpiendo la luz infrarroja (un valor menor o igual a 720 en A0), envía por bluetooth el carácter «1″ al receptor que interpretará la acción apagando la luz roja de aviso en caso de estar encendida.


Programación del receptor:


/************************************************
   Nombre del proyecto: Reloj de mesilla de noche con recordatorio de aplicación de colirio.

   Programado por Juan Carlos Pedrajas del Molino

   Https:\\www.geniero.es
   pedrajas@geniero.es
   afelio11@gmail.com

   Fecha de inicio: 18/02/22

   Fecha de finalización:26/02/22

   ESQUEMA DE CONEXION

                                           +-----+
              +----[PWR]-------------------| USB |--+
              |                            +-----+  |
              |         GND/RST2  [ ][ ]            |
              |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |
              |          5V/MISO2 [ ][ ]  A4/SDA[ ] |
              |                             AREF[ ] |
              |                              GND[ ] |
              | [ ]N/C                    SCK/13[ ] | TX HC-05
              | [ ]IOREF                 MISO/12[ ] |
              | [ ]RST                   MOSI/11[ ]~|
              | [ ]3V3    +---+               10[ ]~| LED IZQUIERDA
              | [ ]5v    -| A |-               9[ ]~| LED DERECHA
              | [ ]GND   -| R |-               8[ ] |
              | [ ]GND   -| D |-                    |
              | [ ]Vin   -| U |-               7[ ] | BOTON C
              |          -| I |-               6[ ]~| BOTON B
  RX HC-05    | [ ]A0    -| N |-               5[ ]~|
  LDR         | [ ]A1    -| O |-               4[ ] | BOTON A
              | [ ]A2     +---+           INT1/3[ ]~| CLK TM1637
              | [ ]A3                     INT0/2[ ] | DIO TM1637
  SDA DS3231  | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |
  SCL DS3231  | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |
              |            [ ] [ ] [ ]              |
              |  UNO_R3    GND MOSI 5V  ____________/
                \_______________________/

********************************************************************
*/


#include <TimerOne.h>
#include "TM1637.h"
#include <Wire.h>
#include "DS3231.h"
#include <SoftwareSerial.h>

SoftwareSerial BT1(13, A0); // RX | TX
RTClib RTC;
DS3231 Clock;
#define ON 1
#define OFF 0

int8_t TimeDisp[] = {0x00, 0x00, 0x00, 0x00};
unsigned char ClockPoint = 1;
unsigned char Update;
unsigned char halfsecond = 0;
byte second, minute, hour; //variables globales de ajuste

#define CLK 3//pins definitions for TM1637 and can be changed to other ports    
#define DIO 2
TM1637 tm1637(CLK, DIO);

int brillo;
const int izquierda = 10;
const int derecha = 9;
const int botA = 4;
const int botB = 6;
const int botC = 7;
int dato;
boolean colirio = 0;
int toma = 0;
void setup()
{
  //Clock.setHour(19);
  // Clock.setMinute(02);
  // Clock.setSecond(0);
  Serial.begin (9600);
  BT1.begin(9600);
  pinMode (A1, INPUT);
  pinMode (botA, INPUT_PULLUP);
  pinMode (botB, INPUT_PULLUP);
  pinMode (botC, INPUT_PULLUP);
  pinMode (izquierda, OUTPUT);
  pinMode (derecha, OUTPUT);
  tm1637.set(0);
  tm1637.init();
  //  tm1637.set(7);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;

  Timer1.initialize(1000000);//timing for 1000ms
  Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR
  Wire.begin();
  digitalWrite (izquierda, HIGH);
  digitalWrite (derecha, HIGH);

}
void loop()
{
  digitalWrite (izquierda, colirio);
  digitalWrite (derecha, colirio);

  DateTime now = RTC.now();

  if ( now.hour() == 22 &&  now.minute() == 30 && now.second() == 0) {         //Alarma activa a las 22:30 enciende las luces.
    colirio = 1;
  }

  luz ();
  botones();
  bt();

  if (Update == ON)
  {
    TimeUpdate();
  }
}

void bt() {
  if (BT1.available()) {
    dato = BT1.read();
    Serial.println(dato);
    if (dato == 1) {
      colirio = 0;
      dato = 0;
    }
  }
}

void botones() {
  DateTime now = RTC.now();

  if (!digitalRead(botA) || !digitalRead(botB) || !digitalRead(botC)) {
    colirio = 0;
  }

  if (!digitalRead (botC)) {
    if (!digitalRead (botB)) {
      delay (500);
      Clock.setHour(now.hour() + 1);
      Clock.setSecond(0);
      delay (500);
      now = RTC.now();
      if (now.hour() >= 24) {
        Clock.setHour(00);
      }
    }

    if (!digitalRead (botA)) {
      delay (500);
      Clock.setMinute(now.minute() + 1);
      Clock.setSecond(0);
      delay (500);
      now = RTC.now();
      if (now.minute() >= 60) {
        Clock.setMinute(00);
      }
    }
  }
}

void TimingISR()
{
  halfsecond ++;
  Update = ON;
  if (halfsecond == 2) {
    halfsecond = 0;
  }
  ClockPoint = (~ClockPoint) & 0x01;
}

void TimeUpdate(void)
{
  DateTime now = RTC.now();
  if (ClockPoint)tm1637.point(POINT_ON);
  else tm1637.point(POINT_OFF);
  TimeDisp[0] = now.hour() / 10;
  TimeDisp[1] = now.hour() % 10;
  TimeDisp[2] = now.minute() / 10;
  TimeDisp[3] = now.minute() % 10;
  Update = OFF;
}

void luz() {
  int sol = analogRead (A1);
  if (sol <= 250)
    brillo = 5;         //MAXIMO BRILLO ES 7
  if (sol >= 250 )
    brillo = 0;
  tm1637.set(brillo);
  tm1637.display(TimeDisp);
}

En el modelo se añade una placa roja para teñir el color pues el LCD de 7 segmentos era de leds blancos molestando menos en la oscuridad.