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));
}
}