This is an old revision of the document!
Prin intermediul unui afișaj LCD, utilizatorul poate monitoriza temperatura curentă, modul activ și statusul sistemului. Controlul automat al încălzirii este realizat cu ajutorul unui MOSFET și al semnalelor PWM, iar supratemperatura este semnalizată printr-un buzzer și un LED. Sistemul include și un mod special de testare pentru verificarea comportamentului software fără a fi necesară încălzirea fizică a elementului rezistiv.
Proiectul este conceput ca o demonstrație hardware și software, respectând cerințele academice de integrare a multiplelor periferice externe și a noțiunilor de programare embedded studiate în cadrul laboratoarelor.
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.