Operácie

Alarm s PIR detektorom pohybu: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Vytvorená stránka „Záverečný projekt predmetu MIPS / LS2026 - '''Meno Priezvisko''' == Zadanie == Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie 400px|thumb|center|Vývojová doska ACROB. '''Literatúra:''' * [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob] * [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]…“
 
StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
 
(23 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 1: Riadok 1:
Záverečný projekt predmetu MIPS / LS2026 - '''Meno Priezvisko'''
Záverečný projekt predmetu MIPS / LS2026 - '''Filip Hreha'''


__TOC__
== 1. Zadanie ==


== Zadanie ==
Mojou úlohou bolo zapojiť a naprogramovať Alarm, ktorý využíva PIR detektor pohybu. Systém monitoruje určený priestor a v prípade narušenia (detekcie pohybu) okamžite aktivuje vizuálny alarm (LED dióda), akustický alarm (bzučiak) a zároveň odošle textové upozornenie o narušení cez sériovú linku do pripojeného počítača.
 
'''Literatúra:'''
* [https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf/Acrob_technical_description Dokumentácia k doske Acrob]
* [https://www.parallax.com/ Datasheet k PIR senzoru]


Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie
== 2. Analýza a opis riešenia ==
Ako snímač pohybu bol zvolený PIR senzor od firmy '''Parallax (model #555-28027)'''. Tento senzor meria zmeny infračerveného žiarenia (tepla) v okolí. Podľa priloženého datasheetu má senzor dôležitú vlastnosť a to: po zapnutí vyžaduje '''fázu zahrievania trvajúcu približne 40 sekúnd''', počas ktorej sa kalibruje na teplotu v miestnosti. Počas tejto doby systém signalizuje inicializáciu rýchlym blikaním LED diódy a ignoruje vstupy, aby sa predišlo falošným poplachom. Počas kalibrácie je nutné aby pred senzorom nebol žiaden pohyb.


[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
Po úspešnej kalibrácii prejde systém do funkčého režimu. Ak senzor zachytí pohyb, mikrokontrolér tento stav zachytí a zmení stavy na svojich výstupných pinoch – rozsvieti LED diódu a spustí bzučiak.


'''Literatúra:'''
=== 2.1 Zoznam použitých súčiastok ===
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
Použité súčiastky pre tento projekt:
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]


* '''Vývojová doska ATmega328P'''
:[[Súbor:Atmega328p.jpg|250px]]


__TOC__
* '''PIR Senzor Parallax (#555-28027)'''
:[[Súbor:Pir_senzor.png|250px]]


== Analýza  a opis riešenia ==
* '''Bzučiak'''
:[[Súbor:Bzucik.jpg|250px]]


Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
* '''Ochranný rezistor 220 Ω'''
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu.  
:[[Súbor:Rezistor220.jpg|250px]]


[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]
* '''Červená LED dióda'''
:[[Súbor:Ledcerven.jpg|250px]]


Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.
=== 2.2 Hardvérové zapojenia (Pinout) ===
Zapojenie komponentov k vývojovej doske ATMega328P:


[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]
<gallery mode="packed" heights="250px">
Súbor:Zapojenie_schema.png|'''Schéma zapojenia:'''
Súbor:Zapojenie_foto.png|'''Reálna realizácia:'''
</gallery>


== 3. Algoritmus a program ==
Hlavný program sa riadi podľa následujúcich krokov:
# '''Počiatočná inicializácia:'''
#* Nastavenie UART na prenosovú rýchlosť 9600.
# '''Kalibrácia senzora:'''
#* Podľa datasheetu senzor potrebuje kalibráciu na okolitú teplotu. Klaibrácia trvá 40 sekúnd.
#* Počas kalibrácie bliká LED dióda, čím vizuálne signalizuje používateľovi stav prípravy. Snímanie z pinu PIR senzora je v tejto fáze blokované.
# '''Signalizácia pripravenosti:'''
#* Po uplynutí 40 sekúnd sa vypne blikajúca LED, zopne bzučiak (krátke pípnutie), čo slúži ako znamenie,  že senzor je pripravený a cez UART sa odošle správa o úspešnej inicializácii.
# '''Monitorovacia slučka:'''
#* Systém neustále (v každom cykle) číta logický stav na vstupe `PD2`.
#* '''Ak je detegovaný pohyb:'''
#** Nastaví sa logická 1 na výstup `PB0` (rozsvietenie LED) a `PB1` (aktivácia bzučiaka).
#** Cez UART sa odošle správa o pohybe.
#** Vykoná sa krátke oneskorenie, ktoré bráni zahlteniu sériovej linky opakovanými správami.
#* '''Ak je priestor čistý:'''
#** Nastaví sa logická 0 na výstupy `PB0` a `PB1` (LED a bzučiak sa vypnú).


=== Algoritmus a program ===


Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto...
<tabs>
Výpis kódu je nižšie...
<tab name="Main AVR"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#include <avr/io.h>


#ifndef F_CPU
#define F_CPU 16000000UL
#endif


<tabs>
<tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#include <avr/io.h>
#include <util/delay.h>
#include "uart.h"
int main(void) {
    uart_init(MYUBRR); // inicializácia UART
    // Počiatočné nastavovanie
    DDRB |= (1 << DDB0);    // výstup LED
    DDRB |= (1 << DDB1);    // výstup bzučik
    DDRD &= ~(1 << DDD2);  // výstup PIR senzora
   
    PORTD &= ~(1 << PORTD2); // deaktivácia pullup rezistora


int main(void)
    // Kalibráca (40 sekúnd pokiaľ sa nahreje senzor)
{
    uart_print("--- ALARM SYSTEM INICIALIZACIA ---\r\n");
  unsigned int measuredValue;
    uart_print("Zahrievanie PIR senzora (cca 40s)...\r\n");
   
    for (int i = 0; i < 40; i++) {
        PORTB |= (1 << PORTB0);  // zapne LED
        _delay_ms(250);
        PORTB &= ~(1 << PORTB0); // vypne LED
        _delay_ms(750);         
    }
   
    // Koniec kalibrácie (Pip)
    PORTB |= (1 << PORTB1);  // zapne bzučiak
    _delay_ms(200);
    PORTB &= ~(1 << PORTB1); // vypne bzučiak
   
    uart_print("Senzor stabilizovany. Monitorovanie priestoru AKTIVNE.\r\n");


  while (1)
  // Hlavná slučka (Nekonečné snímanie)
  {
    while (1) {
    /*  relax  */
        // Kontrola stavu pinu PD2 (PIR)
  }
        if (PIND & (1 << PIND2)) {
           
            PORTB |= (1 << PORTB0);                // zapne LED
            PORTB |= (1 << PORTB1);                // zapne bzučiak
           
            uart_print("POZOR: Detegovany pohyb v miestnosti!\r\n");
            _delay_ms(500);                       
           
        } else {
            PORTB &= ~(1 << PORTB0);                // vypne LED
            PORTB &= ~(1 << PORTB1);                // vypne bzučiak
        }
    }


  return(0);
    return 0;
}
}


</syntaxhighlight ></tab>
</syntaxhighlight ></tab>
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="uart.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#ifndef UART_H_
#define UART_H_
 
#ifndef F_CPU
#define F_CPU 16000000UL
#endif


void adc_init(void);                                  // A/D converter initialization
#define BAUD 9600
#define MYUBRR ((F_CPU / (BAUD * 16UL)) - 1)


unsigned int adc_read(char a_pin);
void uart_init(unsigned int ubrr);
</syntaxhighlight ></tab>
void uart_transmit(unsigned char data);
</tabs>
void uart_print(const char* str);


Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':
#endif /* UART_H_ */;


Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
</syntaxhighlight ></tab>
<tab name="uart.c"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#include "uart.h"


=== Overenie ===
void uart_init(unsigned int ubrr) {
    UBRR0H = (unsigned char)(ubrr >> 8);
    UBRR0L = (unsigned char)ubrr;
    UCSR0B = (1 << TXEN0);                 
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
}


Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.
void uart_transmit(unsigned char data) {
Na konci uvádzame fotku hotového zariadenia.
    while (!(UCSR0A & (1 << UDRE0)));
    UDR0 = data;
}


[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]
void uart_print(const char* str) {
    while (*str) {
        uart_transmit(*str++);
    }
}
</syntaxhighlight ></tab>
</tabs>


'''Video:'''
<center><youtube>D0UnqGm_miA</youtube></center>


=== Overenie ===


== Čo by som urobil inak ==
Projekt bol zapojený na vývojovej doske a pripojený do PC pomocou USB. Na PC bol spustený sériový terminál.


Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak.  
Po zapnutí napájania a nahratí kódu začala LED dióda blikať. Po uplynutí 40 sekúnd bzučiak pípol, externá LED zhasla a v termináli sa objavila správa, že systém je pripravený.


Pri simulácii pohybu (mávanie rukou pred senzorom) systém okamžite zareagoval:
* Rozsvietila sa červená LED dióda.
* Bzučiak začal pípať.
* Do sériového terminálu začali prichádzať textové správy: `POZOR: Detegovany pohyb v miestnosti!`.


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.  
Po ukončení pohybu pred senzorom trvalo ešte niekoľko sekúnd (čo je hardvérová vlastnosť časovača v senzore), kým signál klesol opäť na nulu. Následne sa LED aj bzučiak vypli a systém sa vrátil do pohotovostného stavu.


'''Video:'''
<center><youtube>cFBvqpETGb4</youtube></center>
[[Category:AVR]] [[Category:MIPS]]
[[Category:AVR]] [[Category:MIPS]]

Aktuálna revízia z 17:18, 1. jún 2026

Záverečný projekt predmetu MIPS / LS2026 - Filip Hreha

1. Zadanie

Mojou úlohou bolo zapojiť a naprogramovať Alarm, ktorý využíva PIR detektor pohybu. Systém monitoruje určený priestor a v prípade narušenia (detekcie pohybu) okamžite aktivuje vizuálny alarm (LED dióda), akustický alarm (bzučiak) a zároveň odošle textové upozornenie o narušení cez sériovú linku do pripojeného počítača.

Literatúra:

2. Analýza a opis riešenia

Ako snímač pohybu bol zvolený PIR senzor od firmy Parallax (model #555-28027). Tento senzor meria zmeny infračerveného žiarenia (tepla) v okolí. Podľa priloženého datasheetu má senzor dôležitú vlastnosť a to: po zapnutí vyžaduje fázu zahrievania trvajúcu približne 40 sekúnd, počas ktorej sa kalibruje na teplotu v miestnosti. Počas tejto doby systém signalizuje inicializáciu rýchlym blikaním LED diódy a ignoruje vstupy, aby sa predišlo falošným poplachom. Počas kalibrácie je nutné aby pred senzorom nebol žiaden pohyb.

Po úspešnej kalibrácii prejde systém do funkčého režimu. Ak senzor zachytí pohyb, mikrokontrolér tento stav zachytí a zmení stavy na svojich výstupných pinoch – rozsvieti LED diódu a spustí bzučiak.

2.1 Zoznam použitých súčiastok

Použité súčiastky pre tento projekt:

  • Vývojová doska ATmega328P
  • PIR Senzor Parallax (#555-28027)
  • Bzučiak
  • Ochranný rezistor 220 Ω
  • Červená LED dióda

2.2 Hardvérové zapojenia (Pinout)

Zapojenie komponentov k vývojovej doske ATMega328P:

3. Algoritmus a program

Hlavný program sa riadi podľa následujúcich krokov:

  1. Počiatočná inicializácia:
    • Nastavenie UART na prenosovú rýchlosť 9600.
  2. Kalibrácia senzora:
    • Podľa datasheetu senzor potrebuje kalibráciu na okolitú teplotu. Klaibrácia trvá 40 sekúnd.
    • Počas kalibrácie bliká LED dióda, čím vizuálne signalizuje používateľovi stav prípravy. Snímanie z pinu PIR senzora je v tejto fáze blokované.
  3. Signalizácia pripravenosti:
    • Po uplynutí 40 sekúnd sa vypne blikajúca LED, zopne bzučiak (krátke pípnutie), čo slúži ako znamenie, že senzor je pripravený a cez UART sa odošle správa o úspešnej inicializácii.
  4. Monitorovacia slučka:
    • Systém neustále (v každom cykle) číta logický stav na vstupe `PD2`.
    • Ak je detegovaný pohyb:
      • Nastaví sa logická 1 na výstup `PB0` (rozsvietenie LED) a `PB1` (aktivácia bzučiaka).
      • Cez UART sa odošle správa o pohybe.
      • Vykoná sa krátke oneskorenie, ktoré bráni zahlteniu sériovej linky opakovanými správami.
    • Ak je priestor čistý:
      • Nastaví sa logická 0 na výstupy `PB0` a `PB1` (LED a bzučiak sa vypnú).


#include <avr/io.h>

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#include <avr/io.h>
#include <util/delay.h>
#include "uart.h" 

int main(void) {
    uart_init(MYUBRR); // inicializácia UART
    // Počiatočné nastavovanie
    DDRB |= (1 << DDB0);    // výstup LED
    DDRB |= (1 << DDB1);    // výstup bzučik
    DDRD &= ~(1 << DDD2);   // výstup PIR senzora
    
    PORTD &= ~(1 << PORTD2); // deaktivácia pullup rezistora

    // Kalibráca (40 sekúnd pokiaľ sa nahreje senzor)
    uart_print("--- ALARM SYSTEM INICIALIZACIA ---\r\n");
    uart_print("Zahrievanie PIR senzora (cca 40s)...\r\n");
    
    for (int i = 0; i < 40; i++) {
        PORTB |= (1 << PORTB0);  // zapne LED
        _delay_ms(250);
        PORTB &= ~(1 << PORTB0); // vypne LED
        _delay_ms(750);          
    }
    
    // Koniec kalibrácie (Pip)
    PORTB |= (1 << PORTB1);  // zapne bzučiak
    _delay_ms(200);
    PORTB &= ~(1 << PORTB1); // vypne bzučiak
    
    uart_print("Senzor stabilizovany. Monitorovanie priestoru AKTIVNE.\r\n");

   // Hlavná slučka (Nekonečné snímanie)
    while (1) {
        // Kontrola stavu pinu PD2 (PIR)
        if (PIND & (1 << PIND2)) {
            
            PORTB |= (1 << PORTB0);                 // zapne LED
            PORTB |= (1 << PORTB1);                 // zapne bzučiak
            
            uart_print("POZOR: Detegovany pohyb v miestnosti!\r\n");
            _delay_ms(500);                         
            
        } else {
            PORTB &= ~(1 << PORTB0);                // vypne LED
            PORTB &= ~(1 << PORTB1);                // vypne bzučiak
        }
    }

    return 0;
}
#ifndef UART_H_
#define UART_H_

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#define BAUD 9600
#define MYUBRR ((F_CPU / (BAUD * 16UL)) - 1)

void uart_init(unsigned int ubrr);
void uart_transmit(unsigned char data);
void uart_print(const char* str);

#endif /* UART_H_ */;
#include <avr/io.h>
#include "uart.h"

void uart_init(unsigned int ubrr) {
    UBRR0H = (unsigned char)(ubrr >> 8);
    UBRR0L = (unsigned char)ubrr;
    UCSR0B = (1 << TXEN0);                  
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
}

void uart_transmit(unsigned char data) {
    while (!(UCSR0A & (1 << UDRE0)));
    UDR0 = data;
}

void uart_print(const char* str) {
    while (*str) {
        uart_transmit(*str++);
    }
}


Overenie

Projekt bol zapojený na vývojovej doske a pripojený do PC pomocou USB. Na PC bol spustený sériový terminál.

Po zapnutí napájania a nahratí kódu začala LED dióda blikať. Po uplynutí 40 sekúnd bzučiak pípol, externá LED zhasla a v termináli sa objavila správa, že systém je pripravený.

Pri simulácii pohybu (mávanie rukou pred senzorom) systém okamžite zareagoval:

  • Rozsvietila sa červená LED dióda.
  • Bzučiak začal pípať.
  • Do sériového terminálu začali prichádzať textové správy: `POZOR: Detegovany pohyb v miestnosti!`.

Po ukončení pohybu pred senzorom trvalo ešte niekoľko sekúnd (čo je hardvérová vlastnosť časovača v senzore), kým signál klesol opäť na nulu. Následne sa LED aj bzučiak vypli a systém sa vrátil do pohotovostného stavu.

Video: