IoT (Интернет вещей) — дополнение к набору «Матрёшка»

Электронная версия брошюры из набора «IoT (Интернет вещей)». Здесь собраны все исходные коды экспериментов, подсказки и хаки по прохождению набора.

Электронная версия буклета

Необходимые модули из набора «Матрёшка»

Для проектов IoT тебе потребуются платы и модули из базового набора «Матрёшка»:

Если у тебя нет каких-то деталей — закажи недостающие!

Библиотеки для Arduino

Все необходимые библиотеки находятся в одном архиве.

  1. Скачай .zip-архив со всеми библиотеками.
  2. Разархивируй его. Оставь каждую библиотеку в своём архиве.
  3. В меню Arduino IDE выбери пункт ЭскизИмпорт библиотек…Добавить библиотеку….
  4. Добавь таким же образом остальные библиотеки.

Файлы на флеш-карте

На флешке в составе набора уже есть файлы. Они понадобятся тебе для проектов, не изменяй и не удаляй их. Но если всё-таки что-то пошло не так — ты всегда сможешь скачать архив с файлами.

  1. Скачай .zip архив с необходимыми для экспериментов файлами.
  2. Разархивируй файлы и скопируй их на microSD-карту.

Внимание! Arduino UNO может работать только с картами, отформатированными в FAT32.

Настройка точки доступа на смартфоне

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

Некоторые операторы блокируют возможность раздавать Wi-Fi с телефона. Если у тебя в меню нет нужных пунктов — свяжись со службой поддержки оператора.

iOS

Настройки общего доступа к сотовой сети твоего телефона находятся в меню «Настройки» «Сотовая связь» «Режим модема» . В этом меню можно включить режим точки доступа и задать ей пароль. Именем (SSID) точки доступа будет имя телефона. Рекомендуем не закрывать это меню до тех пор, пока клиент не подключится к точке доступа.

После первого включения режима модема такой пункт скорее всего появится в главном меню настроек телефона.

Android

Особенность телефонов на ОС Android — практически у каждого производителя свой интерфейс. Это значит, что невозможно точно сказать, где в твоем телефоне находится кнопка «Раздать интернет» (или даже как она называется). Обычно её можно найти в настройках под названиями вроде «Режим модема и переносная точка доступа».

Эксперименты

1. На старт, внимание, Wi-Fi!

Научимся подключать свои устройства к 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

2. Удалённый термометр.

Соберём устройство для наблюдения за температурой через Интернет. Сервис dweet.io умеет строить красивый график по принимаемым данным. Будем отправлять ему данные о температуре.

2_theremometer.ino
#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);
}

3. Система регистрации данных

Будем снимать показания с датчиков температуры и освещённости и записывать их в файл на microSD-карточке. Мы будем использовать формат .csv, понятный для Microsoft Excel и подобных программ. Так мы сможем с легкостью строить графики и следить, как меняются температура и освещённость в течение больших периодов времени.

3_registrator.ino
#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);
}

4. Напоминальник

Соберём систему напоминаний. На твой email-адрес может приходить письмо, содержащее время нажатия на кнопку. Свяжем между собой два компонента: сервис Webhooks и электронную почту.

4_reminder.ino
#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");
  }
}

Настройка Wi-Fi модуля

Открой пункт «Настройки» в меню «Файл» Arduino IDE. Введи дополнительную ссылку для Менеджера плат.

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Открой менеджер плат. В поле для ввода введи «esp8266». Щелчком мыши активируй появившееся окно «esp8266 by ESP8266 Community», выбери последнюю доступную версию и нажми «Установка».

5. Браузерный Dendy

Сделаем из Arduino сервер с браузерной игрой. Arduino будет читать с флеш-карты файл с игрой и передавать его в Wi-Fi модуль, а модуль обработает файл и покажет в браузере страницу с игрой!

В этом и следующих эксперименте два кода. Один предназначен для Arduino, другой — для Wi-Fi модуля. Инструкцию о том, как загружать свой код в модуль ты сможешь найти на нашей вики.

Код для Arduino:

5_dendy_arduino.ino
#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 модуля:

5_dendy_wifi.ino
#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.

6. Умный дом

Продолжим использовать мощности Wi-Fi модуля для обработки информации. Соберём выключатель света, управляемый из web-интерфейса.

Код для Arduino:

6_smarthome_arduino.ino
#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 модуля:

6_smarthome_wifi.ino
#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();
}

7. Telegram bot

Будем управлять своими устройствами прямо из мессенджера Telegram. Для этого заведём собственного бота и научим Wi-Fi модуль с ним работать.

Код для Arduino:

7_telegram_arduino.ino
#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 модуля:

7_telegram_wifi.ino
#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);
  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:

8_blynk_arduino.ino
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 модуля:

8_blynk_wifi.ino
#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.

Восстановление прошивки Wi-Fi модуля

Mac OS

  1. Скачай архив ESPTOOL_MAC.
  2. Распакуй архив с программой для установки. При этом конечный путь к программе и файлу прошивки не должен содержать кириллических символов.
  3. Открой терминал. Ты найдёшь его в Finder Программы Служебные программы Terminal .
  4. В терминале набери cd, нажми пробел и перенеси в окно терминала иконку папки с содержимым архива. Нажми Enter.
  5. Набери в терминале sudo python setup.py install. Нажми Enter.
  6. Терминал запросит пароль — введи его и нажми Enter.
  7. Инструменты установлены. Осталось перепрошить модуль.
  8. Узнай в Arduino IDE, к какому порту подключена твоя плата.
  9. Набери в терминале команду для перепрошивки:
    python esptool.py --port ИМЯ_ПОРТА write_flash 0x00000 esp8266_AT_firmware.bin

    Вместо «ИМЯ_ПОРТА» подставь порт из Arduino IDE (не забывая пропрямой слэш). Введи модуль в режим перепрошивки. Нажми Enter в терминале.

  10. После успешной прошивки модуль перезагрузится. Ты сможешь проверить его через Arduino IDE стандартными AT-командами, как в эксперименте «На старт, внимание, Wi-Fi!».

Windows

Подробную инструкцию по перепрошивке модуля Wi-Fi читай в техническом описании модуля.

  1. Скачай архив ESPTOOL_WIN.
  2. Распакуй архив с программой для установки. При этом конечный путь к программе и файлу прошивки не должен содержать кириллических символов.
  3. Запусти файл ESPFlashDownloadTool_v3.4.4.
  4. В появившемся окне выбери «ESP8266 DownloadTool».
  5. Укажи путь к файлу AT-прошивки «esp8266_AT_firmware.bin» (он лежит в том же архиве), отметь выбранный файл галочкой в чекбоксе напротив и укажи адрес 0х00, по которому будет записан файл в память модуля.
  6. Выбери СОМ порт, к которому подключён твой модуль, и установи Baud rate 115200.
  7. Настрой оставшиеся поля и чекбоксы:
  8. Переведи модуль в режим программирования.
  9. Теперь, когда модуль готов к прошивке, нажми кнопку «START» и дождись окончания процесса. Ура, модуль снова готов к работе!

А что же дальше?

Прошел набор «IoT»? Молодец! Вот тебе идеи для приборов, которые пригодятся тебе в быту. Применяй знания, полученные из набора, комбинируй различные модули, придумывай и твори с Амперкой!

Используя Troyka-модули барометра и цифрового датчика температуры и влажности, можно создать свою собственную метеостанцию. При помощи пары беспроводной передатчикбеспроводной приёмник на частоте 433 МГц ты сможешь собрать свою метеостанцию в герметичном корпусе и, придумав для неё питание на Power Shield, создать автономное устройство. Оно не будет бояться воды и будет точно сообщать тебе данные о погоде за окном. А модуль в своей комнате ты сможешь оснастить LCD-экраном, чтобы на показания датчиков было приятно смотреть. И, разумеется, ты сможешь получать все эти данные с помощью созданного тобой Telegram-бота!

При помощи датчиков влажности почвы ты сможешь всегда быть уверенным, что твои редкие растения не засохнут от недостатка воды. А даты поливов ты сможешь регистрировать с помощью сервиса Webhooks!

Датчик горючих и угарного газов MQ-9 даст тебе уверенность в безопасности твоего жилья. В случае, если он обнаружит в воздухе присутствие опасных газов, он сможет прислать сообщение тебе прямо в Telegram!

Цветная адресуемая светодиодная лента WS2811 позволит тебе создать освещение в комнате, цвет которого ты сможешь контролировать со смартфона, или даже сделать его реагирующим на музыку, которая играет в твоей комнате.

Датчик шума и ультразвуковой дальномер позволят тебе построить систему сигнализации в твоей комнате — ты всегда будешь знать, если в ней появятся непрошеные гости. А модуль MP3-плеера в комбинации с модулем аудиовыхода сможет твоим голосом вежливо попросить их покинуть твою территорию.

GPRS Shield, совместимый с Arduino UNO, позволит тебе создавать ещё более автономные приборы — ведь теперь они будут выходить в сеть не с помощью Wi-Fi роутера, а напрямую с помощью сотовой сети. Не забудь приобрести SIM-карту с безлимитным трафиком!

Все эти датчики и приборы ты сможешь найти на amperka.ru. Оставайся с нами — тебя ждёт ещё больше крутых проектов!