В этой статье мы узнаем о связи одной платы NodeMCU ESP8266 с другой платой ESP8266 с использованием Ad hoc (одноранговой) сети. Мы будем отправлять данные с одного ESP8266 на другой ESP8266 по Wi-Fi с использованием ad-hoc, то есть сети устройство-устройство, без использования какого-либо маршрутизатора WiFi. Концепция аналогична построению Mesh сети на основе ESP8266.
На стороне отправителя/передатчика мы соединим водонепроницаемый датчик температуры DS18B20 с платой NodeMCU ESP8266 12E. Мы измерим окружающую температуру и отправим ее на сторону приемника. Сторона приемника состоит из платы NodeMCU ESP8266 вместе с OLED дисплеем SSD1306 0,96″ I2C . Дисплей OLED будет отображать полученную температуру на экране OLED.
Для запуска сети Ad hoc нам будет нужна библиотека веб-сервера. Библиотека ESP8266WebServer позволяет нам запускать ESP8266 как веб-сервер, а также как точку доступа. Веб-сервер может обрабатывать данные, полученные от удаленного датчика по Wi-Fi, без подключения устройств к сети или маршрутизатору. Таким образом, используя WebServer, мы можем иметь связь ESP8266 с ESP8266.
Также на нашем сайте вы можете посмотреть другие статьи, посвященные взаимодействию между двумя NodeMCU ESP8266:
- с помощью протокола ESP-NOW;
- с помощью клиент сервер по Wi-Fi и скрипта на Lua;
- взаимодействие Wi-Fi клиент-сервер между двумя платами NodeMCU ESP8266;
Необходимые компоненты
- NodeMCU ESP8266 (купить на AliExpress).
- Maxim Integrated DS18B20 Programmable Resolution (цифровой датчик температуры DS18B20) (купить на AliExpress).
- Модуль OLED дисплея SSD1306 128×64 с интерфейсом I2C (купить на AliExpress).
- Резистор 4,7 кОм (купить на AliExpress).
- Макетная плата.
- Соединительные провода/перемычки.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Что такое Ad hoc-сеть?
Сеть ad hoc представляет собой сеть, состоящую из отдельных устройств (в нашем случае ESP8266), которые напрямую взаимодействуют друг с другом. Сети ad hoc создаются между двумя или более беспроводными Nodemcu ESP8266 вместе, без использования беспроводного маршрутизатора или точки доступа. Несколько ESP8266 взаимодействуют друг с другом напрямую.
Сети Ad hoc могут быть очень полезны во время встреч или в любом месте, где нет сети и где людям нужно обмениваться файлами. Сеть Ad hoc может быть также полезна в ситуациях, когда только один ПК имеет доступ к Интернету и этот доступ необходимо сделать общим.
Схема проекта
В этом проекте нам понадобятся две схемы - передатчика/отправителя и приемника.
Схема передатчика
На стороне отправителя мы подключили водонепроницаемый датчик температуры DS18B20 к плате NodeMCU ESP8266. Подключите его VCC к 3,3 В платы, а GND - к GND платы. Аналогично подключите его цифровой вывод к выводу NodeMCU D2. Подключите подтягивающий резистор 4,7 кОм между цифровым выводом и выводом VCC, как показано на рисунке ниже.
Схема приемника
На стороне приемника мы просто подключаем 0,96″ SSD1306 I2C OLED-дисплей к плате NodeMCU ESP8266. Подключите его VCC к 3,3 В, а GND дисплея - к GND платы. Подключите контакты SDA и SCL дисплея к D2 и D1 NodeMCU.
Исходный код программы
Давайте посмотрим код для отправителя/передатчика и получателя/приемника. Мы будем работать над ячеистой сетью esp8266, создавая точку доступа ESP8266 и клиента.
Сначала код потребует несколько библиотек. Поэтому загрузите библиотеки по следующим ссылкам:
1. Adafruit_SSD1306 : https://github.com/adafruit/Adafruit_SSD1306
2. Adafruit_GFX : https://github.com/adafruit/Adafruit-GFX-Library
3. Библиотека One Wire : https://github.com/PaulStoffregen/OneWire
4. Библиотека температуры Далласа : https://github.com/milesburton/Arduino-Temperature-Control-Library
Код передатчика
1 2 |
const char *ssid = "Alexahome"; const char *password = "loranthus"; |
Обязательно измените SSID и пароль WiFi в строках выше.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
#include <ESP8266WiFi.h> #include <OneWire.h> #include <DallasTemperature.h> #define DS18B20 D2 OneWire ourWire(DS18B20); DallasTemperature sensor(&ourWire); const char *ssid = "Alexahome"; const char *password = "loranthus"; int temp = 0; // value read from the DS18B20 void setup() { Serial.begin(115200); delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); 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() { // read the temperature value: sensor.requestTemperatures(); temp = sensor.getTempCByIndex(0); Serial.print("Temperature: "); Serial.print(temp); Serial.println(" °C"); char intToPrint[5]; itoa(temp, intToPrint, 10); //integer to string conversion for OLED library // Use WiFiClient class to create TCP connections WiFiClient client; const char * host = "192.168.4.1"; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // We now create a URI for the request String url = "/data/"; url += "?sensor_reading="; url += intToPrint; Serial.print("Requesting URL: "); Serial.println(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { Serial.println(">>> Client Timeout !"); client.stop(); return; } } Serial.println(); Serial.println("Closing connection"); Serial.println(); Serial.println(); Serial.println(); delay(500); } |
Код приемника
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <U8g2lib.h> U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 5, /* data=*/ 4); const char *ssid = "Alexahome"; const char *password = "loranthus"; ESP8266WebServer server(80); void handleSentVar() { Serial.println("handleSentVar function called..."); if (server.hasArg("sensor_reading")) { // this is the variable sent from the client Serial.println("Sensor reading received..."); int readingInt = server.arg("sensor_reading").toInt(); char readingToPrint[5]; itoa(readingInt, readingToPrint, 10); //integer to string conversion for OLED library u8g2.firstPage(); u8g2.drawUTF8(0, 64, readingToPrint); u8g2.nextPage(); Serial.print("Reading: "); Serial.println(readingToPrint); Serial.println(); server.send(200, "text/html", "Data received"); } } void setup() { delay(1000); Serial.begin(115200); Serial.println(); Serial.print("Configuring access point..."); u8g2.begin(); u8g2.setFont(u8g2_font_logisoso62_tn); u8g2.setFontMode(0); // enable transparent mode, which is faster WiFi.softAP(ssid, password); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); server.on("/data/", HTTP_GET, handleSentVar); server.begin(); Serial.println("HTTP server started"); } void loop() { server.handleClient(); } |
Тестирование работы проекта
После загрузки кодов на схемы отправителя и получателя нажмите кнопку REST на обоих ESP8266. После нажатия кнопки REST монитор последовательного порта покажет что-то вроде этого.
В обоих разделах ESP8266 подключится к сети Wi-Fi и создаст точку доступа. Затем данные передаются по беспроводной сети через тот же веб-сервер.
Теперь данные о температуре передаются с одного устройства на другое с помощью Ad hoc сети на ESP8266. Вы можете проверить данные о температуре на OLED-дисплее.
11 просмотров