В этом проекте интернета вещей (IoT) мы узнаем, как сделать простую онлайн-метеостанцию на основе IoT, используя плату разработки ESP8266 NodeMCU (ESP-12E) и OLED-дисплей SSD1306 (128×64 пикселей). Этот проект — замечательный проект для новичков в области IoT, которые хотят узнать о получении данных с онлайн-сервера Интернета на плату NodeMCU.
В этом проекте NodeMCU извлекает данные о погоде, такие как температура, влажность, давление, скорость и направление ветра, с погодного сайта openweathermap.org и отображает их на экране SSD1306.
На нашем сайте вы можете посмотреть ряд похожих проектов метеостанций:
- передача с помощью NodeMCU ESP8266 данных температуры и влажности на ThingSpeak;
- метеостанция на NodeMCU ESP8266 и датчике BME280;
- метеостанция IoT Live на NodeMCU ESP8266.
Необходимые компоненты
- NodeMCU ESP8266 (купить на AliExpress).
- Модуль OLED дисплея SSD1306 128×64 с интерфейсом I2C (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Блок-схема метеостанции IoT
Это простая структурная схема для метеостанции IoT (интернета вещей), которая наглядно объясняет, как она работает.
Сайт openweathermap.org предоставляет онлайн-сервис для данных о погоде и прогноза. Данные загружаются на облачный сервер. Модуль NodeMCU ESP8266 собирает информацию о данных онлайн и загружает/извлекает такую информацию, как температура, влажность, давление, скорость ветра и степень направления ветра.
Эти данные отображаются на 0,96-дюймовом OLED-дисплее SSD1306 вместе с городом.
Схема проекта
Схема подключения OLED дисплея SSD1306 к плате NodeMCU ESP8266 представлена на следующем рисунке.
Линии SDA и SCL шины I2C берут начало от GPIO4 (D2) и GPIO0 (D3) платы NodeMCU (соответственно), они подключены к контактам SDA и SCL (SCK) модуля дисплея SSD1306. Модуль OLED-дисплея питается напряжением 5 В от контакта Vin платы NodeMCU.
Генерация API из OpenWeatherMap
Сервис OpenWeatherMap предоставляет доступ к текущим данным о погоде для любого местоположения, включая более 200 000 городов по всему миру. Текущая погода часто обновляется с более чем 40 000 метеостанций. Данные доступны в формате JSON, XML или HTML. Мы будем использовать здесь данные в формате JSON.
Посетите https://openweathermap.org и войдите в систему, создав свою учетную запись.
Создайте или сгенерируйте свой ключ API, так как он необходим для извлечения данных.
Выберите город и код страны, введя название города. Пример: Jaipur, IN, здесь Jaipur — это город, а IN — код страны для Индии. Название города и код страны необходимо ввести в коде.
Исходный код программы
Ниже приведен код для IoT метеостанции с NodeMCU и сервисом OpenWeatherMap. Для этого вам понадобятся 3 разные библиотеки, а именно Adafruit_GFX.h , Adafruit_SSD1306.h и ArduinoJson.h . Вы можете получить все эти библиотеки из Library Manager (менеджера библиотек).
Измените в приведенном коде WIFI SSID, пароль и название города с кодом страны. Теперь вы можете загрузить этот код на плату NodeMCU.
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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> // http web access library #include <ArduinoJson.h> // JSON decoding library // Libraries for SSD1306 OLED display #include <Wire.h> // include wire library (for I2C devices such as the SSD1306 display) #include <Adafruit_GFX.h> // include Adafruit graphics library #include <Adafruit_SSD1306.h> // include Adafruit SSD1306 OLED display driver #define OLED_RESET 5 // define SSD1306 OLED reset at ESP8266 GPIO5 (NodeMCU D1) Adafruit_SSD1306 display(OLED_RESET); // set Wi-Fi SSID and password const char *ssid = "Your Wifi SSID"; const char *password = "Your Wifi Password"; // set location and API key String Location = "City Name, Country Code"; String API_Key = "Your API Key"; void setup(void) { Serial.begin(9600); delay(1000); Wire.begin(4, 0); // set I2C pins [SDA = GPIO4 (D2), SCL = GPIO0 (D3)], default clock is 100kHz // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64) // init done Wire.setClock(400000L); // set I2C clock to 400kHz display.clearDisplay(); // clear the display buffer display.setTextColor(WHITE, BLACK); display.setTextSize(1); display.setCursor(0, 0); display.println(" Internet Weather"); display.print(" Station - Jaipur"); display.display(); WiFi.begin(ssid, password); Serial.print("Connecting."); display.setCursor(0, 24); display.println("Connecting..."); display.display(); while ( WiFi.status() != WL_CONNECTED ) { delay(500); Serial.print("."); } Serial.println("connected"); display.print("connected"); display.display(); delay(1000); } void loop() { if (WiFi.status() == WL_CONNECTED) //Check WiFi connection status { HTTPClient http; //Declare an object of class HTTPClient // specify request destination http.begin("http://api.openweathermap.org/data/2.5/weather?q=" + Location + "&APPID=" + API_Key); // !! int httpCode = http.GET(); // send the request if (httpCode > 0) // check the returning code { String payload = http.getString(); //Get the request response payload DynamicJsonBuffer jsonBuffer(512); // Parse JSON object JsonObject& root = jsonBuffer.parseObject(payload); if (!root.success()) { Serial.println(F("Parsing failed!")); return; } float temp = (float)(root["main"]["temp"]) - 273.15; // get temperature in °C int humidity = root["main"]["humidity"]; // get humidity in % float pressure = (float)(root["main"]["pressure"]) / 1000; // get pressure in bar float wind_speed = root["wind"]["speed"]; // get wind speed in m/s int wind_degree = root["wind"]["deg"]; // get wind degree in ° // print data Serial.printf("Temperature = %.2f°C\r\n", temp); Serial.printf("Humidity = %d %%\r\n", humidity); Serial.printf("Pressure = %.3f bar\r\n", pressure); Serial.printf("Wind speed = %.1f m/s\r\n", wind_speed); Serial.printf("Wind degree = %d°\r\n\r\n", wind_degree); display.setCursor(0, 24); display.printf("Temperature: %5.2f C\r\n", temp); display.printf("Humidity : %d %%\r\n", humidity); display.printf("Pressure : %.3fbar\r\n", pressure); display.printf("Wind speed : %.1f m/s\r\n", wind_speed); display.printf("Wind degree: %d", wind_degree); display.drawRect(109, 24, 3, 3, WHITE); // put degree symbol ( ° ) display.drawRect(97, 56, 3, 3, WHITE); display.display(); } http.end(); //Close connection } delay(60000); // wait 1 minute } |