Arduo Memory Reminder Medicine

Un saluto a tutti ! :blush:

Vorrei sottoporVi un quesito: mi sapete dire se esiste già uno stretch per la gestione di diversi promemoria/ricorrenze con arduino uno ?

Ho cercato sul forum di arduino, ma senza esito.
O cerco male, o nessuno ancora ha realizzato qualcosa di simile.

Ho cercato sul web, ed ho trovato diversi devices a costo basso, ma poco pratici per le persone anziane e con poche funzioni di programmazione (es. allarmi ripetitivi ogni 2-4-6-8-12 ore).

Pensavo di realizzarne uno molto semplice ma più versatile nella programmazione per ricordare ai miei genitori, che sono anziani, di prendere le medicine rispettando i tempi corretti, eventualmente indicando quale medicina prendere e chi deve assumerla.

Quelli in commercio, sono tascabili per uso pillole (da ricaricare, cosa difficoltosa per gli anziani) e poco intuibili per l'uso, per le dimensioni ed i tasti da premere.

La persona, dovrebbe semplicemente essere avvisata con un buzzer e/o spia luminosa, leggere il tipo di medicina e semplicemente premere un pulsante per arrestare la segnalazione.

Ho messo in cantiere una prima versione R.0.0a utilizzando arduino uno, che si può programmare con una tastiera PS2, visualizzare il medicinale da assumere e chi, tramite un LCD 16x2, un cicalino per la segnalazione sonora, un led rosso lampeggiante per visualizzare lo stato della ricorrenza ed uno giallo per visualizzare la mancata assunzione.

Il progetto che posterò quanto prima, l'ho chiamato Arduo Memory Reminder che troverete all'indirizzo:

Nel frattempo chiedo cortesemente, a chi avesse voglia di collaborare, di indicarmi se esiste già qualcosa di simile od eventualmente se ha idee sullo sviluppo o la realizzazione hardware e software diversi dal mio progetto.

Vi ringrazio per l'attenzione dedicata.

Ciao.

:wink:
Giuseppe G.

per la gestione di vari task, per un controllo preciso del tempo ti consiglio le varie librerie di leo72 dagli un'occhiata
looper
swrtc
leOS

