Причём тут 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 вот так
и покажите мне что печатает, только всё, а не обрывки.
вот:
вот номера из ЕЕПРОМ:
странно, перенос строки
в 79 строку помог.
теперь норм сравнивает свой/чухой
Не знаю, что Вы куда перенесли. Только попробуйте напечатать списо телефонов из EEPROM где-нибудь ещё, после их ввода.
Например, в том же checkPhone - узнаете много интересного. И мне печать покажите
Не знаю, что Вы куда перенесли. Только попробуйте напечатать списо телефонов из EEPROM где-нибудь ещё, после их ввода.
Например, в том же checkPhone - узнаете много интересного. И мне печать покажите
в 152 посте, список телефонов получен командой phone из еепром. доберусь до компа еще попробую.
Причём тут 152 второй. Сделайте то, что я просил. Я не сомневаюсь, что в епром всё нормально, а вот в том, что Вы не читаете их друга на друга - сомневаюсь. Сделайте.
ну вот что пишет в монитор порта
Нет, здесь нет моей печати, что в строках 2-7. Что-то Вы не так вставили. Покажите-ка скетч.
Вообщем если есть пустая ячейка памяти номеров из 5 забиты то любой (чужой) номер определяет как свой. если забить все 5 ечеек , то норм работает!
Я Вам уже писал, что это происходит потому, что indexOf "находит" пустую строку. Т.е. если Вы при помощи indexOf ищете пустую строку, то он всегда скажет, что нашел. Проверяйте на пустые строки и не ищите их indexOf, и всё будет нормально.
А мою печать Вы мне так и не покажете? Ну, дело хозяйское.
еще раз напишу:
157 пост это ответ на CheckPhone по вашему коду!
159 пост это полный код с вашим CheckPhone!
так понимаюval не успевает попасть в мон тор, поэтому прилетает позже?
Да, вот нет, что-то там не так. Вот смотрите в коде строки 73-78. Должны печататься все пять AlarmPhone, а печатаются только 2 (строки 24-25 лога). Так не должно быть.
Давайте строкам 73-78 присобачим начало и конец, посмотрим ещё разок. Вот так запустите
загрузил скетч
команда "phone" дает номера
при звонке с непрописанного номера
еще вариант: записывать 1:
тогда в порт пишет номера так:
и номера нормально определяет, свой/чужой
Ну, в общем намудрили Вы ... просто не ищите пустыет строки и будет Вам счастье.
Вообщем вот что получилось.
из консоли все работает как надо, кроме аварийной температуры (пока не понял почему сыпятся сообщения, а не одно приходит).
смс не проверял, модем отказался работать, буду в следующие выходные допиливать.
команды консоли:
интересно что при команде tempon/off выполняется и команда temp. пока незнаю ка кэтого избежать.
вроде как-то так, и ни чего не забыл.
пожелания и обоснованная критика (потому как я не программист, а только учусь)приветствуются!
народ в чем может быть косяк
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% брака, купите чтото посовременее, где уже есть мр проигрыватель.
модуль умеет показывать % от остатка аккумулятора:
Просто хотел , чтобы при срабатывании датчика движения система предупреждала нарушителя о том , что дом под охраной .
для этого можно встривать в сам датчик, или опять же почитать что советую купить, изучите для начала маттчасть.
Я нашел только 3 модуля 590й , sim800 , sim900 . С встроенным mp3 не нашел . Вы имели ввиду встроить мп3 модуль в сам датчик движения ?
учите матчасть того чтонашли... ине спешите шаманить с бубном как многие здесь поступают.
Почему после открытия двери сигнал выключается?
тоесть сломают замок, войдут и тут бонус- сигнализациия выключилась. Может оставить сирену вкл. секунд на 30
помоему я делал сирену установленное время и снимает с сигнализации, при закрытии двери становится на охрану.
столкнулся с проблемой
есть проект поливалки: часы ds1307, модуль m590 + обвязка
так то все работает, но на заключительной стадии, хотел приделать чтобы при посылке смс вида on73030 (это типо таймер включения 7:30:30) , каждые данные часы минуты секунды уходили в eeprom, каждый выделять substring, так часы имеют byte а данный у нас string
подскажите как их подружить?!
сконвертировать байт в стринг - есть куча примеров..
я видел только примеры байты --> стринг конвертировали, а стринг --> байт по сути не видел, только такой нашел
выложите программу или кусок что нужно сделать, может там по факту нужно шагать иным путем.
Сильно не пинать, только учусь строка 382, например при посылке смс вида clockon73030 надо чтобы 7 часов передавалось переменной setHorClockOn, 30 --> setMinClockOn, 30 --> seSecClockOn но эти переменные имеют Byte , а 7 30 30 string
у меня вопрос к pasha413 смог ли опробывать с модемом свой пример?! В плане приема и отправки смс с телефона на модуль?
Из 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: , он не видел почему то нужной строки с текстом смс
пришлось перейти на
так стал работать заметнее медленее, но видит перевод строки и тем самым нужные мне строчки
Сейчас не расскажу, в отпуске, все хозяйство на работе...через 2 недели буду проверять снова тогда
самое что интересное, если через сериал порт отправляешь с компа то все команды отрабатывает и все переменные видит, а вот с смс так не получилось
Всем привет :)
Вот это можно выкинуть, всё равно после того как отвалится модем SoftwareSerial тоже отвалится напрочь, и поможет только перезагрузка ардуины.
интересно что при команде tempon/off выполняется и команда temp. пока незнаю ка кэтого избежать
Ничего удивительного, ведь в tempon и tempoff присутствует подстрока temp. Переименуйте команду "temp" в, например, "showtemp".
rindon/off
Может быть ring?
пожелания и обоснованная критика (потому как я не программист, а только учусь)приветствуются!
Уходите от массивов, избегайте дублирования, смотрите в сторону структур. Через некоторое время памяти станет очень нехватать.
А можно на примере указать как уйти к структурам, если не сложно.
На "майску" я Вам скидывал уже ссылки. Про структуры тут почитать radioprog.ru/post/117. Смотрите раздел "put()".
Спасибо
smesharik, извините что так долго небыло, отпуск)))
нашел косяк в коде, из-за которого не распознавались смс.
надо изменить строчки в коде:
сейчас тестирую модем GSM/GPRS A6
sergius, спасибо, как раз разбираюсь с кодом, есть косяки со звонками.
может кто подсказать почему у меня в мониторе порта не показывается вся инфа с модуля
как будто стоит какое то ограничение на вывод инфы, хотя она вся обрабатывается
а стоит
smesharik, у меня так было, не хватало строки:
Serial.println(val);
См 165 пост, 136 строка.
Столкнулся с проблемой: поменял М590, на пришедший А6, перестала нормально работать программа по все режимам завязанным с модемом:
При вызове проходит Ring после того как положили трубку, что даёт 2 проход по определению номера,
При приеме смс не видит самой смс, вообщем разбираюсь
половина же отображается, если ее не было тогда вообще не отображалось ничего
какие у вас значения?
С этим все нормально, памяти: 53% и 29%
Замучился я с модемами, М590 не полностью читает смс типа: master:79111234567 1 - читает как master:791112345 не смог пока победить.
GSM A6 поиск вызова не по RING а по +CLIP: , иначе RING проходит и после сброса вызова. а это вызывает второй раз процедуру распознавания номера, но номера нет.
не читает смс, если забить в ардуину код:
то смс приходят типа