Автозапуск на ардуино и sim800c своими руками
Для разработки IoT устройств приходится использовать различные GSM модули. К сожалению, NB IoT или LoraWAN чипы на данный момент стоят минимум в три раза дороже, поэтому в большинстве проектов их использование неоправданно, пока не снизится стоимость.
На Aliexpress есть несколько вариантов модулей SIM800C. Ссылка здесь. В данном примере я рассмотрю вариант с разведенным на плате конвертером уровней TTL 5V
В принципе, можно использовать более дешевый вариант модуля SIM800L, адаптировав уровень TTL под 5V Arduino с помощью резисторного делителя напряжения, либо заказав плату двунаправленного TTL конвертера уровней 5V 3V ценой в районе 0,5 $ и добавив DC-DC down-step модуль для снижения напряжения с 5V до 3,7 V по цене 0,3 $ но в совокупности цена получится примерно такой-же, экономии не будет.
Однако надо понимать, что при добавлении двунаправленного TTL конвертера уровней на него надо подать опорное напряжение равное уровню допустимого напряжения на входе SIM800, а это ~2,9 V, а не 3,3 V, которых взять негде, поскольку выход VDD_EXT с чипа SIM800 не выведен.
Батарею можно напрямую подключить к пину Vbat. На этом входе можно замерять напряжение на чипе. Оно составляет 3,7 V, встроенный преобразователь напряжения работает нормально, хоть и схема проще, чем у самого дешевого DC-DC step down конвертера.
Модуль SIM800C
Схема платы SIM800C
В datasheet модуля указан максимальный уровень логической единицы на входе RX — 3,1 В (при минимальном 2,1 В). Для конвертации TTL уровней на плате SIM800C разведен конвертер. В принипе достаточно было конвертер поставить только на RX вход, поскольку микроконтроллеры Arduino/ESP8266/ESP32 чувствительны к низкому входному напряжению TTL с SIM800C.
Конвертер TTL уровней и преобразователь напряжения 5V -> 3,7V модуля SIM800C
Схема двунаправленного конвертера уровней довольно стандартная и обеспечивает приведение напряжения логической 1 на SIM800 к уровню VDD_EXT. Это напряжение снимается с SIM800 и по datasheet соотвествует 2,8 V.
Напряжение на выходе VDD_EXT чипа SIM800
Соотвественно, на входе модуля SIM800 преобразователь уровней обеспечивает напряжение логической 1 не выше 2,9 V при максимальном значении.
Поскольку двунаправленного преобразования на RX не требуется, в теории, можно было бы использовать дешевый резистивный делитель, как указано в статье по подключению модуля SIM800L. Подробная схемотехника подключения этого модуля к ESP32 и код программы в моей статье.
Резистивный делитель при подключении входов SIM800 напрямую к Arduino
Вероятно, в данном случае использовали более дорогую схему согласования уровней, чтобы гарантировать, что пользователь неосторожными действиями не сожжет RX порт чипа SIM800. В случае резистивного делителя это можно сделать попутав Rx и Tx. Ну и важно для полноценного согласования уровней SIM800 с микроконтроллером 5-ти вольтовой логики, когда уровень логический единицы может быть высоким, так что микроконтроллер не будет воспринимать уровень логической единицы на выходе Tx.
Замечу, что при использовании дешевого модуля SIM800C/L без конвертера уровней, даже при подключении его напрямую к ESP8266/ESP32 с уровнем логики 3,3 V вместо максимальных 3,1 V, указанных в datasheet, можно вывести SIM800 из строя. По крайней мере у меня один модуль SIM800L перестал реагировать на RX. Видимо, внутри чипа нет защитных диодов, либо они не справились даже с такой небольшой разницей в напряжении.
Поэтому при подключении модуля SIM800 без конвертера уровней к ESP8266/ESP32 тоже нужно добавить хотя-бы резистивный делитель на вход RXD.
Резистивный делитель напряжения для подключения SIM800 без конвертера TTL уровней к ESP8266/ESP32
Напряжение питания модуля SIM800 (VBAT) 3,4 — 4,5 V, рекомендуемое 4 V при максимальном токе до 2А. Модуль достаточно прожорлив, поэтому его нельзя запитывать от платы Arduino и от маломощных USB зарядок, дажы не вывести их из строя.
На плате уже разведен фильтр для подавления импульсных помех для обеспечения стабильной работы модуля, однако, как показывает опыт, этого фильтра недостаточно при работе от простых блоков питания.
Схема фильтрации питания платы SIM800C
Слот SIM карты, в отличие от недорогого модуля SIM800L, подключен к чипу с защитой диодной сборкой SMF05C. Она предохраняет чип SIM-карты и SIM800C от статического электричества.
Недостатки платы SIM800C
Не могу сказать, что модуль SIM800C разработан удачно. Замечания такие:
- Расстояние между гребенками не кратно 2,54 мм, поэтому модуль не встает в breadboard макетные платы. Этой проблемы нет даже у дешевой платы SIM800L. Она встает в макетную плату без проблем. Это очень большой косяк разработчиков.
- Для понижения напряжения с 5V до 3,7V используется схема с двумя диодами. Как говорится в статье, падение напряжения на диодах в обычном режиме работы порядка 0,6 — 1,2V и SIM800 достаточно напряжения для работы. Однако при пиковых значениях токов падение напряжения возрастает и на чипе напряжение может быть ниже 3,3 V. В результате, например, при запуске, когда энергопотребление высокое, модуль может многократно перегружаться. Поэтому я рекомендую запитывать модуль через вход VBAT подав напряжение 3,8 V c DC-DC конвертера напряжения (DC-DC stepdown converter) или от батареи.
Распиновка платы модуля SIM800C
- 5V: power supply pin, the only input DC5V, used to power the board.
- V_TTL: access control board microcontroller core target voltage of 5V / 3.3V (according to its own microcontroller is much to distinguish kernel V), this pin is used to convert the GSM module board TXD and RXD for the corresponding TTL logic. Описание пространное. На этот пин нужно подать 5V при подключении к платам с уровнем логики 5V (например, Arduino) и 3,3V при подключении GSM модуля к ESP8266/ESP32.
- GND: power supply ground
- TXD: send pin serial port module, TTL level (not directly connected to RS232 level)
- RXD : receive pin serial port module, TTL level (not directly connected to RS232 level)
- DTR: Data Terminal Ready
- SPKP: Core Audio output pin
- SPKN: Core Audio output pin
- MICN: Core Audio input
- MICP: Core Audio input
- RI: Ring core pin tips
- VRTC: RTC pin external battery
- GND: power supply ground
- PWR: This pin can turn down or turn off the module. Этот пин должен быть замкнут на GND на время не менее 1 с для включения модуля. Чтобы модуль стартовал сразу при включении — PWR закорачивают на GND.
- GND: power supply ground
- VBAT: lithium battery input pin, 3.3v-4.4v
Схема соединения SIM800C c USB-to-TTL конвертером
Перед использованием модуля SIM800C с микроконтроллерами стоит проверить его работоспособность соединив с конвертером USB to TTL.
Таблица соединения SIM800C с USB-to-TTL converter
SIM800C pin | USB-to-TTL converter | БП +5 V | Примечания |
TXD | RXD | ||
RXD | TXD | ||
GND | GND | GND | |
+5V | +5V | Блок питания на пиковы ток не менее 1 А. | |
V_TTL | +5V | ||
PWX | GND | Закоротить пин PWX на GND, чтобы модуль стартовал сразу при включении питания. |
Схема подключения модуля SIM800C
Лучше подавать сначала питание на модуль GSM, а затем уже подключать USB к PC, но это не критично.
Схема соединения SIM800С с ESP32
На картинке нужно добавить соединение между PWX и GND! Детальная схема подключения SIM800L к ESP32 с примером кода в статье.
Схема подключения модуля SIM800C к ESP32
Тестирование SIM800
Ошибка +CSQ: 0,0
Если команда получения уровня сигнала AT+CSQ возвращает +CSQ: 0,0, то наверняка будут проблемы с регистрацией в сети. Команда AT+CREG? вернет +CREG: 0,2 вместо +CREG: 0,1. Какие действия для разрешения ошибки:
- Проверяем в другом устройстве, что SIM-ка корректно регистрируется в сети.
- Вставляем в SIM800 в соответствии с пиктограммой на слоте и проверяем командой AT+CPIN, что SIM карта определилась корректно.
- Командой AT+CBAND? проверяем, что SIM800 настроен на все диапазоны частот. На моем модуле, когда он нормально регистрируется в сети Билайна, результат: DCS_MODE,ALL_BANDS.
- Основной момент на который обратить внимание. Не зависимо от того, какой ток держит блок питания или DC-DC step-down модуль, хоть 3A и вы в этом лично убеждались, попробуйте запустить SIM800 от батареи. Возьмите аккумулятор от мобильного телефона на 3,7 В или Li-Ion элемент 18650 на 3,7 V и присоедините плюс батареи к пину V_BAT , а минус — на GND.
- Спустя некорое время проверяем уровень сигнала AT+CSQ. Скорее всего проблема с регистрацией разрешится.
Все GSM модули, не важно, дорогой SIM800 или дешевый M590 КРАЙНЕ чувствительны к качеству блока питания. И дело не только в токе, но и в пульсациях. Я запитывал SIM800C от разных БП с макисмальными токами до 2,1 A и он нормально включался, отвечал на AT команды, но не регистрировался в сети. После подключения на батарею TR 18650 сеть сразу нашлась.
Ниже приведены вырезки из design guide для модулей SIM800 и M590. Они почти сходятся в блоке фильтрации. Нужно ставить керамические конденсаторы на 10 pF и 33 pF (у M590 на 100 pF) для сглаживания высокочастотных пульсаций и электролитические хотя-бы на 100 uF, а лучше на 1000 uF.
Фильтры на блок питания для SIM800 Фильтры на блок питания для Neoway M590
Отправка SMS через SIM800
Передача данных по TCP
Далее привожу AT команды для установки tcp соединения через GPRS.
Fritzing part for SIM800C
SIM800C fritzing part *.fzpz
SIM800L fritzing part *fzpz
Поскольку не нашел нужного fritzing part для SIM800C, пришлось нарисовать. Файл здесь.
Управляем нагрузкой модулем SIM800L и Arduino
Что нам понадобится:
- GSM/GPRS модуль SIM800L;
- Arduino UNO;
- Понижающий DC-DC преобразователь.
Как работать с GSM модулем SIM800L:
Управляем нагрузкой модулем SIM800L и Arduino
Модуль SIM800L подключается к Arduino через серийный порт:
Pin 2 Arduino — pin TX SIM800L
Pin 3 Arduino — pin RX SIM800L
Схема подключения всех модулей показана на схеме ниже, преобразователь напряжения здесь необходим так как SIM модулю требуется напряжение около 4В (он питается от 3.7 до 4.2 В), но запитать от питающих напряжений самого Ардуино мы не сможем, так как 3,3 В ему недостаточно для работы, а от 5 В он может сгореть. Поэтому подключаем 5 В к Arduino и к DC-DC преобразователю, а затем от преобразователя на котором выставлено 4 вольта подаём питание на СИМ модуль.
Управляем нагрузкой модулем SIM800L и Arduino
Современные беспроводные технологии позволяют разрабатывать функциональные и доступные устройства. Подобные приборы взаимодействуют с широким спектром систем общего назначения. В этой статье пойдет речь об организации двухсторонней передачи данных между GSM модулем SIM800L (Рисунок 1) и полноценным веб-сервером.
Рисунок 1. | GSM модуль SIM800L. |
В сети есть много примеров использования этого модуля. Как правило, его применяют в различных системах сигнализации и удаленного управления объектами. При этом данные передаются по SMS протоколу, что совершенно неудобно с пользовательской точки зрения.
Для организации работы такой системы нам понадобятся GSM модуль SIM800L, плата Arduino Nano (Рисунок 2) и веб-сервер с доменом.
Рисунок 2. | Плата Arduino Nano. |
Принципиальная схема устройства показана на Рисунке 3.
Рисунок 3. | Принципиальная схема устройства. |
Настройка GSM модуля SIM800L
Для удобного программирования микроконтроллера платы Arduino Nano обмен данных с GSM модулем организован по программному UART с помощью стандартной библиотеки . Выводы D2-D3 назначены как Rx и Tx, соответственно.
Инициализация
Первым делом необходимо провести инициализацию и первичную настройку модуля SIM800L. Для этого в теле setup() вызываем подпрограмму init_GSM(), которая перезагружает модуль и последовательно отправляет команды:
Разберем назначение каждой команды:
На Рисунке 5 показан процесс выполнения подпрограммы init_GSM.
Рисунок 5. | Процесс выполнения подпрограммы init_GSM. |
На Листинге 1 показан пример обработки команды AT+CPAS.
Листинг 1. Программа обработки команды AT+CPAS.
Настройка GPRS соединения
После того как основная настройка модуля прошла успешно, можно начинать инициализировать GPRS соединение.
Для этого вызываем функцию init_GPRS(), которая отправляет в модуль следующие строки:
GPRS test
AT+SAPBR=3,1,"APN","internet.tele2.ru"
AT+SAPBR=3,1,"USER","tele2"
AT+SAPBR=3,1,"PWD","tele2"
AT+SAPBR=1,1
AT+HTTPINIT
AT+HTTPPARA="CID",1
На Рисунке 6 показан процесс выполнения подпрограммы init_GPRS().
Рисунок 6. | Процесс выполнения подпрограммы init_GPRS(). |
На этом этапе работу с модулем можно завершить. Для последующей работы необходимо настроить сервер и создать соответствующие файлы для обмена данными.
Создание файлов и работа с веб-сервером
Чтобы принять данные с GSM модуля, нужно приобрести услугу хостинга с минимальными требованиями, главное, чтобы была поддержка PHP. PHP – это популярный язык программирования, который исполняется на стороне сервера, в то время как JavaScript исполняется в браузере на стороне пользователя.
В качестве примера сделаем удаленное управление поливом теплицы.
Распишем основные задачи для веб-сервера и GSM модуля.
Задачи веб-сервера:
- Принимать и отображать на веб-странице данные температуры, времени работы и статус насоса;
- Предоставлять данные GSM модулю о статусе вкл/выкл насоса.
Задачи GSM модуля:
- Отправлять данные о времени работы насоса полива;
- Отправлять температуру насоса и воды;
- Принимать данные с веб-сервера о статусе вкл/выкл насоса.
Первым делом в корневом каталоге сервера создаем файл index.php.
На Листинге 2 показан начальный код разметки HTML страницы.
Листинг 2. Начальный код разметки HTML страницы.
В моем случае веб-страница будет открываться только в телефоне, поэтому выберем самый простой дизайн для нее. При желании можно сделать страницу более удобной и информативной.
Результат открытого в браузере файла index.php показан на Рисунке 7.
Рисунок 7. | Результат открытого в браузере файла index.php. |
Добавим пару кнопок на включение насоса и создадим txt файл на сервере для сохранения данных о статусе работы насоса. Кнопки выполним в виде картинок, а их обработку сделаем с помощью AJAX (технология взаимодействия с сервером без полной перезагрузки html-страницы, использует JavaScript). Для этого перед тегом вставляем код, показанный в Листинге 3.
Листинг 3. AJAX обработчик.
Определение картинок кнопок включим в форму. При нажатии на картинку будет записываться значение статуса в файл pomidor.txt. Код обработки кнопок показан в Листинге 4.
Листинг 4. HTML код обработки кнопок.
В коневом каталоге создаем папку transfer и файл pomidor.php, код из которого приведен в Листинге 5.
Листинг 5. PHP скрипт записи статуса кнопки.
Рисунок 8. | Основной интерфейс управления. |
Сделаем так, чтобы при переключении статуса, менялась картинка насоса. Для этого в поле расположения картинки насоса добавим код (Листинг 6).
Листинг 6. PHP скрипт изменения картинки статуса работы насоса.
Рисунок 10. | Визуализация статуса включенного насоса. |
По аналогии добавим вывод температур и времени полива (Рисунок 11).
Рисунок 11. | Законченный интерфейс управления. |
Вопросы безопасности, в случае атаки на веб сервер, выходят за рамки данного повествования, поэтому опустим их.
Считываем данные с сервера в Arduino
После завершения процесс отладки записи статуса вкл/выкл насоса в файл pomidor.txt можно считывать данные в Arduino. Напишем функцию чтения данных с сервера (Листинг 7).
Листинг 7. Функция чтения данных с сервера.
Прочитаем статус вкл/выкл насоса из файла txt/pomidor.txt, отобразим значение на терминале и на выводе D5 платы Arduino (Листинг 8).
Листинг 8. Программа формирования логического уровня вывода D5 в зависимости от статуса насоса.
Пример отображения при нажатии кнопки включении насоса показан на Рисунке 12.
Передача данных из Arduino на веб-сервер
Для передачи данных на веб-сервер напишем функцию SEND_GPRS с указанием адреса "adress_php", в который будет записываться значение int типа "out_messeng_Server". Для записи значения типа String нужно вызывать функцию SEND_string_GPRS. В Листинге 9 показана функция отправки данных на сервер.
Листинг 9. Функция отправки данных на сервер.
В корневом каталоге веб-сервера создаем папку in, внутри ее располагаем другие папки со скриптами для обработки приема данных GSM модуля. Внутренние папки содержат файл index.php и log.txt.
На Листинге 10 показано содержание файла index.php.
Листинг 10. PHP листинг файла index.php.
Как видно, с приходом новых данных происходит перезапись файла log.txt.
Рисунок 13. | Собранная схема на макетной плате. |
Все компоненты собраны на макетной плате (Рисунок 13). Устройство не требует настроек, после сборки и прошивки сразу готово к работе.
Несмотря на плюсы, у данного модуля есть и минусы:
- Первый минус — питание. Запитать данный модуль от arduino не получится, т.к. для его работы потребуется источник питания с напряжением 5 В и 2 А( при пиковой нагрузке).
- Второй минус — это избирательность по операторам. Не со всеми операторами модуль может стабильно работать. Теряет сеть или не получается авторизоваться в сети.
У модуля, который мы будем подключать, выведен необходимый минимум для доступа к подавляющему большинству функций, включая голосовые (выходы для подключения микрофона и динамика):
И обратная сторона.
Назначение выводов модуля:
- GND — пин земли
- VCC_IN — пин источника питания от 5В до 20В
- RI — пин для звонка
- DTR — пин вывода модуля из спящего режима
- RXD и TXD — пины UART
- U2_R и U2_T — пины второго UART
- V_M — пин преобразования UART в TTL логику
- ADC — пин АЦП
- SPN и SPP — пины подключения динамика
- PWR — пин включения или выключения модуля
- MC- и MC+ пин подключения микрофона
- BAT — пин подключения аккумулятора напряжением от 3.3В до 4.4В
Теперь соберем простую схему
Схема сборки для настройки модема
После сборки схемы, загрузим тестовый скетч для настройки модема
После загрузки скетча, запускаем Serial Monitor и видим ответ от модема.
AT+CLTS=1 автоматическое определение времени по сети
AT+IPR=9600 задаем скорость работы модуля
AT&W сохранение настроек
AT+IPR?- команда проверки скорости обмена.
AT+CLTS?-команда проверки определения времени
Существует ряд команд при помощи которых можно определить состояние GSM-модуля и совершать конкретные действия, также получить полезную информацию при диагностике модуля. Некоторые из них представлены ниже:
Практическое применение.
Добавлен светодиод
Таким образом мы управляем любой нагрузкой с помощью модуля SIM800L и Arduino. Разумеется, вместо светодиода можно подключить, например, реле и контактор, что позволит управлять более или менее серьезной нагрузкой дома и в саду.
Читайте также: