Зустрічайте вбивцю Arduino: ESP8266
User Rating: / 10
PoorBest 
There are no translations available.

ESP8266_moduleWi-Fi є важливою складовою комплекту для будь-якого проекту Інтернету речей (IoT), але улюблене багатьма Arduino не має Wi-Fi, а додавання шилда Wi-Fi може збільшити загальну вартість майже до $40. Що робити, якщо вже є Arduino-сумісна плата з вбудованим Wi-Fi менш ніж за $10?.
ESP8266_1
Зустрічайте вбивцю 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
ESP8266_2
Натисніть OK, а потім відкрийте Boards Manager (Диспетчер плати) з меню Tools -> Board, знайдіть esp8266 і встановіть платформу. Тепер ви повинні побачити вибір для NodeMCU 1.0:
ESP8266_3
Залиште процесор і швидкість завантаження такими, які є, і виберіть знову встановлення послідовного порту. На Mac, це виглядає як cu.SLAB_USBtoUART.
Як першу програму, автор пропонує простий Wi-Fi сканер - знайдіть його в File -> Examples -> ESP8266WiFi -> WifiScan. Зверніть увагу, що завантаження досить повільне, але в кінцевому підсумку буде показано done uploading (завантаження зроблено) і в цей момент (не раніше, бо порушите процес завантаження), можете відкрити Serial Monitor. Повинні побачити щось схоже на це:
ESP8266_4
Удача! Тепер, давайте спробуємо підключитися до плати.
Візьмемо зовсім простий код для підключення до мережі 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, ймовірно, написаних на друкованій платі. Якщо абсолютно не можете зрозуміти, чому датчик не працює, то, ймовірно, поплутали номера виводів.
ESP8266_5
Швидкий датчик розумного будинку з 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 керівництва для початківців, де автор також показав, як побудувати графік даних.
ESP8266_6
Прощай Arduino, ми так любили тебе. Жарт, бо не скрізь навіть в своєму будинку можете мати Wi-Fi, тому для таких плям все ще потрібна комірчаста мережа з Arduino та радіоприймачів.
(Джерело EN: makeuseof.com)
 
>
BookNewsPractice SearchPartnersAbout
Підтримка та дизайн: Могильний С.С. Шаблон: Joomla Templates by BuyHTTP Joomla Hosting