• 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
#27
Walki ciąg dalszy. Mam już jeden sukces na koncie, mianowicie już nie obcina wiadomości zwrotnej na  porcie. Przerobiłem trochę kod, zmieniłem bibliotekę na altserialport. Niestety sprawdzanie stanu konta nadal nie działa (jedynie przez port).
Zauważyłem, że gdy wywołam funkcję która wyśle polecenie sprawdzenia stanu konta, pojawia się ono na porcie i nic się nie dzieje. Jeżeli zresetuje arduino to nagle pojawia się odpowiedź. 
[Obrazek: 3068747132a3b5f567f1587805bf21c2.png]

Czerwoną krechą zaznaczyłem moment zresetowania. wydaje mi się, że coś "zajmuje" altserialport i nie może odebrać danych, dopiero jak pójdzie reset to dane są odbierane i wyświetlane na porcie.

kod programu odpowiedzialnego za komunikację z modułem gsm:
Kod:
void loop()

  char c;

  while (Serial.available()) {
    c = Serial.read();
    altSerial.print(c);
  }
  while (altSerial.available()) {
    c = altSerial.read();
    textMessage = altSerial.readString();
    Serial.print(c);
    Serial.print(textMessage);
    if(textMessage.indexOf("Pozostalo Ci")>=0){
      //smsStanKonta();
      stanKontaLcd = textMessage;
      stanKontaLcd.remove(22,2);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(stanKontaLcd.substring(14, 29));
      lcd.setCursor(0,1);
      lcd.print(stanKontaLcd.substring(46, 60));
      delay(3000);
      lcd.clear();
    }
  } 

if(textMessage.indexOf("Wlacz")>=0){
    Serial.println("Alarm wlaczony ");
    textMessage = "";
    stanAlarmu = 1;
 
  }
  if(textMessage.indexOf("Wylacz")>=0){
    Serial.println("Alarm wylaczony");
    textMessage = "";
    stanAlarmu = 0;
  }
  if(textMessage.indexOf("Stan")>=0){
    String message = "Alarm jest " + alarm;
    wysliSMS(message);
    Serial.println("Żadanie stanu alarmu");
    textMessage = "";
  }
    if(textMessage.indexOf("PLN")>=0){
    skonta();
  }
}

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



A tu cały kod:
Kod:
#include <AltSoftSerial.h>

#include <LiquidCrystal_I2C.h>

#include <Wire.h>
#include <Timers.h>
#include <Keypad.h>
#include <Password.h>

//hd44780_I2Cexp lcd;
LiquidCrystal_I2C lcd(0x27, 16, 2);

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


AltSoftSerial altSerial;

String textMessage; //Zmienna do przechowywania wiadomości tekstowej
String alarm = "";
String stanKontaLcd;

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,13};

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

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()
{
  gaszenieLcd.begin(gaszenieLcdOdliczanie);
  lcd.begin();

  Serial.begin(9600);
  Serial.println("AltSoftSerial Test Begin");
  altSerial.begin(9600);

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

  altSerial.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()

  char c;

  while (Serial.available()) {
    c = Serial.read();
    altSerial.print(c);
  }
  while (altSerial.available()) {
    c = altSerial.read();
    textMessage = altSerial.readString();
    Serial.print(c);
    Serial.print(textMessage);
    if(textMessage.indexOf("Pozostalo Ci")>=0){
      //smsStanKonta();
      stanKontaLcd = textMessage;
      stanKontaLcd.remove(22,2);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(stanKontaLcd.substring(14, 29));
      lcd.setCursor(0,1);
      lcd.print(stanKontaLcd.substring(46, 60));
      delay(3000);
      lcd.clear();
    }
  } 

if(textMessage.indexOf("Wlacz")>=0){
    Serial.println("Alarm wlaczony ");
    textMessage = "";
    stanAlarmu = 1;
 
  }
  if(textMessage.indexOf("Wylacz")>=0){
    Serial.println("Alarm wylaczony");
    textMessage = "";
    stanAlarmu = 0;
  }
  if(textMessage.indexOf("Stan")>=0){
    String message = "Alarm jest " + alarm;
    wysliSMS(message);
    Serial.println("Żadanie 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 wylaczone
      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 wlaczone
     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){

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

  altSerial.println("AT+CMGS=\"+48xxxxxxxx\"");
  delay(100);

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

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

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

  altSerial.println("AT+CMGS=\"+48xxxxxxxx\"");
  delay(100);

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

void smsStanKonta(){

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

  altSerial.println("AT+CMGS=\"+48xxxxxxxx\"");
  delay(100);

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

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

void skonta(){
  altSerial.print("AT+CUSD=1, \"*101#\"");
}
 
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: 2 gości