#1 09-02-2020 22:00:58

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

VGA выход на монитор для ESP32.

Использовал библиотеку FabGL.
https://github.com/fdivitto/FabGL
http://www.fabglib.org/
Сегодня, смог сделать программу выводящую RGB картинку 720/400(с частотой 85 Гц) на стандартный VGA порт, которая получает реальное время с сервера точного времени и без глюков выводит данные на VGA монитор. Только, программировать сложно, когда у тебя постоянно в обработке такая хрень времязависимая как видеоизображение. То тайминги видео рвутся, то прерывания плывут. Всего 5 портов нужно от ESP32, на формирование VGA сигнала(RGB+ВЕРТИКАЛЬНАЯ РАЗВЁРТКА+ГОРИЗОНТАЛЬНАЯ РАЗВЁРТКА). На Авито, куча мониторов LCD 17" по 500 руб(не выбрасывайте древний монитор!). В стационарном виде, сильно лучше этих прикручиваемых к Ардуино мониторчиков использовать нормальный телевИзор smile

Не в сети

#2 09-02-2020 22:15:34

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

Re: VGA выход на монитор для ESP32.

На фото, прототип работающего устройства, на базе Heltec Wifi 32 LoRa с выходом VGA. Других свободных ESP32 у меня нет. Эта конкретная сборка, вообще адский вариант. На большей части портов висят OLED встроенный дисплей + передатчик дальней радиосвязи LoRA на 433МГц.
15812611255228820740896296999249.jpg

158126117064077226163029843333.jpg

15812612454422666563591799309088.jpg

Не в сети

#3 09-02-2020 22:28:19

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

Re: VGA выход на монитор для ESP32.

На фото виден герметичный датчик DS18B20(висит на  GPIO 22). В серийный порт данные с датчика идут нормально, на VGA монитор пока вывести не могу. Мне всю бошку уже сломали преобразования типов данных. Встроенный дисплей, тоже пока не могу запустить совместно с VGA выходом.

Не в сети

#4 09-02-2020 22:40:26

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

Re: VGA выход на монитор для ESP32.

До того, сделал видеовыход VGA для Arduino Uno и ESP8266. Был напрасный(мартышкин) труд. Кроме вывода VGA сигнала, эти микропроцессоры почти больше не на что не способны. И вот только ESP32, уже обладает нормальной вычислительной способностью, чтоб ещё держать WiFi сеть и нечто с датчиков считывать(окромя формирования VGA сигнала). 240 МГц и оперативки побОле однако...

Не в сети

#5 10-02-2020 10:14:33

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

Re: VGA выход на монитор для ESP32.

15813044272087106596366947807352.jpg

Не в сети

#6 10-02-2020 10:37:09

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

Re: VGA выход на монитор для ESP32.

#include <stdio.h>
#include "fabgl.h"
fabgl::VGAController DisplayController;
fabgl::Canvas        canvas(&DisplayController);
#define DOUBLEBUFFERING 1
struct Test {
  virtual ~Test() { };
  virtual void update() = 0;
  virtual bool nextState() = 0;
  virtual int testState() = 0;
  virtual char const * name() = 0;
};
#include "ballstest.h"
#include "polygonstest.h"
#include "spritestest.h"
int a=0;
char hour[11]="";
char minute[11]="";
char DAT[11]="";
char MES[11]="";
char GOD[11]="";
char sec[11]="";
char st[11]="";
char str[21]="";
char str1[11]="";
#ifdef ESP8266
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <time.h>
#ifdef CREDENTIALS
char* time_output="";
char* lastNTPtime1="";
const char* ssid = mySSID;
const char* password = myPASSWORD;
#else
const char* ssid = "tele2";
const char* password = "ta20242024";
#endif
const char* NTP_SERVER = "ch.pool.ntp.org";
const char* TZ_INFO    = "MSK-7MSD,M3.5.0/2,M10.5.0/3";  //"MSK-7MSD,M3.5.0/2,M10.5.0/3"-ЧАСОВОЙ ПОЯС АЛТАЙСКОГО КРАЯ
// enter your time zone (https://remotemonitoringsystems.ca/time-zone-abbreviations.php)
tm timeinfo;
time_t now;
long unsigned lastNTPtime;
unsigned long lastEntryTime;
void setup()
{ Serial.begin(115200);
Serial.println("\n\nNTP Time Test\n");
  WiFi.begin(ssid, password);
  int counter = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    if (++counter > 10) ESP.restart();
    Serial.print ( "." );
  }
  Serial.println("\n\nWiFi connected\n\n");
  configTime(0, 0, NTP_SERVER);
  // See https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv for Timezone codes for your region
  setenv("TZ", TZ_INFO, 1);
  if (getNTPtime(10)) {  // wait up to 10sec to sync
  } else {
    Serial.println("Time not set");
    ESP.restart();
  }
  showTime(&timeinfo);
  lastNTPtime = time(&now);
  lastEntryTime = millis();
  // avoid garbage into the UART
  delay(500);
  DisplayController.begin(GPIO_NUM_21, GPIO_NUM_13, GPIO_NUM_12, GPIO_NUM_23, GPIO_NUM_17);
  DisplayController.setResolution(VESA_720x400_85Hz, -1, -1, DOUBLEBUFFERING);
 canvas.selectFont(&fabgl::FONT_std_24);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(3));
}
void loop()
{
  static int64_t stime  = esp_timer_get_time();
  static int FPS        = 0;
  static int FPSCounter = 0;
  static int testIndex  = 0;
  static Test * test    = new BallsTest;
 getNTPtime(10);
  showTime(&timeinfo);
  if (esp_timer_get_time() - stime > 1000000) {
    // calculate FPS
    FPS = FPSCounter;
    stime = esp_timer_get_time();
    FPSCounter = 0;
  }
  ++FPSCounter;
  test->update();
  // display test state and FPS
  canvas.setPenColor(Color::Yellow);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(3));
canvas.drawTextFmt(0, 25, hour);
canvas.drawText(60,25,":");
canvas.drawTextFmt(100, 25, minute);
canvas.drawText(160,25,":");
canvas.drawTextFmt(200, 25, sec);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(2));
canvas.drawTextFmt(0, 1, hour);
canvas.drawText(60, 1,":");
canvas.drawTextFmt(100, 1, minute);
canvas.drawText(160, 1,":");
canvas.drawTextFmt(200, 1, sec);
/////////////////////////////////
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(3));
canvas.drawTextFmt(400, 25, DAT);
canvas.drawText(460,25,"/");
canvas.drawTextFmt(500, 25, MES);
canvas.drawText(560,25,"/");
canvas.drawTextFmt(600, 25, GOD);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(2));
canvas.drawTextFmt(400, 1, DAT);
canvas.drawText(460, 1,"/");
canvas.drawTextFmt(500, 1, MES);
canvas.drawText(560, 1,"/");
canvas.drawTextFmt(600, 1, GOD);
  if (DOUBLEBUFFERING)
    canvas.swapBuffers();
}

bool getNTPtime(int sec) {

  {
    uint32_t start = millis();
    do {
      time(&now);
      localtime_r(&now, &timeinfo);
      Serial.print(".");
      delay(10);
    } while (((millis() - start) <= (1000 * sec)) && (timeinfo.tm_year < (2016 - 1900)));
    if (timeinfo.tm_year <= (2016 - 1900)) return false;  // the NTP call was not successful
    Serial.print("now ");  Serial.println(now);
     
      char time_output[30];
    strftime(time_output, 30, "%a  %d-%m-%y %T", localtime(&now));
    sprintf(str, "%d", time_output);
    Serial.println(time_output);
    Serial.println();
  }
 
  return true;
}
///////////////////////////
void showTime(tm *localTime) {
sprintf(hour, "%d",localTime->tm_hour);
sprintf(minute, "%d",localTime->tm_min);
sprintf(sec, "%d",localTime->tm_sec);
sprintf(DAT, "%d",localTime->tm_mday);
sprintf(MES, "%d",localTime->tm_mon + 1);
sprintf(GOD, "%d",localTime->tm_year + 1900);
  Serial.print(localTime->tm_mday);
  Serial.print('/');
  Serial.print(localTime->tm_mon + 1);
  Serial.print('/');
  Serial.print(localTime->tm_year - 100);
  Serial.print('-');
  Serial.print(localTime->tm_hour);
  Serial.print(':');
  Serial.print(localTime->tm_min);
  Serial.print(':');
  Serial.print(localTime->tm_sec);
  Serial.print(" Day of Week ");
  if (localTime->tm_mday = 0) localTime->tm_mday = 7;
  Serial.println(localTime->tm_wday);
}

Не в сети

#7 10-02-2020 10:41:33

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

Re: VGA выход на монитор для ESP32.

