This is an old revision of the document!


Ceas multifuncțional

Proiect realizat de Ioniță Alexandru-Andrei, 332CA

Introducere

Despre ce este proiectul?
Ceas digital inteligent care combină afișarea timpului, măsurarea temperaturii, redarea posturilor FM și a fișierelor MP3 de pe card SD, plus configurare și control wireless prin Bluetooth, toate gestionate de un Arduino Mega 2560.

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ă.

Descriere generală

Descrierea componentelor

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ă.

Hardware Design

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

Software Design

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR)
  • librării şi surse 3rd-party (e.g. Procyon AVRlib)
  • algoritmi şi structuri pe care plănuiţi să le implementaţi
  • (etapa 3) surse şi funcţii implementate

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Cod

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <TM1637Display.h>
#include <SoftwareSerial.h>
#include <RDA5807M.h>

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

}

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2025/eradu/alexandru.ionita03.1748181365.txt.gz · Last modified: 2025/05/25 16:56 by alexandru.ionita03
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0