Alarm s PIR detektorom pohybu: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
| (6 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
| Riadok 5: | Riadok 5: | ||
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. | 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:''' | '''Literatúra:''' | ||
| Riadok 19: | Riadok 18: | ||
Použité súčiastky pre tento projekt: | Použité súčiastky pre tento projekt: | ||
* '''Vývojová doska ATmega328P''' | * '''Vývojová doska ATmega328P''' | ||
:[[Súbor:Atmega328p.jpg|250px]] | :[[Súbor:Atmega328p.jpg|250px]] | ||
| Riadok 47: | Riadok 46: | ||
#* Nastavenie UART na prenosovú rýchlosť 9600. | #* Nastavenie UART na prenosovú rýchlosť 9600. | ||
# '''Kalibrácia senzora:''' | # '''Kalibrácia senzora:''' | ||
#* Podľa datasheetu senzor potrebuje kalibráciu na okolitú teplotu. Klaibrácia trvá 40 sekúnd | #* 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é. | #* 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:''' | # '''Signalizácia pripravenosti:''' | ||
| Riadok 76: | Riadok 75: | ||
uart_init(MYUBRR); // inicializácia UART | uart_init(MYUBRR); // inicializácia UART | ||
// Počiatočné nastavovanie | // Počiatočné nastavovanie | ||
DDRB |= (1 << DDB0); // | DDRB |= (1 << DDB0); // výstup LED | ||
DDRB |= (1 << DDB1); // | DDRB |= (1 << DDB1); // výstup bzučik | ||
DDRD &= ~(1 << DDD2); // | DDRD &= ~(1 << DDD2); // výstup PIR senzora | ||
PORTD &= ~(1 << PORTD2); // deaktivácia pullup rezistora | PORTD &= ~(1 << PORTD2); // deaktivácia pullup rezistora | ||
| Riadok 137: | Riadok 136: | ||
#endif /* UART_H_ */; | #endif /* UART_H_ */; | ||
</syntaxhighlight ></tab> | </syntaxhighlight ></tab> | ||
</ | <tab name="uart.c"><syntaxhighlight lang="c++" style="background: LightYellow;"> | ||
#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++); | |||
} | |||
} | |||
</syntaxhighlight ></tab> | |||
</tabs> | |||
=== 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:''' | |||
<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:
-
Schéma zapojenia:
-
Reálna realizácia:
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ú).
#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: