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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.


В своё время, в беседе с разработчиками 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

Источник: https://habr.com/ru/companies/timeweb/articles/794458/


Интересные статьи

Интересные статьи

Все поверили в теорию управления. Мы не задумываясь задаем вопросы в научно-образовательной среде друг-другу с точки зрения ее положений. Судим о научных работах. Но почему же Теория не спешит дружить...
Большинство разработчиков редко задумываются о том, как реализовано управление памятью в JavaScript. Движок обычно делает все за программиста, так что последнему нет смысла размышлять...
Модульная техника всем хороша, при условии качественной сборки, конечно. Преимуществ много, основное: нет нужды менять свое устройство раз в 2-3 года. Не устраивает какой-то блок — апгр...
Публикую первую главу лекций по теории автоматического управления, после которых ваша жизнь уже никогда не будет прежней. Лекции по курсу «Управление Техническими Системами», читает...
Не любите Java? Да вы не умеете ее готовить! Mani Sarkar предлагает нам познакомиться с инструментом Valohai, позволяющим проводить исследования модели на Java.