Найти в Дзене
Project A.L.T.

Простая метеостанция на ESP8266

Оглавление

Представляю вашему вниманию проект простой метеостанции на ESP8266. Погодные данные она получает от общеизвестного сервиса OpenWeatherMap. Данный проект очень прост и дешев изготовлении, требует минимум компонентов и легко повторяем.

Необходимые компоненты

Схема соединений

Соединяем все компоненты по схеме

-2

Получение ключа API OpenWeatherMap

Зарегистрируйтесь на сайте https://openweathermap.org, После подтверждения регистрации, авторизуйтесь на сайте. Затем в правом верхнем углу кликните мышкой по имени своего профиля. Должно открыться выпадающее меню.

-3

Перейдите по ссылке My API keys

Откроется новое окно

-4

Введите в поле API key name произвольное название вашего ключа API и нажмите кнопку Generate. В левой части окна появится ваш ключ. Скопируйте и сохраните его. Он пригодится вам в будущем

Прошивка устройства

После сборки устройства по схеме переходим к прошивке ESP8266. Для начала вам необходимо установить в Arduino IDE ядро ESP8266 версии 3.0 и выше. Как это сделать можно узнать в статье Ядро ESP8266 для ArduinoIDE. Установка и обзор библиотек.

Также вам необходимо скачать и установить дополнительные библиотеки, необходимые для работы программы.

Установка дополнительных библиотек

Для работы устройства нам необходимо скачать и установить в Arduino IDE ряд дополнительных библиотек. Таких как:

  • Adafruit_GFX - 1.1.13 и выше
  • Adafruit_ST7735 - 1.9.3 и выше
  • Adafruit_ST7789 - 1.9.3 и выше
  • UnixTime - 1.1.0 и выше
  • ArduinoJson - 6.1 и выше
  • SPI.h - входит в стандартную поставку Arduino IDE

Следующие библиотеки будут установлены автоматически вместе с ядром ESP8266 для Arduino IDE.

  • ESP8266WiFi
  • ESP8266HTTPClient
  • WiFiClient

Сверьтесь со списком и установите недостающие библиотеки или обновите имеющиеся через Менеджер библиотек Arduino IDE (Инструменты > Управлять библиотеками...)

Код программы

После установки всех необходимых библиотек, откройте файл(скачать) в Arduino IDE

Настройки

Перед компиляцией и прошивкой скетча в ESP8266 необходимо провести некоторые настройки

//Настройки WiFi
const char* ssid = "ssid";
const char* password = "pass";

//настройки Open Weather Map const String api_1 = "http://api.openweathermap.org/data/2.5/weather?q=";
const String qLocation = "Gubkin,ru"; //ваш город const String api_2 = "&units=metric"; //температура в градусах цельсия const String api_3 = "&APPID=";
const String api_key = "xxxxxxxxxxxxxxxxxxxxxxx"; //ваш api ключ

ssid и pass - учетные данные для подключения к вашей сети Wifi. Замените на свои

const String qLocation = "Gubkin,ru"; - укажите ваш город и регион через запятую. Строго по английски. Например "Moskow,ru" или "Minsk,by"

const String api_key = "xxxxxxxxxxxxxxxxxxxxxxx"; //ваш api ключ - здесь вам необходимо указать ваш API ключ OpenWeatherMap, полученный ранее

На этом настройки программы завершены и можно компилировать и прошивать ее в ESP8266

Разбор кода программы

Напоследок, хотелось бы дать несколько комментариев по некоторым участкам кода программы, если вы вдруг захотите модифицировать ее под себя и разработать на ее основе что-то более глобальное.

Сначала остановимся на участках кода такого вида

const unsigned char pressure[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x1f, 0x38, 0x38, 0x1f, 0x38, 0x78, 0x0f, 0x38,
0x70, 0x00, 0x38, 0x70, 0x00, 0x38, 0x70, 0x00, 0x38, 0x70, 0xff, 0x38, 0x70, 0xff, 0x38, 0x38,
0x7f, 0x1c, 0x38, 0x00, 0x1c, 0x1c, 0x00, 0x0e, 0x1c, 0x00, 0x0e, 0x0e, 0x1f, 0x0e, 0x0e, 0x1f,
0x0e, 0x0e, 0x0f, 0x0e, 0x0e, 0x00, 0x0e, 0x0e, 0x00, 0x3e, 0x7e, 0x00, 0x3f, 0x3e, 0x1f, 0x1f,
0x3f, 0x1f, 0x1e, 0x1c, 0x0f, 0x08, 0x10, 0x00 };

Это не что иное как картинки, конвертированные в массив строк. Это позволяет экономить ресурсы системы и благоприятно сказывается на скорости работы и отрисовки изображений. Каждый элемент массива - это отдельный пиксель. Его содержимое - HEX значение цвета пикселя. Перевести картинки с в этот формат можно с помощью
онлайн утилиты

Далее хотелось бы остановится, на этом небольшом, но важном участке кода

unsigned long lastTime = 0;
unsigned long timerDelay = 30000;

Здесь timerDelay - это интервал обновления данных о погоде в миллисекундах. Бесплатный тарифный план OpenWeatherMap позволяет не более 60 обращений к APi за минуту с одного аккаунта. При превышении этого числа аккаунт пользователя может быть забанен. Так что внимательно следим за этим параметром и интервал ставим как минимум 30 секунд или еще выше если быстрое обновление данных о погоде не критично.

Далее идет разбор Json файла и запись значений из него в локальные переменные

float coord_lon = doc["coord"]["lon"]; // 37.5458 float coord_lat = doc["coord"]["lat"]; // 51.2817
JsonObject weather_0 = doc["weather"][0];
int weather_0_id = weather_0["id"]; // 801 const char* weather_0_main = weather_0["main"]; // "Clouds" const char* weather_0_description = weather_0["description"]; // "few clouds" const char* weather_0_icon = weather_0["icon"]; // "02d"
const char* base = doc["base"]; // "stations"
JsonObject main = doc["main"];
int main_temp = main["temp"]; // -8.9 int main_feels_like = main["feels_like"]; // -15.9 int main_temp_min = main["temp_min"]; // -8.9 int main_temp_max = main["temp_max"]; // -8.9 int main_pressure = main["pressure"]; // 1036 int main_humidity = main["humidity"];
int main_pressure_mm = main_pressure/1.333;
int main_sea_level = main["sea_level"]; // 1036 int main_grnd_level = main["grnd_level"]; // 1014
int visibility = doc["visibility"]; // 10000
JsonObject wind = doc["wind"];
float wind_speed = wind["speed"]; // 4.98 int wind_deg = wind["deg"]; // 47 float wind_gust = wind["gust"]; // 8.75
int clouds_all = doc["clouds"]["all"]; // 20
long dt = doc["dt"]; // 1675757728
JsonObject sys = doc["sys"];
const char* sys_country = sys["country"]; // "RU" long sys_sunrise = sys["sunrise"]; // 1675745921 long sys_sunset = sys["sunset"]; // 1675780153
int timezone = doc["timezone"]; // 10800 timezone=timezone/360;
UnixTime stamp(timezone);
long id = doc["id"]; // 558146 const char* name = doc["name"]; // "Gubkin" int cod = doc["cod"]; // 200

В проекте практически все они отображаются на экране, но если вам надо что-нибудь экзотичное, типа отображения высоты над уровнем моря, то можете найти соответствующую переменную и вставить её в вывод программы

Это всё, о чем я хотел написать и напоследок прилагаю фото прототипа устройства.

Фото устройства

Собирал проект на макетной плате, так что корпуса для него пока нет. Но из-за небольших размеров - это не очень большая проблема. Я, думаю, подходящая коробочка найдется в хозяйстве у каждого.

-5

Эта статья, а также полный текст программы на сайте https://projectalt.ru