Pull to refresh
1821.07
Timeweb Cloud
То самое облако

Lavritech: теперь с дисплеем и платой управления (наконец-то дождались)

Level of difficultyMedium
Reading time7 min
Views8.9K


В своё время, в беседе с разработчиками Lavritech, я высказал пожелание оснастить их контроллеры дисплеем, платой управления и индикации — у меня не вызывает сомнений, что это простое дополнение значительно расширяет возможности и удобство пользования контроллером.

Но, как говорится, быстро сказка сказывается, да не быстро дело делается — прошло около полутора лет — и вот на моём столе новая версия контроллера Lavritech со встроенным разъёмом для платы расширения и с самой платой дисплея и управления.

Вообще, — красота и именно то, что я (все мы) так долго ждали. Давайте посмотрим как это устроено и как это работает на практике.

Новая версия контроллера


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



Поскольку аппаратная основа контроллеров Lavritech полностью модульная, то в контексте какой-то конкретной модели имеет смысл говорить только о версии материнской платы — набор функциональных модулей в контроллере может быть установлен любой, всё зависит от пожеланий покупателя и требований его проекта.

В моём случае в контроллере установлены модуль интерфейса RS485 и модуль для подключения 1-Wire сети датчиков температуры DS18B20 (LTE2-RS485-SM и LTE2-DIO2-IO-H, соответственно).

Плюс Ethernet модуль и модуль беспроводной LoRa связи. Ну и центральный модуль ESP32, естественно. В общем, получается достаточно функциональная «машинка» для выполнения IoT проектов. Изюминка в данном случае заключается в том, что в любой момент можно изменить конфигурацию и функционал контроллера просто заменив один интерфейсный модуль на другой.

Кстати, на фото можно также видеть, что контроллер укомплектован модулем DC-DC преобразователя для питания от напряжения 8-30 вольт.



Плата управления


Плата управления (она же «дисплейная плата» или «дисплейный модуль») устанавливается в верхнюю крышку корпуса контроллера и достаточно просто и надёжно крепится в ней на защёлках. С материнской платой дисплейный модуль соединяется, я бы сказал, элегантным шлейфиком. Причём шлейфик именно такой, какой нужен (редкий случай) — не длинный и не короткий и с миниатюрным, но легко соединяемым и разъединяемым разъёмом.



Материнская плата ревизии 1.11 имеет соответствующий разъём для подключения управляющей платы. Разумеется, если вам нужен дисплейный модуль, его можно установить в контроллер, а если ваш проект не требует дисплея и управления с передней панели контроллера, то его можно не устанавливать — сделано всё идеально с точки зрения комплектования контроллеров под различные проекты.


Сам дисплейный разъём является модификацией и расширением т. н. «EUHP» разъёма экосистемы Lavritech (подробнее об архитектуре контроллеров Lavritech см. в предыдущих статьях цикла). Он содержит контакты SPI и I2C интерфейсов, выводы GPIO и питания 3,3 и 5 В. Распиновка этого разъёма может отличаться в зависимости от наличия или отсутствия на плате модулей Ethernet (1) и LoRa (2). Подробнее об устройстве дисплейного разъёма см. в документации производителя.


Схемотехника модуля


Вообще, по задумке разработчиков Lavritech, управляющая плата (управляющие платы) может иметь различные модификации с различным функционалом: на ней могут быть установлены различные типы дисплеев, управляющие элементы (кнопки, джойстик и т. п.), различное количество индикаторных светодиодов и т. п. Плюс наличие интерфейсов I2C и SPI позволяет выносить на управляющую плату дополнительные компоненты, например датчики и т. п.



Благодаря такой архитектуре возможно также создание заказных управляющих панелей под конкретные проекты или для OEM заказчиков. DIY энтузиастам это позволяет не создавать весь контроллер с нуля, а разработать только кастомную переднюю панель «контроллера своей мечты», взяв за основу своего решения материнскую плату Lavritech.

