This is an old revision of the document!
Utilizatorul poate observa în timp real temperatura și starea sistemului prin intermediul unui afișaj LCD I2C, iar o temperatură ridicată este semnalizată vizual și auditiv printr-un buzzer și un ansamblu de 4 LED-uri controlate direct din registre (DDRx și PORTx). Sistemul este controlat manual printr-un buton ON/OFF implementat cu fire și detectare software, fără debounce hardware.
Proiectul se axează pe respectarea cerințelor academice, înglobând concepte studiate în cadrul laboratorului de PM, precum utilizarea GPIO, ADC, I2C, UART și control direct al perifericelor prin accesarea registrelor microcontrolerului. De asemenea, este evidențiată separarea logicii de test față de logica de funcționare reală, aspect esențial în dezvoltarea sistemelor embedded robuste.
Temperatura este citită, procesată și afișată în timp real pe un LCD I2C. În funcție de valoarea detectată, sistemul activează o alertă acustică printr-un buzzer și o alertă vizuală prin intermediul a patru LED-uri controlate direct prin registre (DDRx, PORTx). Un buton fizic (ON/OFF) permite activarea și dezactivarea sistemului în mod manual, fără resetarea plăcii.
Astfel, proiectul combină citirea de date, afișarea în timp real, controlul logic pe praguri și utilizarea eficientă a perifericelor externe, acoperind toate cerințele hardware și software prevăzute pentru proiect. Implementarea controlului LED-urilor prin registre oferă un plus de eficiență și demonstrează înțelegerea nivelului hardware al microcontrolerului.
🔹 Afișaj
🔹 Senzori și comenzi
🔹 Semnalizare
🔹 Conexiuni și structură
#define BUZZER_PIN 2 #define SWITCH_PIN 8 #define BUTON_ONOFF 5 // LED-uri: D6 (PD6), D9 (PB1), D10 (PB2), D11 (PB3) const byte LED_MASK_D = (1 << PD6); const byte LED_MASK_B = (1 << PB1) | (1 << PB2) | (1 << PB3); void setup() { // Configurare registre pentru LED-uri DDRD |= LED_MASK_D; // setează D6 ca output DDRB |= LED_MASK_B; // setează D9, D10, D11 ca output // Inițial LED-urile sunt stinse PORTD &= ~LED_MASK_D; PORTB &= ~LED_MASK_B; }
2. Comutarea sistemului ON/OFF cu buton
bool sistemPornit = false; static bool lastButon = HIGH; void loop() { bool currentButon = digitalRead(BUTON_ONOFF); if (lastButon == HIGH && currentButon == LOW) { sistemPornit = !sistemPornit; lcd.clear(); lcd.setCursor(0, 0); lcd.print(sistemPornit ? "Sistem pornit" : "Sistem oprit"); delay(300); // debounce simplu } lastButon = currentButon;
3. Selectarea modului Real / Test
bool modTest = digitalRead(SWITCH_PIN) == LOW; float tempC; if (modTest) { int potValue = analogRead(POT_PIN); tempC = map(potValue, 0, 1023, 150, 400) / 10.0; } else { sensors.requestTemperatures(); tempC = sensors.getTempCByIndex(0); }
4. Control alertă: LED-uri + buzzer
// ALERTĂ de temperatură if (tempC >= TEMP_PRAG) { static unsigned long lastStep = 0; static int ledIndex = 0; if (millis() - lastStep >= 150) { lastStep = millis(); for (int i = 0; i < 4; i++) { if (i == ledIndex) { if (i == 0) PORTD |= (1 << PD6); else PORTB |= (1 << (PB1 + i - 1)); } else { if (i == 0) PORTD &= ~(1 << PD6); else PORTB &= ~(1 << (PB1 + i - 1)); } } ledIndex = (ledIndex + 1) % 4; } digitalWrite(BUZZER_PIN, HIGH); } else { // LED-uri aprinse continuu, buzzer oprit PORTD |= LED_MASK_D; PORTB |= LED_MASK_B; digitalWrite(BUZZER_PIN, LOW); }
Funcționalitățile implementate și verificate:
Testele efectuate au confirmat comportamentul așteptat în toate scenariile simulate: încălzire activă, standby și alertă (overheating). Sistemul a răspuns stabil la toate comenzile și a menținut funcționalitatea corectă pe durata rulărilor extinse.
Proiectul demonstrează integrarea eficientă a perifericelor externe și a conceptelor de programare embedded studiate în cadrul laboratorului: GPIO, ADC, UART, I2C, registre directe și timere software.
În urma implementării acestui proiect, am înțeles mai bine atât interacțiunea dintre componentele hardware, cât și modul de control eficient al acestora la nivel de microcontroler.
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.