Разное о выращивании табака на Алтае
Вы не вошли.
Страницы 1
Использовал библиотеку FabGL.
https://github.com/fdivitto/FabGL
http://www.fabglib.org/
Сегодня, смог сделать программу выводящую RGB картинку 720/400(с частотой 85 Гц) на стандартный VGA порт, которая получает реальное время с сервера точного времени и без глюков выводит данные на VGA монитор. Только, программировать сложно, когда у тебя постоянно в обработке такая хрень времязависимая как видеоизображение. То тайминги видео рвутся, то прерывания плывут. Всего 5 портов нужно от ESP32, на формирование VGA сигнала(RGB+ВЕРТИКАЛЬНАЯ РАЗВЁРТКА+ГОРИЗОНТАЛЬНАЯ РАЗВЁРТКА). На Авито, куча мониторов LCD 17" по 500 руб(не выбрасывайте древний монитор!). В стационарном виде, сильно лучше этих прикручиваемых к Ардуино мониторчиков использовать нормальный телевИзор
Не в сети
Не в сети
На фото виден герметичный датчик DS18B20(висит на GPIO 22). В серийный порт данные с датчика идут нормально, на VGA монитор пока вывести не могу. Мне всю бошку уже сломали преобразования типов данных. Встроенный дисплей, тоже пока не могу запустить совместно с VGA выходом.
Не в сети
До того, сделал видеовыход VGA для Arduino Uno и ESP8266. Был напрасный(мартышкин) труд. Кроме вывода VGA сигнала, эти микропроцессоры почти больше не на что не способны. И вот только ESP32, уже обладает нормальной вычислительной способностью, чтоб ещё держать WiFi сеть и нечто с датчиков считывать(окромя формирования VGA сигнала). 240 МГц и оперативки побОле однако...
Не в сети
Не в сети
#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);
}
Не в сети
Без библиотек "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
Не в сети
+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);
}
Не в сети
Не в сети
Не в сети
Очередные часы 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);
}
Не в сети
Страницы 1