В моём конкретном случае передняя панель имеет официальное название «LTEU-DISPxxxx» и содержит I2C дисплей SH1106, управляемый напрямую по шине I2C, четыре кнопки и четыре светодиода, управляемых через расширитель портов PCF8574AT (находится на плате под дисплеем).



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

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

Передняя панель


В базовом варианте контроллер поставляется с прозрачной передней панелью в модном стиле «Hacker Design», то есть через эту панель видна вся электронная начинка контроллера. Решение спорное, но что-то в этом определённо есть (мне лично нравится).



Одновременно тут открывается широкое поле для экспериментов с дизайном — можно сделать непрозрачную крышку, сделать внутреннее матирование прозрачной панели, изменить цвет и т. д. Ниже представлено фото подобного контроллера, но с красным прозрачным стеклом и кастомной платой управления со встроенными датчиками.



Готовые прошивки


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

В базовом варианте контроллеры Lavritech рассчитаны на работу с собственной фирменной прошивкой (платной), являющейся адаптацией и развитием популярной прошивки WiFi-IoT. То есть многочисленные фанаты WiFi-IoT будут довольны — здесь не нужно ничего программировать, нужно только грамотно расставить галочки в веб-интерфейсе.



Но мне лично вариант с готовыми прошивками совершенно не интересен — если вы умеете программировать вообще и программировать ESP32 в частности, то использование готовых решений типа «байт взял — байт передал» выглядит как забивание гвоздей микроскопом.

Поэтому не будем задерживаться и перейдём к самому интересному — самостоятельному программированию контроллера Lavritech с дисплейным модулем.

Программирование


Самостоятельное программирование позволяет реализовать любые свои хотелки и капризы, но требует определённой квалификации и трудозатрат на написание кода (и ещё в большей степени — воображения и творческого подхода к делу).

Начнём мы с самого очевидного — программирования дисплея и вывода на него тестовой информации. Для этого воспользуемся Arduino библиотекой для SH1106 и дополнительной библиотекой Adafruit-GFX-Library.

/*
  Lavritech SH1106 display test
  (128x64, I2C, SH110X)
*/

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>

#define I2C_Address 0x3c

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


void setup() {
  Serial.begin(115200);
  Serial.println(F("Start SH1106 test..."));
  
  Wire.begin(33, 32);
  delay(250);
  
  display.begin(I2C_Address, true);
  display.clearDisplay();

  display.setTextColor(SH110X_WHITE);
  display.setCursor(0, 0);
  display.setTextSize(2);
  display.setTextColor(SH110X_WHITE); display.println("Lavritech");
  
  display.setTextSize(1);
  display.println();
  display.setTextColor(SH110X_BLACK, SH110X_WHITE); display.println("SH1106");
  display.setTextColor(SH110X_WHITE, SH110X_BLACK); display.println("Display Test");
  display.display();
  display.clearDisplay();
}

void loop() {

}

Здесь достаточно взять стандартный код примера и задать корректные значения номеров GPIO для интерфейса I2C (SDA, SCL) на контроллерах Lavritech.

  Wire.begin(33, 32);

Результат в точности соответствует ожиданиям — вывод на дисплей контроллера в полной нашей власти: мы можем выводить любую информацию и тогда, когда нам нужно по условиям проекта.



Управление светодиодами


На дисплейной плате (кроме собственно дисплея) имеются четыре свободно программируемых светодиода, подключённых через расширитель портов PCF8574AT (выводы P0, P1, P2 и P3). Для управления светодиодами воспользуемся библиотекой PCF8574_library.

/*
  Lavritech Display module LEDS test
*/

#include "Arduino.h"
#include "PCF8574.h"

#define I2C_LEDS_ADR 0x38

PCF8574 pcf(I2C_LEDS_ADR, 33, 32);

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println(F("Start Display module LEDS test..."));

  pcf.pinMode(P0, OUTPUT);
  pcf.pinMode(P1, OUTPUT);
  pcf.pinMode(P2, OUTPUT);
  pcf.pinMode(P3, OUTPUT);

  Serial.print("Init PCF8574... ");
  if (pcf.begin()){Serial.println(F("Ok"));}
             else {Serial.println(F("Error"));}
}

