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ź.
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:
A tu cały kod:
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ź.
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#\"");
}