#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
RTC_DS3231 rtc;
OneWire oneWire(2); // Data wire connected to digital pin 2
DallasTemperature sensors(&oneWire);
const char* daysOfTheWeek[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void setup() {
Serial.begin(9600);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
sensors.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
}
void loop() {
DateTime now = rtc.now();
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0);
if (temperature == DEVICE_DISCONNECTED_C) {
Serial.println("Error: Could not read temperature from DS18B20 sensor");
}
display.clearDisplay();
// Display weather data
updateDisplay(now, temperature);
delay(1000);
}
void updateDisplay(DateTime now, float temperature) {
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setFont(NULL);
display.setCursor(45, 0);
display.println(daysOfTheWeek[now.dayOfTheWeek()]);
// Format time
String timeString = formatTime(now.hour(), now.minute(), now.second());
display.setCursor(10, 15);
display.print(timeString);
// Format date
String dateString = formatDate(now.year(), now.month(), now.day());
display.setCursor(65, 15);
display.println(dateString);
// Display temperature
display.setCursor(0, 40);
display.println("Temperature:");
display.setCursor(72, 40);
display.print(temperature, 0);
// Draw separator lines
display.drawLine(0, 10, 128, 10, SSD1306_WHITE);
display.drawLine(0, 26, 128, 26, SSD1306_WHITE);
display.drawLine(60, 25, 60, 10, SSD1306_WHITE);
// Update display
display.display();
}
String formatTime(int hours, int minutes, int seconds) {
String formattedTime = "";
formattedTime += hours > 12 ? hours - 12 : hours;
formattedTime += ":";
formattedTime += minutes < 10 ? "0" + String(minutes) : String(minutes);
formattedTime += hours >= 12 ? "PM" : "AM";
return formattedTime;
}
String formatDate(int year, int month, int day) {
String formattedDate = "";
formattedDate += (day < 10 ? "0" + String(day) : String(day));
formattedDate += "/";
formattedDate += (month < 10 ? "0" + String(month) : String(month));
formattedDate += "/";
formattedDate += String(year);
return formattedDate;
}