Без библиотек "ballstest.h","polygonstest.h", "spritestest.h" работать скетч не будет. Библиотеки эти есть в примере DoubleBuffer, который включён в комплект FabGL.
http://www.fabglib.org/_v_g_a_2_double_ … ample.html
Распиновка выходов VGA. RGB-HSync-VSync. R = GPIO 21, G = GPIO 13, B = GPIO 12, HSync = GPIO 23, VSync = GPIO 17.
DisplayController.begin(GPIO_NUM_21, GPIO_NUM_13, GPIO_NUM_12, GPIO_NUM_23, GPIO_NUM_17);
Понятно, что любые каналы можно перенаправить на любые выводы любого ESP32. 
DisplayController.setResolution(VESA_720x400_85Hz, -1, -1, DOUBLEBUFFERING);
На моих двух мониторах, поддерживается два разрешения видережимов.
1)VESA_720x400_85Hz
2)640x350_85Hz

Не в сети

#8 12-02-2020 14:14:51

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

Re: VGA выход на монитор для ESP32.

+DS18B20

#include <stdio.h>
#include "fabgl.h"
#include <DallasTemperature.h>
#include <OneWire.h>
fabgl::VGAController DisplayController;
fabgl::Canvas        canvas(&DisplayController);
#define DOUBLEBUFFERING 1
struct Test {
  virtual ~Test() { };
  virtual void update() = 0;
  virtual bool nextState() = 0;
  virtual int testState() = 0;
  virtual char const * name() = 0;
};
#include "ballstest.h"
#include "polygonstest.h"
#include "spritestest.h"
int a=0;
char hour[9]="";
char minute[9]="";
char DAT[9]="";
char MES[9]="";
char GOD[9]="";
char sec[9]="";
char temper[11]="";
char temper1[11]="";
char temper2[11]="";
char str1[30]="";
#include <WiFi.h>
#include <time.h>
#ifdef CREDENTIALS
char* time_output="";
char* lastNTPtime1="";
const char* ssid = mySSID;
const char* password = myPASSWORD;
#else
const char* ssid = "";
const char* password = "";
#endif
const char* NTP_SERVER = "ch.pool.ntp.org";
const char* TZ_INFO    = "MSK-7MSD,M3.5.0/2,M10.5.0/3";  //"MSK-7MSD,M3.5.0/2,M10.5.0/3"-ЧАСОВОЙ ПОЯС АЛТАЙСКОГО КРАЯ
// enter your time zone (https://remotemonitoringsystems.ca/time-zone-abbreviations.php)
tm timeinfo;
time_t now;
long unsigned lastNTPtime;
unsigned long lastEntryTime;
#define ONE_WIRE_BUS 22
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
DeviceAddress tempDeviceAddress;
int  resolution = 12;
unsigned long lastTempRequest = 0;
int  delayInMillis = 0;
float temperature = 0.0;
int  idle = 0;
//////////////////////////////
void setup()
{
//////////////////ds18b20////////
Serial.begin(115200);
  Serial.println("Dallas Temperature Control Library - Async Demo");
  Serial.print("Library Version: ");
  Serial.println(DALLASTEMPLIBVERSION);
  Serial.println("\n");
  sensors.begin();
  sensors.getAddress(tempDeviceAddress, 0);
  sensors.setResolution(tempDeviceAddress, resolution);
  sensors.setWaitForConversion(false);
  sensors.requestTemperatures();
  delayInMillis = 750 / (1 << (12 - resolution)); 
  lastTempRequest = millis(); 
//////////////////ds18b20 end////////
Serial.println("\n\nNTP Time Test\n");
  WiFi.begin(ssid, password);
  int counter = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    if (++counter > 20) ESP.restart();
    Serial.print ( "." );
  }
  Serial.println("\n\nWiFi connected\n\n");
  configTime(0, 0, NTP_SERVER);
  // See https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv for Timezone codes for your region
  setenv("TZ", TZ_INFO, 1);
  if (getNTPtime(10)) {  // wait up to 10sec to sync
  } else {
    Serial.println("Time not set");
    ESP.restart();
  }
  showTime(&timeinfo);
  lastNTPtime = time(&now);
  lastEntryTime = millis();
  // avoid garbage into the UART
  delay(500);  
  DisplayController.begin(GPIO_NUM_21, GPIO_NUM_13, GPIO_NUM_12, GPIO_NUM_23, GPIO_NUM_17);
  DisplayController.setResolution(VESA_720x400_85Hz, -1, -1, DOUBLEBUFFERING);
 canvas.selectFont(&fabgl::FONT_std_24);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(3));
}
void loop()
{
  //ds18b20//
    Serial.print(" Temperature: ");
    
    Serial.println(temperature, resolution - 8); 
    Serial.print("  Resolution: ");
    Serial.println(resolution); 
    Serial.print("Idle counter: ");
    Serial.println(idle);     
    Serial.println(); 
    sensors.setResolution(tempDeviceAddress, 12);//12бит разрешение датчика
    sensors.requestTemperatures(); 
    temperature = sensors.getTempCByIndex(0);
sprintf(temper, "%.4f",temperature);
sprintf(temper1, "%.2f",temperature);
sprintf(temper2, "%.1f",temperature);
 ////////////////////////
  static int64_t stime  = esp_timer_get_time();
  static int FPS        = 0;
  static int FPSCounter = 0;
  static int testIndex  = 0;
  static Test * test    = new BallsTest;
getNTPtime(10);
  showTime(&timeinfo);
test->update();
  canvas.setPenColor(Color::Yellow);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(3));
