#1 20-06-2021 21:13:06

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Трансляция сообщения из Telegram на RGB матрицу 64x32 P5.

Русские шрифты стырил тут. https://github.com/immortalserg/AdafruitGFXRusFonts
Универсальный Telegram Bot: https://github.com/witnessmenow/Univers … legram-Bot
Библиотека PxMatrix: https://github.com/2dom/PxMatrix

Не в сети

#2 20-06-2021 21:15:01

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Трансляция сообщения из Telegram на RGB матрицу 64x32 P5.

#include <Adafruit_GFX.h>
#include <FontsRus/TimesNRCyr10.h>
#include <FontsRus/TimesNRCyr6.h>
#include <FontsRus/TimesNRCyr7.h>
#include <FontsRus/TimesNRCyr8.h>
#include <FontsRus/Crystal8.h>
#include <FontsRus/Bat8.h>
#include <FontsRus/Cooper8.h>
#include <FontsRus/Cooper6.h>
#include <FontsRus/FreeSerif8.h>
#include <FontsRus/FreeSerif6.h>
#include "Arduino.h"
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#define WIFI_SSID "Имя сети"
#define WIFI_PASSWORD "Пароль"
// Telegram BOT Token (Get from Botfather)
#define BOT_TOKEN "Токен вашего бота"
// Wifi network station credentials
const unsigned long BOT_MTBS = 1000; // mean time between scan messages
unsigned long bot_lasttime; // last time messages' scan has been done
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
#include <PxMatrix.h>
// Pins for LED MATRIX ESP32
#include <Ticker.h>
Ticker display_ticker;
#define P_LAT 22
#define P_A 19
#define P_B 23
#define P_C 18
#define P_D 5
#define P_OE 16
#define matrix_width 32
#define matrix_height 64
uint8_t display_draw_time=20; //10-50 is usually fine
PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D);
void tempTask(void *pvParameters);
bool getTemperature();
void triggerGetTemp();
/** Task handle for the light value read task */
TaskHandle_t tempTaskHandle = NULL;
/** Ticker for temperature reading */
Ticker tempTicker;
/** Flag if task should run */
bool tasksEnabled = false;
void display_updater()
{
  display.display(display_draw_time);
}
void display_update_enable(bool is_enable)
{
 if (is_enable)
    display_ticker.attach(0.002, display_updater);
  else
    display_ticker.detach();
}
// Начало функции обработки кириллических символов
 String ru(String source) 
{
  int i,j,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length();  i = j = 0;
  while (i < k) {
    n = source[i]; i++;

    if (n >= 127) {
      switch (n) {
        case 208: {
          n = source[i]; i++;
          if (n == 129) { n = 192; break; } // перекодируем букву Ё
          break;
        }
        case 209: {
          n = source[i]; i++;
          if (n == 145) { n = 193; break; } // перекодируем букву ё
          break;
        }
      }
    }

    m[0] = n;target = target + String(m); 
    j++; 
  }
  return target;
}
// Конец функции обработки кириллических симоволов
void handleNewMessages(int numNewMessages)
{
  Serial.print("handleNewMessages ");
  Serial.println(numNewMessages); 
  String answer;
  for (int i = 0; i < numNewMessages; i++)
  {
    telegramMessage &msg = bot.messages[i];
    Serial.println("Received " + msg.text);
    display.clearDisplay();
display.setCursor(0,8); 
display.print(ru(msg.text));
  }
}
void bot_setup()
{
  const String commands = F("["      
                            "]");
  bot.setMyCommands(commands);}
