LCD0802 дисплей работает на контроллере HD44780 и полностью совместим с библиотекой LiquidCrystal которая интегрирована в Arduino IDE. Дисплей имеет две строки по 8 символов. Размеры платы дисплея 58х32 мм.
Схема подключения
Распиновка
Настройка контрастности производится путем установки резистора 2…2,7 К между выводами Vo и GND.
Тестовый скетч:
#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(8, 2);// указываем тип дисплея LCD 16X2 lcd.setCursor(0,0); // положение курсора - нулевая строка, первый символ lcd.print(" HELLO! ");// вывод на экран delay(1000); lcd.clear(); } void loop() { lcd.setCursor(0,0); // положение курсора - нулевая строка, первый символ lcd.print("LCD0802");// вывод на экран lcd.setCursor(0,1);// положение курсора - первая срока, первый символ lcd.print("ARDUINO");// ввод на экран delay(1000); }
Примеры использования
Простые часы 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(8, 2);// указываем тип дисплея LCD 16X2 } 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); 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(0,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-2000);} 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); }
Простой термометр DS18B20 (0…125 гр. Цельсия)
Измерение температуры производится 1 раз в 10 секунд.
#include <LiquidCrystal.h> // подключаем встроенную в Arduino IDE библиотеку для дисплея LCD 16x2 #include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip LiquidCrystal lcd(12, 11, 5, 6, 7, 8); // номер вывода дисплея(вывод Arduino):RS(12),E(11),D4(5),D5(6),D6(7),D7(8) OneWire ds(2); // Вход датчика 18b20 byte v1[8] = {0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07}; byte v2[8] = {0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00}; byte v3[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F}; byte v4[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F}; byte v5[8] = {0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0x1C}; byte v6[8] = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C}; byte v7[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07}; byte v8[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00}; byte d1,d2,d3,d4,d5,d6,e1,e2,e3,a[6],x; unsigned long times; int temp_ds; void setup() { Serial.begin(9600); lcd.begin(8, 2);// указываем тип дисплея LCD 8X2 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); delay(300); temp_ds = dsRead(0); } void loop() { if(millis()-times>10000){temp_ds = dsRead(0);times=millis();} a[0]=temp_ds/100; a[1]=temp_ds/10%10; a[2]=temp_ds%10; Serial.println(temp_ds); for(x=0;x<2;x++){ switch(x){ case 0: e1=0;e2=1,e3=2;break; case 1: e1=3,e2=4,e3=5;break; } digit(); } lcd.setCursor(6,1);lcd.print(".");lcd.print(a[2]); delay(1000); } 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);} float dsRead(byte x) { byte data[2], addr[8][8], kol = 0; while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков kol++; } ds.reset_search(); // Сброс поиска датчика ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0x44, 0); // Измерение температуры с переносом данных в память ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0xBE); // Обращение памяти data[0] = ds.read();// Чтение памяти byte low data[1] = ds.read();// Чтение памяти byte high float value = ((data[1] << 8) | data[0]) / 1.60; return (float)value; // Расчет температуры и вывод }
#include <LiquidCrystal.h> // подключаем встроенную в Arduino IDE библиотеку для дисплея LCD 16x2 #include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip LiquidCrystal lcd(12, 11, 5, 6, 7, 8); // номер вывода дисплея(вывод Arduino):RS(12),E(11),D4(5),D5(6),D6(7),D7(8) OneWire ds(2); // Вход датчика 18b20 byte v1[8] = {0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07}; byte v2[8] = {0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00}; byte v3[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F}; byte v4[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F}; byte v5[8] = {0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0x1C}; byte v6[8] = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C}; byte v7[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07}; byte v8[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00}; byte d1,d2,d3,d4,d5,d6,e1,e2,e3,a[6],x; unsigned long times; int temp_ds; void setup() { Serial.begin(9600); lcd.begin(8, 2);// указываем тип дисплея LCD 16X2 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); delay(300); temp_ds = dsRead(0); } void loop() { if(millis()-times>10000){temp_ds = dsRead(0);times=millis();} a[0]=temp_ds/100; a[1]=temp_ds/10%10; a[2]=temp_ds%10; Serial.println(temp_ds); for(x=0;x<2;x++){ switch(x){ case 0: e1=0;e2=1,e3=2;break; case 1: e1=3,e2=4,e3=5;break; } digit(); } lcd.setCursor(6,1);lcd.print(".");lcd.print(a[2]); lcd.setCursor(6,0);lcd.print(char(223)); lcd.print("C "); delay(1000); } 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);} float dsRead(byte x) { byte data[2], addr[8][8], kol = 0; while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков kol++; } ds.reset_search(); // Сброс поиска датчика ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0x44, 0); // Измерение температуры с переносом данных в память ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0xBE); // Обращение памяти data[0] = ds.read();// Чтение памяти byte low data[1] = ds.read();// Чтение памяти byte high float value = ((data[1] << 8) | data[0]) / 1.60; return (float)value; // Расчет температуры и вывод }
Простой терморегулятор DS18B20
Управление терморегулятора состоит из 3-х кнопок, при нажатии кнопки REG появляется возможность регулировать температуру регулятора при помощи кнопок UP и DW. Выход D13 служит для управления нагревательным элементом.
#include <LiquidCrystal.h> // подключаем встроенную в Arduino IDE библиотеку для дисплея LCD 16x2 #include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip #include <EEPROM.h> LiquidCrystal lcd(12, 11, 5, 6, 7, 8); // номер вывода дисплея(вывод Arduino):RS(12),E(11),D4(5),D5(6),D6(7),D7(8) OneWire ds(9); // Вход датчика 18b20 byte v1[8] = {0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07}; byte v2[8] = {0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00}; byte v3[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F}; byte v4[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F}; byte v5[8] = {0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0x1C}; byte v6[8] = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C}; byte v7[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07}; byte v8[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00}; byte d1,d2,d3,d4,d5,d6,e1,e2,e3,a[6],x; unsigned long times,times0; int temp_ds; int menu,reg,w; int gis = 5; void setup() { Serial.begin(9600); lcd.begin(8, 2);// указываем тип дисплея LCD 16X2 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); // REG button pinMode(3,INPUT_PULLUP); // UP button pinMode(4,INPUT_PULLUP); // DW button pinMode(13,OUTPUT); // OUT delay(300); reg = EEPROM.read(0); } void loop() { delay(200); if(digitalRead(2)==LOW){menu++;times0=millis();w=1;if(menu>1){menu=0;}lcd.clear();} if(digitalRead(3)==LOW && menu==1){reg--;times0=millis();w=1;if(reg<0){reg=0;}} if(digitalRead(4)==LOW && menu==1){reg++;times0=millis();w=1;if(reg>99){reg=99;}} if(menu==1){ a[0]=reg/10; a[1]=reg%10; for(x=0;x<2;x++){ switch(x){ case 0: e1=0;e2=1,e3=2;break; case 1: e1=3,e2=4,e3=5;break; }digit();}} if(menu==0){ if(millis()-times>1000){temp_ds = dsRead(0);times=millis();} a[0]=temp_ds/100; a[1]=temp_ds/10%10; a[2]=temp_ds%10; Serial.println(temp_ds); for(x=0;x<2;x++){ switch(x){ case 0: e1=0;e2=1,e3=2;break; case 1: e1=3,e2=4,e3=5;break; }digit();} lcd.setCursor(6,1);lcd.print(".");lcd.print(a[2]); } if(millis()-times0>5000 && w==1){EEPROM.update(0,reg);lcd.clear();menu=0;w=0;} if(reg*10 >= temp_ds + gis){digitalWrite(13,HIGH);lcd.setCursor(7,0);lcd.print("H");} if(reg*10 <= temp_ds - gis){digitalWrite(13,LOW);lcd.setCursor(7,0);lcd.print("L");} } 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);} float dsRead(byte x) { byte data[2], addr[8][8], kol = 0; while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков kol++; } ds.reset_search(); // Сброс поиска датчика ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0x44, 0); // Измерение температуры с переносом данных в память ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0xBE); // Обращение памяти data[0] = ds.read();// Чтение памяти byte low data[1] = ds.read();// Чтение памяти byte high float value = ((data[1] << 8) | data[0]) / 1.60; return (float)value; // Расчет температуры и вывод }
Простые часы DS3231 с кнопками коррекции времени
Привет. Как увидел данный проект решил повторить. Дисплей получил сегодня и не подключал.
В мониторе порта я должен что увидеть ?
Ничего.
Я получил дисплей 0802b-2 ver4.2 и при включении не было контрастности , номинал был как в схеме.
Изображение появилось при 100 ом.
Вопрос отпал. Дисплей очень критичен к напряжению.Нужно точно 5 . А у меня было при питании от usb
4.8
Привет.
Все работает. А проблематично добавить мигание разделительных точек ?
Самый простой способ это использовать выход SQW часов реального времени.