/*USE of WiFi to update time*/
#include "WiFi.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHTesp.h"
#include <time.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
#define CANCEL 34
#define OK 35
#define DOWN 32
#define UP 33
#define BUZZER 13
#define LED_1 2
#define LED_2 4
#define DHT_22 15
int days = 0;
int hours = 0;
int minutes = 0;
int seconds = 0;
int Notes_No = 8;
int C = 262;
int D = 294;
int E = 320;
int F = 349;
int G = 392;
int A = 440;
int B = 494;
int C_H = 523;
int notes[] = {C, D, E, F, G, A, B, C_H};
bool alarm_enabled = true;
int n_alarms = 2;
int alarm_hours[] = {0,0};
int alarm_minutes[] = {1,10};
bool alarm_triggered[] = {false,false};
int current_mode = 0; //0-1m,1-2m,2-3m,3-4m
int max_modes = 4;
String options[] = {"1: Set Time","2: Set Alarm 1","3: Set Alarm 2","Disable Alarm"};
int current = 0;
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 19800
#define UTC_OFFSET_DST 0
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
DHTesp dhtSensor;
void setup() {
Serial.begin(115200);
pinMode(BUZZER, OUTPUT);
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(CANCEL, INPUT);
pinMode(OK, INPUT);
pinMode(DOWN, INPUT);
pinMode(UP, INPUT);
display.clearDisplay();
OLED_FaultCheck();
ConnectWiFi();
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
delay(100);
dhtSensor.setup(DHT_22, DHTesp::DHT22);
}
void loop() {
update_time_with_alarm();
if (digitalRead(CANCEL) == LOW) {
delay(1000);
Serial.println("Enter Menu!!");
gotoMenu();
}
check_temp();
}
void run_mode(int mode){
int temp_hour = 0;
int temp_minute = 0;
if(mode == 0){
display.clearDisplay();
print_line("Enter Hour : "+ String(hours),0,0,2);
while(digitalRead(CANCEL)==HIGH){
//hour
int pressed = waitforbuttonpress();
if (pressed == UP) {
temp_hour++;
temp_hour = temp_hour%24;
display.clearDisplay();
print_line("Enter Hour : "+ String(temp_hour),0,0,2);
delay(200);
}
else if (pressed == DOWN) {
temp_hour--;
if(temp_hour < 0){
temp_hour = 23;
}
display.clearDisplay();
print_line("Enter Hour : "+ String(temp_hour),0,0,2);
delay(200);
}
else if (pressed == OK) {
hours = temp_hour;
display.clearDisplay();
print_line("Enter Hour : "+ String(hours),0,0,2);
delay(200);
break;
}
}
display.clearDisplay();
print_line("Enter Minute : "+ String(minutes),0,0,2);
while(digitalRead(CANCEL)==HIGH){
//minute
int pressed = waitforbuttonpress();
if (pressed == UP) {
temp_minute++;
temp_minute = temp_minute%60;
display.clearDisplay();
print_line("Enter Minute : "+ String(temp_minute),0,0,2);
delay(200);
}
else if (pressed == DOWN) {
temp_minute--;
if(temp_minute < 0){
temp_minute = 59;
}
display.clearDisplay();
print_line("Enter Minute : "+ String(temp_minute),0,0,2);
delay(200);
}
else if (pressed == OK) {
minutes = temp_minute;
display.clearDisplay();
print_line("Enter Minute : "+ String(minutes),0,0,2);
delay(200);
break;
}
}
display.clearDisplay();
print_line("Time Set!!",0,0,2);
delay(2000);
}
else if((mode == 1)||(mode == 2) ){
temp_hour = 0;
temp_minute = 0;
display.clearDisplay();
print_line("Enter Hour : "+ String(alarm_hours[mode-1]),0,0,2);
while(digitalRead(CANCEL)==HIGH){
//hour
int pressed = waitforbuttonpress();
if (pressed == UP) {
temp_hour++;
temp_hour = temp_hour%24;
display.clearDisplay();
print_line("Enter Hour : "+ String(temp_hour),0,0,2);
delay(200);
}
else if (pressed == DOWN) {
temp_hour--;
if(temp_hour < 0){
temp_hour = 23;
}
display.clearDisplay();
print_line("Enter Hour : "+ String(temp_hour),0,0,2);
delay(200);
}
else if (pressed == OK) {
alarm_hours[mode-1] = temp_hour;
display.clearDisplay();
print_line("Enter Hour : "+ String(alarm_hours[mode-1]),0,0,2);
delay(200);
break;
}
}
display.clearDisplay();
print_line("Enter Minute : "+ String(alarm_minutes[mode-1]),0,0,2);
while(digitalRead(CANCEL)==HIGH){
//minute
int pressed = waitforbuttonpress();
if (pressed == UP) {
temp_minute++;
temp_minute = temp_minute%60;
display.clearDisplay();
print_line("Enter Minute : "+ String(temp_minute),0,0,2);
delay(200);
}
else if (pressed == DOWN) {
temp_minute--;
if(temp_minute < 0){
temp_minute = 59;
}
display.clearDisplay();
print_line("Enter Minute : "+ String(temp_minute),0,0,2);
delay(200);
}
else if (pressed == OK) {
alarm_minutes[mode-1] = temp_minute;
display.clearDisplay();
print_line("Enter Minute : "+ String(alarm_minutes[mode-1]),0,0,2);
delay(200);
break;
}
}
display.clearDisplay();
print_line("Alarm Set!!",0,0,2);
delay(2000);
}
else if(mode == 3){
alarm_enabled = false;
display.clearDisplay();
print_line("Alarm Disabled!!",0,0,2);
delay(2000);
}
}
int waitforbuttonpress(){
while(true){
if(digitalRead(UP) == LOW){
delay(200);
return UP;
}
if(digitalRead(DOWN) == LOW){
delay(200);
return DOWN;
}
if(digitalRead(OK) == LOW){
delay(200);
return OK;
}
if(digitalRead(CANCEL) == LOW){
delay(200);
return CANCEL;
}
update_time_wifi();
}
}
void gotoMenu(){
while(digitalRead(CANCEL)==HIGH){
display.clearDisplay();
print_line(options[current_mode],0,0,2);
int pressed = waitforbuttonpress();
if (pressed == UP) {
current_mode++;
current_mode = current_mode%4;
delay(200);
}
else if (pressed == DOWN) {
current_mode--;
if(current_mode < 0){
current_mode = max_modes -1;
}
delay(200);
}
else if (pressed == OK) {
Serial.println(current_mode);
delay(200);
run_mode(current_mode);
}
}
}
void ring_alarm(){
display.clearDisplay();
print_line("MEDICINE TIME!!!",0,0,2);
digitalWrite(LED_1, HIGH);
while(digitalRead(CANCEL) == HIGH){
for (int i = 0; i < Notes_No; i++) {
if (digitalRead(CANCEL) == LOW) {
delay(200);
break;
}
tone(BUZZER, notes[i]);
delay(500);
noTone(BUZZER);
delay(2);
}
}
delay(200);
digitalWrite(LED_1, LOW);
display.clearDisplay();
}
void update_time_with_alarm(){
update_time_wifi();
display.clearDisplay();
print_time_now();
if(alarm_enabled == true){
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;
}
}
}
}
void print_time_now(){
print_line(String(hours),0,0,2);
print_line(":",0,20,2);
print_line(String(minutes),0,30,2);
print_line(":",0,50,2);
print_line(String(seconds),0,60,2);
}
void update_time_wifi(){
struct tm timeinfo;
getLocalTime(&timeinfo);
char day_str[8];
char hour_str[8];
char min_str[8];
char sec_str[8];
strftime(day_str,8, "%d",&timeinfo);
strftime(sec_str,8, "%S",&timeinfo);
strftime(hour_str,8, "%H",&timeinfo);
strftime(min_str,8, "%M",&timeinfo);
days = atoi(day_str);
hours = atoi(hour_str);
seconds = atoi(sec_str);
minutes = atoi(min_str);
}
void check_temp(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
bool all_good = true;
print_line("Temp: " + String(data.temperature, 2),45,0,1);
print_line("Humidity: " + String(data.humidity, 1),55,0,1); //this is how to you print data on OLED screen
if(data.temperature > 35){
print_line("HIGH",45,100,1);
all_good = false;
digitalWrite(LED_2, HIGH);
}
else if(data.temperature < 25){
print_line("LOW",45,100,1);
all_good = false;
digitalWrite(LED_2, HIGH);
}
if(data.humidity > 35){
print_line("HIGH",55,100,1);
all_good = false;
digitalWrite(LED_2, HIGH);
}
else if(data.humidity < 25){
print_line("LOW",55,100,1);
all_good = false;
digitalWrite(LED_2, HIGH);
}
if(all_good){
digitalWrite(LED_2, LOW);
}
}
void ConnectWiFi(){
WiFi.mode(WIFI_STA);
WiFi.begin(ssid); //set WiFi.begin(ssid,password); if wifi has a password
display.clearDisplay();
print_line("Connecting to WiFi ..",50,0,1);
delay(1000);
while (WiFi.status() != WL_CONNECTED) {
display.clearDisplay();
print_line(".",50,0,1);
delay(1000);
}
if (WiFi.status() == WL_CONNECTED) {
Serial.print("Local IP is: \n");
Serial.println(WiFi.localIP());
display.clearDisplay();
print_line("Connected to Wifi...",50,0,1);
delay(1000);
}
}
void OLED_FaultCheck() {
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
delay(2000);
}
void print_line(String PText, int Column, int Row, int Size) {
display.setTextSize(Size);
display.setTextColor(WHITE);
display.setCursor(Row, Column); //(row, column)
display.println(PText);
display.display();
}
/* TempAndHumidity data = dhtSensor.getTempAndHumidity();
print_line("Temp: " + String(data.temperature, 2),45,0,1);
print_line("Humidity: " + String(data.humidity, 1),55,0,1); //this is how to you print data on OLED screen*/