canvas.drawTextFmt(0, 25, hour);
canvas.drawText(60,25,":");
canvas.drawTextFmt(100, 25, minute);
canvas.drawText(160,25,":");
canvas.drawTextFmt(200, 25, sec);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(2));
canvas.drawTextFmt(0, 1, hour);
canvas.drawText(60, 1,":");
canvas.drawTextFmt(100, 1, minute);
canvas.drawText(160, 1,":");
canvas.drawTextFmt(200, 1, sec);
/////////////////////////////////
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(3));
canvas.drawTextFmt(400, 25, DAT);
canvas.drawText(460,25,"/");
canvas.drawTextFmt(500, 25, MES);
canvas.drawText(560,25,"/");
canvas.drawTextFmt(600, 25, GOD);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(2));
canvas.drawTextFmt(400, 1, DAT);
canvas.drawText(460, 1,"/");
canvas.drawTextFmt(500, 1, MES);
canvas.drawText(560, 1,"/");
canvas.drawTextFmt(600, 1, GOD);
 canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(1));
canvas.drawTextFmt(0, 50, str1);
canvas.setPenColor(Color::Green);
canvas.drawTextFmt(0, 80, "Temperature:        *C");
canvas.drawTextFmt(260, 80, temper2);
canvas.drawTextFmt(410, 80, temper1);
canvas.drawTextFmt(540, 80, temper);
if (DOUBLEBUFFERING)
    canvas.swapBuffers();
}
bool getNTPtime(int sec) {
  {
    uint32_t start = millis();
    do {
      time(&now);
      localtime_r(&now, &timeinfo);
      Serial.print(".");
      delay(10);
    } while (((millis() - start) <= (1000 * sec)) && (timeinfo.tm_year < (2016 - 1900)));
    if (timeinfo.tm_year <= (2016 - 1900)) return false;  // the NTP call was not successful
    Serial.print("now ");  Serial.println(now);
      char time_output[30];
    strftime(time_output, 30, "%a  %d-%m-%y %T", localtime(&now));
   sprintf(str1, "%s", time_output);
    Serial.println(time_output);
    Serial.println();
  }
  return true;
}

///////////////////////////
void showTime(tm *localTime) {
sprintf(hour, "%d",localTime->tm_hour);
sprintf(minute, "%d",localTime->tm_min);
sprintf(sec, "%d",localTime->tm_sec);
sprintf(DAT, "%d",localTime->tm_mday);
sprintf(MES, "%d",localTime->tm_mon + 1);
sprintf(GOD, "%d",localTime->tm_year + 1900);
  Serial.print(localTime->tm_mday);
  Serial.print('/');
  Serial.print(localTime->tm_mon + 1);
  Serial.print('/');
  Serial.print(localTime->tm_year - 100);
  Serial.print('-');
  Serial.print(localTime->tm_hour);
  Serial.print(':');
  Serial.print(localTime->tm_min);
  Serial.print(':');
  Serial.print(localTime->tm_sec);
  Serial.print(" Day of Week ");
  if (localTime->tm_mday = 0) localTime->tm_mday = 7;
  Serial.println(localTime->tm_wday);
}

15814918159161319624204504446104.jpg

Не в сети

#9 02-07-2021 00:44:02

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

Re: VGA выход на монитор для ESP32.

16251614147163526264477304391019.jpg

Не в сети

#10 06-07-2021 03:50:23

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

Re: VGA выход на монитор для ESP32.

16255181228665890626829047519351.jpg

