SIM800L Промблема....
- Войдите на сайт для отправки комментариев
Втр, 26/04/2016 - 07:38
Добрый день.
Встал на три дня уже... В примере ниже все хорошо работает когда я отправляю СМС с текстом Т, но когда входящее сообщение Snd... Оно распознается через раз и отправляет обратно не все символы(зажовывает где то их)... Засада, в общем. Искал другие примеры получения СМС, может плохо искал, но не нашел...
#include <LiquidCrystal_I2C.h> #include <SoftwareSerial.h> #include <Wire.h> #include <OneWire.h> #include <DallasTemperature.h> #include <EEPROM.h> SoftwareSerial gprsSerial(7, 6); // RX, TX LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей #define ONE_WIRE_BUS 9 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); int T1, T2, T3, curr_temp, set_temp, max_temp, min_temp, bal; int R1 = 1; int R2 = 0; int W = 0; int grad_temp = 1; String dbm; long previousMillis = 0; long interval = 10000; String num, err_num, bal_num, mess; ... void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis > interval) { previousMillis = currentMillis; gettemp(); if (isStringMessage == 1) { lcd.setCursor(0, 0); lcd.print("I"); gprsSerial.println("AT+CSQ"); // Здесь спрашиваю уровень сигнала... } } else { if (gprsSerial.available() > 0) { char currSymb = gprsSerial.read(); if ('\r' == currSymb) { lcd.setCursor(0, 0); lcd.print("R"); if (isStringMessage == 2) { lcd.setCursor(0, 0); lcd.print("S"); Serial.println("SMS GET"); //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("Dbm")) { Serial.println("SMS Dbm"); sms(dbm, num); } else if (!currStr.compareTo("T")) { // Эта часть работает идеально mess = "Sensor 1:"; mess += String(T1); delay(300); mess += " C"; mess += " \n"; mess += "Sensor 2:"; mess += String(T2); delay(300); mess += " C"; mess += " \n"; mess += "Sensor 3:"; mess += String(T3); delay(300); mess += " C"; mess += " \n"; mess += "Control:"; if (W == 1) mess += "On"; else mess += "Off"; delay(300); mess += " \n"; mess += "Contr temp:"; mess += String(set_temp); delay(300); mess += " C"; mess += " \n"; delay(500); sms(mess, num); delay(500); } else if (currStr.startsWith("Snd")) { // А вот тут она не может мне вернуть строку типа Snd 10 11 111 11111 111 20 7912222222 0 1 delay(500); mess = "A: " + currStr; delay(1000); sms(mess, num); delay(500); } else if (!currStr.compareTo("R1 1")) { Serial.println("SMS R1 1"); R1 = 1; EEPROM.write(1, R1); sms("R1 = Sensor 1", num); } else if (!currStr.compareTo("Reset")) { void(* resetFunc) (void) = 0; resetFunc(); } else if (!currStr.compareTo("R1 2")) { Serial.println("SMS R1 2"); R1 = 2; EEPROM.write(1, R1); sms("R1 = Sensor 2", num); } else if (!currStr.compareTo("R1 3")) { Serial.println("SMS R1 3"); R1 = 3; EEPROM.write(1, R1); sms("R1 = Sensor 3", num); } else if (!currStr.compareTo("R2 1")) { Serial.println("SMS R2 1"); R2 = 1; EEPROM.write(2, R2); sms("R2 = Sensor 1", num); } else if (!currStr.compareTo("R2 2")) { Serial.println("SMS R2 2"); R2 = 2; EEPROM.write(2, R2); sms("R2 = Sensor 2", num); } else if (!currStr.compareTo("R2 3")) { Serial.println("SMS R2 3"); R2 = 3; EEPROM.write(2, R2); sms("R2 = Sensor 3", num); } else if (!currStr.compareTo("R2 0")) { Serial.println("SMS R2 0"); R2 = 0; EEPROM.write(2, R2); sms("R2 = None", num); } else if (!currStr.compareTo("W on")) { Serial.println("W on"); W = 1; sms("Control on", num); } else if (!currStr.compareTo("W off")) { Serial.println("W off"); W = 0; sms("Control off", num); } else if (currStr.startsWith("Set")) { String cs; cs = currStr.substring(4, 6); set_temp = cs.toInt(); EEPROM.write(3, set_temp); Serial.print("Set"); Serial.println(set_temp); Serial.print("Num"); Serial.println(num); sms("Control temp: " + String(set_temp), num); } else if (currStr.startsWith("Max")) { String cs; cs = currStr.substring(4, 6); max_temp = cs.toInt(); EEPROM.write(4, max_temp); Serial.print("Max"); Serial.println(max_temp); sms("Max temp: " + String(max_temp), num); } else if (currStr.startsWith("Min")) { String cs; cs = currStr.substring(4, 6); min_temp = cs.toInt(); EEPROM.write(30, min_temp); Serial.print("Max"); Serial.println(min_temp); sms("Min temp: " + String(min_temp), num); } else if (currStr.startsWith("Num")) { String cs; cs = currStr.substring(4, 15); err_num = cs; Serial.println("writing eeprom tel num:"); for (int i = 5; i < 25; i++) { EEPROM.write(i, err_num[i - 5]); Serial.print("Wrote: "); Serial.println(err_num[i - 5]); } Serial.print("err_num"); Serial.println(err_num); sms("Alarm number: " + String(err_num), num); } isStringMessage = 1; } else { lcd.setCursor(0, 1); lcd.print(currStr); if (currStr.startsWith("+CMT")) { //Serial.println(currStr); //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = 2; num = currStr.substring(7, 19); num.trim(); lcd.setCursor(0, 1); lcd.print("Get:" + num); delay(3000); } else if (currStr.startsWith("+CSQ")) { dbm = currStr.substring(5, 10); getdbm(); lcd.setCursor(15, 1); lcd.print("D"); } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } } } }
Добавлю что на входящее Т - оно просто отвечает
На вохдящее Snd 10 11 22 11 7912222222 и т.д. скетч начинает жевать символы. Попарсить в порт не смогу. Скетч на плате, плата не ардуина) Вывод только USBAsp...
Но уже думаю что пора на UNe собрать чтоб в порт смотреть что приходит...
Но уже думаю что пора на UNe собрать чтоб в порт смотреть что приходит...
С этого надо начинать. На уне или ещё на чём, но чтобы видеть процесс. Вслепую никто не отлаживается (кроме новичков, которые считают, что у них все с первого запуска заработет).
Ой ой ой... Я тоже так писать могу не вникая в код.. Можно же и на LCD выводить - это раз а второе там в основе цикл.
11 символов только нормально передает... То есть если я отправляю Snd12345678 Нормально приходит. Больше уже глючит. Может длинной переменной ограничено какой то?
Или буфером SoftwareSerial?
Дело было не в бобине... А вот тут:
Дело было не в бобине... А вот тут:
Нет, где то не тут...
Проблема в том, что после функции:
num = currStr.substring(7, 19) переменная currStr в следующем цикле возвращает только 13 символов...
Скорость то какая по softwareserial?
Где то он в цикле жует длинное сообщение. При том, что короткое входящее - как часы работает. При чем отрезает ровно на 14 символов. Первый раз послыаю Snd 12345678910111213141516 пролетает нормально все сообщение.
Второй раз не распознает начало. То есть не определяет:
if
(currStr.startsWith(
"Snd"
))
Третий раз если скинуть запрос, Т например - возвращает оба, но первое обрезанное Snd 1234567891
То есть где то ограничение по длине получается. А где и за счет чего... Хз...
Есть вообще где то в природе скрипт(пример, работающий) под SIM800L где получают сообщение и отправляют его на номер с которого получили? Только целиком и большое? Я не гордый, переделаю по новой...
Вот на что на просторах наткнулся:
https://github.com/cristiansteib/Sim800l
Ну-ка заюзаем, посмотрим...
Вам бы сначала протестировать все без скетча, то есть открыть в ардуино стандартный пример SoftwareSerial, поменять пины на свои, залить, и через монитор порта послать AT допустим, придет OK (обязательно надо любую команду отправить после включения, иначе модуль так сказать сам первый не начнет, даже если на него звонить и т.п.), потом можно смску послать на модуль, посмотреть что появится, а то может и не отображается вся строка вовсе...
Вам бы сначала протестировать все без скетча, то есть открыть в ардуино стандартный пример SoftwareSerial, поменять пины на свои, залить, и через монитор порта послать AT допустим, придет OK (обязательно надо любую команду отправить после включения, иначе модуль так сказать сам первый не начнет, даже если на него звонить и т.п.), потом можно смску послать на модуль, посмотреть что появится, а то может и не отображается вся строка вовсе...
Да попробую вечерком...
С симовлами так это выглядит... Догадался как к плате(не ардуино, уже готовая плата) припарить UART... Буду завтра под микроскопом смотреть...
Но что то я не вижу где косяк... Пока что с ходу... Говорят в свежих IDE неоднородности наблюдаются, не знаю правда или...
Вряд ли IDE, и ОСТОРОЖНЕЕ с uart, так как модуль работает с 2.8В по TX, RX, спасибо и от ардуины не сгорел без преобразования уровней (хотя бы на резисторах)... Так что лучше подключать и от ардуино, и от uart нормально, а не 5В, где ждут 2,8В макс.
В общем, Вы пробуете отправить три смс, первая нормально, от второй ничего не происходит, а при третей приходит часть второй и третья нормально?
А как Вы проверяете, что у Вас приходит? Через ответную смс (а то может это уже отправка смс косячит)? Или все-таки добавили в код вывод в сериал?
В общем, Вы пробуете отправить три смс, первая нормально, от второй ничего не происходит, а при третей приходит часть второй и третья нормально?
А как Вы проверяете, что у Вас приходит? Через ответную смс (а то может это уже отправка смс косячит)? Или все-таки добавили в код вывод в сериал?
Да именно так...
То есть IsStringMessage Видимо остается 2 или CurrStr не очищается.
Потом приходит третья и все это добавляется и происходит отправка... Хотя странная версия. Сейчас буду парсить и смотреть что на каком этапе происходит...
ЕвгенийП, конечно прав, но не таким же императорским тоном про это говорить(добрее надо быть). XD
Кажется дело было не в бобине... Разобрался блин. Дело в том, что в цикле стоит чтение строки, путем отлавливания /r и игнорирования /n потому что они вместе идут... А вот про то, что раз в 10 секунд запускается цикл запроса темпераутры и портит всю картину - я забыл... То есть надо сделать проверку на окончание чтения...
Этот косяк конечно присутствовал, но дело не в нем.
Получает СМС:
isStringMessage = 2;
06
num = currStr.substring(7, 19);
07
num.trim();
08
lcd.setCursor(0, 1);
09
lcd.print(
"Get:"
+ num);
10
delay(3000);
currStr как раз такую длину и вырезает из сообщения...
else if ('\n' != currSymb) { - пробовал просто else... та же фигня...
вечером скину свои наработки по сим 800L посмотрите может что подчерпнете оттуда
вечером скину свои наработки по сим 800L посмотрите может что подчерпнете оттуда
Вот спасибо!:)
Вот без этого как часы работает:
В смысле если убрать
else
if
(isStringMessage == 1) {
06
unsigned
long
currentMillis = millis();
07
if
(currentMillis - previousMillis > interval) {
08
previousMillis = currentMillis;
09
gettemp();
10
//gprsSerial.println("AT+CSQ");
11
}
12
13
}
Да, определенно... Косяк в millis();
блин... Причем неважно закрыта она или нет if ами...
Да, определенно... Косяк в millis();
Это сильно! Продолжайте исследования и сообщите нам в чём именно этот косяк состоит.
Да, определенно... Косяк в millis();
Это сильно! Продолжайте исследования и сообщите нам в чём именно этот косяк состоит.
Подсказали бы лучше, куда копать...
else
if
(isStringMessage == 1) {
06
unsigned
long
currentMillis = millis();
07
if
(currentMillis - previousMillis > interval) {
08
previousMillis = currentMillis;
09
gettemp();
10
//gprsSerial.println("AT+CSQ");
11
}
12
13
}
Не в milis(); если закоментировать gettemp(); - все работает. В этой функции три далласа опрашивается, но она закрыта If ом до тех пор, пока не получится/отправится СМС... А если ее под коментарий - стабильно работает...
Да, определенно... Косяк в millis();
Это сильно! Продолжайте исследования и сообщите нам в чём именно этот косяк состоит.
Я лучше промолчу))))))
Еще раз:
Теперь функция Get temp там все просто... Когда ставишь под коментарий sensors.requestTemperatures(); все работает стабильно..
Но почему? Тут то она под If ом....
if
(csq == 0 && isStringMessage == 1) {
092
previous++;
093
if
(previous > inter) {
094
previous = 0;
095
gettemp();
//а тут косяк когда ставлю коммент работает прога смс получаются целиком а когда раскоментирую - режет СМС
096
//gprsSerial.println("AT+CSQ");
097
}
098
099
}
Но суть не в этом, суть в том, что я бы хотел получить практический совет, типа... Что попарсить, что дописать.
Зачем Вам советы, если Вы их не слушаете? Я Вам дал совет в посте №3. Очень, между прочим дельный совет. Но Вы его либо не поняли, либо проигнорировали.
После того поста, я ожидал, что Вы вставите по ходу программы кучу Serial.println(), которые печатают значения переменных. посмотрите на эти значения и либо разберётесь сами, либо выложите сюда скетч со вставленной отладочной печатью и копи-пасту того, что печатает, чтобы можно было посмотреть и разобраться. Вы же этого делать не захотели а продолжаете отлаживаться вслепую, гадая на кофейной гуще. Ну, удачи, ничем не могу помочь. Кстати, может Вы это и сделали, я не знаю, но от нас Вы держите в секретеи обновлённый скетч и протокол отладочной печати.
Хотите реальной помощи, слушайте и делайте, что Вам говорят. В частности, ставьте отладочную печать и покажите скетч и то, что он печатает. Возможно, Вас попросят вставить дополнительные печати - именно так и отлаживаются программы, а вовсе не гаданием "чтобы там могло быть?" и уж тем более, не заявлениями. что "миллис не работает".
Дак я поставил... Выложил вроде... 15, 16 пост. Еще раз пост 31 написал чтоб понятно было что и как...
Вот так с закоментированным sensors.requestTemperatures();
Хотя странно что без sensors.requestTemperatures(); все работает...
Да, нет, ну так не ставят.
Печати нужно гораздо больше.
Вот смотрите Ваш пост №31, где Вы жалуетесь на кусок 91-97. Если у Вас сомнения в этом куске, то Вы должны превратить его в нчето вроде
И точно также надо разукрасить функцию gettemp - чтобы Вы 1) видели каждую переменную и 2) точно видели в какую ветку IF' а попадаете.
Тогда, глядя на всю эту информацию, Вам будет легче разобраться. А то, что Вы вставили сейчас особой информации не даёт - так "для галочки".
Кстати. чтобы работал потоковый вывод в Serial (и можно было в одной строке писать кучу всего, как я делаю в примере), поставьте первой строкой скетча вот такую
О, пока я писал, Вижу, что Вы уже что-то вставили - гораздо ближе к делу.
Только Вы опят варитесь в своём соку, скрывая от нас детали. Вот смотрите, Вы пишете. что это напечатано пи закомментированном requestTemperatures. Отлично, только в скетче в посте №31 (это ведь последний?) нет ни этих печатей, ни requestTemperatures. Ну, нет этого там. ЧТо прикажете мне делать?
Вы если публикуете, то публикуйте актуальный скетч и то, что именно он печатает. Только так Вам кто-то сможет помочь. Без этого Вы только мозги людям пудрите. Вот пояите, я сижу в тысяче вёрст от Вас и читаю, что у Вас всё работает с закомментированной строкой, которую я вовсе не вижу. И что мне делать?
окей)
SetResolution(9) сделал, вроде заробило...
SetResolution(9), не помогло... Блин... Как же температуру по другому спросить и где косяк?) Если он Ifом закрывается - почему все равно влияет гад...
Вы когда-нибудь сделаете то, что я просил? Та печать, что Вы привели не соответсвует тексту программы (наверное что-то поменялось по-мелочи).
Сделайте программу и ЕЁ печать. Вместе. В одном посте
А в другом посте сделайте работающую программу (с чем-то там закомментированным) и ЕЁ печать.
Если сделаете, то я постараюсь вечером посмотреть что у Вас там.
Ты сообщения то вообще читаешь(с пропусканием через мозг)? Написано уже где проблема. Из кода все понятно как работает и где БАГ, что нужно то еще??? Ничего ключвеого я не удалил...
Я сомневаюсь получить разумный(работающий) ответ при таких вопросах...
Написано уже где проблема.
Если Вы знаете, где проблема - исправляйте, чего сюда-то пришли?
Ничего ключвеого я не удалил...
Да меня не волнует ключевое оно или нет. Я всего лишь прошу показать мне программы и её печать. Уговариваю целый день, как будто бы это нужно мне.
Я сомневаюсь получить разумный(работающий) ответ при таких вопросах...
А я не сомневаюсь. Если Вы знаете где проблема и ничего ключевого не удаляли, то вперёд и с песнями, но без меня. Я больше уговаривать Вас не намерен. не хотите - дело Ваше.
Ой всееее....))))
Вопрос не в том, где она. Вопрос в том, как её исправить. И вопрос вообще ключевой: почему ардуина смотрит в невыполняемый цикл if и почему ей мешает в этом цикле одна функция из библиотеки Dallas. Причём мешает она конкретной строке начинающейся с Snd. А кода я скинул достаточно чтоб повторить проблему. Она с таким кодом тоже повторяется.
Понимаете, когда Вас просят дать текст программы, надо давать текст программы, а не "достаточно чтоб повторить проблему". Это нужно Вам, а не мне, а я Вас целый день уговаривал. Теперь пусть Вас поуговаривает кто-нибудь другой.
Нет бы честно сказать, что ответ неизвестен. Надоел уже этот детский сад, прекратите тут писать всякую херню! Либо по делу пишите, либо нахр-н даже не заглядывайте сюда, уважаемый. Сам наехал в начале зачем-то, а теперь как обиженная девочка себя ведет. Дам не дам но не вам... Я здесь хочу получить конструктивные подсказки а не ТЕОРИЮ и какие то сопли.
Пожалуйста не пишите сюда если нет конкретного предложения.
И тут я плавно начал нащупывать источник беды))))
Смысл в том, что пока смс не приходит - идет запрос температуры у датчиков. И в момент когда прихоит смс она записывается в буфер SIM800L. А она в свою очередь отдает это ардуине по запросу If(gprsSerial.available()) и т.д. ...
Выводя значение этого gprsSerial.available() можно узнать сколько еще осталось непрочитанных байт. Ну и судя из логов непрочитанные байты заканчиваются...
SMS GET