io userei un rtc in abbinata ad un piccolo speaker che, tramite la libreria opportuna (non ricordo quale :() dice tipo: "Prendere la medicina XXXX"

Ottima idea, mi è venuto in mente che piggiando il tasto prima di prendere la pillola la scritta deve rimanere visualizzata nel display e solo il buzzer deve spegnersi, questo per evitare che spegnendolo prima ci si scordi qual'è la pillola da prendere, magari suona il telefono o suonano alla porta o va via la corrente, insomma un'imprevisto.

Ho anche io mia madre anziana ma lei è un computer, vuoi sapere il numeri di telefono della televendita o dell'enel ecc, basta chiedere a lei e per le pillole uguale, speriamo continui così.

Ci vorrebbe anche uno storico delle pillole prese e quelle mancate, cioè forse solo quelle mancate. Le funzioni base richiedono un orologgio, con RTC hardware si può fare anche il calendario perpetuo, con quello software anche ma le dimensioni dello scketch aumentano.

Le librerie software ci sono come dice "ale", quindi una prima versione totalmente software si può fare agevolmente, poi se le cose si complicano si vede si inserire un rtc hardware.

Io sono sempre disponibile a disegnare lo schema e il pcb con kicad.

Ciao.

MauroTec:
Ottima idea, mi è venuto in mente che piggiando il tasto prima di prendere la pillola la scritta deve rimanere visualizzata nel display e solo il buzzer deve spegnersi, questo per evitare che spegnendolo prima ci si scordi qual'è la pillola da prendere, magari suona il telefono o suonano alla porta o va via la corrente, insomma un'imprevisto.

Ho anche io mia madre anziana ma lei è un computer, vuoi sapere il numeri di telefono della televendita o dell'enel ecc, basta chiedere a lei e per le pillole uguale, speriamo continui così.

Ci vorrebbe anche uno storico delle pillole prese e quelle mancate, cioè forse solo quelle mancate. Le funzioni base richiedono un orologgio, con RTC hardware si può fare anche il calendario perpetuo, con quello software anche ma le dimensioni dello scketch aumentano.

Le librerie software ci sono come dice "ale", quindi una prima versione totalmente software si può fare agevolmente, poi se le cose si complicano si vede si inserire un rtc hardware.

Io sono sempre disponibile a disegnare lo schema e il pcb con kicad.

Ciao.

un altra idea intelligiente sarebbe quella di mettere delle scatoline di plexyglass con le scatole delle medicine in scatole diverse e far aprire le porticine alle scatoline con le medicine da prendere

Se si sceglie di usare RTC hardware il microcontroller non necessita di quarzo e basta l'oscillatore esterno, il quarzo invece è necessario per il soft RTC, ma c'è da tenere in conto l'errore, ma alla fine anche se ogni mese si imposta l'orario non penso sia un problema.

L'alimentazione dovrebbe essere a batteria per dare la possibilità di portarselo dietro e quindi anche le dimensioni devono essere piccole, il massimo sarebbe di fare due unità, quella fissa alimentata a tensione di rete e quella portatile a batteria. L'unita fissa eroga le pillole e quella portatile oltre a suonare serve per fornire le informazioni alla unita fissa, in questo modo più portatili possono essere realizzati, quindi uno per ogni persona.

L'unità portatile viene inizializzata con nome ecc e gli orari, quando questa unità viene inserita nella unita fissa questa eroga la pillola coretta, occhio che se qualcuno non ha preso la pillola dal vassoio ci possono essere più pillole creando confusione, quindi prima di erogare la pillola il vassoio si deve svuotare in automatico.

Ok fantascienza, ma tutte cose che si possono fare, complicate ma si possono fare.

Ciao.

MauroTec:
Se si sceglie di usare RTC hardware il microcontroller non necessita di quarzo e basta l'oscillatore esterno, il quarzo invece è necessario per il soft RTC, ma c'è da tenere in conto l'errore, ma alla fine anche se ogni mese si imposta l'orario non penso sia un problema.

L'alimentazione dovrebbe essere a batteria per dare la possibilità di portarselo dietro e quindi anche le dimensioni devono essere piccole, il massimo sarebbe di fare due unità, quella fissa alimentata a tensione di rete e quella portatile a batteria. L'unita fissa eroga le pillole e quella portatile oltre a suonare serve per fornire le informazioni alla unita fissa, in questo modo più portatili possono essere realizzati, quindi uno per ogni persona.

L'unità portatile viene inizializzata con nome ecc e gli orari, quando questa unità viene inserita nella unita fissa questa eroga la pillola coretta, occhio che se qualcuno non ha preso la pillola dal vassoio ci possono essere più pillole creando confusione, quindi prima di erogare la pillola il vassoio si deve svuotare in automatico.

Ok fantascienza, ma tutte cose che si possono fare, complicate ma si possono fare.

Ciao.

non è complesso: bastano un paio di servi e una comunicazione i2c con la base, al posto della tastiera ps2 userei un chatpad x xbox360 (7 euro usato) che spara fuori i dati in seriale, è piccolo e compatto e retroilluminato!!!

:slight_smile:
Ok !!!
Grazie a tutti per le idee consigliate, che verranno tenute in considerazione nelle prossime release.

Ad esempio, tacitare solo il sonoro e poi solo dopo un certo tempo o alla pressione nuova del tasto, far scomparire il messaggio, è una buona idea, come allo stesso tempo, utilizzare una cassettiera in primis, aperta, con la numerazione delle medicine da assumere ed eventualmente crearne una comandata da un passopasso che mi permette di assumere la medicina corretta aprendo lo sportello giusto è altrettanto utile.

Mentre, per la gestione della memorizzazione delle medicine assunte e quelle mancate, occorre snellire prima il programma, poi, inserire una memory esterna dove archiviare il tutto e vedere se abbiamo ancora pin in/out disponibili per questo.

Fantascienza :astonished:, abbiamo creato così un distributore di medicine automatico !!!!!!
ATTENZIONE !!!! Se le medicine vengono poi assunte in modo sbagliato per un malfunzionamento, chi ne risponde.

Torniamo in noi.
Al momento ho provato questo listato perfettamente funzionante (a parte il clock non precisissimo) che andrebbe semplificato utilizzando dei vettori per la memorizzazione dei parametri.

Chi se la sente ? :smiley:

NB.: Il listato completo lo trovate postato qui ( http:/www.arduomemory.blogspot.com ) per problemi di spazio del post del forum 'max 9500 chars'.

/*
ArduoMemory R.0.0a

Revision:0.0a
Date 22/09/2012

Invent & Create by Giuseppe G. 04/09/2012


Compiling & Tested with IDE Arduino 1.0.1 & S.O. Win7

Main board: ARDUINO UNO R.2


  The circuit display:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 7
 * LCD D5 pin to digital pin 6
 * LCD D6 pin to digital pin 5
 * LCD D7 pin to digital pin 4
 * LCD R/W pin to ground
 * 10K resistor trimmer:
 * ends to +5V and ground
 * wiper to LCD VO pin
 
 */

// include the library code:
#include <LiquidCrystal.h>
#include <PS2Keyboard.h>
#include <Time.h>


//declaration variables
const int DataPin = 3;  	//data keyboard
const int IRQpin =  2;  	//clock IRQ
const int pushPin = 13;        	// internal LED connected to digital pin 13
const int buzzer = 8;          	// buzzer pin 8
const int ledmem = 9;          	// led memory alarm pin 9
const int ledalarm = 10;       	// led alarm active pin 10

int push = 0;            // variable status botton
int prg = 0;             // variable status program configuration
int memalarm = 0;        // variable status alarm
int m_old = 0;           // memory old minute alarm
int alarm = 0;           // alarm active

int sel = 0;              // select view alarms
int lamp = 0;             // blink on/off
int sold = 0;             // memory second old

int tast = 0;             // value increase / decrease parameter
int ho_old=0;             // mem old hour set
int mi_old=0;             // mem old minute set
int da_old=0;             // mem old day set
int mo_old=0;             // mem old month set
int ye_old=0;             // mem old year set

int alm_h = 0;           // variable alarm hour view
int alm1_h = 0;          // variable hour alarm 1
int alm2_h = 0;          // variable hour alarm 2
int alm3_h = 0;          // variable hour alarm 3
int alm4_h = 0;          // variable hour alarm 4
int alm5_h = 0;          // variable hour alarm 5
int alm6_h = 0;          // variable hour alarm 6
int alm7_h = 0;          // variable hour alarm 7
int alm8_h = 0;          // variable hour alarm 8
int alm9_h = 0;          // variable hour alarm 9
int alm10_h = 0;          // variable hour alarm 10
int alm11_h = 0;          // variable hour alarm 11
int alm12_h = 0;          // variable hour alarm 12
int alm13_h = 0;          // variable hour alarm 13
int alm14_h = 0;          // variable hour alarm 14
int alm15_h = 0;          // variable hour alarm 15
int alm16_h = 0;          // variable hour alarm 16
int alm17_h = 0;          // variable hour alarm 17
int alm18_h = 0;          // variable hour alarm 18
int alm19_h = 0;          // variable hour alarm 19
int alm20_h = 0;          // variable hour alarm 20

int alm_m = 0;           // variable alarm minute view
int alm1_m = 0;          // variable minute alarm 1
int alm2_m = 0;          // variable minute alarm 2
int alm3_m = 0;          // variable minute alarm 3
int alm4_m = 0;          // variable minute alarm 4
int alm5_m = 0;          // variable minute alarm 5
int alm6_m = 0;          // variable minute alarm 6
int alm7_m = 0;          // variable minute alarm 7
int alm8_m = 0;          // variable minute alarm 8
int alm9_m = 0;          // variable minute alarm 9
int alm10_m = 0;          // variable minute alarm 10
int alm11_m = 0;          // variable minute alarm 11
int alm12_m = 0;          // variable minute alarm 12
int alm13_m = 0;          // variable minute alarm 13
int alm14_m = 0;          // variable minute alarm 14
int alm15_m = 0;          // variable minute alarm 15
int alm16_m = 0;          // variable minute alarm 16
int alm17_m = 0;          // variable minute alarm 17
int alm18_m = 0;          // variable minute alarm 18
int alm19_m = 0;          // variable minute alarm 19
int alm20_m = 0;          // variable minute alarm 20

int med = 0;              // variable alarm medicinale view
int med1 = 0;             // medical alarm 1
int med2 = 0;             // medical alarm 2
int med3 = 0;             // medical alarm 3
int med4 = 0;             // medical alarm 4
int med5 = 0;             // medical alarm 5
int med6 = 0;             // medical alarm 6
int med7 = 0;             // medical alarm 7
int med8 = 0;             // medical alarm 8
int med9 = 0;             // medical alarm 9
int med10 = 0;             // medical alarm 10
int med11 = 0;             // medical alarm 11
int med12 = 0;             // medical alarm 12
int med13 = 0;             // medical alarm 13
int med14 = 0;             // medical alarm 14
int med15 = 0;             // medical alarm 15
int med16 = 0;             // medical alarm 16
int med17 = 0;             // medical alarm 17
int med18 = 0;             // medical alarm 18
int med19 = 0;             // medical alarm 19
int med20 = 0;             // medical alarm 20

int pat = 0;              // variable alarm patient
int pat1 = 0;             // patient alarm 1
int pat2 = 0;             // patient alarm 2
int pat3 = 0;             // patient alarm 3
int pat4 = 0;             // patient alarm 4
int pat5 = 0;             // patient alarm 5
int pat6 = 0;             // patient alarm 6
int pat7 = 0;             // patient alarm 7
int pat8 = 0;             // patient alarm 8
int pat9 = 0;             // patient alarm 9
int pat10 = 0;             // patient alarm 10
int pat11 = 0;             // patient alarm 11
int pat12 = 0;             // patient alarm 12
int pat13 = 0;             // patient alarm 13
int pat14 = 0;             // patient alarm 14
int pat15 = 0;             // patient alarm 15
int pat16 = 0;             // patient alarm 16
int pat17 = 0;             // patient alarm 17
int pat18 = 0;             // patient alarm 18
int pat19 = 0;             // patient alarm 19
int pat20 = 0;             // patient alarm 20

PS2Keyboard keyboard;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 4, 5, 6, 7);
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //standard configuration

