В текущей статье рассмотим как с помощью GSM модуля SIM800L и платы Arduino UNO R3 отправлять данные на Ваш сайт. Будем отправлять изменения состояния магнитного датчика (геркона), изменилось состояние датчика отправили сайт время и состояние датчика. Получится прототип сигнализации и ведением журнала на открывание/закрываение двери или окна. Для работы нам дополнительно понадобится наличие своего сайта с возможностью работы с PHP.

Постановка задачи

  • Мониторить состояние магнитоного датчика (геркона) и при изменении его состояния отправлять на сайт время и состояние датчика
  • На сайте сохранять принятые данные в файл журнала

Подготовка и подключение

  1. Собираем устройство согласно схеме на картинке
    Схема подключения SIM800L и датчика геркона к Arduino
    Учитывая, что напряжение уровней модуля должны быть 2.8В, то следует сделать делители напряжений для контактов идущих от RX/TX модуля к 2,3-му на Ардуине. В моем случае работало без проблем и так.
  2. Заливаем в Arduino скетч. Вместо сайта "mysite.ru" вписывайте свой адрес сайта
  3. Создаем файл PHP скрипта и закачиваем его на сервер

Скетч (для клиента)

#include <SoftwareSerial.h>
SoftwareSerial GSMport(2, 3); // RX, TX
int char_;
int SensorPin = 10;
int SensorState;
int SensorLastState = HIGH;

