#include <Wire.h>`
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHTesp.h>
#include <WiFi.h>
// define OLED parameters
#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
//declarte objects
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
DHTesp dhtsensor;
//global variables
int days = 0;
int hours =0;
int minutes =0;
int seconds = 0;
int Days = 0 ;
unsigned long timeNow=0;
unsigned long timeLast=0;
bool alarm_enabled = true;
int n_alarms = 3;
int alarm_hours[] = {0,1,2};
int alarm_minutes[] = {1,10,11};
bool alarm_triggered[] = {false, false,false};
int n_notes = 5;
int A =100;
int B = 200;
int C = 300;
int D = 400;
int E = 500;
int notes[] = {A,B,C,D,E};
int current_mode =0;
int max_modes = 5;
String modes[] = {"1 - Set TimeZone ","2 - Set Alarm 1 "," 3 - Set alarm 2"," 4 - Set Alarm 3"," 5 - disable alarm"};
void setup() {
pinMode(BUZZER, OUTPUT);
pinMode(LED_1, OUTPUT);
pinMode(PB_OK,INPUT);
pinMode(PB_UP,INPUT);
pinMode(PB_DOWN,INPUT);
pinMode(PB_CANCEL,INPUT);
Serial.begin(9600);
dhtsensor.setup(DHTPIN,DHTesp::DHT22);
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)){
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
delay(2000);
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
display.clearDisplay();
print_line("Connecting to wifi",0,0,2);
}
delay(300);
display.clearDisplay();
print_line("Connected to wifi",0,0,2);
delay(500);
configTime(5*3600+30*60, UTC_OFFSET_DST, NTP_SERVER);
display.clearDisplay();
print_line("WELCOME TO MEDIBOX",10,20,2);
delay(2000);
display.clearDisplay();
}
void loop(){
update_time_with_check_alarms();
if (digitalRead(PB_OK)==LOW){
delay(200);
go_to_menu();
}
check_temp();
}
void print_line(String text, int column, int row, int text_size){
display.setTextSize(text_size);
display.setTextColor(SSD1306_WHITE);
display.setCursor(column,row);
display.println(text);
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(){
struct tm timeinfo;
getLocalTime(&timeinfo);
char timehour[3];
strftime(timehour,3, "%H", &timeinfo);
hours = atoi(timehour);
char timeminute[3];
strftime(timeminute,3, "%M", &timeinfo);
minutes = atoi(timeminute);
char timesecond[3];
strftime(timesecond,3, "%S", &timeinfo);
seconds = atoi(timesecond);
char timeDay[3];
strftime(timeDay,3, "%d", &timeinfo);
Days = atoi(timeDay);
}
void ring_alarm(){
display.clearDisplay();
print_line("Medicine time",0,0,2);
digitalWrite(LED_1, HIGH);
bool break_happened = false;
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_check_alarms(void){
update_time();
print_time_now();
if (alarm_enabled == true){
for (int i=0; i<n_alarms; i++){
if (alarm_triggered[i]== false && alarm_hours[i]== hours && alarm_minutes[i]==minutes){
ring_alarm();
alarm_triggered[i] = true;
}
}
}
}
int wait_for_button_press(){
while(true){
if (digitalRead(PB_UP)==LOW){
delay(200);
return PB_UP;
}
if (digitalRead(PB_DOWN)==LOW){
delay(200);
return PB_DOWN;
}
if (digitalRead(PB_OK)==LOW){
delay(200);
return PB_OK;
}
if (digitalRead(PB_CANCEL)==LOW){
delay(200);
return PB_CANCEL;
}
update_time();
}
}
void go_to_menu(){
while (digitalRead(PB_CANCEL)==HIGH){
display.clearDisplay();
print_line(modes[current_mode],0,0,2);
int pressed = wait_for_button_press();
if (pressed==PB_UP){
delay(200);
current_mode +=1;
current_mode = current_mode % max_modes;
}
if (pressed==PB_DOWN){
delay(200);
current_mode -=1;
if (current_mode<0){
current_mode = max_modes-1;
}
}
if (pressed==PB_OK){
delay(200);
run_mode(current_mode);
}
if (pressed==PB_CANCEL){
delay(200);
break;
}
}
}
void set_timeZone(){
}
void set_alarm(int alarm){
int temp_hour = alarm_hours[alarm];
while(true){
display.clearDisplay();
print_line("Enter hour"+String(temp_hour ),0,0,2);
int pressed = wait_for_button_press();
if (pressed==PB_UP){
delay(200);
temp_hour +=1;
temp_hour = temp_hour % 24;
}
if (pressed==PB_DOWN){
delay(200);
temp_hour -=1;
if (temp_hour<0){
temp_hour = 23;
}
}
if (pressed==PB_OK){
delay(200);
alarm_hours[alarm] = temp_hour;
break;
}
if (pressed==PB_CANCEL){
delay(200);
break;
}
}
int temp_minute = alarm_minutes[alarm];
while(true){
display.clearDisplay();
print_line("Enter minute"+String(temp_minute ),0,0,2);
int pressed = wait_for_button_press();
if (pressed==PB_UP){
delay(200);
temp_minute +=1;
temp_minute = temp_minute % 60;
}
if (pressed==PB_DOWN){
delay(200);
temp_minute -=1;
if (temp_minute<0){
temp_minute = 59;
}
}
if (pressed==PB_OK){
delay(200);
alarm_minutes[alarm] = temp_minute;
break;
}
if (pressed==PB_CANCEL){
delay(200);
break;
}
}
display.clearDisplay();
print_line("Alarm Is Set",0,0,2);
delay(1000);
}
void run_mode(int mode){
if (mode==0){
set_timeZone();
}
if (mode==1 || mode==2 || mode == 3){
set_alarm(mode-1);
}
if (mode==4){
alarm_enabled= false;
}
}
void check_temp(){
TempAndHumidity data = dhtsensor.getTempAndHumidity();
if (data.temperature>32){
display.clearDisplay();
print_line("Temp high",0,40,1);
}
if (data.temperature<26){
display.clearDisplay();
print_line("Temp low",0,40,1);
}
if (data.humidity>80){
display.clearDisplay();
print_line("Humidity high",0,50,1);
}
if (data.humidity<60){
display.clearDisplay();
print_line("Humidity low",0,50,1);
}
}