GSM сигнализатор о разряде АКБ кара за 5$ (DIY)

GSM сигнализатор о разряде АКБ кара за 5$ (DIY) Обзор Автогаджетов

  • Стоимость: $2.21

Впереди середина зимы и самые мощные морозы. Почти всем предстоит столкнуться с неувязкой разряда АКБ собственных каров. Любой решает данную делему по-своему: кто-то собирает старт джамперы на суперконденсаторах, кто-то употребляет литиевые паурбанки, кто-то же конфискует АКБ на ночь (то есть темное время суток) домой. Лично я, беря во внимание свою специфику использования авто, решил собрать обычный GSM сигнализатор на базе Arduino Pro Mini и GSM-модуля SIM800L, который уведомит меня, если заряд АКБ достигнет критичного значения.

Для чего все это?

Аккуму в моем авто уже 8 лет. С одной стороны, невзирая на собственный возраст, он еще никогда не подводил даже в мощные морозы. Но с иной стороны, приходит осознание того, что актуальный цикл АКБ скоро завершится. Подкрепилось оно недавнешним случаем достаточно томного пуска опосля долгого простоя на морозе — стартеру чуть хватило тока для запуска мотора. Неуверенность в надежности подуставшего АКБ также утежеляется рваным графиком поездок на авто: бывает 1000 км за некоторое количество дней, а бывает неделька простоя без поездок. Более естественным и обычным решением данной препядствия было бы просто поменять АКБ на новейший. Но инженер-экспериментатор, сидячий снутри меня, не может сдаться так стремительно. Потому начался поиск других решений, способных продлить жизнь старенькому АКБ. Одним их таковых решений является суперконденсаторный старт джампер, не так давно тут как раз был описан DIY проект оного. Устройство мне понравилось, но по цены оно выходит практически как новейший АКБ, а ведь аккумулятор все равно придется рано либо поздно поменять (не лазить же под капот при любом запуске). Потому я решил пойти иным методом и создать дешевое устройство, которое бы просто информировало о том, что заряд АКБ приближается к критичному значению (сначала при продолжительном обычное авто). Так можно вовремя зарядить аккумулятор методом пуска мотора.

Выбор девайсов

Подобные устройства уже есть на рынке (некие сигнализации с автозапуском, GPS трекеры и т.п.). Но они все владеют рядом существенных на мой взор недочетов: накладность, внедрение в проводку авто, передача данных о авто через посторонние интернет-серверы и др. Мне же хотелось обычное доступное устройство, работающее с наименьшим вмешательством в проводку авто, не зависящее от посторониих серверов и выполняющее чисто поставленную задачку.

Более обычным, дешевеньким и всеядным исходя из убеждений распространения сигнала решением, на мой взор, как и раньше является GSM спектр. Тем наиболее у меня уже есть опыт использования мобильной связи для получения данных с Ардуино. В 2018 я публиковал обзор: GSM передатчик показаний счетчиков воды на базе модуля SIM800L (DIY). Данное устройство себя непревзойденно показало в плане надежности и энергоэффективности, бесперебойно проработав без малого три года на одном заряде маленького литиевого АКБ. Актуальность данная разработка уже растеряла, потому было принято решение переработать её под новейшую задачку, тем наиболее что практически весь нужный функционал в ней уже есть.

Итак, в базе устройства лежат два модуля: плата Arduino Pro Mini, которая производит нужные измерения и сформировывает пакет данных, также GSM-модуль SIM800L, который передает нужные данные по сотовой сети.

Функционал и схема

Главные функции, требуемые от устройства:

— неизменное измерение и усреднение напряжение АКБ кара;

— повторяющаяся отправка данных о напряжении АКБ на данный номер;

— в случае, если напряжение АКБ ниже данного порогового значения — незамедлительная отправка СМС, также звонок;

— фильтрация «лженизкого» напряжения АКБ — к примеру, когда работает магнитола и/либо остальные пользователи при выключенном движке;

— подключение 2-мя проводами в OBD2 разъем (питание в диагностическом OBD2 разъеме авто находится постоянно);

— низкое потребление тока, чтоб не разряжать АКБ добавочно.

В итоге родилась последующая схема. Ниже комменты к каждой её части.

GSM сигнализатор о разряде АКБ кара за 5$ (DIY) Обзор Автогаджетов

1. Обычной делитель входного напряжения на 2-ух резисторах.

2. Стабилизатор питания на 4,2 В.

Напряжение питания бортовой сети авто неустойчиво и изменяется в широких границах от ~7 до 15 В. Плата Arduno и GSM модуль рассчитаны на питание от 4..4,2 В. Также для четкого измерения напряжения питание платы Arduino обязано быть как можно наиболее размеренным, т.к. напряжение питания выступает в роли опорного для АЦП. Пригодного DC/DC преобразователя у меня не оказалось, потому я решил употреблять пользующийся популярностью линейный понижающий преобразователь LM317 (а поточнее его низкотемпературного собрата LM217). Но он плохо показал себя исходя из убеждений стабильности выходного напряжения в широком спектре температур. Выходом стал обычный источник опорного напряжения TL431 (весьма нередко встречаются в компьютерных БП). В даташите на него уже приведена схема стабилизированного источника питания на 5В, мне оставалось только подобрать резисторы R3 и R4 так, чтоб на выходе было 4,2 В.Такое решение владеет весьма неплохой температурной стабильностью (о этом чуток позднее).

3. Конденсатор C1 весьма важен для размеренной работы GSM модуля. Емкость снижать не рекомендую.

4. Полевой транзистор, отключающий GSM-модуль. По сути возможно обойтись без него, т.к. модуль имеет режим энергосбережения, который можно активировать программно (с применимым для данного проекта током употребления ~1мА). Но аппаратное отключение было реализовано в проекте-доноре, потому было принято решение его бросить.

Дальше эта легкая схема была реализована на куске макетной платы:

GSM сигнализатор о разряде АКБ кара за 5$ (DIY) Обзор Автогаджетов

Программная часть

Ниже под спойлером приведен код прошивки. Постарался закомментировать его очень тщательно. Кроме напряжения, я также добавил функцию измерения температуры чипа Atmega328P, оно не различается особенной точностью, но примерное представление о температуре (с точностью в пару градусов) получить можно.

Скетч #include <SoftwareSerial.h> // Обычная библиотека для виртуального поочередного порта #include <LowPower.h> // Библиотека действенного сна SoftwareSerial SIM800(9, 8); // Виртуальные RX, TX #define Vcc 4.201 // опорное напряжение с TL431 #define k 3.915 // коэффициент делителя напряжения #define count 43200 // с какой переодичностью опосля выкл двиг отправлять СМС © — 12ч unsigned long tick = count — 600; // 1-ое тестовое СМС будет отправлено через 600 сек (10 мин) unsigned long engOn = 0; float Vbat; float Vmin; float u; double temp; void setup() { pinMode(2, OUTPUT); // Управление транзистором, через который подключен GSM модуль digitalWrite(2, LOW); // Состояние по-умолчанию: выключен Vbat = analogRead(A2) * Vcc * k / 1024; // Исходные значения Vbat, Vmin и температуры temp Vmin = Vbat; temp = GetTemp(); } void loop() { u = analogRead(A2) * Vcc * k / 1024; // в цикле измеряем секундное напряжение u if (u > 13.2) { // если оно больше 13,2 В — движок запущен engOn++; // ведем отсчет кол-ва секунд работы мотора if (engOn > 1200) tick = 0; // если движок работает наиболее 20 мин (1200с), считаем АКБ заряженным и обнуляем таймер отправки отчетных СМС LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF); // сон 1 сек } else if (u < (Vbat — 0.1)) { // если напряжение меньше 13,2 В и поменялось скачком на 0,1 и наиболее вольт checkVmin(); // вызов функции неперерывного определения малого напряжения Vmin } else { // если напряжение меньше 13,2 В и НЕ поменялось скачком на 0,1 и наиболее вольт Vbat = 0.9 * Vbat + 0.1 * u; // обновляем средние Vbat и temp temp = 0.9 * temp + 0.1 * GetTemp(); if (u < Vmin) Vmin = u; // обновляем Vmin tick++; // отсчитываем 1 сек engOn = 0; // обнуляем счетчик работы мотора engOn LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF); // сон 1 сек if (tick > count) { // если счетчик переодической отправки достигнул порогового значения sendSMS(0); // вызываем функцию отправки СМС без звонка (0 в скобках) tick = 0; // обнуляем счетчик отправки СМС } if (Vbat < 12.3) { // если среднее напряжение наименее 12,3 В sendSMS(1); // вызов функции отправки СМС со гулком (1 в скобках) for (int i = 0; i < 6 * 3600; i++) { // сон 6 часов (3600c*6) LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF); } } } } void checkVmin() { // функция непрерывного измерения малого напряжения unsigned long timer = millis() + 2 * 60000; // продолжительность работы функции (2 мин) while (timer > millis()) { u = analogRead(A2) * Vcc * k / 1024; // измерерние u if (u < Vmin) Vmin = u; // обносление значение Vmin } Vbat = u; // обновление среднего значение Vbat до выхода из функции } void sendSMS(boolean call) { // Функция отправки СМС и звонка digitalWrite(2, HIGH); // Включаем GSM модуль delay(30000); // Пауза для установки связи SIM800.begin(9600); // Скорость обмена данными с модемом delay(500); // Дожидаемся передачи команды по Serial и даем GSM модулю 0,5 с на выполнение команды SIM800.println("AT"); // Автонастройка скорости delay(500); SIM800.println("AT+CMGF=1"); // Включить TextMode для СМС delay(500); SIM800.println("AT+CMGS="+798549xxx03""); // Номер, на который шлем СМС delay(500); SIM800.println("Vbat: " + String(Vbat, 2) + " V, Vmin: " + String(Vmin, 2) + " V, t: " + String(temp, 1) + " degC" + "rn" + (String)((char)26)); // Формирование текста СМС Vmin = Vbat; // Обнуление значение Vmin delay(30000); // Пауза 30 сек на отправку СМС if (call) { // Если call = 1, то передаем модулю команду набора номера SIM800.println("ATD+798549xxx03;"); delay(30000); // Пауза на воплощение звонка } SIM800.println("AT+CPOWD=1"); // Команда выключения SIM800.flush(); // Чистка послед. порта delay(2000); digitalWrite(2, LOW); // Обесточиваем GSM модуль } double GetTemp(void) // Функция получения температуры чипа (найдена на просторах сети) _BV(MUX3)); ADCSRA

Логика работы его последующая (очевидно все пороговые напряжения подлежат изменению):

1. Если напряжение в сети кара больше 13,2 В, что гласит о работе генератора — ничего не делаем, МК дремлет;

2. Если напряжение меньше 13,2 В, но больше 12,3 В, то обновляем показания с усреднением 1 раз в сек; отправляем СМС о напряжении и температуре 1 раз в 12 часов (тестовый режим).

3. Если напряжение изменяется скачком наиболее чем на 0,1 В от среднего, то на 2 мин врубается функция непрерывного измерения напряжения с фиксацией малого значения (система ожидает пуска мотора). Это реализовано для оценки «провала» напряжения при запуске, что также является косвенным признаком износа АКБ.

4. Если среднее напряжение АКБ ниже 12,3 В — отправляем СМС, осуществляем звонок.

Пороговое значение 12,3 В — неоднозначный момент. Может быть, это значение будет скорректировано в дальнейшем. Я избрал его на основании исследования таблиц заряда АКБ (типа той, что ниже) как приблизительно соответственное 50-60% заряда:

GSM сигнализатор о разряде АКБ кара за 5$ (DIY) Обзор Автогаджетов

Напряжение АКБ и температура фильтруются при помощи функции скользящего среднего:

Vbat = 0.9*Vbat + 0.1*u;

