Идея позаимствована из проекта ESP8266 Weather Display.
Я решил довести ее до ума.
Были поставлены следующие задачи:
- Обновить код, связанный с использованием новой версии библиотеки ArduinoJson.h.
- Переписать код, использовав вместо функции delay() функцию millis(). Понятно, что используя delay для задания паузы между сменой информации на дисплее, невозможно реализовать управление кнопками;
- Сделать загрузку скетчей по Wifi;
- Уйти от громоздкой Wemos D1 R2 на Wemos D1 mini;
- По возможности русифицировать дисплей;
- Использовать готовый корпус с отверстиями под кнопки для устройств на основе LCD1602;
- Использовать стандартные кнопки 6×6, распаянные на макетной плате. Добавить кнопки управления подсветкой, кнопку-карусель для смены отображаемых данных и кнопку форсированного обновления данных с сервера.
Были использованы следующие компоненты:
- Корпус из ABS-пластика с набором крышек на кнопки;
- Нейлоновые стойки 6+5 мм папа M3 черные, 4 шт;
- Нейлоновые гайки M3 черные, 4 шт;
- Нейлоновые стойки 6+5 мм папа M2 белые, 3 шт;
- Нейлоновая стойка 6 мм мама белая, 1 шт;
- Нейлоновая стойка 8 мм мама белая, 1 шт;
- Нейлоновые стойки 10мм мама бел, 2 шт;
- LCD 1602(I2C), желтый;
- Wemos d1 mini;
- Wemos d1 DC-Power shield;
- Плата макетная распаечная 3×7;
- Кнопки 6×6 высотой 7 мм, 3шт;
- Провода Dupont 10см мама-мама, 4 шт;
- Провода 24 AWG черные и красные;
- Провода силиконовые 20 AWG синие и белые;
- Резисторы 5 кОм – 2шт, 10 кОм – 1 шт (какие попались под руку);
- Адаптер питания 9V 1A;
- Клей эпоксидный двухкомпонентный.
У использованного корпуса есть несколько достоинств. Во-первых в него кроме дисплея прекрасно помещается по высоте стандартная распаечная макетная плата 3×7, с установленными на ней с двух сторон компонентами. Во-вторых на двух торцах у него есть прямоугольные отверстия для охлаждения. Оказалось, что перемычки между этими отверстиями прекрасно спиливаются мини-надфилями 3 и 4 мм. Если спилить пару перемычек и выпилить в корпусе небольшое прямоугольное отверстие, то в образовавшееся отверстие сложной геометрии прекрасно заходит разъем питания DC-005. Также сзади у данного корпуса есть большое квадратное отверстие, которое, по-видимому, предполагалось для установки батареек. Через него удобно что-то подключать внутри, не разбирая корпус. Впоследствии его можно просто закрыть стеклом или пластиком.
Ход сборки:
Сначала был сделан прототип на макетной плате.
Затем доработан корпус напильником.
После этого распаяны основные компоненты и осуществлена примерка. Ноги специально были загнуты, чтобы разъемные соединения влезли по высоте. Пару нейлоновых стоек пришлось подпиливать, чтобы все кнопки оказались на одной высоте.
В итоге лицевая сторона платы с кнопками, резисторами и проводами выглядит следующим образом:
В итоге внутренности устройства выглядят так:
В собранном виде устройство выглядит так:
Преодоление сложностей:
- Я долго не мог понять, почему не работают кнопки, хотя мультиметр четко показывал 0 при отжатых кнопках и 4,6 – 5,0 В при нажатии (в зависимости от питания). Оказалось, что в устройствах Wemos/Lolin необходимо в качестве номеров пинов в скетче указывать номера GPIO. Например, D5 – это GPIO14. Значит, это 14-ый пин.
const int buttonPin = 14; - Чтобы показать погоду необходимо условие:
currentMillis — previousMillis == weatherTime
Строгое соответствие, потому что надо выполнить один раз.
Чтобы сделать запрос на сервер, необходимо условие:
currentMillis — previousMillis >= getDataTime
Нестрогое соответствие, потому что выполняется до тех пор, пока не выставлен флаг «данные получены».
На самом деле это неочевидно, и, чтобы это понять, потребовалось довольно много времени. - Также пришлось помучиться с ответом сервера:
String weather = root["weather"][0]["main"];
String description = root["weather"][0]["description"];
Ноль был совершенно неочевиден. Оказывается, в Москве две метеостанции, и вторая из них работает далеко не всегда (для получения данных от нее надо указать [1], если она активна).
Репозиторий с кодом и библиотеками находится здесь.