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);
cd.setCursor(0, 1);
lcd.print(“Alarma oprita! ”);
}
void setup() { pinMode(BUZZER_PIN, OUTPUT); inMode(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));
} }
Lab 1 (UART): Serial Monitor + SoftwareSerial pentru Bluetooth HC-05, primești/setezi alarmă/radio de la PC sau app BT.
Lab 3 (Timere, PWM): PWM pe buzzer, toggling cu millis().
Lab 5 (SPI): Citire fisiere SD Card
Lab 6 (I2C): RTC DS3231, LCD, Radio RDA5807M – toate pe I2C.