• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 1 głosów - średnia: 1
  • 1
  • 2
  • 3
  • 4
  • 5
próba budowy systemu alarmowego
#26
Big Grin 
Ogarnąłem problem wyżej. Wypociny zredukowałem i nawet jest dobrze. Lcd nie wyłącza się, ogólnie git. Nawet nie wiedziałem, że tyle będę miał problemów przy tym projekcie, ale jestem zadowolony, że od jakiegoś czasu rozwiązuje je sam. Big Grin

Nie był bym sobą gdybym nie miał kolejnego. Chodzi jak wcześniej o sprawdzenie stanu konta. Kod:
Kod:
#include <Wire.h>
#include <hd44780.h>                     
#include <hd44780ioClass/hd44780_I2Cexp.h>
#include <SoftwareSerial.h>
#include <Timers.h>
#include <Keypad.h>
#include <Password.h>

hd44780_I2Cexp lcd;

const int LCD_COLS = 16;
const int LCD_ROWS = 2;

SoftwareSerial SIM800(3, 2);

String textMessage; //Zmienna do przechowywania wiadomości tekstowej
String alarm = "";
String stanKontaCz1;
String stanKontaCz2;
//String stanKonta;


String newPasswordString;
char newPassword[5];

Password password = Password( (char*)"1234" );

byte currentPasswordLength = 0;

const byte ROWS = 4;
const byte COLS = 4;

//Define the keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

byte rowPins[ROWS] = {12,11,10,9};

byte colPins[COLS] = {8,7,6,5};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

byte diodaZielona = 4;
byte diodaZulta = A2;
byte diodaCzerwona = A1;
//////czujnikRuchu = A7; odłączony brak miesca
byte buzzer = A3;
byte laser = A0;

volatile byte stanAlarmu = 0;

int x = 0; // zmienna do kursora LCD
int y = 0; // zmienna licząca ilość znaków w "aktywacja alarmu."
int sms1 = 0; // zmienna do pierwszego sms Alarm
int sms2 = 0; // zmienna do drugiego sms Alarm
int stan = 0;


Timer czasNaPin;   // wpisanie pinu
Timer usuwaniePin; // usuwanie pin z lcd
Timer gaszenieLcd; // gaszenie lcd
Timer smsNr1;      // pierwszy sms Alarm
Timer smsNr2;      // drugi sms Alarm



int czasNaPinOdliczanie = 10000;   // czas na wpisanie pinu w milisekundach
int usuwaniePinOdliczanie = 7000;  // czas na usuwanięcie pinu z lcd w milisekundach
int gaszenieLcdOdliczanie = 60000; // czas na zgaszenie lcd w milisekundach
int smsNr1Odliczanie = 10000;      // odliczanie do wysłania pierwszego sms po wejsciu do stanu alarm
int smsNr2Odliczanie = 30000;      // odliczanie do wysłania drugiego sms po wejsciu do stanu alarm

byte maxPasswordLength = 5;  //maksymalna długość hasła
byte minPasswordLength = 2; // minimalna długość hasła

byte zmianaHaslaPozycja = 1;
char zmianaHaslaCyfra1 = '0'; //
char zmianaHaslaCyfra2 = '0'; //
char zmianaHaslaCyfra3 = '0'; //
char zmianaHaslaCyfra4 = '0'; //
char zmianaHaslaCyfra5 = 'D'; //

byte aktywacjaAlarmuPozycja = 1;
char aktywacjaCyfra1 = 'A'; //
char aktywacjaCyfra2 = 'A'; //
char aktywacjaCyfra3 = 'A'; //


void setup()
{
  int status;

  status = lcd.begin(LCD_COLS, LCD_ROWS);
  if(status)
  {
    status = -status;
    hd44780::fatalError(status);
  }
 
  gaszenieLcd.begin(gaszenieLcdOdliczanie);
 
  Serial.begin(9600);
  SIM800.begin(9600);

  Serial.print("SIM800 ready...");


  SIM800.print("AT+CMGF=1\r"); // ustawienie gsm na text mode
  delay(100);

  SIM800.print("AT+CNMI=2,2,0,0,0\r");
  delay(100);

  pinMode(diodaZielona, OUTPUT);
  pinMode(diodaZulta, OUTPUT);
  pinMode(diodaCzerwona, OUTPUT);
  pinMode(buzzer, OUTPUT);
 
  pinMode(laser, INPUT);
}

