#include <Wire.h>
#include <RTClib.h>
#include <U8g2lib.h>
RTC_DS1307 rtc;
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
const int menu_btn = 2;
const int up_btn = 3;
const int down_btn = 4;
int menu = 0;
bool showtime = true; // Flag to control display updates
bool menu_option = false; // Flag to control menu_toggle option
void setup() {
Wire.begin();
u8g2.begin();
// Start the RTC module
if (!rtc.begin()) {
// If RTC is not found, display an error message
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 30, "Couldn't find RTC");
u8g2.sendBuffer();
while (1);
}
// If RTC is not running, set the time to compile time
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
pinMode(menu_btn, INPUT_PULLUP);
pinMode(up_btn, INPUT_PULLUP);
pinMode(down_btn, INPUT_PULLUP);
}
void loop() {
if (digitalRead(menu_btn) == LOW) {
showtime = false;
menu_option = true;
}
// Check boolean variable for these functions
if (showtime) {
display_time_temp_hum();
}
if (menu_option) {
menu_toggle();
}
}
///////////////////////////////////////////////////////////////////
// Function for displaying and toggling the menu
void menu_toggle() {
if (digitalRead(up_btn) == LOW) {
menu = menu + 1;
if (menu == 7) {
menu = 1;
}
delay(100);
}
if (digitalRead(down_btn) == LOW) {
menu = menu - 1;
if (menu < 0) {
menu = 6;
}
delay(100);
}
if (menu == 0) {
u8g2.clearBuffer();
u8g2.setFontMode(1);
u8g2.setBitmapMode(1);
u8g2.drawFilledEllipse(6, 6, 2, 2);
u8g2.setFont(u8g2_font_4x6_tr);
u8g2.drawStr(16, 9, "Set Alarm");
u8g2.drawFilledEllipse(6, 16, 2, 2);
u8g2.drawStr(16, 19, "Set Date and Time");
u8g2.drawFilledEllipse(6, 46, 2, 2);
u8g2.drawFilledEllipse(6, 36, 2, 2);
u8g2.drawFilledEllipse(6, 26, 2, 2);
u8g2.drawStr(16, 49, "Desktop assistant pet mode");
u8g2.drawStr(16, 39, "Stopwatch");
u8g2.drawStr(16, 29, "Set Timer");
u8g2.drawStr(56, 61, "Exit");
u8g2.sendBuffer();
}
if (menu == 1) {
u8g2.clearBuffer();
u8g2.setFontMode(1);
u8g2.setBitmapMode(1);
u8g2.drawFilledEllipse(6, 6, 2, 2);
u8g2.drawFilledEllipse(6, 16, 2, 2);
u8g2.setFont(u8g2_font_4x6_tr);
u8g2.drawStr(16, 9, "Set Alarm");
u8g2.drawStr(16, 19, "Set Date and Time");
u8g2.drawFilledEllipse(6, 46, 2, 2);
u8g2.drawFilledEllipse(6, 36, 2, 2);
u8g2.drawFilledEllipse(6, 26, 2, 2);
u8g2.drawStr(16, 49, "Desktop assistant pet mode");
u8g2.drawStr(16, 39, "Stopwatch");
u8g2.drawStr(16, 29, "Set Timer");
u8g2.drawStr(56, 61, "Exit");
u8g2.drawFrame(14, 2, 39, 9);
u8g2.sendBuffer();
}
if (menu == 2) {
u8g2.clearBuffer();
u8g2.setFontMode(1);
u8g2.setBitmapMode(1);
u8g2.drawFilledEllipse(6, 6, 2, 2);
u8g2.drawFilledEllipse(6, 16, 2, 2);
u8g2.setFont(u8g2_font_4x6_tr);
u8g2.drawStr(16, 9, "Set Alarm");
u8g2.drawStr(16, 19, "Set Date and Time");
u8g2.drawFilledEllipse(6, 46, 2, 2);
u8g2.drawFilledEllipse(6, 36, 2, 2);
u8g2.drawFilledEllipse(6, 26, 2, 2);
u8g2.drawStr(16, 49, "Desktop assistant pet mode");
u8g2.drawStr(16, 39, "Stopwatch");
u8g2.drawStr(16, 29, "Set Timer");
u8g2.drawStr(56, 61, "Exit");
u8g2.drawFrame(14, 12, 71, 9);
u8g2.sendBuffer();
}
if (menu == 3) {
u8g2.clearBuffer();
u8g2.setFontMode(1);
u8g2.setBitmapMode(1);
u8g2.drawFilledEllipse(6, 6, 2, 2);
u8g2.drawFilledEllipse(6, 16, 2, 2);
u8g2.setFont(u8g2_font_4x6_tr);
u8g2.drawStr(16, 9, "Set Alarm");
u8g2.drawStr(16, 19, "Set Date and Time");
u8g2.drawFilledEllipse(6, 46, 2, 2);
u8g2.drawFilledEllipse(6, 36, 2, 2);
u8g2.drawFilledEllipse(6, 26, 2, 2);
u8g2.drawStr(16, 49, "Desktop assistant pet mode");
u8g2.drawStr(16, 39, "Stopwatch");
u8g2.drawStr(16, 29, "Set Timer");
u8g2.drawStr(56, 61, "Exit");
u8g2.drawFrame(14, 22, 39, 9);
u8g2.sendBuffer();
}
if (menu == 4) {
u8g2.clearBuffer();
u8g2.setFontMode(1);
u8g2.setBitmapMode(1);
u8g2.drawFilledEllipse(6, 6, 2, 2);
u8g2.drawFilledEllipse(6, 16, 2, 2);
u8g2.setFont(u8g2_font_4x6_tr);
u8g2.drawStr(16, 9, "Set Alarm");
u8g2.drawStr(16, 19, "Set Date and Time");
u8g2.drawFilledEllipse(6, 46, 2, 2);
u8g2.drawFilledEllipse(6, 36, 2, 2);
u8g2.drawFilledEllipse(6, 26, 2, 2);
u8g2.drawStr(16, 49, "Desktop assistant pet mode");
u8g2.drawStr(16, 39, "Stopwatch");
u8g2.drawStr(16, 29, "Set Timer");
u8g2.drawStr(56, 61, "Exit");
u8g2.drawFrame(14, 32, 39, 9);
u8g2.sendBuffer();
}
if (menu == 5) {
u8g2.clearBuffer();
u8g2.setFontMode(1);
u8g2.setBitmapMode(1);
u8g2.drawFilledEllipse(6, 6, 2, 2);
u8g2.drawFilledEllipse(6, 16, 2, 2);
u8g2.setFont(u8g2_font_4x6_tr);
u8g2.drawStr(16, 9, "Set Alarm");
u8g2.drawStr(16, 19, "Set Date and Time");
u8g2.drawFilledEllipse(6, 46, 2, 2);
u8g2.drawFilledEllipse(6, 36, 2, 2);
u8g2.drawFilledEllipse(6, 26, 2, 2);
u8g2.drawStr(16, 49, "Desktop assistant pet mode");
u8g2.drawStr(16, 39, "Stopwatch");
u8g2.drawStr(16, 29, "Set Timer");
u8g2.drawStr(56, 61, "Exit");
u8g2.drawFrame(14, 42, 108, 9);
u8g2.sendBuffer();
}
if (menu == 6) {
u8g2.clearBuffer();
u8g2.setFontMode(1);
u8g2.setBitmapMode(1);
u8g2.drawFilledEllipse(6, 6, 2, 2);
u8g2.drawFilledEllipse(6, 16, 2, 2);
u8g2.setFont(u8g2_font_4x6_tr);
u8g2.drawStr(16, 9, "Set Alarm");
u8g2.drawStr(16, 19, "Set Date and Time");
u8g2.drawFilledEllipse(6, 46, 2, 2);
u8g2.drawFilledEllipse(6, 36, 2, 2);
u8g2.drawFilledEllipse(6, 26, 2, 2);
u8g2.drawStr(16, 49, "Desktop assistant pet mode");
u8g2.drawStr(16, 39, "Stopwatch");
u8g2.drawStr(16, 29, "Set Timer");
u8g2.drawStr(56, 61, "Exit");
u8g2.drawFrame(54, 54, 19, 9);
u8g2.sendBuffer();
if (digitalRead(menu_btn) == LOW) {
showtime = true;
menu_option = false;
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// function for displaying current date, time and temperature
// Function to display the time, date, and temperature on the OLED
void display_time_temp_hum() {
// Get the current date and time from the RTC
DateTime now = rtc.now();
// Simulate temperature reading (replace this with actual sensor code)
int temperature = 34; // Example temperature value
// Convert date to string
char dateStr[30];
snprintf(dateStr, sizeof(dateStr), "%s %d %s", dayOfTheWeek(now.dayOfTheWeek()), now.day(), monthName(now.month()));
// Convert time to string
char timeStr[10];
snprintf(timeStr, sizeof(timeStr), "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
// Convert temperature to string
char tempStr[20];
snprintf(tempStr, sizeof(tempStr), "Temperature: %d \260C", temperature);
// Display date, time, and temperature on the OLED
u8g2.clearBuffer(); // Clear the display buffer
u8g2.setFontMode(1);
u8g2.setBitmapMode(1);
u8g2.setFont(u8g2_font_timR24_tr); // Set large font for time
u8g2.drawStr(4, 43, timeStr); // Draw time at (4, 43)
u8g2.setFont(u8g2_font_6x10_tr); // Set smaller font for date and temperature
u8g2.drawStr(4, 10, dateStr); // Draw date at (4, 10)
u8g2.drawStr(9, 60, tempStr); // Draw temperature at (9, 60)
u8g2.sendBuffer(); // Send buffer to the display
}
// Function to get day of the week as a string
const char* dayOfTheWeek(uint8_t day) {
const char* days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
return days[day];
}
// Function to get month name as a string
const char* monthName(uint8_t month) {
const char* months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
return months[month - 1];
}