#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHTesp.h>
#include <WiFi.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
#define BUZZER 5
#define LED_1 15
#define PB_CANCEL 34
#define PB_OK 32
#define PB_UP 33
#define PB_DOWN 35
#define DHTPIN 12
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 0
#define UTC_OFFSET_DST 0
int c = 262;
int d = 294;
int e = 330;
int f = 349;
int g = 492;
int a = 440;
int b = 494;
int c_h = 523;
int notes[] = {c, d, e, f, g, a, b, c_h};
int n_Notes = 8;
int seconds;
int minutes;
int hours;
int days;
//new
int offset[2] ;
int increment_hours = 0;
int increment_minutes = 0;
//end new
unsigned long timeNow = 0;
unsigned long timeLast = 0;
////new////
//alarm1
bool alarm_1_enabled = true;
int n_1_alarms = 2;
int alarm_1_hours[] = {0, 1};
int alarm_1_minutes[] = {1, 10};
bool alarm_1_triggered[] = {false, false};
//alarm2
bool alarm_2_enabled = true;
int n_2_alarms = 2;
int alarm_2_hours[] = {0, 2};
int alarm_2_minutes[] = {2, 10};
bool alarm_2_triggered[] = {false, false};
//alarm3
bool alarm_3_enabled = true;
int n_3_alarms = 2;
int alarm_3_hours[] = {0, 3};
int alarm_3_minutes[] = {3, 10};
bool alarm_3_triggered[] = {false, false};
//////end new ///
//menu options
int current_mode = 0;
int max_modes = 4; //max no of modes
String modes[] = {"1 - Set Time", "2 - Set Alarm 1", "3 - Set Alarm 2", "4 - Disable Alarms"};
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET );
DHTesp dhtSensor;
void setup() {
// put your setup code here, to run once:
pinMode(BUZZER, OUTPUT);
pinMode(LED_1, OUTPUT);
pinMode(PB_CANCEL, INPUT);
pinMode(PB_OK, INPUT);
pinMode(PB_UP, INPUT);
pinMode(PB_DOWN, INPUT);
dhtSensor.setup(DHTPIN, DHTesp::DHT22);
// initialize serial monitor and OLED display
Serial.begin(9600);
if (! display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS))
{
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
// turn on OLED display
display.display();
delay(2000);
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
display.clearDisplay();
print_line("Connecting to WIFI",0,0,2);
}
display.clearDisplay();
print_line("Connected to WIFI",0,0,2);
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
display.clearDisplay();
print_line("Welcome to Medi Box!", 0, 0, 2);
display.clearDisplay();
delay(1000);
//newwwwwww
set_time_zone();
update_time();
print_time_now();
}
void loop() {
delay(10);
update_time_with_chech_alarm();
if (digitalRead(PB_OK) == LOW) {
delay(200);
go_to_menu();
}
check_temp();
}
void print_line(String message, int column, int row, int text_size) {
//display.clearDisplay();
display.setTextSize(text_size);
display.setTextColor(SSD1306_WHITE);
display.setCursor(column, row);
display.println(message);// display a custom message
display.display();
}
void print_time_now(void) {
display.clearDisplay();
print_line(String(days), 0, 0, 2);
print_line(":", 20, 0, 2);
print_line(String(hours), 30, 0, 2);
print_line(":", 50, 0, 2);
print_line(String(minutes), 60, 0, 2);
print_line(":", 80, 0, 2);
print_line(String(seconds), 90, 0, 2);
}
void update_time(void) {
struct tm timeinfo;
getLocalTime(&timeinfo);
char timeHour[3];
strftime(timeHour, 3,"%H", &timeinfo);
hours = atoi(timeHour);
hours = hours + offset[0];
char timeMinute[3];
strftime(timeMinute, 3,"%M", &timeinfo);
minutes = atoi(timeMinute);
minutes = minutes + offset[1];
char timeSeconds[3];
strftime(timeSeconds, 3,"%S", &timeinfo);
seconds = atoi(timeSeconds);
char timeDays[3];
strftime(timeDays, 3,"%D", &timeinfo);
days = atoi(timeDays);
}
void ring_alarm(void) {
display.clearDisplay();
print_line("MEDICINE TIME", 0, 0, 2);
digitalWrite(LED_1, HIGH);
bool break_happened = false;
//ring the buzzer
while (break_happened == false && digitalRead(PB_CANCEL) == HIGH) {
for (int i = 0; i < n_Notes; i++ ) {
if (digitalRead(PB_CANCEL == LOW)) {
delay(200);
break_happened = true;
break;
}
tone(BUZZER, notes[i]);
delay((500));
noTone(BUZZER);
delay((2));
}
}
digitalWrite(LED_1, LOW);
display.clearDisplay();
}
void update_time_with_chech_alarm(void) {
update_time();
print_time_now();
if (alarm_1_enabled == true) {
for (int i = 0; i < n_1_alarms; i++) {
if (alarm_1_triggered[i] == false && alarm_1_hours[i] == hours && alarm_1_minutes[i] == minutes) {
ring_alarm();
alarm_1_triggered[i] = true;
}
}
}
}
int wait_for_button_press() {
while (true) {
if (digitalRead(PB_UP) == LOW) {
delay(200);
return PB_UP;
}
else if (digitalRead(PB_DOWN) == LOW) {
delay(200);
return PB_DOWN;
}
else if (digitalRead(PB_OK) == LOW) {
delay(200);
return PB_OK;
}
else if (digitalRead(PB_CANCEL) == LOW) {
delay(200);
return PB_CANCEL;
}
update_time();
}
}
void go_to_menu(void) {
while (digitalRead(PB_CANCEL) == HIGH) {
display.clearDisplay();
print_line(modes[current_mode], 0, 0, 2);
int pressed = wait_for_button_press(); // when a button is pressed it is assigned to this
if (pressed == PB_UP) {
delay(200);
current_mode += 1;
current_mode = current_mode % max_modes;
}
else if (pressed == PB_DOWN) {
delay(200);
current_mode -= 1;
if (current_mode < 0) {
current_mode = max_modes - 1;
}
}
else if (pressed == PB_OK) {
delay(200);
run_mode(current_mode);
}
else if (pressed == PB_CANCEL) {
delay(200);
break;
}
}
}
void set_time() {
int temp_hours = hours;
while (true) {
display.clearDisplay();
print_line("Enter hour : " + String(temp_hours), 0, 0, 2);
int pressed = wait_for_button_press(); // when a button is pressed it is assigned to this
if (pressed == PB_UP) {
delay(200);
temp_hours += 1;
temp_hours = temp_hours % 24;
}
else if (pressed == PB_DOWN) {
delay(200);
temp_hours -= 1;
if (temp_hours < 0) {
temp_hours = 23;
}
}
else if (pressed == PB_OK) {
delay(200);
hours = temp_hours;
break;
}
else if (pressed == PB_CANCEL) {
delay(200);
break;
}
}
int temp_minutes = minutes;
while (true) {
display.clearDisplay();
print_line("Enter minutes : " + String(temp_minutes), 0, 0, 2);
int pressed = wait_for_button_press(); // when a button is pressed it is assigned to this
if (pressed == PB_UP) {
delay(200);
temp_minutes += 1;
temp_minutes = temp_minutes % 60;
}
else if (pressed == PB_DOWN) {
delay(200);
temp_minutes -= 1;
if (temp_minutes < 0) {
temp_minutes = 59;
}
}
else if (pressed == PB_OK) {
delay(200);
minutes = temp_minutes;
break;
}
else if (pressed == PB_CANCEL) {
delay(200);
break;
}
}
display.clearDisplay();
print_line("Time is SET", 0, 0, 2);
delay(1000);
}
void run_mode(int mode) {
if (mode == 0) {
set_time();
}
else if (mode == 1 || mode == 2) {
set_alarm_1(mode = 1);
}
else if (mode = 3){
alarm_1_enabled = false;
}
}
void check_temp(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
if(data.temperature >35){
display.clearDisplay();
print_line("TEMP HIGH",0,40,1);
}
else if(data.temperature <25){
display.clearDisplay();
print_line("TEMP LOW",0,40,1);
}
if(data.humidity >40){
display.clearDisplay();
print_line("HUMIDITY HIGH",0,50,1);
}
else if(data.humidity <20){
display.clearDisplay();
print_line("HUMIDITY LOW",0,50,1);
}
}
////new /////
void set_time_zone() {
int temp_offset_hours = increment_hours;
while (true) {
display.clearDisplay();
print_line("Enter offset hour : " + String(temp_offset_hours), 0, 0, 2);
int pressed = wait_for_button_press(); // when a button is pressed it is assigned to this
if (pressed == PB_UP) {
delay(200);
temp_offset_hours += 1;
temp_offset_hours = temp_offset_hours % 24;
}
else if (pressed == PB_DOWN) {
delay(200);
temp_offset_hours -= 1;
if (temp_offset_hours < 0) {
temp_offset_hours = 23;
}
}
else if (pressed == PB_OK) {
delay(200);
increment_hours = temp_offset_hours;
offset[0] = increment_hours;
break;
}
else if (pressed == PB_CANCEL) {
delay(200);
break;
}
}
int temp_offset_minutes = increment_minutes;
while (true) {
display.clearDisplay();
print_line("Enter minutes : " + String(temp_offset_minutes), 0, 0, 2);
int pressed = wait_for_button_press(); // when a button is pressed it is assigned to this
if (pressed == PB_UP) {
delay(200);
temp_offset_minutes += 1;
temp_offset_minutes = temp_offset_minutes % 60;
}
else if (pressed == PB_DOWN) {
delay(200);
temp_offset_minutes -= 1;
if (temp_offset_minutes < 0) {
temp_offset_minutes = 59;
}
}
else if (pressed == PB_OK) {
delay(200);
increment_minutes = temp_offset_minutes;
offset[1] = increment_minutes;
break;
}
else if (pressed == PB_CANCEL) {
delay(200);
break;
}
}
display.clearDisplay();
print_line("Time zone is SET", 0, 0, 2);
delay(1000);
}
void set_alarm_1(int alarm_1) {
// here alarm_1 depicts the position of the array here it is 1
int temp_hours = alarm_1_hours[alarm_1];
while (true) {
display.clearDisplay();
print_line("Enter hour : " + String(temp_hours), 0, 0, 2);
int pressed = wait_for_button_press(); // when a button is pressed it is assigned to this
if (pressed == PB_UP) {
delay(200);
temp_hours += 1;
temp_hours = temp_hours % 24;
}
else if (pressed == PB_DOWN) {
delay(200);
temp_hours -= 1;
if (temp_hours < 0) {
temp_hours = 23;
}
}
else if (pressed == PB_OK) {
delay(200);
alarm_1_hours[alarm_1] = temp_hours;
break;
}
else if (pressed == PB_CANCEL) {
delay(200);
break;
}
}
int temp_minutes = alarm_1_minutes[alarm_1];
while (true) {
display.clearDisplay();
print_line("Enter minutes : " + String(temp_minutes), 0, 0, 2);
int pressed = wait_for_button_press(); // when a button is pressed it is assigned to this
if (pressed == PB_UP) {
delay(200);
temp_minutes += 1;
temp_minutes = temp_minutes % 60;
}
else if (pressed == PB_DOWN) {
delay(200);
temp_minutes -= 1;
if (temp_minutes < 0) {
temp_minutes = 59;
}
}
else if (pressed == PB_OK) {
delay(200);
alarm_1_minutes[alarm_1] = temp_minutes;
break;
}
else if (pressed == PB_CANCEL) {
delay(200);
break;
}
}
display.clearDisplay();
print_line("Alarm 1 is SET", 0, 0, 2);
delay(1000);
}
//alarm 2
void set_alarm_2(int alarm_2) {
// here alarm_1 depicts the position of the array here it is 1
int temp_hours = alarm_2_hours[alarm_2];
while (true) {
display.clearDisplay();
print_line("Enter hour : " + String(temp_hours), 0, 0, 2);
int pressed = wait_for_button_press(); // when a button is pressed it is assigned to this
if (pressed == PB_UP) {
delay(200);
temp_hours += 1;
temp_hours = temp_hours % 24;
}
else if (pressed == PB_DOWN) {
delay(200);
temp_hours -= 1;
if (temp_hours < 0) {
temp_hours = 23;
}
}
else if (pressed == PB_OK) {
delay(200);
alarm_2_hours[alarm_2] = temp_hours;
break;
}
else if (pressed == PB_CANCEL) {
delay(200);
break;
}
}
int temp_minutes = alarm_2_minutes[alarm_2];
while (true) {
display.clearDisplay();
print_line("Enter minutes : " + String(temp_minutes), 0, 0, 2);
int pressed = wait_for_button_press(); // when a button is pressed it is assigned to this
if (pressed == PB_UP) {
delay(200);
temp_minutes += 1;
temp_minutes = temp_minutes % 60;
}
else if (pressed == PB_DOWN) {
delay(200);
temp_minutes -= 1;
if (temp_minutes < 0) {
temp_minutes = 59;
}
}
else if (pressed == PB_OK) {
delay(200);
alarm_2_minutes[alarm_2] = temp_minutes;
break;
}
else if (pressed == PB_CANCEL) {
delay(200);
break;
}
}
display.clearDisplay();
print_line("Alarm 2 is SET", 0, 0, 2);
delay(1000);
}
//alarm 3
void set_alarm_3(int alarm_3) {
// here alarm_1 depicts the position of the array here it is 1
int temp_hours = alarm_3_hours[alarm_3];
while (true) {
display.clearDisplay();
print_line("Enter hour : " + String(temp_hours), 0, 0, 2);
int pressed = wait_for_button_press(); // when a button is pressed it is assigned to this
if (pressed == PB_UP) {
delay(200);
temp_hours += 1;
temp_hours = temp_hours % 24;
}
else if (pressed == PB_DOWN) {
delay(200);
temp_hours -= 1;
if (temp_hours < 0) {
temp_hours = 23;
}
}
else if (pressed == PB_OK) {
delay(200);
alarm_3_hours[alarm_3] = temp_hours;
break;
}
else if (pressed == PB_CANCEL) {
delay(200);
break;
}
}
int temp_minutes = alarm_3_minutes[alarm_3];
while (true) {
display.clearDisplay();
print_line("Enter minutes : " + String(temp_minutes), 0, 0, 2);
int pressed = wait_for_button_press(); // when a button is pressed it is assigned to this
if (pressed == PB_UP) {
delay(200);
temp_minutes += 1;
temp_minutes = temp_minutes % 60;
}
else if (pressed == PB_DOWN) {
delay(200);
temp_minutes -= 1;
if (temp_minutes < 0) {
temp_minutes = 59;
}
}
else if (pressed == PB_OK) {
delay(200);
alarm_3_minutes[alarm_3] = temp_minutes;
break;
}
else if (pressed == PB_CANCEL) {
delay(200);
break;
}
}
display.clearDisplay();
print_line("Alarm 3 is SET", 0, 0, 2);
delay(1000);
}