GSM сигнализация M590+Arduino

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

для больших смс это уже критично,  проверял не единожды.

pasha413
Offline
Зарегистрирован: 27.11.2016
добился такого:
Скетч использует 9944 байт (69%) памяти устройства. Всего доступно 14336 байт.
Глобальные переменные используют 413 байт (40%) динамической памяти, оставляя 611 байт для локальных переменных. Максимум: 1024 байт.
 
СМС стали приходить все, как положено.
 
pasha413
Offline
Зарегистрирован: 27.11.2016

Все проверить еще не удалось, но большинство работает. Остальное завтра проверю.

датчик двери (геркон)  при сработке снимет с охраны, отправляет смс и звонит, при закрытии снова становится на охрану.

датчик движения (PIR) можно вкл/выкл смской. при сработке первые 2 раза сирена, в 3й раз отправляет смс.

датчик температуры (DS18b20).

можно проверить баланс, температуру.

можно отключить смс информирование о сработке датчиков, но остается смс проверка.

Вот что получилось:

Скетч использует 11776 байт (82%) памяти устройства. Всего доступно 14336 байт.
Глобальные переменные используют 409 байт (39%) динамической памяти, оставляя 615 байт для локальных переменных. Максимум: 1024 байт.
 
#include <OneWire.h>
#include<SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

// RLED   -------           
// +LED   --------          
// GLED   ------           
// BLED   -----           

OneWire ds(9);                              // датчик температуры подключен к 9 пину, подтяжка 4.7кОм на +.
#define Door 4                              // концевик двери.
#define PIR 5                               // датчик движения.
#define Buz 10                              // сирена.
#define BLed 11                             // состояние системы, моргает - норма.
int8_t PIRflag = 0;                         // флаг состояния датчика движения. при подаче питания выкл.
int8_t PIRState = 1;                        // переменная вкл/выкл PIR датчика
int8_t Doorflag = 0;                        // флаг состояния датчика двери. при подаче питания выкл.
int8_t sendsms = 1;                         // переменная вкл/выкл отправки смс
int8_t guard = 0;                           // Охрана: 1 - включена, 0 - выключена. при подаче питания выкл.
int8_t PIRval = 0;                          // переменная для чтения состояния пина. при подаче питания выкл.
int8_t DOORval = 0;                         // переменная для чтения состояния пина. при подаче питания выкл.
uint8_t ch = 0;
String val = "";                            // переменная для хранения приходящих строк из модема.
String temp = "";                           // переменная для хранения температуры.
String LastEvent = "";                      // текущее состояние системы.
String RingPhone = "";                      // номер звонившего.
String BalanceNumber = "#105#";                              //Команда запроса баланса.
const char* AlarmPhone[] = {"79111111111", "7911111111"};   // номера для постановки/снятии с охраны и отправки смс.
int8_t CountAlarmPhone = sizeof(AlarmPhone) / sizeof(AlarmPhone[0]);

void setup() {             
    Serial.begin(9600);
    pinMode(Door, INPUT_PULLUP);        // вход, подтягивающий резистор на +, "-" дверь закрыта. 
    pinMode(PIR, INPUT);                // вход, "+" нет движения. 
    pinMode(BLed, OUTPUT);              // выход, "+" не горит. 
    pinMode(Buz, OUTPUT);               // выход, "+" не звучит. 
      digitalWrite(Buz, HIGH);
      digitalWrite(PIR, LOW);           // дадим датчику время на калибровку.
  InitModem();
      digitalWrite(BLed, HIGH);
  eepromconfig();
  Serial.println(LastEvent);
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(LastEvent), String(AlarmPhone[i]));  // смс обоим номерам.
      delay(500);
    }
}

void loop() {     /// === основная программа === ///
  LED();
  PIRDetect();
  DOORDetect();
  if (mySerial.available()) {          // есть данные от GSM модуля.
    delay(200);                        // выждем, чтобы строка успела попасть в порт целиком.
    while (mySerial.available()) {     // сохраняем входную строку в переменную val.
      ch = mySerial.read();
      val += char(ch);
      delay(50);
    }
    if (val.indexOf(F("+PBREADY")) > -1) InitModem(); // если модем перезапустился запускаем инициализацию.
    if (val.indexOf(F("RING")) > -1) {                // если обнаружен вызов.
      if (CheckPhone() == 1) {                        // проверяем номер, если наш.
        mySerial.println(F("ATH0"));                  // сбрасываем вызов.
  MasterRing();                      
      } else {
        mySerial.println(F("ATH0"));                  // если не наш, сбрасываем его.
      } 
    } else if (val.indexOf(F("+CMT:")) > -1) {        //если обнаружен СМС
      if (CheckPhone() == 1) {                        //если СМС от хозяина
  MasterSms();
      }
    } else if (val.indexOf(F("+CUSD:")) > -1) { 
      delay(1000);
  eepromconfig();
      val = String(val.substring(val.indexOf(",") + 2,val.indexOf("?")) + String(F("\n")) + LastEvent); 
  Serial.println(val);
  if (sendsms == 1) {
  sms(String(val), String("+" + RingPhone));
      delay(1000);
        } else Serial.println(F("sendsms_off"));
    } else                                            // пишем переменные в монитор порта.
  Serial.println(val);                            
    val = "";
  }
  if (Serial.available()) { 
    while (Serial.available()) { 
      ch = Serial.read();
      val += char(ch);
      delay(20);
    }
    mySerial.println(val);
    val = "";  
  }
}

int CheckPhone() {    /// === проверка телефона === ///
  for (int i = 0; i < CountAlarmPhone; i++) {
    if (val.indexOf(AlarmPhone[i]) > -1) {
      RingPhone = AlarmPhone[i];                   // если телефон наш, запоминаем его.
  Serial.println(String(F("Ring: +")) + RingPhone);          
      return 1;
    }
  }
  return 0;
}

void TempC() {      /// === измеряем температуру === ///
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(750);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();
  int Temp = (data[1] << 8) + data[0];
  Temp = Temp >> 4;
  temp = String(F("Temp ")) + Temp + String(F("*C;"));
}

void LED() {            /// === состояние светодиодов === ///    
  if (guard == 1) {                                // если в режиме охраны.
           digitalWrite(BLed, LOW);                // мигаем светодиодом через 0,2/2сек.         
           delay(200); 
           digitalWrite(BLed, HIGH);
           delay(2000); 
 } 
  if (guard == 0) {                                // если охрана снята.
    DOORval = digitalRead(Door);
    if (DOORval == LOW || PIRval == HIGH) {        // проверяем датчики.
       digitalWrite(BLed, HIGH);                   // включаем LED при сработке двери или движения.
    } else digitalWrite(BLed, LOW);                // иначе гасим его.
  }
}

void MasterRing() {   /// === если звонили, меняем состояние системы === ///
    if (guard == 1) guard = 0;               
    else if (guard == 0) guard = 1;
  delay(250);
  eepromconfig();
  Serial.println(LastEvent);
  sms(String(LastEvent), String(RingPhone));
  delay(500);
}

