Skocz do zawartości

Dodanie powiadomień SMS do centralki alarmowej DIY


shovvany

Pomocna odpowiedź

Witam,

Na wstępie chciałem podziękować za ten tutorial. Bardzo pomocny.

Robie centralkę alarmową, jestem na etapie rozbudowania to o powiadomienie SMS i napotkałem problem (być może trywialny - dopiero zaczynam z arduino).

Moduł z jakiego korzystam to GSM/GPRS A6

Problem jest nastepujący: Wywołując funkcje SMS w IFie (linia 90) np. 3 razy - SMS dotrze (1 do 3 razy, z reguły dopiero 2 i 3 próba wysłania kończy sie powodzeniem). W czasie realizacji tej funkcji 3 krotnie, alarm już wyje i nie będzie można go rozbroić do momentu aż przejdzie do prawdziwego stanu ALARM (case 4).

Natomiast wywołując funkcje SMS w stanie alarmowania (CASE 4), sms jest wysyłany nieustannie (void loop). Jest jakiś sposób aby zrealizować rozbrajanie alarmu również w czasie kiedy wykonuje pętle IF. Ewentualnie jak uzyskać realizacje funkcji SMS w sekcji case 4 ograniczoną ilość razy (1-3). Przypuszczam, ze rozwiazanie jest trywialne natomiast z uwagi na mój bardzo początkujący stan wiedzy nie znalazłem nic na internecie (zapewne używam złych słów kluczowych).

#define BUZZER 11
#define PIR 12
#define KONTAKTRON 9
 
#include <Wire.h>   // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie pobranej biblioteki I2C dla LCD
#include <Keypad.h> //biblioteka od klawiatury
#include <SoftwareSerial.h>
 
 
const byte ROWS = 4; // ile wierszy
const byte COLS = 3; //ile kolumn
 
byte rowPins[ROWS] = {8, 7, 6, 5}; //piny wierszy
byte colPins[COLS] = {4, 3, 2}; //piny kolumn
SoftwareSerial A6GSM(9,10);
 
char keys[ROWS][COLS] = { //mapowanie klawiatury
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
 
void SMS() {
  Serial.begin(9600);
  delay(1000);
  A6GSM.begin(9600);
  delay(1000);
  Serial.println("initiating A6");
  delay(1000);
  A6GSM.println("AT");
  delay(1000);
  A6GSM.println("AT+CMGF=1");
  delay(1000);
  A6GSM.println("AT+CMGS=\"+48730297176\"");
  delay(3000);
  A6GSM.print("ALARM");
  delay(3000);
  A6GSM.println(char(26));
  delay(2000);
}
 
Keypad klawiatura = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //inicjalizacja klawiatury
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27
 
 
volatile int stanAlarmu = 1;
 
void setup() {
  pinMode(BUZZER, OUTPUT);
  pinMode(KONTAKTRON, INPUT);
  pinMode(PIR, INPUT);
 
  lcd.begin(16, 2);  // Inicjalizacja LCD 2x16
  lcd.backlight(); // zalaczenie podwietlenia
}
 
void loop() {
 
  char klawisz = 0; //zmienna do przetrzymywania znakow z klawiatury
 
  switch (stanAlarmu) { //Wykonywania akcji odpowiedniej dla danego stanu
    case 1:
      { //Czuwanie
        lcd.setCursor(0, 0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
        lcd.print("Stan czuwania");
 
        klawisz = klawiatura.getKey();
        if (klawisz == '1') { //Czy uzbroic alarm?
          lcd.clear();
          lcd.setCursor(0, 0); //Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
          lcd.print("PIN OK.");
          lcd.setCursor(0, 1); //Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
          lcd.print("Zazbrajanie...");
          delay(3000);
 
          stanAlarmu = 2;
          lcd.clear();
        }
      }
 
      break;
 
    case 2:
      //Monitorowanie
      lcd.setCursor(0, 0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
      lcd.print("Monitorowanie");
 
      if (digitalRead(PIR) == HIGH) {
        lcd.clear();
        lcd.print("ALARM");
        tone(BUZZER, 40);
        SMS();
        SMS();
        SMS();
        stanAlarmu = 4; //Natychmiast uruchamiamy alarm
      }
      break;
 
    case 3:
      //Rozbrajanie
      lcd.setCursor(0, 0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
      lcd.print("WPISZ KOD");
 
 
      break;
 
    case 4:
      //Sygnalizacja alarmu
      lcd.setCursor(0, 0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
      tone(BUZZER, 40);
      delay(100);
 
      break;
  }
}

 

Link do komentarza
Share on other sites

Kod programu wkleiłem bezpośrednio do posta, a pytanie wydzieliłem z następującego tematu: https://forbot.pl/forum/topic/9531-kurs-arduino-ii-5-klawiatura-wlasny-system-alarmowy/

---

14 godzin temu, shovvany napisał:

Problem jest nastepujący: Wywołując funkcje SMS w IFie (linia 90) np. 3 razy - SMS dotrze (1 do 3 razy, z reguły dopiero 2 i 3 próba wysłania kończy sie powodzeniem). W czasie realizacji tej funkcji 3 krotnie, alarm już wyje i nie będzie można go rozbroić do momentu aż przejdzie do prawdziwego stanu ALARM (case 4).

@shovvany testowałeś w jakimś innym programie czy to nie jest problem z samym modułem? Masz pewność, że wywołanie takich komend AT (i w taki sposób) zawsze skutecznie wysyła SMSa? Pytam, bo nie korzystałem wcześniej z tego modułu.

14 godzin temu, shovvany napisał:

Natomiast wywołując funkcje SMS w stanie alarmowania (CASE 4), sms jest wysyłany nieustannie (void loop).

Najlepiej będzie, jeśli dodasz zmienną pomocniczą, w której będziesz pamiętał czy podczas danego alarmu był już wysyłany SMS. Jeśli nie to wysyłasz i ustawiasz zmienną (np. wyslano = 1), a w kolejnym obiegu wiesz już, że wiadomość była wysłana. Musisz tylko pamiętać, aby zmienną wyslano zerować po każdym uzbrojeniu lub rozbrojeniu alarmu.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.