void setup() {
  pinMode(pushPin, INPUT);      // sets the digital pin 13 as input

  // set up the LCD's number of columns and rows: 
  keyboard.begin(DataPin, IRQpin);
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("ArduoMemory_R0.0");
  //setTime(hr,min,sec,day,month,yr);
  setTime(12,0,0,4,9,2012);
  digitalWrite(ledmem, HIGH);
  digitalWrite(ledalarm, HIGH);
  digitalWrite(buzzer, HIGH);
  delay (2000);
  //lcd.setCursor(0, 0);
  lcd.clear();
  digitalWrite(ledmem, LOW);
  digitalWrite(ledalarm, LOW);
  digitalWrite(buzzer, LOW);
}// end setup

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



etc......................

Sono previsti 20 allarmi, 99 medicine, 99 pazienti.
Gli allarmi sono attivi, solo se il medicinale ha un valore diverso da zero.

Utilizzo le librerie:
time.h per il conteggio del tempo
PS2keyboard.h per la configurazione dei parametri
LiquidCrystal.h per la visualizzazione delle funzioni

Premendo il tasto PagUP, entro nella configurazione dell' ora e della data
Premendo il tasto PagDW, entro nella configurazione dei parametri degli allarmi, da AL1 a AL20
Premendo il tasto FrecciaUP, incremento il dato in editing
Premendo il tasto FrecciaDW, decremento il dato in editing
Premendo il tasto ENTER, confermo il dato inserito e passo al successivo
Premendo il tasto ESC, esco dalla configurazione o resetto la memoria dell'ultimo allarme

