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 :
wtedy jest dobrze. Oczywiście lcd gaśnie przed upływem ustawionego czasu.
Za wyświetlenie na lcd stanu konta odpowiada ta część kodu:
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 "//"
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.
Bez waszej pomocy chyba nie dam rady tego ogarnąć.
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.
Bez waszej pomocy chyba nie dam rady tego ogarnąć.