Esp alarm: сделайте iot, wi-fi включен будильник с esp8266

Esp alarm: сделайте iot, wi-fi включен будильник с esp8266
Esp alarm: сделайте iot, wi-fi включен будильник с esp8266
Anonim

ESP Alarm: сделайте IoT, Wi-Fi включен будильник с ESP8266

«Тревога ESP» представляет собой подключенный сигнал тревоги с помощью смартфона через Wi-Fi, используя модуль ESP8266. Вы можете добавлять / изменять / удалять / активировать / деактивировать аварийные сигналы с помощью приложения Android, когда устройство подключено и подключено к той же сети Wi-Fi, к которой подключен ваш телефон.

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

Поэтому я решил создать устройство «ESP Alarm», которое позволяет настраивать сигналы тревоги с помощью моего смартфона через Wi-Fi и оставлять остальное на будильнике. Проще говоря, это будильник с Wi-Fi, IoT!

Это мой второй проект с использованием крошечного монстра ESP8266 для Wi-Fi. Посмотрите мой первый проект «Как построить контрольную цепь с регулируемым рабочим временем через Wi-Fi» здесь, на AAC.

Важные заметки

  1. Для этого приложения требуется Android 4.4 (Marshmallow) и выше.
  2. Максимальное количество аварийных сигналов - 20 из-за ограничений аппаратного обеспечения.
  3. Это приложение находится в разработке и по-прежнему не хватает некоторых улучшений, но оно отвечает основным требованиям для этого проекта.

Большое спасибо моему другу Jihad Al-bathish (AKA Joud) за разработку собственного приложения для Android для этого проекта.

Обзор устройства

Схема сигнализации ESP

Image
Image
нажмите, чтобы увеличить

BOM

Часть Документация КОЛ
Arduino UNO или любой совместимый совет (необязательно) //www.arduino.cc/en/Main/ArduinoBoardUno 1
ATmega328P (дополнительно) www.atmel.com/devices/ATMEGA328P.aspx 1
ESP8266 Модуль Wi-Fi, модель ESP-01 www.esp8266.com/wiki/doku.php?id=esp8266-module-family 1
1, 44-дюймовый TFT-дисплей //world.taobao.com/item/521610992161.htm 1
Плата отключения TP4056 (зарядное устройство с литиевым аккумулятором) //world.tmall.com/item/38825413372.htm 1
DS1307 / DIL-08 (чип RTC) //www.maximintegrated.com/en/products/digital/real-time-clocks/DS1307.html 1
74LVX4245 / TSSOP-28 (преобразователь уровня 5V-3V3) //www.fairchildsemi.com/products/logic/voltage-level-translators/voltage-level-translators/74LVX4245.html 1
Кабель USB TTL (дополнительно) //www.ftdichip.com/Products/Cables/USBTTLSerial.htm 1

«ESP Alarm» подключается к Android-приложению через Wi-Fi, используя модуль ESP8266. Вы можете добавлять / изменять / удалять / активировать / деактивировать сигналы тревоги с помощью приложения Android, когда устройство подключено и подключено к той же сети Wi-Fi, к которой подключен ваш телефон.

Мой «ESP Alarm» имеет 1, 4-дюймовый TFT-экран и две кнопки в качестве пользовательского интерфейса. Одна кнопка используется для выключения будильника, а другая - для отсрочки. Приветственное сообщение (когда пользователь включает будильник), и время отсрочки настраивается через приложение. Время и дата отображаются на экране TFT и синхронизируются с временем и датой вашего телефона.

Изменение или добавление новых сигналов тревоги может быть выполнено с помощью процесса установления связи. Это означает, что если приложение не получило ответа от устройства, оно не будет делать желаемого действия. Мы решили добавить это ограничение, чтобы избежать проблем с неправильной синхронизацией между вашим смартфоном и «ESP Alarm».

Тревоги могут быть установлены как одноразовые или повторяемые (в зависимости от дня). Каждый из них имеет уникальный заголовок, отображаемый на экране TFT, когда он выключается (чтобы вы могли напомнить себе о конкретных встречах, повторяющихся встречах и т. Д.).

