В текущей статье рассмотим как с помощью GSM модуля SIM800L и платы Arduino UNO R3 отправлять данные на Ваш сайт. Будем отправлять изменения состояния магнитного датчика (геркона), изменилось состояние датчика отправили сайт время и состояние датчика. Получится прототип сигнализации и ведением журнала на открывание/закрываение двери или окна. Для работы нам дополнительно понадобится наличие своего сайта с возможностью работы с PHP.
Постановка задачи
- Мониторить состояние магнитоного датчика (геркона) и при изменении его состояния отправлять на сайт время и состояние датчика
- На сайте сохранять принятые данные в файл журнала
Подготовка и подключение
- Собираем устройство согласно схеме на картинке
Учитывая, что напряжение уровней модуля должны быть 2.8В, то следует сделать делители напряжений для контактов идущих от RX/TX модуля к 2,3-му на Ардуине. В моем случае работало без проблем и так. - Заливаем в Arduino скетч. Вместо сайта "mysite.ru" вписывайте свой адрес сайта
- Создаем файл 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>
Проверка
Подавать питание рекомендую сперва 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 возвращал нужные команды и далее можно их анализировать в коде скетча.
На этом все. Вопросы и пожелания пишите в комментариях.
А именно: Не выполняется ссылка. После нее Error, как и у вас. Но, после AT+HTTPACTION=0 тоже error.
При первой инициализации лампочка моргает с длинными паузами, а после команды AT+SAPBR=1,1 пишет OK и начинает моргать быстро. Оператор киевстар, у него из параметров соединения только APN, логина и пароля нет. Что можете посоветовать? Ссылка заведомо верная проверял браузером.
Симка в телефоне работает норм. Что может быть?
После исправления были ошибки 601 и 603 - вылечил перезагрузкой девайса.
Часто сбрасывается модуль...просто пипец какой-то...с СМС всё в порядке, а на сайт не идет упорно...
У Вас как подключено RX TX? Как у автора напрямую?
Есть вопрос к знатокам. В целом это у меня GPS трекер. Заметил неприятную особенность этого модуля, он зависает приблизительно после 6 часов работы. Подскажите, как правильно это мониторить и какие действия предпринимать что бы его оживить, т.к. девайс не всегда будет при мне и мне нужна автономность.
Но сейчас озадачен получением и обработкой ответа от сервера. Например в нашем случае сервер возвращает нам строку: "GPRS data read page".
Как нам ее получить в этом коде?
Вроде за это отвечает "ReadGSM()" но ничего не получается у меня.
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:
У оператора есть услуга 2мб в сутки бесплатно, и Тарификация передачи данных - 1 Килобайт.
Больше интересует, считает ли провайдер траффик (подключения-отключения - информацию об устройстве и т.д.) и какаой примерно объем трафика затрачивается на "служебную" информацию.
Хм... Вопрос можно рассмотреть так: На сколько мне известно, то весь стартовый/стоповый служебный трафик в виде логин/пароль, etc НЕ ДОЛЖЕН тарифицироваться. Но это не главное. Главное в другом. Пример: Вы передаете на сервер какую-то информацию в виде GET-запроса, в свою очередь сервер обработав запрос что-то Вам отвечает. Так вот
Ваш запрос (TCP-пакет), например, с заголовком и прочим составляет 400 байт - Вам будет засчитано 1Кбайт исходящего трафика. Ответ от сервера составляет 109 байта - Вам будет засчитано 1Кбайт входящего трафика. В сумме на пересылку от вас 400 байт, к вам 109 = 509, а засчитают 2Кбайта. По-этому я и говорил выше: Скрипт выписать надо так, чтобы вы не 5 раз поднимали сессию и гнали 400 байт, а одной сессией и одним пакетом 1024 байта.
По сути вопроса: провайдер НЕ ДОЛЖЕН считать стратовый/стоповый служебный трафик как за трафик.
Что касается "примерный объем служебного трафика", то он, как обычно составляет до 10% от полезного. Почитайте про TCP-пакет, заголовки и фрагментацию.
Не выходят сообщения "ОК" в подтверждении команд, иногда проскакивают "я", "яяя" и другая ерунда.
1) Может ли схема сработать если не подавать отдельное питание на колодку POWER - а, просто запитать от USB. Так же не подключая ни какого датчика на 10 контакт. Прочитал Ваш скеч и заметил, что первый раз может отправить информацию "0" и без подключения датчика на 10 контакт.
2) Грешу на плохой контакт при соединении через макетную плату. Так же не припаяна антенна (надеялся что антенной может служить контактная группа макетной платы).
Сейчас сажусь паять контакты. Покрутим после пайки.
*- модем запитал от аккумулятора li-on 3.7V.
Контролирую активность на сервере, запросы приходят, но файл log не создается. Создал сам этот файл. В него ничего не добавляется
http://2150692.ru/files/terminal_19b.zip
посылать $1A (аналог сочетания CTRL+Z)
Делаю:
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"
У меня получается все обрезанное, и то через раз все.
GSMport.println("AT+HTTPREAD");
delay(d * 2);
Serial.println(ReadGSM());
GSMport.println("AT+HTTPPARA=\"URL\",\"http://mysite.ru/?a=" + data + "\"");
подскажите пожалуйста как отправить данные с нескольких переменных разом? Спасибо
GSMport.println("AT+HTTPPARA=\"URL\",\"http://mysite.ru/?a=" + data1 + "&b=" + data2 + "\"");
Т.е. такой диалог получится
GSM: - привет, есть команда для меня?
Сервер: - привет, нету
спустя N секунд
GSM: - привет, есть команда для меня?
Сервер: - привет, да есть, включи реле
И тут ардуинка увидев фразу "включи реле" бежит и выполняет.
"AT+SAPBR=1,1", //Устанавливаем GPRS соединение
"AT+HTTPINIT", //Инициализация http сервиса
Симка рабочая, при подключении к сом переходнику эти команды тоже отвечают ОК. и соответственно сервер отвечает ошибкой 301. Куда обратить внимание?