Motorcykel/PushBike larmsystem (7 / 7 steg)
Steg 7: Mottagarenhet
Min mottagarenhet är inte en färdig enhet för detta system, det är snarare ett tidigare projekt som jag har ändrat för att fungera som en mottagarenhet. Enheten består av en hake Arduino ATmega328p monterad i plastkapsling med en I2C 16 x 2 Liquid Crystal Display, en 240 VAC 10A relä, en RGB-LED, en Summer och en NRF24L01 transceiver. Tanken här är att när en larmsignal mottas LCD-skärmen visas ett meddelande och blinkar tillsammans med en RGB LED, Summer ljud och reläet kopplar på en säkerhet strålkastare eller något liknande hög driv.
Min mottagarenhet innehåller även en annan Arduino Uno med Ethernet Shield som är programmerad att få tillgång till en online-tjänst som kallas Twilio som kommer att skicka ett SMS-meddelande till min mobiltelefon. Men jag kommer att koncentrera sig bara på ATmega328p mottagare krets, om du vill inkludera denna funktion i din enhet då chef över till här att lära sig hur. Min kod visar hur jag har skickat en digital utsignal från ATmega328p mottagare kretsen till Arduino Uno att utlösa skicka SMS koden. Också att märka att min mottagarenhet hus en 4-vägs relay board, men min kod endast använder en av dessa reläer.
Om vi tar en titt på koden:
Ställ in I2C 16 x 2 LCD uppvisning
#include < Wire.h >
#include < FastIO.h >
#include < I2CIO.h >
#include < LCD.h >
#include < LiquidCrystal.h >
#include < LiquidCrystal_I2C.h >
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7, 3, positiv); ställa in LCD-I2C adress
Här sätter vi en instans för LCD-skärmen kallas "lcd". Header-filer ingår är alla en del av LiquidCrystal_I2C biblioteket hittade här.
ställa in NRF24L01 transceiver
#include < SPI.h >
#include "nRF24L01.h"
#include "RF24.h"
#define CHIP_ENABLE 9
#define CHIP_SELECT 10
RF24 radio (CHIP_ENABLE, CHIP_SELECT);
CONST uint64_t rör [2] = {0xF0F0F0F0E2LL 0xF0F0F0F0D3LL};
Nästa, vi sätter upp den NRF24L01 instansen med samma metod som sändare enhet se till att vi använder samma adresser som röret.
/*********************************************************/
/ *** Systemkonfiguration *** /
/*********************************************************
/ definiera utgångsstift
#define SMS_OUTPUT 2
#define SUMMERN 4
#define GREEN_LED 5
#define RED_LED 6
#define BLUE_LED 7
#define FLOOD_LIGHT 8
definiera varaktigheter
#define ALARM_DURATION 10000 / / tid i millisekunder som aktiverar larmet
#define BUZZER_DURATION 0000 / / tid i millisekunder som Summer ljud
#define DISABLE_DURATION 30 / / tid i minuter som alarmet ska inaktiveras
deklarera globala variabler
osignerade långa lastReading;
unsigned int count = 0;
Nästa del av koden definierar olika variabler för skissen. Alarm varaktighet och summern varaktighet kan konfigureras här - jag har Summer varaktighet anges till 0 vid denna tid som driver min fru galen varje gång jag testa det :)
void setup(void)
{
Serial.BEGIN(38400);
pinMode (SMS_OUTPUT, OUTPUT);
pinMode (Summer, OUTPUT);
pinMode (GREEN_LED, OUTPUT);
pinMode (RED_LED, OUTPUT);
pinMode (BLUE_LED, OUTPUT);
pinMode (FLOOD_LIGHT, OUTPUT);
digitalWrite (SMS_OUTPUT, hög); Skicka inte SMS tills utlöste
LCD.BEGIN(16,2);
LCD.Clear();
LCD.backlight();
lcd.setCursor(0,0);
LCD.Print ("System Status:");
lcd.setCursor(0,1);
LCD.Print ("väpnade");
Flash grön LED att ange system reset
för (int jag = 0; jag < 10; i ++) {
digitalWrite (GREEN_LED, hög);
Delay(50);
digitalWrite (GREEN_LED, låg);
Delay(50);
}
lämna grön ledde på att ange system power
digitalWrite (GREEN_LED, hög);
installera och konfigurera RF radio
SPI.begin();
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate(RF24_250KBPS);
radio.setChannel(108);
radio.BEGIN();
radio.setRetries (15, 15); fördröjning mellan försöken, antal återförsök
radio.setPayloadSize (8). att minska Nyttolaststorlek förbättra reliabiliteten
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1,pipes[0]);
radio.startListening();
radio.printDetails(); dumpa RF-konfigurationen för felsökning
} / / SLUTET AV INSTALLATIONEN
Åtkomstkoden konfigurerar GPIO stiften, skriver ut ett meddelande till LCD-skärmen och blinkar den gröna lysdioden tio gånger. Sedan konfigurerar NRF24L01 med samma datahastighet och kanal som sändare och börjar lyssna för inkommande överföringar.
Stora slingan helt enkelt anropar funktionen checkRadio() om och om igen.
void checkRadio(void)
{
om det finns data redo
om (radio.available())
{
dumpa nyttolasterna tills vi har allt
unsigned int befalla;
bool = false;
medan (! gjort)
{
Hämta nyttolasten, och se om det är den sista
klart = radio.read (& kommando, sizeof kommandot);
om (kommandot == 1)
{
larm
greve ++;
Serial.Print(Count);
Serial.println ("-kommando tas emot");
triggerAlarm();
} / / end av if(command == 1)
} / / end läsa nyttolasten
} / / end av tillgängliga data
} / / end av checkRadio
Funktionen checkRadio() fungerar helt enkelt genom att kontrollera alla uppgifter som inkommit och om dessa data är lika med 1 sedan hoppa till funktionen triggerAlarm().
void triggerAlarm(void)
{
osignerade långa startTime = millis(); Markera början av funktionen
osignerade långa previousBuzzerMillis; används för Summer sekvens
byte buzzerState; används för Summer sekvens
CONST byte buzzer_interval = 100; används för Summer sekvens
osignerade långa previousLedMillis; används för LED flash sekvens
CONST byte led_interval = 100; används för LED flash sekvens
byte redState; används för LED flash sekvens
byte blueState; används för LED flash sekvens
digitalWrite (SMS_OUTPUT, låg); Skicka ett SMS
Delay(500); Temboo SMS skicka koden har delay(150) i loop
digitalWrite (SMS_OUTPUT, hög);
göra
{
slå på strålkastare och stäng av den gröna lysdioden
digitalWrite (FLOOD_LIGHT, hög);
digitalWrite (GREEN_LED, låg);
Starta summern ordning
om (millis() - startTime < BUZZER_DURATION)
{
suppleant summern på/av för hela summern sekvensen
om (millis() - previousBuzzerMillis > = buzzer_interval)
{
previousBuzzerMillis = millis();
om (buzzerState == låg)
{
buzzerState = hög; slå på
} annat
{
buzzerState = låg; byta OFF
}
digitalWrite (Summer, buzzerState);
}
}
om (millis() - startTime > BUZZER_DURATION)
{
se till att summern är avstängd i slutet av summern sekvens
digitalWrite (Summer, låg);
} / / end av summern sekvens
Starta lysdioden blinkar sekvensen
om (millis() - previousLedMillis > = led_interval)
{
previousLedMillis = millis();
om (redState == låg)
{
skriva ut ett meddelande på LCD-skärm
lcd.setCursor(0,0);
LCD.Print ("ALERT!");
lcd.setCursor(0,1);
LCD.Print("");
redState = hög;
blueState = låg;
lcd.noBacklight(); Flash LCD-skärm
} annat
{
redState = låg;
blueState = hög;
LCD.backlight(); Flash LCD-skärm
}
digitalWrite (RED_LED, redState);
digitalWrite (BLUE_LED, blueState);
}
} medan (millis() - startTime < ALARM_DURATION);
återställa systemet "Väpnade" konfiguration
digitalWrite (FLOOD_LIGHT, låg);
digitalWrite (Summer, låg);
digitalWrite (RED_LED, låg);
digitalWrite (BLUE_LED, låg);
digitalWrite (GREEN_LED, hög);
LCD.backlight();
lcd.setCursor(0,0);
LCD.Print ("System Status:");
lcd.setCursor(0,1);
LCD.Print ("väpnade");
} / / end av triggerAlarm()
Funktionen triggerAlarm() för det första signal en text meddelande till min andra Arduino (ingår inte i detta Instructable). Sedan resten är vad som kallas icke-blockerande koden för att tillåta oss att arbeta med tidsfördröjningar och i princip låter alarmet under en förutbestämd tid (ALARM_DURATION) innan du återvänder systemet till en "beväpnade" stat.
Ha det så kul!