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 citită este procesată și afișată pe un LCD I2C, iar în funcție de pragurile setate, Arduino controlează un element de încălzire (simulat în Wokwi cu un LED PWM), un LED de stare și un buzzer pentru semnalizare acustică.
Astfel, proiectul combină citirea de date, afișarea în timp real, controlul PWM și generarea de alerte, acoperind toate cerințele hardware și software prevăzute pentru proiect.
🔹 Afișaj
🔹 Senzori și comenzi
🔹 Semnalizare
🔹 Control încălzire
🔹 Conexiuni și structură
Pini #define BUTTON_PIN 5 #define SWITCH_PIN 7 #define TEMP_SENSOR_PIN 2 #define LED_PIN 4 #define PWM_PIN 6 #define POT_PIN A0 potentiometru pentru modul test
LiquidCrystal_I2C lcd(0x27, 16, 2);
OneWire oneWire(TEMP_SENSOR_PIN); DallasTemperature sensors(&oneWire);
bool systemOn = false; float overheatThreshold = 25.0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(SWITCH_PIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); pinMode(PWM_PIN, OUTPUT); pinMode(POT_PIN, INPUT);
lcd.init(); lcd.backlight();
Serial.begin(9600); sensors.begin();
lcd.setCursor(0, 0); lcd.print("Sistem: OPRIT"); lcd.setCursor(0, 1); lcd.print("Mod: ---");
}
void loop() {
static bool lastButtonState = HIGH; bool currentButtonState = digitalRead(BUTTON_PIN);
if (lastButtonState == HIGH && currentButtonState == LOW) { systemOn = !systemOn;
lcd.clear(); lcd.setCursor(0, 0); lcd.print("Sistem: "); lcd.print(systemOn ? "PORNIT" : "OPRIT");
Serial.print("Sistem: "); Serial.println(systemOn ? "PORNIT" : "OPRIT");
delay(300); }
lastButtonState = currentButtonState;
if (systemOn) { bool isTestMode = digitalRead(SWITCH_PIN) == LOW;
if (!isTestMode) { // === MOD REAL === sensors.requestTemperatures(); float tempC = sensors.getTempCByIndex(0);
lcd.setCursor(0, 0); lcd.print("Temp: "); lcd.print(tempC, 1); lcd.print((char)223); lcd.print("C ");
Serial.print("Temp reala: "); Serial.println(tempC);
if (tempC > overheatThreshold) { lcd.setCursor(0, 1); lcd.print("ALERTA: OVERHEAT");
digitalWrite(LED_PIN, LOW); analogWrite(PWM_PIN, 0); } else { lcd.setCursor(0, 1); lcd.print("Mod: REAL ");
if (tempC < 25.0) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); }
int pwmValue = map(tempC, 0, 60, 255, 0); pwmValue = constrain(pwmValue, 0, 255); analogWrite(PWM_PIN, pwmValue); }
} else { // === MOD TEST === int rawValue = analogRead(POT_PIN); float fakeTemp = map(rawValue, 0, 1023, 0, 100);
lcd.setCursor(0, 0); lcd.print("Temp sim: "); lcd.print(fakeTemp, 1); lcd.print((char)223); lcd.print("C ");
Serial.print("Temp simulata: "); Serial.println(fakeTemp);
if (fakeTemp > overheatThreshold) { lcd.setCursor(0, 1); lcd.print("ALERTA: OVERHEAT");
digitalWrite(LED_PIN, LOW); analogWrite(PWM_PIN, 0); } else { lcd.setCursor(0, 1); lcd.print("Mod: TEST ");
if (fakeTemp < 25.0) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); }
int pwmValue = map(fakeTemp, 0, 60, 255, 0); pwmValue = constrain(pwmValue, 0, 255); analogWrite(PWM_PIN, pwmValue); } }
} else { lcd.setCursor(0, 0); lcd.print("Sistem: OPRIT "); lcd.setCursor(0, 1); lcd.print("Mod: --- ");
digitalWrite(LED_PIN, LOW); analogWrite(PWM_PIN, 0); }
delay(300);
}
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.