void loop()
{    if(stan<1){
      stan++;
      SIM800.print("AT+CUSD=1, \"*101#\"");
}
 
  if(Serial.available()>0){
      SIM800.write(Serial.read());
     }

  if(SIM800.available()>0){
    textMessage = SIM800.readString();
    Serial.print(textMessage);
    if(textMessage.indexOf("Pozostalo Ci")>=0){
      smsStanKonta();
      stanKontaCz1 = textMessage;
      stanKontaCz2 = textMessage;
      stanKontaCz1.remove(0, 15);
      stanKontaCz1.remove(7,3);
      stanKontaCz1.remove(15,50);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(stanKontaCz1);
      stanKontaCz2.remove(0, 50);
      stanKontaCz2.remove(14, 15);
      lcd.setCursor(0,1);
      lcd.print(stanKontaCz2);
      delay(3000);
      lcd.clear();
    }
  }
 
  if(textMessage.indexOf("Wlacz")>=0){
    Serial.println("Alarm włączony ");
    textMessage = "";
    stanAlarmu = 1;
  
  }
  if(textMessage.indexOf("Wylacz")>=0){
    Serial.println("Alarm wylączony");
    textMessage = "";
    stanAlarmu = 0;
  }
  if(textMessage.indexOf("Stan")>=0){
    String message = "Alarm jest " + alarm;
    wysliSMS(message);
    Serial.println("żądanie stanu alarmu");
    textMessage = "";
  }
    if(textMessage.indexOf("PLN")>=0){
    stan=0;
    //skonta();
}




char key = keypad.getKey();
   if (key != NO_KEY){
      delay(60);
      switch (key){
      case '#': checkPassword(); break;
      case '*': resetPassword(); lcd.clear();  break;
      default:  processNumberKey(key);
      }
   }

   switch (stanAlarmu) {


    case 0: //czuwanie wyłączone
      Serial.print(key);
      if (key) {
      if (aktywacjaAlarmuPozycja == 1 && key == aktywacjaCyfra1) {
          aktywacjaAlarmuPozycja++;
      }else if (aktywacjaAlarmuPozycja == 2 && key == aktywacjaCyfra2){
         aktywacjaAlarmuPozycja++;
      }else if (aktywacjaAlarmuPozycja == 3 && key == aktywacjaCyfra3){
      aktywacjaAlarmuPozycja = 1;
      stanAlarmu = 1;
      resetPassword();
      lcd.clear();
      }else {
         stanAlarmu = 0;
         aktywacjaAlarmuPozycja = 1;
        }
       y++;
     if (y > maxPasswordLength) {    
        y = 0;
        lcd.clear();
        resetPassword();
      }
     }

    if (key) {
      if (zmianaHaslaPozycja == 1 && key == zmianaHaslaCyfra1) {
          zmianaHaslaPozycja++;
        } else if (zmianaHaslaPozycja == 2 && key == zmianaHaslaCyfra2) {
          zmianaHaslaPozycja++;
        } else if (zmianaHaslaPozycja == 3 && key == zmianaHaslaCyfra3) {
          zmianaHaslaPozycja++;
        } else if (zmianaHaslaPozycja == 4 && key == zmianaHaslaCyfra4) {
          zmianaHaslaPozycja++;
        } else if (zmianaHaslaPozycja == 5 && key == zmianaHaslaCyfra5) {
          zmianaHaslaPozycja++;
      changePassword();
      zmianaHaslaPozycja = 1;
      resetPassword();
      }  
  }

     alarm = "Wylaczony";
     lcd.home();
     lcd.print("ALARM WYLACZONY ");
     digitalWrite(diodaZielona, HIGH);
     digitalWrite(diodaZulta, LOW);
     digitalWrite(diodaCzerwona, LOW);
     digitalWrite(buzzer, LOW);     
     smsNr1.restart();
     smsNr2.restart();
     sms1 = 0;
     sms2 = 0;
     czasNaPin.restart();
   
    break;

    case 1: //czuwanie włączone
     alarm = "Wlaczony";
     lcd.home();
     lcd.print("ALARM  WLACZONY");
     digitalWrite(diodaZielona, LOW);
     digitalWrite(diodaZulta, HIGH);
     digitalWrite(diodaCzerwona, LOW);
     digitalWrite(buzzer, LOW);
    
     if (digitalRead(laser) == LOW) {
        stanAlarmu = 2;
        lcd.clear();
        czasNaPin.begin(czasNaPinOdliczanie);
     }
    break;

    case 2: // czas na rozbrojenie alarmu po wykryciu  ruchu przez PIR
     gaszenieLcd.restart();
     lcd.backlight();
     lcd.display();
     lcd.home();
     lcd.print("WYKRYTO RUCH");
     digitalWrite(diodaZielona, LOW);
     digitalWrite(diodaZulta, LOW);
     digitalWrite(diodaCzerwona, HIGH);
    
     if (czasNaPin.available()){
        stanAlarmu = 3;
        lcd.setCursor(0, 0);        
        lcd.print("             ");
       // resetPassword();
        czasNaPin.restart();
        smsNr1.begin(10000);
     }
    break;

    case 3: // ALARM
    gaszenieLcd.restart();
    lcd.backlight();
    lcd.display();
    lcd.setCursor(4, 0);
    lcd.print("ALARM !");
    digitalWrite(diodaZielona, LOW);
    digitalWrite(diodaZulta, LOW);
    digitalWrite(diodaCzerwona, HIGH);
   
    if (smsNr1.available()){
        sms1++;   
        if(sms1 < 2){
           smsAlarm();
           Serial.print(sms1);
          }
    }
    if (smsNr2.available()){
        sms2++;
        if(sms2 < 2){
           smsAlarm();
           Serial.print(sms2);
           }
      }
      
    break; 
}
  if (key) {
     x++;
     x++;
     usuwaniePin.begin(usuwaniePinOdliczanie);
     gaszenieLcd.begin(gaszenieLcdOdliczanie);
     lcd.backlight();
     lcd.display();
     }
  if (usuwaniePin.available()){
        resetPassword();
        lcd.print("          ");
     }
  if (gaszenieLcd.available()){
        lcd.noBacklight();
        lcd.noDisplay();
     }
}