void MasterSms() {
    val.toLowerCase();
   if(val.indexOf(F("temp")) > -1) {
 eepromconfig();
 Serial.println(temp);
  sms(String(LastEvent), String(RingPhone));     
   }
   if(val.indexOf(F("money")) > -1) {
  Serial.println(val);
     balance();  
   }
   if(val.indexOf(F("clearsms")) > -1) {
  Serial.println(val);
     clearsms(); 
   }
   if(val.indexOf(F("alarmon")) > -1) {
  Serial.println(val);
  guard = 1;
  eepromconfig();
  sms(String(LastEvent), String(RingPhone));
   }
   if(val.indexOf(F("alarmoff")) > -1) {
  Serial.println(val);
  guard = 0;
  eepromconfig();
  sms(String(LastEvent), String(RingPhone));
   }
   if(val.indexOf(F("smson")) > -1) {
  Serial.println(val);
  sendsms = 1;
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("SMS -> On\n")) + String(LastEvent), String(AlarmPhone[i]));  // смс обоим номерам.
      delay(500);
       }   
    }
   if(val.indexOf(F("smsoff")) > -1) {
  Serial.println(val);
  sendsms = 0;
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("SMS -> Off\n")) + String(LastEvent), String(AlarmPhone[i]));  // смс обоим номерам.
      delay(500);
       }   
    }
  if(val.indexOf(F("piron")) > -1) {
  Serial.println(val);
  PIRState = 1;
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("PIR -> On\n")) + String(LastEvent), String(AlarmPhone[i]));
      delay(500);
      }   
   }
   if(val.indexOf(F("piroff")) > -1) {
  Serial.println(val);
  PIRState = 0;
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("PIR -> Off\n")) + String(LastEvent), String(AlarmPhone[i]));
      delay(500);
      }   
   }
  clearsms();
}

void balance() {
  mySerial.println(F("AT+CUSD=1"));
  delay(200);
  mySerial.println(String(F("ATD")) + BalanceNumber);
  delay(1000);
}

void PIRDetect() {    /// === срабатываение датчика движения === ///
        // === Первое срабатывание датчика движения === ///
    PIRval = digitalRead(PIR);                            // считываем значение с PIR.
    if (PIRval == HIGH && PIRState == 1 && PIRflag == 0 && guard == 1) {   // если сработал  первый раз и на охране.
       digitalWrite(Buz, LOW);                            // включаем сирену 5 сек.
  Serial.println(F("Dvizhenie!"));
       delay(5000);                                          
       digitalWrite(Buz, HIGH);                           // выключаем сирену.
       delay(2000);                                       // ждем 2 сек, для исключения ложных срабатываний.
     PIRflag++;
  }     // === Повторное срабатывание датчика движения === ///
    if (PIRval == HIGH && PIRState == 1 && PIRflag == 1 && guard == 1) {   // повторное срабатывание и на охране.
       digitalWrite(Buz, LOW);                            // сирена 10 сек.
  Serial.println(F("Dvizhenie!"));
       delay(5000);                                          
       digitalWrite(Buz, HIGH);                           // выключаем сирену.
       delay(2000);                                       // ждем 2 сек, для исключения ложных срабатываний.
  PIRflag++;
   }    // === Третье срабатывание датчика движения === //
  if (PIRflag >= 2 && PIRState == 1 && guard == 1) {     
  Serial.println(String(F("Dvizhenie!\n")) + LastEvent);
  if (sendsms == 1) {
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("Dvizhenie!\n")) + String(LastEvent), String(AlarmPhone[i]));
      delay(500);
          }
      } else Serial.println(F("sendsms_off"));
  }  
  if (PIRflag >= 2) {                                     // возвращаемся к первому срабатыванию датчика движения
      PIRflag = 0; 
  }
    digitalWrite(Buz, HIGH);        
}

void DOORDetect() {   /// === срабатывание датчика двери === ///
    DOORval = digitalRead(Door);                          // считываем значение с датчика двери.
    if (DOORval == HIGH && Doorflag == 0 && guard == 1) { // если дверь открыта и на охране.
       digitalWrite(Buz, LOW);                            // сирена около 20сек. 
        Doorflag ++;
        guard = 0;                                        // снимаем с охраны.
  eepromconfig();
       delay(500);
  Serial.println(String(F("Dver' otkrita!\n")) + LastEvent);
  if (sendsms == 1) {
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("Dver' otkrita!\n")) + String(LastEvent), String(AlarmPhone[i])); // Посылаем СМС дверь открыта и состояние системы  
      delay(500);
          }
      } else Serial.println(F("sendsms_off"));
       mySerial.println("ATD+"+(RingPhone) + ";");        // отзваниваемся на номер поставившего на охрану.
      delay(100);
//      if (mySerial.find("OK")) Serial.println("OK!");
//      else Serial.println("error");
       delay(20000);                                      // время сирены 20сек                                   
       digitalWrite(Buz, HIGH);        
  } if (DOORval == LOW && Doorflag == 1 && guard == 0) {  // если дверь закрыли 
      Doorflag = 0;                                   
      guard = 1;                                          // ставим на охрану
  eepromconfig();
  Serial.println(String(F("Dver' zakrita!\n")) +LastEvent);
  if (sendsms == 1) {
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("Dver' zakrita!\n")) + String(LastEvent), String(AlarmPhone[i]));  // Посылаем СМС  
      delay(500);
        }
     } else Serial.println(F("sendsms_off"));
  }
}

void eepromconfig() {       /// === конфигурирование === ///
  TempC();  
    if (guard == 1) LastEvent = String(F("Alarm On;\n")) + temp;
    if (guard == 0) LastEvent = String(F("Alarm Off;\n")) + temp;
}

void InitModem() {       /// === инициализация модема === ///
  delay(2000);
  Serial.begin(9600); 
  mySerial.begin(9600);
  mySerial.println(F("AT"));
  delay(100);
  mySerial.println(F("ATI"));
  delay(100);
  mySerial.println(F("AT+CLIP=1"));
  delay(100);
  mySerial.println(F("AT+CMGF=1")); 
  delay(100);
  mySerial.println(F("AT+CSCS=\"GSM\""));
  delay(100);
  mySerial.println(F("AT+CNMI=2,2")); // 0,0,0
  delay(100);
}

void clearsms() {          /// === очистка смс с симкарты === ///
  mySerial.println(F("AT+CMGD=1,4"));
  Serial.println(F("Clear SMS"));
} 

void sms(String text, String phone) {      /// === отправка СМС === ///
    Serial.println(F("Start SMS send")); 
    mySerial.println(String(F("AT+CMGS=\"")) + phone + String(F("\"")));
    delay(500);
    mySerial.print(text);
    delay(500);
    mySerial.print((char)26);
    delay(500);
    Serial.println(String(F("SMS sended! Phone: ")) + phone + String(F("; Message: ")) + text);
    delay(6000);
}

 

Вот с использованием EEPROM, если кому надо, но его не проверял еще:

Скетч использует 12124 байт (84%) памяти устройства. Всего доступно 14336 байт.
Глобальные переменные используют 409 байт (39%) динамической памяти, оставляя 615 байт для локальных переменных. Максимум: 1024 байт.
 
#include <OneWire.h>
#include <EEPROM.h>
#include<SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

// RLED   -------           
// +LED   --------          
// GLED   ------           
// BLED   -----           

