Причём тут 152 второй. Сделайте то, что я просил. Я не сомневаюсь, что в епром всё нормально, а вот в том, что Вы не читаете их друга на друга - сомневаюсь. Сделайте.
[0]: 79111111111
[1]:
[2]:
[3]:
[4]:
AT
OK
ATI
NEOWAY
M590
REVISION 01.30e
OK
AT+CLIP=1
Val=
RING
+CLIP: "79111380000",145,,,"",0
i=0; AlarmPhone[i]=>79111111111<
i=1; AlarmPhone[i]=><
Comparison OK: Alarm:
Master Ring OK!
ATH0
OK
Вообщем если есть пустая ячейка памяти номеров из 5 забиты то любой (чужой) номер определяет как свой. если забить все 5 ечеек , то норм работает!
Я Вам уже писал, что это происходит потому, что indexOf "находит" пустую строку. Т.е. если Вы при помощи indexOf ищете пустую строку, то он всегда скажет, что нашел. Проверяйте на пустые строки и не ищите их indexOf, и всё будет нормально.
А мою печать Вы мне так и не покажете? Ну, дело хозяйское.
еще раз напишу:
157 пост это ответ на CheckPhone по вашему коду!
159 пост это полный код с вашим CheckPhone!
так понимаюval не успевает попасть в мон тор, поэтому прилетает позже?
еще раз напишу: 157 пост это ответ на CheckPhone по вашему коду! 159 пост это полный код с вашим CheckPhone! так понимаюval не успевает попасть в мон тор, поэтому прилетает позже?
Да, вот нет, что-то там не так. Вот смотрите в коде строки 73-78. Должны печататься все пять AlarmPhone, а печатаются только 2 (строки 24-25 лога). Так не должно быть.
Давайте строкам 73-78 присобачим начало и конец, посмотрим ещё разок. Вот так запустите
Serial.println("------ Test print begins -------);
for (i = 0; i <= 4 ; i++) {
Serial.print("AlarmPhone[");
Serial.print(i);
Serial.print("]=");
Serial.println(AlarmPhone[i]);
}
Serial.println("------ Test print ended-------);
нано? вы апаратную часть нано понимаете? отключите от нее нафик тогда ее собственный конвертер, он мешает.
уно тоже разные бывают, бывает с резисторами между процем и конвертером который на борту, а бывает и нет..
ваш вариант - мини про.. там должно работать, но оотключать свой внешний конвертер, или тольо рх часть использовать чтобы посмотреть что там отвечает например.
есть проект поливалки: часы ds1307, модуль m590 + обвязка
так то все работает, но на заключительной стадии, хотел приделать чтобы при посылке смс вида on73030 (это типо таймер включения 7:30:30) , каждые данные часы минуты секунды уходили в eeprom, каждый выделять substring, так часы имеют byte а данный у нас string
Сильно не пинать, только учусь строка 382, например при посылке смс вида clockon73030 надо чтобы 7 часов передавалось переменной setHorClockOn, 30 --> setMinClockOn, 30 --> seSecClockOn но эти переменные имеют Byte , а 7 30 30 string
#include <EEPROM.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <iarduino_RTC.h>
#include <LiquidCrystal_I2C.h>
iarduino_RTC time(RTC_DS1307);
//LiquidCrystal_I2C lcd(0x3f,20,4); //2004
LiquidCrystal_I2C lcd(0x27,16,2);
SoftwareSerial mySerial(7, 8); // RX, TX78
String val = "";
String level_w = "";
String timer = "";
int nedela[4][7] = {{0, 1, 2, 3, 4, 5, 6 }, {1, 1, 1, 1, 1, 3, 5}, {1, 1, 1, 1, 1, 1, 5}, {1, 1, 1, 2, 3, 4, 5}};
int i;
#define BLINK_INTERVAL 250UL // время для проверки уровня воды в баке
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
String master_phone = "+79222222222";
int K = 1;
int P = 0;
byte setSecClockOn; //
byte setMinClockOn; //
byte setHorClockOn;
byte setSecClockOff;
byte setMinClockOff; //
byte setHorClockOff;
byte settimer;
byte setdate;
const int sensor1 = 2; // уровень бака 1 верх2
const int sensor2 = 3; // уровень бака 2 низ3
int BL = 6; // шим индикатора
const byte outPin = 4; // выход на реле клапана
const byte outLedRelay = 5; // выход на реле наполнение бака
const int button_analog = A2;
int valuebutton = 0;
byte valA; //переменная времени
long previousMillisA = 0;
byte valX; //переменная времени
long previousMillisX = 0;
byte val_led; //переменная времени
long previousMillis_led = 0;
int on_led = 1;
int timer_on = 25; //время опроса датчика сек
int timer_ojidan = 18; //время на ожидание между включениями
int time_led = 10; //время на гашение экрана
byte kapla[8] = {0b00100,0b00100,0b01110,0b01110,0b11111,0b11111,0b01110,0b00100};
byte lampa[8] = {0b01110,0b11111,0b11111,0b11111,0b01110,0b01110,0b00000,0b00100};
byte clocka[8] = {B00100,B01110,B00100,B11111,B10011,B10101,B10001,B11111};
byte bak[8] = {B10001,B10001,B10001,B11111,B10001,B11111,B11111,B11111};
byte key(){ //// для кнопок ЛСДшилда
valuebutton = analogRead(button_analog);
if (valuebutton > 715 && valuebutton < 740) return 1; //запоминаем значение кнопки
else if (valuebutton > 620 && valuebutton < 650) return 2;
else if (valuebutton > 450 && valuebutton < 480) return 4;
else if (valuebutton > 760 && valuebutton < 800) return 3;
else if (valuebutton >= 0 && valuebutton < 100) return 5;
else return 0;
}
/////////// часы ..
void setClock(){ // установка часов
byte pos = 1;
lcd.clear();
lcd.blink();
while(key() != 1){ // крутим цикл
byte KEY = key(); // читаем состояние кнопок
delay(200);
lcd.setCursor(1, 1);
lcd.print("set to save");
lcd.setCursor(0, 0); // выводим инфу
if (time.Hours < 10) lcd.print("0");
lcd.print(time.Hours);
lcd.print(":");
if (time.minutes < 10) lcd.print("0");
lcd.print(time.minutes);
lcd.print(" ");
if (time.day < 10) lcd.print("0");
lcd.print(time.day);
lcd.print("/");
if (time.month < 10) lcd.print("0");
lcd.print(time.month);
lcd.print("/");
lcd.print(time.year);
lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
if (KEY == 5 && pos < 13) pos += 3; // крутим позицию
else if (KEY == 2 && pos > 1) pos -= 3;
else if (pos == 1 && KEY == 3) time.Hours++ ; // крутим значения
else if (pos == 1 && KEY == 4) time.Hours--;
else if (pos == 4 && KEY == 3) time.minutes++;
else if (pos == 4 && KEY == 4) time.minutes--;
else if (pos == 7 && KEY == 3) time.day++;
else if (pos == 7 && KEY == 4) time.day--;
else if (pos == 10 && KEY == 3) time.month++;
else if (pos == 10 && KEY == 4) time.month--;
else if (pos == 13 && KEY == 3) time.year++;
else if (pos == 13 && KEY == 4) time.year--;
if (time.Hours > 23) time.Hours = 0;
else if (time.minutes > 59) time.minutes = 0;
else if (time.day > 31) time.day = 0;
else if (time.month > 12) time.month = 1;
else if (time.year > 99) time.year = 0;
}// конец цикла
time.settime(-1, time.minutes, time.Hours, time.day, time.month, time.year, -1);
lcd.noBlink();
lcd.clear();
lcd.print(" Saved");
delay(1500);
}///
void setOnOff(){
delay(200);
byte pos = 6;
lcd.clear();
lcd.blink();
while(key() != 1){ // крутим цикл
byte KEY = key(); // читаем состояние кнопок
delay(200);
lcd.setCursor(0, 0); // выводим инфу
lcd.print("On: ");
if (setHorClockOn < 10) lcd.print("0");
lcd.print(setHorClockOn);
lcd.print(":");
if (setMinClockOn < 10) lcd.print("0");
lcd.print(setMinClockOn);
lcd.print(":");
if (setSecClockOn < 10) lcd.print("0");
lcd.print(setSecClockOn);
// просто вторая строка начало
lcd.setCursor(0, 1);
lcd.print("Off: ");
if (setHorClockOff < 10) lcd.print("0");
lcd.print(setHorClockOff);
lcd.print(":");
if (setMinClockOff < 10) lcd.print("0");
lcd.print(setMinClockOff);
lcd.print(":");
if (setSecClockOff < 10) lcd.print("0");
lcd.print(setSecClockOff);
// просто вторая строка конец
lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
if (KEY == 5 && pos < 12) pos += 3; // крутим позицию
else if (KEY == 2 && pos > 6) pos -= 3;
else if (pos == 6 && KEY == 3) setHorClockOn++; // крутим значения
else if (pos == 6 && KEY == 4) setHorClockOn--;
else if (pos == 9 && KEY == 3) setMinClockOn++;
else if (pos == 9 && KEY == 4) setMinClockOn--;
else if (pos == 12 && KEY == 3) setSecClockOn++;
else if (pos == 12 && KEY == 4) setSecClockOn--;
if (setHorClockOn > 23) setHorClockOn = 0;
else if (setMinClockOn > 59) setMinClockOn = 0;
else if (setSecClockOn > 59) setSecClockOn = 0;
}
delay(700);
on_sec();
}
void on_sec(){ //цикл второй строки для выключения таймера
byte pos = 6;
while(key() != 1){ // крутим цикл
byte KEY = key(); // читаем состояние кнопок
delay(200);
lcd.setCursor(0, 1); // выводим инфу
lcd.print("Off: ");
if (setHorClockOff < 10) lcd.print("0");
lcd.print(setHorClockOff);
lcd.print(":");
if (setMinClockOff < 10) lcd.print("0");
lcd.print(setMinClockOff);
lcd.print(":");
if (setSecClockOff < 10) lcd.print("0");
lcd.print(setSecClockOff);
lcd.setCursor(pos, 1); // устанавливаем курсор согласно позиции
if (KEY == 5 && pos < 12) pos += 3; // крутим позицию
else if (KEY == 2 && pos > 6) pos -= 3;
else if (pos == 6 && KEY == 3) setHorClockOff++;
else if (pos == 6 && KEY == 4) setHorClockOff--;
else if (pos == 9 && KEY == 3) setMinClockOff++;
else if (pos == 9 && KEY == 4) setMinClockOff--;
else if (pos == 12 && KEY == 3) setSecClockOff++;
else if (pos == 12 && KEY == 4) setSecClockOff--;
if (setHorClockOff > 23) setHorClockOff = 0;
else if (setMinClockOff > 59) setMinClockOff = 0;
else if (setSecClockOff > 59) setSecClockOff = 0;
}// конец цикла
lcd.noBlink();
lcd.clear();
EEPROM.write(0, setMinClockOn);
EEPROM.write(1, setHorClockOn);
EEPROM.write(3, setMinClockOff);
EEPROM.write(4, setHorClockOff);
EEPROM.write(5, setSecClockOn);
EEPROM.write(6, setSecClockOff);
lcd.print(" Saved");
delay(1500);
}///
void constant (){
delay(200);
byte pos = 7;
lcd.clear();
lcd.blink();
while(key() != 1){ // крутим цикл
byte KEY = key(); // читаем состояние кнопок
delay(200);
lcd.setCursor(0, 0);
lcd.print("timer= ");
lcd.print(settimer);
lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
if (pos == 7 && KEY == 3) settimer++;
else if (pos == 7 && KEY == 4) settimer--;
if (settimer > 1) settimer = 1;
}
lcd.noBlink();
lcd.clear();
EEPROM.write(7, settimer);
lcd.print(" Saved");
delay(1500);
}
void menu(){
delay(200);
lcd.clear();
char menuTxt[3][14] = {"set ON/OFF >>", "set clock >>", "Constant >>"};
byte pos = 0;
while(key() != 1){
delay(200);
byte KEY = key();
lcd.setCursor(0, 0);
lcd.print(pos+1);
lcd.print(".");
lcd.print(menuTxt[pos]);
if (KEY == 3 && pos != 0) pos--;
else if (KEY == 4 && pos < 2) pos++;
if (KEY == 5 && pos == 0) setOnOff();
else if (KEY == 5 && pos == 1) setClock();
else if (KEY == 5 && pos == 2) constant();
}
lcd.clear();
}
void level_water(){
if (digitalRead(sensor1) == HIGH && digitalRead(sensor2) == HIGH){ level_w = String("OFF"); digitalWrite(outLedRelay, HIGH);}
if (digitalRead(sensor1) == LOW && digitalRead(sensor2) == HIGH) {level_w = String("3/4");}
if (digitalRead(sensor1) == LOW && digitalRead(sensor2) == LOW || digitalRead(outLedRelay) == LOW) {level_w = String(" ON"); digitalWrite(outLedRelay, LOW);}
if (digitalRead(sensor1) == HIGH && digitalRead(sensor2) == LOW) {level_w = String("ERR"); digitalWrite(outLedRelay, HIGH);}
}
void blinkind(unsigned long interval ) { //индикация
static unsigned long prevTime = 0; //
if (millis() - prevTime > interval) {
prevTime = millis(); //
}}
void on_led_off() //подсветка дисплея
{
if (key() > 0){on_led = 1;}
if (on_led == 1)
{
lcd.backlight();// Включаем подсветку дисплея
if (millis() - previousMillis_led > 1000)
{
previousMillis_led = millis();
val_led++;
if (key() > 0){val_led = 0;}
}
if (val_led >= time_led)
{
val_led = 0;
on_led = 0;
lcd.noBacklight();// Включаем подсветку дисплея
}
}
}
void phone() //телефон
{
if(mySerial.available()) //если модуль что-то послал
{
char ch = ' ';
String val = "";
while(mySerial.available())
{
ch = mySerial.read();
val += char(ch); //собираем принятые символы в строку
delay(30);
}
Serial.print("Neo send> ");
Serial.println(val);
if (val.indexOf("+PBREADY") > -1)InitModem(); // если модем перезапустился запускаем инициализацию.
if (val.indexOf(F("RING")) > -1) { // если обнаружен вызов.
if (val.indexOf(master_phone) > -1) { // проверяем номер, если наш.
mySerial.println(F("ATH0")); // сбрасываем вызов.
Serial.println(F("Master Ring OK!"));
} else {
Serial.println(F("NO Master Ring!"));
mySerial.println(F("ATH0")); // если не наш, сбрасываем его.
}
}
if (val.indexOf(F("+CMT:")) > -1) { //смс
val.toLowerCase();
if (val.indexOf(F("info")) > -1) { // инфо о состоянии системы
delay(3000);
sms(String("Bak: ") + level_w + String(F("\n")) + String("Timer: ") + timer + String(F("\n")) + String("ON: ") + setHorClockOn + String(":") + setMinClockOn + String(":") + setSecClockOn +
String(F("\n")) + String("OFF: ") + setHorClockOff + String(":") + setMinClockOff + String(":") + setSecClockOff + String(F("\n")) + String("nedela: ") + setdate, String(master_phone));
}
if (val.indexOf(F("timeron")) > -1) { // включение таймера
delay(1000);
Serial.println(F("timer -> on"));
settimer = 1;
EEPROM.update(7, settimer);
}
if (val.indexOf(F("timeroff")) > -1) { // выключение таймера
delay(1000);
Serial.println(F("timer -> off"));
settimer = 0;
EEPROM.update(7, settimer);
}
if (val.indexOf(F("date0")) > -1) { // каждый день
delay(1000);
Serial.println(F("date -> date"));
setdate = 0;
EEPROM.write(8, setdate);
}
if (val.indexOf(F("date1")) > -1) { // пон, сп, пятн
delay(1000);
Serial.println(F("date -> date"));
setdate = 1;
EEPROM.write(8, setdate);
}
if (val.indexOf(F("date2")) > -1) { // пон, пят
delay(1000);
Serial.println(F("date -> date"));
setdate = 2;
EEPROM.write(8, setdate);
}
if (val.indexOf(F("date3")) > -1) { // будни
delay(1000);
Serial.println(F("date -> date"));
setdate = 3;
EEPROM.write(8, setdate);
}
if (val.indexOf(F("clockon")) > -1) { // редактирование время включения
delay(1000);
}
}
}
}
void sms(String text, String phone) // отправка СМС
{
Serial.println("Start SMS send");
mySerial.println("AT+CMGS=\"" + phone + "\"");
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println("SMS send OK");
delay(2000);
}
void InitModem() { /// === инициализация модема === ///
delay(2000);
mySerial.println("AT+CLIP=1");
delay(500);
mySerial.println("AT+CMGF=1");
delay(500);
mySerial.println("AT+CSCS=\"GSM\"");
delay(500);
mySerial.println("AT+CNMI=2,2,0,0,0"); // 0,0,0
delay(500);
mySerial.println("AT+CMGD=1,4");
delay(500);
}
void setup(){
delay(2000);
Wire.begin();
time.begin();
lcd.init(); // initialize the lcd
lcd.begin(16, 2);
analogWrite(BL, 50);
Serial.begin(9600);
mySerial.begin(9600);
InitModem();
lcd.clear();
lcd.createChar(1, kapla);
lcd.createChar(2, lampa);
lcd.createChar(3, clocka);
lcd.createChar(4, bak);
pinMode(outPin, OUTPUT);
digitalWrite(outPin, HIGH);
pinMode(outLedRelay, OUTPUT);
digitalWrite(outLedRelay, HIGH);
setMinClockOn = EEPROM.read(0);
setHorClockOn = EEPROM.read(1);
setSecClockOn = EEPROM.read(5);
setMinClockOff = EEPROM.read(3);
setHorClockOff = EEPROM.read(4);
setSecClockOff = EEPROM.read(6);
settimer = EEPROM.read(7);
setdate = EEPROM.read(8);
}
void loop()
{
on_led_off();
phone();
level_water();
blinkind(BLINK_INTERVAL);
lcd.setCursor(14, 1); lcd.print(setdate);
if (settimer == 0) timer = String("OFF");
else timer = String("ON ");
// обработка кнопок
if (key() == 1) menu(); // если нажата селект
else if (key() == 3) digitalWrite(outPin, LOW);
else if (key() == 4) digitalWrite(outPin, HIGH);
else if (key() == 2) digitalWrite(outLedRelay, LOW);
else if (key() == 5) digitalWrite(outLedRelay, HIGH);
// сравниваем время и управляем выходом//
if (settimer == 1) {
for (i = 0; i < 7; i++) {
if (nedela[setdate][i] == time.weekday){
if (setMinClockOn == time.minutes && setHorClockOn == time.Hours
&& setSecClockOn == time.seconds) digitalWrite(outPin, LOW);
}}}
if (setMinClockOff == time.minutes && setHorClockOff == time.Hours
&& setSecClockOff == time.seconds) digitalWrite(outPin, HIGH);
lcd.setCursor(0, 0); lcd.print("\3 ");
lcd.setCursor(2, 0); lcd.print(timer);
lcd.setCursor(0, 1); lcd.print("\4");
lcd.setCursor(2, 1); lcd.print(level_w);
lcd.setCursor(8, 0); lcd.print(time.gettime("H:i:s"));
lcd.setCursor(8, 1); lcd.print("\1");
if (digitalRead(outPin)) lcd.print(" X");
else lcd.print("ON");
delay(50); // нужно для нармальной работы кнопок
}
Из 165 поста все проверял, у меня работает. Установил на даче, но более простой вариант (по быстрому), т.к. хочу подготовить норм вариант, типа коммерческого.
if(mySerial.available()) { // есть данные от GSM модуля.
107
delay(200); // выждем, чтобы строка успела попасть в порт целиком.
108
while(mySerial.available()) { // сохраняем входную строку в переменную val.
109
ch = mySerial.read();
110
val += char(ch);
111
delay(50);
112
}
тоже все работало, а именно звонки принимал, смс, делал что задуманно по ним, работал довольно быстро, но потом столкнулся с проблемой надо было из смс выделить число, и эта связка допустим как у вас
if(val.indexOf(F("maxt:")) > -1) { // максимальный предел температуры
554
String maxt(val.substring(5, 11));
не понимала что идет за словом maxt: , он не видел почему то нужной строки с текстом смс
пришлось перейти на
char currSymb = gprsSerial.read();
if ('\r' == currSymb) {
if (isStringMessage) {
currStr.toLowerCase();
if (currStr.indexOf(F("poliv")) > -1) {
flag = 1;
currStr = currStr.substring(5, 8);
timer_on = currStr.toInt();
}
так стал работать заметнее медленее, но видит перевод строки и тем самым нужные мне строчки
pasha413, кажется в Вашем коде есть ошибки. Датчик движения срабатывает срузу, а должен судя по коду сработать на третий раз.
void Temperatura() а в этой функции притормаживается выполнение программы почти на секунду, кратковременное срабатывание датчика двери может быть незамеченным. Я думаю что нужно избавляться от delay. Я новичок в прогаммировании и так же как и Вы только учусь.
Столкнулся с проблемой: поменял М590, на пришедший А6, перестала нормально работать программа по все режимам завязанным с модемом:
При вызове проходит Ring после того как положили трубку, что даёт 2 проход по определению номера,
При приеме смс не видит самой смс, вообщем разбираюсь
smesharik, у меня так было, не хватало строки: Serial.println(val); См 165 пост, 136 строка.
половина же отображается, если ее не было тогда вообще не отображалось ничего
pasha413 пишет:
Столкнулся с проблемой: поменял М590, на пришедший А6, перестала нормально работать программа по все режимам завязанным с модемом: При вызове проходит Ring после того как положили трубку, что даёт 2 проход по определению номера, При приеме смс не видит самой смс, вообщем разбираюсь
Скетч использует 19 414 байт (63%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 1 089 байт (53%) динамической памяти, оставляя 959 байт для локальных переменных. Максимум: 2 048 байт.
Замучился я с модемами, М590 не полностью читает смс типа: master:79111234567 1 - читает как master:791112345 не смог пока победить.
GSM A6 поиск вызова не по RING а по +CLIP: , иначе RING проходит и после сброса вызова. а это вызывает второй раз процедуру распознавания номера, но номера нет.
А с чего Вы взяли, что он сравнивается первым? Где печати из строк 73 и 77. Почему Вы их не привели?
Я вот так уверет, что он сравнивается не с первым, а со вторым - пустым.
Переделайте checkPhone вот так
int CheckPhone() { Serial.print("Val="); Serial.println(val); for (i = 0; i <= 4; i++) { Serial.print("i="); Serial.print(i); Serial.print("; AlarmPhone[i]=>"); Serial.print(AlarmPhone[i]); Serial.println('<'); if (val.indexOf(AlarmPhone[i]) > -1) { RingPhone = AlarmPhone[i]; Serial.println("Comparison OK: Alarm: " + RingPhone); return 1; } } return 0; }и покажите мне что печатает, только всё, а не обрывки.
вот:
вот номера из ЕЕПРОМ:
странно, перенос строки
в 79 строку помог.
теперь норм сравнивает свой/чухой
Не знаю, что Вы куда перенесли. Только попробуйте напечатать списо телефонов из EEPROM где-нибудь ещё, после их ввода.
Например, в том же checkPhone - узнаете много интересного. И мне печать покажите
int CheckPhone() { for (i = 0; i <= 4 ; i++) { Serial.print("AlarmPhone["); Serial.print(i); Serial.print("]="); Serial.println(AlarmPhone[i]); } Serial.print("Val="); Serial.println(val); for (i = 0; i <= 4; i++) { Serial.print("i="); Serial.print(i); Serial.print("; AlarmPhone[i]=>"); Serial.print(AlarmPhone[i]); Serial.println('<'); if (val.indexOf(AlarmPhone[i]) > -1) { RingPhone = AlarmPhone[i]; Serial.println("Comparison OK: Alarm: " + RingPhone); return 1; } } return 0; }Не знаю, что Вы куда перенесли. Только попробуйте напечатать списо телефонов из EEPROM где-нибудь ещё, после их ввода.
Например, в том же checkPhone - узнаете много интересного. И мне печать покажите
int CheckPhone() { for (i = 0; i <= 4 ; i++) { Serial.print("AlarmPhone["); Serial.print(i); Serial.print("]="); Serial.println(AlarmPhone[i]); } Serial.print("Val="); Serial.println(val); for (i = 0; i <= 4; i++) { Serial.print("i="); Serial.print(i); Serial.print("; AlarmPhone[i]=>"); Serial.print(AlarmPhone[i]); Serial.println('<'); if (val.indexOf(AlarmPhone[i]) > -1) { RingPhone = AlarmPhone[i]; Serial.println("Comparison OK: Alarm: " + RingPhone); return 1; } } return 0; }в 152 посте, список телефонов получен командой phone из еепром. доберусь до компа еще попробую.
Причём тут 152 второй. Сделайте то, что я просил. Я не сомневаюсь, что в епром всё нормально, а вот в том, что Вы не читаете их друга на друга - сомневаюсь. Сделайте.
ну вот что пишет в монитор порта
Нет, здесь нет моей печати, что в строках 2-7. Что-то Вы не так вставили. Покажите-ка скетч.
#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() { for (i = 0; i <= 4 ; i++) { Serial.print("AlarmPhone["); Serial.print(i); Serial.print("]="); Serial.println(AlarmPhone[i]); } Serial.print("Val="); Serial.println(val); for (i = 0; i <= 4; i++) { Serial.print("i="); Serial.print(i); Serial.print("; AlarmPhone[i]=>"); Serial.print(AlarmPhone[i]); Serial.println('<'); if (val.indexOf(AlarmPhone[i]) > -1) { RingPhone = AlarmPhone[i]; Serial.println("Comparison OK: 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); }Вообщем если есть пустая ячейка памяти номеров из 5 забиты то любой (чужой) номер определяет как свой. если забить все 5 ечеек , то норм работает!
Я Вам уже писал, что это происходит потому, что indexOf "находит" пустую строку. Т.е. если Вы при помощи indexOf ищете пустую строку, то он всегда скажет, что нашел. Проверяйте на пустые строки и не ищите их indexOf, и всё будет нормально.
А мою печать Вы мне так и не покажете? Ну, дело хозяйское.
еще раз напишу:
157 пост это ответ на CheckPhone по вашему коду!
159 пост это полный код с вашим CheckPhone!
так понимаюval не успевает попасть в мон тор, поэтому прилетает позже?
Да, вот нет, что-то там не так. Вот смотрите в коде строки 73-78. Должны печататься все пять AlarmPhone, а печатаются только 2 (строки 24-25 лога). Так не должно быть.
Давайте строкам 73-78 присобачим начало и конец, посмотрим ещё разок. Вот так запустите
Serial.println("------ Test print begins -------); for (i = 0; i <= 4 ; i++) { Serial.print("AlarmPhone["); Serial.print(i); Serial.print("]="); Serial.println(AlarmPhone[i]); } Serial.println("------ Test print ended-------);загрузил скетч
#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("------ Test print begins -------"); for (i = 0; i <= 4 ; i++) { Serial.print("AlarmPhone["); Serial.print(i); Serial.print("]="); Serial.println(AlarmPhone[i]); } Serial.println("------ Test print ended-------"); Serial.print("Val="); Serial.println(val); for (i = 0; i <= 4; i++) { Serial.print("i="); Serial.print(i); Serial.print("; AlarmPhone[i]=>"); Serial.print(AlarmPhone[i]); Serial.println('<'); if (val.indexOf(AlarmPhone[i]) > -1) { RingPhone = AlarmPhone[i]; Serial.println("Comparison OK: 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); }команда "phone" дает номера
при звонке с непрописанного номера
еще вариант: записывать 1:
if(val.indexOf(F("reset")) > -1) { // сброс ЕЕПРОМ for (int i = 0 ; i < 100 ; i++) { EEPROM.update(i, 1); }тогда в порт пишет номера так:
и номера нормально определяет, свой/чужой
Ну, в общем намудрили Вы ... просто не ищите пустыет строки и будет Вам счастье.
Вообщем вот что получилось.
из консоли все работает как надо, кроме аварийной температуры (пока не понял почему сыпятся сообщения, а не одно приходит).
смс не проверял, модем отказался работать, буду в следующие выходные допиливать.
команды консоли:
интересно что при команде tempon/off выполняется и команда temp. пока незнаю ка кэтого избежать.
вроде как-то так, и ни чего не забыл.
#include <EEPROM.h> #include <OneWire.h> #include<SoftwareSerial.h> SoftwareSerial mySerial(2, 3); OneWire ds(8); // датчик температуры подключен к 8 пину, подтяжка 4.7кОм на +. #define DOOR 4 // концевик двери. #define PIR 6 // датчик движения. #define GAS A0 // датчик дыма. #define BUZ 10 // сирена. #define GLed 11 // состояние датчиков. горит - открыты. #define BLed 12 // состояние системы, моргает - норма. // DOOR - если сработал, на входе "+" HIGH // PIR - если сработал, на входе "+" HIGH // GAS - если сработал, на входе "+" HIGH // BUZ - если "-" LOW, то горит. // GLed - если "-" LOW, то горит. // BLed - если "-" LOW, то горит. // RLED ------- // LED+ -------- RGB светодиод // GLED ------ // BLED ----- boolean Guard = 0; // Охрана: 1 - вкл, 0 - выкл. boolean AlarmRING = 1; // вызов: 1 - вкл, 0 - выкл. boolean SendSMS = 1; // отправка смс: 1 - вкл, 0 - выкл. boolean DOORon = 1; // концевик двери: 1 - вкл, 0 - выкл. boolean PIRon = 1; // датчик движения: 1 - вкл, 0 - выкл. boolean GASon = 1; // датчик дыма: 1 - вкл, 0 - выкл. boolean TEMPon = 0; // датчик темературы: 1 - вкл, 0 - выкл. boolean DOORFlag = 1; boolean PIRFlag = 1; boolean GASFlag = 1; boolean TEMPFlag = 0; boolean DOORState = LOW; // Состояние концевика двери. boolean PIRState = LOW; // Состояние датчика движения. boolean Firststart; // первый старт. uint8_t PIRcount = 3; // Кол-во сигналов PIR - 3 int i; int GASThres = 400; // предельная концентрация газа uint8_t ch = 0; char Bal[4] = ""; char TEMPmin[4]; // минимальный предел температуры char TEMPmax[4]; // максимальный предел температуры char Phone[12] = ""; byte Adress[5] = {25, 40, 55, 70, 85}; //занимаем ячейки для пяти номеров. String val = ""; String temperatura;// переменная для хранения текущей температуры String RingPhone = ""; // номер звонившего. String AlarmPhone[5]; // номера для постановки/снятии с охраны и отправки смс. String BalanceNumber; // баланс симкарты uint8_t PIRDetectCount = 0; uint16_t previousAlarmMillis = 0; uint8_t AlarmInterval = 10; // Секунд до отключения "тревожного" пина. boolean BLedState = HIGH; uint16_t previousMillis = 0; uint8_t interval = 100; /* EEPROM Data: № ячейки - значение; 0 - если записана не 1, то необходимо затереть часть памяти eeprom'a и восстановить стандартную конфигурацию. 1 - Guard = 0; // Охрана: 1 - вкл, 0 - выкл. 2 - AlarmRING = 1; // Звонок: 1 - вкл, 0 - выкл. 3 - SendSMS = 1; // отправка смс: 1 - вкл, 0 - выкл. 4 - DOORon = 1; // концевик двери: 1 - вкл, 0 - выкл. 5 - PIRon = 1; // датчик движения: 1 - вкл, 0 - выкл. 6 - GASon = 1; // датчик дыма: 1 - вкл, 0 - выкл. 7 - TEMPon = 0; // датчики аварийной температуры: 1 - вкл, 0 - выкл. 8 - PIRcount = 3; // количество срабатываний датчика = 3. 9 - Firststars = 1; // первый запуск = 1; 10 - граница минимальной температуры 15 - граница максимальной температуры */ void setup() { Serial.begin(9600); pinMode(DOOR, INPUT_PULLUP); pinMode(PIR, INPUT); pinMode(GAS, INPUT); pinMode(BUZ, OUTPUT); pinMode(GLed, OUTPUT); pinMode(BLed, OUTPUT); digitalWrite(BUZ, HIGH); digitalWrite(GLed, HIGH); InitModem(); eepromconfig(); digitalWrite(BLed, HIGH); } void loop() { Led(); AlarmPinOff(); Temperatura(); Detect(); 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(F("Master Ring OK!")); MasterRing(); } else { Serial.println(F("NO Master Ring!")); mySerial.println(F("ATH0")); // если не наш, сбрасываем его. } } else if (val.indexOf(F("+CMT:")) > -1) { //если обнаружен СМС MasterSMS(); 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"))); Serial.println(val); //sms(String(val), String("+" + RingPhone)); delay(1000); } 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(1, 0); // Guard охрана EEPROM.update(2, 1); // AlarmRING вызов EEPROM.update(3, 1); // SendSMS смс EEPROM.update(4, 1); // DOORon датчик движения EEPROM.update(5, 1); // PIRon датчик движения EEPROM.update(6, 1); // GASon датчик газа EEPROM.update(7, 0); // TEMPon датчик температуры EEPROM.update(8, 1); // PIRcount. 3 повторных срабатывания. EEPROM.update(9, 1); // Firststart EEPROM.update(10, 1); // EEPROM.update(15, 1); // EEPROM.update(0, 1); // digitalWrite(13, HIGH); for (i = 0; i < 5 ; i++) { EEPROM.put(Adress[i], Phone); // пишем массив символов Serial.println(F("EEPROM != 1/ RESET!")); } } if (EEPROM.read(0) == 1) { Guard = EEPROM.read(1); // AlarmRING = EEPROM.read(2); // SendSMS = EEPROM.read(3); // DOORon = EEPROM.read(4); // PIRon = EEPROM.read(5); // GASon = EEPROM.read(6); // TEMPon = EEPROM.read(7); // PIRcount = EEPROM.read(8); // Firststart = EEPROM.read(9); // EEPROM.get(10, TEMPmin); // EEPROM.get(15, TEMPmax); // Masterphone(); } } int CheckPhone() { /// === проверка телефона === /// if (Firststart == 0) { for (i = 0; i <= 4; i++) { if (val.indexOf(AlarmPhone[i]) > -1) { RingPhone = AlarmPhone[i]; // если телефон наш, запоминаем его. Serial.println(String(F("Ring: ")) + RingPhone); return 1; } } } else { int ind = val.indexOf("+CLIP:") + 8; String num = val.substring(ind, ind + 11); num.toCharArray(Phone, 12); Serial.println(String(F("[0]: ")) + Phone); EEPROM.put(25, Phone); EEPROM.update(9, 0); Firststart = 0; Serial.println(String(F("Firststart: ")) + Firststart); return 1; } return 0; } void Detect() { /// === чтение датчиков === /// DOORState = digitalRead(DOOR); PIRState = digitalRead(PIR); int Smoky = analogRead(GAS); if (DOORState == HIGH && DOORFlag == 0) { // датчик сработал DOORFlag = 1; delay(100); Serial.println("Dver' otkrita"); if (DOORon == 1) Alarm(); } if (DOORState == LOW && DOORFlag == 1) { // Датчик успокоился DOORFlag = 0; delay(100); } if (PIRState == HIGH) { // датчик сработал PIRDetectCount++; if (PIRDetectCount == PIRcount && PIRFlag == 0) { PIRDetectCount = 0; PIRFlag = 1; delay(100); Serial.println(String(F("Dvizenie! ")) + PIRcount); if (PIRon == 1) Alarm(); } } if (PIRState == LOW && PIRFlag == 1) { // Датчик успокоился PIRFlag = 0; delay(100); } if (Smoky > GASThres && GASFlag == 0) { // датчик сработал GASFlag = 1; delay(100); Serial.println(F("Srabotal datchik gasa! ")); if (GASon == 1) Alarm(); } if (Smoky < GASThres && GASFlag == 1) { // Датчик успокоился GASFlag = 0; delay(100); } /* if (TEMPon == 1 && TEMPFlag == 0) { // if (temperatura < TEMPmin || temperatura > TEMPmax) { TEMPFlag = 1; delay(100); Serial.println(String(F("Vnimanie, temperatura: ")) + temperatura + String(F("*C"))); Serial.println(String(F("TEMPmin: ")) + TEMPmin + String(F(". TEMPmax: ")) + TEMPmax); Alarm(); } } else if (temperatura > TEMPmin || temperatura < TEMPmax) { TEMPFlag = 0; delay(100); }*/ } void Alarm() { if (Guard == 1) { previousAlarmMillis = millis(); digitalWrite(BUZ, LOW); Serial.println(F("Alarmon")); for (int i = 0; i < 5; i++) { if (DOORFlag == 1 && SendSMS == 1) { //sms(String(F("Srabotal datchik dveri! ")), String("+" + String(AlarmPhone[i]))); } if (PIRFlag == 1 && SendSMS == 1) { //sms(String(F("Srabotal datchik dvizheniya! ")), String("+" + String(AlarmPhone[i]))); } if (GASFlag == 1 && SendSMS == 1) { //sms(String(F("Srabotal datchik gasa! ")), String("+" + String(AlarmPhone[i]))); } if (TEMPFlag == 1) { //sms(String(F("Temperatura vyshla za granicy! )), String("+" + String(AlarmPhone[i]))); } delay(1000); } if (AlarmRING == 1) { mySerial.println("ATD+" + String(AlarmPhone[0]) + ";"); delay(1000); } } } void Led() { /// === состояние светодиодов === /// if (Guard == 0) { digitalWrite(BLed, HIGH); if (DOORFlag == 1 || PIRFlag == 1 || GASFlag == 1) { digitalWrite(GLed, LOW); } if (DOORFlag == 0 || PIRFlag == 0 || GASFlag == 0) { digitalWrite(GLed, HIGH); } } if (Guard == 1) { uint16_t currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if (currentMillis - previousMillis > interval) { // сохраняем время последнего переключения previousMillis = currentMillis; // если светодиод не горит, то зажигаем, и наоборот if (BLedState == HIGH) BLedState = LOW; else BLedState = HIGH; digitalWrite(BLed, BLedState); } } } void MasterRing() { if (Guard == 1) GuardOff(); else if (Guard == 0) GuardOn(); } void GuardOff() { Guard = 0; EEPROM.update(1, Guard); delay(1000); Serial.println(String(F("System -> off. Ring: ")) + RingPhone); for (i = 0; i < 5; i++) { if (RingPhone == String(AlarmPhone[i])); delay(1000); //sms(String(F("System -> off. Ring: ")), String("+" + RingPhone)); delay(1000); } } void GuardOn() { Guard = 1; EEPROM.update(1, Guard); delay(1000); Serial.println(String(F("System -> on. Ring: ")) + RingPhone); for (i = 0; i < 5; i++) { if (RingPhone == String(AlarmPhone[i])); delay(1000); //sms(String(F("System -> on. Ring: ")), String("+" + RingPhone)); delay(1000); } } void AlarmPinOff() { uint16_t currentAlarmMillis = millis(); if (currentAlarmMillis - previousAlarmMillis > AlarmInterval * 1000) { digitalWrite(BUZ, HIGH); } } void ConsolePrint() { val.toLowerCase(); if (val.indexOf(F("master:")) > -1) { // добавление мастер-номера master(val.substring(19, 20).toInt(), val.substring(7, 18)); // sms типа: " master:79111386232 1 " - номер + ячейка, куда записать номер } if (val.indexOf(F("balance:")) > -1) { // добавление номера баланса balnum(val.substring(8, 13)); // sms типа: " balance:100 " - номер } if (val.indexOf(F("phone")) > -1) { // проверка мастер-номеров Serial.println(F("Phone:")); Masterphone(); } if (val.indexOf(F("clear")) > -1) { // сброс телефонов for (i = 0 ; i >= 20 , i < 100 ; i++) { EEPROM.update(i, 1); } Serial.println(F("Clear all phone!")); Masterphone(); } if (val.indexOf(F("mint:")) > -1) { // минимальный предел температуры String mint(val.substring(5, 11)); // sms типа: " mint:8 " - mint.toCharArray(TEMPmin, 4); Serial.println(String(F("MinT: ")) + TEMPmin); EEPROM.put(10, TEMPmin); // записываем массив в EEPROM } if (val.indexOf(F("maxt:")) > -1) { // максимальный предел температуры String maxt(val.substring(5, 11)); // sms типа: " maxt:105 " - maxt.toCharArray(TEMPmax, 4); Serial.println(String(F("MaxT: ")) + TEMPmax); EEPROM.put(15, TEMPmax); // записываем массив в EEPROM } if (val.indexOf(F("reset")) > -1) { // сброс ЕЕПРОМ // for (i = 0; i < 100 ; i++) { EEPROM.update(0, 0); // } Serial.println(F("Reset System!")); } if (val.indexOf(F("info")) > -1) { // инфо о состоянии системы delay(1000); Guard = EEPROM.read(1); // AlarmRING = EEPROM.read(2); // SendSMS = EEPROM.read(3); // DOORon = EEPROM.read(4); // PIRon = EEPROM.read(5); // GASon = EEPROM.read(6); // TEMPon = EEPROM.read(7); // PIRcount = EEPROM.read(8); // Serial.println(String(F("Guard: ")) + Guard + String(F(". RING: ")) + AlarmRING + String(F(". SMS: ")) + SendSMS); Serial.println(String(F("DOOR: ")) + DOORon + String(F(". PIR: ")) + PIRon + String(F(". TEMP: ")) + TEMPon + String(F(". GAS: ")) + GASon); delay(1000); } if (val.indexOf(F("temp")) > -1) { // запрос баланса Temperatura(); delay(1000); EEPROM.get(10, TEMPmin); // EEPROM.get(15, TEMPmax); // Serial.println(String(F("Temperatura ")) + temperatura + String(F("*C"))); Serial.println(String(F("TEMPmin ")) + TEMPmin + String(F("; TEMPmax ")) + TEMPmax); delay(1000); } if (val.indexOf(F("money")) > -1) { // запрос баланса delay(1000); balance(); delay(1000); } if (val.indexOf(F("guardon")) > -1) { // вкл сигнализации delay(1000); GuardOn(); } if (val.indexOf(F("guardoff")) > -1) { // откл сигнализации delay(1000); GuardOff(); } if (val.indexOf(F("ringon")) > -1) { // вкл вызов при сработке delay(1000); AlarmRING = 1; EEPROM.update(2, AlarmRING); Serial.println(F("AlarmRing -> on")); delay(1000); } if (val.indexOf(F("ringoff")) > -1) { // выкл вызов при сработке delay(1000); AlarmRING = 0; EEPROM.update(2, AlarmRING); Serial.println(F("AlarmRing -> off")); delay(1000); } if (val.indexOf(F("smson")) > -1) { // вкл смс при сработке delay(1000); SendSMS = 1; EEPROM.update(3, SendSMS); Serial.println(F("SendSMS -> on")); delay(1000); } if (val.indexOf(F("smsoff")) > -1) { // выкл смс при сработке delay(1000); SendSMS = 0; EEPROM.update(3, SendSMS); Serial.println(F("SendSMS -> off")); delay(1000); } if (val.indexOf(F("dooron")) > -1) { // вкл датчик движения delay(1000); DOORon = 1; EEPROM.update(4, DOORon); Serial.println(F("DOOR -> on")); delay(1000); } if (val.indexOf(F("dooroff")) > -1) { // выкл датчик движения delay(1000); DOORon = 0; EEPROM.update(4, DOORon); Serial.println(F("DOOR -> off")); delay(1000); } if (val.indexOf(F("piron")) > -1) { // вкл датчик движения delay(1000); PIRon = 1; EEPROM.update(5, PIRon); Serial.println(F("PIR -> on")); delay(1000); } if (val.indexOf(F("piroff")) > -1) { // выкл датчик движения delay(1000); PIRon = 0; EEPROM.update(5, PIRon); Serial.println(F("PIR -> off")); delay(1000); } if (val.indexOf(F("gason")) > -1) { // вкл датчика газа delay(1000); GASon = 1; EEPROM.update(6, GASon); Serial.println(F("GAS -> on")); delay(1000); } if (val.indexOf(F("gasoff")) > -1) { // выкл датчика газа delay(1000); GASon = 0; EEPROM.update(6, GASon); Serial.println(F("GAS -> off")); delay(1000); } if ((val.indexOf(F("tempon")) > -1)) { // вкл аварийной темературы delay(1000); TEMPon = 1; EEPROM.update(7, TEMPon); Serial.println(F("TEMP -> on")); delay(1000); } if (val.indexOf(F("tempon")) > -1) { // выкл аварийной темературы delay(1000); TEMPon = 1; EEPROM.update(7, TEMPon); Serial.println(F("TEMP -> on")); delay(1000); } if (val.indexOf(F("tempoff")) > -1) { // выкл аварийной темературы delay(1000); TEMPon = 0; EEPROM.update(7, TEMPon); Serial.println(F("TEMP -> off")); delay(1000); } } void MasterSMS() { /// === мастер смс === /// val.toLowerCase(); if (val.indexOf(F("master:")) > -1) { // добавление мастер-номера master(val.substring(19, 20).toInt(), val.substring(7, 18)); // sms типа: " master:79111386232 1 " - номер + ячейка, куда записать номер } if (val.indexOf(F("balance:")) > -1) { // добавление номера баланса balnum(val.substring(8, 13)); // sms типа: " balance:100 " - номер } if (val.indexOf(F("phone")) > -1) { // проверка мастер-номеров Serial.println(F("Phone:")); Masterphone(); } if (val.indexOf(F("clear")) > -1) { // сброс телефонов for (i = 0 ; i >= 20 , i < 100 ; i++) { EEPROM.update(i, 1); } Serial.println(F("Clear all phone!")); Masterphone(); } if (val.indexOf(F("mint:")) > -1) { // минимальный предел температуры String mint(val.substring(5, 11)); // sms типа: " mint:8 " - mint.toCharArray(TEMPmin, 4); Serial.println(String(F("MinT: ")) + TEMPmin); EEPROM.put(10, TEMPmin); // записываем массив в EEPROM } if (val.indexOf(F("maxt:")) > -1) { // максимальный предел температуры String maxt(val.substring(5, 11)); // sms типа: " maxt:105 " - maxt.toCharArray(TEMPmax, 4); Serial.println(String(F("MaxT: ")) + TEMPmax); EEPROM.put(15, TEMPmax); // записываем массив в EEPROM } if (val.indexOf(F("reset")) > -1) { // сброс ЕЕПРОМ // for (i = 0; i < 100 ; i++) { EEPROM.update(0, 0); // } Serial.println(F("Reset System!")); } if (val.indexOf(F("info")) > -1) { // инфо о состоянии системы delay(1000); Guard = EEPROM.read(1); // AlarmRING = EEPROM.read(2); // SendSMS = EEPROM.read(3); // DOORon = EEPROM.read(4); // PIRon = EEPROM.read(5); // GASon = EEPROM.read(6); // TEMPon = EEPROM.read(7); // PIRcount = EEPROM.read(8); // Serial.println(String(F("Guard: ")) + Guard + String(F(". RING: ")) + AlarmRING + String(F(". SMS: ")) + SendSMS); Serial.println(String(F("DOOR: ")) + DOORon + String(F(". PIR: ")) + PIRon + String(F(". TEMP: ")) + TEMPon + String(F(". GAS: ")) + GASon); delay(1000); } if (val.indexOf(F("temp")) > -1) { // запрос баланса Temperatura(); delay(1000); EEPROM.get(10, TEMPmin); // EEPROM.get(15, TEMPmax); // Serial.println(String(F("Temperatura ")) + temperatura + String(F("*C"))); Serial.println(String(F("TEMPmin ")) + TEMPmin + String(F("; TEMPmax ")) + TEMPmax); delay(1000); } if (val.indexOf(F("money")) > -1) { // запрос баланса delay(1000); balance(); delay(1000); } if (val.indexOf(F("guardon")) > -1) { // вкл сигнализации delay(1000); GuardOn(); } if (val.indexOf(F("guardoff")) > -1) { // откл сигнализации delay(1000); GuardOff(); } if (val.indexOf(F("ringon")) > -1) { // вкл вызов при сработке delay(1000); AlarmRING = 1; EEPROM.update(2, AlarmRING); Serial.println(F("AlarmRing -> on")); delay(1000); } if (val.indexOf(F("ringoff")) > -1) { // выкл вызов при сработке delay(1000); AlarmRING = 0; EEPROM.update(2, AlarmRING); Serial.println(F("AlarmRing -> off")); delay(1000); } if (val.indexOf(F("smson")) > -1) { // вкл смс при сработке delay(1000); SendSMS = 1; EEPROM.update(3, SendSMS); Serial.println(F("SendSMS -> on")); delay(1000); } if (val.indexOf(F("smsoff")) > -1) { // выкл смс при сработке delay(1000); SendSMS = 0; EEPROM.update(3, SendSMS); Serial.println(F("SendSMS -> off")); delay(1000); } if (val.indexOf(F("dooron")) > -1) { // вкл датчик движения delay(1000); DOORon = 1; EEPROM.update(4, DOORon); Serial.println(F("DOOR -> on")); delay(1000); } if (val.indexOf(F("dooroff")) > -1) { // выкл датчик движения delay(1000); DOORon = 0; EEPROM.update(4, DOORon); Serial.println(F("DOOR -> off")); delay(1000); } if (val.indexOf(F("piron")) > -1) { // вкл датчик движения delay(1000); PIRon = 1; EEPROM.update(5, PIRon); Serial.println(F("PIR -> on")); delay(1000); } if (val.indexOf(F("piroff")) > -1) { // выкл датчик движения delay(1000); PIRon = 0; EEPROM.update(5, PIRon); Serial.println(F("PIR -> off")); delay(1000); } if (val.indexOf(F("gason")) > -1) { // вкл датчика газа delay(1000); GASon = 1; EEPROM.update(6, GASon); Serial.println(F("GAS -> on")); delay(1000); } if (val.indexOf(F("gasoff")) > -1) { // выкл датчика газа delay(1000); GASon = 0; EEPROM.update(6, GASon); Serial.println(F("GAS -> off")); delay(1000); } if ((val.indexOf(F("tempon")) > -1)) { // вкл аварийной темературы delay(1000); TEMPon = 1; EEPROM.update(7, TEMPon); Serial.println(F("TEMP -> on")); delay(1000); } if (val.indexOf(F("tempon")) > -1) { // выкл аварийной темературы delay(1000); TEMPon = 1; EEPROM.update(7, TEMPon); Serial.println(F("TEMP -> on")); delay(1000); } if (val.indexOf(F("tempoff")) > -1) { // выкл аварийной темературы delay(1000); TEMPon = 0; EEPROM.update(7, TEMPon); Serial.println(F("TEMP -> off")); delay(1000); } mySerial.println("AT+CMGD=1,4"); // очищаем смс } void balance() { /// === проверка баланса сим-карты === /// EEPROM.get(21, Bal); // считываем массив символов mySerial.println("AT+CUSD=1"); delay(200); mySerial.println(String("ATD#") + Bal + String("#")); delay(200); } void Masterphone() { /// === чтение мастер-номеров === /// for (i = 0; i <= 4 ; i++) { EEPROM.get(Adress[i], Phone); // считываем массив символов AlarmPhone[i] = Phone; Serial.println(String(F("Phone [")) + i + String(F("]: ")) + AlarmPhone[i]); } EEPROM.get(21, Bal); // считываем массив символов Serial.println(String(F("Balance []: ")) + Bal); Firststart = EEPROM.read(8); // Serial.println(String(F("Firststart: ")) + Firststart); } 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 if (i == 0) { EEPROM.update(8, 0); Firststart = 0; Serial.println(String(F("Firststart: ")) + Firststart); } num = ""; } else Serial.println(F("MAX number [4]!")); // у меня 5 номеров максимум } int balnum (String num) { /// === добавляем номер баланса === /// num.toCharArray(Bal, 4); Serial.println(String(F("balance []: ")) + Bal); EEPROM.put(21, Bal); // записываем массив в EEPROM num = ""; } void Temperatura() { /// === измеряем температуру === /// 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]; temperatura = Temp >> 4; } 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 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); }пожелания и обоснованная критика (потому как я не программист, а только учусь)приветствуются!
народ в чем может быть косяк
G590 модуль подключаю к TTL конвертору at команды принимает отправляет
подключаю к любой ардуинке UNO, Nano к портам tx/rx SoftwareSerial mySerial(0, 1); // RX, TX
ни чего не происходит, хоть местами меняй провода
задаю SoftwareSerial mySerial(2, 3); // RX, TX работает на ура
что за трабла с этими D0, D1 они специально для этого и созданы, ладно бы на одной плате, так на всех одинакого?
нано? вы апаратную часть нано понимаете? отключите от нее нафик тогда ее собственный конвертер, он мешает.
уно тоже разные бывают, бывает с резисторами между процем и конвертером который на борту, а бывает и нет..
ваш вариант - мини про.. там должно работать, но оотключать свой внешний конвертер, или тольо рх часть использовать чтобы посмотреть что там отвечает например.
теперь ясно, спасибо
Подскажите , можно ли подключить к этому проекту mp3 модуль ? Просто он тоже подключается по serial . Получится сделать два SowtwareSerial`a ?
все можно, только нужно ли?? это древний модуль 590й, к тому же много брака, 50% брака, купите чтото посовременее, где уже есть мр проигрыватель.
модуль умеет показывать % от остатка аккумулятора:
void CBC() { val = ""; delay(100); // очищаем буфер val Ubat = ""; delay(100); Serial.println("cbc"); delay(50); gsm.println(F("AT+cbc")); delay(50); gsmread(); Serial.println(val); delay(50); //at+cbc //+CBC: 0,70 Ubat = val.substring(val.indexOf(F("+CBC:"))+8,val.indexOf(F("+CBC:"))+10); // для 590х Serial.println(Ubat); delay(50); val = ""; } void gsmread() { if (gsm.available()) { //если GSM модуль что-то послал нам, то delay(5); while (gsm.available()) { ch = gsm.read(); val += char(ch); delay(1); }}}Просто хотел , чтобы при срабатывании датчика движения система предупреждала нарушителя о том , что дом под охраной .
для этого можно встривать в сам датчик, или опять же почитать что советую купить, изучите для начала маттчасть.
Я нашел только 3 модуля 590й , sim800 , sim900 . С встроенным mp3 не нашел . Вы имели ввиду встроить мп3 модуль в сам датчик движения ?
учите матчасть того чтонашли... ине спешите шаманить с бубном как многие здесь поступают.
Почему после открытия двери сигнал выключается?
тоесть сломают замок, войдут и тут бонус- сигнализациия выключилась. Может оставить сирену вкл. секунд на 30
помоему я делал сирену установленное время и снимает с сигнализации, при закрытии двери становится на охрану.
столкнулся с проблемой
есть проект поливалки: часы ds1307, модуль m590 + обвязка
так то все работает, но на заключительной стадии, хотел приделать чтобы при посылке смс вида on73030 (это типо таймер включения 7:30:30) , каждые данные часы минуты секунды уходили в eeprom, каждый выделять substring, так часы имеют byte а данный у нас string
подскажите как их подружить?!
сконвертировать байт в стринг - есть куча примеров..
я видел только примеры байты --> стринг конвертировали, а стринг --> байт по сути не видел, только такой нашел
char CharArrayVar[8] = {1,0,1,1,0,0,1,1}; char CharVar = 0; for(int i = 0; i<8; i++){ CharVar |= lCharArrayVar[i] << (7-i); } PORTD = CharVar;выложите программу или кусок что нужно сделать, может там по факту нужно шагать иным путем.
Сильно не пинать, только учусь строка 382, например при посылке смс вида clockon73030 надо чтобы 7 часов передавалось переменной setHorClockOn, 30 --> setMinClockOn, 30 --> seSecClockOn но эти переменные имеют Byte , а 7 30 30 string
#include <EEPROM.h> #include <Wire.h> #include <SoftwareSerial.h> #include <iarduino_RTC.h> #include <LiquidCrystal_I2C.h> iarduino_RTC time(RTC_DS1307); //LiquidCrystal_I2C lcd(0x3f,20,4); //2004 LiquidCrystal_I2C lcd(0x27,16,2); SoftwareSerial mySerial(7, 8); // RX, TX78 String val = ""; String level_w = ""; String timer = ""; int nedela[4][7] = {{0, 1, 2, 3, 4, 5, 6 }, {1, 1, 1, 1, 1, 3, 5}, {1, 1, 1, 1, 1, 1, 5}, {1, 1, 1, 2, 3, 4, 5}}; int i; #define BLINK_INTERVAL 250UL // время для проверки уровня воды в баке //LiquidCrystal lcd(8, 9, 4, 5, 6, 7); String master_phone = "+79222222222"; int K = 1; int P = 0; byte setSecClockOn; // byte setMinClockOn; // byte setHorClockOn; byte setSecClockOff; byte setMinClockOff; // byte setHorClockOff; byte settimer; byte setdate; const int sensor1 = 2; // уровень бака 1 верх2 const int sensor2 = 3; // уровень бака 2 низ3 int BL = 6; // шим индикатора const byte outPin = 4; // выход на реле клапана const byte outLedRelay = 5; // выход на реле наполнение бака const int button_analog = A2; int valuebutton = 0; byte valA; //переменная времени long previousMillisA = 0; byte valX; //переменная времени long previousMillisX = 0; byte val_led; //переменная времени long previousMillis_led = 0; int on_led = 1; int timer_on = 25; //время опроса датчика сек int timer_ojidan = 18; //время на ожидание между включениями int time_led = 10; //время на гашение экрана byte kapla[8] = {0b00100,0b00100,0b01110,0b01110,0b11111,0b11111,0b01110,0b00100}; byte lampa[8] = {0b01110,0b11111,0b11111,0b11111,0b01110,0b01110,0b00000,0b00100}; byte clocka[8] = {B00100,B01110,B00100,B11111,B10011,B10101,B10001,B11111}; byte bak[8] = {B10001,B10001,B10001,B11111,B10001,B11111,B11111,B11111}; byte key(){ //// для кнопок ЛСДшилда valuebutton = analogRead(button_analog); if (valuebutton > 715 && valuebutton < 740) return 1; //запоминаем значение кнопки else if (valuebutton > 620 && valuebutton < 650) return 2; else if (valuebutton > 450 && valuebutton < 480) return 4; else if (valuebutton > 760 && valuebutton < 800) return 3; else if (valuebutton >= 0 && valuebutton < 100) return 5; else return 0; } /////////// часы .. void setClock(){ // установка часов byte pos = 1; lcd.clear(); lcd.blink(); while(key() != 1){ // крутим цикл byte KEY = key(); // читаем состояние кнопок delay(200); lcd.setCursor(1, 1); lcd.print("set to save"); lcd.setCursor(0, 0); // выводим инфу if (time.Hours < 10) lcd.print("0"); lcd.print(time.Hours); lcd.print(":"); if (time.minutes < 10) lcd.print("0"); lcd.print(time.minutes); lcd.print(" "); if (time.day < 10) lcd.print("0"); lcd.print(time.day); lcd.print("/"); if (time.month < 10) lcd.print("0"); lcd.print(time.month); lcd.print("/"); lcd.print(time.year); lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции if (KEY == 5 && pos < 13) pos += 3; // крутим позицию else if (KEY == 2 && pos > 1) pos -= 3; else if (pos == 1 && KEY == 3) time.Hours++ ; // крутим значения else if (pos == 1 && KEY == 4) time.Hours--; else if (pos == 4 && KEY == 3) time.minutes++; else if (pos == 4 && KEY == 4) time.minutes--; else if (pos == 7 && KEY == 3) time.day++; else if (pos == 7 && KEY == 4) time.day--; else if (pos == 10 && KEY == 3) time.month++; else if (pos == 10 && KEY == 4) time.month--; else if (pos == 13 && KEY == 3) time.year++; else if (pos == 13 && KEY == 4) time.year--; if (time.Hours > 23) time.Hours = 0; else if (time.minutes > 59) time.minutes = 0; else if (time.day > 31) time.day = 0; else if (time.month > 12) time.month = 1; else if (time.year > 99) time.year = 0; }// конец цикла time.settime(-1, time.minutes, time.Hours, time.day, time.month, time.year, -1); lcd.noBlink(); lcd.clear(); lcd.print(" Saved"); delay(1500); }/// void setOnOff(){ delay(200); byte pos = 6; lcd.clear(); lcd.blink(); while(key() != 1){ // крутим цикл byte KEY = key(); // читаем состояние кнопок delay(200); lcd.setCursor(0, 0); // выводим инфу lcd.print("On: "); if (setHorClockOn < 10) lcd.print("0"); lcd.print(setHorClockOn); lcd.print(":"); if (setMinClockOn < 10) lcd.print("0"); lcd.print(setMinClockOn); lcd.print(":"); if (setSecClockOn < 10) lcd.print("0"); lcd.print(setSecClockOn); // просто вторая строка начало lcd.setCursor(0, 1); lcd.print("Off: "); if (setHorClockOff < 10) lcd.print("0"); lcd.print(setHorClockOff); lcd.print(":"); if (setMinClockOff < 10) lcd.print("0"); lcd.print(setMinClockOff); lcd.print(":"); if (setSecClockOff < 10) lcd.print("0"); lcd.print(setSecClockOff); // просто вторая строка конец lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции if (KEY == 5 && pos < 12) pos += 3; // крутим позицию else if (KEY == 2 && pos > 6) pos -= 3; else if (pos == 6 && KEY == 3) setHorClockOn++; // крутим значения else if (pos == 6 && KEY == 4) setHorClockOn--; else if (pos == 9 && KEY == 3) setMinClockOn++; else if (pos == 9 && KEY == 4) setMinClockOn--; else if (pos == 12 && KEY == 3) setSecClockOn++; else if (pos == 12 && KEY == 4) setSecClockOn--; if (setHorClockOn > 23) setHorClockOn = 0; else if (setMinClockOn > 59) setMinClockOn = 0; else if (setSecClockOn > 59) setSecClockOn = 0; } delay(700); on_sec(); } void on_sec(){ //цикл второй строки для выключения таймера byte pos = 6; while(key() != 1){ // крутим цикл byte KEY = key(); // читаем состояние кнопок delay(200); lcd.setCursor(0, 1); // выводим инфу lcd.print("Off: "); if (setHorClockOff < 10) lcd.print("0"); lcd.print(setHorClockOff); lcd.print(":"); if (setMinClockOff < 10) lcd.print("0"); lcd.print(setMinClockOff); lcd.print(":"); if (setSecClockOff < 10) lcd.print("0"); lcd.print(setSecClockOff); lcd.setCursor(pos, 1); // устанавливаем курсор согласно позиции if (KEY == 5 && pos < 12) pos += 3; // крутим позицию else if (KEY == 2 && pos > 6) pos -= 3; else if (pos == 6 && KEY == 3) setHorClockOff++; else if (pos == 6 && KEY == 4) setHorClockOff--; else if (pos == 9 && KEY == 3) setMinClockOff++; else if (pos == 9 && KEY == 4) setMinClockOff--; else if (pos == 12 && KEY == 3) setSecClockOff++; else if (pos == 12 && KEY == 4) setSecClockOff--; if (setHorClockOff > 23) setHorClockOff = 0; else if (setMinClockOff > 59) setMinClockOff = 0; else if (setSecClockOff > 59) setSecClockOff = 0; }// конец цикла lcd.noBlink(); lcd.clear(); EEPROM.write(0, setMinClockOn); EEPROM.write(1, setHorClockOn); EEPROM.write(3, setMinClockOff); EEPROM.write(4, setHorClockOff); EEPROM.write(5, setSecClockOn); EEPROM.write(6, setSecClockOff); lcd.print(" Saved"); delay(1500); }/// void constant (){ delay(200); byte pos = 7; lcd.clear(); lcd.blink(); while(key() != 1){ // крутим цикл byte KEY = key(); // читаем состояние кнопок delay(200); lcd.setCursor(0, 0); lcd.print("timer= "); lcd.print(settimer); lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции if (pos == 7 && KEY == 3) settimer++; else if (pos == 7 && KEY == 4) settimer--; if (settimer > 1) settimer = 1; } lcd.noBlink(); lcd.clear(); EEPROM.write(7, settimer); lcd.print(" Saved"); delay(1500); } void menu(){ delay(200); lcd.clear(); char menuTxt[3][14] = {"set ON/OFF >>", "set clock >>", "Constant >>"}; byte pos = 0; while(key() != 1){ delay(200); byte KEY = key(); lcd.setCursor(0, 0); lcd.print(pos+1); lcd.print("."); lcd.print(menuTxt[pos]); if (KEY == 3 && pos != 0) pos--; else if (KEY == 4 && pos < 2) pos++; if (KEY == 5 && pos == 0) setOnOff(); else if (KEY == 5 && pos == 1) setClock(); else if (KEY == 5 && pos == 2) constant(); } lcd.clear(); } void level_water(){ if (digitalRead(sensor1) == HIGH && digitalRead(sensor2) == HIGH){ level_w = String("OFF"); digitalWrite(outLedRelay, HIGH);} if (digitalRead(sensor1) == LOW && digitalRead(sensor2) == HIGH) {level_w = String("3/4");} if (digitalRead(sensor1) == LOW && digitalRead(sensor2) == LOW || digitalRead(outLedRelay) == LOW) {level_w = String(" ON"); digitalWrite(outLedRelay, LOW);} if (digitalRead(sensor1) == HIGH && digitalRead(sensor2) == LOW) {level_w = String("ERR"); digitalWrite(outLedRelay, HIGH);} } void blinkind(unsigned long interval ) { //индикация static unsigned long prevTime = 0; // if (millis() - prevTime > interval) { prevTime = millis(); // }} void on_led_off() //подсветка дисплея { if (key() > 0){on_led = 1;} if (on_led == 1) { lcd.backlight();// Включаем подсветку дисплея if (millis() - previousMillis_led > 1000) { previousMillis_led = millis(); val_led++; if (key() > 0){val_led = 0;} } if (val_led >= time_led) { val_led = 0; on_led = 0; lcd.noBacklight();// Включаем подсветку дисплея } } } void phone() //телефон { if(mySerial.available()) //если модуль что-то послал { char ch = ' '; String val = ""; while(mySerial.available()) { ch = mySerial.read(); val += char(ch); //собираем принятые символы в строку delay(30); } Serial.print("Neo send> "); Serial.println(val); if (val.indexOf("+PBREADY") > -1)InitModem(); // если модем перезапустился запускаем инициализацию. if (val.indexOf(F("RING")) > -1) { // если обнаружен вызов. if (val.indexOf(master_phone) > -1) { // проверяем номер, если наш. mySerial.println(F("ATH0")); // сбрасываем вызов. Serial.println(F("Master Ring OK!")); } else { Serial.println(F("NO Master Ring!")); mySerial.println(F("ATH0")); // если не наш, сбрасываем его. } } if (val.indexOf(F("+CMT:")) > -1) { //смс val.toLowerCase(); if (val.indexOf(F("info")) > -1) { // инфо о состоянии системы delay(3000); sms(String("Bak: ") + level_w + String(F("\n")) + String("Timer: ") + timer + String(F("\n")) + String("ON: ") + setHorClockOn + String(":") + setMinClockOn + String(":") + setSecClockOn + String(F("\n")) + String("OFF: ") + setHorClockOff + String(":") + setMinClockOff + String(":") + setSecClockOff + String(F("\n")) + String("nedela: ") + setdate, String(master_phone)); } if (val.indexOf(F("timeron")) > -1) { // включение таймера delay(1000); Serial.println(F("timer -> on")); settimer = 1; EEPROM.update(7, settimer); } if (val.indexOf(F("timeroff")) > -1) { // выключение таймера delay(1000); Serial.println(F("timer -> off")); settimer = 0; EEPROM.update(7, settimer); } if (val.indexOf(F("date0")) > -1) { // каждый день delay(1000); Serial.println(F("date -> date")); setdate = 0; EEPROM.write(8, setdate); } if (val.indexOf(F("date1")) > -1) { // пон, сп, пятн delay(1000); Serial.println(F("date -> date")); setdate = 1; EEPROM.write(8, setdate); } if (val.indexOf(F("date2")) > -1) { // пон, пят delay(1000); Serial.println(F("date -> date")); setdate = 2; EEPROM.write(8, setdate); } if (val.indexOf(F("date3")) > -1) { // будни delay(1000); Serial.println(F("date -> date")); setdate = 3; EEPROM.write(8, setdate); } if (val.indexOf(F("clockon")) > -1) { // редактирование время включения delay(1000); } } } } void sms(String text, String phone) // отправка СМС { Serial.println("Start SMS send"); mySerial.println("AT+CMGS=\"" + phone + "\""); delay(500); mySerial.print(text); delay(500); mySerial.print((char)26); delay(500); Serial.println("SMS send OK"); delay(2000); } void InitModem() { /// === инициализация модема === /// delay(2000); mySerial.println("AT+CLIP=1"); delay(500); mySerial.println("AT+CMGF=1"); delay(500); mySerial.println("AT+CSCS=\"GSM\""); delay(500); mySerial.println("AT+CNMI=2,2,0,0,0"); // 0,0,0 delay(500); mySerial.println("AT+CMGD=1,4"); delay(500); } void setup(){ delay(2000); Wire.begin(); time.begin(); lcd.init(); // initialize the lcd lcd.begin(16, 2); analogWrite(BL, 50); Serial.begin(9600); mySerial.begin(9600); InitModem(); lcd.clear(); lcd.createChar(1, kapla); lcd.createChar(2, lampa); lcd.createChar(3, clocka); lcd.createChar(4, bak); pinMode(outPin, OUTPUT); digitalWrite(outPin, HIGH); pinMode(outLedRelay, OUTPUT); digitalWrite(outLedRelay, HIGH); setMinClockOn = EEPROM.read(0); setHorClockOn = EEPROM.read(1); setSecClockOn = EEPROM.read(5); setMinClockOff = EEPROM.read(3); setHorClockOff = EEPROM.read(4); setSecClockOff = EEPROM.read(6); settimer = EEPROM.read(7); setdate = EEPROM.read(8); } void loop() { on_led_off(); phone(); level_water(); blinkind(BLINK_INTERVAL); lcd.setCursor(14, 1); lcd.print(setdate); if (settimer == 0) timer = String("OFF"); else timer = String("ON "); // обработка кнопок if (key() == 1) menu(); // если нажата селект else if (key() == 3) digitalWrite(outPin, LOW); else if (key() == 4) digitalWrite(outPin, HIGH); else if (key() == 2) digitalWrite(outLedRelay, LOW); else if (key() == 5) digitalWrite(outLedRelay, HIGH); // сравниваем время и управляем выходом// if (settimer == 1) { for (i = 0; i < 7; i++) { if (nedela[setdate][i] == time.weekday){ if (setMinClockOn == time.minutes && setHorClockOn == time.Hours && setSecClockOn == time.seconds) digitalWrite(outPin, LOW); }}} if (setMinClockOff == time.minutes && setHorClockOff == time.Hours && setSecClockOff == time.seconds) digitalWrite(outPin, HIGH); lcd.setCursor(0, 0); lcd.print("\3 "); lcd.setCursor(2, 0); lcd.print(timer); lcd.setCursor(0, 1); lcd.print("\4"); lcd.setCursor(2, 1); lcd.print(level_w); lcd.setCursor(8, 0); lcd.print(time.gettime("H:i:s")); lcd.setCursor(8, 1); lcd.print("\1"); if (digitalRead(outPin)) lcd.print(" X"); else lcd.print("ON"); delay(50); // нужно для нармальной работы кнопок }у меня вопрос к pasha413 смог ли опробывать с модемом свой пример?! В плане приема и отправки смс с телефона на модуль?
Из 165 поста все проверял, у меня работает. Установил на даче, но более простой вариант (по быстрому), т.к. хочу подготовить норм вариант, типа коммерческого.
я почему спрашиваю
через
if(mySerial.available()) {// есть данные от GSM модуля.107delay(200);// выждем, чтобы строка успела попасть в порт целиком.108while(mySerial.available()) {// сохраняем входную строку в переменную val.109ch = mySerial.read();110val +=char(ch);111delay(50);112}тоже все работало, а именно звонки принимал, смс, делал что задуманно по ним, работал довольно быстро, но потом столкнулся с проблемой надо было из смс выделить число, и эта связка допустим как у вас
if(val.indexOf(F("maxt:")) > -1) {// максимальный предел температуры554String maxt(val.substring(5, 11));не понимала что идет за словом maxt: , он не видел почему то нужной строки с текстом смс
пришлось перейти на
char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { currStr.toLowerCase(); if (currStr.indexOf(F("poliv")) > -1) { flag = 1; currStr = currStr.substring(5, 8); timer_on = currStr.toInt(); }так стал работать заметнее медленее, но видит перевод строки и тем самым нужные мне строчки
Сейчас не расскажу, в отпуске, все хозяйство на работе...через 2 недели буду проверять снова тогда
самое что интересное, если через сериал порт отправляешь с компа то все команды отрабатывает и все переменные видит, а вот с смс так не получилось
Всем привет :)
Вот это можно выкинуть, всё равно после того как отвалится модем SoftwareSerial тоже отвалится напрочь, и поможет только перезагрузка ардуины.
if (val.indexOf(F("+PBREADY")) > -1) InitModem(); // если модем перезапустился запускаем инициализацию.интересно что при команде tempon/off выполняется и команда temp. пока незнаю ка кэтого избежать
Ничего удивительного, ведь в tempon и tempoff присутствует подстрока temp. Переименуйте команду "temp" в, например, "showtemp".
rindon/off
Может быть ring?
пожелания и обоснованная критика (потому как я не программист, а только учусь)приветствуются!
Уходите от массивов, избегайте дублирования, смотрите в сторону структур. Через некоторое время памяти станет очень нехватать.
А можно на примере указать как уйти к структурам, если не сложно.
На "майску" я Вам скидывал уже ссылки. Про структуры тут почитать radioprog.ru/post/117. Смотрите раздел "put()".
Спасибо
smesharik, извините что так долго небыло, отпуск)))
нашел косяк в коде, из-за которого не распознавались смс.
надо изменить строчки в коде:
void MasterSms() { if (val.indexOf(F("balance:")) > -1) { // добавление номера баланса int bal(val.indexOf(F("balance:"))); balnum(val.substring(bal + 8, bal + 11)); ///// sms типа: " balance:100 " - номер } if (val.indexOf(F("master:")) > -1) { // добавление мастер-номера int tel(val.indexOf(F("master:"))); master(val.substring(tel + 19, tel + 20).toInt(), val.substring(tel + 7, tel + 18)); ///// sms типа: " master:79111234567 1 " - номер + ячейка, куда записать номер } }сейчас тестирую модем GSM/GPRS A6
sergius, спасибо, как раз разбираюсь с кодом, есть косяки со звонками.
может кто подсказать почему у меня в мониторе порта не показывается вся инфа с модуля
как будто стоит какое то ограничение на вывод инфы, хотя она вся обрабатывается
а стоит
gprsSerial.println("AT+CLIP=1"); delay(300); gprsSerial.print("AT+CMGF=1\r"); delay(300); gprsSerial.println("AT+CSCS=\"GSM\""); delay(300); gprsSerial.println("AT+CMGD=1,4"); delay(300); gprsSerial.print("AT+CNMI=1,2,2,1,0\r");smesharik, у меня так было, не хватало строки:
Serial.println(val);
См 165 пост, 136 строка.
Столкнулся с проблемой: поменял М590, на пришедший А6, перестала нормально работать программа по все режимам завязанным с модемом:
При вызове проходит Ring после того как положили трубку, что даёт 2 проход по определению номера,
При приеме смс не видит самой смс, вообщем разбираюсь
половина же отображается, если ее не было тогда вообще не отображалось ничего
какие у вас значения?
С этим все нормально, памяти: 53% и 29%
Замучился я с модемами, М590 не полностью читает смс типа: master:79111234567 1 - читает как master:791112345 не смог пока победить.
GSM A6 поиск вызова не по RING а по +CLIP: , иначе RING проходит и после сброса вызова. а это вызывает второй раз процедуру распознавания номера, но номера нет.
не читает смс, если забить в ардуину код:
#include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); // RX, TX void setup(){ Serial.begin(9600); mySerial.begin(9600); } void loop() { if (mySerial.available()) Serial.write(mySerial.read()); if (Serial.available()) mySerial.write(Serial.read()); }то смс приходят типа