Wi-Fi є важливою складовою комплекту для будь-якого проекту Інтернету речей (IoT), але улюблене багатьма Arduino не має Wi-Fi, а додавання шилда Wi-Fi може збільшити загальну вартість майже до $40. Що робити, якщо вже є Arduino-сумісна плата з вбудованим Wi-Fi менш ніж за $10?.
Зустрічайте вбивцю Arduino: ESP8266. Це лише питання часу, перш ніж була вкрадена корона з блискучої голови нашої дорогої плати розробника Arduino.
ESP-12E (також відомий як NodeMCU) був спочатку в продажі як надбудова Wi-Fi низької вартості для плати Arduino, поки співтовариство хакерів не зрозуміло, що можна було б повністю обійтися без Arduino.
Менш ніж за рік, ESP8266 злетіла в популярності і тепер настільки добре підтримується і відпрацьована, що, якщо ви сьогодні використовуєте Arduino, то повинні встати і взяти її до відома. Купити її зараз же і слідувати цьому посібнику, щоб почати програмувати ESP8266 - і все це зі знайомого Arduino IDE.
Ви не обмежені використанням Arduino IDE, звичайно, - плата теж сумісна з Lua (який виглядає як схудлий Python для початківців), але так як ми пропонуємо заміну з точки зору тих, хто навчився на Arduino, то сьогодні розглянемо виключно Arduino IDE.
Сьогодні є досить багато моделей ESP8266, але автор збирається піти вперед і рекомендує ESP-12E (також відомий як NodeMCU 1.0, або це новітній брат NodeMCU 2.0).
Модуль трохи дорожчий, ніж інші ($6.50 у порівнянні з $4!), Але включає в себе послідовний драйвер, необхідний для програмування чіпа, має вбудований регулятор живлення, а також багато виводів входів/виходів. Він широко підтримується і дійсно нічого, крім підключення USB для програмування та живлення, більше не потрібно, тому з ним легше працювати. Якщо купуєте будь-яку іншу плату ESP8266, то, можливо, буде потрібний окремий регулятор живлення для 3,3В і відповідне FTDI-з'єднання для програмування.
Початок роботи з ESP8266-12E і Arduino
По-перше, встановіть драйвери послідовного порту для цієї плати. Можливо, буде потрібновідключити KEXT підписання, якщо працюєте El Capitan, у зв'язку з новими системами безпеки.
Далі, ви повинні включити підтримку ESP8266 диспетчером плати Arduino IDE. Відкрийте Preferences (Налаштування) і введіть наступну адресу у вікні, де вказано Additional Board Manager URLs (Додаткові адреси диспетчера плати):
Натисніть OK, а потім відкрийте Boards Manager (Диспетчер плати) з меню Tools -> Board, знайдіть esp8266 і встановіть платформу. Тепер ви повинні побачити вибір для NodeMCU 1.0:
Залиште процесор і швидкість завантаження такими, які є, і виберіть знову встановлення послідовного порту. На Mac, це виглядає як cu.SLAB_USBtoUART.
Як першу програму, автор пропонує простий Wi-Fi сканер - знайдіть його в File -> Examples -> ESP8266WiFi -> WifiScan. Зверніть увагу, що завантаження досить повільне, але в кінцевому підсумку буде показано done uploading (завантаження зроблено) і в цей момент (не раніше, бо порушите процес завантаження), можете відкрити Serial Monitor. Повинні побачити щось схоже на це:
Удача! Тепер, давайте спробуємо підключитися до плати.
Візьмемо зовсім простий код для підключення до мережі Wi-Fi. Він нічого, крім простого підключення, не робить, але ще щось зможете додати пізніше. Тільки не забувайте змінити YOUR_SSID і YOUR_PASSWORD на параметри свого Wi-Fi. Завантажте, відкрийте консоль на послідовному порту, і ви повинні побачити це підключення:
Хіба це не здорово, що все було до смішного просто?
Перш, ніж продовжити, ось схема виводів - вона може стане в нагоді в подальшому. Зверніть увагу, що номери контактів, вказаних в коді, є номерами GPIO, а не D0-16, ймовірно, написаних на друкованій платі. Якщо абсолютно не можете зрозуміти, чому датчик не працює, то, ймовірно, поплутали номера виводів.
Швидкий датчик розумного будинку з MQTT і DHT11
Розглянемо практичний приклад, який можна використовувати відразу, щоб контролювати ваш дім. Будемо знімати значення температури і вологості з датчика DHT11, і додавати до звіту, використовуючи протокол MQTT в мережі Wi-Fi, у випадку автора, до системи автоматизації будинку OpenHAB (якщо немає, то, можливо, захочете прочитати Керівництво для початківців, щоб отримати OpenHAB і запустити на Raspberry Pi, і 2 частину, в якій конкретно розглядається установка сервера MQTT).
На стороні монтажу підключіть датчик DHT до GND, 3,3В і ~ D4 (або GPIO 2). Це все, що нам зараз потрібно.
Завантажте бібліотеки MQTT і DHT. Навіть якщо у вас вони вже є, завантажте їх в будь-якому випадку, зробіть резервне копіювання того, що у вас є, і перезапишіть завантаженими. Остання бібліотека DHT11 від Adafruit використовує алгоритм автоматичного визначення швидкості, з якою дані зчитуються з датчика, але вона глючить на ESP8266 і 90% часу результати не вдається прочитати.
Зі старою версією 1.0 бібліотеки, яку автор включив у завантаження, ви можете вручну змінити час: 11 найкраще підходить для цих плат ESP2866. Автор також пройшов через багато копій бібліотеки MQTT, намагаючись знайти хорошу функцію зворотного виклику, нарешті, одну з них включив у завантаження. Треба буде перезапустити Arduino IDE після їх заміни.
Тут зберігається повний код проекту. Зверху знаходяться всі змінні, які ви повинні змінити, у тому числі, параметри Wi-Fi, сервера MQTT (можна використати URL-адресу замість використання хмарного сервера, хоча на місці немає ніякої аутентифікації), і канали для публікації даних.
/* ESP8266 + MQTT Humidity and Temperature Node
* Можна також приймати команди; задійте функцію messageReceived()
* Дивись MakeUseOf.com для повного керівництва та інструкцій
* Автор: James Bruce, 2015
*/
char* subscribeTopic = "openhab/parentsbedroom/incoming"; // підписатися на цю тему; все, що надсилається сюди, буде передане у функцію messageReceived
char* tempTopic = "openhab/parentsbedroom/temperature"; //тема для публікації прочитаної температури
char* humidityTopic = "openhab/parentsbedroom/humidity"; // публікація прочитаної вологості
const char* server = "192.168.1.99"; // сервер або URL брокера MQTT
String clientName = "parentsbedroom-"; // просто ім’я, використане для звертання до брокера MQTT
long interval = 60000; //(ms) - 60 секунд між звітами
unsigned long resetPeriod = 86400000; // 1 день – це період після якого ми робимо рестарт CPU, щоб унеможливити помилки витоку пам’яті
#define DHTTYPE DHT11 // DHT11 або DHT22
#define DHTPIN 2
unsigned long prevTime;
DHT dht(DHTPIN, DHTTYPE,11);
float h, t;
WiFiClient wifiClient;
MQTTClient client;
String macToStr(const uint8_t* mac)
{
String result;
for (int i = 0; i < 6; ++i) {
result += String(mac[i], 16);
if (i < 5)
result += ':';
}
return result;
}
// Генеруємо ім’я клієнта, базуючись на MAC-адресі і останніх 8 бітах лічильника мікросекунд
uint8_t mac[6];
WiFi.macAddress(mac);
clientName += macToStr(mac);
clientName += "-";
clientName += String(micros() & 0xff, 16);
Serial.print("Connecting to ");
Serial.print(server);
Serial.print(" as ");
Serial.println(clientName);
if (client.connect((char*) clientName.c_str())) {
Serial.println("Connected to MQTT broker");
Serial.print("Subscribed to: ");
Serial.println(subscribeTopic);
client.subscribe(subscribeTopic);
h = dht.readHumidity();
t = dht.readTemperature();
h = h*1.23;
t = t*1.1;
// Перевіряємо, чи не було будь-якої помилки при читанні і виходимо раніше (щоб спробувати знову).
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
}
else if(!client.connected()){
Serial.println("Connection to broker lost; retrying");
}
else{
char* tPayload = f2s(t,0);
char* hPayload = f2s(h,0);
// Скидання через день для уникнення витоку пам’яті
if(millis()>resetPeriod){
ESP.restart();
}
}
/* значення з плаваючою комою в рядок
* f - перетворення значення з плаваючою комою в рядок
* p - точність (кількість знаків)
* повернути рядкове представлення значення з плаваючою комою
*/
char *f2s(float f, int p){
char * pBuff; // використовуємо, щоб пам'ятати, яка частина буфера використана для dtostrf
const int iSize = 10; // кількість буферів, по одному для кожного значення з плаваючою комою для пакування
static char sBuff[iSize][20]; // простір 20 символів, включаючи NULL, для кожного значення з плаваючою комою
static int iCount = 0; // зберігаємо таблицю наступного розміщення в sBuff для використання
pBuff = sBuff[iCount]; // використовуємо цей буфер
if(iCount >= iSize -1){ // перевірка пакування
iCount = 0; // якщо упаковано, то знову стартуємо і скидаємо
}
else{
iCount++; // просунутий лічильник
}
return dtostrf(f, 0, p, pBuff); // виклик бібліотечної функції
}
• Спочатку підключаємося до Wi-Fi, потім до сервера MQTT, а потім починаємо основний цикл loop().
• У циклі ми опитуємо датчик DHT кожні 60 секунд і публікуємо показання на відповідних MQTT-каналах. Знову ж таки, якщо знайдете у більшості читань результатів повідомлення про помилку, то у вас неправильна версія бібліотеки DHT – треба зменшити її до v1.0.
• client.loop() передає управління в бібліотеку MQTT, що дозволяє реагувати на вхідні повідомлення.
• Функція messageReceived() дозволяє обробляти вхідні повідомлення - просто додайте просту умову if, щоб порівняти отримане повідомлення з тим, що очікували. Це можна використовувати, щоб активувати, наприклад, реле.
• Після виконання коду протягом декількох днів, автор виявив, що код випадково перестав працювати - автор вважає це свого роду витоком пам'яті, враховуючи, що він не мав навиків кодування для боротьби з ним, також це може бути зв’язане з основними бібліотеками. Автор вибрав просте м'яке перезавантаження щодня. Тому, через один день вузли датчиків спочатку активуються, а потім перезапускають себе.
• При живленні дешевих модулів DHT11 від 3,3В значення вологості набагато нижчі, ніж вони повинні бути. Автор вирішив цю проблему простим множенням і калібруванням за комерційним датчиком. Він радив би вам отримати підтвердження від свого довіреного джерела, перш ніж покладатися на показання. Крім того, живити їх від 5В - але ви повинні розмістити перемикання логічного рівня 5В-3.3В між виводом даних і ESP8266, щоб не пошкодити модуль.
Якщо все вийшло добре, то тепер ви повинні отримувати показання датчиків у своєму брокері MQTT, і можете продовжити з підключенням їх до OpenHAB, як зазначено в частині 2 керівництва для початківців, де автор також показав, як побудувати графік даних.
Прощай Arduino, ми так любили тебе. Жарт, бо не скрізь навіть в своєму будинку можете мати Wi-Fi, тому для таких плям все ще потрібна комірчаста мережа з Arduino та радіоприймачів.