OneWire ds(9);                              // датчик температуры подключен к 9 пину, подтяжка 4.7кОм на +.
#define Door 4                              // концевик двери.
#define PIR 5                               // датчик движения.
#define Buz 10                              // сирена.
#define BLed 11                             // состояние системы, моргает - норма.
int8_t PIRflag = 0;                         // флаг состояния датчика движения. при подаче питания выкл.
int8_t PIRState = 1;                        // переменная вкл/выкл PIR датчика
int8_t Doorflag = 0;                        // флаг состояния датчика двери. при подаче питания выкл.
int8_t sendsms = 1;                         // переменная вкл/выкл отправки смс
int8_t guard = 0;                           // Охрана: 1 - включена, 0 - выключена. при подаче питания выкл.
int8_t PIRval = 0;                          // переменная для чтения состояния пина. при подаче питания выкл.
int8_t DOORval = 0;                         // переменная для чтения состояния пина. при подаче питания выкл.
uint8_t ch = 0;
String val = "";                            // переменная для хранения приходящих строк из модема.
String temp = "";                           // переменная для хранения температуры.
String LastEvent = "";                      // текущее состояние системы.
String RingPhone = "";                      // номер звонившего.
String BalanceNumber = "#105#";                              //Команда запроса баланса.
const char* AlarmPhone[] = {"79111111111", "7911111111"};   // номера для постановки/снятии с охраны и отправки смс.
int8_t CountAlarmPhone = sizeof(AlarmPhone) / sizeof(AlarmPhone[0]);

void setup() {             
    Serial.begin(9600);
    pinMode(Door, INPUT_PULLUP);        // вход, подтягивающий резистор на +, "-" дверь закрыта. 
    pinMode(PIR, INPUT);                // вход, "+" нет движения. 
    pinMode(BLed, OUTPUT);              // выход, "+" не горит. 
    pinMode(Buz, OUTPUT);               // выход, "+" не звучит. 
      digitalWrite(Buz, HIGH);
      digitalWrite(PIR, LOW);           // дадим датчику время на калибровку.
  InitModem();
      digitalWrite(BLed, HIGH);
  eepromconfig();
  Serial.println(LastEvent);
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(LastEvent), String(AlarmPhone[i]));  // смс обоим номерам.
      delay(500);
    }
}

void loop() {     /// === основная программа === ///
  LED();
  PIRDetect();
  DOORDetect();
  if (mySerial.available()) {          // есть данные от GSM модуля.
    delay(200);                        // выждем, чтобы строка успела попасть в порт целиком.
    while (mySerial.available()) {     // сохраняем входную строку в переменную val.
      ch = mySerial.read();
      val += char(ch);
      delay(50);
    }
    if (val.indexOf(F("+PBREADY")) > -1) InitModem(); // если модем перезапустился запускаем инициализацию.
    if (val.indexOf(F("RING")) > -1) {                // если обнаружен вызов.
      if (CheckPhone() == 1) {                        // проверяем номер, если наш.
        mySerial.println(F("ATH0"));                  // сбрасываем вызов.
  MasterRing();                      
      } else {
        mySerial.println(F("ATH0"));                  // если не наш, сбрасываем его.
      } 
    } else if (val.indexOf(F("+CMT:")) > -1) {        //если обнаружен СМС
      if (CheckPhone() == 1) {                        //если СМС от хозяина
  MasterSms();
      }
    } else if (val.indexOf(F("+CUSD:")) > -1) { 
      delay(1000);
  eepromconfig();
      val = String(val.substring(val.indexOf(",") + 2,val.indexOf("?")) + String(F("\n")) + LastEvent); 
  Serial.println(val);
  if (sendsms == 1) {
  sms(String(val), String("+" + RingPhone));
      delay(500);
        } else Serial.println(F("sendsms_off"));
    } else                                            // пишем переменные в монитор порта.
  Serial.println(val);                            
    val = "";
  }
  if (Serial.available()) { 
    while (Serial.available()) { 
      ch = Serial.read();
      val += char(ch);
      delay(20);
    }
    mySerial.println(val);
    val = "";  
  }
}

int CheckPhone() {    /// === проверка телефона === ///
  for (int i = 0; i < CountAlarmPhone; i++) {
    if (val.indexOf(AlarmPhone[i]) > -1) {
      RingPhone = AlarmPhone[i];                   // если телефон наш, запоминаем его.
  Serial.println(String(F("Ring: +")) + RingPhone);          
      return 1;
    }
  }
  return 0;
}

void TempC() {      /// === измеряем температуру === ///
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(750);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();
  int Temp = (data[1] << 8) + data[0];
  Temp = Temp >> 4;
  temp = String(F("Temp ")) + Temp + String(F("*C;"));
}

void LED() {            /// === состояние светодиодов === ///    
  if (guard == 1) {                                // если в режиме охраны.
           digitalWrite(BLed, LOW);                // мигаем светодиодом через 0,2/2сек.         
           delay(100); 
           digitalWrite(BLed, HIGH);
           delay(1000); 
 } 
  if (guard == 0) {                                // если охрана снята.
    DOORval = digitalRead(Door);
    if (DOORval == LOW || PIRval == HIGH) {        // проверяем датчики.
       digitalWrite(BLed, HIGH);                   // включаем LED при сработке двери или движения.
    } else digitalWrite(BLed, LOW);                // иначе гасим его.
  }
}

void MasterRing() {   /// === если звонили, меняем состояние системы === ///
    if (guard == 1) {
      guard = 0; 
  EEPROM.update(10, guard);
  delay(500);
     } 
    else if (guard == 0) {
      guard = 1;
  EEPROM.update(10, guard);
    delay(500);
    }
  eepromconfig();
  Serial.println(LastEvent);
  sms(String(LastEvent), String(RingPhone));
    delay(500);
}

void MasterSms() {
    val.toLowerCase();
  if ((val.indexOf(F("resetconfig")) > -1)) {
    EEPROM.update(0, 255);
  eepromconfig();
  }
   if(val.indexOf(F("temp")) > -1) {
 eepromconfig();
 Serial.println(temp);
  sms(String(LastEvent), String(RingPhone));     
    delay(500);
   }
   if(val.indexOf(F("money")) > -1) {
  Serial.println(val);
     balance();  
   }
   if(val.indexOf(F("clearsms")) > -1) {
  Serial.println(val);
  clearsms(); 
   }
   if(val.indexOf(F("alarmon")) > -1) {
  Serial.println(val);
  guard = 1;
  EEPROM.update(10, guard);
  eepromconfig();
  sms(String(LastEvent), String(RingPhone));
    delay(500);
   }
   if(val.indexOf(F("alarmoff")) > -1) {
  Serial.println(val);
  guard = 0;
  EEPROM.update(10, guard);
  eepromconfig();
  sms(String(LastEvent), String(RingPhone));
    delay(500);
   }
   if(val.indexOf(F("smson")) > -1) {
  Serial.println(val);
  sendsms = 1;
    EEPROM.update(11, sendsms);
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("SMS -> On\n")) + String(LastEvent), String(AlarmPhone[i]));  // смс обоим номерам.
    delay(500);
       }   
    }
   if(val.indexOf(F("smsoff")) > -1) {
  Serial.println(val);
  sendsms = 0;
    EEPROM.update(11, sendsms);
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("SMS -> Off\n")) + String(LastEvent), String(AlarmPhone[i]));  // смс обоим номерам.
    delay(500);
   }   
  }
  if(val.indexOf(F("piron")) > -1) {
  Serial.println(val);
  PIRState = 1;
    EEPROM.update(11, PIRState);
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("PIR -> On\n")) + String(LastEvent), String(AlarmPhone[i]));
     delay(500);
    }   
   }
   if(val.indexOf(F("piroff")) > -1) {
  Serial.println(val);
  PIRState = 0;
    EEPROM.update(11, PIRState);
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("PIR -> Off\n")) + String(LastEvent), String(AlarmPhone[i]));
     delay(500);
    }   
   }
  clearsms();
}

