Бюджетный GSM термометр на Arduino Nano

  • Цена: $13
  • Добрый день! Очередной обзор самодельного устройства из дешевых китайских электронных компонентов, в этот раз GSM-термометр. Как обычно, дёшево, себестоимость устройства примерно 850 ₽ или 13$. Сборка так же не составит труда для тех кто хотя бы пару раз в жизни держал паяльник 🙂 Заинтересовало? Прошу под «cut»!

    Начнём с технического задания, устройство должно:

    1. Отслеживать температуру системы отопления, уведомлять смс сообщением или голосовым вызовом при превышении или понижении температуры ниже заданных границ.

    2. Отслеживать наличие или отсутствие сети 220В, уведомлять при отсутствии или восстановлении.

    3. Работать автономно не менее 24 часов.

    4. Полностью управляться через смс сообщения.

    Для сборки нам понадобится:

    1. Arduino Nano v3 ATmega328P — 180 ₽.

    2. GSM модуль SIM800L — 240 ₽.

    3. Контроллер заряда-разряда для Li-ion аккумулятора TP4065 — 30 ₽.

    4. Датчик DS18B20 — 80 ₽.

    5. Светодиод RGB с общим анодом — 1шт * 10 ₽.

    6. Резисторы 2,2 кОм, 3,3 кОм, 4,7 кОм, 20 кОм — 5 ₽.

    7. Выключатель — 15 ₽.

    8. Корпус для PowerBank 4×18650 — 190 ₽.

    9. Аккумулятор 18650 — 190 ₽.

    10. Зарядное устройство 5В 1,5А — из личных запасов.

    Не обязательно, но очень желательно:

    11. Полевой транзистор IRLML6402 — 5 ₽.

    12. Диоды SS26 — 5 ₽.

    13. GSM антенна — 80 ₽.

    Могу предположить что возникнут вопросы о работе устройства в сети GSM. Почему бы не использовать GPRS/3G/4G? Во-первых GSM — надёжно, во-вторых есть места очень плохим покрытием, при котором голосовая связь и смс сообщения ещё работают но GPRS-трафик передаётся не стабильно. Поэтому выбор пал именно на этот стандарт. В плане надёжности отдаю предпочтение Arduino, хотя устройство можно было бы собрать и на ESP8266, но в последней не могу быть уверен на все 100%.

    За основу GSM-термометра была взята GSM-сигнализация из этого обзора, которая после «финальной» прошивки в течение года отработала без сбоев. Из прошивки «выпилено» всё лишнее и добавлен датчик температуры DS18B20. Диапазон измерения температуры датчика от -55°C до 125°C, даташит на русском языке можно взять по ссылке.

    Устройство будет использоваться совместно с котлом длительного горения на дровах и отслеживать температуру теплоносителя в системе отопления. Так же необходимо следить за питанием насосов системы отопления от сети 220В, в случае его отключения насосы останавливаются и температура теплоносителя может стремительно увеличиваться.

    Схема устройства.

    Бюджетный GSM термометр на Arduino Nano

    Потроха.

    Бюджетный GSM термометр на Arduino Nano

    Бюджетный GSM термометр на Arduino Nano

    Внешний вид.

    Бюджетный GSM термометр на Arduino Nano

    Используемые порты Arduino Nano v3
    D5 — шина данных датчика температуры DS18B20 — желтый провод.

    D6 — подключен к RST входу модема, для перезагрузки в случае потери сети.

    D7 — подключен к делителю напряжения от внешнего источника питания +5В. Верхнее плечо 2,2 кОм, нижнее 3,3 кОм.

    Делитель напряжения
    Бюджетный GSM термометр на Arduino Nano

    D8 — модем TX

    D9 — модем RX

    D10 — красный светодиод

    D11 — синий светодиод

    D12 — зеленый светодиод

    Прошивка
    Программное обеспечение XLoader для прошивки Arduino Nano/Uno берём тут или на гугл диске вместе с прошивкой. Прошивку в виде hex — файла для Arduino Nano/Uno берём тут. Исходник прилагается.

    Инструкция по прошивке

    — подключаем Arduino в USB-порт

    — выбираем нужный hex-файл

    — выбираем нужный тип Arduino Nano или Uno

    — выбираем COM порт, который создался при подключении Arduino к USB

    — скорость 57600

    — нажимаем Upload

    Для тех кто будет шиться из исходника
    В файл SoftwareSerial.h (C:Program Files (x86)ArduinohardwarearduinoavrlibrariesSoftwareSerialsrcSoftwareSerial.h) необходимо внести изменения

    было так:

    
    
    #define _SS_MAX_RX_BUFF 64

    стало так:

    
    
    #define _SS_MAX_RX_BUFF 192

    Команды управления
    Внимание! Команды выделенные жирным шрифтом могут быть выполнены только с основного номера, так как отвечают за конфигурацию устройства. Команды можно отправлять через смс сообщения или вводить в командной строке монитора порта Arduino IDE.

    Команды управления не чувствительны к регистру:

    AddPhone — Добавить номер телефона. Всего может быть добавлено не более 9 номеров + 1 основной номер который автоматически сохраняется в память при первом звонке на устройство после сброса на заводские установки командами ResetPhone, FullResetили MemTest. То есть кто первый позвонил на устройство после его сброса на заводские установки тот и «главный», этот номер заносится в первую ячейку памяти и его невозможно изменить или удалить через смс.

    Пример команды:

    AddPhone:2+71234567891risp

    AddPhone:3+71234567892s

    AddPhone:4+71234567893sp

    AddPhone:5+71234567894r

    Синтаксис команды:
    AddPhone — команда

    : — разделитель

    5 — записать в пятую ячейку памяти

    +71234567890 — номер телефона

    s — Параметр «SMS» — будет отправлено sms сообщение при срабатывании датчиков

    r — Параметр «Ring» — будет совершен голосовой вызов при срабатывании датчиков

    p — Параметр «Power» — будет отправлено sms сообщение при включении/отключении внешнего питания

    i — Параметр «Info» — будет отправлено sms сообщение о включении или отключении оповещения при изменении температуры

    При отсутствии параметров «s», «r», «p»,«i» телефон заносится в память, но никак не используется.

    DeletePhone — Удалить номер телефона.

    Пример команды:

    DeletePhone:+71234567891

    Синтаксис команды:
    DeletePhone — команда

    : — разделитель

    +71234567891 — номер телефона

    EditMainPhone — Изменить параметры «s», «r», «p», «i» основного телефона, этот номер занесён в первую ячейку памяти.

    Пример команды:

    EditMainPhone:spri

    Синтаксис команды:
    EditMainPhone — команда

    : — разделитель

    srpi — параметры

    RingTime — Длительность тревожного голосового вызова, параметр может иметь значение от 10 до 255 секунд.

    Пример команды:

    RingTime:40

    Синтаксис команды:
    RingTime — команда

    : — разделитель

    40 — длительность вызова составит 40 секунд, после чего будет вызван следующий абонент.

    ModemID — Принудительная установка модели используемого модема. Возможные значения: 0 — автоопределение модема, 1 — M590, 2 — SIM800l, 3 — A6_Mini.

    Пример команды:

    ModemID:2

    Синтаксис команды:
    ModemID — команда

    : — разделитель

    2 — ID модема.

    NetCheckTime — Интервал проверки регистрации модема в сети оператора в минутах, параметр может иметь значение от 1 до 60 минут. При значении 0 проверка отключена.

    Пример команды:

    NetCheckTime:10

    Синтаксис команды:
    NetCheckTime — команда

    : — разделитель

    10 — каждые 10 минут будет производиться поочерёдная проверка уровня сигнала сети или проверка регистрации модема в домашней сети оператора, то есть весь цикл проверки будет занимать 20 минут. В случае отсутствия сигнала или регистрации в домашней сети модем будет перезагружен.

    TempCheckTime — Интервал автоматического обновления температуры, параметр может иметь значение от 1 до 60 минут.

    Пример команды:

    TempCheckTime:10

    Синтаксис команды:
    TempCheckTime — команда

    : — разделитель

    10 — каждые 10 минут будет производиться снятие показаний с датчика температуры.

    LowTemp — Нижний порог температуры при достижении которого будет отправлено оповещение. Параметр может иметь значение от -50 до 125 и не может превышать или равняться значению параметра HighTemp.

    Пример команды:

    LowTemp:25

    Синтаксис команды:
    LowTemp — команда

    : — разделитель

    25 — температура

    HighTemp — Верхний порог температуры при достижении которого будет отправлено оповещение. Параметр может иметь значение от -50 до 125 и не может быть меньше или равняться значению параметра LowTemp.

    Пример команды:

    HighTemp:60

    Синтаксис команды:
    HighTemp — команда

    : — разделитель

    60 — температура

    WatchPowerTime — Время в минутах по истечении которого будет отправлено смс сообщение об отключении внешнего источника питания. Если внешнее питание будет восстановлено до истечения установленного времени, то сообщение не будет отправлено.

    Пример команды:

    WatchPowerTime:5

    Синтаксис команды:
    WatchPowerTime — команда

    : — разделитель

    5 — 5 минут до отправки смс сообщения

    WatchPowerOn1 — включить контроль внешнего питания, смс сообщение об отключении внешнего питания будет отправлено при условии что включено оповещение при изменении температуры (GuardOn).

    WatchPowerOn2 — включить контроль внешнего питания, смс сообщение об отключении внешнего питания в любом случае будет отправлено

    WatchPowerOff — выключить контроль внешнего питания

    BalanceNum — Изменение номера запроса баланса и обработка длины ответа запроса. Значение по умолчанию для Beeline: #100#L22.

    Пример команды:

    BalanceNum:#103#L24

    Синтаксис команды:
    BalanceNum — команда

    : — разделитель

    #103# — номер запроса баланса

    L24 — Длина (len) пересылаемого ответа 24 символа, обрезаем спам из запроса баланса.

    Reboot — перезагрузка устройства (только Arduino)

    ResetConfig — сброс настроек на заводские установки

    ResetPhone — удаление из памяти всех телефонных номеров

    FullReset — сброс настроек, удаление из памяти всех телефонных номеров, восстановление значения по умолчанию команды BalanceNum.

    GuardOn — включить оповещение при изменении температуры

    GuardOff — выключить оповещение при изменении температуры

    Info — проверить состояние, в ответ на это сообщение будет отправлено sms с информацией о текущей температуре, нижней и верхней границах контроля температуры, о частоте автоматического обновления температуры, и о том с какого номера было включено или выключено оповещение при изменении температуры и текущее состояние.

    TestOn — включается тестовый режим.

    TestOff — выключается тестовый режим.

    LedOff — выключает светодиод режима ожидания.

    LedOn — включает светодиод режима ожидания.

    Money — запроса баланса.

    ClearSms — Удалить из памяти все sms

    ListPhone — вывод в монитор порта списка сохранённых в памяти телефонов

    Memtest — тест энергонезависимой памяти устройства, все настройки устройства будут сброшены, аналогично команде FullReset.

    ListConfig — вывод в монитор порта текущей конфигурации устройства.

    Световая индикация
    Светится синим — температура ниже или равна нижней границе контроля, произведено оповещение, оповещение включено.

    Светится зелёным — температура между нижней и верхней границей, оповещение включено.

    Светится красным — температура выше или равна верхней границе контроля, произведено оповещение, оповещение включено.

    Мигает синим — температура ниже или равна нижней границе контроля, оповещение отключено.

    Мигает зелёным — температура между нижней и верхней границей, оповещение отключено.

    Мигает красным — температура выше или равна верхней границе контроля, оповещение отключено.

    Нет индикации — температура между нижней и верхней границей, оповещение включено, включен режим LedOff. При изменении температуры ниже или выше допустимых пределов будет включена световая индикация и произведено оповещение.

    Пусконаладочные работы или как этим пользоваться?!

    Основным моментом после сборки является проверка EEPROM памяти устройства, для этого необходимо выполнить из консоли команду MemTest. Для доступа к консоли можно использовать Putty или монитор порта в Arduino IDE. В настройках необходимо указать нужный COM-порт и скорость порта 9600.

    В результате выполнения команды вы должны увидеть следующие строки сообщающие о том, что тест EEPROM пройден успешно, устройство будет автоматически перезагружено и будут восстановлены настройки по умолчанию.

    Лог консоли — MemTest

    
    
    memtest
    EEPROM: 1024B
    Test passed.
    GSM Temperature Alarm 2018.12.03-01
    Deleting eepromconfig data.
    Load default eepromconfig data.
    Read eepromconfig:
    RingTime: 40
    Test: 0
    Led: 1
    Guard: 1
    NetCheckTime: 0
    TempCheckTime: 10
    LowTemp: 10
    HighTemp: 70
    WatchPower
    Mode: 1
    Time: 0
    ModemID: Autodetect
    Delete balance data.
    Load default balance data.
    Balance number: #100#
    Length to return: 22
    Deleting phone data.
    Load default phone data.
    Read array phone:
    № -> Phone -> s -> r -> p -> i
    1 -> -> 0 -> 0 -> 0 -> 0
    2 -> -> 0 -> 0 -> 0 -> 0
    3 -> -> 0 -> 0 -> 0 -> 0
    4 -> -> 0 -> 0 -> 0 -> 0
    5 -> -> 0 -> 0 -> 0 -> 0
    6 -> -> 0 -> 0 -> 0 -> 0
    7 -> -> 0 -> 0 -> 0 -> 0
    8 -> -> 0 -> 0 -> 0 -> 0
    9 -> -> 0 -> 0 -> 0 -> 0
    10 -> -> 0 -> 0 -> 0 -> 0
    Detected ModemID: 2
    Guard ON at boot.
    Temperature: 47.81

    Для дальнейшей настройки необходимо зарегистрировать основной номер, с которого в дальнейшем будет производиться настройка, для этого достаточно совершить голосовой вызов на номер устройства. Номер с которого был совершен вызов будет добавлен в первую ячейку памяти устройства, так же этому номеру автоматически будут добавлены параметры «s», «r», «p», «i», которые в случае необходимости можно изменить командой EditMainPhone.

    Лог консоли — регистрация основного номера

    
    
    Ring from: +7905xxxxxxx
    Primary phone: +7905xxxxxxx
    GSM Temperature Alarm 2018.12.03-01
    Read eepromconfig:
    RingTime: 40
    Test: 0
    Led: 1
    Guard: 1
    NetCheckTime: 0
    TempCheckTime: 10
    LowTemp: 10
    HighTemp: 70
    WatchPower
    Mode: 1
    Time: 0
    ModemID: Autodetect
    Balance number: #100#
    Length to return: 22
    Read array phone:
    № -> Phone -> s -> r -> p -> i
    1 -> 7905xxxxxxx -> 1 -> 1 -> 1 -> 1
    2 -> -> 0 -> 0 -> 0 -> 0
    3 -> -> 0 -> 0 -> 0 -> 0
    4 -> -> 0 -> 0 -> 0 -> 0
    5 -> -> 0 -> 0 -> 0 -> 0
    6 -> -> 0 -> 0 -> 0 -> 0
    7 -> -> 0 -> 0 -> 0 -> 0
    8 -> -> 0 -> 0 -> 0 -> 0
    9 -> -> 0 -> 0 -> 0 -> 0
    10 -> -> 0 -> 0 -> 0 -> 0
    Detected ModemID: 2
    Guard ON at boot.
    Temperature: 47.88

    Далее выставляем пределы температур и интервал опроса датчика температуры, теперь эти действия так же можно выполнить с помощью смс сообщения.

    Лог консоли — настройка температуры

    
    
    lowtemp:25
    LowTemp is: 25
    hightemp:50
    HighTemp is: 50
    TempCheckTime:5
    TempCheckTime is: 5
    Temperature: 47.94

    Проверяем настройки командой info из консоли и через смс сообщение.

    Лог консоли — вывод команды info

    
    
    info
    Temperature: 47.81
    Current temperature: 47.81
    Low: 25
    High: 50
    TempCheckTime: 5 min
    Guard ON at boot.

    СМС сообщение — вывод команды info
    Бюджетный GSM термометр на Arduino Nano

    Основные настройки закончены, устройство готово к работе. В случае необходимости можно добавить ещё не более девяти номеров оповещения. Так же номера можно дублировать, при этом со всех дублей при добавлении будут автоматически сняты все признаки кроме «r» — оповещение голосовым вызовом.

    Оповещение.

    При изменении температуры выше или ниже заданных пределов, на номера с признаком «s» — будут отправлены смс сообщения с информацией о текущей температуре. Далее устройство совершит голосовые вызовы на все номера с признаком «r» и перейдёт в режим наблюдения с соответствующей световой индикацией. Следующее оповещение будет произведено только после нормализации температуры и последующим уходом температуры за указанные пределы. В случае отключения внешнего питания устройства на все номера с признаком «p» будет отправлено соответствующее уведомление. Номера с признаком «i» будут получать информационные сообщения о включении или отключении оповещения (следить или следить и оповещать), и номера телефона с которого было произведено действие.

    На этом пока всё. Спасибо за внимание! 🙂

Оцените статью