аппаратные средства

ESP8266 соединен с Arduino UNO через соединение UART с помощью команды AT (команды в ASCII). Вы можете добавлять / изменять / удалять / активировать / деактивировать сигналы тревоги с помощью приложения Android, когда устройство подключено и подключено к той же сети Wi-Fi, к которой подключен ваш телефон.

Я использовал 1, 4-дюймовый TFT-экран для печати некоторых важных данных, таких как время, дата, IP-адрес, номер порта, название сигнала тревоги и т. Д. Оба экрана TFT и модуль Wi-Fi используют логический уровень 3V3 и нуждаются в преобразователе уровня с Arduino, который использует 5V логический уровень.

Время и дата хранятся в чипе RTC DS1307, который связан с Arduino с использованием интерфейса I 2 C. Я добавил резервную батарею Li-ion для поддержания правильной даты и времени, даже если устройство выключено. Чтобы зарядить эту батарею, я использовал микросхему зарядного устройства TP4056.

Экран TFT

Я использовал 1, 44-дюймовое разрешение 128x128, SPI TFT с внутренним драйвером ILI9163C. Эти модули выпускаются в двух версиях: одна с 3V3-5V встроенным модулем IC и еще один без этой ИС.

Image
Image
1, 44 "версии SPI TFT

Я купил один из 3V3 модулей у китайского поставщика, но по какой-то причине я получил версию 5V вместо версии 3V3.

