This is an old revision of the document!


Sistem de monitorizare al confortului termic intr-o cladire

Introducere

Proiectul Smart Mini Calorifer este un dispozitiv inteligent de încălzire controlat cu Arduino, creat pentru a demonstra integrarea mai multor componente electronice și funcționalități software într-un produs fizic. Dispozitivul poate funcționa atât în mod real, folosind un senzor de temperatură (DS18B20), cât și în mod de test, folosind un potențiometru pentru a simula manual temperatura.

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.

Descriere generala

Sistemul este centrat pe un microcontroller Arduino Uno, care gestionează toate funcțiile dispozitivului. Senzorul de temperatură DS18B20 furnizează date în modul real, iar potențiometrul furnizează valori simulate în modul de test, selectat cu ajutorul unui switch.

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.

Hardware Design

whatsapp_image_2025-05-22_at_00.31.30.jpeg

🔹 Microcontroller

  • Arduino Uno R3 (compatibil)

🔹 Afișaj

  • LCD 16×2 cu interfață I2C (adresă 0x27)

🔹 Senzori și comenzi

  • Senzor de temperatură DS18B20 digital
  • Potențiometru 10kΩ linear (pentru setare temperatură simulată)
  • Switch 2 poziții ON-OFF (pentru comutare mod Real / Test)
  • Buton tactil 12mm (pentru ON/OFF general)

🔹 Semnalizare

  • Buzzer activ 5V
  • LED roșu 5mm (pentru indicator stare)
  • Rezistor limitare curent LED (220Ω)

🔹 Control încălzire

  • MOSFET IRF540N / IRLZ44N (pentru comanda rezistenței)
  • Rezistență încălzire:
  • Rezistență ceramică 5–10W (10Ω)

🔹 Conexiuni și structură

  • Breadboard 400 puncte
  • Set fire jumper male-male, male-female, female-female
  • Adaptor alimentare 12V 2A DC

Software Design

#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <OneWire.h> #include <DallasTemperature.h>

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);

}

Rezultate Obţinute

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

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

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.

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/vstoica/alexandru.ciobotea.1748005483.txt.gz · Last modified: 2025/05/23 16:04 by alexandru.ciobotea
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