void setup() {
delay(3000); //дадим время на инициализацию GSM модулю   pinMode(SensorPin, INPUT);   digitalWrite(SensorPin, HIGH); //вкл. подтягивающий резистор 20ом   Serial.begin(9600); //скорость порта   Serial.println("GPRS test");   GSMport.begin(9600);   gprs_init(); } void loop() {   SensorState = digitalRead(SensorPin);   if (SensorState != SensorLastState) { //если смена состояния датчика     Serial.print("sensor changed to: ");     Serial.println(SensorState);     SensorLastState = SensorState;     gprs_send(String(SensorState));     delay(100);   }   if (GSMport.available()) { //если GSM модуль что-то послал нам, то     Serial.println(ReadGSM()); //печатаем в монитор порта пришедшую строку   }   delay(100); } void gprs_init() { //Процедура начальной инициализации GSM модуля   int d = 500;   int ATsCount = 7;   String ATs[] = { //массив АТ команд     "AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"", //Установка настроек подключения     "AT+SAPBR=3,1,\"APN\",\"internet.tele2.ru\"",     "AT+SAPBR=3,1,\"USER\",\"tele2\"",     "AT+SAPBR=3,1,\"PWD\",\"tele2\"",     "AT+SAPBR=1,1", //Устанавливаем GPRS соединение     "AT+HTTPINIT", //Инициализация http сервиса     "AT+HTTPPARA=\"CID\",1" //Установка CID параметра для http сессии   };   int ATsDelays[] = {6, 1, 1, 1, 3, 3, 1}; //массив задержек   Serial.println("GPRG init start");   for (int i = 0; i < ATsCount; i++) {     Serial.println(ATs[i]); //посылаем в монитор порта     GSMport.println(ATs[i]); //посылаем в GSM модуль     delay(d * ATsDelays[i]);     Serial.println(ReadGSM()); //показываем ответ от GSM модуля     delay(d);   }   Serial.println("GPRG init complete"); } void gprs_send(String data) { //Процедура отправки данных на сервер   //отправка данных на сайт   int d = 400;   Serial.println("Send start");   Serial.println("setup url");   GSMport.println("AT+HTTPPARA=\"URL\",\"http://mysite.ru/?a=" + data + "\"");   delay(d * 2);   Serial.println(ReadGSM());   delay(d);   Serial.println("GET url");   GSMport.println("AT+HTTPACTION=0");   delay(d * 2);   Serial.println(ReadGSM());   delay(d);   Serial.println("Send done"); } String ReadGSM() { //функция чтения данных от GSM модуля   int c;   String v;   while (GSMport.available()) { //сохраняем входную строку в переменную v     c = GSMport.read();     v += char(c);     delay(10);   }   return v; }

 

PHP скрипт (для сервера)

Сохраняем на сервере в файл index.php

<?php
  $ip = $_SERVER['REMOTE_ADDR']; //получаем IP адрес клиента
  $client = $_SERVER['HTTP_USER_AGENT']; //получаем идентификатор HTTP клиента
  $today = date("Y.m.d H:i:s"); //получаем текущие дату и время
  $f = fopen("log.csv","a"); //открываем файл для добавления данных
  $param = $_REQUEST['a']; //получаем значение посланной переменной "а"
  fwrite($f,"$today; $ip; $client; sensor=$param\r\n-----------------\r\n"); //запись данных в файл
  fclose($f); //закрываем файл
?>
<p>GPRS data read page</p>

 

Проверка

Состояние SIM800L при установленном GPRS соединении

Подавать питание рекомендую сперва GSM модулю, потом соединять Ардуину с ПК. Включаем монитор порта и наблюдаем.

Инициализация

Должны пробежать двойные строчки с АТ командами. Если показываются по одной АТ команде, значит нет связи с SIM800L. После инициализации при успешном создании GPRS сеанса светодиод на GSM модуле начнет часто моргать.

GPRS test
GPRG init start
AT+SAPBR=3,1,"CONTYPE","GPRS"
AT+SAPBR=3,1,"CONTYPE","GPRS"

OK

AT+SAPBR=3,1,"APN","internet.tele2.ru"
AT+SAPBR=3,1,"APN","internet.tele2.ru"

OK

AT+SAPBR=3,1,"USER","tele2"
AT+SAPBR=3,1,"USER","tele2"

OK

AT+SAPBR=3,1,"PWD","tele2"
AT+SAPBR=3,1,"PWD","tele2"

OK

AT+SAPBR=1,1
AT+SAPBR=1,1

OK

AT+HTTPINIT
AT+HTTPINIT

OK

AT+HTTPPARA="CID",1
AT+HTTPPARA="CID",1

OK

GPRG init complete

 

Сработка датчика и отправка на сервер

Отправка через открытый GET запрос с передачей параметра в URL строке. Значение состояния датчика передаем через переменную "а". "?a=0" - передана переменная "а" со значением "0".

sensor changed to: 0
Send start
setup url
AT+HTTPPARA="URL","http://mysite.ru/?a=0

ERROR

GET url
AT+HTTPACTION=0

OK

Send done

+HTTPACTION: 0,200,26

 

Проверяем сервер

На сервере должен появиться файл со следующим содержимым:

2015.09.02 13:26:51; 176.59.197.176; SIMCOM_MODULE; sensor=0
-----------------
2015.09.02 13:27:14; 176.59.199.8; SIMCOM_MODULE; sensor=1
-----------------

 

Теперь вы можете самостоятельно сделать свой GPS трекер на авто или метео станцию со сбором данных.

Иногда спрашивают, а как бы через интернет поуправлять Ардуиной с GSM модулем? Одним из решений считаю на сервере сделать скрипт, который бы при запросе от SIM800L возвращал нужные команды и далее можно их анализировать в коде скетча.

На этом все. Вопросы и пожелания пишите в комментариях.

Комментарии   

+4 # Денис 29.09.2015 17:32
Хороший урок, спасибо!
еще хотелось бы увидеть урок с чтением данных с сервера, т.е. управление контроллером через сайт.
Ответить | Ответить с цитатой | Цитировать
+6 # Администратор 29.09.2015 17:34
Сделаю позже. Поморгаем светодиодом через сайт.
Ответить | Ответить с цитатой | Цитировать
+1 # Алан 17.02.2016 17:44
Цитирую Администратор :
Сделаю позже. Поморгаем светодиодом через сайт.


Хотелось бы увидеть это.
Толково описываешь, молодец.
Ответить | Ответить с цитатой | Цитировать
0 # Степан 29.12.2015 22:01
Здравствуйте! Подскажите куда подключать микрофон и динамик? Лучше расписать на картинке для чего нужен каждый выход . Спасибо!
Ответить | Ответить с цитатой | Цитировать
0 # Алексей 06.11.2016 18:53
поддерживаю! как это сделать?
Ответить | Ответить с цитатой | Цитировать
0 # shuser 09.01.2016 03:04
Спасибо! Как раз такой же проект делаю. Герконы, смс, бд.
Ответить | Ответить с цитатой | Цитировать
0 # Олег 27.01.2016 21:18
Добрый вечер. Отличный урок. Слежу за вашими трудами. Прошу помощи, у меня не получается повторить за вами ваш урок. Модуль у меня sim800l
А именно: Не выполняется ссылка. После нее Error, как и у вас. Но, после AT+HTTPACTION=0 тоже error.
При первой инициализации лампочка моргает с длинными паузами, а после команды AT+SAPBR=1,1 пишет OK и начинает моргать быстро. Оператор киевстар, у него из параметров соединения только APN, логина и пароля нет. Что можете посоветовать? Ссылка заведомо верная проверял браузером.
Ответить | Ответить с цитатой | Цитировать
0 # Администратор 28.01.2016 08:08
Спасибо за отзыв. Я бы сперва попробовал эту симку на обычном телефоне, будет ли соединятся с интернетом.
Ответить | Ответить с цитатой | Цитировать
0 # Олег 28.01.2016 10:10
Забыл об этом написать. В телефоне все ОК. Вставлял разные снимки. Настройки апн проверял, корипастил.. не соединяется и все.
Ответить | Ответить с цитатой | Цитировать
0 # Алексей 29.01.2016 21:46
Пишет ошибку 601 и не заходит на сайт,хотя везде отвечает ОК при инициализации.
Симка в телефоне работает норм. Что может быть?
Ответить | Ответить с цитатой | Цитировать
0 # Олег 30.01.2016 01:19
После того как исправил неточность все заработало.
После исправления были ошибки 601 и 603 - вылечил перезагрузкой девайса.
Ответить | Ответить с цитатой | Цитировать
0 # Алексей 31.01.2016 17:48
Вот и у меня постоянно ошибка 601, и то при условии что всё прошло до этого нормально...
Часто сбрасывается модуль...просто пипец какой-то...с СМС всё в порядке, а на сайт не идет упорно...
У Вас как подключено RX TX? Как у автора напрямую?
Ответить | Ответить с цитатой | Цитировать
0 # Олег 04.02.2016 20:09
да, вроде как у автора. Уже не помню. Девайс сейчас проходит испытания в полевых условиях.
Есть вопрос к знатокам. В целом это у меня GPS трекер. Заметил неприятную особенность этого модуля, он зависает приблизительно после 6 часов работы. Подскажите, как правильно это мониторить и какие действия предпринимать что бы его оживить, т.к. девайс не всегда будет при мне и мне нужна автономность.
Ответить | Ответить с цитатой | Цитировать
0 # Семён 24.02.2016 03:36
А у меня выдаёт ошибку 302. Через браузер скрипт обрабатывается, а через модуль - +HTTPACTION: 0,302,0
Ответить | Ответить с цитатой | Цитировать
0 # Юрий 13.03.2016 21:10
Здравствуйте! Спасибо за полезную информацию! Немного переделал ваш скетч для отправки данных на Thingspeak. Интересует значение символов "\", "+" например, в этой строке: GSMport.println("AT+HTTPPARA=\"URL\",\"http://mysi te.ru/?a=" + data + "\""); Где можно прочитать про синтаксис, или может объясните вкратце?
Ответить | Ответить с цитатой | Цитировать
0 # Петро 01.04.2016 13:10
Хороший пример, у меня все получилось, спасибо.
Но сейчас озадачен получением и обработкой ответа от сервера. Например в нашем случае сервер возвращает нам строку: "GPRS data read page".
Как нам ее получить в этом коде?
Вроде за это отвечает "ReadGSM()" но ничего не получается у меня.
Ответить | Ответить с цитатой | Цитировать
0 # Максим 26.04.2016 15:32
добрый день,пдскажите а можно подключить данный модуль к прибору учета тепла,чтоб удаленно снимать показания прибора
Ответить | Ответить с цитатой | Цитировать
0 # Виктор 23.05.2016 11:52
Спасибо автору за этот урок. Искал как передавать состояние датчиков через СМС, а нашёл это. Подошло как нельзя лучше.
Ответить | Ответить с цитатой | Цитировать
0 # Макс42 31.05.2016 20:00
привет всем,подскажите после настройки сим800л,какую команду нужно ввести чтоб настройки сохронялись,а то после отлючения питания приходится настраивать завново
Ответить | Ответить с цитатой | Цитировать
0 # paria 02.07.2016 11:34
youuuuuuuuu Are the Best :D
Ответить | Ответить с цитатой | Цитировать
0 # paria 31.07.2016 20:47
hi
i need your Help
after sim800 sent data to server i need server to send data to sim800 but i dont know how?!! please tell me what are the codes i should write in my server or on my module??
its very important for me :sad:
Ответить | Ответить с цитатой | Цитировать
0 # Smith 30.08.2016 16:16
Какой минимальный расход трафика удавалось получить за одно подключение и отправку данных?
У оператора есть услуга 2мб в сутки бесплатно, и Тарификация передачи данных - 1 Килобайт.
Ответить | Ответить с цитатой | Цитировать
0 # Петр 24.10.2016 02:22
По-поводу трафика. Если вам известно как конкретно считает трафик ваш провайдер, то лучше, для экономии слать блоками чуть меньше от тарифицируемого. Например, если у вас блок 1КБ (килобайт), то с скетче копите данные и отправляйте куском в 1КБ. Так будет минимальный расход трафика.
Ответить | Ответить с цитатой | Цитировать
0 # Петр 24.10.2016 02:24
И в догонку. Не забудьте что трафик тарифицируется ВЕСЬ. Т.е. как ОТ вас так и К вам.
Ответить | Ответить с цитатой | Цитировать
0 # Smith 24.10.2016 18:47
Цитирую Петр:
И в догонку. Не забудьте что трафик тарифицируется ВЕСЬ. Т.е. как ОТ вас так и К вам.

