Alarm_Clock_Kettle
In this project, when an alarm clock is set, an audible alert sounds and a physical movement is triggered by a servo motor. Afterwards, the user can start a simple obstacle-avoidance game by pressing a button. It is both a fun and educational Arduino application. Further improvements will be made in the future.
Components and supplies
1
BreadBoard (Big)
1
MG995 Servo Motor
1
Four Line I2C 16x2 LCD Display
4
Push Button
1
Arduino uno
1
Active buzzer
1
40 Pin Ayrılabilen Erkek-Erkek M-M Jumper Kablo - 100 mm
1
https://www.robotistan.com/40-pin-ayrilabilen-disi-erkek-f-m-jumper-kablo-100mm
Tools and machines
1
Kettle
Apps and platforms
1
Arduino IDE 2.0 (beta)
Project description
Code
alarm_clock_kettle
cpp
1#include <Wire.h> 2#include <RTClib.h> 3#include <LiquidCrystal_I2C.h> 4#include <Servo.h> 5 6// LCD ekran tanımı 7LiquidCrystal_I2C lcd(0x27, 16, 2); 8 9// RTC modülü 10RTC_DS3231 rtc; 11 12// Servo motor 13Servo myservo; 14 15// Buzzer pini 16#define BUZZER_PIN 6 17 18// Buton pinleri 19#define BUTTON_MODE 2 20#define BUTTON_HOUR 3 21#define BUTTON_MIN 4 22#define BUTTON_GAME 9 // Oyun başlatma butonu 23 24// Alarm değişkenleri 25int alarmHour =07; 26int alarmMinute = 30; 27bool alarmSet = false; 28bool isSetting = false; 29bool alarmTriggered = false; // Alarm çaldıktan sonra oyun izni için 30 31// Buton durumlarını izlemek için 32bool lastModeButton = HIGH; 33bool lastHourButton = HIGH; 34bool lastMinButton = HIGH; 35 36// 🕹️ Oyun değişkenleri 37byte carChar[8] = { B00100, B01110, B11111, B10101, B00100, B01110, B01010, B10001 }; 38byte obstacleChar[8] = { B00000, B00100, B01110, B11111, B01110, B00100, B00000, B00000 }; 39 40#define PIN_BUTTON_GAME BUTTON_GAME 41 42#define CAR_POSITION_RUN_LOWER_1 0 43#define CAR_POSITION_RUN_LOWER_2 1 44#define CAR_POSITION_JUMP_1 2 45#define CAR_POSITION_JUMP_2 3 46#define CAR_POSITION_JUMP_3 4 47#define CAR_POSITION_JUMP_4 5 48#define CAR_POSITION_JUMP_5 6 49#define CAR_POSITION_JUMP_6 7 50#define CAR_POSITION_JUMP_7 8 51#define CAR_POSITION_JUMP_8 9 52 53int CARPos = CAR_POSITION_RUN_LOWER_1; 54bool playing = false; 55char terrainUpper[16] = " "; 56char terrainLower[16] = " "; 57 58void setup() { 59 Serial.begin(9600); 60 61 lcd.init(); 62 lcd.backlight(); 63 lcd.clear(); 64 65 if (!rtc.begin()) { 66 lcd.print("RTC YOK!"); 67 while (1); 68 } 69 70 if (rtc.lostPower()) { 71 //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); 72 } 73 74 pinMode(BUZZER_PIN, OUTPUT); 75 digitalWrite(BUZZER_PIN, LOW); 76 77 myservo.attach(5); 78 myservo.write(0); 79 80 pinMode(BUTTON_MODE, INPUT_PULLUP); 81 pinMode(BUTTON_HOUR, INPUT_PULLUP); 82 pinMode(BUTTON_MIN, INPUT_PULLUP); 83 pinMode(BUTTON_GAME, INPUT_PULLUP); 84 85 lcd.createChar(0, carChar); 86 lcd.createChar(1, obstacleChar); 87 randomSeed(analogRead(A0)); 88} 89 90void loop() { 91 if (playing) { 92 drawTerrain(); 93 drawCAR(); 94 delay(250); 95 advanceTerrain(); 96 switch (CARPos) { 97 case CAR_POSITION_JUMP_1: CARPos = CAR_POSITION_JUMP_2; break; 98 case CAR_POSITION_JUMP_2: CARPos = CAR_POSITION_JUMP_3; break; 99 case CAR_POSITION_JUMP_3: CARPos = CAR_POSITION_JUMP_4; break; 100 case CAR_POSITION_JUMP_4: CARPos = CAR_POSITION_JUMP_5; break; 101 case CAR_POSITION_JUMP_5: CARPos = CAR_POSITION_JUMP_6; break; 102 case CAR_POSITION_JUMP_6: CARPos = CAR_POSITION_JUMP_7; break; 103 case CAR_POSITION_JUMP_7: CARPos = CAR_POSITION_JUMP_8; break; 104 case CAR_POSITION_JUMP_8: CARPos = CAR_POSITION_RUN_LOWER_1; break; 105 case CAR_POSITION_RUN_LOWER_1: CARPos = CAR_POSITION_RUN_LOWER_2; break; 106 case CAR_POSITION_RUN_LOWER_2: CARPos = CAR_POSITION_RUN_LOWER_1; break; 107 } 108 109 if (!playing) { 110 lcd.setCursor(0, 0); 111 lcd.print(" Oyun Bitti! "); 112 lcd.setCursor(0, 1); 113 lcd.print(" Butona bas :) "); 114 delay(1000); 115 } 116 117 if (digitalRead(PIN_BUTTON_GAME) == LOW) { 118 if (CARPos == CAR_POSITION_RUN_LOWER_1 || CARPos == CAR_POSITION_RUN_LOWER_2) 119 CARPos = CAR_POSITION_JUMP_1; 120 } 121 return; 122 } 123 124 DisplayDateTime(); 125 CheckAlarm(); 126 ButtonInput(); 127 128 // Alarmdan sonra D9’a basılırsa oyun başlasın 129 if (alarmTriggered && digitalRead(BUTTON_GAME) == LOW) { 130 alarmTriggered = false; 131 resetGame(); 132 playing = true; 133 lcd.clear(); 134 } 135 136 delay(200); 137} 138 139void DisplayDateTime() { 140 if (isSetting) return; 141 DateTime now = rtc.now(); 142 lcd.setCursor(0, 0); 143 lcd.print("Tarih:"); 144 if (now.day() < 10) lcd.print("0"); 145 lcd.print(now.day()); lcd.print("/"); 146 if (now.month() < 10) lcd.print("0"); 147 lcd.print(now.month()); lcd.print("/"); 148 lcd.print(now.year()); 149 150 lcd.setCursor(0, 1); 151 lcd.print("Saat: "); 152 if (now.hour() < 10) lcd.print("0"); 153 lcd.print(now.hour()); lcd.print(":"); 154 if (now.minute() < 10) lcd.print("0"); 155 lcd.print(now.minute()); lcd.print(":"); 156 if (now.second() < 10) lcd.print("0"); 157 lcd.print(now.second()); 158} 159 160void ButtonInput() { 161 bool currentModeButton = digitalRead(BUTTON_MODE); 162 bool currentHourButton = digitalRead(BUTTON_HOUR); 163 bool currentMinButton = digitalRead(BUTTON_MIN); 164 165 if (lastModeButton == HIGH && currentModeButton == LOW) { 166 isSetting = !isSetting; 167 lcd.clear(); 168 if (isSetting) { 169 lcd.setCursor(0, 0); 170 lcd.print("Alarm Ayarlaniyor"); 171 ShowAlarmTime(); 172 } else { 173 alarmSet = true; 174 lcd.setCursor(0, 0); 175 lcd.print("Alarm Ayarlandi"); 176 ShowAlarmTime(); 177 delay(2000); 178 lcd.clear(); 179 } 180 } 181 182 if (isSetting) { 183 if (lastHourButton == HIGH && currentHourButton == LOW) { 184 alarmHour++; 185 if (alarmHour > 23) alarmHour = 0; 186 ShowAlarmTime(); 187 } 188 189 if (lastMinButton == HIGH && currentMinButton == LOW) { 190 alarmMinute++; 191 if (alarmMinute > 59) alarmMinute = 0; 192 ShowAlarmTime(); 193 } 194 } 195 196 lastModeButton = currentModeButton; 197 lastHourButton = currentHourButton; 198 lastMinButton = currentMinButton; 199} 200 201void CheckAlarm() { 202 DateTime now = rtc.now(); 203 204 if (alarmSet && now.hour() == alarmHour && now.minute() == alarmMinute && now.second() == 0) { 205 lcd.clear(); 206 lcd.setCursor(0, 0); 207 lcd.print(" ALARM!!! "); 208 tone(BUZZER_PIN, 1000); 209 delay(500); 210 noTone(BUZZER_PIN); 211 212 for (int pos = 0; pos <= 90; pos++) { 213 myservo.write(pos); 214 delay(15); 215 } 216 delay(500); 217 for (int pos = 90; pos >= 0; pos--) { 218 myservo.write(pos); 219 delay(15); 220 } 221 222 alarmSet = false; 223 alarmTriggered = true; 224 delay(1000); 225 lcd.clear(); 226 lcd.setCursor(0, 0); 227 lcd.print("Oyun icin D9!"); 228 delay(1000); 229 } 230} 231 232void ShowAlarmTime() { 233 lcd.setCursor(0, 1); 234 lcd.print("Saat: "); 235 if (alarmHour < 10) lcd.print("0"); 236 lcd.print(alarmHour); 237 lcd.print(":"); 238 if (alarmMinute < 10) lcd.print("0"); 239 lcd.print(alarmMinute); 240 lcd.print(" "); 241} 242 243void drawTerrain() { 244 lcd.setCursor(0, 0); lcd.print(terrainUpper); 245 lcd.setCursor(0, 1); lcd.print(terrainLower); 246} 247 248void drawCAR() { 249 int x = 1; 250 if (CARPos >= CAR_POSITION_JUMP_1 && CARPos <= CAR_POSITION_JUMP_8) { 251 lcd.setCursor(x, 0); 252 lcd.write(byte(0)); 253 if (terrainUpper[x] == byte(1)) playing = false; 254 } else { 255 lcd.setCursor(x, 1); 256 lcd.write(byte(0)); 257 if (terrainLower[x] == byte(1)) playing = false; 258 } 259} 260 261void advanceTerrain() { 262 for (int i = 0; i < 15; i++) { 263 terrainUpper[i] = terrainUpper[i + 1]; 264 terrainLower[i] = terrainLower[i + 1]; 265 } 266 267 if (random(10) > 7) { 268 terrainUpper[15] = ' '; 269 terrainLower[15] = byte(1); 270 } else { 271 terrainUpper[15] = ' '; 272 terrainLower[15] = ' '; 273 } 274} 275 276void resetGame() { 277 playing = true; 278 CARPos = CAR_POSITION_RUN_LOWER_1; 279 for (int i = 0; i < 16; i++) { 280 terrainUpper[i] = ' '; 281 terrainLower[i] = ' '; 282 } 283 lcd.clear(); 284}
Downloadable files
estimated image
Some parts are not visible due to the lack of a si
Ekran görüntüsü 2025-05-23 152357.png

Alarm Clock Kettle
"Maybe some wire is connected wrongly."
Arduino Elektronik Projesi Görselleştirmesi.png

Comments
Only logged in users can leave comments