void balance() {
  mySerial.println(F("AT+CUSD=1"));
  delay(200);
  mySerial.println(String(F("ATD")) + BalanceNumber);
  delay(500);
}

void PIRDetect() {    /// === срабатываение датчика движения === ///
        // === Первое срабатывание датчика движения === ///
    PIRval = digitalRead(PIR);                            // считываем значение с PIR.
    if (PIRval == HIGH && PIRState == 1 && PIRflag == 0 && guard == 1) {   // если сработал  первый раз и на охране.
       digitalWrite(Buz, LOW);                            // включаем сирену 5 сек.
  Serial.println(F("Dvizhenie!"));
       delay(5000);                                          
       digitalWrite(Buz, HIGH);                           // выключаем сирену.
       delay(2000);                                       // ждем 2 сек, для исключения ложных срабатываний.
     PIRflag++;
  }     // === Повторное срабатывание датчика движения === ///
    if (PIRval == HIGH && PIRState == 1 && PIRflag == 1 && guard == 1) {   // повторное срабатывание и на охране.
       digitalWrite(Buz, LOW);                            // сирена 10 сек.
  Serial.println(F("Dvizhenie!"));
       delay(5000);                                          
       digitalWrite(Buz, HIGH);                           // выключаем сирену.
       delay(2000);                                       // ждем 2 сек, для исключения ложных срабатываний.
     PIRflag++;
   }    // === Третье срабатывание датчика движения === //
  if (PIRflag >= 2 && PIRState == 1 && guard == 1) {     
  Serial.println(String(F("Dvizhenie!\n")) + LastEvent);
  if (sendsms == 1) {
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("Dvizhenie!\n")) + String(LastEvent), String(AlarmPhone[i]));
      delay(500);
          }
      } else Serial.println(F("sendsms_off"));
  }  
  if (PIRflag >= 2) {                                     // возвращаемся к первому срабатыванию датчика движения
      PIRflag = 0; 
  }
    digitalWrite(Buz, HIGH);        
}

void DOORDetect() {   /// === срабатывание датчика двери === ///
    DOORval = digitalRead(Door);                          // считываем значение с датчика двери.
    if (DOORval == HIGH && Doorflag == 0 && guard == 1) { // если дверь открыта и на охране.
       digitalWrite(Buz, LOW);                            // сирена около 20сек. 
        Doorflag ++;
        guard = 0;                                        // снимаем с охраны.
  eepromconfig();
       delay(500);
  Serial.println(String(F("Dver' otkrita!\n")) + LastEvent);
  if (sendsms == 1) {
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("Dver' otkrita!\n")) + String(LastEvent), String(AlarmPhone[i])); // Посылаем СМС дверь открыта и состояние системы  
      delay(500);
          }
      } else Serial.println(F("sendsms_off"));
       mySerial.println("ATD+"+(RingPhone) + ";");        // отзваниваемся на номер поставившего на охрану.
      delay(100);
//      if (mySerial.find("OK")) Serial.println("OK!");
//      else Serial.println("error");
       delay(20000);                                      // время сирены 20сек                                   
       digitalWrite(Buz, HIGH);        
  } if (DOORval == LOW && Doorflag == 1 && guard == 0) {  // если дверь закрыли 
      Doorflag = 0;                                   
      guard = 1;                                          // ставим на охрану
  eepromconfig();
  Serial.println(String(F("Dver' zakrita!\n")) +LastEvent);
  if (sendsms == 1) {
    for (int i = 0; i < CountAlarmPhone; i++) {
  sms(String(F("Dver' zakrita!\n")) + String(LastEvent), String(AlarmPhone[i]));  // Посылаем СМС  
      delay(500);
        }
     } else Serial.println(F("sendsms_off"));
  }
}

void eepromconfig() {       /// === конфигурирование === ///
  pinMode(13, OUTPUT);
  if (EEPROM.read(0) != 1) {
    for (int i = 0 ; i < 20 ; i++) {
      EEPROM.update(i, 255);
      delay(10);
    }
    EEPROM.update(10, 0);  // guard = 0;    // 
    EEPROM.update(11, 1);  // sendsms = 1;  // 
    EEPROM.update(12, 1);  // PIRState = 1; // 
    EEPROM.update(0, 1);
    digitalWrite(13, HIGH);
  }
  if (EEPROM.read(0) == 1) {
    sendsms = EEPROM.read(10);  // guard = 0;    //
    sendsms = EEPROM.read(11);  // sendsms = 1;  //
    sendsms = EEPROM.read(12);  // PIRState = 1; //
  TempC();  
    if (guard == 1) LastEvent = String(F("Alarm On;\n")) + temp;
    if (guard == 0) LastEvent = String(F("Alarm Off;\n")) + temp;
  }
}

void InitModem() {       /// === инициализация модема === ///
  delay(2000);
  Serial.begin(9600); 
  mySerial.begin(9600);
  mySerial.println(F("AT"));
  delay(100);
  mySerial.println(F("ATI"));
  delay(100);
  mySerial.println(F("AT+CLIP=1"));
  delay(100);
  mySerial.println(F("AT+CMGF=1")); 
  delay(100);
  mySerial.println(F("AT+CSCS=\"GSM\""));
  delay(100);
  mySerial.println(F("AT+CNMI=2,2")); // 0,0,0
  delay(100);
}

void clearsms() {          /// === очистка смс с симкарты === ///
  mySerial.println(F("AT+CMGD=1,4"));
  Serial.println(F("Clear SMS"));
} 

void sms(String text, String phone) {      /// === отправка СМС === ///
    Serial.println(F("Start SMS send")); 
    mySerial.println(String(F("AT+CMGS=\"")) + phone + String(F("\"")));
    delay(500);
    mySerial.print(text);
    delay(500);
    mySerial.print((char)26);
    delay(500);
    Serial.println(String(F("SMS sended! Phone: ")) + phone + String(F("; Message: ")) + text);
    delay(6000);
}

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ну и слава Богу. А вообще, со String поосторожнее и скобки не ленитесь ставить, я же там писал и примеры приводил как оно влияет.

pasha413
Offline
Зарегистрирован: 27.11.2016

да еще не добрался, почитаю завтра.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

Со стринг смело... смело..

Мне вот флоат в стринг опндобилось.. 

Тмпературу в флоат считывал, сравнивал.. а выводить в смс - ругается.

пришлось так:   sms_txt = String (Temp);

 

