LaunchPad Texas Instruments

Projekt 6 - Alarm

07.03.2011 04:58

Projekt 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

Vyhledávání

© 2011 Všechna práva vyhrazena.