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:
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:
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
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.
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.
Programación del emisor:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
/************************************************ 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); } |