другими словами каждое новое значение на 90% состоит из предшествующего значения и на 10% из вновь измеренного. Коэффициенты можно изменять (в сумме обязана быть 1), это будет влиять на скорость конфигурации фильтруемой величины, как и частота вызова функции. Данная функция весьма комфортна собственной простотой, также дозволяет значительно повысить точность измерения. Я нередко её применяю при работе с аналоговыми сигналами.

Благодаря тому, что измерения выполняются с низкой частотой (1 сек), а меж ними МК дремлет, ток употребления очень скромен и составляет ~1,6 мА. Сколько-либо приметно ощущаться аккумом авто таковой ток не будет.

GSM сигнализатор о разряде АКБ кара за 5$ (DIY) Обзор Автогаджетов

Итоговый вид устройства в разобранном и собранном виде:

GSM сигнализатор о разряде АКБ кара за 5$ (DIY) Обзор Автогаджетов

GSM сигнализатор о разряде АКБ кара за 5$ (DIY) Обзор Автогаджетов

Контакты подключения изготовлены из жести, нужные размеры: ширина — 1,8 мм, толщина 0,8 мм. Подключаются в гнезда 4/5 (земля) и 16 (+12 В). Распиновка разъема OBD2:

GSM сигнализатор о разряде АКБ кара за 5$ (DIY) Обзор Автогаджетов

Устройство в работе

Сперва тесты морозильной камерой на предмет правильности измерений при низких температурах. Тут полный порядок — показания корректны и не меняются при понижении температуры:

GSM сигнализатор о разряде АКБ кара за 5$ (DIY) Обзор Автогаджетов

Дальше установка в авто и тестирование:

GSM сигнализатор о разряде АКБ кара за 5$ (DIY) Обзор Автогаджетов

1-ое СМС на скрине выше:

12,69 В — текущее усредненное напряжение АКБ, 11,39 В — малое (при срабатывании замков дверей, приводов складывания зеркал), температура -7,6 °С

2-ое СМС:

12,69 В — текущее усредненное напряжение АКБ, малое 6,39 В (был пуск мотора). Меня такое значение смутило — показалось низким даже для старенького АКБ. Позднее также при помощи платы Ардуино была снята «осциллограмма» напряжения конкретно на клеммах АКБ при запуске (просьба отписаться если любопытно как создать это). Малое значение составило 7,4 В. Вывод — 1 В — падение напряжения на клеммах и проводах.

3е и 4е СМС:

Сообщения, отправленный по данному интервалу 12ч (тестовый режим), в последствии планирую прирастить до 24 или 48 часов.

Можно увидеть, что в крайних 2-ух СМС Vmin больше Vbat, этот баг я уже поправил в коде выше.

Также был добавлен сброс таймера отправки СМС по расписанию, если движок опосля пуска работает наиболее 20 мин. Это дозволит сберечь средства на СМС при постоянных поездках — когда движок авто запускается почаще, чем период отправки СМС.

Результат

Устройство находится в работе вторую недельку. СМС извещения удачно приходят по расписанию. Но, из-за нередких поездок и относительно высочайшей температуры воздуха, оценить понижение АКБ в обычное пока не удалось. На последующей недельке в Москве обещают до -30°С — по результатам работы системы дополню обзор.

Также в планах доработать прошивку очередной функцией — измерением dV/dt, другими словами считать изменение напряжения за единицу времени. К примеру, если напряжение АКБ падает на 0,1 В за час либо резвее, то, возможно, не выключен некий пользователь. В этом случае можно посылать извещение/звонок не дожидаясь разряда до 12,3 В.

P.S.

Читая комменты прихожу к выводу, что основная функция устройства почти всеми интерпретируется неправильно. Основная задачка устройства не отловить пороговое напряжение АКБ, при котором мотор чуть запустится, а проинформировать заблаговременно. Потому выбрано относительно высочайшее пороговое напряжение 12,3 В. Может быть, оно будет еще увеличено. Другими словами конкретных действий при получении СМС извещений не надо (к примеру среди ночи).

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

три × 1 =