pasha413
Offline
Зарегистрирован: 27.11.2016

подправил скетч выложенный постами ранее, добавил с использованием ЕЕПРОМ.

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

pasha413 пишет:

подправил скетч выложенный постами ранее, добавил с использованием ЕЕПРОМ.

 

 

для экономии ресурсов памяти проца - могу предложить писать номера телефонов, а также некоторые другие настройки - в записную симкарты, там где телефонные номера храняться. и удобно считывать тоже.

pasha413
Offline
Зарегистрирован: 27.11.2016

есть еще такие задумки:
1- добавка/замена номера мастера (хозяина) по смс с присвоением ячейки (разобрался вроде), проверяю пока что.
2- если после сработке по датчику двери, ее закрыли ставить на охрану.
3- выводить в каждом смс инфо о полном состоянии системы (датчики вкл/выкл, отправка смс вкл/выкл)

нужно ли это, ваше мнение? ну и другие пожелания приветствуются

pasha413
Offline
Зарегистрирован: 27.11.2016

Так и не разобрался с сохранением номера в ЕЕПРОМ, может кто подскажет часть кода по сохранению номера телефона в ЕЕПРОМ? 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015
pasha413
Offline
Зарегистрирован: 27.11.2016

ЕвгенийП пишет:

EEPROM.put()

да. вот как раз пытаюсь соединить два куска, мой:

#include <EEPROM.h> // подключаем библиотеку
#include<SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

uint8_t ch = 0;
String val = "";                            // переменная для хранения приходящих строк из модема.
String key_word = "m";                 // кодовое слово для перезаписи номера мастера

void setup() {
  Serial.begin(9600); // инициализация послед. порта
  InitModem();
}

void loop() {
  if (mySerial.available()) {          // есть данные от GSM модуля.
    delay(200);                        // выждем, чтобы строка успела попасть в порт целиком.
    while (mySerial.available()) {     // сохраняем входную строку в переменную val.
      ch = mySerial.read();
      val += char(ch);
      delay(50);
    }
    if (val.indexOf(F("+PBREADY")) > -1) InitModem(); // если модем перезапустился запускаем инициализацию.
    if (val.indexOf(F("+CMT:")) > -1) {        //если обнаружен СМС
   if(val.indexOf(key_word) > -1) {                //проверка наличия кодового слова
    val = String(val.substring(val.indexOf(key_word) + 1)); 
    char nachalo = val.indexOf(key_word);
    char key_word_len = key_word.length();
    String tel = val.substring(nachalo + key_word_len + 1, nachalo + key_word_len + 12);  // номер в смс
    String cell = val.substring(nachalo + key_word_len + 13, nachalo + key_word_len + 14); // ячейка для записи номера
  Serial.println("SMS -> " + tel + " [" + cell + "]"); 

  delay(2000);
  

      }
    } else                                            // пишем переменные в монитор порта.
  Serial.println(val);                            
    val = "";
  }
  if (Serial.available()) { 
    while (Serial.available()) { 
      ch = Serial.read();
      val += char(ch);
      delay(20);
    }
    mySerial.println(val);
    val = "";  
  }      
}

void InitModem() {       /// === инициализация модема === ///
  delay(2000);
  Serial.begin(9600); 
  mySerial.begin(9600);
  mySerial.println(F("AT"));
  delay(100);
  mySerial.println(F("ATI"));
  delay(100);
  mySerial.println(F("AT+CLIP=1"));
  delay(100);
  mySerial.println(F("AT+CMGF=1")); 
  delay(100);
  mySerial.println(F("AT+CSCS=\"GSM\""));
  delay(100);
  mySerial.println(F("AT+CNMI=2,2")); // 0,0,0
  delay(100);
}

и EPPROM.put:

#include <EEPROM.h> // подключаем библиотеку
int addr = 0; // адрес 
char name[13] = "79123456789"; // создаём массив символов
char c[13]; // переменная для хранения массива из 20 символов

void setup() {
  EEPROM.put(addr, name); // записываем массив в EEPROM 
  Serial.begin(9600); // инициализация послед. порта
}

void loop() {
    EEPROM.get(addr, c); // считываем массив символов по адресу addr
    Serial.println(c); // выводим массив в порт
    delay(60000); // ждём 1 минуту
}

пока проблема с переводом String в char/

но это уже завтра...

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

типа put  - сам должен засандалить стринг в память.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

pasha413 пишет:
есть еще такие задумки: ........

 

ой.... тех задумок у меня - пруд пруди.. .вывести конопку возле двери. 

С кнопки - толко постановка с задержкой, снимаем с телефона.

Нажали кнопку  - пошел отсчет задержки... закрыли дверь и сработал геркон - задержка прекращена и стало в охрану, над дврью зажегся светодиод...

pasha413
Offline
Зарегистрирован: 27.11.2016

Short Circuit пишет:

типа put  - сам должен засандалить стринг в память.


где-то вычитал, что можно и String засандалить, но у меня не вышло.
на счет задумок: жду rfid rc522

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

pasha413 пишет:
где-то вычитал, что можно и String засандалить
Можно, если ей метод соответсвующий добаввить или просто взять c_str() и текущую длинц и всё это циклом прогнать через EEPROM.update

pasha413
Offline
Зарегистрирован: 27.11.2016

а в коде, выложенном пару постами ранее, если кодовое слово написать мастер, то номер не полностью определяется, подскажите, почему?

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Не знаю, там два кода. Скажите толком, что Ва надо. Строку запихать в епром? Строка какого типа? String? char[]?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

Short Circuit пишет:

 

ой.... тех задумок у меня - пруд пруди.. .вывести конопку возле двери. 

С кнопки - толко постановка с задержкой, снимаем с телефона.

Нажали кнопку  - пошел отсчет задержки... закрыли дверь и сработал геркон - задержка прекращена и стало в охрану, над дврью зажегся светодиод...

, а, еще добавить зумер, и пусть делает бип-бип раз в 1-2 сек, пока идет задержка на выход по крайней мере. На вход можно не бипать, чтобы злоумышленник не ориентировался. или бипать если так хочется пользователю. Вкл-выкл бып - в настройках.

Снимать с охраны - тем что предложили выше, ну и ставить в охрану тоже можно той же карточкой или кнопкой по сценарию выше. Кнопка - удобно, наприемр не нужно лезть в карман за карточкой. Плюс снятие с телефона с охраны, это если карточку забыли... Сложностей по логике - не вижу никаких, в программу впишется без проблем.

pasha413
Offline
Зарегистрирован: 27.11.2016

ЕвгенийП пишет:

Не знаю, там два кода. Скажите толком, что Ва надо. Строку запихать в епром? Строка какого типа? String? char[]?

вот здесь:

#include <EEPROM.h> // подключаем библиотеку
#include<SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

uint8_t ch = 0;
String val = "";                            // переменная для хранения приходящих строк из модема.
String key_word = "master";                 // кодовое слово для перезаписи номера мастера

void setup() {
  Serial.begin(9600); // инициализация послед. порта
  InitModem();
}