void processNumberKey(char key) {
   lcd.setCursor(x, 1);
   lcd.print(key);
   currentPasswordLength++;
   password.append(key);
   if (currentPasswordLength == maxPasswordLength) {
      checkPassword();
   }
}

void checkPassword() {
   if (password.evaluate()){
      lcd.clear();
      stanAlarmu = 0;
   } else {
      lcd.clear();
      lcd.print("BLEDNY PIN");
      delay(1000);
      lcd.clear();
   }
   resetPassword();
}

void resetPassword() {
   lcd.setCursor(x, 1);
   lcd.print("          ");
   password.reset();
   currentPasswordLength = 0;
   aktywacjaAlarmuPozycja = 1;
    x = 0;
    y = 0;
}

void changePassword() {
   x = 0;
   lcd.clear();
   lcd.print("ZMIANA PINU");
   newPasswordString = Password();
   newPasswordString.toCharArray(newPassword, newPasswordString.length()+1);//convert string to char array
   password.set(newPassword);
   resetPassword();
   Serial.println(newPasswordString.length());
    if (newPasswordString.length() < minPasswordLength){
     newPasswordString.remove(0,20);
     Serial.println(newPasswordString.length());
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("ZA KROTKI PIN");
     lcd.setCursor(0, 1);
     lcd.print("MIN. DL. PINU");
     lcd.setCursor(15, 1);
     lcd.print(minPasswordLength);  
     x = 0;
     delay(3000);
     changePassword();
    }
   if (newPasswordString.length() > maxPasswordLength){
     newPasswordString.remove(0,20);
     Serial.println(newPasswordString.length());
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("ZA DLUGI PIN");
     lcd.setCursor(0, 1);
     lcd.print("MAKS DL. PINU");
     lcd.setCursor(15, 1);
     lcd.print(maxPasswordLength);  
     x = 0;
     delay(2000);
     changePassword();
   }else{
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("PIN ZMIENIONY NA:");
      lcd.setCursor(0, 1);
      lcd.print(newPasswordString);
      delay(3000);
      lcd.clear();
      x = 0;
     }
}

String Password(){
  lcd.setCursor(x, 1);
    String password = "";
    while (1){
        char key = keypad.getKey();
          if (key){   
                if ((key=='1') || (key=='2') ||
                    (key=='3') || (key=='4') || (key=='5') ||
                    (key=='6') || (key=='7') || (key=='8') ||
                    (key=='9'))   // jesli wcisnąłem klawisze 0 - 9               
                    {
                         lcd.print(key);
                         lcd.print(" ");   
                         password = password + key;   
                    }
                    if (key=='#') break; // zatwierdzamy wybĂłr                                          
        }
    }
    return password;
}

void wysliSMS(String message){

  SIM800.print("AT+CMGF=1\r");
  delay(100);

  SIM800.println("AT+CMGS=\"+48xxxxxxxxx\"");
  delay(100);

  SIM800.println(message);
  delay(100);

  SIM800.println((char)26);
  delay(100);
  SIM800.println();
}

void smsAlarm(){
  SIM800.print("AT+CMGF=1\r");
  delay(100);

  SIM800.println("AT+CMGS=\"+48xxxxxxxxx\"");
  delay(100);

  SIM800.println("alarm");
  delay(100);
  SIM800.println((char)26);
  Serial.print("alarm");
  smsNr2.begin(30000);
}

void smsStanKonta(){

  SIM800.print("AT+CMGF=1\r");
  delay(100);

  SIM800.println("AT+CMGS=\"+48xxxxxxxxx\"");
  delay(100);

  SIM800.println(textMessage);
  delay(100);

  SIM800.println((char)26);
  delay(100);
  SIM800.println();
}

