This is an old revision of the document!
Proiect realizat de Ioniță Alexandru-Andrei, 332CA
Care este scopul proiectului?
Să dezvolte un dispozitiv multifuncțional pentru noptieră, integrând protocoalele și modulele studiate la laborator (USART, timere/întreruperi, PWM, ADC, SPI, I²C) într-un sistem util și interactiv.
Ce a inspirat ideea?
Inspirat de ecosistemele smart home și de gadgeturile de tip „all-in-one” pentru casă, proiectul își propune să ofere informații de mediu și divertisment audio într-un singur dispozitiv compact.
De ce este util acest proiect?
Acest ceas multifuncțional:
afișează ora și temperatura în timp real;
redă radio FM și muzică de pe microSD;
permite setarea alarmelor și redarea audio prin aplicație mobilă.
Componentă | Funcționalitate principală |
---|---|
Arduino Mega 2560 (CH340) | MCU, gestionare protocoale I²C/SPI/UART/PWM/ADC și ISR. |
RTC DS3231 | Ceas în timp real I²C, acuratețe ridicată. |
LCD 16×2 I²C (PCF8574) | Afișare temperatură, titlu melodie și mesaje. |
Radio FM TEA5767 | Recepție FM I²C, control frecvență și volum. |
TM1637 4×7-seg | Afișare ora format HH:MM multiplexat. |
Senzor temperat. LM35 | Citire analogică via ADC (10 mV/°C). |
Modul MP3 YX5200 | Decodare MP3 de pe microSD, control serial UART. |
Amplificator TPA3118 (12 V) | Amplificator Clasa D, până la 60 W. |
Modul Bluetooth HC-05 | Comunicație UART master/slave pentru aplicație mobilă. |
Nume componentă | Cantitate | Link achiziție | PIN |
---|---|---|---|
Arduino Mega 2560 | 1 | https://www.optimusdigital.ro/.../mega-2560-ch340.html | - |
RTC DS3231 | 1 | https://www.optimusdigital.ro/.../modul-ceas-ds3231.html | SDA – pin 20, SCL – pin 21, VCC – 5V, GND – GND |
Senzor de temperatură LM35 | 1 | https://www.optimusdigital.ro/.../senzor-lm35.html | OUT – A7, VCC – 5V, GND – GND |
LCD 16×2 I²C (PCF8574) | 1 | https://www.optimusdigital.ro/.../lcd-i2c.html | SDA – pin 20, SCL – pin 21, VCC – 5V, GND – GND |
Modul display TM1637 4×7-seg | 1 | https://www.optimusdigital.ro/.../tm1637.html | DIO – D4, CLK – D5, VCC – 5V, GND – GND |
Modul MP3 YX5200 | 1 | https://www.optimusdigital.ro/.../mp3-mini.html | VCC – 5V, GND – GND, SPK+ – la comutator audio, SPK– – GND |
Amplificator TPA3118 60 W | 1 | https://www.optimusdigital.ro/.../tpa3118.html | IN+ – la ieșire comutator audio, IN– – GND, VCC – 5V/12V, GND – GND, OUT+/- – la difuzor |
Modul Bluetooth HC-05 | 1 | https://www.optimusdigital.ro/.../hc05.html | VCC – 5V, GND – GND, TX (modul) – D8 (RX la Arduino), RX (modul) – D9 |
Breadboard 750 puncte | 1 | (generic) | - |
Jumper wires (Dupont) | set | (generic) | - |
Condensator 47 nF/50 V | 2 | (ceramic, cuplaj audio) | Între ieșirea audio și IN+ amplificator (opțional, pentru filtrare zgomot/impulsuri) |
Cablu audio AUX 3.5 mm M–M | 1 | (generic) | Între amplificator și difuzor sau între surse audio externe (după caz) |
Cablu boxă twin-core AWG20 | 1 m | (speaker wire) | Între OUT+/- amplificator și difuzor |
Adaptor 12 V 2 A | 1 | (generic) | Alimentare pentru amplificator (și/sau Arduino, dacă e nevoie) |
Difuzor 4–8 Ω, 3–5 W | 1 | (generic) | La OUT+ și OUT– de la amplificator |
#define BUZZER_PIN 7
#define TM1637_DIO 4
#define TM1637_CLK 5
#define BUTTON_PIN 2
#define POT_PIN A7
#define BT_RX 8
#define BT_TX 9
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS3231 rtc;
TM1637Display display(TM1637_CLK, TM1637_DIO);
SoftwareSerial btSerial(BT_RX, BT_TX);
RDA5807M radio;
volatile bool alarmTriggered = false;
int alarmHour = 8, alarmMinute = 0;
bool alarmActive = false;
unsigned long lastBeepTime = 0;
bool buzzerState = false;
void IRAM_ATTR handleButton() {
alarmActive = false; \\ digitalWrite(BUZZER_PIN, LOW); \\ lcd.setCursor(0, 1); \\ lcd.print("Alarma oprita! "); \\
}
void setup() {
pinMode(BUZZER_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), handleButton, FALLING);
Serial.begin(9600); btSerial.begin(9600);
Wire.begin(); lcd.init(); lcd.backlight(); rtc.begin(); display.setBrightness(0x0f); radio.init(); radio.setFrequency(10390);
lcd.setCursor(0, 0); lcd.print("Ceas multi-lab!");
}
void loop() {
DateTime now = rtc.now(); int hh = now.hour(); int mm = now.minute(); int ss = now.second();
int timeVal = hh * 100 + mm; display.showNumberDecEx(timeVal, 0b01000000, true);
if (Serial.available()) { String cmd = Serial.readStringUntil('\n'); handleCommand(cmd); } if (btSerial.available()) { String cmd = btSerial.readStringUntil('\n'); handleCommand(cmd); }
if (alarmActive) { unsigned long t = millis(); if (t - lastBeepTime > 300) { buzzerState = !buzzerState; analogWrite(BUZZER_PIN, buzzerState ? 180 : 0); lastBeepTime = t; } lcd.setCursor(0, 1); lcd.print("ALARMA! "); } else { digitalWrite(BUZZER_PIN, LOW); }
lcd.setCursor(0, 0); lcd.printf("%02d:%02d:%02d T:%.1f ", hh, mm, ss, temp);
if (!alarmActive && hh == alarmHour && mm == alarmMinute && ss == 0) { alarmActive = true; }
delay(50);
}
void handleCommand(String cmd) {
cmd.trim(); \\ if (cmd.startsWith("ALARM ")) { \\ int sep = cmd.indexOf(':'); \\ if (sep > 0) { \\ alarmHour = cmd.substring(6, sep).toInt(); \\ alarmMinute = cmd.substring(sep+1).toInt(); \\ Serial.println("Setat alarma la " + String(alarmHour) + ":" + String(alarmMinute)); \\ btSerial.println("Setat alarma la " + String(alarmHour) + ":" + String(alarmMinute)); \\ } \\ } else if (cmd.startsWith("RADIO ")) { \\ float freq = cmd.substring(6).toFloat() / 100; \\ radio.setFrequency(freq); \\ Serial.println("Radio: " + String(freq, 2)); \\ btSerial.println("Radio: " + String(freq, 2)); \\ } \\
}