подправил скетч выложенный постами ранее, добавил с использованием ЕЕПРОМ.
для экономии ресурсов памяти проца - могу предложить писать номера телефонов, а также некоторые другие настройки - в записную симкарты, там где телефонные номера храняться. и удобно считывать тоже.
есть еще такие задумки:
1- добавка/замена номера мастера (хозяина) по смс с присвоением ячейки (разобрался вроде), проверяю пока что.
2- если после сработке по датчику двери, ее закрыли ставить на охрану.
3- выводить в каждом смс инфо о полном состоянии системы (датчики вкл/выкл, отправка смс вкл/выкл)
нужно ли это, ваше мнение? ну и другие пожелания приветствуются
ой.... тех задумок у меня - пруд пруди.. .вывести конопку возле двери.
С кнопки - толко постановка с задержкой, снимаем с телефона.
Нажали кнопку - пошел отсчет задержки... закрыли дверь и сработал геркон - задержка прекращена и стало в охрану, над дврью зажегся светодиод...
, а, еще добавить зумер, и пусть делает бип-бип раз в 1-2 сек, пока идет задержка на выход по крайней мере. На вход можно не бипать, чтобы злоумышленник не ориентировался. или бипать если так хочется пользователю. Вкл-выкл бып - в настройках.
Снимать с охраны - тем что предложили выше, ну и ставить в охрану тоже можно той же карточкой или кнопкой по сценарию выше. Кнопка - удобно, наприемр не нужно лезть в карман за карточкой. Плюс снятие с телефона с охраны, это если карточку забыли... Сложностей по логике - не вижу никаких, в программу впишется без проблем.
На всякий случай не спрашиваю зачем заводить String, чтобы потом преобразовывает его в char (тем более таким варварским способом -дублируя строку в памяти).
Да дело Ваше. как получается, так и получается. Мне непонятно, ... ну ладно, если уж Вы так жить не можете без String, живите, но нафига дублировать-то? Зачем строка 22 и массив номер? Зачем в памяти второй дубль этого номера? Его что, нельзя прямо из буфера String'а записать в еепром?
Да дело Ваше. как получается, так и получается. Мне непонятно, ... ну ладно, если уж Вы так жить не можете без String, живите, но нафига дублировать-то? Зачем строка 22 и массив номер? Зачем в памяти второй дубль этого номера? Его что, нельзя прямо из буфера String'а записать в еепром?
возможно можно, но я не знаю как. направьте на путь истинный
Вообщем что-то сделал, записывает, хранит, читает.
НЕ записывает, НЕ хранит, НЕ читает.
Чтобы убедиться в этом, просто выбросьте из программы запись, а оставьте только чтение и печать. Если там действительно всё записано и хранится, она должна нормально прочитать и напечатать.
Кстати, не понимаю, чем Вас не устраивют мои функции? Не работают, так я ж предупреждал, что не проверял и просил сказать, если возникнут проблемы. Вы молчите, значит, я полагаю, что всё работает.
Вообщем что-то сделал, записывает, хранит, читает.
НЕ записывает, НЕ хранит, НЕ читает.
Чтобы убедиться в этом, просто выбросьте из программы запись, а оставьте только чтение и печать. Если там действительно всё записано и хранится, она должна нормально прочитать и напечатать.
Кстати, не понимаю, чем Вас не устраивют мои функции? Не работают, так я ж предупреждал, что не проверял и просил сказать, если возникнут проблемы. Вы молчите, значит, я полагаю, что всё работает.
для больших смс это уже критично, проверял не единожды.
Все проверить еще не удалось, но большинство работает. Остальное завтра проверю.
датчик двери (геркон) при сработке снимет с охраны, отправляет смс и звонит, при закрытии снова становится на охрану.
датчик движения (PIR) можно вкл/выкл смской. при сработке первые 2 раза сирена, в 3й раз отправляет смс.
датчик температуры (DS18b20).
можно проверить баланс, температуру.
можно отключить смс информирование о сработке датчиков, но остается смс проверка.
Вот что получилось:
#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, если кому надо, но его не проверял еще:
#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); }Ну и слава Богу. А вообще, со String поосторожнее и скобки не ленитесь ставить, я же там писал и примеры приводил как оно влияет.
да еще не добрался, почитаю завтра.
Со стринг смело... смело..
Мне вот флоат в стринг опндобилось..
Тмпературу в флоат считывал, сравнивал.. а выводить в смс - ругается.
пришлось так: sms_txt = String (Temp);
подправил скетч выложенный постами ранее, добавил с использованием ЕЕПРОМ.
подправил скетч выложенный постами ранее, добавил с использованием ЕЕПРОМ.
для экономии ресурсов памяти проца - могу предложить писать номера телефонов, а также некоторые другие настройки - в записную симкарты, там где телефонные номера храняться. и удобно считывать тоже.
есть еще такие задумки:
1- добавка/замена номера мастера (хозяина) по смс с присвоением ячейки (разобрался вроде), проверяю пока что.
2- если после сработке по датчику двери, ее закрыли ставить на охрану.
3- выводить в каждом смс инфо о полном состоянии системы (датчики вкл/выкл, отправка смс вкл/выкл)
нужно ли это, ваше мнение? ну и другие пожелания приветствуются
Так и не разобрался с сохранением номера в ЕЕПРОМ, может кто подскажет часть кода по сохранению номера телефона в ЕЕПРОМ?
EEPROM.put()
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/
но это уже завтра...
типа put - сам должен засандалить стринг в память.
ой.... тех задумок у меня - пруд пруди.. .вывести конопку возле двери.
С кнопки - толко постановка с задержкой, снимаем с телефона.
Нажали кнопку - пошел отсчет задержки... закрыли дверь и сработал геркон - задержка прекращена и стало в охрану, над дврью зажегся светодиод...
типа put - сам должен засандалить стринг в память.
где-то вычитал, что можно и String засандалить, но у меня не вышло.
на счет задумок: жду rfid rc522
а в коде, выложенном пару постами ранее, если кодовое слово написать мастер, то номер не полностью определяется, подскажите, почему?
Не знаю, там два кода. Скажите толком, что Ва надо. Строку запихать в епром? Строка какого типа? String? char[]?
ой.... тех задумок у меня - пруд пруди.. .вывести конопку возле двери.
С кнопки - толко постановка с задержкой, снимаем с телефона.
Нажали кнопку - пошел отсчет задержки... закрыли дверь и сработал геркон - задержка прекращена и стало в охрану, над дврью зажегся светодиод...
, а, еще добавить зумер, и пусть делает бип-бип раз в 1-2 сек, пока идет задержка на выход по крайней мере. На вход можно не бипать, чтобы злоумышленник не ориентировался. или бипать если так хочется пользователю. Вкл-выкл бып - в настройках.
Снимать с охраны - тем что предложили выше, ну и ставить в охрану тоже можно той же карточкой или кнопкой по сценарию выше. Кнопка - удобно, наприемр не нужно лезть в карман за карточкой. Плюс снятие с телефона с охраны, это если карточку забыли... Сложностей по логике - не вижу никаких, в программу впишется без проблем.
Не знаю, там два кода. Скажите толком, что Ва надо. Строку запихать в епром? Строка какого типа? 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.
а вы отредактируйте сначала строку (nachalo + key_word_len + 1, nachalo + key_word_len + 12);
чтобы приходило не 8..
а вы отредактируйте сначала строку (nachalo + key_word_len + 1, nachalo + key_word_len + 12);
чтобы приходило не 8..
так отсюда приходит 11 символов, если кодовое слово "m", если кодовое "master" то приходит 8 цифр номера.
нашел на просторах часть кода для добавления номера телефона, но как-то работает через раз, может что подскажете?
#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
а вы отредактируйте сначала строку (nachalo + key_word_len + 1, nachalo + key_word_len + 12);
чтобы приходило не 8..
но как-то работает через раз
А с чего Вы взяли, что она через раз работает? Вы же нигде не читаете что у Вас там в епром записалось. Прочитайте и убедитесь, что не работает никак.
Подскажите. или поделитель процедурой сохранения номера в EEPROM
Да, нет никакой особой процедуры. EEPROM.put или EEPROM.update - вот и вся процедура.
Да, нет никакой особой процедуры. EEPROM.put или EEPROM.update - вот и вся процедура.
спасибо. это я знаю, торлько все-равно не получается как-то
А как Вы делаете, что не получается?
#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 минуту }вот по этому коду норм работает, как только извлекаю номер из смс, то он его при чтении выдает так "
вот по этому коду норм работает, как только извлекаю номер из смс, то он его при чтении выдает так "
Как "так"?
И кроме того, зачем Вы мне показываете пример, который работает? Вы покажите тот, который не работает (желательно тоже маленький).
чуть позже выложу, нет под рукой. читает из епром ковычки/
Вообщем получилось преобразовать 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); // ждём }Т.е. проблема решилась? Ну и слава Богу.
На всякий случай не спрашиваю зачем заводить String, чтобы потом преобразовывает его в char (тем более таким варварским способом -дублируя строку в памяти).
я считываю номер из смс в String.
ну или подскажите как еще можно, т.к. это только начало, надо несколько номеров хранить в ЕЕПРОМ
#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); // ждём } }пока так получается с еепромом
Да дело Ваше. как получается, так и получается. Мне непонятно, ... ну ладно, если уж Вы так жить не можете без String, живите, но нафига дублировать-то? Зачем строка 22 и массив номер? Зачем в памяти второй дубль этого номера? Его что, нельзя прямо из буфера String'а записать в еепром?
Да дело Ваше. как получается, так и получается. Мне непонятно, ... ну ладно, если уж Вы так жить не можете без String, живите, но нафига дублировать-то? Зачем строка 22 и массив номер? Зачем в памяти второй дубль этого номера? Его что, нельзя прямо из буфера String'а записать в еепром?
возможно можно, но я не знаю как. направьте на путь истинный
Ну, сейчас мне не на чем проверить, так что если не заработает, напишите, я вечером или завтра починю. Но примерно как-то так должно работать.
// Запись 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; }Обращаться к функциям как обычно. Например, так:
а как расчитать сколько ячеек памяти займет запись? чтобы вторая потом запись не наехала на чать первой.
Ну, добавьте, чтобы saveStringToEEPROM возващала сколько байтов она записала. Очевидно, что это: len + sizeof(len)
Вообщем что-то сделал, записывает, хранит, читает.
#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 номеров максимум }Вообщем что-то сделал, записывает, хранит, читает.
НЕ записывает, НЕ хранит, НЕ читает.
Чтобы убедиться в этом, просто выбросьте из программы запись, а оставьте только чтение и печать. Если там действительно всё записано и хранится, она должна нормально прочитать и напечатать.
Кстати, не понимаю, чем Вас не устраивют мои функции? Не работают, так я ж предупреждал, что не проверял и просил сказать, если возникнут проблемы. Вы молчите, значит, я полагаю, что всё работает.
Вообщем что-то сделал, записывает, хранит, читает.
НЕ записывает, НЕ хранит, НЕ читает.
Чтобы убедиться в этом, просто выбросьте из программы запись, а оставьте только чтение и печать. Если там действительно всё записано и хранится, она должна нормально прочитать и напечатать.
Кстати, не понимаю, чем Вас не устраивют мои функции? Не работают, так я ж предупреждал, что не проверял и просил сказать, если возникнут проблемы. Вы молчите, значит, я полагаю, что всё работает.
ЧИТАЕТ! даже питание снимал!
Так Вы в этой же программе и "записываете". Но дело Ваше. Читает, так читает.
Так Вы в этой же программе и "записываете". Но дело Ваше. Читает, так читает.
записал:
#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, прочитал номера из ЕЕПРОМ. и питание снимал с ардуинки на минуту.
Да, я уж заметил - виноват!
Там в 49 строке put, а мне что-то write в голову вбился. Ну, так, да, должно писать. "Через Альпы", конечно, но должно.
#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 ячейку).
все сохраняет в ЕЕПРОМ.
Звоню с другого номера но номер не сравнивается, но пишет что проверен
Что делаю не так. подскажите, пожалуйста?
Что значит не сравнивается? Не равен что ли? Так они разные? Я не понял. Поясните и приведите код который должен сравнивать
да номера разные. но пишет что одинаковые.
код в сообщении выше.