A Voi la parola.

PS.: Tenete conto che è da circa 1 anno che non programmo in C, e che ho preso spunto da esempi disponibili in rete nelle singole librerie.

Ciao.
Giuseppe G.

io non voglio creare un macchinario che fa uscire la singola medicina, abilita l'accesso alle scatole giuste, visto che si aprono tutte contemporaneamente è a cura del paziente sapere quale va presa prima e quale dopo

@giuseppe:
Stai usando degli int per memorizzare dei dati che starebbero benissimo in un byte, ad esempio le ore vanno da 0 a 23, perché usare un tipo int che occupa 2 byte quando c'è il tipo byte che ne occupa solo 1 e che va come valori da 0 a 255?
Quindi con 80 variabili hai già occupato 160 byte dei 2048 della SRAM.

Inoltre per praticità io userei degli array, perché così puoi scorrere con dei semplici indici alla ricerca degli allarmi. Senza di essi sei costretto a farti 2 if differenti per controllare i 20 allarmi.

Un saluto a tutti! :wink:

Ecco la revisione R0.1 di ArduoMemoryReminder.
Come consigliato, ho rivisto l'utilizzo delle veriabili ed inserimento degli array.
Inserito memoria visiva dopo acqusizione con nome della medicina attiva sul display per ancora 59 secondi.

