Умный кирпичик для умного дома
Уже несколько лет назад умные дяди изобрели микросхему ESP8266, которая, при должном умении, позволяет превратить любую вещь в доме в гаджет, управляемый непосредственно по WiFi.
Расскажу я вам как сварганить достаточно простой, но очень практичный выключатель. У меня на пайку подобного девайса уходит всего около 2 часов, так что дома оснастил ими половину всех светильников, кофеварку, водонасос, ну и в более примитивной форме запитал электрические вентили для набора воды в ванную.
Нам понадобится совсем немного. Большинство этого можно купить в любом магазине радиодеталей. Сам модуль не настолько популярный, так что заказываю его у китайцев через eBay. Все компоненты дешевые, так что не акцентирую внимание на ценах. В сумме выходит около 10-20 баксов. Итак, список:
1) Модуль ESP8266. Подойдет самая простая модификация с двумя цифровыми входами-выходами. Можно использовать любую другую, так как стоят они ненамного дороже.
Решил добавить еще распиновку этого модуля. Пригодится дальше
2) Реле с напряжением переключения 5В и максимальным током нагрузки 10А. Подойдет практически любое реле, если нужно включать не очень мощные приборы.
3) Полевой транзистор (ПТ). Нужен обязательно полевой. Причина стоила мне дня головоломок. Для того, чтобы включить режим программирования у ESP8266, нужно закоротить его gpio0 на землю. При использовании обычного транзистора из-за наличия p-n перехода между базой и коллектором как раз это и происходит. В результате, девайс всегда включается в режим программирования и не работает. Полевой транзистор также нужен не какой попало. Проблема в том, что ESP8266 работает на 3.3В максимум (при напряжении больше 3.8В сгорает как свечка). По спецификациям, указанным в большинстве ПТ, он начинает открываться от 2В и полностью открывается при 4В. Соответственно, при 3В транзистор только частично открыт и тока не хватает, чтобы активировать реле. В результате у меня получился весьма раздражающий генератор шума. Итак, ПТ должен быть с полным открытием на 3В. Я выбрал 2N7000. Они дешевые и имеют достаточный максимальный ток, чтобы активировать реле.
4) Стабилизатор напряжения LM317. Может быть, есть что-то покомпактнее, но меня вполне устроил и этот. Он нужен для того, чтобы понизить напряжения до 3.3В. Зачем понижать, если можно использовать питание на 3.3В? Просто. Я не смог найти реле с напряжением активации 3.3В и пришлось использовать питание 5В. Если кто-то найдет – облегчит себе жизнь. Ну а мне, соответственно, чтобы не спалить ESP8266 нужно понижать напругу.
5) К LM317 нужны 2 сопротивления 800 Ом и 1000 Ом. По идее, нужны еще емкости на входе и на выходе, но поскольку я использую уже готовый источник питания, там все это присутствует. Ну и природная леность тоже дает знать.
6) Источник питания. Подойдет USB зарядка с током не менее 800А. Я выбирал из принципа: чем компактнее, тем лучше.
Ну и, собственно, это все из электроники, что нам понадобится. Схема соединения всего этого вот такая (прошу знающих электронику людей не ругаться, делал быстро тем, что первое под руку попалось):
Как видите, схема более чем примитивная. Немного поясню то, что не обозначено. Внизу – изображение с распиновкой ESP8266. Если интересует название пинов, гуглится эта картинка очень быстро. Слева «батарейка» - это источник питания, то есть зарядка USB. Не перепутайте, реле запитывается от 5В, а не от 3.
Еще один комментарий. На выходе LM317 при таких сопротивлениях, как указаны на схеме, получается около 3В. Это нормально, модулю хватает. Если есть желание, можно поиграться и довести аж до 3.8В, но превышать нельзя. Горят модули очень быстро.
С электронной частью, кажись, разобрались, но на этом начинается все самое сложное и интересное. Нужно ведь еще запрограммировать ESP8266, ибо он здесь – тягловая лошадка. Поскольку вам придется много раз перепрограммировать модуль, дабы все хорошо освоить и оптимизировать, советую не впаивать его, а сделать сокет. Я его сотворил, выковыряв разъемы из сгоревших ардуинок и составив из них сокет 4х2. Хотя, конечно, готовые сокеты купить просто.
В собранном виде у меня все выглядит примерно так (сфоткал с разных ракурсов). По-хорошему, лучше бы вытравить платку. Компактнее будет, да и соплей поменьше. Но у меня не хватает на это терпения, так что паяю на обычных прототипных платах. Результат выглядит угрожающе, но посередине - это внутренность от USB-зарядки, так что не пугайтесь.
Как программировать ESP8266. Если не залазить в дебри электроники, я бы рекомендовал использовать Arduino UNO, в котором Reset закорочен на землю. В этом случае он становится обычным конвертером и через пины RX-TX (d0 и d1) можно смело программировать ESP8266. Еще одно преимущество – наличие выхода 3.3В, который используем для питания модуля во время прошивки (в книгах рекомендуют отдельный источник, но у меня работает от ардуины). Соответственно, нужно запитать модуль, а RX-TX ардуино соединить с RX-TX модуля. Не помню точно, какой с каким соединять, но тут можно экспериментально определить. От этого, по крайней мере, ни один модуль еще не пострадал. Ну и, как я уже упоминал, gpio0 нужно соединить с землей до включения питания. Это позволит запустить модуль в режиме программирования.
Соединили. Чем программируем? Счастье все в том, что программировать ESP8266 можно прямо из оболочки ардуино (хотя, это не единственный способ). Но нужно скачать дополнительное ядро (вот тут все подробно описано и выложено https://github.com/esp8266/Arduino).
По сути программирования. Структура кода очень похожа на обычный ардуинный. Основное дополнение – полная реализованность TCP-протокола. С одной стороны это очень круто. Но вот если решите сделать из кнопки полноценный веб-сервер с сайтом и глюками, то придется весь HTTP-протокол прописывать ручками, со всеми его поклонами и реверансами.
Вот самый простой код, который заставит работать эту чудо-кнопку. Оставил только все самое нужное, но, в принципе, наворотить можно много всего. Извините, выглядит убого, поскольку редактора кода с подстветкой синтаксиса тут нет.
#include <ESP8266WiFi.h>
#include <WiFiServer.h>
#include <WiFiClient.h>
const char* ssid = "mywifi"; //вот это название точки доступа
const char* password = "1234567890"; //а это ее пароль
IPAddress ip(192, 168, 1, 176); //поскольку для управления используется IP, задаем его
IPAddress mask(255, 255, 255, 0); //и маску
IPAddress gate(192, 168, 1, 254); //и шлюз, если захотим модулем качать из инета чегото
WiFiServer server(80); //создаем переменную сервер с номером порта. Здесь он 80
void setup(void)
{
pinMode(0, OUTPUT); //В схеме используется один только пин, но на всякий случай обнуляем оба
digitalWrite(0, LOW);
pinMode(2, OUTPUT);
digitalWrite(2, LOW);
WiFi.begin(ssid, password); //Поключаемся к нашему вайфаю
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
WiFi.config(ip, gate, mask); //Задаем айпишник и все такое
server.begin(); //Стартуем сервер. После этого можем посылать запросы через tcp
} //Все, настройку завершили. Теперь как наш модуль будет включать лампочку
void loop()
{
WiFiClient client = server.available(); // Проверяем, есть ли какой запрос
if (!client) //Если нет, нечего тут делать. Выходим
{
return;
}
while (!client.available()) //и ждем, пока появятся данные
{
delay(1);
}
String req = client.readStringUntil('\r'); //читаем данные
client.flush(); // Очищаем буфер от мусора (не уверен точно, но кажется, это так)
if (req.indexOf("/1on") != -1) // Проверяем, содержат ли данные строку «1on»
{
digitalWrite(0, HIGH); //и если да, включаем лампочку
}
else if (req.indexOf("/1off") != -1) // Проверяем, содержат ли данные строку «1off»
{
digitalWrite(0, LOW); //и если да, выключаем лампочку
}
else if (req.indexOf("/2on") != -1) //Аналогично для второго контакта. Не знаю, к какому
//будете подключать, но лишняя строка кода не утянет
{
digitalWrite(2, HIGH);
}
else if (req.indexOf("/2off") != -1)
{
digitalWrite(2, LOW);
}
client.flush();
//Поскольку, наиболее вероятно, что для управления будет использоваться протокол HTTP, нужно завершить запрос. Формируем строку
String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n";
// и посылаем ее клиенту
client.print(s);
delay(1);
}
Если правильно установили ядро для esp8266 в среде разработки Ардуино, среди возможных моделей должны появиться варианты esp8266. Выбираем Generic esp8266 и компилим.
Вот, собственно, и все. После достаточно долгого процесса компиляции и загрузки, вставляем модуль в выключатель, запитываем оный и если все правильно, реле должно пару раз щелкнуть, когда модуль загружается.
Чтобы включить реле, в браузере пишем «http://192.168.1.176/1on», ну или «http://192.168.1.176/2on». Можно для эффектности еще попрыгать вокруг или произнести заклинение, поскольку на странице не отобразится ничего, а вот реле должно активироваться.
Хотел сделать видео, но оно непоказательно. Если будут предложения или вопросы конкретные, могу заснять отдельные моменты разработки и выложить в комменты.
Ну и небольшое заключение. Модуль действительно мощный. После того, как узнал о нем, раздарил все RF и Bluetooth за ненадобностью ;) Конкретно эта модификация позволяет управлять 2 реле, но есть, например esp8266-12, который имеет 11 цифровых выходов/входов и 1 аналоговый вход. Такой монстр почти способен заменить ардуино. Ну а учитывая еще и частоту 160 МГц против 16 ардуиновских, становится ясно, что за esp8266 будущее.
ESP8266 прошивка, программирование в Arduino IDE
Тема ESP8266 — довольно таки непростая. Но, если работать с этими Wi-Fi модулями в среде разработки Arduino IDE — порог вхождения опускается до приемлемого для обычного ардуинщика уровня. Да и не только ардуинщика, а любого человека, у которого есть желание сварганить что-то по теме IoT(интернет вещей), причём не затрачивая много времени читая документацию для микросхемы и изучение API для этих модулей.
By MrПоделкинЦ
P.S. Предыдущий пост по этой теме:
http://pikabu.ru/story/esp8266_i_arduino_podklyuchenie_raspi...ESP8266 и Arduino, подключение, распиновка
Тема ESP8266, как и IoT(интернет вещей), всё больше набирает популярности, и уже Arduino подхватывает инициативу — добавляя эти Wi-Fi модули в список поддерживаемых плат.
Но как же его подключить к ардуино? И возможно как-то обойтись вообще без ардуино? Сегодня именно об этом и пойдёт речь в моём видео.
By MrПоделкинЦ
P.S. Следующий пост по этой теме:
http://pikabu.ru/story/esp8266_proshivka_programmirovanie_v_...
Скоро мы увидим новый модуль ESP32
Осенью 2015 года китайская фирма Espressif представила новый WI-FI чип ESP32 - замена популярному WI-FI чипу ESP8266 . Новый чип имеет больше GPIO , Имеет поддержку 16 АЦП.
Информация по чипу пока собирается. Массовое начало продаж модулей на базе этого чипа запланировано на февраль 2016 года. Цену обещают чуть выше, чем у ESP8266, но думаю китайцы на Aliexpress выгоды не упустят и цена сначала будет завышена.
Компания Espressif не перестаёт радовать энтузиастов. Пару лет назад они выпустили шикарный чип с маркировкой ESP8266, и тогда это был прорыв, ведь всего за пару баксов в рознице можно было купить готовый модуль с данным чипом вместе с флешкой на 1мб. И если до этого кому-нибудь нужно было добавить к ардуине возможность общаться с внешним миром через WiFi, то приходилось покупать модули ценой от $15 и функционалом уровня UART-WiFI моста, то теперь в большинстве случаев отпала необходимость в самой ардуине (читать - микроконтроллере). Ведь ESP8266 представлял из себя систему-на-чипе с интегрированным радио-модулем, поддерживающим работу с WiFi b/g/n. Кроме того, что модуль мог подключаться к точкам доступа, он и сам мог работать в режиме точки доступа, что в теории позволяло создать mesh сеть из данных модулей.
Есть подозрения что в ESP32 будет интерфейс CAN .
Видео длинное, так как была прямая трансляция.
Но не обошлось и без минусов. По какой-то причине Espressif не дали разработчикам доступ к спецификациям и SDK самого чипа, вместо этого они написали свою обёртку над системными вызовами чипа, упаковали это в бинарные блобы с экспортированными функциями, которые и могли использовать разработчики. И всё было бы ничего, но данные блобы кишили ошибками, а по большей части экспортированных из них функций попросту не было документации и заголовочных файлов (для I2S, насколько я знаю, до сих пор нет). Но за такую цену энтузиасты не отчаивались, дизассемблировали блобы, восстанавливая по ним заголовочные файлы, патчили баги прямо в бинарных файлах. В общем было весело.
Но вот недавно Espressif анонсировали новую версию своего чипа - ESP32, на этот раз обещают два ядра, два гига, поддержку HT40 (ширина канала 40МГц, скорость до 144Мбит), поддержку Bluetooth 4.2 (BLE), размер оперативной памяти увеличили до 400Кб, в режиме глубокого сна появилась возможность использовать АЦП с триггером по пороговым значениям, как и раньше аппаратно поддерживаются I2C, I2S, UART, SPI, SDIO, PWM, так же появилась аппаратная поддержка AES и SSL, хотя обычно разработчики встраиваемых систем думают о безопасности в последнюю очередь. Так же количество GPIO увеличено до 35, из них 16 могут работать в режиме АЦП, два как ЦАП, остальные могут быть сконфигурированы для подключения периферии по перечисленным выше интерфейсам, ровно как использоваться в качестве ёмкостных датчиков прикосновения, или просто для моргания светодиодами. Более полную информацию о спецификациях нового чипа можно почитать на страничке Espressif ESP32 (ESP31B) Specifications.
Звучит круто, но есть нюанс. Когда анонсировали ESP8266, то тоже было много обещаний, но на деле оказалось, что большая часть функционала просто не тестировалась, что-то совсем не работает, а где-то нужно городить костыли. Тем ни менее это был крутой чип, хотя бы из-за цены. Цену на новый ESP32 пока что не сообщают, и на данный момент разосланы только 200 тестовых экземпляров, один из которых мы сейчас и запустим.
В ESP32 отсутствует отдельный пин Reset, вместо него для сброса можно использовать Enable. Пин Enable болтается в воздухе, поэтому если его никуда не подключить, то чип будет беспорядочно включаться и выключаться. При логической единице на данном пине чип включается, при логическом нуле выключается. Для тестового включения достаточно подключить питание (3.3В на 3V3, землю на GND) и подключить EN к VCC. К сожалению, на плате отсутствуют какие-либо статусные светодиоды, но если всё сделано правильно, то через несколько секунд должна появиться WiFi точка с именем ESP32_AP_94000000. Пароль от неё пока неизвестен(
Технические характеристики:
Процессор: двухядерный Tensilica L108 частотой до 160 MHz.
Поддерживаемые стандарты WI-FI: 802.11 b / g / n.
Поддерживаемы типы шифрования:WEP, WPA, WPA2.
Поддерживаемые режимы работы: Клиент(STA), Точка доступа(AP), Клиент+Точка доступа(STA+AP).
Поддержка Bluetooth Low Energy and Classic.
Напряжение питания 3.3в (?)
Потребляемый ток: ??
Количество GPIO: 33 (?)
Внешняя Flash память размером 512кб.
RAM данных 144 кб, RAM инструкций -128 кб.
Интерфейсы: 16 ADC, 2 DAC, I2C. UART, SPI, SDIO, I2S, RMII, PWM.
Поддержка AES и SSL на аппаратном уровне.
Информация выше может быть не точной.
Программирование модуля
Ссылка на SDK и описание установки toolchain для Linux https://github.com/espressif/ESP32_RTOS_SDK
esptool32.py для прошивки модуля.
Для режима прошивки необходимо подтянуть GPIO 2 и 0 к GND. GPIO 5 к +VDD (непотверждено)
Вывод в консоль будет примерно следующий:
ets Jul 5 2015,rst cause:1, boot mode:(33)
_stack_sentry: 0x3fffe1d0, __stack: 0x40000000,
_bss_start: 0x3fffcd48, _bss_end: 0x3fffe1d0,
_data_start: 0x3fffc000, _data_end: 0x3fffc864
load 0x40040000, len 2912, room 16
tail 0
chksum 0x6e
load 0x3ffd8000, len 1424, room 8
tail 8
chksum 0x1a
load 0x3ffd8590, len 568, room 0
tail 8
chksum 0xf3
csum 0xf3
********************************
* hello espressif ESP32! *
* pro cpu 2nd boot is running! *
********************************
2nd boot version : 1.0
SPI Speed : 40MHz
SPI Mode : DIO
SPI Flash Size : 1MB
jump to run addr @ 0x40000
rc_cal: rc=44, wifi: 73, 73, 28, 28, bt: 98, 98
txcap: 15, 5, 3, 15, 6, 3, 15, 5, 3, 15, 5, 3,
vdd33=2328, -13; temp_code=120
0x5f, 0x120, 58
0x1f, 0x120, 1
tx_pwctrl:6, 11, 16, 22, 26, 37, -1, 12, 17, 23, 30, 40, -10, 13, 17, 27, 31, 40, -16, 5, 10, 18, 24, 34,
tx_backoff:1, 5, 10, 10,
txiq: 0, 36, 4, 0, -3
txiq: 1, 36, 4, 0, -1
txiq: 2, 4, 4, 0, -2
tx_gain: pa=0x1f, bbc=0x20, bbf=0x4
bt: pa=0x10, bb=0,40
11606945, rxiq: amp=6, pha=4
12032391, rxiq: amp=4, pha=5
11197885, rxiq: amp=4, pha=7
16308699, rxiq: amp=8, pha=3
14541077, rxiq: amp=6, pha=2
13258235, rxiq: amp=5, pha=3
phy, 20151218, 722
ht20 ,2412
pp_task_hdl : 3ffe4af4, prio:23, stack:512
tcpip_task_hdl : 3ffe54e4, prio:20,stack:512
frc2_timer_task_hdl:3ffe8f2c, prio:22, stack:512
ESP32 RTOS SDK: 1.0.0(0394de4) compiled @ Nov 20 2015 18:57:56
SDK version2015121218:1.0.0(0394de4)
[esp32_packet_softap_ssid,43]wifi mode:60 01 94 00 00 00
[esp32_packet_softap_ssid,47]packet ssid[ESP32_AP_94000000]
[esp32_udata_init,66]ok to run AP+STA mode
*****************************
Start app OK!
*****************************
mode : sta(60:01:94:00:00:00) + softAP(62:01:94:00:00:00)
add if0
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
add if1
ht20 ,2412
bcn 100
[smple_socket_demo_thread,42]*********
[smple_socket_demo_thread,42]*********
К сожалению, мне не известен пароль от данной точки.