Электронная версия инструкции из набора «IoT (Интернет вещей)». Здесь собраны все исходные коды экспериментов, подсказки и хаки по прохождению набора.
Для проектов IoT тебе потребуются платы и модули из базового набора «Матрёшка»:
Если у тебя нет каких-то деталей — закажи недостающие!
Все необходимые библиотеки находятся в одном архиве.
На флешке в составе набора уже есть файлы. Они понадобятся тебе для проектов, не изменяй и не удаляй их. Но если всё-таки что-то пошло не так — ты всегда сможешь скачать архив с файлами.
Внимание! Arduino UNO может работать только с картами, отформатированными в FAT32.
Иногда в прямой досягаемости нет Wi-Fi сети, а сделать эксперименты из набора очень хочется. Что же делать в таком случае? Поднять такую сеть самому при помощи смартфона!
Некоторые операторы блокируют возможность раздавать Wi-Fi с телефона. Если у тебя в меню нет нужных пунктов — свяжись со службой поддержки оператора.
Настройки общего доступа к сотовой сети твоего телефона находятся в меню
. В этом меню можно включить режим точки доступа и задать ей пароль. Именем (SSID) точки доступа будет имя телефона. Рекомендуем не закрывать это меню до тех пор, пока клиент не подключится к точке доступа.
После первого включения режима модема такой пункт скорее всего появится в главном меню настроек телефона.
Особенность телефонов на ОС Android — практически у каждого производителя свой интерфейс. Это значит, что невозможно точно сказать, где в твоем телефоне находится кнопка «Раздать интернет» (или даже как она называется). Обычно её можно найти в настройках под названиями вроде «Режим модема и переносная точка доступа».
Научимся подключать свои устройства к Wi-Fi сети. Для доступа к Wi-Fi воспользуемся специальным модулем. Он общается с Arduino по протоколу UART.
Все хинты по работе с модулем читай в техническом описании.
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
Соберём устройство для наблюдения за температурой через Интернет. Сервис dweet.io умеет строить красивый график по принимаемым данным. Будем отправлять ему данные о температуре.
#include "ESP8266.h" #include <SoftwareSerial.h> #include <math.h> #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); }
Будем снимать показания с датчиков температуры и освещённости и записывать их в файл на microSD-карточке. Мы будем использовать формат .csv, понятный для Microsoft Excel и подобных программ. Так мы сможем с легкостью строить графики и следить, как меняются температура и освещённость в течение больших периодов времени.
#include <SPI.h> #include <SD.h> #include <math.h> #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); }
Соберём систему напоминаний. На твой email-адрес может приходить письмо, содержащее время нажатия на кнопку. Свяжем между собой два компонента: сервис Webhooks и электронную почту.
#include "ESP8266.h" #include <SoftwareSerial.h> #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"); } }
По умолчанию среда Arduino IDE работает только на AVR-платы. Настройте IDE на работу с Wi-Fi модулем.
Сделаем из Arduino сервер с браузерной игрой. Плата будет читать с флеш-карты файл с игрой и передавать его в Wi-Fi модуль, а модуль обработает файл и покажет в браузере страницу с игрой!
В этом и следующем эксперименте два кода. Один предназначен для платформы Arduino, другой — для Wi-Fi модуля. Инструкцию о том, как загружать свой код в модуль ты сможешь найти на нашей вики.
Код для Arduino:
#include <SPI.h> #include <SD.h> 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 <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> 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
.
Продолжим использовать мощности Wi-Fi модуля для обработки информации. Соберём выключатель света, управляемый из web-интерфейса.
Код для Arduino:
#include <SPI.h> #include <SD.h> #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 <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> 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(); }
Будем управлять своими устройствами прямо из мессенджера Telegram. Для этого заведём собственного бота и научим Wi-Fi модуль с ним работать.
Код для Arduino:
#include <SoftwareSerial.h> #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 <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> 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); } } }
Познакомимся с сервисом 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 <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> 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
.
cd
, нажми пробел и перенеси в окно терминала иконку папки с содержимым архива. Нажми Enter
.sudo python setup.py install
. Нажми Enter
.Enter
.python esptool.py --port ИМЯ_ПОРТА write_flash 0x00000 esp8266_AT_firmware.bin
Вместо «ИМЯ_ПОРТА» подставь порт из Arduino IDE (не забывая пропрямой слэш). Введи модуль в режим перепрошивки. Нажми Enter
в терминале.
Подробную инструкцию по перепрошивке модуля Wi-Fi читай в техническом описании модуля.
Прошел набор «IoT»? Молодец! Вот тебе идеи для приборов, которые пригодятся в быту. Применяй знания, полученные из набора, комбинируй различные модули, придумывай и твори с Амперкой!
Используя Troyka-модули барометра и цифрового датчика температуры и влажности, можно создать свою собственную метеостанцию. При помощи пары беспроводной передатчик — беспроводной приёмник на частоте 433 МГц ты сможешь собрать свою метеостанцию в герметичном корпусе и, придумав для неё питание на Power Shield, создать автономное устройство. Оно не будет бояться воды и будет точно сообщать тебе данные о погоде за окном. А модуль в своей комнате ты сможешь оснастить LCD-экраном, чтобы на показания датчиков было приятно смотреть. И, разумеется, ты сможешь получать все эти данные с помощью созданного тобой Telegram-бота!
При помощи датчиков влажности почвы ты сможешь всегда быть уверенным, что твои редкие растения не засохнут от недостатка воды. А даты поливов ты сможешь регистрировать с помощью сервиса Webhooks!
Датчик горючих и угарного газов MQ-9 даст тебе уверенность в безопасности твоего жилья. В случае, если он обнаружит в воздухе присутствие опасных газов, он сможет прислать сообщение тебе прямо в Telegram!
Цветная адресуемая светодиодная лента WS2811 позволит тебе создать освещение в комнате, цвет которого ты сможешь контролировать со смартфона, или даже сделать его реагирующим на музыку, которая играет в твоей комнате.
Датчик шума и ультразвуковой дальномер позволят тебе построить систему сигнализации в твоей комнате — ты всегда будешь знать, если в ней появятся непрошеные гости. А модуль MP3-плеера в комбинации с модулем аудиовыхода сможет твоим голосом вежливо попросить их покинуть твою территорию.
GPRS Shield, совместимый с Arduino Uno, позволит тебе создавать ещё более автономные приборы — ведь теперь они будут выходить в сеть не с помощью Wi-Fi роутера, а напрямую с помощью сотовой сети. Не забудь приобрести SIM-карту с безлимитным трафиком!
Все эти датчики и приборы ты сможешь найти на amperka.ru. Оставайся с нами — тебя ждёт ещё больше крутых проектов!