void action_on(byte n) {
  pcf.digitalWrite(n, LOW);
  Serial.print(F("LED #")); Serial.print(n); Serial.println(F(" ON"));
}

void action_off(byte n) {
  pcf.digitalWrite(n, HIGH);
  Serial.print(F("LED #")); Serial.print(n); Serial.println(F(" OFF"));
}

void loop() {
  action_on(P0); action_on(P1); action_on(P2); action_on(P3);
  delay(8000);
  action_off(P0); action_off(P1); action_off(P2); action_off(P3);
  delay(2000);
}

На фото обратной стороны платы (см. выше) есть таблица установки значений I2C адреса для микросхемы PCF8574AT (JP1, JP2, JP3). Поскольку ни одна перемычка не замкнута, то адрес микросхемы в нашем случае — 0x38.

Соответственно, задаём адрес расширителя портов и номера GPIO I2C интерфейса контроллера:

#define I2C_LEDS_ADR 0x38

PCF8574 pcf(I2C_LEDS_ADR, 33, 32);

И получаем результат, превосходящий все ожидания: загораются совершенно неземным светом четыре янтарных светодиода (красота). А вообще, можно сделать светодиоды с разным цветом свечения для обозначения типа происходящих событий — ошибка, штатная работа, включение беспроводной или Ethernet связи и т. д. А также можно добавить ещё ряд светодиодов для индикации состояния входов/выходов.



Отлично, осталось только разобраться с управлением кнопками.

Работа с кнопками


Работа с кнопками не намного отличается от управления светодиодами — используется всё та же микросхема PCF8574AT, но только с выводами P4, P5, P6 и P7.

Создаём тестовый скетч:

/*
  Lavritech Display module Keys test
*/

#include "Arduino.h"
#include "PCF8574.h"

#define I2C_DIGITAL_ADR 0x38

PCF8574 pcf(I2C_DIGITAL_ADR, 33, 32);

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println(F("Start Display module Keys test..."));

  pcf.pinMode(P4, INPUT);
  pcf.pinMode(P5, INPUT);
  pcf.pinMode(P6, INPUT);
  pcf.pinMode(P7, INPUT);

  Serial.print("Init PCF8574... ");
  if (pcf.begin()){Serial.println(F("Ok"));}
             else {Serial.println(F("Error"));}

  delay(20);
}

void loop() {
  if (pcf.digitalRead(P7) == LOW) Serial.println("Key1 pressed");
  if (pcf.digitalRead(P6) == LOW) Serial.println("Key2 pressed");
  if (pcf.digitalRead(P5) == LOW) Serial.println("Key3 pressed");
  if (pcf.digitalRead(P4) == LOW) Serial.println("Key4 pressed");
  delay(300);
}

И наблюдаем в Serial вывод данных о нажатых на передней панели кнопках (почему-то порядок номеров кнопок инвертирован — первой (верхней) кнопке соответствует последний вывод P7.



Заключение


Вот, собственно, и всё: имеем отличный модульный контроллер с дисплейной передней панелью, кнопками управления и свободно программируемыми светодиодами для индикации любых статусов вашей IoT системы. Причём можем самостоятельно (как угодно) программировать этот контроллер или воспользоваться готовой прошивкой «прямо из коробки».

Более подробную информацию о контроллерах Lavritech и их архитектуре можно почерпнуть из предыдущих статей цикла:

1. Вводная статья
2. Архитектура контроллеров Lavritech
3. Программирование внутренних модулей
4. Программирование внешних блоков на DIN-рейку
5. Работа с RS485
6. Полная версия контроллера L1 Max

Tags:
Hubs:
Total votes 18: ↑18 and ↓0+18
Comments7

Articles

Information

Website
timeweb.cloud
Registered
Founded
Employees
201–500 employees
Location
Россия
Representative
Timeweb Cloud