void skonta(){
  SIM800.print("AT+CUSD=1, \"*101#\"");
}

Jeżeli wgram kod to przy pierwszym uruchomieniu wszystko jest cacy.
SIM800.print("AT+CUSD=1, \"*101#\"" zwraca stan konta, otrzymuje informację na port, LCD i SMS ze stanem konta. Natomiast jeżeli stworzę  takie coś:
Kod:
if(textMessage.indexOf("PLN")>=0){
    stan=0;
    //skonta();
}
Aby wyzerować zmienną stan, żeby w pętli loop wykonała się ponownie ta część kodu:
Kod:
if(stan<1){
      stan++;
      SIM800.print("AT+CUSD=1, \"*101#\"");
}
W pewnym stopniu działa bo na porcie szeregowym widzę, że wychodzi polecenie SIM800.print("AT+CUSD=1, \"*101#\""); , ale nic się już nie dzieje. Brak informacji zwrotnej czy to na port, czy na lcd i SMS.
Ta sama sytuacja jest gdy wywalę z loop  ifa odpowiedzialnego za sprawdzenie stanu konta ( tego wyżej), a stworzę funkcje :
Kod:
void skonta(){
  SIM800.print("AT+CUSD=1, \"*101#\"");
}
Gdzie wywołanie tej funkcji umieszczę w :
Kod:
if(textMessage.indexOf("PLN")>=0){
    //stan=0;
    skonta();
}
Treść SMS jest odbierana prawidłowo. Polecenie SIM800.print("AT+CUSD=1, \"*101#\"");
wychodzi, ale brak odpowiedzi z modułu. W każdym przypadku gdy wyzeruje zmienną stan czy to SMS czy jakaś inną funkcją ( naciśnięcie klawisza) zmienną się zeruje, kod USSD wychodzi, ale brak odpowiedzi. Jeszcze raz zaznaczę, że przy pierwszym uruchomieniu wszystko działa.  O co biega? Czemu to tak?
 
Odpowiedź
  


Wiadomości w tym wątku
próba budowy systemu alarmowego - przez Lucek20 - 05-01-2020, 14:31
RE: próba budowy systemu alarmowego - przez elvis - 05-01-2020, 15:02
RE: próba budowy systemu alarmowego - przez Lucek20 - 05-01-2020, 15:08
RE: próba budowy systemu alarmowego - przez Lucek20 - 05-01-2020, 19:25
RE: próba budowy systemu alarmowego - przez Lucek20 - 05-01-2020, 22:04
RE: próba budowy systemu alarmowego - przez Lucek20 - 10-01-2020, 00:03
RE: próba budowy systemu alarmowego - przez Lucek20 - 10-01-2020, 12:32
RE: próba budowy systemu alarmowego - przez Lucek20 - 13-02-2020, 23:08
RE: próba budowy systemu alarmowego - przez Lucek20 - 14-02-2020, 22:32
RE: próba budowy systemu alarmowego - przez Lucek20 - 15-02-2020, 21:02
RE: próba budowy systemu alarmowego - przez Lucek20 - 15-02-2020, 22:36
RE: próba budowy systemu alarmowego - przez Lucek20 - 16-02-2020, 12:04
RE: próba budowy systemu alarmowego - przez Lucek20 - 22-02-2020, 12:34
RE: próba budowy systemu alarmowego - przez Lucek20 - 26-02-2020, 17:23
RE: próba budowy systemu alarmowego - przez Lucek20 - 26-02-2020, 19:12
RE: próba budowy systemu alarmowego - przez Lucek20 - 01-03-2020, 20:42
RE: próba budowy systemu alarmowego - przez Lucek20 - 03-03-2020, 21:44
RE: próba budowy systemu alarmowego - przez Lucek20 - 04-03-2020, 23:42
RE: próba budowy systemu alarmowego - przez Lucek20 - 15-03-2020, 20:33
RE: próba budowy systemu alarmowego - przez Lucek20 - 20-03-2020, 23:43
RE: próba budowy systemu alarmowego - przez Lucek20 - 01-04-2020, 14:30
RE: próba budowy systemu alarmowego - przez Lucek20 - 04-04-2020, 09:33
RE: próba budowy systemu alarmowego - przez Lucek20 - 12-04-2020, 08:24
RE: próba budowy systemu alarmowego - przez Lucek20 - 12-04-2020, 22:17
RE: próba budowy systemu alarmowego - przez Lucek20 - 23-04-2020, 11:41
RE: próba budowy systemu alarmowego - przez Lucek20 - 26-04-2020, 14:47

Skocz do:


Przeglądający: 4 gości