Во всяком случае, я добавил IC-модуль внешнего уровня, который равен 74LVX4245. Это 8-битный транслирующий трансивер, который разработан как интерфейс между шиной 5 В и шиной 3 В в смешанной среде питания 3 В / 5 В. Эта ИС имеет 8-контактный порт A для 5-вольтовой логики, 8-контактный B-порт для 3-вольтовой логики и входной вывод Transmit / Receive (T / R #) для определения направления потока данных (от A до B или B до А). В моем случае я зафиксировал направление от A (5V) до B (3V3).

Чтобы взаимодействовать с этим модулем TFT, вам необходимо добавить библиотеку TFT_ILI9163C (написанную Sumotoy) в вашу среду разработки Arduino и подключить контакты TFT с Arduino следующим образом:

Контакт с TFT Контакт с Arduino Заметка
VCC + 3V
СВЕТОДИОД + 5 В через резистор Модуль имеет резистор, ограничивающий ток, но я счел более безопасным добавить еще один с низким значением, например, 100 - 1 кОм.
GND GND
SCL (часы SPI) ПИН 13 SCL не связан с выводом SCL в протоколе I 2 C. Техническое описание ILI9163C использовало ту же аббревиатуру.
SDA (SPI MOSI) ПИН 11 SDA не относится к выводу «SDA» в протоколе I 2 C. Техническое описание ILI9163C использовало ту же аббревиатуру.
Д / CX PIN 9 (необязательно) Отображение данных / вывод команды
CS ПИН 10 Выбор чипа
RES + 3V Сброс
Image
Image

Еще одна важная вещь в этом TFT - это знать, как форматировать цвет. Этот TFT-контроллер поддерживает 18-битные, 16-битные и 6-битные интерфейсы RGB. Библиотека Сумотой использует 16-битный формат RGB.

Image
Image

Это называется RGB565 (5-битный красный, 6-битный зеленый и 5-битовый синий). Есть некоторые онлайн-инструменты, которые могут дать вам ваш цвет выбора в этом формате.

Модуль Wi-Fi

ESP8266 - недорогой SoC-чип со встроенным микроконтроллером и полным стеком протоколов TCP / IP, что означает, что он может напрямую обращаться к вашей сети Wi-Fi. Поскольку этот чип имеет свой собственный MCU, вы можете поместить в него свой код приложения, или вы можете использовать модуль так же, как приемопередатчик Wi-Fi, как то, что мы собираемся делать в этом проекте. Это делается с помощью команды AT (опять же, команды в ASCII) с использованием соединения UART. Вы можете просмотреть полный список AT-команд в этом документе.

Image
Image
Изображение, взятое из краткого руководства по модулю Wi-Fi ESP8266

Чип ESP8266 поставляется в разных модульных моделях, но мы будем использовать модель ESP-01.

Image
Image

Модуль использует уровень 3V3, поэтому нам нужно сделать преобразование между ним и Arduino, которое использует уровень 5V. Поскольку мы уже использовали четыре контакта 8-контактного порта из ICL-конвертера 74LVX4245 для экрана TFT, мы собираемся использовать пятый вывод для преобразования TX-сигнала с уровня Arduino на 3V3.

Сигнал TX от ESP8266 может быть оставлен без какого-либо преобразования в 5 В, пока минимальное входное напряжение на VCC = 5V составляет около 2, 65 В согласно рисунку 35-25 из таблицы ATmega328P (контроллер Arduino UNO).

Image
Image
Изображение, взятое из таблицы ATmega328P

Однако в одном и том же документе (таблица 30-1) наименьшее значение, при котором штырь гарантированно считается высоким, составляет 0, 6 × VCC = 0, 6 × 5 = 3 В. Кроме того, согласно (таблица 5-1) в техническом описании ESP8266EX, минимальное выходное высокое напряжение составляет 0, 8 × Vio = 0, 8 × 3, 3 = 2, 64 В, что немного меньше минимального входного напряжения ATmega328.

Таким образом, соединение может быть ненадежным в худшем случае. Я решил, что безопаснее конвертировать из уровня 3V в 5 В с помощью простой схемы, состоящей из одного MOSFET и двух подтягивающих резисторов:

Image
Image
5V-3.3V двунаправленный преобразователь уровня

RTC Chip

DS1307 - это чип RTC, используемый для получения времени из своих внутренних энергонезависимых регистров, в то время как есть источник питания или резервная батарея. Эта ИС использует интерфейс I 2 C с его MCU, который состоит из двух строк: SCL (последовательные часы) и SDA (последовательные данные). Я использовал библиотеку под названием DS1307RTC, чтобы разобраться с ней на Arduino, которую вы можете получить с сайта PJRC.

Я использовал литий-ионную батарею (со своего старого телефона, NOKIA C5) с TP4056, полным линейным зарядным устройством постоянного тока / постоянного напряжения для одноядерных литиево-ионных батарей. Чтобы облегчить ситуацию, я использовал рекламную панель, подобную той, что была на фотографии.

Image
Image
Плата TP4056. Источник изображения: HAOYU Electronics

Вы можете изменить зарядный ток, изменив значение Rprog резистора. Для получения дополнительной информации см. Техническое описание зарядного устройства.

Код Arduino

Код зависит от следующих библиотек:

  • TFT_ILI9163
  • Adafruit_GFX
  • DS1307RTC
  • Провод (для подключения I 2 C)
  • EEPROM (для хранения сигналов тревоги во внутреннем EEPROM)
  • SoftwareSerial (дополнительная отладка)

Во-первых, код инициализирует соединение SPI с экраном TFT, соединение I 2 C с чипом RTC и соединение UART с модулем Wi-Fi. Затем он печатает интро-экран, который включает логотип AAC (я старался как можно больше сопоставить его с оригинальным!).

Модуль Wi-Fi должен быть настроен с вашим SSID / паролем сети и другими настройками, такими как ваш порт. Вы должны изменить эту часть:


sendCommand("AT+CWJAP=\"YOURSSID\", \"YOURPASSWORD\"\r\n", 1000, DEBUG);

Примечание. Обязательно подождите около шести секунд (задержка (6000);) после этого, потому что для подключения к сети требуется некоторое время.

Если все будет работать, ваш модуль получит IP-адрес с помощью этой команды:


IP = sendCommand("AT+CIFSR\r\n", 1000, DEBUG);

Проверка полученного IP-адреса

Я добавил простой способ проверить полученный IP.

Как правило, для локального соединения с вашим маршрутизатором IP-адрес будет примерно 192.168.1.100. Ответ от модуля для этой команды «AT + CIFSR» будет примерно таким:

+ CIFSR: STAIP "192.168.1.50"

+ CIFSR: STAMAC, "18: fe: 34: 9f: 48: d8"

И если соединение не выполнено, ответ будет:

ОШИБКА

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

Примечание. Я получаю IP-адрес от ответа, используя функцию подстроки объекта String IP между символами 25 и 38. Ответ начинается с AT + CIFSR \ r \ n + CIFSR: STAIP, "который составляет 25 символов


IP = sendCommand("AT+CIFSR\r\n", 1000, DEBUG); // get ip address if (IP.length() <= 25) { IP = "NOT Avaliable"; tft.print(" Not \r\n Connected:("); return 0; } else { IP = IP.substring(25, 38); // Get the IP part from the command response tft.print("Connected "); return 1; }

Коммуникационные команды

Команды связи, полученные от мобильного приложения и ожидаемые соответствующие ответы со стороны Arduino, показаны в этой таблице:

команда отклик Заметка
ЗАДАВАТЬ Коннектикут Установка времени повтора и приветственного сообщения. Пример: SET, 5, Hello;
ДОБАВИТЬ В

Добавление тревоги.

ADD, ID, A (активный) / D (Выключена), ЧЧММ, RepDays, SoundType, название;

DEL DT Деактивация / удаление тревоги
SYN ST Синхронизация времени между чипом RTC и мобильным телефоном. SYN, DD + MM + YYYY, HH: MM: SS, Пример: SYN, 08 + 20 + 2016, 09: 28: 56, 1
DEB Нет ответа Распечатка некоторой внутренней информации на экране.
RES RT Сброс тревоги, включая мигание внутренней EEPROM.

Чтобы сохранить аварийные сигналы, даже когда вы выключаете устройство, я использовал внутреннюю EEPROM, которая не является лучшим выбором, потому что она имеет ограниченное количество раз, чтобы читать / записывать ее содержимое. EEPROM имеет выдержку не менее 100 000 циклов записи / стирания. Я думаю, что лучше использовать внешнюю память в будущем развитии.

Структура памяти проста. 22 байта для каждого сигнала тревоги:

  • B0: ID-B1: A (активный) / D (деактивирован) в качестве символа
  • B2: HH (час) как номер
  • B3: MM (Minuit) как номер
  • B4: Rep Day как номер, интерпретируемый как флаги
  • B5: обратная
  • B6.. B21: символ 16-го лица

Адреса следующие:

  • 20 Сигнализация 20 × 22 равна 440B, адрес: 000..439
  • 16B для приветственного сообщения, Адрес: 444..459
  • 1B время повтора, адрес: 460

Я получаю все команды в ASCII, а затем обрабатываю их и преобразую то, что нужно преобразовать, например, повторяющиеся дни каждого будильника. Я получаю следующее от мобильного:

  • O: Нет повторений
  • F: Повторять все дни.
  • A: Последовательность чисел. (например, 123 означает повторить этот сигнал в воскресенье, понедельник и вторник. Я использую эту последовательность для форматирования номера HEX. Например, значение 1000001 означает, что будильник повторяется каждое воскресенье и суббота.)

Чтобы ускорить выполнение программы и уменьшить количество обращений к EEPROM, после запуска устройства код ищет активные аварийные сигналы (путем считывания B1 для каждого сохраненного аварийного сигнала) и обновляет некоторые значения переменных в ОЗУ.

Я решил использовать простой метод обработки и для сохранения этих аварийных сигналов в ОЗУ. Просто, каждый раз, когда часы, минуты и день тревоги соответствуют текущей дате / времени, сигнал тревоги должен погаснуть. Для этого определены три массива. Они есть:

  • Active_Alarms_H (размер = 24 в течение 24 часов в день)
  • Active_Alarms_M (размер = 60 в течение 60 минут в час)
  • Active_Alarms_D; (размер = 7 в течение 7 дней в неделю)

Каждый бит в каждом элементе этих массивов представляет собой идентификатор счетчика тревоги. Это означает, что будильник 0 может использовать бит 0 из каждого элемента. Итак, давайте притвориться, что у нас есть будильник с идентификатором 1, который идет каждое воскресенье в 1:15. Это отразится на содержимом массивов следующим образом:

Active_Alarms_H (1) = 00000000000000000010

Active_Alarms_M (15) = 00000000000000000010

Active_Alarms_D (0) = 00000000000000000010

Проще говоря, чтобы узнать, какая тревога должна идти каждый минус, я делаю операцию «И» между текущими элементами времени из этих массивов следующим образом:


activeAlarms = Active_Alarms_H(tm. Hour) & Active_Alarms_M(tm. Minute) & Active_Alarms_D(DayOfWeek - 1);

Например, допустим, у нас есть три сигнала тревоги:

  • Alarm0: 12:15, Rep: Солнце
  • Alarm1: 14:00, Rep: Вс, Сб.
  • Тревога2: 14:15, Репутация: Пт

Затем:

Active_Alarms_H (12) = 00000000000000000001

Active_Alarms_M (15) = 00000000000000000001

Active_Alarms_D (0) = 00000000000000000001

--------------------------

Active_Alarms_H (14) = 00000000000000000010

Active_Alarms_M (0) = 00000000000000000010

Active_Alarms_D (0) = 00000000000000000011

Active_Alarms_D (1) = 00000000000000000010

--------------------------

Active_Alarms_H (14) = 00000000000000000110

Active_Alarms_M (15) = 00000000000000000101

Active_Alarms_D (6) = 00000000000000000100

Предположим, что сейчас 14:15 в пятницу, так что:

activeAlarms = Active_Alarms_H (14) & Active_Alarms_M (15) & Active_Alarms_D (6);

00000000000000000110

00000000000000000101

00000000000000000100

-------------А ТАКЖЕ-------------

00000000000000000100

Следовательно, будильник с ID = 2 должен погаснуть сейчас.

*** Заметка о памяти:

Последнее, что я хотел бы упомянуть, это то, что я страдал от небольшого свободного места в оперативной памяти, что заставляло программу вести себя так, как я этого не ожидал. Я попытался сделать некоторую оптимизацию в коде, чтобы исправить это. Например, я решил использовать параметр PROGMEM, который заставляет компилятор сохранять желаемую переменную во флэш-памяти. Я сохранил 52 байта, сохранив заголовок HTTP во флэш-памяти, а не в ОЗУ.

В приведенной ниже таблице вы можете найти три важных определения в коде и как их использовать:

определять Описание
#define SWDebug

Для включения последовательной отладки ПО с использованием (PIN 2, 3). Не включайте его, если вы используете Arduino UNO. Недостаточно свободного места в ОЗУ.

Библиотека SoftwareSerial была разработана для обеспечения последовательной связи на других цифровых выводах Arduino, используя программное обеспечение для репликации функциональности аппаратного UART.

#define Чтобы включить
#define DebugOnTFT Чтобы включить отладку на TFT

Заметки:

  • sendHTTPResponse, sendData и sendCommand в основном основаны на учебнике AllAboutEE.
  • Если вы используете модули ESP8266 со старым SDK, у вас могут быть такие ошибки, как я. Единственным решением в этом случае является обновление вашей прошивки до последней версии. Проверьте эту статью AAC на помощь в обновлении прошивки. Начиная с публикации этой статьи, я обновил свою прошивку с версии 1.3 до 1.5.4.

PCB & Schematic

Вот несколько примечаний, которые помогут вам понять печатную плату и схематический дизайн:

Image
Image
ESPAlarm PCB (вид сверху)
Image
Image
Плата ESPAlarm (вид снизу)
  • Я встроил Arduino в свое устройство, поэтому добавил ATmega328P. Я также дал вам возможность подключить Arduino UNO, но вам нужно будет выбрать один из этих двух вариантов - не связывайте их обоих.
  • Я добавил два перемычки для модуля Wi-Fi: один для его включения / выключения, а другой для выбора режима загрузки (нормальный запуск (GPIO0 pull up) или обновление прошивки (сбрасывание GPIO0)).
  • Вы можете найти заголовок «WIFI_MOD_PROG». Этот заголовок должен подключить внешний последовательный USB-кабель (например, тот, что представлен на изображении ниже) с помощью модуля Wi-Fi.
Image
Image
Последовательный кабель USB TTL. Изображение предоставлено FTDI Chip
  • JP1 используется для выбора типа кабеля, 3V3 или 5V. В соответствии с вашим типом кабеля TX сигнал будет преобразован в 3V3 или напрямую подключен к ESP8266.
  • Я добавил индикатор RGB, чтобы показать состояние питания устройства. Я также добавил заголовок расширения для будущей разработки.
  • PCB-мудрый, это первый раз, когда я попробовал «negasilk.ulp», чтобы сделать перевернутый шелкография, как тот, что на картинке. Чтобы узнать, как использовать этот ULP, обратитесь к этому краткому руководству.
Image
Image

Устройство берет питание от Arduino или от разъема USB-разъема зарядного устройства.

Image
Image
Image
Image

Программного обеспечения

Image
Image
Image
Image
нажмите, чтобы увеличить

Приложение Android позволяет вам контролировать все функции, необходимые для добавления / редактирования / удаления определенных аварийных сигналов. Он также дает вам возможность синхронизировать дату и время между сигналом ESP и вашим мобильным телефоном. Приложение имеет три основные функции, описанные ниже.

Основные функции приложения

Мы можем разделить наши основные функции на три области.

Во-первых, у нас есть панель действий, где у нас есть четыре кнопки:

  • Добавить: «Добавить» новые аварийные сигналы. Мы рассмотрим это позже.
  • Синхронизация. Для синхронизации даты и времени с сигналом ESP.
  • Настройки: Чтобы открыть «Настройки». Мы рассмотрим это позже.
  • О: Отображает всплывающее окно с информацией.

Во-вторых, цифровые часы, которые отображают текущее время в соответствии с настройками вашего телефона 12/24.

Наконец, третья функция - это список ваших предустановленных аварийных сигналов. Это, конечно, будет пустым, когда пользователь запустит приложение в первый раз. В этом случае нажатие внутри этой области откроет «Добавить активность». Однако после добавления аварийных сигналов эта область будет отображать время и заголовок будильника с кнопкой удаления для каждого аварийного сигнала. Если пользователь нажимает на любую запись, приложение запустит «Изменить действие».

Функция «Добавить»

Просто введите заголовок будильника в определенное время. И не забудьте активировать будильник!

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

Обратите внимание, что «Изменить активность» позволит те же изменения. Однако он будет автоматически заполнен данными выбранного сигнала.

Функция «Настройки»

  • Период отсрочки ограничен четырьмя вариантами. Пользователь должен выбрать один из них.
  • Сообщение приветствия является необязательным для пользователя, но оно действительно потрясающе. Например, он позволяет пользователю называть его ESP Alarm, особенно если у него более одного.
  • Пользователь должен заполнить IP-адрес, который отображается на экране ESP Alarm после его подключения. То же самое касается номера порта.
  • «Сброс всех аварийных сигналов» - очень важная кнопка. Как только пользователь нажмет на него, все аварийные сигналы будут удалены из аварийного сигнала ESP, и, если он вернет ответ на сброс, все тревоги также будут удалены с телефона.

Лучший способ начать использовать это приложение:

  1. Перейдите к настройкам и заполните поля IP-адреса и порта.
  2. Нажмите Сохранить. Если вы получите сообщение об успешном завершении, то вы на правильном пути.
  3. Нажмите кнопку синхронизации в основном действии, чтобы убедиться, что ваш RTC имеет правильное время. Это завершает этап инициализации.
  4. Теперь вы можете начать добавлять свои сигналы тревоги, как хотите!

Загружаемые файлы

PCB Eagle FilesArduino SketchAndroid Application

Прочитайте больше

  • Графическая библиотека Adafruit GFX
  • Краткое руководство по быстрому вводу в эксплуатацию модуля Wi-Fi ESP8266
  • Серийная библиотека программного обеспечения
  • Ссылка PROGMEM Arduino
  • Как создать инвертированный шелкография в Cadsoft Eagle
  • ESP8266 Набор инструкций AT AT

видео

Попробуйте этот проект сами! Получить спецификацию.