This is an old revision of the document!


Fire alarm

Introducere

Prezentarea pe scurt a proiectului vostru:

  • ce face

Proiectul va realiza diminuarea problemelor dintr-o încăpere atunci când este prezent un incendiu. Acesta va semnala pe un display faptul că un incendiu are loc și pe un card SD va salva toate log-urile relevante pentru evenimentele anterioare(timestamp, temperatură, etc.). De asemenea, printr-un difuzor va avea si un efect de alarmă.

  • care este scopul lui

Scopul lui este de a preveni incendiile într-o încăpere.

  • care a fost ideea de la care aţi pornit

Am pornit de la ideea de alarmă de incendiu simplu. Elementele de log-uri și de afișare pe un display au venit ulterior pentru a ține evidența evenimentelor.

Descriere generală

La acțiunea unui stimul extern pentru senzorul de temperatură se va transmite un semnal către microcontroller. Apoi, software-ul de pe microcontroller va putea transmite către celelalte componente semnale.

Hardware Design

Piesele hardware necesare:

  • Microcontroller ATMega328PB
    • Mediază interacțiunea între celelalte piese și software
  • Display LCD 1602 I2C
    • Afișează un mesaj în caz de incendiu
  • Buzzer
    • Pe post de alarmă
  • Modul card microSD
    • Salvează log-urile pe un card SD
  • Senzor temperatura DHT22

Software Design

Pentru programarea plăcii am folosit Arduino IDE, fără biblioteci specifice Arduino. Singurele biblioteci incluse sunt `<avr/io.h>` și `<util/delay.h>`, în rest s-au folosit funcții implementate manual (fiind un proiect orientat pe software). La baza design-ului software stau laboratoarele de I2C, SPI și datasheet-ul pentru senzorul DHT22, practic am încercat să integrez cât mai mult cod similar cu cel din laborator (plăcile fiind aproape identice). Particularități de implementare:

  • Implementarea comunicației I2C:
    1. Am utilizat digitalWrite() pentru a comunica cu registrii SDA si SCL
    2. Inițializarea magistralei I2C se face setând pinii SDA și SCL ca ieșire folosind registrul DDR.
    3. Trimiterea unui bit pe magistrala I2C implică setarea stării pinului SDA urmată de un impuls pe pinul SCL.
  • Implementarea comunicației SPI:
    1. Am utilizat funcții de nivel jos pentru a comunica cu cardul SD. Inițializarea SPI se face prin configurarea registrelor `SPCR` și `SPSR`:

```cpp

     void spiBegin() {
       pinMode(MOSI_PIN, OUTPUT);
       pinMode(MISO_PIN, INPUT);
       pinMode(SCK_PIN, OUTPUT);
       pinMode(SS_PIN, OUTPUT);
       SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0);
       SPSR &= ~(1 << SPI2X); // Clear the SPI2X bit
     }
     ```
     - Registrul SPCR este configurat pentru a activa modul SPI, pentru a seta placa în modul master și pentru a seta rata ceasului SPI.
     - Registrul SPSR este utilizat pentru a seta sau reseta bitul de dublare a ratei ceasului SPI.
  • Citirea datelor de la senzorul DHT22:
    1. Citirea datelor de la senzorul DHT22 se face folosind temporizări precise și manipulări directe ale pinului de date. Funcția `readDHT` inițializează comunicarea trimițând un semnal de start și apoi citește datele folosind cicluri de așteptare și măsurători de timp:

```cpp

     bool readDHT(float &temperature, float &humidity) {
       uint8_t data[5] = {0};
       pinMode(DHTPIN, OUTPUT);
       digitalWrite(DHTPIN, LOW);
       _delay_ms(20);
       digitalWrite(DHTPIN, HIGH);
       _delay_us(40);
       pinMode(DHTPIN, INPUT_PULLUP);
       // Așteptare pentru răspunsul senzorului
       if (!waitForSignal(LOW, 80) || !waitForSignal(HIGH, 80) || !waitForSignal(LOW, 80)) {
         return false;
       }
       // Citire date
       for (uint8_t i = 0; i < 5; i++) {
         data[i] = readByte();
       }
       // Verificare checksum
       if (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) {
         humidity = ((data[0] << 8) + data[1]) * 0.1;
         temperature = (((data[2] & 0x7F) << 8) + data[3]) * 0.1;
         if (data[2] & 0x80) {
           temperature = -temperature;
         }
         return true;
       }
       return false;
     }
     ```
  • Controlul buzzerului:
    1. Controlul buzzerului se face folosind funcțiile `tone()` și `noTone()` pentru a emite sunete de avertizare atunci când temperatura depășește un anumit prag.
  • Afișarea datelor pe ecranul LCD:
    1. Am implementat funcții pentru inițializare, curățare, setare cursor și scriere text pe LCD utilizând protocolul I2C. Inițializarea LCD-ului implică trimiterea unor comenzi de configurare prin magistrala I2C.
  • Utilizarea comunicației seriale:
    1. Pentru debugging și monitorizarea datelor în timpul execuției programului, am folosit funcțiile `Serial.print()` și `Serial.println()`.

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/prj2024/avaduva/vlad_vasile.ion.1716752540.txt.gz · Last modified: 2024/05/26 22:42 by vlad_vasile.ion
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