Il codice, occupa cosi meno della metà della versione R0.0a

Ho inserito altri 4 allarmi giornalieri, per un totale di 24.

Testato su PC con Win7 ed IDE R.1.0.1.

come al solito è troppo lungo per postarlo qui, lo trovate sempre qui: http://www.arduomemory.blogspot.com

/*

ArduoMemoryReminder R.0.1

Revision:0.1 (about 10kbytes of sketch)
Date:24/09/2012
1- Use memory byte for reduction locations ram memory
2- Insert use of array for reduction sketch program
3- Increase 4 alarm for a total of 24 per day
4- View old memory medicine for one minute after acknoleg

Caracteristics:

max 24 alarms
max 99 patient
max 99 medicine

1 led alarm
1 led memory
1 buzzer for noise alarm


OLD VERSIONS Software
____________________________________________________
Revision:0.0a (about 20kbytes of sketch)
Date 22/09/2012
Program base
____________________________________________________


Invent & Create by Giuseppe G. 04/09/2012
To remind you to take medication daily.

  The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 7
 * LCD D5 pin to digital pin 6
 * LCD D6 pin to digital pin 5
 * LCD D7 pin to digital pin 4
 * LCD R/W pin to ground
 * ends to +5V and ground
 * wiper to LCD VO pin (10K resistor trimmer)
 * buzzer + digital pin 8
 * led red alarm digital pin 10
 * led yellow memory digital pin 9
 * PS2 Data digital pin 3
 * PS2 Clock digital pin 2
 * PS2 power to +5V and ground
 */

// include the library code:
#include <LiquidCrystal.h>
#include <PS2Keyboard.h>
#include <Time.h>
//#include <TimeAlarms.h>

//declaration variables
const byte DataPin = 3;  //data keyboard
const byte IRQpin =  2;  //clock IRQ
const byte pushPin = 13;        // internal LED connected to digital pin 13
const byte buzzer = 8;          // buzzer pin 8
const byte ledmem = 9;          // led memory alarm pin 9
const byte ledalarm = 10;       // led alarm active pin 10

byte push = 0;            // variable status botton
int prg = 0;             // variable status program configuration
byte memalarm = 0;        // variable status alarm
int m_old = 0;           // memory old minute alarm
byte alarm = 0;           // alarm active

int sel = 0;              // select view alarms
byte lamp = 0;             // blink on/off
byte sold = 0;             // memory second old

int tast = 0;             // value increase / decrease parameter
int ho_old=0;             // mem old hour set
int mi_old=0;             // mem old minute set
int da_old=0;             // mem old day set
int mo_old=0;             // mem old month set
int ye_old=0;              // mem old year set

