• 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
#25
Dlaczego  po wpisaniu AT+CUSD=1, "*101#"  w porcie szeregowym, w momencie zwrócenia stanu konta na Lcd i port szeregowy gaśnie lcd? Jeżeli wywalę tą część kodu :
Kod:
if (usuwaniePin.available()){
        resetPassword();
        lcd.print("          ");
     }
  if (gaszenieLcd.available()){
        lcd.noBacklight();
        lcd.noDisplay();
     }

wtedy jest dobrze.  Oczywiście lcd gaśnie przed upływem ustawionego czasu.

Za wyświetlenie na lcd stanu konta odpowiada ta część kodu:
Kod:
void sprawdzanieStanuKonta()
{
   
    if(SIM800.available()>0){
    stanKontaString = SIM800.readString();
    stanKontaString.toCharArray(stanKonta, stanKontaString.length() );
    Serial.print(stanKontaString.length());
    Serial.print(stanKonta);
    if(stanKontaString.length()>62){
    lcd.clear(); 
    lcd.setCursor(0,0);
    lcd.print("Zostalo");
    lcd.print(stanKonta[25]);
    lcd.print(stanKonta[26]);
    lcd.print(stanKonta[27]);
    lcd.print(stanKonta[28]);
    lcd.print(stanKonta[29]);
    lcd.print(stanKonta[30]);
    lcd.print(stanKonta[31]);
    lcd.setCursor(0, 1);
    lcd.print(stanKonta[50]);
    lcd.print(stanKonta[51]);
    lcd.print(stanKonta[52]);
    lcd.print(stanKonta[53]);
    lcd.print(stanKonta[54]);
    lcd.print(stanKonta[55]);
    lcd.print(stanKonta[56]);
    lcd.print(stanKonta[57]);
    lcd.print(stanKonta[58]);
    lcd.print(stanKonta[59]);
    lcd.print(stanKonta[60]);
    lcd.print(stanKonta[61]);
    lcd.print(stanKonta[62]);
    }
  }
}



A tu cały kod. Przed fragmentami kodu których musiałem się chwilowo pozbyć, ze względu na braku wolnych pinów umiesciłem "//"
Kod:
#include <SoftwareSerial.h>
#include <Timers.h>
#include <Keypad.h>
#include <Password.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);


SoftwareSerial SIM800(3, 2);

String textMessage; //Zmienna do przechowywania wiadomości tekstowej
String alarm = "";
String stanKontaString;
char  stanKonta[20];

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

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(19200);
  SIM800.begin(19200);

  delay(20000); // czas na zalogowanie się  GSM do sieci
  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(czujnikRuchu, INPUT_PULLUP);
  pinMode(laser, INPUT);
}

void loop()
{
  sprawdzanieStanuKonta();

  if(SIM800.available()>0){
    textMessage = SIM800.readString();
    Serial.print(textMessage);   
    delay(10);
  }
  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 = "";
  }


 
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(czujnikRuchu) == HIGH) {
      //  stanAlarmu = 2;
     //   lcd.clear();
      //  czasNaPin.begin(czasNaPinOdliczanie);
    // }
     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);
     tone(buzzer, 2000);
     delay(50);
     tone(buzzer, 2000);
     delay(50);
     noTone(buzzer);
     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);
    tone(buzzer, 4000);
    //delay(50);
   // tone(buzzer, 3000);
   // delay(50);
   // tone(buzzer, 2000);
   // delay(50);
   // tone(buzzer, 1000);
   // delay(50);
   // noTone(buzzer);
    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"); //ustawinie moduł w tryb text
  delay(100);

  SIM800.println("AT+CMGS=\"+48699542253\""); //numer odbiorcy powiadomień
  delay(100);
 
  SIM800.println(message); //Wyślij SMS
  delay(100);

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

void smsAlarm(){
  SIM800.print("AT+CMGF=1\r"); //ustawinie moduł w tryb text
  delay(100);

  SIM800.println("AT+CMGS=\"+48699542253\""); //numer odbiorcy powiadomień
  delay(100);
 
  SIM800.println("alarm"); //Wyślij SMS
  delay(100);
  SIM800.println((char)26);
  Serial.print("alarm");
  smsNr2.begin(30000);
}

void sprawdzanieStanuKonta()
{
  }
    if(SIM800.available()>0){
    stanKontaString = SIM800.readString();
    stanKontaString.toCharArray(stanKonta, stanKontaString.length() );
    Serial.print(stanKontaString.length());
    Serial.print(stanKonta);
    if(stanKontaString.length()>62){
    lcd.clear(); 
    lcd.setCursor(0,0);
    lcd.print("Zostalo");
    lcd.print(stanKonta[25]);
    lcd.print(stanKonta[26]);
    lcd.print(stanKonta[27]);
    lcd.print(stanKonta[28]);
    lcd.print(stanKonta[29]);
    lcd.print(stanKonta[30]);
    lcd.print(stanKonta[31]);
    lcd.setCursor(0, 1);
    lcd.print(stanKonta[50]);
    lcd.print(stanKonta[51]);
    lcd.print(stanKonta[52]);
    lcd.print(stanKonta[53]);
    lcd.print(stanKonta[54]);
    lcd.print(stanKonta[55]);
    lcd.print(stanKonta[56]);
    lcd.print(stanKonta[57]);
    lcd.print(stanKonta[58]);
    lcd.print(stanKonta[59]);
    lcd.print(stanKonta[60]);
    lcd.print(stanKonta[61]);
    lcd.print(stanKonta[62]);
    }
  }
}


Przed chwilą zauważyłem, że gdy fragment kodu odpowiedzialny za wygaszanie i usuwanie pinu lcd jest aktywny to stanKontaString.lenght () ma 63 znaki, a gdy jest wyłączona ta część kodu to ma 79 znaków.

[Obrazek: b759e63faf211c77b28f3d01aa56f748.png]

Bez waszej pomocy chyba nie dam rady tego ogarnąć.
 
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: 1 gości