04-02-2016, 11:42
(Ten post był ostatnio modyfikowany: 04-02-2016, 20:14 przez CEO.
Powód edycji: Używamy znaczników kodu
)
Witam
Na początku chciałbym powiedzieć, że nie mam dużego doświadczenia z platformą. Tak naprawdę poznałem ją jakieś 2 lata temu, gdy kupiłem urządzenie działające na Arduino Nano, byłem po prostu pod wrażeniem, jak coś tak prostego może w sobie ogarnąć tak wiele.
Z lutownicą jestem od dziecka czyli już jakieś 34 lata, gdyby w moich dziecięcych latach było takie cudo jak arduino, to myślę, że powstała by niejedna ciekawa rzecz na tej platformie.
No, ale dobra wracając do teraźniejszości , to udało mi się ( ze względu na to, że kiedyś bawiłem się Basic’kiem na C64 i Amosie na Amidze 500 ) napisać prosty program sterujący załączaniem/wyłaczaniem zasilania zdalnie poprzez aplikację na Windowsie (tak, udało mi się nawet napisać mały programik w VB).
Stąd narodził się pomysł by zaprząść Arduino do czegoś poważniejszego, a mianowicie do bycia systemem alarmowym.
Składowe alarmu:
Zasilanie : sieć/akumulator – tutaj sobie poradzę bez problemu
Centrala : Arduino UNO V3
Łączność : zewnętrzny moduł SMS GSM Neoway M590 (taki posiadam)
Pierwsza linia obrony PIR połączony szeregowo z czujnikiem otwarcia drzwi, reakcja po 10 sek.
Druga linia obrony wiązka laserowa, jej przerwanie powoduje uruchomienie alarmu.
Sterowanie otwieraniem i zamykaniem bramy (wliczone wyłączniki krańcowe) z klawiatury i poprzez SMS – osobny moduł z przekaźnikami oraz sterowanie z klawiatury.
Status wyświetlany na ekranie LCD (I2C)
3 diody sygnalizujące prace centrali:
-zielona rozbrojone,
-czerwona działa alarm na PIR i laser,
-niebieska – reakcja tylko na przecięcie wiązki lasera
Założenia jakie chciałem osiągnąć to:
1) 2 osobne wejścia (D9 i D10) na czujniki wyzwalające alarm, aktywowane osobno. Tj. jedno jako główne reaguje na wykryty ruch z czujki PIR Po wykryciu ruchu, czyli przerwanie obiegu na wejściu, mamy 10 sekund na wbicie kodu deaktywującego alarm.
Drugie przy wykryciu ruchu uruchamia alarm niezwłocznie (w tym przypadku przecięcie wiązki lasere we D10).
2) Uzbrajanie/rozbrajanie/wyłączenie alarmu poprzez klawiature numeryczną, lub poprzez wysłanie SMSa.
3) Otwieranie bramy/zamykanie poprzez klawiaturę, lub SMS.
4) Powiadomienie o uzbrojeniu/rozbrojeniu alarmu na wyświetlaczu oraz poprzez wiadomość SMS wysłaną na wybrany nr telefonu.
5) Gdy alarm zostanie uruchomiony zostaje jednocześnie wysłany komunikat SMS .
6) Komunikaty wyświetlane na ekranie LCD.
7) Dwa osobne kody, jeden na aktywowanie/deaktywowanie czujek PIR, drugi na aktywowanie czujnika wiązki Laserowej, czas aktywacji alarmu po wprowadzeniu kodu to 10 sekund.
8) Możliwość otwarcia bramy tylko w momencie gdy alarm jest zdezaktywowany.
9) Przekaźnik uruchamiający syrenę jest cały czas zasilany. Gdy jego zasilanie zaniknie to wtedy zostanie zasilona syrena (jest to pokazane na schemacie).
Wiem, że brzmi to może zawile, ale postaram się to szybko wytłumaczyć.
Po pierwsze dlaczego 2 kody ? A więc dlatego, że np. kodem 12345, aktywuje/deaktywuje działanie alarmu przy wykryciu ruchu na czujnikach PIR i Laser, zwłoka sygnalizacji alarmu to 10 sek. (daje nam czas na wprowadzenie kodu wyłączającego alarm).
Kodem np. 54321 aktywuje i deaktywuje tylko przerwanie wiązki laserowej, PIRy nie maja tutaj znaczenia, alarm uruchamia się od razu.
W momencie gdy uruchomi się alarm, uruchamia się syrena oraz dostaję powiadomienie SMS.
Jeśli uważam, że jest to np. fałszywy alarm, specjalnym SMSem mogę wyłączyć alarm.
Również SMSem o odpowiedniej treści mogę go załączyć (wybór trybu), lub np. otworzyć bramę, lub ją zamknąć.
Otwieranie/zamykanie bramy:
Tutaj wykorzystałbym 3 przekaźniki:
2 sterujące kierunkiem obrotu silnika i jeden odcinający jego zasilanie.
Do tego dochodzą 2 wyłączniki krańcowe, w momencie ich zwarcia praca silnika zostaje zatrzymana i zostaje wyświetlony odpowiedni komunikat na ekranie LCD oraz wysłany SMS.
Na schemacie wyłączniki korzystają z 2 wejść na Arduino, ale można użyć jednego, które będzie służyło jako sygnał STOP.
Opis stanu czujek PIR i lasera:
Myślę, że tutaj wszystko powinno pracować w obwodzie zamkniętym, czyli jego przerwanie sygnalizuje sytuację ALARMOWĄ.
Podłączenie klawiatury (4x4, 8 pinów) z tego przykładu www kropka youtube kropka com/watch?v=iXpM-v8MNAE z użyciem oporników, by użyć tylko 4 wejścia w Arduino.
Całość będzie zasilana poprzez zasilacz buforowy z sieci 220V plus AKU 12V, do tego stabilizator obniżający napięcie na 5V do zasilania przekaźników itd.
To mój pierwszy tak duży projekt i mam nadzieję, że pomożecie mi w poprawnym napisaniu kodu.
Część już zacząłem, ale nie wiem, czy idę dobrą drogą. Najgorzej jest mi zrozumieć i napisać kod tak by system rozróżniał kiedy jest uzbrojony i po wykryciu ruchu dawał 10 sekunt na wbicie kodu, tak jak wspominałem raczkuję w tym temacie więc każda pomoc będzie na wagę złota.
Być może sam projekt/schemat ma wady, to tutaj też moja prośba by je mi wskazać i pomóc zmodernizować całość tak by działała niezawodnie.
Jak na razie to testy niestety kończą się fiaskiem, utknąłem i nie wiem co dalej zrobić .
Będę wdzięczny za porady i pomoc
Pozdrawiam
Marcin
Poniżej kod:
Na początku chciałbym powiedzieć, że nie mam dużego doświadczenia z platformą. Tak naprawdę poznałem ją jakieś 2 lata temu, gdy kupiłem urządzenie działające na Arduino Nano, byłem po prostu pod wrażeniem, jak coś tak prostego może w sobie ogarnąć tak wiele.
Z lutownicą jestem od dziecka czyli już jakieś 34 lata, gdyby w moich dziecięcych latach było takie cudo jak arduino, to myślę, że powstała by niejedna ciekawa rzecz na tej platformie.
No, ale dobra wracając do teraźniejszości , to udało mi się ( ze względu na to, że kiedyś bawiłem się Basic’kiem na C64 i Amosie na Amidze 500 ) napisać prosty program sterujący załączaniem/wyłaczaniem zasilania zdalnie poprzez aplikację na Windowsie (tak, udało mi się nawet napisać mały programik w VB).
Stąd narodził się pomysł by zaprząść Arduino do czegoś poważniejszego, a mianowicie do bycia systemem alarmowym.
Składowe alarmu:
Zasilanie : sieć/akumulator – tutaj sobie poradzę bez problemu
Centrala : Arduino UNO V3
Łączność : zewnętrzny moduł SMS GSM Neoway M590 (taki posiadam)
Pierwsza linia obrony PIR połączony szeregowo z czujnikiem otwarcia drzwi, reakcja po 10 sek.
Druga linia obrony wiązka laserowa, jej przerwanie powoduje uruchomienie alarmu.
Sterowanie otwieraniem i zamykaniem bramy (wliczone wyłączniki krańcowe) z klawiatury i poprzez SMS – osobny moduł z przekaźnikami oraz sterowanie z klawiatury.
Status wyświetlany na ekranie LCD (I2C)
3 diody sygnalizujące prace centrali:
-zielona rozbrojone,
-czerwona działa alarm na PIR i laser,
-niebieska – reakcja tylko na przecięcie wiązki lasera
Założenia jakie chciałem osiągnąć to:
1) 2 osobne wejścia (D9 i D10) na czujniki wyzwalające alarm, aktywowane osobno. Tj. jedno jako główne reaguje na wykryty ruch z czujki PIR Po wykryciu ruchu, czyli przerwanie obiegu na wejściu, mamy 10 sekund na wbicie kodu deaktywującego alarm.
Drugie przy wykryciu ruchu uruchamia alarm niezwłocznie (w tym przypadku przecięcie wiązki lasere we D10).
2) Uzbrajanie/rozbrajanie/wyłączenie alarmu poprzez klawiature numeryczną, lub poprzez wysłanie SMSa.
3) Otwieranie bramy/zamykanie poprzez klawiaturę, lub SMS.
4) Powiadomienie o uzbrojeniu/rozbrojeniu alarmu na wyświetlaczu oraz poprzez wiadomość SMS wysłaną na wybrany nr telefonu.
5) Gdy alarm zostanie uruchomiony zostaje jednocześnie wysłany komunikat SMS .
6) Komunikaty wyświetlane na ekranie LCD.
7) Dwa osobne kody, jeden na aktywowanie/deaktywowanie czujek PIR, drugi na aktywowanie czujnika wiązki Laserowej, czas aktywacji alarmu po wprowadzeniu kodu to 10 sekund.
8) Możliwość otwarcia bramy tylko w momencie gdy alarm jest zdezaktywowany.
9) Przekaźnik uruchamiający syrenę jest cały czas zasilany. Gdy jego zasilanie zaniknie to wtedy zostanie zasilona syrena (jest to pokazane na schemacie).
Wiem, że brzmi to może zawile, ale postaram się to szybko wytłumaczyć.
Po pierwsze dlaczego 2 kody ? A więc dlatego, że np. kodem 12345, aktywuje/deaktywuje działanie alarmu przy wykryciu ruchu na czujnikach PIR i Laser, zwłoka sygnalizacji alarmu to 10 sek. (daje nam czas na wprowadzenie kodu wyłączającego alarm).
Kodem np. 54321 aktywuje i deaktywuje tylko przerwanie wiązki laserowej, PIRy nie maja tutaj znaczenia, alarm uruchamia się od razu.
W momencie gdy uruchomi się alarm, uruchamia się syrena oraz dostaję powiadomienie SMS.
Jeśli uważam, że jest to np. fałszywy alarm, specjalnym SMSem mogę wyłączyć alarm.
Również SMSem o odpowiedniej treści mogę go załączyć (wybór trybu), lub np. otworzyć bramę, lub ją zamknąć.
Otwieranie/zamykanie bramy:
Tutaj wykorzystałbym 3 przekaźniki:
2 sterujące kierunkiem obrotu silnika i jeden odcinający jego zasilanie.
Do tego dochodzą 2 wyłączniki krańcowe, w momencie ich zwarcia praca silnika zostaje zatrzymana i zostaje wyświetlony odpowiedni komunikat na ekranie LCD oraz wysłany SMS.
Na schemacie wyłączniki korzystają z 2 wejść na Arduino, ale można użyć jednego, które będzie służyło jako sygnał STOP.
Opis stanu czujek PIR i lasera:
Myślę, że tutaj wszystko powinno pracować w obwodzie zamkniętym, czyli jego przerwanie sygnalizuje sytuację ALARMOWĄ.
Podłączenie klawiatury (4x4, 8 pinów) z tego przykładu www kropka youtube kropka com/watch?v=iXpM-v8MNAE z użyciem oporników, by użyć tylko 4 wejścia w Arduino.
Całość będzie zasilana poprzez zasilacz buforowy z sieci 220V plus AKU 12V, do tego stabilizator obniżający napięcie na 5V do zasilania przekaźników itd.
To mój pierwszy tak duży projekt i mam nadzieję, że pomożecie mi w poprawnym napisaniu kodu.
Część już zacząłem, ale nie wiem, czy idę dobrą drogą. Najgorzej jest mi zrozumieć i napisać kod tak by system rozróżniał kiedy jest uzbrojony i po wykryciu ruchu dawał 10 sekunt na wbicie kodu, tak jak wspominałem raczkuję w tym temacie więc każda pomoc będzie na wagę złota.
Być może sam projekt/schemat ma wady, to tutaj też moja prośba by je mi wskazać i pomóc zmodernizować całość tak by działała niezawodnie.
Jak na razie to testy niestety kończą się fiaskiem, utknąłem i nie wiem co dalej zrobić .
Będę wdzięczny za porady i pomoc
Pozdrawiam
Marcin
Poniżej kod:
Kod:
#define buzzer 2
#define gsmtx 3
#define gsmrx 4
#define kranc1 5
#define kranc2 6
#define silnik 7
#define kier 8
#define pir 9
#define las 10
#define ledb 11
#define ledg 12
#define ledr 13
long czas;
long odliczanie;
// odliczanie czasu
int alarm = 0; // deklaracja zmiennej
int silnikpwr = 0; // sterowanie zasilaniem silnika
int haslo = 123456; // kod do aktywacji alarmu
int haslolsr = 654321; // kod do aktywacji alarmu laserowego
int buzer = 1; // stan buzzera
int kierunek = 0; // stan kierunku silnika 0 - zamkniecie, 1 - otwarcie
int lr = 0; // stan diody red
int lg = 1; // stan diody green
int lb = 0; // stan diody blue
int aktyw = 0; // czy alarm aktywny
int lasakt = 0; // czy alarm laserowy aktywny
int pirakt = 0; // czujki pir wylaczone
int laser = 0; // stan linii lasera
int suma = 0; // suma stanow
char znakl = ' '; // do zapisania odczytanego znaku ?
String kod = ""; // do zsumowania wklepywanych znakow
int kb1 = A0; // przypisanie wejsc do odczytu klawiatury
int kb2 = A1;
int kb3 = A2;
int kb4 = A3;
int znak= 0;
int v1, v2, v3, v4;
#include <LiquidCrystal_I2C.h> // dolaczenie biblioteki LCD
#include <Wire.h> // do czego sluzy ta biblioteka ?
#include <SoftwareSerial.h> // dolaczenie bliblioteki do komunikacji z modulem GSM
// nie wiem czy dolaczac te biblioteke #include <Key.h> // biblioteka klawiatury dziala chyba tylko jesli klawiatura jest podpieta 8 pinami do wejsc cyfrowych
#include <Password.h> // biblioteka hasel ale nie wiemm, jak to wykorzystac
LiquidCrystal_I2C lcd(0x20,16,2); // ustawienie adresu expandera z LCD
SoftwareSerial gsm(4, 3); // RX, TX
Password password = Password( "123456" ); // czy tu sie ustawia haslo jakie ma byc ?
Password password2 = Password( "654321");
void setup() {
pinMode(buzzer, OUTPUT); // wyjscie buzera
digitalWrite(buzzer, HIGH); // stan wyjscia buzera na zalaczony
pinMode(gsmtx, OUTPUT); // nadawanie do modemu GSM TX
pinMode(gsmrx, INPUT); // odbior z modemu GSM RX
pinMode(kranc1, INPUT_PULLUP); // wejscie wlacznika krancowego
pinMode(kranc2, INPUT_PULLUP); // wejscie wlacznika krancowego 2
pinMode(silnik, OUTPUT); // zalaczenie zasilania silnika (high zalacza silnik)
digitalWrite(silnik, LOW); // silnik wylaczony
pinMode(kierunek, OUTPUT); // zmiana kierunku otwieranie/zamkniecie (low zamkniecie, high otwarcie)
digitalWrite(kierunek, LOW); // stan niski na przekazniku zamkniecia dachu
pinMode(pirakt, INPUT_PULLUP); // odczyt wejscia czujnika pir
pinMode(las, INPUT_PULLUP); // odczyt lasera
pinMode(ledb, OUTPUT); // dioda blue - dzialajacy alarm laserowy
pinMode(ledg, OUTPUT); // dioda zielona - alarm zdeaktywowany
pinMode(ledr, OUTPUT); // dioda czerwona - alarm aktywny
digitalWrite(ledb, LOW); // diody wylaczone
digitalWrite(ledg, LOW); // diody wylaczone
digitalWrite(ledr, LOW); // diody wylaczone
Serial.begin(9600); // inicjalizuje komunikacje portu 9600 razy na sekunde
gsm.begin(9600); // do komunikacji z modulem GSM
lcd.init(); // inicjalizacja wyswietlacza LCD
lcd.print ("Centrala alarmowa"); //napisanie tekstu na ekranie
}
void loop() {
// put your main code here, to run repeatedly:
czas = millis();
v1 = analogRead(kb1); // odczyty wartosci z pinow z klawiatury
v2 = analogRead(kb2);
v3 = analogRead(kb3);
v4 = analogRead(kb4);
if (v1>999 && v1<1100){ // jesli jest odczyt na danym poziomie to przyjmujemy ze zostal wcisniety taki, a taki klawisz
Serial.println("1");
password.append('1');
znakl='1';
// aktyw=1;
}
if (v1>420 && v1<550){
Serial.println("4");
znakl='4';}
password.append('4');
if (v1>220 && v1<380){
Serial.println("7");
password.append('7');
znakl='7';
}
if (v1>130 && v1<180){
Serial.println("*");
znakl = ' ';
password.append('*');
kod = ' ';
}
if (v2>999 && v2<1100){
Serial.println("2");
password.append('2');
znakl='2';}
if (v2>420 && v2<520){
Serial.println("5");
password.append('a');
znakl='5';}
if (v2>240 && v2<255){
Serial.println("8");
password.append('8');
znakl='8';}
if (v2>140 && v2<150){
Serial.println("0");
password.append('0');
znakl='0';}
if (v3>999 && v3<1100){
Serial.println("3");
password.append('3');
znakl='3';}
if (v3>420 && v3<550){
Serial.println("6");
password.append('6');
znakl='6';}
if (v3>240 && v3<255){
Serial.println("9");
password.append('9');
znakl='9';}
if (v3>130 && v3<180){
Serial.println("#");
password.append('#');
znakl='#';}
if (v4>999 && v4<1100){
Serial.println("A");
znakl='a';
password.append('a');
}
if (v4>420 && v4<520){
Serial.println("B");
password.append('b');
znakl='b';}
if (v4>220 && v4<270){
Serial.println("C");
password.append('c');
znakl='c';}
if (v4>130 && v4<180){
Serial.println("D");
password.append('d');
znakl='d';
}
delay(200);
password.append(znakl); // czy to cos do odczytu hasla ?
if (password.evaluate()){
Serial.println("poprawny");
delay(1000); // proba wykozystania biblioteki password bez skutku :(
}
Serial.println( password.evaluate()?"true":"false");
if ((kod='761023') && (aktyw == 0)){ // proba przypisania warunku co gdy zostanie wbite dobry kod
aktyw=1;
kod="";
}
if ((kod='761023') && (aktyw == 1)){ // i to samo co wyzej ale deaktywacja alarmu
aktyw=0;
kod="";
}
if (digitalRead(pir) == LOW ) { // odczyt stanu pir
odliczanie=odliczanie+1;
pirakt=1;
} else {
odliczanie=0;
}
if (aktyw == 1) { // ustalenie jakie diody maja swiecic gdy alarm jest aktywny lub nieaktywny
digitalWrite(ledr, HIGH);
digitalWrite(ledb, LOW);
digitalWrite(ledg, LOW);
}
if (aktyw == 0) {
digitalWrite(ledr, LOW);
digitalWrite(ledb, LOW);
digitalWrite(ledg, HIGH);
}
if (lasakt == 1 && laser == 1){ // odczyt stanu lini lasera
digitalWrite (buzzer, LOW); // wlaczenie alarmu
}
if (odliczanie >= 10 && digitalRead(pir) == LOW && (aktyw == 1)) { // jesli czas oczekiwania minal 10 sekund
digitalWrite(buzzer, LOW); // załącz syrene alarmową
lcd.print ("!!! ALARM !!!"); //wyswietl komunikat
gsm.println("ATD+48502000000;"); // wyslanie komunitatu gsm
}
else
{
digitalWrite(buzzer, HIGH);
}
}