Projekt 6 - Alarm
07.03.2011 04:58Projekt Alarm nám demonstruje jednoduché reálné využití MCU v domácnosti.
Stavy alarmu:
- pokud připojíme napětí a senzor není sepnutý (dveře nebo okno je otevřené), tak LED2 bliká
- jakmile je senzor sepnutý LED2 svítí, alarm přešel do aktivního stavu
- pokud se v aktivním stavu senzor rozpojí, začne střídavě blikat LED1 a LED2
- pokud se v tomto čase (default 14 sec) nestiskne tlačítko S2 a nedrží se, dokud nepřestanou blikat, spustí se siréna a LED1 (červená) bude svítit s problikáváním
- po určitém časovém intervalu (default 92 sec) se siréna vypne a program se spustí od začátku
Schéma zapojení je následující.
Jako senzor doporučuji použít Magnetický dveřní spínač, jeho cena se pohybuje kolem 30 - 50 Kč.
Součástky R32, R33, R34 a S2 jsou již na desce, pokud byste procesor vkládali do svojí desky, je vhodné použít stejné hodnoty: R34 = 47kΩ; R32, R33 dle použitých diod.
Rezistor R1 je k Magnetickému dveřnímu spínači jeho hodnota by měla být 47kΩ.
Rezistor R2 vede proud do báze tranzistoru a otevírá jej, vzodná velikost je cca 500Ω.
Místo sirénky lze použít i relé a spínat tak i "něco většího" ;-)
Zde je odkaz na soubor se zdrojovým kódem
#include "moje_lib.h"
#include "msp430g2231.h"
#define LED1 BIT0
#define LED2 BIT6
#define S2 BIT3
#define SENS BIT5 // Definuje bit portu pro senzor
#define SIRE BIT7 // Definuje bit portu pro sirénu
#define DEL1 5000
#define DEL2 50000
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= (LED1 + LED2 + SIRE);
P1OUT &= ~(LED1 + LED2 + SIRE);
for (;;)
{
unsigned int y; // Vytvoření proměnné y, rozsah integer
unsigned int z; // Vytvoření proměnné z, rozsah integer
/*
Po startu programu se zjištuje zda je nebo není senzor sepnut
*/
while ((P1IN & SENS) == SENS) // Pokud není senzor sepnut
{
/*
Zelená dioda (LED2) bliká, což zařídí následující příkaz s funkcí XOR: ^=
*/
P1OUT ^= LED2;
// Chvíli se vyčká a pak se znovu kontroluje senzor
delaytime(DEL1);
}
while ((P1IN & SENS) != SENS) // Pokud je senzor sepnut
{
/*
Zelená dioda (LED2) se rozsvítí, což zařídí následující příkaz: |=
*/
P1OUT |= LED2;
// Chvíli se vyčká a pak se znovu kontroluje senzor
delaytime(DEL2);
}
/*
Pokud se senzor rozpojí, přesune se program do této části kódu, kde určitý čas (tento čas nám udává hodnota promenné y ) blikají LED1 a LED2. Pokud v tomto čase zmáčkneme spinač S2 a držíme, dokud nepřestane blikat LED1, tak se přesune program opět na začátek.
*/
for (y = 30; y > 0; y--)
{
P1OUT ^= LED2;
P1OUT ^= LED1;
delaytime(DEL2);
if ((P1IN & S2) != S2) // Zjištujeme stav spínače S2
z = 1;
else
z = 0;
}
if (z == 0) // S2 nebyl sepnut
{
P1OUT &= ~LED2; // Zelená dioda LED2 se vypne
P1OUT |= (LED1 + SIRE); // Červená dioda a výstup sirény sepne
/*
Nyní se bude čekat po dobu uloženou v proměnné y, po tuto dobu bude červená dioda LED1 blikat a siréna houkat
*/
for (y = 200; y > 0; y--)
{
delaytime(DEL2);
P1OUT ^= LED1;
delaytime(DEL1);
P1OUT ^= LED1;
}
/*
Čas na houkání doběhl, siréna a červená dioda LED1 se nyní vypne
*/
P1OUT &= ~(LED1 + SIRE);
}
}
}
———
Zpět