void loop() {
  if (mySerial.available()) {          // есть данные от GSM модуля.
    delay(200);                        // выждем, чтобы строка успела попасть в порт целиком.
    while (mySerial.available()) {     // сохраняем входную строку в переменную val.
      ch = mySerial.read();
      val += char(ch);
      delay(50);
    }
    if (val.indexOf(F("+PBREADY")) > -1) InitModem(); // если модем перезапустился запускаем инициализацию.
    if (val.indexOf(F("+CMT:")) > -1) {        //если обнаружен СМС
   if(val.indexOf(key_word) > -1) {                //проверка наличия кодового слова
    val = String(val.substring(val.indexOf(key_word) + 1)); 
    char nachalo = val.indexOf(key_word);
    char key_word_len = key_word.length();
    String tel = val.substring(nachalo + key_word_len + 1, nachalo + key_word_len + 12);  // номер в смс
    String cell = val.substring(nachalo + key_word_len + 13, nachalo + key_word_len + 14); // ячейка для записи номера
  Serial.println("SMS -> " + tel + " [" + cell + "]"); 

  delay(2000);
  

      }
    } else                                            // пишем переменные в монитор порта.
  Serial.println(val);                            
    val = "";
  }
  if (Serial.available()) { 
    while (Serial.available()) { 
      ch = Serial.read();
      val += char(ch);
      delay(20);
    }
    mySerial.println(val);
    val = "";  
  }      
}

void InitModem() {       /// === инициализация модема === ///
  delay(2000);
  Serial.begin(9600); 
  mySerial.begin(9600);
  mySerial.println(F("AT"));
  delay(100);
  mySerial.println(F("ATI"));
  delay(100);
  mySerial.println(F("AT+CLIP=1"));
  delay(100);
  mySerial.println(F("AT+CMGF=1")); 
  delay(100);
  mySerial.println(F("AT+CSCS=\"GSM\""));
  delay(100);
  mySerial.println(F("AT+CNMI=2,2")); // 0,0,0
  delay(100);
}

если кодовое слово "master", то придет 8 цифр номера, как будто ограничение по длинне сообщения.

если прописать кодовое слово "m" то все в норме.

Строку типа String, записать в EEPROM - 28 строку номер телефона, в ячейку памяти строка 29.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

 а вы отредактируйте сначала  строку (nachalo + key_word_len + 1, nachalo + key_word_len + 12);

чтобы приходило не 8..

pasha413
Offline
Зарегистрирован: 27.11.2016

Short Circuit пишет:

 а вы отредактируйте сначала  строку (nachalo + key_word_len + 1, nachalo + key_word_len + 12);

чтобы приходило не 8..


так отсюда приходит 11 символов, если кодовое слово "m", если кодовое "master" то приходит 8 цифр номера.

pasha413
Offline
Зарегистрирован: 27.11.2016

нашел на просторах часть кода для добавления номера телефона, но как-то работает через раз, может что подскажете?

#include <EEPROM.h>

struct Phone {
  String number;
  boolean al;
  boolean ed;
};

Phone Alarm[3]; // Тел номер.
uint8_t eeAddress;

uint8_t ch = 0;
String val = "";
String AlarmPhone[5];


void setup() {
  Serial.begin(9600);
  Serial.println("Enter");
    for (int i = 0 ; i < 5 ; i++) {
     Serial.println(AlarmPhone[i]);
      delay(100);
    }
}

void loop() {
  if (Serial.available()) {
    while (Serial.available()) {
      ch = Serial.read();
      val += char(ch);
      delay(20);
    }
   Serial.println(val);
    ConsolePrint();
    val = "";
  }
}

void ConsolePrint() {
  val.toLowerCase();
  if ((val.indexOf("addphone:") > -1)) {
    Serial.println("Enter->" + val);
    addphone(val.substring(21, 22).toInt(), val.substring(9, 20), val.substring(23, 24), val.substring(25, 26));
//    addphone(val.substring(21, 22).toInt(), val.substring(9, 20));
    // SMS типа: "addphone:79111234567 1 2 3" 
  }
}

int addphone(int index, String num, boolean a, boolean e) { // запись в ячейку.
  index--;
  Serial.println("addnumber:[" + String(index) + "] # " + num);
  
  if (index -1 and index<4) {
  Alarm[index].number = num;
  Alarm[index].al = a;
  Alarm[index].ed = e;
  eeAddress = 30 + sizeof(Alarm[index]) * index;
  EEPROM.put(eeAddress, Alarm[index]);
  return 1;
  }
  return 0;
}

пока добавляю номер из монитора порта. но пока не каждый раз работает на моей 168 атмеге, может памяти мало?


строка добавления номера :   addphone:79111386232 1 2 3

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

pasha413 пишет:
Short Circuit пишет:

 а вы отредактируйте сначала  строку (nachalo + key_word_len + 1, nachalo + key_word_len + 12);

чтобы приходило не 8..

так отсюда приходит 11 символов, если кодовое слово "m", если кодовое "master" то приходит 8 цифр номера.
я думал - вы хоть вникаете, в то, что переписываете, а вы так  просто - на авось..

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

pasha413 пишет:

 но как-то работает через раз

А с чего Вы взяли, что она через раз работает? Вы же нигде не читаете что у Вас там в епром записалось. Прочитайте и убедитесь, что не работает никак.

pasha413
Offline
Зарегистрирован: 27.11.2016

Подскажите. или поделитель процедурой сохранения номера в EEPROM

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Да, нет никакой особой процедуры. EEPROM.put или EEPROM.update - вот и вся процедура.

pasha413
Offline
Зарегистрирован: 27.11.2016

ЕвгенийП пишет:

Да, нет никакой особой процедуры. EEPROM.put или EEPROM.update - вот и вся процедура.

спасибо. это я знаю, торлько все-равно не получается как-то

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

А как Вы делаете, что не получается?

pasha413
Offline
Зарегистрирован: 27.11.2016
#include <EEPROM.h> // подключаем библиотеку
int addr = 0; // адрес 
char name[13] = "79111234567"; // создаём массив символов
char c[13]; // переменная для хранения массива из 20 символов

void setup() {
  EEPROM.put(addr, name); // записываем массив в EEPROM 
  Serial.begin(9600); // инициализация послед. порта
}

void loop() {
    EEPROM.get(addr, c); // считываем массив символов по адресу addr
    Serial.println(c); // выводим массив в порт
    delay(60000); // ждём 1 минуту
}

вот по этому коду норм работает, как только извлекаю номер из смс, то он его при чтении выдает так  "

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

pasha413 пишет:

вот по этому коду норм работает, как только извлекаю номер из смс, то он его при чтении выдает так  "

Как "так"?

И кроме того, зачем Вы мне показываете пример, который работает? Вы покажите тот, который не работает (желательно тоже маленький).

pasha413
Offline
Зарегистрирован: 27.11.2016

чуть позже выложу, нет под рукой. читает из епром ковычки/

Вообщем получилось преобразовать String в char, и сохранить номер в ЕЕПРОМ.

#include <EEPROM.h> // подключаем библиотеку

uint8_t ch = 0;
int addr = 0; // адрес
String val = "79111234567";
char nomer[13]; // создаём массив символов
char c[13]; // переменная для хранения массива из 20 символов

void setup() {
  Serial.begin(9600);
}