16255181713373559952799876043677.jpg

Не в сети

#11 06-07-2021 04:00:06

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

Re: VGA выход на монитор для ESP32.

Очередные часы NTP на ESP32 и выводом на стандартный монитор VGA.
Код:

е#include <stdio.h>
#include "fabgl.h"
fabgl::VGAController DisplayController;
fabgl::Canvas        canvas(&DisplayController);
#define DOUBLEBUFFERING 1
char hour[9]="";
char minute[9]="";
char DAT[9]="";
char MES[9]="";
char GOD[9]="";
char sec[9]="";
char str1[30]="";
#include <WiFi.h>
#include <time.h>
char* time_output="";
char* lastNTPtime1="";
const char* ssid = "имя вашей сети";
const char* password = "пароль";
const char* NTP_SERVER = "ch.pool.ntp.org";
const char* TZ_INFO    = "MSK-6MSD,M3.5.0/2,M10.5.0/3";  //"MSK-6MSD,M3.5.0/2,M10.5.0/3"-ЧАСОВОЙ ПОЯС АЛТАЙСКОГО КРАЯ
// enter your time zone (https://remotemonitoringsystems.ca/time-zone-abbreviations.php)
tm timeinfo;
time_t now;
long unsigned lastNTPtime;
unsigned long lastEntryTime;
int  delayInMillis = 0;
int  idle = 0;
void setup()
{
Serial.begin(115200);
  WiFi.begin(ssid, password);
  int counter = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    if (++counter > 20) ESP.restart();
    Serial.print ( "." );
  }
  Serial.println("\n\nWiFi connected\n\n");
  configTime(0, 0, NTP_SERVER);
  // See https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv for Timezone codes for your region
  setenv("TZ", TZ_INFO, 1);
  if (getNTPtime(10)) {  // wait up to 10sec to sync
  } else {
    Serial.println("Time not set");
    ESP.restart();
  }
  showTime(&timeinfo);
  lastNTPtime = time(&now);
  lastEntryTime = millis();
  // avoid garbage into the UART
  delay(500);  
DisplayController.begin();
DisplayController.setResolution(VGA_320x200_75Hz);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(1));
//canvas.selectFont(&fabgl::FONT_8x8);
canvas.selectFont(&fabgl::FONT_std_24);
//canvas.selectFont(&fabgl::FONT_10x20);
}
void loop()
{
getNTPtime(1000);
  showTime(&timeinfo);
 canvas.clear();
canvas.setPenColor(Color::Green);
canvas.drawTextFmt(15, 8, hour);
canvas.drawText(70,8,":");
canvas.drawTextFmt(100, 8, minute);
canvas.drawText(180,8,":");
canvas.drawTextFmt(200, 8, sec);
canvas.setPenColor(Color::Red);
canvas.drawTextFmt(0, 130, DAT);
canvas.drawText(60,130,"/");
canvas.drawTextFmt(90, 130, MES);
canvas.drawText(130,130,"/");
canvas.drawTextFmt(170, 130, GOD);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(0));
canvas.setPenColor(Color::Yellow);
canvas.drawTextFmt(30, 60, str1);
canvas.setPenColor(Color::Blue);
canvas.drawTextFmt(0, 155, "IvanAltay (C) 06.07.2021");
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(1));
if (DOUBLEBUFFERING)
    canvas.swapBuffers();
}
bool getNTPtime(int sec) {
  {
    uint32_t start = millis();
    do {
      time(&now);
      localtime_r(&now, &timeinfo);
      Serial.print(".");
      delay(10);
    } while (((millis() - start) <= (1000 * sec)) && (timeinfo.tm_year < (2016 - 1900)));
    if (timeinfo.tm_year <= (2016 - 1900)) return false;  // the NTP call was not successful
    Serial.print("now ");  Serial.println(now);
      char time_output[30];
    strftime(time_output, 30, "%a  %d-%m-%y %T", localtime(&now));
   sprintf(str1, "%s", time_output);
    Serial.println(time_output);
    Serial.println();
  }
  return true;
}
///////////////////////////
void showTime(tm *localTime) {
//
sprintf(hour, "%d",localTime->tm_hour);
sprintf(minute, "%d",localTime->tm_min);
sprintf(sec, "%d",localTime->tm_sec);
sprintf(DAT, "%d",localTime->tm_mday);
sprintf(MES, "%d",localTime->tm_mon + 1);
sprintf(GOD, "%d",localTime->tm_year + 1900);  
}

Не в сети

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

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