Больше интересует, считает ли провайдер траффик (подключения-отключения - информацию об устройстве и т.д.) и какаой примерно объем трафика затрачивается на "служебную" информацию.
Ответить | Ответить с цитатой | Цитировать
+1 # Петр 25.10.2016 15:13
Цитирую Smith:

Больше интересует, считает ли провайдер траффик (подключения-отключения - информацию об устройстве и т.д.) и какаой примерно объем трафика затрачивается на "служебную" информацию.

Хм... Вопрос можно рассмотреть так: На сколько мне известно, то весь стартовый/стоповый служебный трафик в виде логин/пароль, etc НЕ ДОЛЖЕН тарифицироваться. Но это не главное. Главное в другом. Пример: Вы передаете на сервер какую-то информацию в виде GET-запроса, в свою очередь сервер обработав запрос что-то Вам отвечает. Так вот
Ваш запрос (TCP-пакет), например, с заголовком и прочим составляет 400 байт - Вам будет засчитано 1Кбайт исходящего трафика. Ответ от сервера составляет 109 байта - Вам будет засчитано 1Кбайт входящего трафика. В сумме на пересылку от вас 400 байт, к вам 109 = 509, а засчитают 2Кбайта. По-этому я и говорил выше: Скрипт выписать надо так, чтобы вы не 5 раз поднимали сессию и гнали 400 байт, а одной сессией и одним пакетом 1024 байта.
Ответить | Ответить с цитатой | Цитировать
+1 # Петр 25.10.2016 15:16
Цитирую Smith:
Больше интересует, считает ли провайдер траффик (подключения-отключения - информацию об устройстве и т.д.) и какаой примерно объем трафика затрачивается на "служебную" информацию.

