Дисплей VDF1602 (16T202DA1E) выполнен на базе вакуумно-люминесцентного индикатора, который может отображать ASCII символы в 2 строки (16 знаков в 1 строке) каждый символ в виде матрицы 5х7 пикселей.
Дисплей 16T202DA1E программно полностью совместим с дисплеем LCD1602 контроллере HD44780, поэтому использует стандартную библиотеку LiquidCrystal которая интегрирована в Arduino IDE.
Для правильной работы базе вакуумно-люминесцентного индикатора требуется два источника питания, это питание сеток и анодов напряжением 12-27 В и питание катода (нити накала) переменным напряжением от 1,2 до 5 В (в зависимости от типа ВЛИ). В дисплее 16T202DA1E все необходимые источники для правильной работы ВЛИ уже встроены в плату, поэтому для питания дисплея Вам понадобится только одно напряжение в 5 В. Так же в отличии от LCD1602 в дисплее 16T202DA1E нет вывода Vo (регулировка контрастности), что делает подключение дисплея к Arduino Nano еще проще.
Как ранее отмечалось дисплей полностью совместим с библиотекой LiquidCrystal, но в дисплее имеется дополнительно программная регулировка яркости свечения индикатора которую так же можно использовать при помощи библиотеки LiquidCrystal
Ниже показан тестовый скетч который поддерживает ступенчатую регулировку яркости (25, 50, 75, 100 %).
#include <LiquidCrystal.h> /* подключаем встроенную в Arduino IDE библиотеку для дисплея LCD 16x2 */ LiquidCrystal lcd(12, 11, 5, 6, 7, 8); /* номер вывода дисплея(вывод Arduino): RS(12),E(11),D4(5),D5(6),D6(7),D7(8) */ void setup() { lcd.begin(16, 2);// указываем тип дисплея LCD 16X2 Brightness(100); lcd.setCursor(1,0); // положение курсора - нулевая строка, первый символ lcd.print("HELLO!!!");// вывод на экран delay(1000); lcd.noDisplay(); delay(1000); lcd.display(); } void loop() { lcd.setCursor(0,0); // положение курсора - нулевая строка, первый символ lcd.print("RCL-RADIO.RU");// вывод на экран lcd.setCursor(0,1);// положение курсора - первая срока, первый символ lcd.print("ARDUINO ");// ввод на экран delay(500);// пауза 500 мс for (int n=25;n<=100;n+=25){ lcd.setCursor(9,1); lcd.print("BR ");lcd.print(n);lcd.print("% "); Brightness(n);delay(1000); } } void Brightness(byte brig){ switch(brig){ case 25 : lcd.command(0b00101011);break; case 50 : lcd.command(0b00101010);break; case 75 : lcd.command(0b00101001);break; case 100 : lcd.command(0b00101000);break; } }
Для регулировки яркости используется дополнительная функция управления дисплеем:
Brightness(byte brig);
Переменная brig может иметь значение 25, 50, 75 и 100 (% яркости)
Форум — http://forum.rcl-radio.ru/viewtopic.php?id=508
Примеры использования дисплея 16T202DA1E
Простые часы DS3231
#include <LiquidCrystal.h> /* подключаем встроенную в Arduino IDE библиотеку для дисплея LCD 16x2 */ #include <Wire.h> #include <DS3231.h>// http://rcl-radio.ru/wp-content/uploads/2022/08/DS3231.zip LiquidCrystal lcd(12, 11, 5, 6, 7, 8); /* номер вывода дисплея(вывод Arduino):RS(12),E(11),D4(5),D5(6),D6(7),D7(8) */ DS3231 clock;RTCDateTime DateTime; void setup() { Wire.begin(); clock.begin(); // clock.setDateTime(__DATE__, __TIME__); // установка времени по времени компиляции lcd.begin(16, 2);// указываем тип дисплея LCD 16X2 Brightness(25); } void loop() { DateTime=clock.getDateTime(); int hh = DateTime.hour; int mm = DateTime.minute; int ss = DateTime.second; int dd = DateTime.day; int mn = DateTime.month; int yy = DateTime.year; lcd.setCursor(4,0); lcd.print(hh / 10);lcd.print(hh % 10);lcd.print(":"); lcd.print(mm / 10);lcd.print(mm % 10);lcd.print(":"); lcd.print(ss / 10);lcd.print(ss % 10); lcd.setCursor(3,1); lcd.print(dd / 10);lcd.print(dd % 10);lcd.print("-"); lcd.print(mn / 10);lcd.print(mn % 10);lcd.print("-"); lcd.print(yy); delay(200); } void Brightness(byte brig){ switch(brig){ case 25 : lcd.command(0b00101011);break; case 50 : lcd.command(0b00101010);break; case 75 : lcd.command(0b00101001);break; case 100 : lcd.command(0b00101000);break; } }
Простые часы DS3231 с кнопками коррекции времени
#include <LiquidCrystal.h> /* подключаем встроенную в Arduino IDE библиотеку для дисплея LCD 16x2 */ #include <Wire.h> #include <DS3231.h>// http://rcl-radio.ru/wp-content/uploads/2022/08/DS3231.zip LiquidCrystal lcd(12, 11, 5, 6, 7, 8); /* номер вывода дисплея(вывод Arduino):RS(12),E(11),D4(5),D5(6),D6(7),D7(8) */ DS3231 clock;RTCDateTime DateTime; int menu; int tic; void setup() { Wire.begin(); clock.begin(); pinMode(2,INPUT_PULLUP); // SET TIME pinMode(3,INPUT_PULLUP); // UP pinMode(4,INPUT_PULLUP); // DW // clock.setDateTime(__DATE__, __TIME__); // установка времени по времени компиляции lcd.begin(16, 2);// указываем тип дисплея LCD 16X2 Brightness(25); } void loop() { DateTime=clock.getDateTime(); int hh = DateTime.hour; int mm = DateTime.minute; int ss = DateTime.second; int dd = DateTime.day; int mn = DateTime.month; int yy = DateTime.year; lcd.setCursor(4,0); if(tic>0 && menu==1){lcd.print(" ");}else{lcd.print(hh / 10);lcd.print(hh % 10);}lcd.print(":"); if(tic>0 && menu==2){lcd.print(" ");}else{lcd.print(mm / 10);lcd.print(mm % 10);}lcd.print(":"); if(tic>0 && menu==3){lcd.print(" ");}else{lcd.print(ss / 10);lcd.print(ss % 10);} lcd.setCursor(3,1); if(tic>0 && menu==4){lcd.print(" ");}else{lcd.print(dd / 10);lcd.print(dd % 10);}lcd.print("-"); if(tic>0 && menu==5){lcd.print(" ");}else{lcd.print(mn / 10);lcd.print(mn % 10);}lcd.print("-"); if(tic>0 && menu==6){lcd.print(" ");}else{lcd.print(yy);} if(digitalRead(2)==LOW){menu++;if(menu>6){menu=0;}} if(menu==1){ if(digitalRead(3)==LOW){ hh++;if(hh>23){hh=23;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} if(digitalRead(4)==LOW){ hh--;if(hh<0){hh=0;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} } if(menu==2){ if(digitalRead(3)==LOW){ mm++;if(mm>59){mm=59;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} if(digitalRead(4)==LOW){ mm--;if(mm<0){mm=0;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} } if(menu==3){ if(digitalRead(3)==LOW){ ss=0;clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} if(digitalRead(4)==LOW){ ss=0;clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} } if(menu==4){ if(digitalRead(3)==LOW){ dd++;if(dd>31){dd=31;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} if(digitalRead(4)==LOW){ dd--;if(dd<0){dd=0;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} } if(menu==5){ if(digitalRead(3)==LOW){ mn++;if(mn>12){mn=12;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} if(digitalRead(4)==LOW){ mn--;if(mn<0){mn=0;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} } if(menu==6){ if(digitalRead(3)==LOW){ yy++;if(yy>2050){yy=2050;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} if(digitalRead(4)==LOW){ yy--;if(yy<2022){yy=2022;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} } tic++;if(tic>1){tic=0;} delay(200); } void Brightness(byte brig){ switch(brig){ case 25 : lcd.command(0b00101011);break; case 50 : lcd.command(0b00101010);break; case 75 : lcd.command(0b00101001);break; case 100 : lcd.command(0b00101000);break; } }
Простые часы DS3231 с большими цифрами и кнопками коррекции времени
#include <LiquidCrystal.h> /* подключаем встроенную в Arduino IDE библиотеку для дисплея LCD 16x2 */ #include <Wire.h> #include <DS3231.h>// http://rcl-radio.ru/wp-content/uploads/2022/08/DS3231.zip LiquidCrystal lcd(12, 11, 5, 6, 7, 8); /* номер вывода дисплея(вывод Arduino):RS(12),E(11),D4(5),D5(6),D6(7),D7(8) */ DS3231 clock;RTCDateTime DateTime; int menu; int tic; byte v1[8] = {0x07,0x07,0x07,0x07,0x07,0x07,0x07,0}; byte v2[8] = {0x07,0x07,0x00,0x00,0x00,0x00,0x00,0}; byte v3[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0}; byte v4[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0}; byte v5[8] = {0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0}; byte v6[8] = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0}; byte v7[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x07,0}; byte v8[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0}; byte d1,d2,d3,d4,d5,d6,e1,e2,e3,a[6],x; void setup() { Wire.begin(); clock.begin(); lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4); lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8); pinMode(2,INPUT_PULLUP); // SET TIME pinMode(3,INPUT_PULLUP); // UP pinMode(4,INPUT_PULLUP); // DW // clock.setDateTime(__DATE__, __TIME__); // установка времени по времени компиляции lcd.begin(16, 2);// указываем тип дисплея LCD 16X2 Brightness(25); } void loop() { DateTime=clock.getDateTime(); int hh = DateTime.hour; int mm = DateTime.minute; int ss = DateTime.second; int dd = DateTime.day; int mn = DateTime.month; int yy = DateTime.year; if(menu==0){ a[0]=hh/10; a[1]=hh%10; a[2]=mm/10; a[3]=mm%10; for(x=0;x<4;x++){ switch(x){ case 0: e1=0;e2=1,e3=2;break; case 1: e1=4,e2=5,e3=6;break; case 2: e1=8,e2=9,e3=10;break; case 3: e1=11,e2=12,e3=13;break; }digit();} lcd.setCursor(7,1);lcd.print(".");lcd.setCursor(7,0);lcd.print(" "); lcd.setCursor(14,1);lcd.print(ss / 10);lcd.print(ss % 10); } if(menu>0){ lcd.setCursor(4,0); if(tic>0 && menu==1){lcd.print(" ");}else{lcd.print(hh / 10);lcd.print(hh % 10);}lcd.print(":"); if(tic>0 && menu==2){lcd.print(" ");}else{lcd.print(mm / 10);lcd.print(mm % 10);}lcd.print(":"); if(tic>0 && menu==3){lcd.print(" ");}else{lcd.print(ss / 10);lcd.print(ss % 10);} lcd.setCursor(3,1); if(tic>0 && menu==4){lcd.print(" ");}else{lcd.print(dd / 10);lcd.print(dd % 10);}lcd.print("-"); if(tic>0 && menu==5){lcd.print(" ");}else{lcd.print(mn / 10);lcd.print(mn % 10);}lcd.print("-"); if(tic>0 && menu==6){lcd.print(" ");}else{lcd.print(yy);} } if(digitalRead(2)==LOW){menu++;if(menu>6){menu=0;}lcd.clear();} if(menu==1){ if(digitalRead(3)==LOW){ hh++;if(hh>23){hh=23;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} if(digitalRead(4)==LOW){ hh--;if(hh<0){hh=0;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} } if(menu==2){ if(digitalRead(3)==LOW){ mm++;if(mm>59){mm=59;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} if(digitalRead(4)==LOW){ mm--;if(mm<0){mm=0;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} } if(menu==3){ if(digitalRead(3)==LOW){ ss=0;clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} if(digitalRead(4)==LOW){ ss=0;clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} } if(menu==4){ if(digitalRead(3)==LOW){ dd++;if(dd>31){dd=31;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} if(digitalRead(4)==LOW){ dd--;if(dd<0){dd=0;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} } if(menu==5){ if(digitalRead(3)==LOW){ mn++;if(mn>12){mn=12;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} if(digitalRead(4)==LOW){ mn--;if(mn<0){mn=0;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} } if(menu==6){ if(digitalRead(3)==LOW){ yy++;if(yy>2050){yy=2050;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} if(digitalRead(4)==LOW){ yy--;if(yy<2022){yy=2022;}clock.setDateTime(yy, mn, dd, hh, mm, ss);delay(200);} } tic++;if(tic>1){tic=0;} delay(200); } void digit(){ switch(a[x]){ case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break; case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break; case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break; case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break; case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break; case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break; case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break; case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break; case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break; case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break; case 10:d1=150,d2=150,d3=150,d4=150,d5=150,d6=150;break; } lcd.setCursor(e1,0);lcd.write((uint8_t)d1); lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);lcd.setCursor(e1,1); lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);} void Brightness(byte brig){ switch(brig){ case 25 : lcd.command(0b00101011);break; case 50 : lcd.command(0b00101010);break; case 75 : lcd.command(0b00101001);break; case 100 : lcd.command(0b00101000);break; } }
Простые часы DS3231 + BMP280 (с кнопками коррекции времени)
Обратите внимание на то, что датчик давления BMP280 может иметь I2C адрес отличающийся от указанного в библиотеке, для определения адреса и корректировке библиотеки прочитайте статью http://rcl-radio.ru/?p=47046. Так же датчик может иметь на плате стабилизатор 3,3 В и имеет питание 5 В.
#include <LiquidCrystal.h> /* подключаем встроенную в Arduino IDE библиотеку для дисплея LCD 16x2 */ #include <Wire.h> #include <DS3231.h>// http://rcl-radio.ru/wp-content/uploads/2022/08/DS3231.zip #include <Adafruit_BMP280.h> // http://rcl-radio.ru/wp-content/uploads/2018/08/Adafruit_BMP280.zip #include <Adafruit_Sensor.h> // http://rcl-radio.ru/wp-content/uploads/2018/08/Adafruit_Sensor.zip LiquidCrystal lcd(12, 11, 5, 6, 7, 8); /* номер вывода дисплея(вывод Arduino):RS(12),E(11),D4(5),D5(6),D6(7),D7(8) */ DS3231 clock; RTCDateTime DateTime; Adafruit_BMP280 bmp; unsigned long times=10000; void setup() { Wire.begin(); clock.begin(); bmp.begin(); // clock.setDateTime(__DATE__, __TIME__); // установка времени по времени компиляции lcd.begin(16, 2);// указываем тип дисплея LCD 16X2 Brightness(25); } void loop() { DateTime=clock.getDateTime(); int hh = DateTime.hour; int mm = DateTime.minute; int ss = DateTime.second; int dd = DateTime.day; int mn = DateTime.month; int yy = DateTime.year; lcd.setCursor(0,0); lcd.print(hh / 10);lcd.print(hh % 10);lcd.print(":"); lcd.print(mm / 10);lcd.print(mm % 10);lcd.print(":"); lcd.print(ss / 10);lcd.print(ss % 10); lcd.setCursor(0,1); lcd.print(dd / 10);lcd.print(dd % 10);lcd.print("-"); lcd.print(mn / 10);lcd.print(mn % 10);lcd.print("-"); lcd.print(yy-2000); /// bmp280 if(millis()-times>10000){times=millis();lcd.setCursor(10,0);lcd.print(bmp.readTemperature(),1);lcd.print(char(223)); lcd.print("C "); lcd.setCursor(10,1);lcd.print(bmp.readPressure()/133.3224); } delay(200); } void Brightness(byte brig){ switch(brig){ case 25 : lcd.command(0b00101011);break; case 50 : lcd.command(0b00101010);break; case 75 : lcd.command(0b00101001);break; case 100 : lcd.command(0b00101000);break; } }
Индикатор уровня звукового сигнала (VU метр)
#define GAIN 14 // усиление 0...50 #define STEP 2 // плавность полос 0...20 #define RL 0 // RL - горизонт, вертикаль 0...1 #include <LiquidCrystal.h> /* подключаем встроенную в Arduino IDE библиотеку для дисплея LCD 16x2 */ #include <Wire.h> LiquidCrystal lcd(12, 11, 5, 6, 7, 8); /* номер вывода дисплея(вывод Arduino):RS(12),E(11),D4(5),D5(6),D6(7),D7(8) */ byte z,z0,z1; int ur,ul,urr,ull,urrr,ulll; int x,i,u_maxr,u_maxl; int u_l0[20],u_r0[20]; void setup() { byte znak_r[8]={0b00000,0b00000,0b11111,0b00101,0b00101,0b11010,0b00000,0b00000}; byte znak_l[8]={0b00000,0b00000,0b11111,0b10000,0b10000,0b10000,0b00000,0b00000}; byte a1[8] = {0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000}; byte a2[8] = {0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000}; byte a3[8] = {0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000}; byte a4[8] = {0b0011,0b0011,0b0011,0b0011,0b0011,0b0011,0b0011,0b00000}; byte a5[8] = {0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000}; lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(6,a4);lcd.createChar(7,a5); lcd.createChar(4,znak_r); lcd.createChar(5,znak_l); lcd.begin(16, 2);// LCD 16X2 // analogReference(INTERNAL); // если очень маленький уровень сигнала pinMode(A0,INPUT);// A0 - аналоговый вход R pinMode(A1,INPUT);// A1 - аналоговый вход L Brightness(75); } void loop() { urr = log(analogRead(0))*GAIN;if(urr>41){urr=41;} ull = log(analogRead(1))*GAIN;if(ull>41){ull=41;} if(RL==0){lcd.setCursor(0,0);lcd.write((uint8_t)4);lcd.setCursor(0,1);lcd.write((uint8_t)5);} if(RL==1){lcd.setCursor(0,1);lcd.print("L");lcd.setCursor(0,0);lcd.print("R");} if(urr<ur){ur=ur-1;delay(STEP);}else{ur = urr;} for(z=0,z0=0,z1=0;z<=ur;z++,z1++){if(z1>2){z1=0;z0++;} if(z1==1){lcd.setCursor(z0+1,1);lcd.write((uint8_t)0);lcd.setCursor(z0+2,1);if(ur<39){lcd.print(" ");}}} if(z1==3){lcd.setCursor(z0+1,1);lcd.write((uint8_t)1);} if(z1==2){lcd.setCursor(z0+1,1);lcd.write((uint8_t)2);} if(ull<ul){ul=ul-1;delay(STEP);}else{ul = ull;} for(z=0,z0=0,z1=0;z<=ul;z++,z1++){if(z1>2){z1=0;z0++;} if(z1==1){lcd.setCursor(z0+1,0);lcd.write((uint8_t)0);lcd.setCursor(z0+2,0);if(ul<39){lcd.print(" ");}}} if(z1==3){lcd.setCursor(z0+1,0);lcd.write((uint8_t)1);} if(z1==2){lcd.setCursor(z0+1,0);lcd.write((uint8_t)2);} ////////////////////////////////////////////////////////// i++;if(i<19){u_l0[i]=abs(ull);u_r0[i]=abs(urr);}else{i=1;} if(i==18){u_maxr=0;u_maxl=0; for(x=1;x<=15;x++){ u_maxl=max(u_maxl,u_l0[x]); u_maxr=max(u_maxr,u_r0[x]);}} if(u_maxl<ulll){ulll=ulll-1;}else{ulll = u_maxl;} if(u_maxr<urrr){urrr=urrr-1;}else{urrr = u_maxr;} if(u_maxl<=ul){u_maxl=ull+1;} if(u_maxr<=ur){u_maxr=urr+1;} lcd.setCursor(ulll/3+1,0);if(ulll/3>2){if(ulll/10%2==1){lcd.write((uint8_t)7);}if(ulll/10%2==0){lcd.write((uint8_t)6);}}lcd.print(" "); lcd.setCursor(urrr/3+1,1);if(urrr/3>2){if(urrr/10%2==1){lcd.write((uint8_t)7);}if(urrr/10%2==0){lcd.write((uint8_t)6);}}lcd.print(" "); delay(3); } void Brightness(byte brig){ switch(brig){ case 25 : lcd.command(0b00101011);break; case 50 : lcd.command(0b00101010);break; case 75 : lcd.command(0b00101001);break; case 100 : lcd.command(0b00101000);break; } }