#include <IRremote.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include "Clock.h"
#include "config.h"
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
OneWire oneWire(9);
DallasTemperature sensors(&oneWire);
IRrecv receiver(4);
decode_results results;
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int buzzerPin = A3;
int blinkCount = 0;
int x = 0;
int db, db1, db2;
const int NOTE_C4 = 262; // Tần số của nốt C4
const int NOTE_G3 = 196; // Tần số của nốt G3
const int NOTE_A3 = 220; // Tần số của nốt A3
const int NOTE_B3 = 247; // Tần số của nốt B3
const int DURATION = 200; // Thời gian phát mỗi nốt nhạc (ms)
const int PAUSE = 50; // Thời gian tạm dừng giữa các nốt nhạc (ms)
unsigned long previousMillis = 0; // Thời điểm trước đó
unsigned long currentMillis;
int noteIndex = 0;
const long interval = 100;
int alarmHour = 0;
int alarmMinute = 0;
bool alarmEnabled = false;
Clock clock;
void setAlarm(int hour, int minute)
{
alarmHour = hour;
alarmMinute = minute;
alarmEnabled = true;
}
void setup() {
Serial.begin(9600);
receiver.enableIRIn(); // Start the receiver
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
clock.begin();
sensors.begin();
pinMode(3, OUTPUT);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
oled.setCursor(20, 10);
oled.print("WELCOME!");
oled.display();
delay(1000);
}
void loop() {
DateTime now = clock.now();
beep();
checkAlarm();
if (x == 0) {displayTime();}
else if (x == 1 && db1 == 1) {displayTemp();}
else {Alarm();}
adjustTime();
}
//-------------------------------------------------------------------------------------------------------------
void displayTime()
{
DateTime now = clock.now();
oled.clearDisplay();
oled.setTextSize(3); // text size
oled.setTextColor(WHITE); // text color
oled.setCursor(20, 10);
if (now.hour() < 10)
{
oled.print("0");
oled.print(now.hour());
}
else {oled.print(now.hour());}
oled.print(":");
if (now.minute() < 10)
{
oled.print("0");
oled.print(now.minute());
}
else {oled.print(now.minute());}
oled.display();
}
//-------------------------------------------------------------------------------------------------------------
void Alarm()
{
oled.clearDisplay();
oled.setTextSize(2); // text size
oled.setTextColor(WHITE); // text color
oled.setCursor(0, 0);
oled.println("Arlarm ");
if (alarmHour < 10)
{
oled.print("0");
oled.print(alarmHour);
}
else {oled.print(alarmHour);}
oled.print(":");
if (alarmMinute < 10)
{
oled.print("0");
oled.print(alarmMinute);
}
else {oled.print(alarmMinute);}
oled.display();
}
//-------------------------------------------------------------------------------------------------------------
void displayTemp()
{
oled.clearDisplay();
oled.setTextSize(3); // text size
oled.setCursor(0, 10);
sensors.requestTemperatures();
oled.print(sensors.getTempCByIndex(0)); oled.print((char)247); oled.print("C");
oled.display();
}
//-------------------------------------------------------------------------------------------------------------
void adjustTime()
{
DateTime now = clock.now();
//setAlarm();
if (receiver.decode()) {
Serial.println(receiver.decodedIRData.command);
switch (receiver.decodedIRData.command)
{
case 2: // Button 1
if (x == 0) {clock.incrementHour();}
else if (x==2)
{
db2 = alarmHour + 1;
if (db2 > 23)
{
db2 = 0;
}
setAlarm(db2, alarmMinute);
}
break;
case 152: // Button 2
if (x==0) {clock.decrementHour();}
else if (x==2)
{
db2 = alarmHour - 1;
if (db2 < 0)
{
db2 = 23;
}
setAlarm(db2, alarmMinute);
}
break;
case 144: // Button 3
if (x==0) {clock.incrementMinute();}
else if (x==2)
{
db2 = alarmMinute + 1;
if (db2 > 59)
{
db2 = 0;
}
setAlarm(alarmHour, db2);
}
break;
case 224: // Button 4
if (x==0) {clock.decrementMinute();}
else if (x==2)
{
db2 = alarmMinute - 1;
if (db2 < 0)
{
db2 = 59;
}
setAlarm(alarmHour, db2);
}
break;
case 168: // Button 5
if (x == 0)
{
x = 1; db1 = 1;
}
else if (x == 1 && db1 == 1) {x = 2;}
else {x=0; db1 = 0;}
while (blinkCount < 2)
{
currentMillis = millis(); // get the current time
if (currentMillis - previousMillis >= 50)
{
previousMillis = currentMillis;
digitalWrite(buzzerPin, !digitalRead(buzzerPin));
blinkCount++;
}
}
blinkCount = 0;
digitalWrite(buzzerPin, LOW);
break;
}
receiver.resume();
}
}
//-------------------------------------------------------------------------------------------------------------
void beep()
{
DateTime now = clock.now();
if (now.minute() == 0 && now.second() == 0)
{
while (blinkCount < 4)
{
currentMillis = millis(); // get the current time
if (currentMillis - previousMillis >= interval)
{ // check if it's time to blink the LED
previousMillis = currentMillis; // save the last time the LED blinked
digitalWrite(buzzerPin, !digitalRead(buzzerPin)); // toggle the LED
blinkCount++; // increment blink count
}
}
}
else
{ // if button is not pressed
blinkCount = 0; // reset blink count
digitalWrite(buzzerPin, LOW); // turn off the LED
}
}
//-------------------------------------------------------------------------------------------------------------
void checkAlarm()
{
if (alarmEnabled) {
DateTime now = clock.now();
if (now.hour() == alarmHour && now.minute() == alarmMinute) {
while (noteIndex < 8)
{ // Phát 8 nốt nhạc
unsigned long currentMillis1 = millis(); // Thời điểm hiện tại
if (currentMillis1 - previousMillis >= DURATION) { // Nếu đã đủ thời gian phát nốt nhạc
previousMillis = currentMillis1; // Cập nhật thời điểm trước đó
switch (noteIndex) { // Phát nốt nhạc tương ứng
case 0:
case 4:
tone(buzzerPin, NOTE_C4);
break;
case 1:
tone(buzzerPin, NOTE_G3);
break;
case 2:
tone(buzzerPin, NOTE_A3);
break;
case 3:
tone(buzzerPin, NOTE_B3);
break;
case 5:
tone(buzzerPin, NOTE_B3);
break;
case 6:
tone(buzzerPin, NOTE_A3);
break;
case 7:
tone(buzzerPin, NOTE_G3);
break;
}
noteIndex++; // Tăng chỉ số của nốt nhạc đang phát
}
if (currentMillis1 - previousMillis >= PAUSE) { // Nếu đã đủ thời gian tạm dừng
noTone(buzzerPin); // Tắt âm thanh
}
}
}
}
}