Спасибо конечно за ответ, перечитал почти всю вашу тему, но это совсем не то что мне требуется, у вас делей при котором выполняется еще мелкая задача. Я вот думаю вынести эту функцию в луп разбить ее на 3 части, и запускать ее по значению переменной типа интегер. И каждая часть записывает время в милис.
Завтра попробую что-то написать, выложу на обсуждение )))
Вот только не знаю как быть с очередью сообщений, к примеру одно смс в процессе отправки а тут поступает второе смс...
Я вот думаю вынести эту функцию в луп разбить ее на 3 части, и запускать ее по значению переменной типа интегер. И каждая часть записывает время в милис.
Вы описываете метод конечных автоматов. Это стандартный подход, много где опмисан, примеров использования полно. Тот же "блинк без делей" - это тоже оно.
В моей теме я хотел сделать что-то более удобное для задач. которые трудно разбить на независимые части.
Вот только не знаю как быть с очередью сообщений, к примеру одно смс в процессе отправки а тут поступает второе смс...
Можно, к примеру, не пытаться анализировать поступающие СМС сразу - вместо этого настроить в модеме сохранение пришедших СМС в память или на СИМкарту, а анализировать потом, когда не будет срочных задач.
спасибо почитаю сейчас про метод конечных автоматов))0
я извиняюсь чуть чуть не так написал, к примеру одно смс в процессе отправки а тут к примеру срабатывает сигнализация и нужно отправлять вторую смс. а функция отправки еще занята ....
вот в чем загвостка у меня,
а с приходящими смс проблем не вижу, думаю тот же Serial будет хранить смс-ку пока ее не прочитаю
а с приходящими смс проблем не вижу, думаю тот же Serial будет хранить смс-ку пока ее не прочитаю
не будет, там буфер всего 64 байта, даже одна СМС со служебной информацией не поместится - это при условии, что модем не выдаст каких-то других сообщений
а вот как все таки быть с очередью на отправку смс?
пока писал пост пришла идея такая, функция bool SendSMS (String & text), возвращает флаг отправлено ли смс, в месте где отправляется смс ставлю условие и еще один флаг к примеру bool Send=true, и ставлю условие которое будет выполнятся с отправкой смс пока SendSMS не вернет флаг что смс отправлено, и как только это случилось меняю Send =!Send и больше такое смс не отправится....
накидал я все таки сегодня функцию неблокирующую без делай. но пока не проверял. Выставляю на конструктивную критику...
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
int i = 1;
int sms_step = 0; // флаг процесса отправки смс
void loop() {
// put your main code here, to run repeatedly:
if (sms_step = 0)
{
i++;
String s = (String) "'MY SMS №" + i;
SendSMS(s);
}
}
String NBoss = "+79015650000";
boolean SendSMS(String & text_str) //процедура отправки СМС
{
static unsigned long sms_millis = 0; // время
static String text = ""; // тут то что надо отправить в смс
if (sms_step != 0) return false;// если флаг не 0, значит уже есть смс в процессе отправки
if (millis() < sms_millis) {sms_millis = millis();} //это проверка обнуления миллисекунд
switch (sms_step ){ // выбираем действие согласно текущего состояния:
case 0:
if(text_str > "")
{
text = text_str ; // сохраним и будем работать с ним так как за пределами строка может измениться
sms_step = 1;
Serial.println("AT+CMGS=\"" + NBoss + "\""); //Отправляем на GSM комманду отправка смс-номер
sms_millis = millis();
}
return true;
break; // тут наверное не нужен, после ретурн выходит из функции
case 1:
if ((millis() - sms_millis) >= 300)
{
sms_step = 2;
Serial.print(text);
sms_millis = millis();
text = ""; // очистим строку после отправки в модуль
}
break;
case 2:
if ((millis() - sms_millis) >= 500)
{
sms_step = 3;
Serial.print((char)26);
sms_millis = millis();
}
break;
case 3:
if ((millis() - sms_millis) >= 3000)
{
sms_step = 0;
}
break;
}
}
Можно, только кратковременно.
Касательно симки - там проблема может быть не в самой карте, а в модуле, у него часто непропаяные контакты попадаются. Я свои пропаивал, тоже проблема была со связью.
Контакты сим модуля, по которым у Вас проходит черная линия, паяльником пропаял. Просто жалом прижимаем контакт, чтобы припой расплавился и отпускаем. У меня два контакта вообще не припаяны были.
Ничего не надо, подключать reset напрямую к меге. Входу reset 5V не критичны. Если очень хочется перестраховаться, то можно ногу программировать как выход LOW для сброса, и как вход после.
вы бы для начала выяснили, какой ток пойдет через пин при ресете модема. Например, на модеме А6 ресет сливает в GND вполне взрослые 60-70мА. так что подключать напрямую - плохой совет
Плохой совет - это гадать. Надо читать документацию. Сбрасываю SIM800 прямо выводом atmega328p и stm32f103. Для особо сомневающихся могу уровень "нуля" померить...
Плохой совет - это гадать. Надо читать документацию. Сбрасываю SIM800 прямо выводом atmega328p и stm32f103. Для особо сомневающихся могу уровень "нуля" померить...
Вот и почитали бы, вместо того чтоб "на авось" советовать. Уровень нуля там мерить бесполезно - лучше померьте ток при замыкании ресета на "землю"
b707, купи себе SIM800 и потом приходи с советами, а сейчас иди лесом.
Цитата:
Может резистор на 1 кОм добавить...?
1КОм при токе 2,69 мА даст падение 2,69В. Из документации максимальный уровень нуля на входе reset 0,6В, стало быть резистор должен быть не более 220 Ом. Но особого смысла в нем нет. Даже если подать 5В на этот вход, через обратносмещенный транзистор ток не потечет. Если очень хочется перестраховаться программируй эту ногу как вход, вместо выдачи лог 1.
Цитата:
Нужен ли такой "фильтр" на питание?
Однозначно нужен. Конденсатор 100 мкФ надо повесить прямо на питающие выводы SIM800. Она потребляет рывками, до 2А, хотя у меня с питанием от порта USB выходит в сеть.
Питание ардуино и SIM800, как я рисовала выше, осуществляется спомощью двух модулей* питания:
LM2596
И второй
На обеих модулях написано что держат 3 Ампера.
Всё это дело стоит в машине (сделано на печатной плате отличного качества)
Езжу по своему городу - всё работает. Уезжаю в соседнюю область (соответственно роуминг, дорогой местами может пропадать сеть) модуль перестает отвечать на смс, при этом (когда открываю корпус куда все это дело установлено) модуль кажет что сеть есть.
Абоненты Tele2 остаются на связи во всех регионах России. Для вашего удобства оператор предусмотрел единую тарификацию вызовов и мобильного интернета в роуминге по всей России.
Возможно, что при неоднократном пересечении границы роуминга приходит несколько смс, но если сим карта при этом вне зоны действия, то они накапливаются на строне оператора, а потом приходят кучей, которые забивают внутреннюю память симки. Добавьте в код чистку смс после каждого получения.
Проверить, чистятся ли смс просто - после очередного затыка достаете симку, ничего при этом с модулем не делая, и вставляете в телефон. И смотрите смс на симке. Наверняка они там будут.
Проект сделан на основании этого скетча, все смс-ки удаляюся каждые три минуты.
#include <SoftwareSerial.h> // Библиотека програмной реализации обмена по UART-протоколу
SoftwareSerial SIM800(8, 9); // RX, TX
int pins[3] = {5, 6, 7}; // Пины с подключенными светодиодами
String _response = ""; // Переменная для хранения ответа модуля
long lastUpdate = millis(); // Время последнего обновления
long updatePeriod = 60000; // Проверять каждую минуту
String phones = "+7928xxxxxxx, +7920xxxxxxx, +7918xxxxxxx"; // Белый список телефонов
void setup() {
for (int i = 0; i < 3; i++) {
pinMode(pins[i], OUTPUT); // Настраиваем пины в OUTPUT
}
Serial.begin(9600); // Скорость обмена данными с компьютером
SIM800.begin(9600); // Скорость обмена данными с модемом
Serial.println("Start!");
sendATCommand("AT", true); // Отправили AT для настройки скорости обмена данными
//sendATCommand("AT+CMGDA=\"DEL ALL\"", true); // Удаляем все SMS, чтобы не забивать память
// Команды настройки модема при каждом запуске
//_response = sendATCommand("AT+CLIP=1", true); // Включаем АОН
//_response = sendATCommand("AT+DDET=1", true); // Включаем DTMF
sendATCommand("AT+CMGF=1;&W", true); // Включаем текстовый режима SMS (Text mode) и сразу сохраняем значение (AT&W)!
lastUpdate = millis(); // Обнуляем таймер
}
String sendATCommand(String cmd, bool waiting) {
String _resp = ""; // Переменная для хранения результата
Serial.println(cmd); // Дублируем команду в монитор порта
SIM800.println(cmd); // Отправляем команду модулю
if (waiting) { // Если необходимо дождаться ответа...
_resp = waitResponse(); // ... ждем, когда будет передан ответ
// Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
if (_resp.startsWith(cmd)) { // Убираем из ответа дублирующуюся команду
_resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
}
Serial.println(_resp); // Дублируем ответ в монитор порта
}
return _resp; // Возвращаем результат. Пусто, если проблема
}
String waitResponse() { // Функция ожидания ответа и возврата полученного результата
String _resp = ""; // Переменная для хранения результата
long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд)
while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
if (SIM800.available()) { // Если есть, что считывать...
_resp = SIM800.readString(); // ... считываем и запоминаем
}
else { // Если пришел таймаут, то...
Serial.println("Timeout..."); // ... оповещаем об этом и...
}
return _resp; // ... возвращаем результат. Пусто, если проблема
}
bool hasmsg = false; // Флаг наличия сообщений к удалению
void loop() {
if (lastUpdate + updatePeriod < millis() ) { // Пора проверить наличие новых сообщений
do {
_response = sendATCommand("AT+CMGL=\"REC UNREAD\",1", true);// Отправляем запрос чтения непрочитанных сообщений
if (_response.indexOf("+CMGL: ") > -1) { // Если есть хоть одно, получаем его индекс
int msgIndex = _response.substring(_response.indexOf("+CMGL: ") + 7, _response.indexOf("\"REC UNREAD\"", _response.indexOf("+CMGL: "))).toInt();
char i = 0; // Объявляем счетчик попыток
do {
i++; // Увеличиваем счетчик
_response = sendATCommand("AT+CMGR=" + (String)msgIndex + ",1", true); // Пробуем получить текст SMS по индексу
_response.trim(); // Убираем пробелы в начале/конце
if (_response.endsWith("OK")) { // Если ответ заканчивается на "ОК"
if (!hasmsg) hasmsg = true; // Ставим флаг наличия сообщений для удаления
sendATCommand("AT+CMGR=" + (String)msgIndex, true); // Делаем сообщение прочитанным
sendATCommand("\n", true); // Перестраховка - вывод новой строки
parseSMS(_response); // Отправляем текст сообщения на обработку
break; // Выход из do{}
}
else { // Если сообщение не заканчивается на OK
Serial.println ("Error answer"); // Какая-то ошибка
sendATCommand("\n", true); // Отправляем новую строку и повторяем попытку
}
} while (i < 10);
break;
}
else {
lastUpdate = millis(); // Обнуляем таймер
if (hasmsg) {
sendATCommand("AT+CMGDA=\"DEL READ\"", true); // Удаляем все прочитанные сообщения
hasmsg = false;
}
break;
}
} while (1);
}
if (SIM800.available()) { // Если модем, что-то отправил...
_response = waitResponse(); // Получаем ответ от модема для анализа
_response.trim(); // Убираем лишние пробелы в начале и конце
Serial.println(_response); // Если нужно выводим в монитор порта
if (_response.indexOf("+CMTI:")>-1) { // Пришло сообщение об отправке SMS
lastUpdate = millis() - updatePeriod; // Теперь нет необходимости обрабатываеть SMS здесь, достаточно просто
// сбросить счетчик автопроверки и в следующем цикле все будет обработано
}
}
if (Serial.available()) { // Ожидаем команды по Serial...
SIM800.write(Serial.read()); // ...и отправляем полученную команду модему
};
}
void parseSMS(String msg) { // Парсим SMS
String msgheader = "";
String msgbody = "";
String msgphone = "";
msg = msg.substring(msg.indexOf("+CMGR: "));
msgheader = msg.substring(0, msg.indexOf("\r")); // Выдергиваем телефон
msgbody = msg.substring(msgheader.length() + 2);
msgbody = msgbody.substring(0, msgbody.lastIndexOf("OK")); // Выдергиваем текст SMS
msgbody.trim();
int firstIndex = msgheader.indexOf("\",\"") + 3;
int secondIndex = msgheader.indexOf("\",\"", firstIndex);
msgphone = msgheader.substring(firstIndex, secondIndex);
Serial.println("Phone: " + msgphone); // Выводим номер телефона
Serial.println("Message: " + msgbody); // Выводим текст SMS
if (msgphone.length() > 6 && phones.indexOf(msgphone) > -1) { // Если телефон в белом списке, то...
setLedState(msgbody, msgphone); // ...выполняем команду
}
else {
Serial.println("Unknown phonenumber");
}
}
void setLedState (String result, String phone) {
bool correct = false; // Для оптимизации кода, переменная корректности команды
String msgToSend = "";
if (result.length() == 2) {
int ledIndex = ((String)result[0]).toInt(); // Получаем первую цифру команды - адрес устройства (1-3)
int ledState = ((String)result[1]).toInt(); // Получаем вторую цифру команды - состояние (0 - выкл, 1 - вкл)
if (ledIndex >= 1 && ledIndex <= 3 && (ledState == 0 or ledState == 1)) { // Если все нормально, исполняем команду
msgToSend = "LED:" + (String)ledIndex + " set to " + (ledState == 0 ? "OFF" : "ON"); // Статус исполнения
digitalWrite(pins[ledIndex - 1], ledState); // Исполняем команду
correct = true; // Флаг корректности команды
}
}
if (!correct) {
msgToSend = "Incorrect command: " + result; // Статус исполнения
}
Serial.println(msgToSend); // Выводим результат в терминал
}
void sendSMS(String phone, String message)
{
sendATCommand("AT+CMGS=\"" + phone + "\"", true); // Переходим в режим ввода текстового сообщения
если я правильно понял код, может происходить следующая ситуация, при возвращении с домашнюю зону, падает куча СМС, при чтении в String переполняется память, МК зависает, вы его перезагружаете, через какое то время опять приходит некая СМС, но те которые уже есть - так в памяти и остались - места не хватает.
я бы добавил:
1. WDT таймер что бы МК выводить из зависшего состояния
Повторюсь, проверьте смс на симкарте. За период между удалениями может свалиться несколько смс, которые забьют память симки. При этом у вас удаляются только прочитанные. Это добавляет шансов на забой памяти.
И добавьте задержку после команды удаления.
WDT таймер есть, я предоставила лишь кусок кода, отвечающий за обработку сообщений.
Попробую удалять все СМС после обработки, а не только прочитанные.
Сегодня наступил на собственные грабли :(
в своем первом проекте GSM (годовалой давности) не учёл что СМСмогут переполниться, периодически посылал команду delete для чистки СМС, а теперь шлю рабочую команду, а ответа нет - посчитал количество отправленных СМС - и точно - аккурат под размер буфера
теперь в выходной поеду за 80 км - вытаскивать СИМку и чистить в телефоне :(
тут на форуме периодически всплывают вопросы что такое "автомат состояний", модем и команды которые он выдает - сильно асинхронная вещь, а весь ваш взятый код с ресурса построен по принципу "отправил что то - жду команду" а в остальное время если что то надо сделать или придет другой ответ - "все пропало", работать не буду.
соотвественно если у вас проект который должен работать всегда - его однозначно надо переписывать полностью, а не брать откуда то.
Вот например (не претендую ни в коем случае на красивость и профессионализм кода) кусок моего проекта который инициализирует модем при включении, если команда отправилась - код дальше работает безотносительно ответа.
switch (submode) {
case 0: { // wait reponse first command AT
if (a6sendcmd("ATE0", "OK", "", "", true) == 1) submode = 1; // no echo
break;
}
case 1: { // wait reponse command ATE0
if (a6sendcmd("ATV1", "OK", "", "", true) == 1) submode = 2; // get text for error
break;
}
case 2: { // wait reponse command ATV1
if (a6sendcmd("AT+CMEE=2", "OK", "", "", true) == 1) submode = 3; // get full text error
break;
}
case 3: { // wait reponse command cmee
if (a6sendcmd("AT+CLIP=1", "OK", "", "", true) == 1) submode = 4; // on aon
break;
}
case 4: { // wait reponse command clip
if (a6sendcmd("ATS0=3", "OK", "", "", true) == 1) submode = 5; // 3 ring
break;
}
case 5: { // wait reponse command ats
unsigned long delp = millis(); while ((millis() - delp) <= 30000); //delay for registration
if (a6sendcmd("AT+CREG?", "+CREG: 1,1", "OK", "", true) == 1) submode = 6; // true registration
//if (a6sendcmd("AT+CREG?", "OK", "", "", true) == 1) submode = 6; // registration
break;
}
case 6: { // wait registration
if (a6sendcmd("AT+CMGF=0", "OK", "", "", true) == 1) submode = 7; // mode SMS = PDU
break;
}
case 7: { // wait mode sms
if (a6sendcmd("AT+CMGD=1,4", "OK", "", "", true) == 1) submode = 8; // delete all sms
break;
}
case 8: { // wait del sms
if (a6sendcmd("AT+COPS?", "+COPS:", "OK", "", true) == 1) submode = 9; // load operator data
break;
}
case 9: { // decode operator data
a6getopsname(OPSname, OPSbalance);
resetModeAndClearRespBuf(); // init ok
digitalWrite(LED_BUILTIN, HIGH);
SendByteToLCD(32, true);
SendByteToLCD(223, false);
SendByteToLCD(32, true);
SendByteToLCD(226, false);
SendByteToLCD(32, true);
SendByteToLCD(241, false);
SendByteToLCD(229, false);
SendByteToLCD(242, false);
SendByteToLCD(232, false);
SendByteToLCD(32, true);
SendByteToLCD('!', true);
SendByteToLCD(32, true);
wdt_enable(WDTO_8S);
break;
}
}
break;
Так получилось, что я тоже сейчас работаю с SIM800 и поэтому забрел сюда.
Анди, скажите, пожалуйста, почему вы так считаете?
Andy пишет:
говнокод, взятый отсюда, ничего удивительного, что не работает.
Мне лично статьи понравились. Человек что то сделал, у него работает. Он не зажал скетч, не стал умничать на форуме, а выложил его на всеобщее обозрение, за что ему спасибо!
Понятно, что проще критиковать, но если есть реальные основания так считать, то поделитесь со всеми. Что именно вам не понравилось? Выложите свои примеры работы с модулем.
Только учусь. Хочу сделать устройство для получения данных с авто, температуры и напряжения и тд.
подскажите идею пожалуйсто
есть функция
как обойтись без этой кучи delay ? неужели городить огород с милес? у меня почемуто даже не складывается все в голове...
может делал кто такое?
как обойтись без этой кучи delay ? неужели городить огород с милес? у меня почемуто даже не складывается все в голове...
может делал кто такое?
Типичная проблема. Вот, например, почитайте эту тему. Особенно второе сообщение (под номером #1) - описан именно ваш случай
http://arduino.ru/forum/programmirovanie/kak-proverit-knopku-ne-vykhodya-iz-tsikla#comment-288846
Спасибо конечно за ответ, перечитал почти всю вашу тему, но это совсем не то что мне требуется, у вас делей при котором выполняется еще мелкая задача. Я вот думаю вынести эту функцию в луп разбить ее на 3 части, и запускать ее по значению переменной типа интегер. И каждая часть записывает время в милис.
Завтра попробую что-то написать, выложу на обсуждение )))
Вот только не знаю как быть с очередью сообщений, к примеру одно смс в процессе отправки а тут поступает второе смс...
Вы описываете метод конечных автоматов. Это стандартный подход, много где опмисан, примеров использования полно. Тот же "блинк без делей" - это тоже оно.
В моей теме я хотел сделать что-то более удобное для задач. которые трудно разбить на независимые части.
Можно, к примеру, не пытаться анализировать поступающие СМС сразу - вместо этого настроить в модеме сохранение пришедших СМС в память или на СИМкарту, а анализировать потом, когда не будет срочных задач.
спасибо почитаю сейчас про метод конечных автоматов))0
я извиняюсь чуть чуть не так написал, к примеру одно смс в процессе отправки а тут к примеру срабатывает сигнализация и нужно отправлять вторую смс. а функция отправки еще занята ....
вот в чем загвостка у меня,
а с приходящими смс проблем не вижу, думаю тот же Serial будет хранить смс-ку пока ее не прочитаю
а с приходящими смс проблем не вижу, думаю тот же Serial будет хранить смс-ку пока ее не прочитаю
не будет, там буфер всего 64 байта, даже одна СМС со служебной информацией не поместится - это при условии, что модем не выдаст каких-то других сообщений
да вы правы, не поместиться и буфер сильно не увеличешь...
значит нужно читать все вовремя, и следовательно убирать все delay....
я вот нашел ветку с решением не блокирующей отправки смс, теперь тут мне стало все понятно как делать.... http://arduino.ru/forum/programmirovanie/novichkam-avtomatnoe-programmirovanie-mikrokontrollerov
а вот как все таки быть с очередью на отправку смс?
пока писал пост пришла идея такая, функция bool SendSMS (String & text), возвращает флаг отправлено ли смс, в месте где отправляется смс ставлю условие и еще один флаг к примеру bool Send=true, и ставлю условие которое будет выполнятся с отправкой смс пока SendSMS не вернет флаг что смс отправлено, и как только это случилось меняю Send =!Send и больше такое смс не отправится....
думаю както так))) писал в основном для себя)))
накидал я все таки сегодня функцию неблокирующую без делай. но пока не проверял. Выставляю на конструктивную критику...
что скажите коллеги?
П.С. писал в блокноте пока не проверял...
все ошибки исправил осталось в работе проверить
Кто сталкивался с проблемой плохого контакта сим карты? В машине часто теряется связь.
Может проблема не в сим карте, а в антенне?
Baks, а в чем суть функции?
Антенна штатная, сигнал всегда хороший. Попробую на клоей посадить сим-карту.
Еще вопрос по поводу Reseta SIM800 когда перестает отвечать на команды.
Можно ли сбрасывать подава на D5 уровень LOW
Можно, только кратковременно.
Касательно симки - там проблема может быть не в самой карте, а в модуле, у него часто непропаяные контакты попадаются. Я свои пропаивал, тоже проблема была со связью.
Как Вы их пропаяли? Резистор на VCC нужен?
Контакты сим модуля, по которым у Вас проходит черная линия, паяльником пропаял. Просто жалом прижимаем контакт, чтобы припой расплавился и отпускаем. У меня два контакта вообще не припаяны были.
Спасибо. Посмотрю.
Так если я на D5 подам уровень LOW, SIM 800 перезагрузится и мне нужно LOW заменить на HIGH, на пине будет 5 вольт
Вот так?
Или так лучше?
Ничего не надо, подключать reset напрямую к меге. Входу reset 5V не критичны. Если очень хочется перестраховаться, то можно ногу программировать как выход LOW для сброса, и как вход после.
Ничего не надо, подключать reset напрямую к меге.
вы бы для начала выяснили, какой ток пойдет через пин при ресете модема. Например, на модеме А6 ресет сливает в GND вполне взрослые 60-70мА. так что подключать напрямую - плохой совет
Плохой совет - это гадать. Надо читать документацию. Сбрасываю SIM800 прямо выводом atmega328p и stm32f103. Для особо сомневающихся могу уровень "нуля" померить...
Вот и почитали бы, вместо того чтоб "на авось" советовать. Уровень нуля там мерить бесполезно - лучше померьте ток при замыкании ресета на "землю"
Ток там ~2,69 мА
Еще вопрос по питанию:
Нужен ли такой "фильтр" на питание?
Ничего не надо, подключать reset напрямую к меге.
Может резистор на 1 кОм добавить...?
b707, купи себе SIM800 и потом приходи с советами, а сейчас иди лесом.
Снова здравствуйте.
Питание ардуино и SIM800, как я рисовала выше, осуществляется спомощью двух модулей* питания:
LM2596
И второй
На обеих модулях написано что держат 3 Ампера.
Всё это дело стоит в машине (сделано на печатной плате отличного качества)
Езжу по своему городу - всё работает. Уезжаю в соседнюю область (соответственно роуминг, дорогой местами может пропадать сеть) модуль перестает отвечать на смс, при этом (когда открываю корпус куда все это дело установлено) модуль кажет что сеть есть.
В чём может быть дело?
А роуминг на симке подключен?
Абоненты Tele2 остаются на связи во всех регионах России. Для вашего удобства оператор предусмотрел единую тарификацию вызовов и мобильного интернета в роуминге по всей России.
При возвращении в свою область смски не принимает
При возвращении в свою область смски не принимает
а после перезагрузки устройства - принимает СМС?
после обработки СМС вы их чистите в модуле?
Все прочитанные смс-ки удаляюся.
Перезагрузка помогает.
Возможно, что при неоднократном пересечении границы роуминга приходит несколько смс, но если сим карта при этом вне зоны действия, то они накапливаются на строне оператора, а потом приходят кучей, которые забивают внутреннюю память симки. Добавьте в код чистку смс после каждого получения.
Проверить, чистятся ли смс просто - после очередного затыка достаете симку, ничего при этом с модулем не делая, и вставляете в телефон. И смотрите смс на симке. Наверняка они там будут.
Проект сделан на основании этого скетча, все смс-ки удаляюся каждые три минуты.
если я правильно понял код, может происходить следующая ситуация, при возвращении с домашнюю зону, падает куча СМС, при чтении в String переполняется память, МК зависает, вы его перезагружаете, через какое то время опять приходит некая СМС, но те которые уже есть - так в памяти и остались - места не хватает.
я бы добавил:
1. WDT таймер что бы МК выводить из зависшего состояния
2. читать все СМС а не не только UNREAD
3. удалять все СМС после обработки
Повторюсь, проверьте смс на симкарте. За период между удалениями может свалиться несколько смс, которые забьют память симки. При этом у вас удаляются только прочитанные. Это добавляет шансов на забой памяти.
И добавьте задержку после команды удаления.
WDT таймер есть, я предоставила лишь кусок кода, отвечающий за обработку сообщений.
Попробую удалять все СМС после обработки, а не только прочитанные.
WDT таймер есть, я предоставила лишь кусок кода, отвечающий за обработку сообщений.
Попробую удалять все СМС после обработки, а не только прочитанные.
Сегодня наступил на собственные грабли :(
в своем первом проекте GSM (годовалой давности) не учёл что СМСмогут переполниться, периодически посылал команду delete для чистки СМС, а теперь шлю рабочую команду, а ответа нет - посчитал количество отправленных СМС - и точно - аккурат под размер буфера
теперь в выходной поеду за 80 км - вытаскивать СИМку и чистить в телефоне :(
Заменила "DEL UNREAD" на "DEL ALL"
Проверила, сообщения с сим-карты удаляются.
И если бы ардуина зависала, WDT сработал, и при перезагрузке все сообщения удаляютсяв сетапе
Для чего нужна задержка, если следуюущая команда не выполнится, пока не будет ответа от первой?
Для чего нужна задержка, если следуюущая команда не выполнится, пока не будет ответа от первой?
а вдруг это ответ от вчерашней команды :)
хотелось бы весь код скетча видеть.
да и STring использовать с одной стороны удобно, но уж очень он памяти много кушает.
Можно конкретнее про код, что не так??
хотелось бы весь код скетча видеть.
В код добавлена лишь функции выполнения команд в зависимости от полученного сообщения.
Можно конкретнее про код, что не так??
Понимаете ли...все не так в проекте :(
тут на форуме периодически всплывают вопросы что такое "автомат состояний", модем и команды которые он выдает - сильно асинхронная вещь, а весь ваш взятый код с ресурса построен по принципу "отправил что то - жду команду" а в остальное время если что то надо сделать или придет другой ответ - "все пропало", работать не буду.
соотвественно если у вас проект который должен работать всегда - его однозначно надо переписывать полностью, а не брать откуда то.
Вот например (не претендую ни в коем случае на красивость и профессионализм кода) кусок моего проекта который инициализирует модем при включении, если команда отправилась - код дальше работает безотносительно ответа.
Всем привет!
Так получилось, что я тоже сейчас работаю с SIM800 и поэтому забрел сюда.
Анди, скажите, пожалуйста, почему вы так считаете?
говнокод, взятый отсюда, ничего удивительного, что не работает.
Мне лично статьи понравились. Человек что то сделал, у него работает. Он не зажал скетч, не стал умничать на форуме, а выложил его на всеобщее обозрение, за что ему спасибо!
Понятно, что проще критиковать, но если есть реальные основания так считать, то поделитесь со всеми. Что именно вам не понравилось? Выложите свои примеры работы с модулем.