#include <Arduino.h>
#include <OneWire.h>
#include "RTClib.h"
#include "U8glib.h"
#include "Adafruit_SSD1306.h"
#include <dht.h>
dht DHT;
#define DHT22_PIN 8
#define dsPin 8
const int btn1Pin = 5;
const int btn2Pin = 3;
const int btn3Pin = 2;
const int buzPin = 10;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
int btnsPins[3] = {btn1Pin, btn2Pin, btn3Pin};
RTC_DS1307 rtc;
OneWire oneWire(8);
Adafruit_SSD1306 ssd(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
String format(String arg);
void handleBtnClick();
struct Time
{
public:
int hours = 0;
int minutes = 0;
String toString()
{
return format(String(hours)) + ":" + format(String(minutes));
}
void addHour()
{
hours++;
if (hours == 24)
{
hours = 0;
}
}
void addMinute()
{
minutes++;
if (minutes == 60)
{
minutes = 0;
}
}
bool isAlarm(DateTime time)
{
if (time.hour() == hours && time.minute() == minutes)
{
return true;
}
else
{
return false;
}
}
};
Time time;
class Display
{
public:
Display(int textSize, int textColor)
{
ssd.setTextColor(textColor);
ssd.setTextSize(textSize);
ssd.clearDisplay();
}
void showDateTime(DateTime dateTime)
{
String time = format(String(dateTime.hour())) + ":"
+ format(String(dateTime.minute())) + ":"
+ format(String(dateTime.second()));
String day = String(dateTime.day());
String month = String(dateTime.month());
String year = String(dateTime.year());
String date = format(day) + "." + format(month) + "." + year;
ssd.setCursor(0, 0);
ssd.println(time);
ssd.println(date);
}
void showTemperature(int temperature)
{
String temp = String(temperature) + "`C";
ssd.println(temp);
}
void showAlarm()
{
ssd.setCursor(0, 0);
ssd.println(time.toString());
Serial.println(time.toString());
}
};
void setup() {
//tone(buzPin, 31);
Serial.begin(9600);
Serial.println("Start");
// pinMode(btn1Pin, INPUT_PULLUP);
for (int i = 0; i < sizeof(btnsPins); i++) {
pinMode(btnsPins[i], INPUT_PULLUP);
}
rtc.begin();
if(!ssd.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
ssd.display();
delay(500);
ssd.clearDisplay();
pinMode(buzPin, OUTPUT);
}
bool isAlarmState = false;
int lastBtnState = HIGH;
int lastBtn2State = HIGH;
int lastBtn3State = HIGH;
bool isAlarm = false;
int lastAlarm = 0;
void loop() {
DHT.read22(DHT22_PIN);
Display display(2, WHITE);
handleBtnClick();
if (isAlarmState) {
display.showAlarm();
int btn2State = digitalRead(btn2Pin);
if (btn2State != lastBtn2State) {
if (btn2State == LOW) {
Serial.println("btn2");
time.addHour();
}
}
lastBtn2State = btn2State;
int btn3State = digitalRead(btn3Pin);
if (btn3State != lastBtn3State) {
if (btn3State == LOW) {
time.addMinute();
}
}
lastBtn3State = btn3State;
}
else {
DateTime dateTime = rtc.now();
if (time.isAlarm(dateTime) && millis() - lastAlarm > 60000) {
lastAlarm = millis();
isAlarm = true;
Serial.println("Alarm!!!!!!!!!!");
tone(buzPin, 31);
}
else {
isAlarm = false;
noTone(buzPin);
}
display.showDateTime(dateTime);
display.showTemperature(DHT.temperature);
}
ssd.display();
}
String format(String arg) {
if (arg.length() <= 1) {
return "0" + arg;
}
return arg;
}
void handleBtnClick(){
int btnState = digitalRead(btn1Pin);
if (btnState != lastBtnState) {
if (btnState == LOW) {
if (isAlarm) {
Serial.println("No alarm");
noTone(buzPin);
}
if (isAlarmState == false) {
isAlarmState = true;
}
else {
isAlarmState = false;
}
Serial.println(isAlarmState);
}
}
lastBtnState = btnState;
}