LCD0802 (Arduino)

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; // Расчет температуры и вывод
}

 

Comments

  1. Простые часы DS3231 с кнопками коррекции времени
    Привет. Как увидел данный проект решил повторить. Дисплей получил сегодня и не подключал.
    В мониторе порта я должен что увидеть ?

Добавить комментарий

Войти с помощью: