| Зустрічайте вбивцю Arduino: ESP8266 |
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 (Додаткові адреси диспетчера плати):
http://arduino.esp8266.com/package_esp8266com_index.json
![]()
Натисніть 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. Завантажте, відкрийте консоль на послідовному порту, і ви повинні побачити це підключення:
#include
const char* ssid = "YOUR_SSID"; const char* password = "YOUR_PASSWORD"; WiFiClient wifiClient; void setup() { Serial.begin(115200); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { }
Хіба це не здорово, що все було до смішного просто?
Перш, ніж продовжити, ось схема виводів - вона може стане в нагоді в подальшому. Зверніть увагу, що номери контактів, вказаних в коді, є номерами 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 */ #include <MQTTClient.h> #include <ESP8266WiFi.h> #include <DHT.h> const char* ssid = "YOUR_SSID"; const char* password = "YOUR_PASSWORD!"; 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; } void setup() { Serial.begin(115200); dht.begin(); client.begin(server,wifiClient); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); // Генеруємо ім’я клієнта, базуючись на 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); } else { Serial.println("MQTT connect failed"); Serial.println("Will reset and try again..."); abort(); } prevTime = 0; } void loop() { static int counter = 0; if(prevTime + interval < millis() || prevTime == 0){ prevTime = millis(); Serial.println("checking again"); Serial.println(prevTime); 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); Serial.println(t); Serial.println(h); Serial.println(tPayload); Serial.println(hPayload); client.publish(tempTopic, tPayload); client.publish(humidityTopic, hPayload); Serial.println("published environmental data"); } } client.loop(); // Скидання через день для уникнення витоку пам’яті 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); // виклик бібліотечної функції } void messageReceived(String topic, String payload, char * bytes, unsigned int length) { Serial.print("incoming: "); Serial.print(topic); Serial.print(" - "); Serial.print(payload); Serial.println(); }
Опишемо, як це працює, і кілька зауважень:
• Спочатку підключаємося до 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 та радіоприймачів.
(Джерело EN: makeuseof.com) Останні статті за темою:
Попередні статті за темою:
|

























Wi-Fi є важливою складовою комплекту для будь-якого проекту Інтернету речей (IoT), але улюблене багатьма Arduino не має Wi-Fi, а додавання шилда Wi-Fi може збільшити загальну вартість майже до $40. Що робити, якщо вже є Arduino-сумісна плата з вбудованим Wi-Fi менш ніж за $10?.




