INT 21h

Hi, I am Vladimir Smagin, SysAdmin, DevOps and barely good guy. Telegram Email / GIT / Микроблог / Thingiverse / GPG

ESP8266: Подключение I2C дисплея к инфраструктуре с помощью MQTT шины

№ 8424 В разделах: Программирование Электроника ESP8266 от August 23rd, 2017,

Дисплей подключается с помощью специального I2C адаптера благодаря чему можно использовать даже ESP-01. Я уже делал такое ранее в проекте метеостанции, которая получает данные из интернета. Сейчас все также за исключением того, что данные получаются прямо из MQTT шины.

Чтобы дисплеем можно было управлять более точно и без всякой самодеятельности на callback функцию вешаются дополнительные подписки на 4 команды:

  if (String(pub.topic()) == "/device/" + DeviceName + "/display/1/set/x")
  {
    colNum = payload.toInt();
    lcd.setCursor(colNum, rowNum);
  }

  if (String(pub.topic()) == "/device/" + DeviceName + "/display/1/set/y")
  {
    rowNum = payload.toInt();
    lcd.setCursor(colNum, rowNum);
  }

  if (String(pub.topic()) == "/device/" + DeviceName + "/display/1/set/cmd")
  {
    cmdRecv = payload.toInt();
    cmdFlag = 1;
  }

  if (String(pub.topic()) == "/device/" + DeviceName + "/display/1/set/text")
  {
    textRecv = payload.c_str();
    drawFlag = 1;
  }

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

    if (cmdFlag == 1 && client.connected()) {
      Serial.println("Command: " + cmdRecv);
      if (cmdRecv == 0) lcd.clear();              //очистить экран
      if (cmdRecv == 10) lineClear(0);        //очистить строку 0
      if (cmdRecv == 11) lineClear(1);
      if (cmdRecv == 12) lineClear(2);
      if (cmdRecv == 13) lineClear(3);
      if (cmdRecv == 20) lcd.noBlink();
      if (cmdRecv == 21) lcd.blink();
      if (cmdRecv == 30) lcd.noBacklight();
      if (cmdRecv == 31) lcd.backlight();
      //client.publish("/device/" + DeviceName + "/dsplay/1/data/cmd", String(cmdRecv));
      cmdFlag = 0;
    }
    if (drawFlag == 1 && client.connected()) {
      Serial.println("Text: x=" + String(colNum) + " y=" + String(rowNum) + " value=" + textRecv);
      lcd.setCursor(colNum, rowNum);
      lcd.print(textRecv);
      //client.publish("/device/" + DeviceName + "/dsplay/1/data/text", textRecv);
      drawFlag = 0;
    }

Создадим скрипты для засыла базовых команд:

display_send_cmd

#!/bin/bash
addr=$1
cmd=$2
mosquitto_pub -h m21.cloudmqtt.com -p 24234 -u l0g1n -P passw0rd1 -t "/device/$addr/display/1/set/cmd" -m "$cmd"

display_send_text

#!/bin/bash
addr=$1
x=$2 #установка координат курсора
y=$3
data=$4 #собственно, текст
mosquitto_pub -h m21.cloudmqtt.com -p 24234 -u l0g1n -P passw0rd1 -t "/device/$addr/display/1/set/x" -m "$x"
mosquitto_pub -h m21.cloudmqtt.com -p 24234 -u l0g1n -P passw0rd1 -t "/device/$addr/display/1/set/y" -m "$y"
mosquitto_pub -h m21.cloudmqtt.com -p 24234 -u l0g1n -P passw0rd1 -t "/device/$addr/display/1/set/text" -m "$data"

Теперь для вывода достаточно послать команды:

addr="A0:20:A6:13:60:0D"

./display_send_cmd "$addr" 0
./display_send_text "$addr" 0 0 "$(date +'%d-%m-%Y')"
./display_send_text "$addr" 0 1 "$(date +'%H:%M:%S')"
./display_send_text "$addr" 13 1 "LOL"

На фотографии я прочитал данные из шины от термодатчиков и отправил их на дисплей

А вот этот скрипт обнаружит и напишет адрес первого попавшегося дисплея. Вы можете доработать его для выжидания определенного количества времени, т.к. обычно устройства посылают hello сообщения, где указан их тип. Таким образом можно будет получить список всех подключенных дисплеев к шине.

#!/bin/bash
answer=""
while [ -z "$answer" ]
do
    answer=$(mosquitto_sub -h m21.cloudmqtt.com -p 24234 -u l0g1n -P passw0rd1 -t "/hello/+" -C 1 | grep "display")
done
addr=$(echo $answer|awk 'BEGIN{FS="/"} {print $3}'|awk '{print $1}')
echo $addr

Ссылки по теме:

Нет комментариев »

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Микроблог перейти

# 2019-06-06 09:47:42

Подборка материалов по Go gist.github.com/egorsmkv/9df2a

# 2019-06-06 09:47:41

Modules для Terraform modules.tf

# 2019-06-06 09:47:38

Как прикрутить oauth2 авторизацию к сайтам, где авторизация не была предусмотрена совсем akomljen.com/protect-kubernete


© Vladimir Smagin, 2005-2019. Копирование материалов без разрешения запрещено. GPG DA4CD0F5E222EA727D6A40C413BCE12E5618F071 *
Яндекс.Метрика

Fortune cookie: Hear about... the basketball player who was so tall that his girlfriend had to go up on him?