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 funcții de nivel jos pentru a inițializa și a trimite date către LCD. Aceste funcții manipulează direct pinii SDA și SCL folosind registrele DDR și PORT. De exemplu:

```

     void i2cStart() {
       digitalWrite(SDA_PIN, LOW);
       _delay_us(4);
       digitalWrite(SCL_PIN, LOW);
     }
     ```
     - Inițializarea magistralei I2C se face setând pinii SDA și SCL ca ieșire folosind registrul `DDR`.
     - 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` (SPI Control Register) este configurat pentru a activa modul SPI, pentru a seta placa în modul master și pentru a seta rata ceasului SPI.
     - Registrul `SPSR` (SPI Status Register) 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.1716752299.txt.gz · Last modified: 2024/05/26 22:38 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