====== 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]]. Оставайся с нами — тебя ждёт ещё больше крутых проектов!