По сути вопроса: провайдер НЕ ДОЛЖЕН считать стратовый/стоповый служебный трафик как за трафик.
Что касается "примерный объем служебного трафика", то он, как обычно составляет до 10% от полезного. Почитайте про TCP-пакет, заголовки и фрагментацию.
Ответить | Ответить с цитатой | Цитировать
0 # Smith 06.11.2016 16:46
Добрый день, пришел модем и макетная плата.
Не выходят сообщения "ОК" в подтверждении команд, иногда проскакивают "я", "яяя" и другая ерунда.
1) Может ли схема сработать если не подавать отдельное питание на колодку POWER - а, просто запитать от USB. Так же не подключая ни какого датчика на 10 контакт. Прочитал Ваш скеч и заметил, что первый раз может отправить информацию "0" и без подключения датчика на 10 контакт.
2) Грешу на плохой контакт при соединении через макетную плату. Так же не припаяна антенна (надеялся что антенной может служить контактная группа макетной платы).
Сейчас сажусь паять контакты. Покрутим после пайки.
*- модем запитал от аккумулятора li-on 3.7V.
Ответить | Ответить с цитатой | Цитировать
0 # Алексей 20.02.2017 21:44
Подскажите как должен выглядеть массив ATs[] с оператором теле2, но когда не требуется пароль и логин?
Ответить | Ответить с цитатой | Цитировать
0 # alllex 05.03.2017 02:49
Подскажите, использую вордпресс. Куда именно добавь скрипт? в файл индекс, который находится в теме?
Контролирую активность на сервере, запросы приходят, но файл log не создается. Создал сам этот файл. В него ничего не добавляется
Ответить | Ответить с цитатой | Цитировать
0 # Юрий 24.05.2017 22:03
Здравствуйте! Подскажите пожалуйста,как в терминальной программе (не в arduino) отправить модему cntrl+z для отправки сообщения. Пробовал и в ASCII формате и в HEX, никак не получается.
Ответить | Ответить с цитатой | Цитировать
0 # Администратор 26.05.2017 16:24
в этой программе
http://2150692.ru/files/terminal_19b.zip
посылать $1A (аналог сочетания CTRL+Z)
Ответить | Ответить с цитатой | Цитировать
0 # Петро 26.05.2017 16:03
помогите вывод Serial.println(ReadGSM()); загнать в текстовую переменную.
Ответить | Ответить с цитатой | Цитировать
0 # Администратор 26.05.2017 16:27
String s = ReadGSM();
Ответить | Ответить с цитатой | Цитировать
0 # Петро 10.06.2017 19:43
Не получается.
Делаю:
GSMport.println("AT+HTTPACTION=0");
delay(d * 2);
Serial.println(ReadGSM());
delay(d);
GSMport.println("AT+HTTPREAD");
delay(d * 2);
st = ReadGSM();
Serial.println(st);
Serial.println(st); / проверка


Но получаю в переменную текст:
AT+HTTPREAD
OK

Как мне получить вывод в переменную
"GPRS data read page"
Ответить | Ответить с цитатой | Цитировать
0 # Игорь 09.06.2017 13:02
Разобрался, теперь другой вопрос. Как выглядит массив передаваемых данных для Теле2, но без логина и пароля?
Ответить | Ответить с цитатой | Цитировать
0 # Петро 09.06.2017 13:42
Как получить весь текст от html без потерь?
У меня получается все обрезанное, и то через раз все.

GSMport.println("AT+HTTPREAD");
delay(d * 2);
Serial.println(ReadGSM());
Ответить | Ответить с цитатой | Цитировать
0 # bandirom 17.09.2017 01:42
Очень благодарен. Помогли передать инфу с датчика движения на сайт.
Ответить | Ответить с цитатой | Цитировать

Добавить комментарий


Защитный код
Обновить