#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_PIN -1
#define Screen_Address 0x3c
#define buzzer 5
#define led 4
#define user_input 16
#define pb_OK 26
#define pb_UP 27
#define pb_down 14
#define DHTpin 12
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 0
#define UTC_OFFSET_DST 0
int days = 0;
int hours = 0;
int minutes = 0;
int seconds = 0;
unsigned long timenow = 0;
unsigned long timelast =0;
bool alarm_enabled = true;
int n_alarms = 2;
int alarm_hours[] = {0,1};
int alarm_minutes[] = {1,10};
bool alarm_triggered[] = {false,false};
int n_notes = 8;
int notes[] = {262,294,330,349,392,440,494,523};
int current_mode = 0;
int max_modes = 4;
String modes[] = {"1 - Set time", "2 - Set Alarm 1","3 - Set Alarm 2 ","4 - Disable Alarm"};
Adafruit_SSD1306 display(screen_width,screen_height,&Wire,OLED_PIN);
DHTesp dhtSensor;
void setup() {
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, Screen_Address);
dhtSensor.setup(DHTpin,DHTesp::DHT22);
// put your setup code here, to run once:
display.display();
delay(2000);
print_line("Welcome to Medibox",2,0,0);
display.clearDisplay();
pinMode(buzzer, OUTPUT);
pinMode(led, OUTPUT);
pinMode(user_input,INPUT);
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
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);
}
void loop() {
update_time_with_check_alarm();
if (digitalRead(pb_OK)==LOW){
delay(200);
go_to_menu();
}
check_temp();
}
// function to print line of text in a given text size and the given position
void print_line(String text, int text_size, int row, int column){
display.setTextSize(text_size);
display.setTextColor(SSD1306_WHITE);
display.setCursor(column,row);
display.println(text);
display.display();
}
void print_time_now(){
print_line(String(days),2,0,0);
print_line(":",2,0,20);
print_line(String(hours),2,0,30);
print_line(":",2,0,50);
print_line(String(minutes),2,0,60);
print_line(":",2,0,80);
print_line(String(seconds),2,0,90);
}
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",2,0,0);
digitalWrite(led, HIGH);
bool breakHappen =false;
while (breakHappen == false && digitalRead(user_input)==HIGH){
if (digitalRead(user_input)==LOW){
delay(200);
breakHappen =true;
break;
}
for(int i =0; i<n_notes;i++){
tone(buzzer,notes[i]);
delay(500);
noTone(buzzer);
delay(2);
}
}
digitalWrite(led, LOW);
display.clearDisplay();
}
void update_time_with_check_alarm(){
display.clearDisplay();
update_time();
print_time_now();
if(alarm_enabled){
for (int i=0;i<n_alarms;i++){
if (alarm_triggered[i] == false && hours == alarm_hours[i] && minutes == alarm_minutes[i]){
ring_alarm();
alarm_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(user_input)==LOW){
delay(200);
return user_input;
}
update_time();
}
}
void go_to_menu(){
while(digitalRead(user_input)==HIGH){
display.clearDisplay();
print_line(modes[current_mode],2,0,0);
int pressed = wait_for_button_press();
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 == user_input){
delay(200);
break;
}
}
}
void set_time(){
int temp_hour = hours;
while(true){
display.clearDisplay();
print_line("Enter hour: " + String(temp_hour),2,0,2);
int pressed = wait_for_button_press();
if (pressed == pb_UP){
delay(200);
temp_hour += 1;
temp_hour = temp_hour % 24;
}
else if (pressed == pb_down){
delay(200);
temp_hour -= 1;
if (temp_hour<0){
temp_hour = 24 -1;
}
}
else if (pressed == pb_OK){
delay(200);
hours = temp_hour;
break;
}
else if (pressed == user_input){
delay(200);
break;
}
}
int temp_min = minutes;
while(true){
display.clearDisplay();
print_line("Enter Minutes: " + String(temp_min),2,0,2);
int pressed = wait_for_button_press();
if (pressed == pb_UP){
delay(200);
temp_min += 1;
temp_min = temp_min % 60;
}
else if (pressed == pb_down){
delay(200);
temp_min -= 1;
if (temp_min<0){
temp_min = 60 -1;
}
}
else if (pressed == pb_OK){
delay(200);
minutes = temp_min;
break;
}
else if (pressed == user_input){
delay(200);
break;
}
}
display.clearDisplay();
print_line("Time is Set",0,0,2);
}
void set_alarm(int alarm){
int temp_hour = alarm_hours[alarm];
while(true){
display.clearDisplay();
print_line("Enter hour: " + String(temp_hour),2,0,2);
int pressed = wait_for_button_press();
if (pressed == pb_UP){
delay(200);
temp_hour += 1;
temp_hour = temp_hour % 24;
}
else if (pressed == pb_down){
delay(200);
temp_hour -= 1;
if (temp_hour<0){
temp_hour = 24 -1;
}
}
else if (pressed == pb_OK){
delay(200);
alarm_hours[alarm] = temp_hour;
break;
}
else if (pressed == user_input){
delay(200);
break;
}
}
int temp_min = alarm_minutes[alarm];
while(true){
display.clearDisplay();
print_line("Enter Minutes: " + String(temp_min),2,0,2);
int pressed = wait_for_button_press();
if (pressed == pb_UP){
delay(200);
temp_min += 1;
temp_min = temp_min % 60;
}
else if (pressed == pb_down){
delay(200);
temp_min -= 1;
if (temp_min<0){
temp_min = 60 -1;
}
}
else if (pressed == pb_OK){
delay(200);
alarm_minutes[alarm] = temp_min;
break;
}
else if (pressed == user_input){
delay(200);
break;
}
}
display.clearDisplay();
print_line("Alarm is Set",2,0,2);
}
void run_mode(int mode){
if (mode==0){
set_time();
}
else if (mode==1|| mode ==2){
set_alarm(mode-1);
}
else if (mode =3){
alarm_enabled = false;
}
}
void check_temp(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
if (data.temperature > 35){
display.clearDisplay();
print_line("High Temperature",0,40,1);
delay(2000);
}
else if (data.temperature<25){
display.clearDisplay();
print_line("Low Temperature",0,40,1);
delay(2000);
}
if (data.humidity > 40){
display.clearDisplay();
print_line("High Humidity",0,50,1);
delay(2000);
}
else if (data.humidity < 20){
display.clearDisplay();
print_line("Low Humidity",0,50,1);
delay(2000);
}
}