в общем почему вот этот скетч работает корректно, но если этот тестк записать как void sms(); и вызывать из основной программы ничего неработает, для меня это загадка.
Это для однократного считывания 1й смс. Это тестовый как вы понимаете кусочек. Работает как надо. Если вместо однократног считывания по рестарту сделать циклическое с задержкой 1сек или более то смс не читается то есть считать смс в произвольный момент хода какой либо программы не могу.
кстати, важно определится то лучше делать: или смс разрешить записываться на симкарту прото их оттуда читать-обрабатывать-удалять, или сразу выводить в сериал "AT+CNMI=1,2,2,1,0\r" и обрабатывать строку. Навернео если программа большая, то нужно разрешить записатся смс на симкарту, потом оттуда вычитывать? А если сразу 2-3 сообщения припрется?
Вот именно что программа большая и надо считывать из памяти выводитьсразу всериал не нужно в коде setup это определено. Далее считывается смс номер 1 всегда, после этого удаление смс надо делать.
Моожно раз в 5 сек считывать и удалятьвсе. Либо считывать количество. Это уже потом.
В библиотекк есть функция считать смс и номер телефона и все работает но использовать библ не хочу из за размера
а как определять, что смс пришло, и что оно первое в списке, а не их там уже 3 шт??
Это можно. У смс есть стаус, прочитано или нет и время приема. То есть открыть все непрочитанные, обработать, присвоить статус прочитано или удалить.
Но длинное смс на симкарут пишется частями. Мне просто поздравление от какогото перца в стихах пришло на сигналку. То есть он у себя набрал длинный стих и для него это визуально как одно смс, так как длинна больше 159 символов телефон то умный на 3 смс разбил. Вот и пришло 3 смс с билибердой.
Хотя я думаю тоже есть какойто признак для того чтобы понять что эти три части однго смс, для того чтоб их склеить, телефоны же склеивают их. Но я так глубоко не залазил.
Short Circuit, согласен с Вашими доводами, если делать для себя. Однако вопрос в том, реализовывал ли кто сей функционал, ибо если продукт делать не для себя, юзерам хочется комфорта. А на кириллице - комфортно.
вы делаете кирилицу, и вот выясняется что нателефоны 10-20% юзверов кирилицу оператор нормально не транслирует, у этих юзверов пападакисы вместо кирилицы. притом если вы им латиницу шлете - то все ОК!.
поэтому о комфортности на кирилице - я бы поспорил, тем более в процессе работы вдруг выясняется, что смс нужно 120 знаков слать с разной инфой от температурных датчиков.
и тут засада с этой кирилицей где это уже будет два! смс..и второе придет через пол-часа после первого..
в общем в свое время я с кирилицей натерпелся от недовольных юзверов.
все эти и другие проблемы раз и навсегда решает латиница.
Модуль подключил к ардуине, всё четко работает. Команды AT работают и програмно и через терминал.
СМС шлются, принимаются. Звонки принимаются.
Теперь дозвон из модуля: на городской(МСК) номер коммандой ATD+7499xxxxxxx звонок проходит, на мобильные номера ATD+7905xxxxxxx, ATD+7916xxxxxxx ответ NO CARRIER.
Телефоны естественно доступны, деньги на балансе есть, император - Билайн(с другим пока не пробовал).
Может кто сталкивался и для вызовов на мобильные синтаксис другой?
В мануале по модулю в примерах номер телефона в этой команде вводится без "+". Вечером попробую, отпишу.
Nikk80 пишет:
После номера надо поставить знак ; Т.е. Atd+79051234567; это будет голосовой вызов. В противном случае передача данных. В дата щит гляньте прямо внимательно синтаксис команты. Тоже на такое попал)
Да, про ; увидел, спасибо. Но в даташите всё-таки без +.
После номера надо поставить знак ;
Т.е. Atd+79051234567; это будет голосовой вызов. В противном случае передача данных.
В дата щит гляньте прямо внимательно синтаксис команты. Тоже на такое попал)
Делаю проект для охраны дома - дачи, лайтовый, т.е. 3-и канала(геркон, 2-а датчика PIR), сирена с индикацией и два датчика температуры.
Возникла проблема с ардуино, т.к. делаю на Arduino pro mini - нехватает памяти для хранения текста отправки смс, например шлю смс Hello, в ответ должен прийти:
Hi, Security on
Voltage 220: norma
Outside t:25.70 h:27,00%
Inside t:23.70 h:22,00%
Signal leval: 70%
Памяти у нее 2 048 bytes, заполнена на 1 369 bytes (66%)
но все равно не хватает памяти, почему использую pro mini, т.к. маленькая, и все органы управления можно спрятать в распределительную коробку.
на все остальные запросы - отвечает быстро!
Но раньше на запрос отвечал нормально, но и память была заполнена на 50%
Работа проги:
-Регистрация номера
-Активация/деактивация каналов
-Запрос Активности каналов
-Запрос Системы (типа как дела)
-Постановка/снятие на охрану
-Сброс тревог
-Сброс всех настроек
-Вкл./выкл. реле
-Оповещение о пропадании/появлении 220В
-Оповещение о низком уровне аккумулятора 12В
-Оповещение о сработке канала на охране
-Запрос баланса
должно работать, может проблема в другом, в скетче, в софт-сериал который имеет по умолчанию обрезаный буфер (можно в самой библиотеке его отредактировать и увеличить)?
Сразу говорю, в скетче удален некоторый код, т.к. не хочу чтоб мой проект копировали и делали на нем деньги!
[code]
#include
#include
#include
SoftwareSerial gsm(2, 3);
// Состав компонентов
int rele1 = 5; // Сирена
int rele2 = 6; // Маяк
int Temperature1 = 11; // Датчик температуры и влажности №1
int Temperature2 = 10; // Датчик температуры и влажности №2
int ch01 = 7; // Входная дверь (геркон) - 30 pin
int ch02 = 8; // Датчик движения 1
int ch03 = 9; // Датчик движения 2
int ResetAll = 4; // Сброс устройства по умолчанию - 29 pin
int Power220 = 13; // Состояние напряжения сети 220В
int TempVoltage12V = A1; // Напряжение аккумулятора
// Объявление датчиков температуры
#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht1(Temperature1, DHTTYPE);
DHT dht2(Temperature2, DHTTYPE);
// Переменные
// кусок удален))
void setup()
{
// Датчики температуры и влажности
dht1.begin();
dht2.begin();
// Читаем из памяти данные о состоянии системы
Automatic = EEPROM.read(0);
// Читаем номер Хозяина
// кусок удален))
// Serial.begin(9600);
// делаем задержку на поиск сотовой сети
// кусок удален))
// Запускаем GSM
// gsm.begin(9600); //подключаем порт модема (при других скоростях не отвечает)
}
void loop()
{
if (StartGSM == 0){
gsm.begin(9600);
gsm.write("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
delay(300);
}
if (StartGSM == 1){
gsm.write("AT+IFC=1, 1\r"); //устанавливает программный контроль потоком передачи данных
delay(300);
}
if (StartGSM == 2){
gsm.write("AT+CPBS=\"SM\"\r");//открывает доступ к данным телефонной книги SIM-карты
delay(300);
}
if (StartGSM == 3){
gsm.write("AT+CNMI=1,2,2,1,0\r");// включает оповещение о новых сообщениях, новые сообщения
delay(500);
}
if (StartGSM == 4){
gsm.write("AT+GSMBUSY=1\r\n"); // запрет всех входящих звонков.
delay(300);
}
if (StartGSM == 5){
gsm.write("AT+CMGDA=DEL ALL\r\n"); // команда удалит все сообщения
delay(500);
}
if (FlagSignal == 0 && StartGSM == 6){
gsm.println("AT+CSQ");// Проверяем уровень сигнала
delay(800);
}
// Проверка уровня сигнала во время работы системы каждые и напряжение 12В проверем
counter++;
if (counter >= timerForSignalGSM && FlagSignal == 1 && StartGSM == 6){
gsm.println("AT+CSQ");
delay(300);
// Обнуляем счетчик
counter = 0;
}
//***************************************************************************************************************
// Функция Автоматики при охране
if (Automatic == 1){
if (AutoEnable == 0){
// Включаем маяк
digitalWrite(rele2, !HIGH);
// Обнуляем
digitalWrite(rele1, !LOW); // Выключаем сирену, если была вкл.
ResetAlarmAll();// Обнуляем флаги тревог, если были или не были
// SearchChannel(); // Поиск активных каналов
AutoEnable = 1;
AutoDisable = 0; // говорим, что охрана поставлена
}
if (ACh01 == 0 && FlagSignal == 1){
if (digitalRead(ch01) == !LOW){
if (digitalRead(Power220) == 1 && stateSirena !=2) {digitalWrite(rele1,!HIGH);}
// ReadNBoss();
smsSendAlarm("Alarm! Front door is open");
ACh01 = 1;
}
}
// кусок удален))
// Проверяем 220В, если Есть 220В и флаг сирены = 0
// далее, если была включена один из каналов по тревоги, то запускаем счетчик
if (digitalRead(Power220) == HIGH && stateSirena == 0){
if (ACh01 == 1 || ACh02 == 1 || ACh03 == 1){
cSirena++;
}
}
// если счетчик достиг заданного значения, то выключаем сирену и делаем флаг сирены = 1 и делаем флаг задержки для повторного вкл сирены
if (cSirena >= timerSirena){
digitalWrite(rele1,!LOW);
cNAlarm++;
stateSirena = 1;
cSirena = 0;
}
//
// если флаг задержки = 1, то запускаем счетчик для повторного вкл. сирены
if (stateSirena == 1){
csSirena++;
if (csSirena > timerStateSirena){
digitalWrite(rele1,!HIGH);
stateSirena = 0;
csSirena = 0;
}
}
// если сирена прозвучала 10 раз, то выключаем ее
if (cNAlarm == 10){
ACh01 = 0;
ACh02 = 0;
ACh03 = 0;
stateSirena = 2;
digitalWrite(rele1,!LOW);
}
}
//***************************************************************************************************************
// Функция Автоматики при снятой охране
if (Automatic == 0){
if (AutoDisable == 0){
digitalWrite(rele1, !LOW); // Выключаем сирену, если была вкл.
digitalWrite(rele2, !LOW); // Выключаем маяк, если был включен
// Обнуляем флаги тревог, если были или не были
ResetAlarmAll();
AutoDisable = 1; // Говорим, что выполнели все действия по откл. системы после снятия с охраны
AutoEnable = 0; // говорим, что охрана снята
}
}
//*******************************************************************
if (gsm.available()) { //есть данные от GSM модуля
currStr = ""; //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
currStrN = "";
dataBalanceTemp = "";
dataSms = "";
val = "";
flag1 = 0;
flag2 = 0;
while (gsm.available()) { //сохраняем входную строку в переменную val
c:
ch = gsm.read(); //int
val += char(ch); // String
data = ch; // char = int
if ('\r' == data) {
currStr = "";
} else if ('\n' != data) {
currStr += String(data);
dataSms = currStr;
}
//+CMT: "+79817425864","","16/04/18,20:25:08+12"
if (data == '+' && flag1 == 0){flag1 = 1;}
if (data == 'C' && flag1 == 1){flag1 = 2;}
if (data == 'M' && flag1 == 2){flag1 = 3;}
if (data == 'T' && flag1 == 3){flag1 = 4;}
if (data == '+' && flag1 == 4){currStrN = "";flag1 = 5;}
if (data != '"' && flag1 == 5){currStrN += String(data); dataSmsN = currStrN;}
if (data == '"' && flag1 == 5){flag1 = 6;}
// кусок удален))
}
// Смотрим данные полученные //режим кодировки СМС - обычный (для англ.)
if (val.indexOf("+CMGF") > -1){
if (dataSms.indexOf("OK") > -1) {
StartGSM = 1;
// Serial.println("StartGSM = 1");
}
}
// Смотрим данные полученные //устанавливает программный контроль потоком передачи данных
if (val.indexOf("+IFC") > -1){
if (dataSms.indexOf("OK") > -1) {
StartGSM = 2;
// Serial.println("StartGSM =2");
}
}
// Смотрим данные полученные //открывает доступ к данным телефонной книги SIM-карты
if (val.indexOf("+CPBS") > -1){
if (dataSms.indexOf("OK") > -1) {
StartGSM = 3;
// Serial.println("StartGSM = 3");
}
}
// Смотрим данные полученные //включает оповещение о новых сообщениях, новые сообщения
if (val.indexOf("+CNMI") > -1){
if (dataSms.indexOf("OK") > -1) {
StartGSM = 4;
// Serial.println("StartGSM = 4");
}
}
// Смотрим данные полученные //запрет всех входящих звонков.
if (val.indexOf("+GSMBUSY") > -1){
if (dataSms.indexOf("OK") > -1) {
StartGSM = 5;
// Serial.println("StartGSM = 5");
}
}
// Смотрим данные полученные //команда удалит все сообщения
if (val.indexOf("+CMGDA") > -1){
if (dataSms.indexOf("OK") > -1) {
StartGSM = 6;
// Serial.println("StartGSM = 6");
}
}
// Смотрим данные полученные от модуля +CSQ: 22,0
if (val.indexOf("+CSQ") > -1) {
// кусок удален))
}
// Смотрим данные полученные от модуля пришло смс
if (val.indexOf("+CMTI:") > -1) { // +CMTI: "SM",
StartGSM = 0;
}
// Смотрим данные полученные от модуля, Получили смс с балансом, теперь отсылаем
if (val.indexOf("+CUSD:") > -1) {
// кусок удален))
}
//----------------------- определение факта приема СМС и сравнение номера(ов) с заданным(и)
if (val.indexOf("+CMT") > -1) {
// Регистрация хозяина
if (dataSms.indexOf("Register") > -1 && EEPROM.read(0) == 3) {
// Serial.println("Poluchili sms Register");
k=1;
for (i=20; i<=30; i++){ // записываем с 20 по 31 ячейку номер телефона главного
EEPROM.write(i,dataSmsN[k]-48);//79995554466
k++;
}
// ReadNBoss();
EEPROM.write(0,0);
Automatic = EEPROM.read(0);
ClearDataIn();
smsSendAlarm("Hi, Your number is added as a master!");
delay(1000);
// SerialPrintEEPROM();
}
// Проверяем номер телефона хозяина
// кусок удален))
// Постановка на контроль
if (dataSms.indexOf("Control") > -1 && EEPROM.read(20) == 7 && Boss == 1){
// Постановка на охрану
if (dataSms[8]-48 == 1){
EEPROM.write(0,1);// Записываем в память что мы поставили на охрану
Automatic = EEPROM.read(0);// Читаем из памяти и записываем в переменную
ClearDataIn();
smsSendAlarm("Hi, Security is enabled");
}
// Снятие с контроля
if (dataSms[8]-48 == 0){
EEPROM.write(0,0);
Automatic = EEPROM.read(0);
ClearDataIn();
smsSendAlarm("Hi, Security is disabled");
}
}
// Квитирование тревог
if (dataSms.indexOf("Reset alarm") > -1 && EEPROM.read(20) == 7 && Boss == 1){
ClearDataIn();
ResetAlarmAll();
digitalWrite(rele1,!LOW);
// ReadNBoss();
smsSendAlarm("Hi, Alarm reset is done!");
}
// Стирание всей памяти, настройки по умолчанию
if (dataSms.indexOf("Reset all") > -1 && Automatic == 0 && EEPROM.read(20) == 7 && Boss == 1) { // Сброс всех данных по умолчанию
ClearDataIn();
smsSendAlarm("Hi, all data deleted for telephone!");
RAll();
}
// Запрос баланса, после получения ответа - отправка обратно на номер
// кусок удален))
// Запрос Отчета о системе
if (dataSms.indexOf("Hello") > -1 && EEPROM.read(20) == 7 && Boss == 1) {
ClearDataIn();
MsgHi = "";
MsgHiA = "Security: "; // Читаем данные об охране
MsgHiD = "220V: "; // Читаем данные о Напряжении
MsgHiF = "Signal: "; // Читаем сигнал сотовой сети
// Читаем данные об охране
if (Automatic == 1){MsgHiA += "On";}
if (Automatic == 0){MsgHiA += "Off";}
// Читаем напряжение
if (digitalRead(Power220) == 1){MsgHiD += "Norm";}
if (digitalRead(Power220) == 0){MsgHiD += "No";}
// Читаем остальные датчики температуры
float h = dht1.readHumidity();
float t = dht1.readTemperature();
if (isnan(t) || isnan(h)) {
MsgHiC = "Err t1!";
} else {
MsgHiC = "Outside: ";
MsgHiC += t;
MsgHiC += "C ";
MsgHiC += h;
MsgHiC += "%";
}
h = dht2.readHumidity();
t = dht2.readTemperature();
if (isnan(t) || isnan(h)) {
MsgHiCSecond += "Err t2!";
} else {
MsgHiCSecond = "Inside: ";
MsgHiCSecond += t;
MsgHiCSecond += "C ";
MsgHiCSecond += h;
MsgHiCSecond += "%";
}
h = 0.0;
t = 0.0;
// Уровень сигнала сети
IntSignalLevelTemp = map(IntSignalLevel, 0, 32, 0, 100);
MsgHiF += String(IntSignalLevelTemp);
MsgHiF += "%";
//Собираем текст
MsgHi += MsgHiA; // Hi, + Читаем состояние системы
MsgHiA = "";
MsgHi += "\r\n";
MsgHi += MsgHiD; // Читаем данные о Напряжении
MsgHiD = "";
MsgHi += "\r\n" + MsgHiC; // Читаем датчик температуры 1
MsgHiC = "";
MsgHi += "\r\n" + MsgHiCSecond; // Читаем датчик температуры 2
MsgHiCSecond = "";
MsgHi += "\r\n" + MsgHiF; // Читаем сигнал сотовой сети
MsgHiF = "";
smsSendAlarm(MsgHi);
MsgHi = "";
}
// Вкл. выкл. каналов для сигнализации системы
// кусок удален))
// Запрос состояния активных входов
// кусок удален))
void ReadNBoss(){
// кусок удален))
}
void ResetAlarmAll(){
// Обнуляем флаги тревог, если были или не были
ACh01 = 0; // сбрасываем флаг об включении канала
ACh02 = 0; // сбрасываем флаг об включении канала
ACh03 = 0; // сбрасываем флаг об включении канала
Kvitir12V = 0; // сбрасываем флаг об низком напряжении на аккумуляторе
stateSirena = 0; // флаг сирены
cSirena = 0; // счетчик для выключения сирены
csSirena = 0; // счетчик для повторного вкл. сирены
cNAlarm = 0; // счетчик для деактивации сирены после 10 раз срабатывании
}
Простой Пример работы смс комманд на модуль
При отправке на модуль смс "Green on", включится светодиод
При отправке на модуль смс "Green off", выключится светодиод
При отправке на модуль смс "Yellowon", включится светодиод
При отправке на модуль смс "Yellow off", выключится светодиод
void setup()
{
gprsSerial.begin(9600);//подключаем порт модема (у меня отлично работает на 9600)
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
// Настраиваем приём сообщений с других устройств
// Между командами даём время на их обработку
gprsSerial.print("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
delay(300);
gprsSerial.print("AT+IFC=1, 1\r"); //устанавливает программный контроль потоком передачи данных
delay(300);
gprsSerial.print("AT+CPBS=\"SM\"\r");//открывает доступ к данным телефонной книги SIM-карты
delay(300);
gprsSerial.print("AT+CNMI=1,2,2,1,0\r");// включает оповещение о новых сообщениях, новые сообщения
delay(500);
gprsSerial.print("AT+GSMBUSY=1\r\n"); // запрет всех входящих звонков.
delay(300);
gprsSerial.print("AT+CMGDA=DEL ALL\r\n"); // команда удалит все сообщения
delay(300);
}
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
void loop()
{
if (!gprsSerial.available())
return;
char currSymb = gprsSerial.read();
if ('\r' == currSymb) {
if (isStringMessage) {
//если текущая строка - SMS-сообщение,
//отреагируем на него соответствующим образом
if (!currStr.compareTo("Green on")) {
digitalWrite(greenPin, HIGH);
} else if (!currStr.compareTo("Green off")) {
digitalWrite(greenPin, LOW);
} else if (!currStr.compareTo("Yellow on")) {
digitalWrite(yellowPin, HIGH);
} else if (!currStr.compareTo("Yellow off")) {
digitalWrite(yellowPin, LOW);
}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}
gsm.print("AT+CUSD=1,");
gsm.print('"');
gsm.print("#100#");// работает на 100% с МТС
gsm.println('"');
Простая отправка смс на телефон
void smsSendAlarm(String text) { // Например в скетче есть текст, его надо отправить (smsSendAlarm("Текст, который надо отправить");)
String Number = "79995551122";
gsm.println("AT+CMGS=\"" + Number + "\"");//Number - номер телефона в формате 79995551122, без знака +
delay(1000);
gsm.print(text);// text - там хранится сообщение, которое вы передали (smsSendAlarm("Текст, который надо отправить");)
text = "";// очищаем буфер
delay(1800);
gsm.print((char)26);
delay(1500);
}
Гении, подскажите. Случилась такая ситуация. Как и многие здесь сидящие собираю свой проект на Ардуине. Купил 2 модуля SIM800L. В целом модули рабочие. Но как рабочие, при загрузке тестового скеча при помощи монитора прогоняются все комманды на отлично, озыв (ответ) есть по каждой комманде. Но если в void setup() есть любая строка, типа mySerial.println("AT") или любая другая комманда, при положительном исполнении которой должен придти ответ "ОК", то ответа нет. Хотя точно знаю, что комманда прошла отлично, да и вообще весь скетч работает на отлично. И на телефон звонит, и смс отправляет, и звонки принимает, причем даже отрабатывая АОН и и сполняя любую задачу. А вот в сериалМониторе ответов об исполнении комманд нет. Кто подскажет в чем беда?
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TXvoidsetup() {
Serial.begin(19200); //Скорость порта для связи Arduino с компьютером
Serial.println("Goodnight moon!");
mySerial.begin(19200); //Скорость порта для связи Arduino с GSM модулем
mySerial.println("AT");
}
voidloop() {
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
в seput () есть строка mySerial.println("AT")
а в видеопояснении видно, что сериалмонитор при запуске, отработал эту комманду как
АТ
ОК
а у меня так не получается, автоматического ответа нет, просто Goodnight moon!, без АТ ОК. но ести принудительно отправить комманду АТ от ответ будет получен ОК, и на остальные комманды отвечают ОК.
Вот и возник вопрос, с чем это может быть связано?
Вот еще что заметил, люди жалуются, что часто проблемы возникают из за отсутствующего общего минуса (заземдения) между Ардуино и модулем. В видео примере, чувак сделал общий минус до понижения с 12В до рабочих 4,0В (на уровне 12В). Я сделал общий минус как раз после понижения, на уровне 4,0В. Это чисто для размышления.
И еще, случайно, когда SIM модуль подключал к аналогичному в видеопримере преобразователю напряжения, накрутил на выходе 4,4 В. Молудь практически не работал, на комманды не отвечал, звонки не принимал.В тестовом примере показал OVER VOLTAGE. Понизил до 4,1В. Траблы прекратились, модуль заработал, но автоответы на комманды в setup () так и не появились. Может я их немного поджог?
Так я на 9600 и поставил. Прелагают ввести задержку и мне интересно сколько? У меня при 9600 ответов и не поступает, вот в чем беда. Глянь пожалуйста мой пост, где я привожу пример. Может что из последних тезисов про питание на рекомендации намекнет.
Так я на 9600 и поставил. Прелагают ввести задержку и мне интересно сколько? У меня при 9600 ответов и не поступает, вот в чем беда. Глянь пожалуйста мой пост, где я привожу пример. Может что из последних тезисов про питание на рекомендации намекнет.
1. Перед подключением к преобразователю напряжения необходимо его настроить выставив выходное напряжение на любое в диапазоне 3.7В - 4.2В
1. Что сделал, понизил напругу до 4,0В, что б модулю вообще комфортно было.
2. Разобрался с кодом. Я значит случайно сделал ошибку, что проигнорировал этот абзац в полном объеме:
void loop() {
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
Все дело в том, что я стер эту часть
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
и сразу приступил к выполнению свяких условий. А именно эта часть и позволяет увилить в сериал мониторе ответ по комманде.
Для эксперимента:
#include SoftwareSerial.h
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
Serial.begin(9600); //Скорость порта для связи Arduino с компьютером
Serial.println("Goodnight moon!");
mySerial.begin(9600); //Скорость порта для связи Arduino с GSM модулем
mySerial.println("AT");
}
void loop() {
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
ответ АТ ОК будет,
#include SoftwareSerial.h
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
Serial.begin(9600); //Скорость порта для связи Arduino с компьютером
Serial.println("Goodnight moon!");
mySerial.begin(9600); //Скорость порта для связи Arduino с GSM модулем
mySerial.println("AT");
}
void loop() {
}
ответа ОК не будет, хотя АТ прогрузиться. Будет только Goodnight moon! Вот так я понял, что больше половины проблем у участников форума это участники форума.
1. Что сделал, понизил напругу до 4,0В, что б модулю вообще комфортно было.
2. Разобрался с кодом. Я значит случайно сделал ошибку, что проигнорировал этот абзац в полном объеме:
void loop() {
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
Все дело в том, что я стер эту часть
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
и сразу приступил к выполнению свяких условий. А именно эта часть и позволяет увилить в сериал мониторе ответ по комманде.
Для эксперимента:
#include SoftwareSerial.h
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
Serial.begin(9600); //Скорость порта для связи Arduino с компьютером
Serial.println("Goodnight moon!");
mySerial.begin(9600); //Скорость порта для связи Arduino с GSM модулем
mySerial.println("AT");
}
void loop() {
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
ответ АТ ОК будет,
#include SoftwareSerial.h
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
Serial.begin(9600); //Скорость порта для связи Arduino с компьютером
Serial.println("Goodnight moon!");
mySerial.begin(9600); //Скорость порта для связи Arduino с GSM модулем
mySerial.println("AT");
}
void loop() {
}
ответа ОК не будет, хотя АТ прогрузиться. Будет только Goodnight moon! Вот так я понял, что больше половины проблем у участников форума это участники форума.
Все правильно сделал, но код ниже нужен только для отладки
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
КТо знает сразу же как удалить отправленные СМС из модуля или СИМ карты?
Заметил что после отправки СМС модуль возвращает количество отправленных СМС и количество растет, думаю что скоро переполнится и что будт после ХЗ, может просто затираться будут старые, а может ошибку нарисует.
Нашел команду AT+CMGD="DEL ALL" но что то не дуйствует или синтаксис не тот. ПОделитесь секретом...
КТо знает сразу же как удалить отправленные СМС из модуля или СИМ карты?
Заметил что после отправки СМС модуль возвращает количество отправленных СМС и количество растет, думаю что скоро переполнится и что будт после ХЗ, может просто затираться будут старые, а может ошибку нарисует.
Нашел команду AT+CMGD="DEL ALL" но что то не дуйствует или синтаксис не тот. ПОделитесь секретом...
Команда удалит все сообщения:
gsm.write("AT+CMGDA=DEL ALL\r\n"); // команда удалит все сообщения
delay(500);
Я такую пробовал через черминал, но исходящие все одно не удаляются, т.е после отправки сообщения модуль выдает CMGS:90, 91,92 и так далее. Может это не исходящие сообщения вообще и я зря этим заморачиваюсь?
DTR надо на землю опустить когда ARduino готов к приему, верно понято?
в общем почему вот этот скетч работает корректно, но если этот тестк записать как void sms(); и вызывать из основной программы ничего неработает, для меня это загадка.
01
#include <SoftwareSerial.h>
02
String currStr =
""
;
03
boolean isStringMessage =
false
;
04
05
int
flag=1;
06
SoftwareSerial gprsSerial(2, 3);
// RX, TX
07
08
void
setup
()
09
{
10
Serial
.begin(9600);
11
Serial
.println(
"Begin..."
);
12
gprsSerial.begin(9600);
13
gprsSerial.println(
"AT+CMGF=1\r"
);
//режим кодировки СМС - обычный (для англ.)
14
delay(100);
15
gprsSerial.println(
"AT+CSCS=\"GSM\"\r"
);
//режим кодировки текста
16
delay(100);
17
}
18
19
20
21
void
loop
()
22
{
23
24
if
(flag==1){
25
gprsSerial.println(
"AT+CMGR=1"
);
26
delay(10);
27
flag=0;
//один раз запускаем чтение сообщения AT+CMGR=1
28
}
29
30
if
(gprsSerial.available()){
31
char
currSymb = gprsSerial.read();
32
if
(
'\r'
== currSymb) {
//если символ перевод каретки
33
if
(isStringMessage) {
34
Serial
.print(
"currStr= "
);
35
Serial
.println(currStr);
//Вот это и будет текст СМС
36
isStringMessage =
false
;
37
}
38
else
{
39
if
(currStr.startsWith(
"+CMGR"
)) {
40
isStringMessage =
true
;
41
}
42
}
43
currStr =
""
;
44
}
45
else
if
(
'\n'
!= currSymb) {
//если символ НЕ новая строка
46
currStr += String(currSymb);
47
}
48
}
49
}
и зачем это там?
24
if
(flag==1){
25
gprsSerial.println(
"AT+CMGR=1"
);
26
delay(10);
27
flag=0;
//один раз запускаем чтение сообщения AT+CMGR=1
Это для однократного считывания 1й смс. Это тестовый как вы понимаете кусочек. Работает как надо. Если вместо однократног считывания по рестарту сделать циклическое с задержкой 1сек или более то смс не читается то есть считать смс в произвольный момент хода какой либо программы не могу.
кстати, важно определится то лучше делать: или смс разрешить записываться на симкарту прото их оттуда читать-обрабатывать-удалять, или сразу выводить в сериал "AT+CNMI=1,2,2,1,0\r" и обрабатывать строку. Навернео если программа большая, то нужно разрешить записатся смс на симкарту, потом оттуда вычитывать? А если сразу 2-3 сообщения припрется?
Вот именно что программа большая и надо считывать из памяти выводитьсразу всериал не нужно в коде setup это определено. Далее считывается смс номер 1 всегда, после этого удаление смс надо делать.
а как определять, что смс пришло, и что оно первое в списке, а не их там уже 3 шт??
Моожно раз в 5 сек считывать и удалятьвсе. Либо считывать количество. Это уже потом.
В библиотекк есть функция считать смс и номер телефона и все работает но использовать библ не хочу из за размера
а как определять, что смс пришло, и что оно первое в списке, а не их там уже 3 шт??
Это можно. У смс есть стаус, прочитано или нет и время приема. То есть открыть все непрочитанные, обработать, присвоить статус прочитано или удалить.
Но длинное смс на симкарут пишется частями. Мне просто поздравление от какогото перца в стихах пришло на сигналку. То есть он у себя набрал длинный стих и для него это визуально как одно смс, так как длинна больше 159 символов телефон то умный на 3 смс разбил. Вот и пришло 3 смс с билибердой.
Хотя я думаю тоже есть какойто признак для того чтобы понять что эти три части однго смс, для того чтоб их склеить, телефоны же склеивают их. Но я так глубоко не залазил.
можно в библиотеке подсмотреть, разобраться как это делается, и код вставить с свой скетч.
Чета не могу сам там разобраться. К тому же там масса функций однана другую ссылается. Можете подсказать может поболе опыта у вкс есть?
а по библиотекам пока пас.. но логика работы там точно верная.
Коллеги, а кто-нибудь научил GSM модуль отправлять смс на кириллице?
а если в том большой смысл отправлять русскими вместо обычной латиницы?
1 - меньше места занимает.
2- проще код.
3- на все телефонах видно а не пападакисы вместо кирилических символов.
и т.д... я вижу одни только плюсы в отправке смс латиницей.
Short Circuit, согласен с Вашими доводами, если делать для себя. Однако вопрос в том, реализовывал ли кто сей функционал, ибо если продукт делать не для себя, юзерам хочется комфорта. А на кириллице - комфортно.
я сталкивался с этой проблемой ранее:
вы делаете кирилицу, и вот выясняется что нателефоны 10-20% юзверов кирилицу оператор нормально не транслирует, у этих юзверов пападакисы вместо кирилицы. притом если вы им латиницу шлете - то все ОК!.
поэтому о комфортности на кирилице - я бы поспорил, тем более в процессе работы вдруг выясняется, что смс нужно 120 знаков слать с разной инфой от температурных датчиков.
и тут засада с этой кирилицей где это уже будет два! смс..и второе придет через пол-часа после первого..
в общем в свое время я с кирилицей натерпелся от недовольных юзверов.
все эти и другие проблемы раз и навсегда решает латиница.
Подскажите пожалуйста такую вещь:
Модуль подключил к ардуине, всё четко работает. Команды AT работают и програмно и через терминал.
СМС шлются, принимаются. Звонки принимаются.
Теперь дозвон из модуля: на городской(МСК) номер коммандой ATD+7499xxxxxxx звонок проходит, на мобильные номера ATD+7905xxxxxxx, ATD+7916xxxxxxx ответ NO CARRIER.
Телефоны естественно доступны, деньги на балансе есть, император - Билайн(с другим пока не пробовал).
Может кто сталкивался и для вызовов на мобильные синтаксис другой?
вставьте в телефон симкарту и позвоните на те номера.
Ну звонит же.
Тем более на городской номер проходит вызов.
В мануале по модулю в примерах номер телефона в этой команде вводится без "+". Вечером попробую, отпишу.
Да, про ; увидел, спасибо. Но в даташите всё-таки без +.
После номера надо поставить знак ;
Т.е. Atd+79051234567; это будет голосовой вызов. В противном случае передача данных.
В дата щит гляньте прямо внимательно синтаксис команты. Тоже на такое попал)
невнимательный человек. даже не увидел, что на мобильный то приходит CSD вызов а не голосовой..
я же писал - позвонить и проверить, а это значит и трубку поднять и послушать.
Делаю проект для охраны дома - дачи, лайтовый, т.е. 3-и канала(геркон, 2-а датчика PIR), сирена с индикацией и два датчика температуры.
Возникла проблема с ардуино, т.к. делаю на Arduino pro mini - нехватает памяти для хранения текста отправки смс, например шлю смс Hello, в ответ должен прийти:
Hi, Security on
Voltage 220: norma
Outside t:25.70 h:27,00%
Inside t:23.70 h:22,00%
Signal leval: 70%
Памяти у нее 2 048 bytes, заполнена на 1 369 bytes (66%)
но все равно не хватает памяти, почему использую pro mini, т.к. маленькая, и все органы управления можно спрятать в распределительную коробку.
на все остальные запросы - отвечает быстро!
Но раньше на запрос отвечал нормально, но и память была заполнена на 50%
Работа проги:
-Регистрация номера
-Активация/деактивация каналов
-Запрос Активности каналов
-Запрос Системы (типа как дела)
-Постановка/снятие на охрану
-Сброс тревог
-Сброс всех настроек
-Вкл./выкл. реле
-Оповещение о пропадании/появлении 220В
-Оповещение о низком уровне аккумулятора 12В
-Оповещение о сработке канала на охране
-Запрос баланса
должно работать, может проблема в другом, в скетче, в софт-сериал который имеет по умолчанию обрезаный буфер (можно в самой библиотеке его отредактировать и увеличить)?
а скетч большой сам по себе, можно посмотреть?
скетч нормальный, с буфером тоже.
Сократил скетч до 49% и все стабильно работает.
скетч не покажите?
Сразу говорю, в скетче удален некоторый код, т.к. не хочу чтоб мой проект копировали и делали на нем деньги!
[code]
#include
#include
#include
SoftwareSerial gsm(2, 3);
// Состав компонентов
int rele1 = 5; // Сирена
int rele2 = 6; // Маяк
int Temperature1 = 11; // Датчик температуры и влажности №1
int Temperature2 = 10; // Датчик температуры и влажности №2
int ch01 = 7; // Входная дверь (геркон) - 30 pin
int ch02 = 8; // Датчик движения 1
int ch03 = 9; // Датчик движения 2
int ResetAll = 4; // Сброс устройства по умолчанию - 29 pin
int Power220 = 13; // Состояние напряжения сети 220В
int TempVoltage12V = A1; // Напряжение аккумулятора
// Объявление датчиков температуры
#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht1(Temperature1, DHTTYPE);
DHT dht2(Temperature2, DHTTYPE);
// Переменные
// кусок удален))
void setup()
{
// Датчики температуры и влажности
dht1.begin();
dht2.begin();
// Выхода Реле
pinMode(rele1, OUTPUT); digitalWrite(rele1, !LOW);
pinMode(rele2, OUTPUT); digitalWrite(rele2, !LOW);
// Каналы
pinMode(ch01, INPUT);
pinMode(ch02, INPUT);
pinMode(ch03, INPUT);
// Читаем из памяти данные о состоянии системы
Automatic = EEPROM.read(0);
// Читаем номер Хозяина
// кусок удален))
// Serial.begin(9600);
// делаем задержку на поиск сотовой сети
// кусок удален))
// Запускаем GSM
// gsm.begin(9600); //подключаем порт модема (при других скоростях не отвечает)
}
void loop()
{
if (StartGSM == 0){
gsm.begin(9600);
gsm.write("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
delay(300);
}
if (StartGSM == 1){
gsm.write("AT+IFC=1, 1\r"); //устанавливает программный контроль потоком передачи данных
delay(300);
}
if (StartGSM == 2){
gsm.write("AT+CPBS=\"SM\"\r");//открывает доступ к данным телефонной книги SIM-карты
delay(300);
}
if (StartGSM == 3){
gsm.write("AT+CNMI=1,2,2,1,0\r");// включает оповещение о новых сообщениях, новые сообщения
delay(500);
}
if (StartGSM == 4){
gsm.write("AT+GSMBUSY=1\r\n"); // запрет всех входящих звонков.
delay(300);
}
if (StartGSM == 5){
gsm.write("AT+CMGDA=DEL ALL\r\n"); // команда удалит все сообщения
delay(500);
}
if (FlagSignal == 0 && StartGSM == 6){
gsm.println("AT+CSQ");// Проверяем уровень сигнала
delay(800);
}
if (EEPROM.read(20) == 0 && counterClearAddrDataEEprom == 0){
RAll();
}
// кусок удален))
// Проверка уровня сигнала во время работы системы каждые и напряжение 12В проверем
counter++;
if (counter >= timerForSignalGSM && FlagSignal == 1 && StartGSM == 6){
gsm.println("AT+CSQ");
delay(300);
// Обнуляем счетчик
counter = 0;
}
//***************************************************************************************************************
// Функция Автоматики при охране
if (Automatic == 1){
if (AutoEnable == 0){
// Включаем маяк
digitalWrite(rele2, !HIGH);
// Обнуляем
digitalWrite(rele1, !LOW); // Выключаем сирену, если была вкл.
ResetAlarmAll();// Обнуляем флаги тревог, если были или не были
// SearchChannel(); // Поиск активных каналов
AutoEnable = 1;
AutoDisable = 0; // говорим, что охрана поставлена
}
if (ACh01 == 0 && FlagSignal == 1){
if (digitalRead(ch01) == !LOW){
if (digitalRead(Power220) == 1 && stateSirena !=2) {digitalWrite(rele1,!HIGH);}
// ReadNBoss();
smsSendAlarm("Alarm! Front door is open");
ACh01 = 1;
}
}
// кусок удален))
// Проверяем 220В, если Есть 220В и флаг сирены = 0
// далее, если была включена один из каналов по тревоги, то запускаем счетчик
if (digitalRead(Power220) == HIGH && stateSirena == 0){
if (ACh01 == 1 || ACh02 == 1 || ACh03 == 1){
cSirena++;
}
}
// если счетчик достиг заданного значения, то выключаем сирену и делаем флаг сирены = 1 и делаем флаг задержки для повторного вкл сирены
if (cSirena >= timerSirena){
digitalWrite(rele1,!LOW);
cNAlarm++;
stateSirena = 1;
cSirena = 0;
}
//
// если флаг задержки = 1, то запускаем счетчик для повторного вкл. сирены
if (stateSirena == 1){
csSirena++;
if (csSirena > timerStateSirena){
digitalWrite(rele1,!HIGH);
stateSirena = 0;
csSirena = 0;
}
}
// если сирена прозвучала 10 раз, то выключаем ее
if (cNAlarm == 10){
ACh01 = 0;
ACh02 = 0;
ACh03 = 0;
stateSirena = 2;
digitalWrite(rele1,!LOW);
}
}
//***************************************************************************************************************
// Функция Автоматики при снятой охране
if (Automatic == 0){
if (AutoDisable == 0){
digitalWrite(rele1, !LOW); // Выключаем сирену, если была вкл.
digitalWrite(rele2, !LOW); // Выключаем маяк, если был включен
// Обнуляем флаги тревог, если были или не были
ResetAlarmAll();
AutoDisable = 1; // Говорим, что выполнели все действия по откл. системы после снятия с охраны
AutoEnable = 0; // говорим, что охрана снята
}
}
// Проверяем состояние напряжения 220
counterVoltage220++;
if (counterVoltage220 >= timerFor12V && Automatic <= 1){
// кусок удален))
if (digitalRead(Power220) == HIGH && state220 == 1 && FlagSignal == 1){
state220 = 0;
// ReadNBoss();
// кусок удален))
smsSendAlarm("Voltage 220 Norm");
}
// Обнуляем счетчик
counterVoltage220 = 0;
}
// кусок удален))
//*******************************************************************
if (gsm.available()) { //есть данные от GSM модуля
currStr = ""; //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
currStrN = "";
dataBalanceTemp = "";
dataSms = "";
val = "";
flag1 = 0;
flag2 = 0;
while (gsm.available()) { //сохраняем входную строку в переменную val
c:
ch = gsm.read(); //int
val += char(ch); // String
data = ch; // char = int
if ('\r' == data) {
currStr = "";
} else if ('\n' != data) {
currStr += String(data);
dataSms = currStr;
}
//+CMT: "+79817425864","","16/04/18,20:25:08+12"
if (data == '+' && flag1 == 0){flag1 = 1;}
if (data == 'C' && flag1 == 1){flag1 = 2;}
if (data == 'M' && flag1 == 2){flag1 = 3;}
if (data == 'T' && flag1 == 3){flag1 = 4;}
if (data == '+' && flag1 == 4){currStrN = "";flag1 = 5;}
if (data != '"' && flag1 == 5){currStrN += String(data); dataSmsN = currStrN;}
if (data == '"' && flag1 == 5){flag1 = 6;}
// кусок удален))
}
// Смотрим данные полученные //режим кодировки СМС - обычный (для англ.)
if (val.indexOf("+CMGF") > -1){
if (dataSms.indexOf("OK") > -1) {
StartGSM = 1;
// Serial.println("StartGSM = 1");
}
}
// Смотрим данные полученные //устанавливает программный контроль потоком передачи данных
if (val.indexOf("+IFC") > -1){
if (dataSms.indexOf("OK") > -1) {
StartGSM = 2;
// Serial.println("StartGSM =2");
}
}
// Смотрим данные полученные //открывает доступ к данным телефонной книги SIM-карты
if (val.indexOf("+CPBS") > -1){
if (dataSms.indexOf("OK") > -1) {
StartGSM = 3;
// Serial.println("StartGSM = 3");
}
}
// Смотрим данные полученные //включает оповещение о новых сообщениях, новые сообщения
if (val.indexOf("+CNMI") > -1){
if (dataSms.indexOf("OK") > -1) {
StartGSM = 4;
// Serial.println("StartGSM = 4");
}
}
// Смотрим данные полученные //запрет всех входящих звонков.
if (val.indexOf("+GSMBUSY") > -1){
if (dataSms.indexOf("OK") > -1) {
StartGSM = 5;
// Serial.println("StartGSM = 5");
}
}
// Смотрим данные полученные //команда удалит все сообщения
if (val.indexOf("+CMGDA") > -1){
if (dataSms.indexOf("OK") > -1) {
StartGSM = 6;
// Serial.println("StartGSM = 6");
}
}
// Смотрим данные полученные от модуля +CSQ: 22,0
if (val.indexOf("+CSQ") > -1) {
// кусок удален))
}
// Смотрим данные полученные от модуля пришло смс
if (val.indexOf("+CMTI:") > -1) { // +CMTI: "SM",
StartGSM = 0;
}
// Смотрим данные полученные от модуля, Получили смс с балансом, теперь отсылаем
if (val.indexOf("+CUSD:") > -1) {
// кусок удален))
}
//----------------------- определение факта приема СМС и сравнение номера(ов) с заданным(и)
if (val.indexOf("+CMT") > -1) {
// Регистрация хозяина
if (dataSms.indexOf("Register") > -1 && EEPROM.read(0) == 3) {
// Serial.println("Poluchili sms Register");
k=1;
for (i=20; i<=30; i++){ // записываем с 20 по 31 ячейку номер телефона главного
EEPROM.write(i,dataSmsN[k]-48);//79995554466
k++;
}
// ReadNBoss();
EEPROM.write(0,0);
Automatic = EEPROM.read(0);
ClearDataIn();
smsSendAlarm("Hi, Your number is added as a master!");
delay(1000);
// SerialPrintEEPROM();
}
// Проверяем номер телефона хозяина
// кусок удален))
// Постановка на контроль
if (dataSms.indexOf("Control") > -1 && EEPROM.read(20) == 7 && Boss == 1){
// Постановка на охрану
if (dataSms[8]-48 == 1){
EEPROM.write(0,1);// Записываем в память что мы поставили на охрану
Automatic = EEPROM.read(0);// Читаем из памяти и записываем в переменную
ClearDataIn();
smsSendAlarm("Hi, Security is enabled");
}
// Снятие с контроля
if (dataSms[8]-48 == 0){
EEPROM.write(0,0);
Automatic = EEPROM.read(0);
ClearDataIn();
smsSendAlarm("Hi, Security is disabled");
}
}
// Квитирование тревог
if (dataSms.indexOf("Reset alarm") > -1 && EEPROM.read(20) == 7 && Boss == 1){
ClearDataIn();
ResetAlarmAll();
digitalWrite(rele1,!LOW);
// ReadNBoss();
smsSendAlarm("Hi, Alarm reset is done!");
}
// Стирание всей памяти, настройки по умолчанию
if (dataSms.indexOf("Reset all") > -1 && Automatic == 0 && EEPROM.read(20) == 7 && Boss == 1) { // Сброс всех данных по умолчанию
ClearDataIn();
smsSendAlarm("Hi, all data deleted for telephone!");
RAll();
}
// Запрос баланса, после получения ответа - отправка обратно на номер
// кусок удален))
// Запрос Отчета о системе
if (dataSms.indexOf("Hello") > -1 && EEPROM.read(20) == 7 && Boss == 1) {
ClearDataIn();
MsgHi = "";
MsgHiA = "Security: "; // Читаем данные об охране
MsgHiD = "220V: "; // Читаем данные о Напряжении
MsgHiF = "Signal: "; // Читаем сигнал сотовой сети
// Читаем данные об охране
if (Automatic == 1){MsgHiA += "On";}
if (Automatic == 0){MsgHiA += "Off";}
// Читаем напряжение
if (digitalRead(Power220) == 1){MsgHiD += "Norm";}
if (digitalRead(Power220) == 0){MsgHiD += "No";}
// Читаем остальные датчики температуры
float h = dht1.readHumidity();
float t = dht1.readTemperature();
if (isnan(t) || isnan(h)) {
MsgHiC = "Err t1!";
} else {
MsgHiC = "Outside: ";
MsgHiC += t;
MsgHiC += "C ";
MsgHiC += h;
MsgHiC += "%";
}
h = dht2.readHumidity();
t = dht2.readTemperature();
if (isnan(t) || isnan(h)) {
MsgHiCSecond += "Err t2!";
} else {
MsgHiCSecond = "Inside: ";
MsgHiCSecond += t;
MsgHiCSecond += "C ";
MsgHiCSecond += h;
MsgHiCSecond += "%";
}
h = 0.0;
t = 0.0;
// Уровень сигнала сети
IntSignalLevelTemp = map(IntSignalLevel, 0, 32, 0, 100);
MsgHiF += String(IntSignalLevelTemp);
MsgHiF += "%";
//Собираем текст
MsgHi += MsgHiA; // Hi, + Читаем состояние системы
MsgHiA = "";
MsgHi += "\r\n";
MsgHi += MsgHiD; // Читаем данные о Напряжении
MsgHiD = "";
MsgHi += "\r\n" + MsgHiC; // Читаем датчик температуры 1
MsgHiC = "";
MsgHi += "\r\n" + MsgHiCSecond; // Читаем датчик температуры 2
MsgHiCSecond = "";
MsgHi += "\r\n" + MsgHiF; // Читаем сигнал сотовой сети
MsgHiF = "";
smsSendAlarm(MsgHi);
MsgHi = "";
}
// Вкл. выкл. каналов для сигнализации системы
// кусок удален))
// Запрос состояния активных входов
// кусок удален))
// Управление релейными выходами
//Реле 1
// if (dataSms.indexOf("Rele1 on") > -1 && Boss == 1) {
// ClearDataIn();
// digitalWrite(rele1, !HIGH);
// smsSendAlarm("Hi, Rele1 On");
// }
// if (dataSms.indexOf("Rele1 off") > -1 && Boss == 1) {
// ClearDataIn();
// digitalWrite(rele1, !LOW);
// smsSendAlarm("Hi, Rele1 Off");
// }
////Реле 2
// if (dataSms.indexOf("Rele2 on") > -1 && Boss == 1) {
// ClearDataIn();
// digitalWrite(rele2, !HIGH);
// smsSendAlarm("Hi, Rele2 On");
// }
// if (dataSms.indexOf("Rele2 off") > -1 && Boss == 1) {
// ClearDataIn();
// digitalWrite(rele2, !LOW);
// smsSendAlarm("Hi, Rele2 Off");
// }
}//+cmt
currStr = "";
currStrN = "";
dataSms = "";
dataSmsN = "";
val = "";
}
}
//процедура отправки СМС
// кусок удален))
void ClearAddresDataEEPROM(){ // Очистка EEPROM
for (i=0; i<=35; i++){
EEPROM.write(i,0);
}
// SerialPrintEEPROM();
}
void GoBalans(){
gsm.print("AT+CUSD=1,");
gsm.print('"');
gsm.print("#100#");
gsm.println('"');
}
void ReadNBoss(){
// кусок удален))
}
void ResetAlarmAll(){
// Обнуляем флаги тревог, если были или не были
ACh01 = 0; // сбрасываем флаг об включении канала
ACh02 = 0; // сбрасываем флаг об включении канала
ACh03 = 0; // сбрасываем флаг об включении канала
Kvitir12V = 0; // сбрасываем флаг об низком напряжении на аккумуляторе
stateSirena = 0; // флаг сирены
cSirena = 0; // счетчик для выключения сирены
csSirena = 0; // счетчик для повторного вкл. сирены
cNAlarm = 0; // счетчик для деактивации сирены после 10 раз срабатывании
}
void ClearDataIn(){
// Очистка временных переменных
currStr = "";
currStrN = "";
dataBalanceTemp = "";
dataSms = "";
dataBalance = "";
val = "";
flag1 = 0;
flag2 = 0;
}
void RAll(){
// Удаление всех настроек и номера
digitalWrite(rele1, !LOW);
digitalWrite(rele2, !LOW);
ClearAddresDataEEPROM();
EEPROM.write(0,3);
Automatic = EEPROM.read(0);
counterClearAddrDataEEprom = 1;
}
[/code]
зря, умный всеравно сделает свое, а дурак и в хорошем коде не разберется.
здесь большинство учатся хорошему коду, поэтому хорошие примеры всегда приветствуются.
Простой Пример работы смс комманд на модуль
При отправке на модуль смс "Green on", включится светодиод
При отправке на модуль смс "Green off", выключится светодиод
При отправке на модуль смс "Yellowon", включится светодиод
При отправке на модуль смс "Yellow off", выключится светодиод
[code]
#include SoftwareSerial.h
SoftwareSerial gprsSerial(2, 3); // RX, TX вашего GSM модема
int greenPin = 5;
int yellowPin = 6;
void setup()
{
gprsSerial.begin(9600);//подключаем порт модема (у меня отлично работает на 9600)
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
// Настраиваем приём сообщений с других устройств
// Между командами даём время на их обработку
gprsSerial.print("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
delay(300);
gprsSerial.print("AT+IFC=1, 1\r"); //устанавливает программный контроль потоком передачи данных
delay(300);
gprsSerial.print("AT+CPBS=\"SM\"\r");//открывает доступ к данным телефонной книги SIM-карты
delay(300);
gprsSerial.print("AT+CNMI=1,2,2,1,0\r");// включает оповещение о новых сообщениях, новые сообщения
delay(500);
gprsSerial.print("AT+GSMBUSY=1\r\n"); // запрет всех входящих звонков.
delay(300);
gprsSerial.print("AT+CMGDA=DEL ALL\r\n"); // команда удалит все сообщения
delay(300);
}
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
void loop()
{
if (!gprsSerial.available())
return;
char currSymb = gprsSerial.read();
if ('\r' == currSymb) {
if (isStringMessage) {
//если текущая строка - SMS-сообщение,
//отреагируем на него соответствующим образом
if (!currStr.compareTo("Green on")) {
digitalWrite(greenPin, HIGH);
} else if (!currStr.compareTo("Green off")) {
digitalWrite(greenPin, LOW);
} else if (!currStr.compareTo("Yellow on")) {
digitalWrite(yellowPin, HIGH);
} else if (!currStr.compareTo("Yellow off")) {
digitalWrite(yellowPin, LOW);
}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}
[/code]
Простой запрос баланса
gsm.print("AT+CUSD=1,");
gsm.print('"');
gsm.print("#100#");// работает на 100% с МТС
gsm.println('"');
Простая отправка смс на телефон
void smsSendAlarm(String text) { // Например в скетче есть текст, его надо отправить (smsSendAlarm("Текст, который надо отправить");)
String Number = "79995551122";
gsm.println("AT+CMGS=\"" + Number + "\"");//Number - номер телефона в формате 79995551122, без знака +
delay(1000);
gsm.print(text);// text - там хранится сообщение, которое вы передали (smsSendAlarm("Текст, который надо отправить");)
text = "";// очищаем буфер
delay(1800);
gsm.print((char)26);
delay(1500);
}
Гении, подскажите. Случилась такая ситуация. Как и многие здесь сидящие собираю свой проект на Ардуине. Купил 2 модуля SIM800L. В целом модули рабочие. Но как рабочие, при загрузке тестового скеча при помощи монитора прогоняются все комманды на отлично, озыв (ответ) есть по каждой комманде. Но если в void setup() есть любая строка, типа mySerial.println("AT") или любая другая комманда, при положительном исполнении которой должен придти ответ "ОК", то ответа нет. Хотя точно знаю, что комманда прошла отлично, да и вообще весь скетч работает на отлично. И на телефон звонит, и смс отправляет, и звонки принимает, причем даже отрабатывая АОН и и сполняя любую задачу. А вот в сериалМониторе ответов об исполнении комманд нет. Кто подскажет в чем беда?
надо писать так наверное: mySerial.println("AT\r")
кидай скетч сюда ща мы его украдем и будем деньги рубить)
капусту... скетч на капусту..
Да в принципе ничего секретного. Пока тестирую модули на представленных в интернете примерах. Остановился на этом. http://2150692.ru/faq/46-sim800l-arduino.
Начало:
в seput () есть строка mySerial.println("AT")
а в видеопояснении видно, что сериалмонитор при запуске, отработал эту комманду как
АТ
ОК
а у меня так не получается, автоматического ответа нет, просто Goodnight moon!, без АТ ОК. но ести принудительно отправить комманду АТ от ответ будет получен ОК, и на остальные комманды отвечают ОК.
Вот и возник вопрос, с чем это может быть связано?
Вот еще что заметил, люди жалуются, что часто проблемы возникают из за отсутствующего общего минуса (заземдения) между Ардуино и модулем. В видео примере, чувак сделал общий минус до понижения с 12В до рабочих 4,0В (на уровне 12В). Я сделал общий минус как раз после понижения, на уровне 4,0В. Это чисто для размышления.
И еще, случайно, когда SIM модуль подключал к аналогичному в видеопримере преобразователю напряжения, накрутил на выходе 4,4 В. Молудь практически не работал, на комманды не отвечал, звонки не принимал.В тестовом примере показал OVER VOLTAGE. Понизил до 4,1В. Траблы прекратились, модуль заработал, но автоответы на комманды в setup () так и не появились. Может я их немного поджог?
GSM модуль достаточно тормознутый сделай паузу между begin() и println("AT")
Сколько попробовать, при условии, что и Сериал бегин и бегин модуля выставлены на 9600?
Скорость gsm и сериал монитора на 9600 поставь
#include SoftwareSerial.h
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
Serial.begin(9600); //Скорость порта для связи Arduino с компьютером
Serial.println("Goodnight moon!");
mySerial.begin(9600); //Скорость порта для связи Arduino с GSM модулем
mySerial.println("AT");
}
void loop() {
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
Так я на 9600 и поставил. Прелагают ввести задержку и мне интересно сколько? У меня при 9600 ответов и не поступает, вот в чем беда. Глянь пожалуйста мой пост, где я привожу пример. Может что из последних тезисов про питание на рекомендации намекнет.
Так я на 9600 и поставил. Прелагают ввести задержку и мне интересно сколько? У меня при 9600 ответов и не поступает, вот в чем беда. Глянь пожалуйста мой пост, где я привожу пример. Может что из последних тезисов про питание на рекомендации намекнет.
1. Перед подключением к преобразователю напряжения необходимо его настроить выставив выходное напряжение на любое в диапазоне 3.7В - 4.2В
2. У меня все работает стабильно, пост 186
Всё, разобрался, пошло.
1. Что сделал, понизил напругу до 4,0В, что б модулю вообще комфортно было.
2. Разобрался с кодом. Я значит случайно сделал ошибку, что проигнорировал этот абзац в полном объеме:
void loop() {
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
Все дело в том, что я стер эту часть
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
и сразу приступил к выполнению свяких условий. А именно эта часть и позволяет увилить в сериал мониторе ответ по комманде.
Для эксперимента:
#include SoftwareSerial.h
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
Serial.begin(9600); //Скорость порта для связи Arduino с компьютером
Serial.println("Goodnight moon!");
mySerial.begin(9600); //Скорость порта для связи Arduino с GSM модулем
mySerial.println("AT");
}
void loop() {
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
ответ АТ ОК будет,
#include SoftwareSerial.h
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
Serial.begin(9600); //Скорость порта для связи Arduino с компьютером
Serial.println("Goodnight moon!");
mySerial.begin(9600); //Скорость порта для связи Arduino с GSM модулем
mySerial.println("AT");
}
void loop() {
}
ответа ОК не будет, хотя АТ прогрузиться. Будет только Goodnight moon! Вот так я понял, что больше половины проблем у участников форума это участники форума.
Всё, разобрался, пошло.
1. Что сделал, понизил напругу до 4,0В, что б модулю вообще комфортно было.
2. Разобрался с кодом. Я значит случайно сделал ошибку, что проигнорировал этот абзац в полном объеме:
void loop() {
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
Все дело в том, что я стер эту часть
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
и сразу приступил к выполнению свяких условий. А именно эта часть и позволяет увилить в сериал мониторе ответ по комманде.
Для эксперимента:
#include SoftwareSerial.h
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
Serial.begin(9600); //Скорость порта для связи Arduino с компьютером
Serial.println("Goodnight moon!");
mySerial.begin(9600); //Скорость порта для связи Arduino с GSM модулем
mySerial.println("AT");
}
void loop() {
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
ответ АТ ОК будет,
#include SoftwareSerial.h
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
Serial.begin(9600); //Скорость порта для связи Arduino с компьютером
Serial.println("Goodnight moon!");
mySerial.begin(9600); //Скорость порта для связи Arduino с GSM модулем
mySerial.println("AT");
}
void loop() {
}
ответа ОК не будет, хотя АТ прогрузиться. Будет только Goodnight moon! Вот так я понял, что больше половины проблем у участников форума это участники форума.
Все правильно сделал, но код ниже нужен только для отладки
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
КТо знает сразу же как удалить отправленные СМС из модуля или СИМ карты?
Заметил что после отправки СМС модуль возвращает количество отправленных СМС и количество растет, думаю что скоро переполнится и что будт после ХЗ, может просто затираться будут старые, а может ошибку нарисует.
Нашел команду AT+CMGD="DEL ALL" но что то не дуйствует или синтаксис не тот. ПОделитесь секретом...
где "нашли" такую команду?
неужели в даташите на сим800? вот в даташите следует "искать".
В нем нашел
at+cmgda=?
+CMGDA: ("DEL READ","DEL UNREAD","DEL SENT","DEL UNSENT","DEL INBOX","DEL ALL")
п.6.2.25
КТо знает сразу же как удалить отправленные СМС из модуля или СИМ карты?
Заметил что после отправки СМС модуль возвращает количество отправленных СМС и количество растет, думаю что скоро переполнится и что будт после ХЗ, может просто затираться будут старые, а может ошибку нарисует.
Нашел команду AT+CMGD="DEL ALL" но что то не дуйствует или синтаксис не тот. ПОделитесь секретом...
Команда удалит все сообщения:
gsm.write("AT+CMGDA=DEL ALL\r\n"); // команда удалит все сообщения
delay(500);
Я такую пробовал через черминал, но исходящие все одно не удаляются, т.е после отправки сообщения модуль выдает CMGS:90, 91,92 и так далее. Может это не исходящие сообщения вообще и я зря этим заморачиваюсь?
1- дайте команду модулю: at+cmgda?
2 - какой у вас модуль??
3 - попробуйте дать вместо вашей - AT+CMGD=1,4
1.at+cmgda=?
+CMGDA: ("DEL READ","DEL UNREAD","DEL SENT","DEL UNSENT","DEL INBOX","DEL ALL")
Что этодает? Хоть чуть не та команда..
2. модуль конечно 800L тема же про него
3.AT+CMGD=1,4 постоянно даю после чтения входящих, на отправленные не влияет
1.at+cmgda=?
+CMGDA: ("DEL READ","DEL UNREAD","DEL SENT","DEL UNSENT","DEL INBOX","DEL ALL")
Что этодает? Хоть чуть не та команда..
2. модуль конечно 800L тема же про него
3.AT+CMGD=1,4 постоянно даю после чтения входящих, на отправленные не влияет
gsm.println("AT+CMGDA=\"DEL SENT\""); // АТ команда модему , удалить отправленные сообщения с sim карты
3.AT+CMGD=1,4 постоянно даю после чтения входящих, на отправленные не влияет
вы действительно пишите где и как вы эти команды применяете.
я например проверяю все вначале в терминалке! и только потом если все так как мне хочется, пытаюсь в правильном формате вставлять в код. Никак иначе.
А если вы просто вслепую вставляете команды в код и не видите ответа модуля - то помочь будет сложно.
В терминале конечно делаю