Device for my son medicine

Hi There
I am trying to setup a device for setting a reminder for my son medicine, the functionality would be if we give him medicine then press the bottom which turn light to green if we forget to give medicine by 10PM then it will generate an alarm , he has a rare.life threading disease where he must have medicine at specific time otherwise he will go into coma.
here is the code I have done, the light works with bottom but the timer not working
can someone help please

regards

Adam

// include library to read and write from flash memory
#include <EEPROM.h>
#include <WiFi.h>
#include <time.h>
String time_str;
const char* ssid = "********";
const char* password = "******";
const char
ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 39600;
const int daylightOffset_sec = 3600;
// define the number of bytes you want to access
#define EEPROM_SIZE 1

// constants won't change. They're used here to set pin numbers:

const int buttonPin = 4; // the number of the pushbutton pin
const int ledPin = 16; // the number of the LED pin
const int ledPin2 = 17; // the number of the LED pin
const int ledPin3 = 5; // the number of the LED pin
const int val = 0;
// Variables will change:
int ledState = HIGH; // the current state of the output pin
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

void setup()
{
Serial.begin(115200);

Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
//init and get the time
configTime(5*3600, 3600, "pool.ntp.org");
printLocalTime();

//disconnect WiFi as it's no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
// initialize EEPROM with predefined size
EEPROM.begin(EEPROM_SIZE);

pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
// read the last LED state from flash memory
ledState = EEPROM.read(0);
// set the LED to the last stored state
digitalWrite(ledPin, ledState);
digitalWrite(ledPin2, !ledState);

}

void loop() {
// read the state of the switch into a local variable:
int reading = digitalRead(buttonPin);
// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH), and you've waited long enough
// since the last press to ignore any noise:

// If the switch changed, due to noise or pressing:
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}

if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer than the debounce
// delay, so take it as the actual current state:

// if the button state has changed:
if (reading != buttonState) {
  buttonState = reading;

  // only toggle the LED if the new button state is HIGH
  if (buttonState == HIGH) {
    ledState = !ledState;
  }
}

}
// save the reading. Next time through the loop, it'll be the lastButtonState:
lastButtonState = reading;

// if the ledState variable is different from the current LED state
if (digitalRead(ledPin)!= ledState) {
Serial.println("State changed");
// change the LED state
digitalWrite(ledPin, ledState);
digitalWrite(ledPin2, !ledState);
digitalWrite(ledPin3, !ledState);
// save the LED state in flash memory
EEPROM.write(0, ledState);
EEPROM.commit();
Serial.println("State saved in flash memory");
}

{

digitalRead (ledpin, 1)
Serial.println("alarm");

}
}

don't take any chance with a home made contraption....I you have a bug and something bad happen...

I agree. Please buy a reliable alarm/reminder device. If you still want to build a second device for enjoyment, we are happy to help.

1 Like

I took the liberty to place your code in the right format so I can read it.

// include library to read and write from flash memory
#include <EEPROM.h>
#include <WiFi.h>
#include <time.h>
String time_str;
const char* ssid = "********";
const char* password = "******";
const char ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 39600;
const int daylightOffset_sec = 3600;
// define the number of bytes you want to access
#define EEPROM_SIZE 1

// constants won't change. They're used here to set pin numbers:

const int buttonPin = 4; // the number of the pushbutton pin
const int ledPin = 16; // the number of the LED pin
const int ledPin2 = 17; // the number of the LED pin
const int ledPin3 = 5; // the number of the LED pin
const int val = 0;
// Variables will change:
int ledState = HIGH; // the current state of the output pin
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

void setup()
{
Serial.begin(115200);

Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
//init and get the time
configTime(5*3600, 3600, "pool.ntp.org");
printLocalTime();

//disconnect WiFi as it's no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
// initialize EEPROM with predefined size
EEPROM.begin(EEPROM_SIZE);

pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
// read the last LED state from flash memory
ledState = EEPROM.read(0);
// set the LED to the last stored state
digitalWrite(ledPin, ledState);
digitalWrite(ledPin2, !ledState);

}

void loop() {
// read the state of the switch into a local variable:
int reading = digitalRead(buttonPin);
// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH), and you've waited long enough
// since the last press to ignore any noise:

// If the switch changed, due to noise or pressing:
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}

if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer than the debounce
// delay, so take it as the actual current state:

// if the button state has changed:
if (reading != buttonState) {
  buttonState = reading;

  // only toggle the LED if the new button state is HIGH
  if (buttonState == HIGH) {
    ledState = !ledState;
  }
}
}
// save the reading. Next time through the loop, it'll be the lastButtonState:
lastButtonState = reading;

// if the ledState variable is different from the current LED state
if (digitalRead(ledPin)!= ledState) {
Serial.println("State changed");
// change the LED state
digitalWrite(ledPin, ledState);
digitalWrite(ledPin2, !ledState);
digitalWrite(ledPin3, !ledState);
// save the LED state in flash memory
EEPROM.write(0, ledState);
EEPROM.commit();
Serial.println("State saved in flash memory");
}

{

digitalRead (ledpin, 1)
Serial.println("alarm");

}
}

Buy a wrist watch with an alarm function ( repeating ) and use that .
Put a tick on a chart to prove medicine taken - it needs to be full proof, reliable and create a record

Ok, after you got many warnings to buy something reliable and accurate for your purpose, I will still give you feedback on your code since that is the purpose of this forum and it might come in handy for others:

First, you read the time from the internet but never use it. Look into the "tm" struct and how to get the data from there. Google the "difftime" and the "mktime" functions they will help you handle the elapsed time. You need to store in a variable the last time that the button was pressed to make comparisons. All of this is needed is you want a true 10PM reminder.

If you just want elapsed time, then you can just use the millis() and count the milliseconds elapsed since the last time the button was pressed.

If you have a more specific question, please ask.

1 Like

HI All
thanks for all the feedback, I really want to make this work
sorry forgot to mention he has the wrist band and I have smart light this is extra third device in case if all two did not work

regards

Adam

Hi
I built this box for my wife's medicine.
But as your child's case is a matter of life, I recommend not using more than at least 2 independent equipment, because if one flashes the other(s) will work.
They can be, for example, a cell phone and a watch, etc.

Photo of my medicine box.
It sets the time via NTP via my loal network, and allows you to modify the schedule via AP mode.
It also records a history of the medication with the schedules.


Hi @ozozsydney
I would like to test your code.
What microcontroller do you intend to use with it?

wow very smart which controller did you use

Thanks @ruilviana , its ESP32

Hi
I used ESP8266 12E.

Tks

Hi @ozozsydney
The code you posted is not correct.
As it is, it doesn't compile.

Error 1 : const char ntpServer = "pool.ntp.org";
Correct: const char* ntpServer = "pool.ntp.org";

Error 2, 3 , 4 e 5: digitalRead(ledpin, 1)
Correct: ??? = digitalRead(ledPin);

"{" unnecessary before digitalRead(ledpin, 1)
"}" unnecessary after Serial.println("alarm");

More likely it was intended to be digitalWrite.

thanks I am still trying to make it work but its getting the time for some reason

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.