void setup()
{
  Serial.begin(115200);
  Serial.println();
  // attempt to connect to Wifi network:
  Serial.print("Connecting to Wifi SSID ");
  display.begin(16);
 delay(500);
  display.setFastUpdate(true);
  display.clearDisplay();
  display.setTextColor(display.color565(0,100,0));
  //display.setFont(&TimesNRCyr6pt8b);
  //display.setFont(&Crystal8pt8b);
  //display.setFont(&Cooper6pt8b);
  display.setFont(&FreeSerif6pt8b);
  display.setTextSize(0); 
  display_update_enable(true);
  display.setCursor(0,7); 
  display.print(ru("Подключение к WiFi"));
  Serial.print(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org
  while (WiFi.status() != WL_CONNECTED)
  {
   display.setCursor(0,30); 
   display.print(".");
    Serial.print(".");
    delay(500);
  }
  Serial.print("\nWiFi connected. IP address: ");
  Serial.println(WiFi.localIP());

  Serial.print("Retrieving time: ");
  configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP
  time_t now = time(nullptr);
  while (now < 24 * 3600)
  {
    Serial.print(".");
    delay(100);
    now = time(nullptr);
  }
  Serial.println(now);
  bot_setup();
display.clearDisplay();
}
void loop()
{
  if (millis() - bot_lasttime > BOT_MTBS)
  {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    while (numNewMessages)
    {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }
    bot_lasttime = millis();
  }
}

Не в сети

#3 20-06-2021 21:21:04

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Трансляция сообщения из Telegram на RGB матрицу 64x32 P5.

1624198779148706032650410847060.jpg
16241990566275206059792513493694.jpg
16241991630082122678319353702367.jpg

Не в сети

#4 20-06-2021 21:27:21

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Трансляция сообщения из Telegram на RGB матрицу 64x32 P5.

Screenshot-2021-06-20-21-26-52-996-org-telegram-messenger.jpg

Не в сети

#5 20-06-2021 21:36:10

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Трансляция сообщения из Telegram на RGB матрицу 64x32 P5.

16241996068926527477662337906764.jpg

16241996615233149353457348263556.jpg
Процессор ESP32_DEVKItc_V4.
16241996960741233790238835083639.jpg
16241997808101654068528178081473.jpg

1624199820243538799100577689235.jpg

Не в сети

#6 20-06-2021 22:05:12

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Трансляция сообщения из Telegram на RGB матрицу 64x32 P5.

Сейчас подключил ESP к телефону, через точку доступа WiFi. Через Мегафон с хорошим приёмом, сообщения приходят мгновенно.
Проблем, что были с ESP8266 на дачном боте, совершенно нет. Видимо, вся проблема с дачным ботом, заключалась в тормознутости ESP8266.

Не в сети

#7 20-06-2021 23:58:56

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Трансляция сообщения из Telegram на RGB матрицу 64x32 P5.

Функцию обработки кириллических символов сам переработал.
Код моей функции (С).

// Начало функции обработки кириллических символов
 String ru(String source) 
{
  int i,j,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length();  i = j = 0;
  while (i < k) {
    n = source[i]; i++;

    if (n >= 127) {
      switch (n) {
        case 208: {
          n = source[i]; i++;
          if (n == 129) { n = 192; break; } // перекодируем букву Ё
          break;
        }
        case 209: {
          n = source[i]; i++;
          if (n == 145) { n = 193; break; } // перекодируем букву ё
          break;
        }
      }
    }

    m[0] = n;target = target + String(m); 
    j++; 
  }
  return target;
}
// Конец функции обработки кириллических символов

Код функции, которой раньше пользовался.

// Начало функции обработки кириллических символов
String utf8rus(String source)     // Функция для конвертации русских символов из кодировки CP1251 в UTF8
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
 
    if (n >= 0xBF){
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB7; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}
// Конец функции обработки кириллических символов.

К новым шрифтам FontsRus она не подходила.

Код функции в пакете FontsRus переводит текст в вид типа  char. Мне нужен был String.

#define maxString 100 // ограничиваем строку шириной экрана
char target[maxString + 1] = "";

char *utf8rus2(char *source)
{
  int i,j,k;
  unsigned char n;
  char m[2] = { '0', '\0' };
  strcpy(target, ""); k = strlen(source); i = j = 0;
  while (i < k) {
    n = source[i]; i++;

    if (n >= 127) {
      switch (n) {
        case 208: {
          n = source[i]; i++;
          if (n == 129) { n = 192; break; } // перекодируем букву Ё
          break;
        }
        case 209: {
          n = source[i]; i++;
          if (n == 145) { n = 193; break; } // перекодируем букву ё
          break;
        }
      }
    }

    m[0] = n; strcat(target, m);
    j++; if (j >= maxString) break;
  }
  return target;
}

Не в сети

Подвал раздела

Работает на FluxBB (перевод Laravel.ru)