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.
Nie był bym sobą gdybym nie miał kolejnego. Chodzi jak wcześniej o sprawdzenie stanu konta. Kod:
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ś:
Aby wyzerować zmienną stan, żeby w pętli loop wykonała się ponownie ta część kodu:
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 :
Gdzie wywołanie tej funkcji umieszczę w :
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?
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();
}
Kod:
if(stan<1){
stan++;
SIM800.print("AT+CUSD=1, \"*101#\"");
}
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#\"");
}
Kod:
if(textMessage.indexOf("PLN")>=0){
//stan=0;
skonta();
}
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?