void loop() {
    Serial.println("tel-> " + val); // 
    val.toCharArray(nomer, 13);
    EEPROM.put(addr, nomer); // записываем массив в EEPROM 
    delay(2000); // ждём 
    EEPROM.get(addr, c); // считываем массив символов по адресу addr
    Serial.println(String("EEPROM-> ") + c); // 
    delay(5000); // ждём 
  }

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Т.е. проблема решилась? Ну и слава Богу.

На всякий случай не спрашиваю зачем заводить String, чтобы потом преобразовывает его в char (тем более таким варварским способом -дублируя строку в памяти).

pasha413
Offline
Зарегистрирован: 27.11.2016

я считываю номер из смс в String.
ну или подскажите как еще можно, т.к. это только начало, надо несколько номеров хранить в ЕЕПРОМ

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

pasha413 пишет:
я считываю номер из смс в String.
да, ради бога, считывайте. Мне только непонятно зачем, если его тут же надо обратно переводить, да ещё и дублированием. Но, Вам, наверное, понятно.

pasha413
Offline
Зарегистрирован: 27.11.2016

#include <EEPROM.h> // подключаем библиотеку

uint8_t ch = 0;
int addr = 0; // адрес
String val;
char nomer[12]; // массив символов

void setup() {
  Serial.begin(9600);
    EEPROM.get(addr, nomer); // для проверки номера в еепром
    Serial.println(String("EEPROM-> ") + nomer); // 
}

void loop() {
  if (Serial.available()) { 
    while (Serial.available()) { //если написали номер. запоминаем его
      ch = Serial.read();
      val += char(ch);
      delay(20);
    }
    Serial.println("tel-> " + val); // 
    val.toCharArray(nomer, 12);
    EEPROM.put(addr, nomer); // записываем массив в EEPROM 
    val = "";
    delay(2000); // ждём 
    EEPROM.get(addr, nomer); // считываем массив символов по адресу addr
    Serial.println(String("EEPROM-> ") + nomer); // 
    delay(5000); // ждём 
  }
}

 

пока так получается с еепромом

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Да дело Ваше. как получается, так и получается. Мне непонятно, ... ну ладно, если уж Вы так жить не можете без String, живите, но нафига дублировать-то? Зачем строка 22 и массив номер? Зачем в памяти второй дубль этого номера? Его что, нельзя прямо из буфера String'а записать в еепром?

pasha413
Offline
Зарегистрирован: 27.11.2016

ЕвгенийП пишет:

Да дело Ваше. как получается, так и получается. Мне непонятно, ... ну ладно, если уж Вы так жить не можете без String, живите, но нафига дублировать-то? Зачем строка 22 и массив номер? Зачем в памяти второй дубль этого номера? Его что, нельзя прямо из буфера String'а записать в еепром?

возможно можно, но я не знаю как. направьте на путь истинный

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ну, сейчас мне не на чем проверить, так что если не заработает, напишите, я вечером или завтра починю. Но примерно как-то так должно работать.

// Запись
void saveStringToEEPROM(const String & s, void * eepromAddr) {
  const unsigned len = s.length(); // длина строки
  eeprom_update_block(& len, eepromAddr, sizeof(len));  // запись длины
  eeprom_update_block(s.c_str(), eepromAddr + sizeof(len), len); // Запись самой строки
}

//  Чтение
// Возвращает
//    true - успешно
//    false - нехватка памяти
bool readStringFromEEPROM(String & s, const void * eepromAddr) {
  unsigned len; // здесь будет длина
  eeprom_read_block (& len, eepromAddr, sizeof(len)); // Читаем длину
  s.reserve(len + 1); 
  if (s) {
    eeprom_read_block ((void *) s.c_str(), eepromAddr + sizeof(len), len); // Читаем строку
    return true;
  }
  return false;
}

Обращаться к функциям как обычно. Например, так:

  // Запись
  String s = "Masha ela kashu";
  saveStringToEEPROM(s, EEPROM_ADDR);

  // Чтение 
  String ss;
  readStringFromEEPROM(ss, EEPROM_ADDR);

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

а как расчитать сколько ячеек памяти займет запись? чтобы вторая потом запись не наехала на чать первой.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ну, добавьте, чтобы saveStringToEEPROM возващала сколько байтов она записала. Очевидно, что это: len + sizeof(len)

pasha413
Offline
Зарегистрирован: 27.11.2016

Вообщем что-то сделал, записывает, хранит, читает.

#include <EEPROM.h> 

int i;
uint8_t ch = 0;
String val = "";             
char Phone[12] = "";   
byte Adress[5] = {0, 15, 30, 45, 60}; // ячейки для номеров

void setup() {
    Serial.begin(9600);
}

void loop() {
  if (Serial.available()) { 
    while (Serial.available()) { 
     uint8_t ch = Serial.read();
      val += char(ch);
      delay(20);
    }
  Serial.println(val);
  ConsolePrint();
  }
    val = "";  
}

void ConsolePrint() {
    if(val.indexOf(F("master:7")) > -1)    { // добавление мастер-номера
      master(val.substring(19, 20).toInt(), val.substring(7, 18));
// sms типа: " master:79111386232 1 " - номер + ячейка. куда записать номер
    }
    if(val.indexOf(F("phone")) > -1)       { // проверка мастер-номеров     
      for ( i = 0; i < 5 ; i++) {
        EEPROM.get(Adress[i], Phone);        // считываем массив символов
  Serial.println(String("[") + i + String("] : ") + Phone); 
      }
    }
    if(val.indexOf(F("clearphone")) > -1)  { //очистка ЕЕПРОМ
      for (int i = 0 ; i < EEPROM.length() ; i++) {
       EEPROM.write(i, 0);
      }  
  Serial.println(F("clearphone ok!"));  
    }
}

int master (int i, String num) {
    if (i <= 4) {
      num.toCharArray(Phone, 12);
  Serial.println("master:[" + String(i) + "] # " + Phone);
      EEPROM.put(Adress[i], Phone);           // записываем массив в EEPROM 
    } else Serial.println("MAX 4!");                  // у меня 5 номеров максимум
}


 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

pasha413 пишет:

Вообщем что-то сделал, записывает, хранит, читает.

НЕ записывает, НЕ хранит, НЕ читает.

Чтобы убедиться в этом, просто выбросьте из программы запись, а оставьте только чтение и печать. Если там действительно всё записано и хранится, она должна нормально прочитать и напечатать.

Кстати, не понимаю, чем Вас не устраивют мои функции? Не работают, так я ж предупреждал, что не проверял и просил сказать, если возникнут проблемы. Вы молчите, значит, я полагаю, что всё работает.

pasha413
Offline
Зарегистрирован: 27.11.2016

ЕвгенийП пишет:

pasha413 пишет:

Вообщем что-то сделал, записывает, хранит, читает.

НЕ записывает, НЕ хранит, НЕ читает.

Чтобы убедиться в этом, просто выбросьте из программы запись, а оставьте только чтение и печать. Если там действительно всё записано и хранится, она должна нормально прочитать и напечатать.

Кстати, не понимаю, чем Вас не устраивют мои функции? Не работают, так я ж предупреждал, что не проверял и просил сказать, если возникнут проблемы. Вы молчите, значит, я полагаю, что всё работает.

