Что то я туплю, а как текст смс то спарсить? в терминале всё ок, а в переменную не попадает оно? что за х?
Я не парсил, мне не нужно, но выше был пример. По идее, ничем не отличается от парсинга любой другой строки в сериале- записываем каждый символ в переменную и ее сравниваем с необходимой. Собственно в твоем же коде, вроде как, все верно, но, как мне кажется, не хватает момента, когда выходить из чтения, а то такое впечатление, что str будет бесконечно читаться.. Но могу и ошибаться :)
Немного измененный первоначальный вариант моего примера:
while (Serial.available())
{
delay(10);
if (Serial.available() >0)
{
char c = Serial.read(); //gets one byte from serial buffer
if (c == '"')
{
break;
} //breaks out of capture loop to print readstring
readString += c;
} //makes the string readString
}
if (readString.length() >0)
{
if(readString.indexOf("123")>=0||readString.indexOf("321")>=0) //если позвонили с этих номеров
{
delay(2000);
Serial.println("ATH");
delay(2000);
digitalWrite(Relay, LOW); //включаем реле
readString=""; //clears variable for new input
}
По звонку с одного из двух номеров включает реле. Работает, но не уверен что именно так, как должен, т.к. кроме звонка больше ничего не могу сделать пока :) (смс, собака, не отправляется..)
void smsSend(char tel[], String text){
mySerial.println(F("AT+CMGF=1"));//текстовый режим
delay(100);
mySerial.print("AT+CMGS=\"");//начало отправки смс
mySerial.print(tel);
mySerial.print(char(34));
mySerial.write(0x0D);//без этой строки не работает, что означает эта строка?
delay(100);
mySerial.print(text);
delay(100);
mySerial.println(char(26));
delay(100);
mySerial.flush();
}
Перенёс установку текстового режима сюда, т.к. он не устанавливается почему то в сетапе ERROR:304. Наверное не на своём месте.
У меня выдает "1,1", по идее должен выдать именно так, вроде бы по мануалу просто "1" это готов, "1,1"- готов и подключен к сети. Хотя для установки текстового режима должно быть достаточно просто быть готовым..
Столкнулся с какой то ерундой, не могу ее победить никак, вот в этом куске:
if (val.length() == (chekPoint + 12)) {
for (int i = 0; i < 12; i++) {
backNum[i] = val.charAt(chekPoint + i);
}
}
в конец массива backNum попадает мусор, хотя массив заполнен на всю длину, но в софт терминал выплёвывает с мусором и модуль на него ругается CMS ERROR: 520 Invalid character in text то CMS ERROR: 500 Unknown error
char backNum[12];
void smsSend(char tel[12], String text){
при чём, вроде как работало до какого то момента, но я этот кусок не трогал.
Вот целеком
#include <OneWire.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
OneWire ds(2);
int chekPoint = 99;
float celsius = 0;
long dsDelay = 0;
long pirDelay = 0;
char backNum[12];
char trueNum[] = "+79ххххххххх";
String val = "";
boolean ok = false;
boolean pir = true;
boolean sms = true;
String str = "";
void setup() {
pinMode(8, OUTPUT);
pinMode(4, INPUT);
digitalWrite(8, HIGH);
Serial.begin(9600);
do {
mySerial.begin(115200);
delay(100);
mySerial.println(F("ATZ+IPR=9600"));
delay(500);
mySerial.end();
delay(100);
mySerial.begin(9600);
delay(100);
mySerial.println(F("ATE 0"));//отключаем эхо
delay(100);
mySerial.println(F("AT+CNMI=2,2"));
delay(100);
mySerial.println(F("AT"));
delay(100);
str = "";
while (mySerial.available())
{
char ch = mySerial.read();
str += ch;
delay(10);
}
if (str.indexOf(F("OK")) > -1) {
ok = true;
Serial.println("IPR:9600 OK");
}
else {
mySerial.end(); delay(500); ok = false;
Serial.println("IPR not 9600");
}
} while (!ok);
delay(5000);
smsSend(trueNum, "System started");
}
void loop() {
if (millis() == 0)pirDelay = 0;
if (millis() - pirDelay > 300000) {
pirDelay = millis();
pir = true;
}
///меряем температуру
if (millis() == 0)dsDelay = 0;
if (millis() - dsDelay > 600000) {
dsDelay = millis();
DS();
}
///если что то пришло, читаем
if (mySerial.available()) {
char ch = mySerial.read();
val += ch;
Serial.write(ch);
}
if(pir == true){
while(digitalRead(4) == HIGH && sms == true){
pir = false;
//smsSend(trueNum, "Proniknovenie v dom!!!");
break;
}
}
///ждём смс с запросом температуры"t?"
if (val.indexOf("t?") > -1 && trueNum == backNum) {
smsSend(backNum, "Temperatura: " + String(celsius) + "C");
val="";
}
if (val.indexOf("pir off") > -1 && trueNum == backNum) {
smsSend(backNum, "datchik dvigheniya otkluchen");
sms = false;
}
if (val.indexOf("pir on") > -1 && trueNum == backNum) {
smsSend(backNum, "datchik dvigheniya vkluchen");
sms = true;
}
if (val.indexOf("+CREG:") > -1) {
delay(200);
mySerial.println(F("AT+CMGF=1"));///устанавливаем текстовый режим
val = "";
}
///ищем +79 и запоминаем где
if (val.indexOf("+79") > -1 && chekPoint == 99) {
chekPoint = val.length();
chekPoint -= 3;
}
/// считываем номер телефона входящего смс
if (val.length() == (chekPoint + 12)) {
for (int i = 0; i < 12; i++) {
backNum[i] = val.charAt(chekPoint + i);
}
Serial.println(backNum);
}
}
void smsSend(char tel[12], String text){
mySerial.print("AT+CMGS=\"");//начало отправки смс
mySerial.print(tel);
//mySerial.print(char(34));
mySerial.write(0x0D);//без этой строки не работает, что означает эта строка?
delay(100);
mySerial.print(text);
delay(100);
mySerial.println(char(26));
delay(100);
mySerial.flush();
}
Вряд ли он, что то жрёт, но логика подсказывает, что стоит воткнуть резюк иль оптопару, я не стал заморачиватся, вообще он у меня питается напрямую от +5, стабилизатор вроде не греется, всё отсылает и присылает.
Вряд ли он, что то жрёт, но логика подсказывает, что стоит воткнуть резюк иль оптопару, я не стал заморачиватся, вообще он у меня питается напрямую от +5, стабилизатор вроде не греется, всё отсылает и присылает.
Сам модуль у меня тоже питается от внешнего БП совместно с ардуиной. По сути, ничего не должно случиться :) так-то включение происходит замыканием пина кнопки на пин +5 на самом модуле..
>> Так проблема не в том, каким способом перезапустить модуль (землей по ресету или 5В на PWK), а в том как это организовать. Напрямую с ардуины нельзя - потребление на обоих выводах модуля больше номинального на выходах ардуины - могут выгореть.
flyback, откуда информация про потребление пина power key?
у меня a6 отлично включается этим пином, подключён напрямую к пину ардуины.
у меня бывает такое когда сразу после отключения, включаешь, нужно подождать пру секунд перед повторным включением.
Да, 1 в 1, пробовал прям весь код, только, конечно же, без считывания температуры и прочего :)
Попробую altsoft..
Я на альт перелез от того что со временем буфер рассыпается и читать его головняк, а начальный сетап работает нормально, правда с второго третьего захода но работает и на софтвар сериал, мож где проводянки?
Я на альт перелез от того что со временем буфер рассыпается и читать его головняк, а начальный сетап работает нормально, правда с второго третьего захода но работает и на софтвар сериал, мож где проводянки?
Да уже хз что с ним, заказал еще один модуль, и, вроде как, даст знакомый потестить а800, на праздниках поковыряюсь, может..
Я на альт перелез от того что со временем буфер рассыпается и читать его головняк, а начальный сетап работает нормально, правда с второго третьего захода но работает и на софтвар сериал, мож где проводянки?
Да уже хз что с ним, заказал еще один модуль, и, вроде как, даст знакомый потестить а800, на праздниках поковыряюсь, может..
Ну смотри, ну у меня поделка получилась, мужику на дачу охранка, на альте переделал код полностью, если хочешь скину. Кста работало от усб, норм, воткнул блок питания пару смс и встаёт, сменил блок питания заработало. Модуль рабочий, когда отладку делал, всё сразу паял иначе съэкономишь 5 минут на пайке потратишь 2 часа при отладке.
Ну смотри, ну у меня поделка получилась, мужику на дачу охранка, на альте переделал код полностью, если хочешь скину. Кста работало от усб, норм, воткнул блок питания пару смс и встаёт, сменил блок питания заработало. Модуль рабочий, когда отладку делал, всё сразу паял иначе съэкономишь 5 минут на пайке потратишь 2 часа при отладке.
Да, скинь, пожалуйста.
Ща домой заберу, запитаю все от 12В БП, на модуль понижайкой 5В подам, посмотрю что будет.. Я спаял, теперь распаивать пришлось :) впаял теперь провода для макетки, так удобнее собирать-разбирать, потом уже спаяю с двух сторон..
Попытался использовать кусок Вашего скетча по поводу проверки правильной загрузки GSM-модуля. Вот что получилось:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
int ch = 0;
String str = "";
String val = "";
boolean ok=false;
#define MASTER "+790********" //укажите телефон хозяина
void setup()
{
do{
Serial.begin(9600); //подключаем порт компьютера
Serial.println("naladka GSM");
mySerial.begin(115200); //подключаем порт модема (при других скоростях не отвечает)
delay(100);
mySerial.println("ATZ0");
delay(100);
mySerial.println("ATZ+IPR=9600");
delay(100);
mySerial.end();
delay(100);
mySerial.begin(9600);
delay(100);
mySerial.println("ATI"); //вывести в терминал иноформацию о модеме
delay(100);
mySerial.println("AT+CSQ"); //вывести в терминал уровень сигнала (если 99, то связи нет)
delay(100);
mySerial.println("AT+CLIP=1"); //включаем АОН
delay(100);
mySerial.println("AT+CMGF=1"); //режим кодировки СМС - обычный (для англ.)
delay(100);
mySerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста
delay(100);
mySerial.println("AT+CNMI=2,2"); //отображение смс в терминале сразу после приема (без этого сообщения молча падают в память)
delay(100);
mySerial.println("AT+CMGD=1,4"); //удаляем все сообщения из памяти, которые были до включения модема
delay(100);
mySerial.println(F("AT"));
delay(200);
str = "";
while (mySerial.available())
{
char ch = mySerial.read();
str += ch;
delay(5);
}
if (str.indexOf(F("OK")) > -1) {
ok = true;
Serial.println("IPR:9600 OK");
}
else {
mySerial.end(); delay(500); ok = false;
Serial.println("IPR not 9600");
}
}
while (!ok);
delay(5000);
}
void loop()
{
if (mySerial.available()) { //есть данные от GSM модуля
delay(200); //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
while (mySerial.available()) { //сохраняем входную строку в переменную val
ch = mySerial.read();
val += char(ch);
delay(10);
}
Serial.println(val); // дублируем сообщение в терминал
//----------------------- определение факта приема СМС и сравнение номера(ов) с заданным(и)
if (val.indexOf("+CMT") > -1 && val.indexOf(MASTER) > -1 && val.indexOf("sendme") > -1)
{
sms("da", MASTER); // отвечаем смской
val = "";
mySerial.println("AT+CMGD=15"); //удаляем 15тое сообщение после каждого получения смс. Получается мы в памяти храним постоянно 14 входящих смс
}
}
}
void sms(String text, String phone) //процедура отправки СМС
{
Serial.println("SMS send started");
mySerial.println("AT+CMGS=\"" + phone + "\"");
delay(500);
mySerial.println(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println("SMS send complete");
delay(2000);
}
Но при этом в мониторе порта не выводится текст сообщения и соответсвенно поэтому в ответ модуль не шлет смс. В чем может быть загвоздка? (кол-во смс на симке врое не должно быть переполнено, чистка смс лишних производится, строка "AT+CNMI=2,2" тоже имеется)
Delay после присвоения переменой ch не даёт читать СМС строка 67, но всё равно на софтвар сериал криво работает.
После переполнения СМС, счётчик идёт по новой, 200 штук вроде всего.
Решил сделать через альтсериал, но возникла проблема:
Не работает основная строка (определяющая чей номер, наш ли текст смс), до этого момента модуль работает стабильно (грузится пока не получит ОК от команды АТ, переходит стабильно на скорость 9600 и, следовательно, смс получает правильно).
Также при компиляции выходит "ошибка" (вернее замечание, т. к эта "ошибка" дает работать и прошивать ардуинке. Но, видимо, именно эта "ошибка" и не дает до конца грамотно работать программе. Самое интересное, что не показывается в какой строке эта "ошибка" и не понятно где нужно подправить тип данных):
/Users/admin/Documents/Arduino/_2017/_2017.ino:8:1: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
};
^
Подскажите, пожалуйста, в чем может быть недочет (скетч прикрепляю ниже)?
#include <AltSoftSerial.h> //8,9 rx,tx
const int nN = 1;///количество номеров////////////////////////////////////////////////////////////////////
char* trueNum[] = {
"+79*********"//,//1
//"+7919209хххх" //2
};
const char* Name[] = {
"Privet, "//,
//"Petya, "
};
int x=5;
String val = "";
String str = "";
boolean ok = false;
AltSoftSerial altSerial;
void setup() {
Serial.begin(9600);
do {
altSerial.begin(115200);
delay(200);
altSerial.println(F("ATZ+IPR=9600"));
delay(500);
altSerial.end();
delay(200);
altSerial.begin(9600);
delay(200);
altSerial.println(F("ATE 0"));//отключаем эхо
/////////////////////
//delay(200);
//altSerial.println(F("AT+CNMI=2,2"));
//////////////////////
delay(200);
altSerial.println(F("AT"));
delay(200);
str = "";
while (altSerial.available())
{
char ch = altSerial.read();
str += ch;
delay(5);
}
if (str.indexOf(F("OK")) > -1) {
ok = true;
Serial.println("IPR:9600 OK");
}
else {
altSerial.end(); delay(500); ok = false;
Serial.println("IPR not 9600");
}
} while (ok==false);
delay(5000);
///////////////////////////////////
altSerial.println(F("AT+CNMI=2,2"));
delay(200);
altSerial.println(F("AT+CMGF=1"));
delay(300);
////////////////////////////////////
}
void loop() {
///если что то пришло, читаем
if (altSerial.available()) {
delay(5);
char ch = altSerial.read();
val += char(ch);
Serial.write(ch); // до этого момента работает все прекрасно!
}
//далее текст "наше смс" и значение переменной val ="sendme" не выводиятся в монитор порта, видимо, в этом куске программы что-то не так...
for (int i = 0; i < nN; i++) {
if (val.indexOf(trueNum[i]) > -1 && val.indexOf("+CMT") > -1 && val.indexOf("sendme") > -1) {
Serial.write("nashe sms");
Serial.println(val);
smsSend(trueNum[i], String(Name[i]) + "chislo x= " + String(x));
}
}
val = "";
}
void smsSend(char tel[12], String text){
altSerial.print("AT+CMGS=\"");
delay(200);
for(int i = 0; i < 12; i++)altSerial.write(tel[i]);
delay(300);
altSerial.print(char(34));
delay(200);
altSerial.write(0x0D);
delay(100);
altSerial.print(text);
delay(300);
altSerial.println(char(26));
delay(50);
}
в 77й строке val.indexOf("+CMT") > -1 это определение поступило смс или звонок.
А зачем? у вас переменная val всегда пустая, до того момента пока, что то не посыпется из сериала, вот тут ваша задача отловить то что нужно, выполнить что вам нужно и очистить переменную. Вы отлавливаете то, что и так явно, добавляя геммороя в код.
Короче я тоже являюсь обладателем 2-х SIM800L и одного A6. Вот, что нарыл.
1. Модули серии SIM800 являются самыми оптимальными модулями, содержащими возможность работы по 4-м частотам, Блютуз, да и очень расширенный перечень команд, полезный определенным программистам.
Минусы: очень требователен к питанию, и самое главное, очень нужен преобразователь уровней. Вероятно из-за отсутствия последнего я подпалил все же оба модуля и сейчас заказал еще один для тестов. Плюс обнаружил, что в серии 800L не работает команда AT+CPOWD=1, что на одном, что на втором выдает ошибку. Есть подозрение, что символ L обозначает Light, обрезок одним словом, и часть команд по общему перечню, предназначенному для полновесной версии, просто не работает. Но и есть положительные стороны, в отличии от A6: это возможнотсь воспроизведения аудиофайлов, загруженных в сам модуль в расширении ARM, а модуль сам сожет декодировать DTMF сигналы без всяких обвязок. Я нормально цеплял оба своих через преобразователь, включал декодирование командой AT+DDET=1 и нормально получал ответы в цвет. Без ошибок.
2. Модули серии A6 нихера не могут декодировать DTMF сигналы, не могут воспроизводить аудиофайлы. В описании и на практике я опробовал единственно возможную комманду - воспроизведение DTMF сигналов. Да работает, но кому это нужно. Более того, я на модулях SIM800L нормально могу отправлять и принимать смс сообщения на русском языке, используя таблицу в режиме UCS2. И прием и отправка. Но к сожалению, А6 так не может. Даже в описании команд, на команду AT+CSCS есть такая сноска: This command is used to read and write phonebook entries. SMS doesn’t effected by this command. Т.е. для работы с телефоном как бы нормально, про сообщения можете забыть. Таким образом для себя я выбрал следующее:
Если тебе нужен модуль для построения простого устройства типа сигнализации, задача которой оповестить тебя о проникновении или срабатывании какого нибудь датчика, плюс тебе хватает прием или отсылка команд в виде цифр или сообщения на Английском языке, плюс тебе важен заниженных показатель потребляемости питания то модуль А6 ТВОЙ.
Если тебе нужно, как я описывал выше, принимать смс или отсылать команды на Ардуинку на русском, управлять Ардуинкой DTMF командами, возможно услышать аудиофайл типа: "Ваш голос важен для нас, не отключайтесь" или "Для приготовления пиццы нажмите 1, для самоуничтожения нажмите 2" и потребляемость по питанию не важно, хотя разница и не большая, то нужно брать только 800 серию, причем желательно обычный SIM800 в корпусе SMT с боковыми контактами. Он крупнее. Можно и припаять и обвязать. И он будет работать по всему перечню комманд и еще есть Блютуз, кому надо.
Его усовершенствованная копия только в меньшем размере SIM800C. Все тоже самое + добавлена функция Embedded AT + Блютуз но еще и маленький. Для реализации на плате удобней, но и паять трудней.
Для дополнительной информации, модули серии 800 являются новее серии 900, как бы это не было странным. И действительно, по всем проблемам молуля SIM800L мы не сможем найти ответов, т.к. даже на сайте MT-System этого модуля нет. Почему? Х.з. Однако если почитать описание модуля SIM800H то в описании идет полное сравнение 800H с 800L. http://www.mt-system.ru/documentation/polnoe-opisanie-sim800h
Чисто теоретически, почитав описания, я как бы понял, что версия 800L это копия 800H только без Блютуз.
Благодарствую, очень обстоятельно. Помимо прочего меня интересует такой аспект, как передача данных. Насколько я понял, в A6 по дефолту не всё гладко с POST-запросами, для этого есть отдельная либа. Еще упоминались какие-то проблемы с dns lookup, впрочем последнее под вопросом. У SIM800, в свою очередь, есть максимальное ограничение на длину URL - 64 символа.
Ну и фиксированная скорость порта в A6 заставляет использовать только аппаратный UART, тогда как SIM800 можно посадить и на программные пины.
Указать свой IMEI, я так понимаю, на обоих модулях можно без проблем? Интересует в плане использования планшетных тарифов с бесплатной квотой трафика.
К сожалению товарищ гонять модуль именно в этом направлении мне не приходиться. Задача немного другая. И опять таки, повторюсь, для SIM800 КАТЕГОРИЧЕСКИ обязателен преобразователь уровней 5-3В. Именно прямое подключение к Ардуино помогло моим обоим модулям немного подгореть, но хитро. Описываю:
Два модуля абсолютно идентичны SIM800L. Так вот, оба, по очереди, были протестированы на профпригодность, после того как я их получил по почте, я отписался продавцу что все ок. Начал плотно сидеть на одном и гонять его по полной (в рамках моих потребностей). Спустя какое то время начались глюки и небольшие сбои. Частично перестал прогружать команды, на некоторые начал давать ERROR. Когда дошел до потребности прогрузить AT+CPOWD=1 в ответ получил ERROR. Прогружаю AT+CREC? в ответ ERROR. Ну дамаю очень лайтовый модем. Подключаю второй и опа, команда AT+CREC? прогрузилась, причем в этом направлении его сейчас начанаю гонять, но только через преобразователь, а вот AT+CPOWD так же дает ERROR, Причем если включить отчет об ошибках AT+CMEE=0, вместо ERROR начинает писать Неизвестная команда. Плюс начались глюки с поиском сети. Очень долго ищет сеть частым миганием светодиода при включении. А когда нашел и перешел на редкое мигание то по долгу дозвониться на модем не получается. Типа абонент не доступен. Если бы эти проблемы были в самом начале, я бы решил что модемы битые с Китая пришли. Но они начались после прямого подключения.
Еще хотелось бы добавить, что у А6 действительно очень хорошая чувствительность у микрофона. Если сделать небольшу прослушку и позвонить на модем с автоподнятием трубки то множно услышать как таракан ползет на противоположной стороне большой комнаты. Это офигенно. Но после этого я подключил этот же микрофон к более подгорелому 800L, услышал сильные шумы, невнятная речь, короче очень неочень. Сейчас буду цеплять микрофон к тому, что по живее, отпишусь.
Подцепил к полуживому, микрофон работает лучше, чем на первом. Но по прежнему получается дозвониться раз на 5-6й. Причем плюс еще он сам как то перезагружается. И это при том, что уровень сигнала 12. Короче им каюк, жду новый.
Модуль подвисает периодически. Работал часа два-три и после этого уже не отправлял ответные смс. С телефона до модуля смс доходит (в телефоне пишет смс доставлено, на ардуинке в момент отправки смс перемигивается светодиод). Приходится перезагружать ардуино/gsm-модуль... После перезагрузки начинает работать некоторое время стабильно, после чего опять зависает через некоторое время.
В итоге, решив проблему со скоростью обмена через "altserial", вышла еще одна серьезная проблема стабильности работы (ранее уже в этой ветке писали о подобной проблеме)...
Видимо, придется искать другой более стабильно работающий gsm-модуль.
Модуль подвисает периодически. Работал часа два-три и после этого уже не отправлял ответные смс. С телефона до модуля смс доходит (в телефоне пишет смс доставлено, на ардуинке в момент отправки смс перемигивается светодиод). Приходится перезагружать ардуино/gsm-модуль... После перезагрузки начинает работать некоторое время стабильно, после чего опять зависает через некоторое время.
В итоге, решив проблему со скоростью обмена через "altserial", вышла еще одна серьезная проблема стабильности работы (ранее уже в этой ветке писали о подобной проблеме)...
Видимо, придется искать другой более стабильно работающий gsm-модуль.
подтверждаю, если его посадить на 0, 1 он будет так же виснуть? Мне кажется, что просто мы не умеем его готовить. А возможно, что он уходит в какой то sleep mode?
F для размещения строки во флэш-памяти (чтоб RAM не отжирать строками).
Спасибо :)
Sergy1222
Что то я туплю, а как текст смс то спарсить? в терминале всё ок, а в переменную не попадает оно? что за х?
Что то я туплю, а как текст смс то спарсить? в терминале всё ок, а в переменную не попадает оно? что за х?
Я не парсил, мне не нужно, но выше был пример. По идее, ничем не отличается от парсинга любой другой строки в сериале- записываем каждый символ в переменную и ее сравниваем с необходимой. Собственно в твоем же коде, вроде как, все верно, но, как мне кажется, не хватает момента, когда выходить из чтения, а то такое впечатление, что str будет бесконечно читаться.. Но могу и ошибаться :)
Немного измененный первоначальный вариант моего примера:
По звонку с одного из двух номеров включает реле. Работает, но не уверен что именно так, как должен, т.к. кроме звонка больше ничего не могу сделать пока :) (смс, собака, не отправляется..)
Разобрался, вы всё правильно делали, только там один делэй жизнь портит
функция отправки смс
Перенёс установку текстового режима сюда, т.к. он не устанавливается почему то в сетапе ERROR:304. Наверное не на своём месте.
а так всё работает как часики. Спасибо вам! :)
Перенёс установку текстового режима сюда, т.к. он не устанавливается почему то в сетапе ERROR:304. Наверное не на своём месте.
а так всё работает как часики. Спасибо вам! :)
Нужно переключать режим после инициализации модема.
Как то так:
+CREG: 1 это последнее что он выплёвывает, вот после этого и можно включать текстовый режим.
скетч с отправкой на номер запроса и процедура отправки смс
процедуру DS не буду выкладывать она есть в стандартных примерах, тем более моя порезанная для моего датчика.
Блин мне бы это день сэкономило :(
Большое всем спасибо участникам ветки!!!
Кстати +CREG:<num> зависит от сети, у меня мегафон "1", лучше изменить кусок на:
У меня выдает "1,1", по идее должен выдать именно так, вроде бы по мануалу просто "1" это готов, "1,1"- готов и подключен к сети. Хотя для установки текстового режима должно быть достаточно просто быть готовым..
В слюбом случае спасибо за скетч :)
Кстати +CREG:<num> зависит от сети, у меня мегафон "1", лучше изменить кусок на:
"1" это состояние
выдержка(правда сим900. формат выдачи отличается, но смысл тот же):
AT+CREG? — получить тип регистрации в сети.
Вернется что-то вроде +CREG: 0,1
Где:
0, — нет сообщения о смене регистрации в сети.
1, — текущее состояние.
У меня возвращает один параметр +CREG: 1 это в А6, это при инициализации модема при запросе:
AT+CREG? +CREG:0,1 OK <参考URC: +CREG> <Note :..> Query the register status of the local and network
не суть, нужно посмотреть что последнее плюёт модем в сериал и после этого переключать текстовый режим.
Столкнулся с какой то ерундой, не могу ее победить никак, вот в этом куске:
в конец массива backNum попадает мусор, хотя массив заполнен на всю длину, но в софт терминал выплёвывает с мусором и модуль на него ругается CMS ERROR: 520 Invalid character in text то CMS ERROR: 500 Unknown error
при чём, вроде как работало до какого то момента, но я этот кусок не трогал.
Вот целеком
По поводу этого поста, походу софт сериал имеет маленький буфер, если он вообще есть и туда не попадает текст сообщения если ставить задержку.
Кстати, я правильно понимаю, что 8 пин ардуино соединен с пином PWR_KEY А6? Не очень понимаю, много ли жрет этот пин на старте (и жрет ли вообще)..
Вряд ли он, что то жрёт, но логика подсказывает, что стоит воткнуть резюк иль оптопару, я не стал заморачиватся, вообще он у меня питается напрямую от +5, стабилизатор вроде не греется, всё отсылает и присылает.
Вряд ли он, что то жрёт, но логика подсказывает, что стоит воткнуть резюк иль оптопару, я не стал заморачиватся, вообще он у меня питается напрямую от +5, стабилизатор вроде не греется, всё отсылает и присылает.
Сам модуль у меня тоже питается от внешнего БП совместно с ардуиной. По сути, ничего не должно случиться :) так-то включение происходит замыканием пина кнопки на пин +5 на самом модуле..
Вот как его отключить, вопрос.
И кстати надо пин переводить на вход или оставлять HIGH, иначе ели он LOW, то при нажатии кнопки на модуле будет коротыш на пине.
У меня от +5 ардуины от усб :) всё работает.
По поводу этого поста, походу софт сериал имеет маленький буфер, если он вообще есть и туда не попадает текст сообщения если ставить задержку.
Поумолчанию буфер 64 байта. Для чтения SMS этого мало. Размер правится в softwareserial.h
#define _SS_MAX_RX_BUFF 64
Вот как его отключить, вопрос.
И кстати надо пин переводить на вход или оставлять HIGH, иначе ели он LOW, то при нажатии кнопки на модуле будет коротыш на пине.
Отключить AT+CPOF не помогает?
Мне проще, у меня нет кнопки на модуле, только пин :)
Помогает! Спасибо! Чёт даташит ковырял на shutdown, power off не откликается а 200 страниц таблиц уже надоело туда сюда гонять.
Помогает! Спасибо! Чёт даташит ковырял на shutdown, power off не откликается а 200 страниц таблиц уже надоело туда сюда гонять.
Не за что :)
http://www.2150692.ru/files/a6_at_commands.pdf - мануал по командам А6, прям по оглавлению читать удобно кто что делает :)
>> Так проблема не в том, каким способом перезапустить модуль (землей по ресету или 5В на PWK), а в том как это организовать. Напрямую с ардуины нельзя - потребление на обоих выводах модуля больше номинального на выходах ардуины - могут выгореть.
flyback, откуда информация про потребление пина power key?
у меня a6 отлично включается этим пином, подключён напрямую к пину ардуины.
По ноге reset здесь http://www.electrodragon.com/w/GSM_GPRS_A6_Module ("Module hardware RESET pin, this pin is used when the low <0.05V, current 70ma")
по PWR_KEY - точно не помню откуда, возможно, индуцировалось после прочтения/просмотра разных туториалов (напр. https://raymondtunning.wordpress.com/2016/05/31/a6-gsmgprs-module-pinout...), в которых говорится о соединении VCC5.0 с PWR_KEY, но нигде про "подайте HIGH с вывода ардуины на PWR_KEY"
flyback, откуда информация про потребление пина power key?
у меня a6 отлично включается этим пином, подключён напрямую к пину ардуины.
Что-то у меня не работает переключение на 9600.. Подключено, вроде, все правильно, но IPR not 9600 :(
Что-то у меня не работает переключение на 9600.. Подключено, вроде, все правильно, но IPR not 9600 :(
код 1 в 1?
у меня бывает такое когда сразу после отключения, включаешь, нужно подождать пру секунд перед повторным включением.
SoftwareSerial треш полный, немного поработает, потом буфер пилит, в топку!
Попробывал AltSoftSerial вроде как полёт нормальный.
код 1 в 1?
у меня бывает такое когда сразу после отключения, включаешь, нужно подождать пру секунд перед повторным включением.
Да, 1 в 1, пробовал прям весь код, только, конечно же, без считывания температуры и прочего :)
Попробую altsoft..
код 1 в 1?
у меня бывает такое когда сразу после отключения, включаешь, нужно подождать пру секунд перед повторным включением.
Да, 1 в 1, пробовал прям весь код, только, конечно же, без считывания температуры и прочего :)
Попробую altsoft..
Я на альт перелез от того что со временем буфер рассыпается и читать его головняк, а начальный сетап работает нормально, правда с второго третьего захода но работает и на софтвар сериал, мож где проводянки?
Я на альт перелез от того что со временем буфер рассыпается и читать его головняк, а начальный сетап работает нормально, правда с второго третьего захода но работает и на софтвар сериал, мож где проводянки?
Да уже хз что с ним, заказал еще один модуль, и, вроде как, даст знакомый потестить а800, на праздниках поковыряюсь, может..
Я на альт перелез от того что со временем буфер рассыпается и читать его головняк, а начальный сетап работает нормально, правда с второго третьего захода но работает и на софтвар сериал, мож где проводянки?
Да уже хз что с ним, заказал еще один модуль, и, вроде как, даст знакомый потестить а800, на праздниках поковыряюсь, может..
Ну смотри, ну у меня поделка получилась, мужику на дачу охранка, на альте переделал код полностью, если хочешь скину. Кста работало от усб, норм, воткнул блок питания пару смс и встаёт, сменил блок питания заработало. Модуль рабочий, когда отладку делал, всё сразу паял иначе съэкономишь 5 минут на пайке потратишь 2 часа при отладке.
Ну смотри, ну у меня поделка получилась, мужику на дачу охранка, на альте переделал код полностью, если хочешь скину. Кста работало от усб, норм, воткнул блок питания пару смс и встаёт, сменил блок питания заработало. Модуль рабочий, когда отладку делал, всё сразу паял иначе съэкономишь 5 минут на пайке потратишь 2 часа при отладке.
Да, скинь, пожалуйста.
Ща домой заберу, запитаю все от 12В БП, на модуль понижайкой 5В подам, посмотрю что будет.. Я спаял, теперь распаивать пришлось :) впаял теперь провода для макетки, так удобнее собирать-разбирать, потом уже спаяю с двух сторон..
Пфффф.. то ли модуль не едет, то ли я жопорукий..
Напрямую тоже не переключить..
Переключаюсь на 9600 и шляпа..
Видимо, придется подождать новый модуль и проверить..
Ну и питание еще проверю..
подскажите, пожалуйста, за что отвечает эта строчка (на нее компилятор ругается ошибкой)?
при удалении этой строки компилятор перестает выдавать ошибку, но выводит "предупреждение"
какую константу он просит перевести в простой """char*"""
Попытался использовать кусок Вашего скетча по поводу проверки правильной загрузки GSM-модуля. Вот что получилось:
Но при этом в мониторе порта не выводится текст сообщения и соответсвенно поэтому в ответ модуль не шлет смс. В чем может быть загвоздка? (кол-во смс на симке врое не должно быть переполнено, чистка смс лишних производится, строка "AT+CNMI=2,2" тоже имеется)
Ds(); это функция для снятия температуры с далласовского датчика, тут нет этого куска.
Delay после присвоения переменой ch не даёт читать СМС строка 67, но всё равно на софтвар сериал криво работает.
После переполнения СМС, счётчик идёт по новой, 200 штук вроде всего.
Спасибо, knack, за помощь!
Решил сделать через альтсериал, но возникла проблема:
Не работает основная строка (определяющая чей номер, наш ли текст смс), до этого момента модуль работает стабильно (грузится пока не получит ОК от команды АТ, переходит стабильно на скорость 9600 и, следовательно, смс получает правильно).
Также при компиляции выходит "ошибка" (вернее замечание, т. к эта "ошибка" дает работать и прошивать ардуинке. Но, видимо, именно эта "ошибка" и не дает до конца грамотно работать программе. Самое интересное, что не показывается в какой строке эта "ошибка" и не понятно где нужно подправить тип данных):
/Users/admin/Documents/Arduino/_2017/_2017.ino:8:1: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
в 77й строке
val.indexOf(
"+CMT"
) > -1 это что?
83 строка у вас переменная постоянно затирается, естественно 77я строка не сработает.
в 77й строке
val.indexOf(
"+CMT"
) > -1 это что?
83 строка у вас переменная постоянно затирается, естественно 77я строка не сработает.
в 77й строке
val.indexOf(
"+CMT"
) > -1 это определение поступило смс или звонок.
За подсказку затирания val - спасибо большое! исправил ошибку.
в 77й строке
val.indexOf(
"+CMT"
) > -1 это определение поступило смс или звонок.
А зачем? у вас переменная val всегда пустая, до того момента пока, что то не посыпется из сериала, вот тут ваша задача отловить то что нужно, выполнить что вам нужно и очистить переменную. Вы отлавливаете то, что и так явно, добавляя геммороя в код.
Ну что, питание от понижайки не помогло, ждем новый модуль..
У меня тож переодически виснет, как буд то засыпает, хрень какая то.
Так и что, какие плюсы и минусы у данного модуля относительно того же SIM800L? Цена то одинакова, что выбрать?
х.з. бери что обкатано
Короче я тоже являюсь обладателем 2-х SIM800L и одного A6. Вот, что нарыл.
1. Модули серии SIM800 являются самыми оптимальными модулями, содержащими возможность работы по 4-м частотам, Блютуз, да и очень расширенный перечень команд, полезный определенным программистам.
Минусы: очень требователен к питанию, и самое главное, очень нужен преобразователь уровней. Вероятно из-за отсутствия последнего я подпалил все же оба модуля и сейчас заказал еще один для тестов. Плюс обнаружил, что в серии 800L не работает команда AT+CPOWD=1, что на одном, что на втором выдает ошибку. Есть подозрение, что символ L обозначает Light, обрезок одним словом, и часть команд по общему перечню, предназначенному для полновесной версии, просто не работает. Но и есть положительные стороны, в отличии от A6: это возможнотсь воспроизведения аудиофайлов, загруженных в сам модуль в расширении ARM, а модуль сам сожет декодировать DTMF сигналы без всяких обвязок. Я нормально цеплял оба своих через преобразователь, включал декодирование командой AT+DDET=1 и нормально получал ответы в цвет. Без ошибок.
2. Модули серии A6 нихера не могут декодировать DTMF сигналы, не могут воспроизводить аудиофайлы. В описании и на практике я опробовал единственно возможную комманду - воспроизведение DTMF сигналов. Да работает, но кому это нужно. Более того, я на модулях SIM800L нормально могу отправлять и принимать смс сообщения на русском языке, используя таблицу в режиме UCS2. И прием и отправка. Но к сожалению, А6 так не может. Даже в описании команд, на команду AT+CSCS есть такая сноска: This command is used to read and write phonebook entries. SMS doesn’t effected by this command. Т.е. для работы с телефоном как бы нормально, про сообщения можете забыть. Таким образом для себя я выбрал следующее:
Если тебе нужен модуль для построения простого устройства типа сигнализации, задача которой оповестить тебя о проникновении или срабатывании какого нибудь датчика, плюс тебе хватает прием или отсылка команд в виде цифр или сообщения на Английском языке, плюс тебе важен заниженных показатель потребляемости питания то модуль А6 ТВОЙ.
Если тебе нужно, как я описывал выше, принимать смс или отсылать команды на Ардуинку на русском, управлять Ардуинкой DTMF командами, возможно услышать аудиофайл типа: "Ваш голос важен для нас, не отключайтесь" или "Для приготовления пиццы нажмите 1, для самоуничтожения нажмите 2" и потребляемость по питанию не важно, хотя разница и не большая, то нужно брать только 800 серию, причем желательно обычный SIM800 в корпусе SMT с боковыми контактами. Он крупнее. Можно и припаять и обвязать. И он будет работать по всему перечню комманд и еще есть Блютуз, кому надо.
Его усовершенствованная копия только в меньшем размере SIM800C. Все тоже самое + добавлена функция Embedded AT + Блютуз но еще и маленький. Для реализации на плате удобней, но и паять трудней.
Для дополнительной информации, модули серии 800 являются новее серии 900, как бы это не было странным. И действительно, по всем проблемам молуля SIM800L мы не сможем найти ответов, т.к. даже на сайте MT-System этого модуля нет. Почему? Х.з. Однако если почитать описание модуля SIM800H то в описании идет полное сравнение 800H с 800L. http://www.mt-system.ru/documentation/polnoe-opisanie-sim800h
Чисто теоретически, почитав описания, я как бы понял, что версия 800L это копия 800H только без Блютуз.
V-max VL,
Благодарствую, очень обстоятельно. Помимо прочего меня интересует такой аспект, как передача данных. Насколько я понял, в A6 по дефолту не всё гладко с POST-запросами, для этого есть отдельная либа. Еще упоминались какие-то проблемы с dns lookup, впрочем последнее под вопросом. У SIM800, в свою очередь, есть максимальное ограничение на длину URL - 64 символа.
Ну и фиксированная скорость порта в A6 заставляет использовать только аппаратный UART, тогда как SIM800 можно посадить и на программные пины.
Указать свой IMEI, я так понимаю, на обоих модулях можно без проблем? Интересует в плане использования планшетных тарифов с бесплатной квотой трафика.
К сожалению товарищ гонять модуль именно в этом направлении мне не приходиться. Задача немного другая. И опять таки, повторюсь, для SIM800 КАТЕГОРИЧЕСКИ обязателен преобразователь уровней 5-3В. Именно прямое подключение к Ардуино помогло моим обоим модулям немного подгореть, но хитро. Описываю:
Два модуля абсолютно идентичны SIM800L. Так вот, оба, по очереди, были протестированы на профпригодность, после того как я их получил по почте, я отписался продавцу что все ок. Начал плотно сидеть на одном и гонять его по полной (в рамках моих потребностей). Спустя какое то время начались глюки и небольшие сбои. Частично перестал прогружать команды, на некоторые начал давать ERROR. Когда дошел до потребности прогрузить AT+CPOWD=1 в ответ получил ERROR. Прогружаю AT+CREC? в ответ ERROR. Ну дамаю очень лайтовый модем. Подключаю второй и опа, команда AT+CREC? прогрузилась, причем в этом направлении его сейчас начанаю гонять, но только через преобразователь, а вот AT+CPOWD так же дает ERROR, Причем если включить отчет об ошибках AT+CMEE=0, вместо ERROR начинает писать Неизвестная команда. Плюс начались глюки с поиском сети. Очень долго ищет сеть частым миганием светодиода при включении. А когда нашел и перешел на редкое мигание то по долгу дозвониться на модем не получается. Типа абонент не доступен. Если бы эти проблемы были в самом начале, я бы решил что модемы битые с Китая пришли. Но они начались после прямого подключения.
Еще хотелось бы добавить, что у А6 действительно очень хорошая чувствительность у микрофона. Если сделать небольшу прослушку и позвонить на модем с автоподнятием трубки то множно услышать как таракан ползет на противоположной стороне большой комнаты. Это офигенно. Но после этого я подключил этот же микрофон к более подгорелому 800L, услышал сильные шумы, невнятная речь, короче очень неочень. Сейчас буду цеплять микрофон к тому, что по живее, отпишусь.
Подцепил к полуживому, микрофон работает лучше, чем на первом. Но по прежнему получается дозвониться раз на 5-6й. Причем плюс еще он сам как то перезагружается. И это при том, что уровень сигнала 12. Короче им каюк, жду новый.
Модуль подвисает периодически. Работал часа два-три и после этого уже не отправлял ответные смс. С телефона до модуля смс доходит (в телефоне пишет смс доставлено, на ардуинке в момент отправки смс перемигивается светодиод). Приходится перезагружать ардуино/gsm-модуль... После перезагрузки начинает работать некоторое время стабильно, после чего опять зависает через некоторое время.
В итоге, решив проблему со скоростью обмена через "altserial", вышла еще одна серьезная проблема стабильности работы (ранее уже в этой ветке писали о подобной проблеме)...
Видимо, придется искать другой более стабильно работающий gsm-модуль.
Модуль подвисает периодически. Работал часа два-три и после этого уже не отправлял ответные смс. С телефона до модуля смс доходит (в телефоне пишет смс доставлено, на ардуинке в момент отправки смс перемигивается светодиод). Приходится перезагружать ардуино/gsm-модуль... После перезагрузки начинает работать некоторое время стабильно, после чего опять зависает через некоторое время.
В итоге, решив проблему со скоростью обмена через "altserial", вышла еще одна серьезная проблема стабильности работы (ранее уже в этой ветке писали о подобной проблеме)...
Видимо, придется искать другой более стабильно работающий gsm-модуль.
подтверждаю, если его посадить на 0, 1 он будет так же виснуть? Мне кажется, что просто мы не умеем его готовить. А возможно, что он уходит в какой то sleep mode?