byte alm_h[24];           // array variable alarm hour view

byte alm_m[24];           // array variable alarm minute view

byte med[24];              // array variable alarm medicinale view

byte pat[24];              // array variable alarm patient

PS2Keyboard keyboard;  //enable keyboard functions

// initialize the library with the numbers of the interface pins
  LiquidCrystal lcd(12, 11, 4, 5, 6, 7);
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //standard configuratione

void setup() {
  pinMode(pushPin, INPUT);      // sets the digital pin 13 as input

  // set up the LCD's number of columns and rows: 
  keyboard.begin(DataPin, IRQpin);
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("ArduoMemory_R0.1");
  //setTime(hr,min,sec,day,month,yr);
  setTime(12,0,0,4,9,2012);
  //test leds and buzzer for 2 second
  digitalWrite(ledmem, HIGH);
  digitalWrite(ledalarm, HIGH);
  digitalWrite(buzzer, HIGH);
  delay (2000);
  //lcd.setCursor(0, 0);
  lcd.clear();
  digitalWrite(ledmem, LOW);
  digitalWrite(ledalarm, LOW);
  digitalWrite(buzzer, LOW);
}// end setup

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



etc.................

Inizierò ad usarlo così, testandolo con i miei genitori. Poi eventualmente riporterò altre modifiche per renderlo ancora più semplice nella comprensione.

Ciao.
Giuseppe G.

Caro Giuseppe,
purtroppo anche io ho avuto a che fare con il tuo problema e parlo perciò con cognizione di causa.
A mio avviso dovresti partire dal presupposto che i pazienti non siano autosufficienti e, cioè, incapaci di fare quelle azioni che si considerano elementari (leggere, udire e tradurre in azioni quanto appreso).
Probabilmente (e per tua fortuna), i tuoi genitori non sono in questo stato e quindi hai fatto un dispositivo per pazienti autosufficienti (non a caso lo hai chiamato "reminder").
Ma per gli altri, invece, il reminder potrebbe non essere sufficiente e dovresti aumentare il grado di automazione del dispositivo.
Mi riferisco al fatto che dai per scontato che una volta letto il messaggio il paziente esegua l'azione corrispondente (prenda il farmaco nella quantità indicata dal medico).
Io avevo risolto il problema con un contenitore porta pillole settimanale a 14 scomparti (7 per la mattina e 7 per la sera) removibili (per facilitare l'estrazione delle pillole) e caricato settimanalmente da me (non ci si può fidare delle badanti che magari non conoscono l'italiano).
Con Arduino se ne potrebbe fare una soluzione Hi-Tech che illumina con un LED lo scomparto da utilizzare.
Questo vale per pillole e compresse (anche le "mezze" pillole), ma non per i farmaci liquidi, ma comunque sarebbe un buon inizio.
Ettore Massimo Albani

ale92:
per la gestione di vari task, per un controllo preciso del tempo ti consiglio le varie librerie di leo72 dagli un'occhiata
looper
swrtc
leOS

Aggiungerei alla lista l'ottima libreria Time.

Fantastica idea cyberhs :slight_smile:

Occorre gestire gli ultimi 6 pin liberi per controllare i vari led, eventualmente in multiplex !!!

Vediamo, abbiamo a disposizione 6 pin analog non usati, + 2 pin led, per un totale di 8.

Utilizzando un convertitore Es. HC138 decoder multiplexer 3/8, si riesce ad arrivare ad un massimo di
8 x 5 (pin rimasti) = 40 tipi di medicine con singola segnalazione a led.

Ottimo !!!!

Provvedo subito alla gestione di comando dei led.

Grazie ancora per l'info.

Ciao.
Giuseppe G.

:grin:

In test la revisione 0.5 di ArduoMemoryReminderMedicine.

Sta funzionando alla grande !!!!