ЧИТАЕТ! даже питание снимал!

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Так Вы в этой же программе и "записываете". Но дело Ваше. Читает, так читает.

pasha413
Offline
Зарегистрирован: 27.11.2016

ЕвгенийП пишет:

Так Вы в этой же программе и "записываете". Но дело Ваше. Читает, так читает.

записал:

#include <EEPROM.h> 

int i;
uint8_t ch = 0;
String val = "";             
char Phone[12] = "";   
byte Adress[5] = {0, 15, 30, 45, 60}; //занимаем сотню ячеек для десяти номеров

void setup() {
    Serial.begin(9600);
}

выполник коменду 
void loop() {
  if (Serial.available()) { 
    while (Serial.available()) { 
     uint8_t ch = Serial.read();
      val += char(ch);
      delay(20);
    }
  Serial.println(val);
  ConsolePrint();
  }
    val = "";  
}

void ConsolePrint() {
     if(val.indexOf(F("phone")) > -1)       { // проверка мастер-номеров     
      for ( i = 0; i < 5 ; i++) {
        EEPROM.get(Adress[i], Phone);        // считываем массив символов
  Serial.println(String("[") + i + String("] : ") + Phone); 
      }
    }
    if(val.indexOf(F("clearphone")) > -1)  { //очистка ЕЕПРОМ
      for (int i = 0 ; i < EEPROM.length() ; i++) {
       EEPROM.write(i, 0);
      }  
  Serial.println(F("clearphone ok!"));  
    }
}

выполнил команду phone, прочитал номера из ЕЕПРОМ. и питание снимал с ардуинки на минуту.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Да, я уж заметил - виноват!

Там в 49 строке put, а мне что-то write в голову вбился. Ну, так, да, должно писать. "Через Альпы", конечно, но должно.

pasha413
Offline
Зарегистрирован: 27.11.2016
#include <EEPROM.h> 
#include<SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

int i;
uint8_t ch = 0;
char Phone[12] = "";   
byte Adress[5] = {25, 40, 55, 70, 85}; //занимаем ячейки для пяти номеров.

String val = "";             
String RingPhone = "";  // номер звонившего.
String AlarmPhone[5];   // номера для постановки/снятии с охраны и отправки смс.

void setup() {
    Serial.begin(9600);
  InitModem();
  eepromconfig();
}

void loop() {
  if (mySerial.available()) {          // есть данные от GSM модуля.
    delay(200);                        // выждем, чтобы строка успела попасть в порт целиком.
    while (mySerial.available()) {     // сохраняем входную строку в переменную val.
      ch = mySerial.read();
      val += char(ch);
      delay(50);
    }
    if (val.indexOf(F("+PBREADY")) > -1) InitModem(); // если модем перезапустился запускаем инициализацию.
    if (val.indexOf(F("RING")) > -1) {                 // если обнаружен вызов.
      if (CheckPhone() == 1) {                        // проверяем номер, если наш.
        mySerial.println(F("ATH0"));                  // сбрасываем вызов.
  Serial.println("Master Ring OK!");
//  MasterRing();                      
      } else {
  Serial.println("NO Master Ring!");
        mySerial.println(F("ATH0"));                  // если не наш, сбрасываем его.
        } 
    } else                                            // пишем переменные в монитор порта.
  Serial.println(val);                            
    val = "";
  }  if (Serial.available()) { 
    while (Serial.available()) { 
     uint8_t ch = Serial.read();
      val += char(ch);
      delay(20);
    }
  Serial.println(val);
  ConsolePrint();
    val = "";  
  }
}

void eepromconfig() {
    pinMode(13, OUTPUT);
    if (EEPROM.read(0) != 1) {
      for (int i = 0 ; i < 20 ; i++) {
        EEPROM.update(i, 255);
        delay(10);
      }
      EEPROM.update(0, 1);   // 
      digitalWrite(13, HIGH);
    }   
        if (EEPROM.read(0) == 1) {
       for (i = 0; i <= 4 ; i++) {
         EEPROM.get(Adress[i], Phone);        // считываем массив символов
         AlarmPhone[i] = Phone;
  Serial.println(String(F("[")) + i + String(F("]: ")) + AlarmPhone[i]); 
      } 
        }
}

int CheckPhone() {
  Serial.println(val);
    for (i = 0; i <= 4; i++) {
      if (val.indexOf(AlarmPhone[i]) > -1) {
         RingPhone = AlarmPhone[i];
  Serial.println("Alarm: " + RingPhone);
      return 1;
    }
  }
  return 0;
}

void ConsolePrint() {
    if(val.indexOf(F("master:")) > -1) { // добавление мастер-номера
      master(val.substring(19, 20).toInt(), val.substring(7, 18));
// sms типа: " master:79111111111 1 " - номер + ячейка, куда записать номер
    }
    if(val.indexOf(F("phone")) > -1)   { // проверка мастер-номеров     
  Masterphone();
    }
    if(val.indexOf(F("reset")) > -1)   { // сброс ЕЕПРОМ
      for (int i = 0 ; i < 100 ; i++) {
       EEPROM.update(i, 0);
      } 
  Serial.println(F("reset all!"));  
  Masterphone();
    }
}

void Masterphone () {
      for (i = 0; i <= 4 ; i++) {
        EEPROM.get(Adress[i], Phone);        // считываем массив символов
         AlarmPhone[i] = Phone;
  Serial.println(String(F("AlarmPhone[")) + i + String(F("]: ")) + AlarmPhone[i]); 
      } 
}

int master (int i, String num) {
      if (i <= 4) {
        num.toCharArray(Phone, 12);
  Serial.println(String(F("[")) + i + String(F("]: ")) + Phone);
        EEPROM.put(Adress[i], Phone);           // записываем массив в EEPROM 
      num = "";
      } else Serial.println(F("MAX number [4]!"));          // у меня 5 номеров максимум
}

void InitModem() {       /// === инициализация модема === ///
  delay(2000);
  Serial.begin(9600); 
  mySerial.begin(9600);
  mySerial.println(F("AT"));
  delay(100);
  mySerial.println(F("ATI"));
  delay(100);
  mySerial.println(F("AT+CLIP=1"));
  delay(100);
  mySerial.println(F("AT+CMGF=1")); 
  delay(100);
  mySerial.println(F("AT+CSCS=\"GSM\""));
  delay(100);
  mySerial.println(F("AT+CNMI=2,2")); // 0,0,0
  delay(100);
}

Пишу в консоли номер master:79111111111 0 (записываю его в 0 ячейку).

все сохраняет в ЕЕПРОМ.

phone

AlarmPhone[0]: 79111111111
AlarmPhone[1]: 
AlarmPhone[2]: 
AlarmPhone[3]: 
AlarmPhone[4]: 

Звоню с другого номера но номер не сравнивается, но пишет что проверен

+CLIP: "79112222222",145,,,"",0

Alarm: 
Master Ring OK!

OK

Что делаю не так. подскажите, пожалуйста?

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Что значит не сравнивается? Не равен что ли? Так они разные? Я не понял. Поясните и приведите код который должен сравнивать

pasha413
Offline
Зарегистрирован: 27.11.2016

да номера разные. но пишет что одинаковые.

код в сообщении выше.