====== IoT (Интернет вещей) — дополнение к набору «Матрёшка» ======
Электронная версия инструкции из [[amp>product/matryoshka-iot?utm_source=man&utm_campaign=matryoshka-iot&utm_medium=wiki|набора «IoT (Интернет вещей)»]].
Здесь собраны все исходные коды экспериментов, подсказки и хаки по прохождению набора.
{{ :iot-m:iot-m_banner.png?nolink&600 |}}
===== Электронная версия =====
* {{:iot-m:matreshka-iot.pdf|Книга в формате .pdf}}
===== Необходимые модули из набора «Матрёшка» =====
{{ :iot-m:parts.png?nolink&600 |}}
Для проектов IoT тебе потребуются платы и модули из базового набора «[[amp>product/matryoshka-z?utm_source=man&utm_campaign=matryoshka-iot&utm_medium=wiki|Матрёшка]]»:
* [[amp>product/arduino-uno?utm_source=man&utm_campaign=matryoshka-iot&utm_medium=wiki|Arduino Uno]]
* [[amp>product/breadboard-half?utm_source=man&utm_campaign=matryoshka-iot&utm_medium=wiki|Макетная площадка Breadboard Half]]
* [[amp>product/potentiometer?utm_source=man&utm_campaign=matryoshka-iot&utm_medium=wiki|Переменный резистор (потенциометр)]]
* [[amp>product/tactile-button?utm_source=man&utm_campaign=matryoshka-iot&utm_medium=wiki|Кнопка тактовая]]
* [[amp>product/led-5mm?utm_source=man&utm_campaign=matryoshka-iot&utm_medium=wiki|Светодиод]]
* [[amp>product/rgb-led-5mm?utm_source=man&utm_campaign=matryoshka-iot&utm_medium=wiki|Трёхцветный светодиод]]
* [[amp>product/resistor?utm_source=man&utm_campaign=matryoshka-iot&utm_medium=wiki|Резисторы на 220 Ом]]
* [[amp>product/resistor?utm_source=man&utm_campaign=matryoshka-iot&utm_medium=wiki|Резисторы на 10 кОм]]
* [[amp>product/ldr?utm_source=man&utm_campaign=matryoshka-iot&utm_medium=wiki|Фоторезистор]]
* [[amp>product/thermistor?utm_source=man&utm_campaign=matryoshka-iot&utm_medium=wiki|Термистор]]
Если у тебя нет каких-то деталей — закажи недостающие!
===== Библиотеки для Arduino =====
Все необходимые библиотеки находятся в одном архиве.
- Скачай {{:iot-m:iot-m-libs-v2.zip|.zip-архив}} со всеми библиотеками.
- Разархивируй его. Оставь каждую библиотеку в своём архиве.
- В меню Arduino IDE выбери пункт //Эскиз// → //Импорт библиотек…// → //Добавить библиотеку…//.
- Добавь таким же образом остальные библиотеки.
===== Файлы на флеш-карте =====
На флешке в составе набора уже есть файлы. Они понадобятся тебе для проектов, не изменяй и не удаляй их. Но если всё-таки что-то пошло не так — ты всегда сможешь скачать архив с файлами.
- Скачай {{:iot-m:sd-content.zip|.zip архив}} с необходимыми для экспериментов файлами.
- Разархивируй файлы и скопируй их на microSD-карту.
Внимание! Arduino UNO может работать только с картами, отформатированными в FAT32.
===== Настройка точки доступа на смартфоне =====
Иногда в прямой досягаемости нет Wi-Fi сети, а сделать эксперименты из набора очень хочется. Что же делать в таком случае?
Поднять такую сеть самому при помощи смартфона!
Некоторые операторы блокируют возможность раздавать Wi-Fi с телефона. Если у тебя в меню нет нужных пунктов — свяжись со службой поддержки оператора.
==== iOS ====
Настройки общего доступа к сотовой сети твоего телефона находятся в меню «Настройки» «Сотовая связь» «Режим модема» .
В этом меню можно включить режим точки доступа и задать ей пароль. Именем (SSID) точки доступа будет имя телефона.
Рекомендуем не закрывать это меню до тех пор, пока клиент не подключится к точке доступа.
{{ :iot:настройка_точки_доступа_иос.png?nolink&300 |}}
После первого включения режима модема такой пункт скорее всего появится в главном меню настроек телефона.
==== Android ====
Особенность телефонов на ОС Android — практически у каждого производителя свой интерфейс. Это значит, что невозможно точно сказать, где в твоем телефоне находится кнопка «Раздать интернет» (или даже как она называется). Обычно её можно найти в настройках под названиями вроде «Режим модема и переносная точка доступа».
{{ :iot:ap.png?nolink&700 |}}
===== Эксперименты =====
==== 1. На старт, внимание, Wi-Fi! ====
Научимся подключать свои устройства к Wi-Fi сети. Для доступа к Wi-Fi воспользуемся специальным модулем. Он общается с Arduino по протоколу UART.
Все хинты по работе с модулем читай в [[продукты:troyka-wi-fi|техническом описании]].
AT
AT+CWMODE_DEF=3
AT+CWLAP
AT+CWJAP="SSID","password"
AT+CIFSR
AT+CIPMUX=1
AT+CIPSERVER=1,80
AT+CIPSERVER=0,80
AT+UART_DEF=9600,8,1,0,0
==== 2. Удалённый термометр. ====
Соберём устройство для наблюдения за температурой через Интернет. Сервис [[http://dweet.io/|dweet.io]] умеет строить красивый график по принимаемым данным. Будем отправлять ему данные о температуре.
#include "ESP8266.h"
#include
#include
#define SSID "имя_твоего_Wi-Fi"
#define PASSWORD "пароль_твоего_Wi-Fi"
#define TEMP_PIN A0
SoftwareSerial mySerial(4, 5);
ESP8266 wifi(mySerial);
String name = "твой_ключ";
void setup(void) {
Serial.begin(9600);
if (wifi.joinAP(SSID, PASSWORD)) {
Serial.println("https://dweet.io/follow/" + name);
} else {
Serial.println("Wi-Fi connection error");
}
}
void loop(void) {
float v_temp = 1023.0 / analogRead(TEMP_PIN) - 1.0;
float temp = 1.0 / ( -log(v_temp) / 3977.0
+ 1.0 / 295.0 ) - 273.0;
if (wifi.createTCP("www.dweet.io", 80)) {
String data = "GET /dweet/for/" + name + "?";
data += "temp=" + String(temp) + " HTTP/1.1\r\n";
data += "Host: dweet.io\r\n\r\n";
wifi.send(data.c_str(), data.length());
wifi.releaseTCP();
} else {
Serial.println("create TCP error");
}
delay(1000);
}
==== 3. Система регистрации данных ====
Будем снимать показания с датчиков температуры и освещённости и записывать их в файл на microSD-карточке. Мы будем использовать формат .csv, понятный для Microsoft Excel и подобных программ. Так мы сможем с легкостью строить графики и следить, как меняются температура и освещённость в течение больших периодов времени.
#include
#include
#include
#define LIGHT_PIN A3
#define TEMP_PIN A2
#define CS 8
void setup() {
Serial.begin(9600);
if (!SD.begin(CS)) {
Serial.println("initialization failed!");
return;
}
}
void loop() {
float r_light = 10.0
/ (1023.0 / analogRead(LIGHT_PIN) - 1.0);
float light = 10.0 * pow(14.0 / r_light, 1.6);
float v_temp = 1023.0 / analogRead(TEMP_PIN) - 1.0;
float temp = 1.0 / ( -log(v_temp) / 3977.0
+ 1.0 / 295.0 ) - 273.0;
String data = String(millis() / 1000) + ";"
+ String(light) + ";" + String(temp);
data.replace(".", ",");
Serial.println(data);
File logFile = SD.open("log.csv", FILE_WRITE);
logFile.println(data);
logFile.close();
delay(1000);
}
==== 4. Напоминальник ====
Соберём систему напоминаний. На твой email-адрес может приходить письмо, содержащее время нажатия на кнопку. Свяжем между собой два компонента: сервис Webhooks и электронную почту.
#include "ESP8266.h"
#include
#define SSID "имя_твоего_Wi-Fi"
#define PASSWORD "пароль_твоего_Wi-Fi"
#define BTN_PIN 12
SoftwareSerial mySerial(4, 5);
ESP8266 wifi(mySerial);
boolean buttonWasUp = true;
String maker_ID = "id_компонента_webhooks";
void setup(void) {
Serial.begin(9600);
if (wifi.joinAP(SSID, PASSWORD)) {
Serial.println("I'm ready! Press the button.");
} else {
Serial.println("Wi-Fi connection error");
}
}
void loop(void) {
boolean buttonIsUp = digitalRead(BTN_PIN);
if (buttonWasUp && !buttonIsUp) {
delay(10);
buttonIsUp = digitalRead(BTN_PIN);
if (!buttonIsUp) {
sendEmail();
Serial.println("Notification has been sent");
}
}
buttonWasUp = buttonIsUp;
}
boolean sendEmail() {
if (wifi.createTCP("maker.ifttt.com", 80)) {
String value1 = "Hello!";
String request = "GET /trigger/feed/with/key/"
+ maker_ID + "?value1=" + value1
+ " HTTP/1.1\r\n";
request += "Host: maker.ifttt.com\r\n\r\n";
wifi.send(request.c_str(), request.length());
wifi.releaseTCP();
} else {
Serial.println("create tcp error");
}
}
===== Настройка Wi-Fi модуля =====
По умолчанию среда Arduino IDE работает только на AVR-платы. [[:продукты:troyka-wi-fi#программирование_на_c|Настройте IDE на работу с Wi-Fi модулем]].
==== 5. Браузерный Dendy ====
Сделаем из Arduino сервер с браузерной игрой. Плата будет читать с флеш-карты файл с игрой и передавать его в Wi-Fi модуль, а модуль обработает файл и покажет в браузере страницу с игрой!
В этом и следующем эксперименте два кода. Один предназначен для платформы Arduino, другой — для Wi-Fi модуля. Инструкцию о том, как загружать свой код в модуль ты [[http://wiki.amperka.ru/%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:troyka-wi-fi#wi-fi_модуль_как_самостоятельный_контроллер|сможешь найти на нашей вики]].
Код для Arduino:
#include
#include
void setup() {
Serial.begin(115200);
SD.begin(8);
}
void loop() {
if (Serial.find("race.htm")) {
File myFile = SD.open("race.htm");
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
}
Код для Wi-Fi модуля:
#include
#include
#include
String page = "";
ESP8266WebServer server(80);
void handleRoot() {
server.send(200, "text/html", page);
}
void setup(void) {
Serial.begin(115200);
WiFi.begin("имя_твоего_Wi-Fi", "пароль_твоего_Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
Serial.println();
Serial.println(WiFi.localIP());
server.on("/race.htm", handleRoot);
server.begin();
Serial.println("race.htm");
}
void loop(void) {
if (Serial.available()) {
page += (char)Serial.read();
}
server.handleClient();
}
Если ESP не отвечает IP-адресом, нажми на ней Reset. Это может случаться, когда ESP подключается к Wi-Fi раньше, чем открывается Serial Monitor.
Открой браузер, впиши в адресную строку IP-адрес и добавь в конце «/race.htm». Должно получиться примерно так: ''192.168.0.0/race.htm''.
==== 6. Умный дом ====
Продолжим использовать мощности Wi-Fi модуля для обработки информации. Соберём выключатель света, управляемый из web-интерфейса.
Код для Arduino:
#include
#include
#define RELAY A4
File myFile;
void setup() {
Serial.begin(115200);
SD.begin(8);
pinMode(RELAY, OUTPUT);
}
void loop() {
String command = Serial.readStringUntil('\n');
command.trim();
if (command == "On") {
digitalWrite(RELAY, HIGH);
}
if (command == "Off") {
digitalWrite(RELAY, LOW);
}
if (command == "home.htm") {
myFile = SD.open("home.htm");
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
}
Код для Wi-Fi модуля:
#include
#include
#include
String page = "";
ESP8266WebServer server(80);
void handleRoot() {
server.send(200, "text/html", page);
}
void handleOn() {
Serial.println("On");
server.send(200, "text/plain", "On");
}
void handleOff() {
Serial.println("Off");
server.send(200, "text/plain", "Off");
}
void setup(void) {
Serial.begin(115200);
WiFi.begin("имя_твоего_Wi-Fi", "пароль_твоего_Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
Serial.println();
Serial.println(WiFi.localIP());
server.on("/home.htm", handleRoot);
server.on("/turnOn", handleOn);
server.on("/turnOff", handleOff);
server.begin();
Serial.println("home.htm");
}
void loop() {
if (Serial.available()) {
page += (char)Serial.read();
}
server.handleClient();
}
==== 7. Telegram bot ====
Будем управлять своими устройствами прямо из мессенджера [[https://telegram.org/|Telegram]]. Для этого заведём собственного бота и научим Wi-Fi модуль с ним работать.
Код для Arduino:
#include
#define REL_PIN 12
SoftwareSerial esp(4, 5);
void setup() {
esp.begin(9600);
pinMode(REL_PIN, OUTPUT);
}
void loop() {
String command = esp.readStringUntil('\n');
command.trim();
if (command == "turnOn") {
digitalWrite(REL_PIN, HIGH);
}
if (command == "turnOff") {
digitalWrite(REL_PIN, LOW);
}
}
Код для Wi-Fi модуля:
#include
#include
#include
char ssid[] = "имя_твоего wi-fi";
char password[] = "пароль_wi-fi";
#define BOTtoken "твой_токен"
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
String keyboardJson = "[[\"/ledon\", \"/ledoff\"]]";
void setup() {
Serial.begin(9600);
client.setInsecure();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
void loop() {
int numNewMessages = bot.getUpdates(
bot.last_message_received + 1);
handleNewMessages(numNewMessages);
}
void handleNewMessages(int numNewMessages) {
for (int i = 0; i < numNewMessages; i++) {
String chat_id = String(bot.messages[i].chat_id);
String text = bot.messages[i].text;
if (text == "/ledon") {
Serial.println("turnOn");
bot.sendMessage(chat_id, "Relay is ON", "");
}
if (text == "/ledoff") {
Serial.println("turnOff");
bot.sendMessage(chat_id, "Relay is OFF", "");
}
if (text == "/start") {
bot.sendMessageWithReplyKeyboard(chat_id,
"Choose from one of the following options",
"", keyboardJson, true);
}
}
}
==== 8. Blynk ====
Познакомимся с сервисом Blynk и поуправляем RGB-светодиодом со смартфона.
Если при копировании содержимого архива ты не обнаружишь папку ''tools'', просто создай её рядом с папкой ''libraries''.
Код для Arduino:
int ledR = 3;
int ledG = 5;
int ledB = 6;
void setup() {
Serial.begin(115200);
}
void loop() {
String command = Serial.readStringUntil('\n');
if (command.length() > 0) {
int led;
if (command[0] == 'r') {
led = ledR;
}
if (command[0] == 'g') {
led = ledG;
}
if (command[0] == 'b') {
led = ledB;
}
String brightness = command.substring(1);
analogWrite(led, brightness.toInt());
}
}
Код для Wi-Fi модуля:
#include
#include
char auth[] = "токен_blynk";
char ssid[] = "имя_твоего wi-fi";
char pass[] = "пароль_wi-fi";
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
}
void loop() {
Blynk.run();
}
BLYNK_WRITE(V1) {
int redValue = param[0].asInt();
int greenValue = param[1].asInt();
int blueValue = param[2].asInt();
Serial.print("r");
Serial.println(redValue);
Serial.print("g");
Serial.println(greenValue);
Serial.print("b");
Serial.println(blueValue);
}
Настраивая компонент ''ZeRGBa'', обрати внимание на поле ''PIN'': оно должно называться ''V1''.
===== Восстановление прошивки Wi-Fi модуля =====
==== Mac OS ====
- Скачай архив {{:iot-m:esptool_mac.zip|ESPTOOL_MAC}}.
- Распакуй архив с программой для установки. При этом конечный путь к программе и файлу прошивки не должен содержать кириллических символов.
- Открой терминал. Ты найдёшь его в
Finder
Программы
Служебные программы
Terminal
.
- В терминале набери ''cd'', нажми пробел и перенеси в окно терминала иконку папки с содержимым архива. Нажми ''Enter''.{{ :iot-m:снимок_экрана_2017-09-12_в_16.38.26.png?nolink&600 |}}
- Набери в терминале ''sudo python setup.py install''. Нажми ''Enter''.{{ :iot-m:снимок_экрана_2017-09-12_в_16.38.56.png?nolink&600 |}}
- Терминал запросит пароль — введи его и нажми ''Enter''.{{ :iot-m:снимок_экрана_2017-09-12_в_16.39.09.png?nolink&600 |}}{{ :iot-m:снимок_экрана_2017-09-12_в_16.39.58.png?nolink&600 |}}
- Инструменты установлены. Осталось перепрошить модуль.
- Узнай в Arduino IDE, к какому порту подключена твоя плата.{{ :iot-m:снимок_экрана_2017-09-12_в_16.42.46.png?nolink&600 |}}
- Набери в терминале команду для перепрошивки: python esptool.py --port ИМЯ_ПОРТА write_flash 0x00000 esp8266_AT_firmware.bin
Вместо «ИМЯ_ПОРТА» подставь порт из Arduino IDE (не забывая пропрямой слэш). Введи модуль в режим перепрошивки. Нажми ''Enter'' в терминале.{{ :iot-m:снимок_экрана_2017-09-12_в_16.48.19.png?nolink&600 |}}
- После успешной прошивки модуль перезагрузится. Ты сможешь проверить его через Arduino IDE стандартными AT-командами, как в эксперименте «На старт, внимание, Wi-Fi!».
==== Windows ====
Подробную инструкцию по перепрошивке модуля Wi-Fi читай в [[:продукты:troyka-wi-fi#перепрошивка|техническом описании модуля]].
- Скачай архив {{:iot-m:esptool_win.zip|ESPTOOL_WIN}}.
- Распакуй архив с программой для установки. При этом конечный путь к программе и файлу прошивки не должен содержать кириллических символов.
- Запусти файл ESPFlashDownloadTool_v3.4.4.
- В появившемся окне выбери «ESP8266 DownloadTool».
- Укажи путь к файлу AT-прошивки «esp8266_AT_firmware.bin» (он лежит в том же архиве), отметь выбранный файл галочкой в чекбоксе напротив и укажи адрес 0х00, по которому будет записан файл в память модуля.
- Выбери СОМ порт, к которому подключён твой модуль, и установи Baud rate 115200.
- Настрой оставшиеся поля и чекбоксы:
- Переведи модуль в режим программирования.
- Теперь, когда модуль готов к прошивке, нажми кнопку «START» и дождись окончания процесса. Ура, модуль снова готов к работе!
===== А что же дальше? =====
Прошел набор «IoT»? Молодец!
Вот тебе идеи для приборов, которые пригодятся в быту. Применяй знания, полученные из набора, комбинируй различные модули, придумывай и твори с Амперкой!
{{ :iot:wiki_meteo.png?nolink&300 |}}
Используя Troyka-модули [[amp>product/troyka-barometer?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|барометра]] и [[amp>product/troyka-temperature-humidity-sensor-dht11?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|цифрового датчика температуры и влажности]], можно создать свою собственную метеостанцию. При помощи пары [[amp>product/rf-433-transmitter?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|беспроводной передатчик]] — [[amp>product/rf-433-receiver?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|беспроводной приёмник]] на частоте 433 МГц ты сможешь собрать свою метеостанцию в герметичном корпусе и, придумав для неё питание на [[amp>product/arduino-power-shield-li-ion?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|Power Shield]], создать автономное устройство. Оно не будет бояться воды и будет точно сообщать тебе данные о погоде за окном. А модуль в своей комнате ты сможешь оснастить [[amp>product/display-nextion-enhanced-nx4024k032?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|LCD-экраном]], чтобы на показания датчиков было приятно смотреть. И, разумеется, ты сможешь получать все эти данные с помощью созданного тобой Telegram-бота!
{{ :iot:wiki_water.png?nolink&300 |}}
При помощи [[amp>product/sensor-soil-moisture-capacitive?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|датчиков влажности почвы]] ты сможешь всегда быть уверенным, что твои редкие растения не засохнут от недостатка воды. А даты поливов ты сможешь регистрировать с помощью сервиса Webhooks!
{{ :iot:wiki_fire.png?nolink&300 |}}
[[amp>product/troyka-mq9-gas-sensor?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|Датчик горючих и угарного газов MQ-9]] даст тебе уверенность в безопасности твоего жилья. В случае, если он обнаружит в воздухе присутствие опасных газов, он сможет прислать сообщение тебе прямо в Telegram!
{{ :iot:wiki_light.png?nolink&300 |}}
[[amp>product/ws2811-led-strip-sealed?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|Цветная адресуемая светодиодная лента WS2811]] позволит тебе создать освещение в комнате, цвет которого ты сможешь контролировать со смартфона, или даже сделать его реагирующим на музыку, которая играет в твоей комнате.
{{ :iot:wiki_grabber.png?nolink&300 |}}
[[amp>product/troyka-sound-loudness-sensor?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|Датчик шума]] и [[amp>product/hc-sr04-ultrasonic-sensor-distance-module?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|ультразвуковой дальномер]] позволят тебе построить систему сигнализации в твоей комнате — ты всегда будешь знать, если в ней появятся непрошеные гости. А [[amp>product/df-player-mp3-module?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|модуль MP3-плеера]] в комбинации с модулем [[amp>product/troyka-line-out-mini-jack?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|аудиовыхода]] сможет твоим голосом вежливо попросить их покинуть твою территорию.
{{ :iot-m:wifi-auto.png?nolink&300 |}}
[[amp>product/arduino-gprs-shield?utm_source=man&utm_campaign=iot-m&utm_medium=wiki|GPRS Shield]], совместимый с Arduino Uno, позволит тебе создавать ещё более автономные приборы — ведь теперь они будут выходить в сеть не с помощью Wi-Fi роутера, а напрямую с помощью сотовой сети. Не забудь приобрести SIM-карту с безлимитным трафиком!
Все эти датчики и приборы ты сможешь найти на [[https://amperka.ru|amperka.ru]]. Оставайся с нами — тебя ждёт ещё больше крутых проектов!