Operazioni eseguite dalla Rev. 0.1 alla 0.5
Qualche bug sull' RTC (al momento corretta con auto ADJ alle 23:59 di tutti i giorni) e sulla gestione degli allarmi con gli stessi orari, al momento viene visualizzato l'ultimo esaminato.
Rimossa la libreria PS2keyboard, ed inseriti 3 pulsanti per la configurazione dei parametri
Sistemati vari bug's relativi all'acquisizione dell'allarme
Snellito sketch con incremento degli help per la comprensione in lingua inglese (circa 15Kbyte compilato)
Semplificazione configurazione parametri.

Appena verificato il corretto funzionamento ed efficacia della Rev. 0.5, (onde evitare brutte figure) probabilmente posterò la versione che comprenderà:
2 pazienti
16 allarmi giornalieri per il paziente 1 con 16 led di segnalazione rosso delle medicine da assumere
16 allarmi giornalieri per il paziente 2 con 16 led di segnalazione giallo delle medicine da assumere
oppure
32 allarmi giornalieri per il paziente con 32 led di segnalazione delle medicine da assumere

quindi gestione di 32 medicine in totale al giorno

Funzioni disponibili:
-completa configurazione dei parametri da 3 pulsanti
-lampeggio del led della medicina con memoria
-segnalazione sonora dell' allarme gestito dalla libreria "tone" con speaker

Ho seguito il consiglio di utilizzare :

  • degli scompartimenti per le medicine (cassetti o bacheca)
  • dei led per segnalare da quale scompartimento prelevare la medicina
  • la memorizzazione delle medicine da prendere con segnalazione lampeggiante e fissa quando acquisite

Ho aggiunto :

  • la semplicità di programmazione e comprensione con l'utilizzo di soli 3 tasti (Enter/Up/Down)
  • la possibilità di personalizzare il suono di allarme (dall' IDE di Arduino)
  • parametri di default (prima installazione)
  • batteria tampone nel caso di mancanza di corrente
  • impostazione dell' ora/data
  • test audio e test led's all' avvio
  • auto tacitazione allarme se non acquisito
  • auto reset allarme dopo tempo di mancanza assunzione medicinale

Un saluto a tutti.

A presto. :wink:

Giuseppe G.

Un saluto a tutti. :blush:

Ecco la presentazione della versione definitiva testata postata sul sito.

Entro il mese corrente, realizzerò un filmato e posterò tutto il progetto completo.

Intanto, un info per chi voleva realizzare il distributore automatico, visitate questo sito per prendere spunto:

Ciao.
Giuseppe G.

Un suggerimento. Dimezzeresti l'utilizzo di SRAM dichiarando tutte le variabili in cui conservi gli allarmi in forma di ore e minuti di tipo byte invece che di tipo int. Un int occupa 2 byte in SRAM, il byte appunto 1 byte. Dato che le ore non possono assumere un valore maggiore di 23 ed i minuti un valore maggiore di 59, il byte ti basta ed avanza.

:wink: Ciao Leo72.

giusta osservazione, nella versione definitiva collaudata ho utilizatto gli array di byte, proprio come consigli tu, ed ho creato una struttura un pelino più complessa per risparmiare codice.

Ho inserito un parametro per correggere l'errore del calcolo orario di circa 46 sec al giorno che ha il mio arduino uno r2 con intervento automaticamente alle 23.59.

Ora come parametri di programmazione vorrei inserire l'ora legale, la selezione della lingua, l'off-set di correzione ora giornaliera, un elenco delle ultime 10-20 medicine non assunte in base allo spazio in memoria disponibile.

Riguardo proprio a questo, qualcuno mi sà dire come calcolare lo spazio occupato nella SRAM dalle variabili ?

Ciao e grazie.
Giuseppe G.

Per conoscere la Ram disponibile utilizza questa funzione:

int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
  }

Saluti

Nicola

:stuck_out_tongue_closed_eyes:

Ok!! Grazie Nicola per l'info, la proverò quanto prima.

Mi puoi però dare qualche info per l'utilizzo? Non sono un esperto di SW.

L'unica cosa che posso immaginare, è l' utilizzo della variabile "v" che mi ritornerà immagino, il valore di byte liberi.

Ciao,