HandMade32.ru - сделай своими руками

Клиент для openweathermap.org на основе Wemos d1 mini

Идея позаимствована из проекта ESP8266 Weather Display.

Я решил довести ее до ума.
Были поставлены следующие задачи:

  1. Обновить код, связанный с использованием новой версии библиотеки ArduinoJson.h.
  2. Переписать код, использовав вместо функции delay() функцию millis(). Понятно, что используя delay для задания паузы между сменой информации на дисплее, невозможно реализовать управление кнопками;
  3. Сделать загрузку скетчей по Wifi;
  4. Уйти от громоздкой Wemos D1 R2 на Wemos D1 mini;
  5. По возможности русифицировать дисплей;
  6. Использовать готовый корпус с отверстиями под кнопки для устройств на основе LCD1602;
  7. Использовать стандартные кнопки 6×6, распаянные на макетной плате. Добавить кнопки управления подсветкой, кнопку-карусель для смены отображаемых данных и кнопку форсированного обновления данных с сервера.

Были использованы следующие компоненты:

  1. Корпус из ABS-пластика с набором крышек на кнопки;
  2. Нейлоновые стойки 6+5 мм папа M3 черные, 4 шт;
  3. Нейлоновые гайки M3 черные, 4 шт;
  4. Нейлоновые стойки 6+5 мм папа M2 белые, 3 шт;
  5. Нейлоновая стойка 6 мм мама белая, 1 шт;
  6. Нейлоновая стойка 8 мм мама белая, 1 шт;
  7. Нейлоновые стойки 10мм мама бел, 2 шт;
  8. LCD 1602(I2C), желтый;
  9. Wemos d1 mini;
  10. Wemos d1 DC-Power shield;
  11. Плата макетная распаечная 3×7;
  12. Кнопки 6×6 высотой 7 мм, 3шт;
  13. Провода Dupont 10см мама-мама, 4 шт;
  14. Провода 24 AWG черные и красные;
  15. Провода силиконовые 20 AWG синие и белые;
  16. Резисторы 5 кОм – 2шт, 10 кОм – 1 шт (какие попались под руку);
  17. Адаптер питания 9V 1A;
  18. Клей эпоксидный двухкомпонентный.

У использованного корпуса есть несколько достоинств. Во-первых в него кроме дисплея прекрасно помещается по высоте стандартная распаечная макетная плата 3×7, с установленными на ней с двух сторон компонентами. Во-вторых на двух торцах у него есть прямоугольные отверстия для охлаждения. Оказалось, что перемычки между этими отверстиями прекрасно спиливаются мини-надфилями 3 и 4 мм. Если спилить пару перемычек и выпилить в корпусе небольшое прямоугольное отверстие, то в образовавшееся отверстие сложной геометрии прекрасно заходит разъем питания DC-005. Также сзади у данного корпуса есть большое квадратное отверстие, которое, по-видимому, предполагалось для установки батареек. Через него удобно что-то подключать внутри, не разбирая корпус. Впоследствии его можно просто закрыть стеклом или пластиком.

Ход сборки:
Сначала был сделан прототип на макетной плате.
Клиент для openweathermap.org на основе Wemos d1 miniЗатем доработан корпус напильником.
Клиент для openweathermap.org на основе Wemos d1 miniПосле этого распаяны основные компоненты и осуществлена примерка. Ноги специально были загнуты, чтобы разъемные соединения влезли по высоте. Пару нейлоновых стоек пришлось подпиливать, чтобы все кнопки оказались на одной высоте.
Клиент для openweathermap.org на основе Wemos d1 miniКлиент для openweathermap.org на основе Wemos d1 miniКлиент для openweathermap.org на основе Wemos d1 miniКлиент для openweathermap.org на основе Wemos d1 miniВ итоге лицевая сторона платы с кнопками, резисторами и проводами выглядит следующим образом:
Клиент для openweathermap.org на основе Wemos d1 miniВ итоге внутренности устройства выглядят так:
Клиент для openweathermap.org на основе Wemos d1 miniВ собранном виде устройство выглядит так:
Клиент для openweathermap.org на основе Wemos d1 miniКлиент для openweathermap.org на основе Wemos d1 miniКлиент для openweathermap.org на основе Wemos d1 miniКлиент для openweathermap.org на основе Wemos d1 mini
Преодоление сложностей:

  1. Я долго не мог понять, почему не работают кнопки, хотя мультиметр четко показывал 0 при отжатых кнопках и 4,6 – 5,0 В при нажатии (в зависимости от питания). Оказалось, что в устройствах Wemos/Lolin необходимо в качестве номеров пинов в скетче указывать номера GPIO. Например, D5 – это GPIO14. Значит, это 14-ый пин.
    const int buttonPin = 14;
  2. Чтобы показать погоду необходимо условие:
    currentMillis — previousMillis == weatherTime
    Строгое соответствие, потому что надо выполнить один раз.
    Чтобы сделать запрос на сервер, необходимо условие:
    currentMillis — previousMillis >= getDataTime
    Нестрогое соответствие, потому что выполняется до тех пор, пока не выставлен флаг «данные получены».
    На самом деле это неочевидно, и, чтобы это понять, потребовалось довольно много времени.
  3. Также пришлось помучиться с ответом сервера:
    String weather = root["weather"][0]["main"];
    String description = root["weather"][0]["description"];
    Ноль был совершенно неочевиден. Оказывается, в Москве две метеостанции, и вторая из них работает далеко не всегда (для получения данных от нее надо указать [1], если она активна).

Репозиторий с кодом и библиотеками находится здесь.

administrator

Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного. - Альберт Эйнштейн

Follow us

Don't be shy, get in touch. We love meeting interesting people and making new friends.