Как подключить lcd дисплей с i2c модулем к arduino

Подключение

Питание дисплейного модуля осуществляется от 5 вольт постоянного тока, в руководстве пользователя производитель указывает номинальный ток 0,2 А. Я измерил потребляемый ток с помощью цифрового блока питания получилось стабильно 0,299 А, так что стоит ориентироваться на 0,3 А. При питании TE-ULCD от ардуино, преобразователь напряжения установленный на плате грелся довольно сильно, поэтому на всякий случай я запитал дисплейный модуль от USB персонального компьютера взяв шнурок от старой мышки. Разъем Х8 TE-ULCD предназначен для подачи питания и имеет следующую распиновку: PIN 1, 3, 7 и 9 — вход 5 В, PIN 2, 4, 6, 8, 10 — GND, PIN5 используется как ключ для контроля правильности подключения. Подавать питание можно на один любой пин +5 В и GND.

Подключение ардуино выполняется к разъему Х6 дисплейного модуля, согласно схеме представленной на рисунке. SPI TE-ULCD функционирует с уровнем 3,3 В, поэтому следует согласовать уровни дисплейного модуля и ардуино с помощью простого делителя на резисторах.

Так как планируется использовать TE-ULCD и плату расширения Ethernet Shield совместно, для выбора управляемых (ведомых) устройств будут использоваться PIN9 и PIN10 соответственно. PIN9 выбран изходя из удобства подключения и можно использовать любой другой свободный поменяв значение slaveSelectPin в скетче.

Команды записи и чтения TE-ULCD соответствуют настройкам SPI CPOL=1 и CPHA=1, что соответствует SPI_MODE3 для ардуино. Для платы расширения Ethernet Shield v2 настройки SPI соответствуют SPI_MODE0. Эти настройки понадобятся для обращения к соответствующему модулю.

Примеры работы для Espruino

В качестве примера подключим дисплей к управляющей плате Iskra JS.

Подключение к Iskra JS

Для коммуникации понадобится Breadboard Half и соединительные провода «папа-папа».

Вывод Обозначение Пин Iskra JS
1 GND GND
2 VCC 5V
3 VO GND
4 RS P11
5 R/W GND
6 E P12
7 DB0
8 DB1
9 DB2
10 DB3
11 DB4 P5
12 DB5 P4
13 DB6 P3
14 DB7 P2
15 VCC 5V
16 GND GND

Вывод текста

Для вывода программы приветствия, воспользуйтесь скриптом:

hello-amperka.js
// создаём переменную для работы с дисплеем
// HD44780 — контроллер монохромных жидкокристаллических знакосинтезирующих дисплеев
var lcd = require("HD44780").connect(P11,P12,P5,P4,P3,P2);
// печатем первую строку
lcd.print("Hello world");
// устанавливаем курсор в колонку 0, строку 1
// на самом деле это вторая строка, т.к. нумерация начинается с нуля
lcd.setCursor(, 1);
// печатаем вторую строку
lcd.print("Do It Yourself");

Кирилица

Вывод кирилицы на дисплей с помощью платформы Iskra JS доступен через встроенную в дисплей таблицу знакогенератора.

Таблица знакогенератора

Дисплейный модуль хранит в памяти две страницы знакогенератора, которые состоят из различных символов и букв.

Для вывода символа на дисплей необходимо передать его номер в шестнадцатеричной системе из таблицы знакогенератора.

Так букве соответствует код в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности встроить в строку код символа:

lcd.print("\xB1ndex");

Вы можете смешивать в одной строке обычные символы и явные коды как угодно. Единственный нюанс в том, что после того, как компилятор в строке видит последовательность , он считывает за ним все символы, которые могут являться разрядами шестнадцатеричной системы даже если их больше двух. Из-за этого нельзя использовать символы из диапазона и следом за двузначным кодом символа, иначе на дисплее отобразится неправильная информация. Чтобы обойти этот момент, можно использовать тот факт, что две строки записанные рядом склеиваются.

Сравните две строки кода для вывода надписи «Яeee»:

lcd.print("\xB1eee"); // ошибка
lcd.print("\xB1"+"eee"); // правильно

Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:

hello-amperka-rus.js
// создаём переменную для работы с дисплеем
// HD44780 — контроллер монохромных жидкокристаллических знакосинтезирующих дисплеев
var lcd = require("HD44780").connect(P11,P12,P5,P4,P3,P2);
// устанавливаем курсор в колонку 5, строку 0
// на самом деле это первая строка, т.к. нумерация начинается с нуля
lcd.setCursor(5, );
// печатаем первую строку
lcd.print("\xA8"+"p"+"\xB8\xB3"+"e\xBF");
// устанавливаем курсор в колонку 3, строку 1
// на самом деле это вторая строка, т.к. нумерация начинается с нуля
lcd.setCursor(3, 1);
// печатаем вторую строку
lcd.print("o\xBF"+" A\xBC\xBE"+"ep\xBA\xB8");;

Переключение страниц знакогенератора

Дисплейный модуль хранит в памяти две страницы знакогенератора. По умолчанию установлена нулевая страница. Для переключения между страницами используйте методы:

// переключение с нулевой страницы на первую
command(0x101010);
// переключение с первой страницы на нулевую
command(0x101000);

Дисплей не может одновременно отображать символы разных страниц.

Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.

change-page.js
// создаём переменную для работы с дисплеем
// HD44780 — контроллер монохромных жидкокристаллических знакосинтезирующих дисплеев
var lcd = require("HD44780").connect(P11,P12,P5,P4,P3,P2);
// создаём переменную состояния
var state = false;
// устанавливаем курсор в колонку 5, строку 0
// на самом деле это первая строка, т.к. нумерация начинается с нуля
lcd.setCursor(5, );
// печатаем первую строку
lcd.print("\x9b\x9c\x9d\x9e\x9f");
 
setInterval(function() {
  // каждую секунду меняем переменую состояния
  state = !state;
  // вызываем функцию смены адреса страницы
  lcdChangePage();
}, 1000);
 
function lcdChangePage () {
  if (state) {
    // устанавливаем 0 станицу знакогенератора (стоит по умолчанию) 
    lcd.write(0b101000, 1);
  } else {
    // устанавливаем 1 станицу знакогенератора
    lcd.write(0b101010, 1);
  }
}

Полную таблицу символов с кодами можно найти в документации к экрану.

Технические характеристики дисплея Nokia 5110

Перед подключением дисплея и программированием Arduino давайте рассмотрим общую информацию о нем.

Распиновка

Для подключения и передачи данных на дисплее используются два параллельных ряда 8 коннекторов. На задней части дисплея нанесены обозначения каждого пина.

Как уже было сказано, пины параллельно соединены между собой. Информация о назначении каждого коннектора приведена ниже.

Питание

Вы уже обратили внимание, что на LCD дисплее 5110 два коннектора для питания. Первый — самый важный — питание логики дисплея

В datasheet указано, что оно должно выбираться в диапазоне 2.7 — 3.3 В. В нормальном режиме работы дисплей будет потреблять от 6 до 7 мА.

Второй коннектор питания предназначен для подсветки дисплея. Если вы снимете сам дисплей с платы (это делать не обязательно, можно просто посмотреть на рисунок ниже), вы увидите, что подсветка реализована очень просто : четыре белых светодиода, которые расположены по углам платы

Обратите внимание, что токоограничивающих резисторов нет

Так что с питанием надо быть аккуратнее. Можно использовать токоограничивающий резистор при подключении пина ‘LED’ или использовать максимальное напряжение питания 3.3 В. Не забывайте, что светодиоды могут поглощать большие токи! Без ограничения, они потянут около 100 мА при напряжении питания 3.3 В.

Управляющий интерфейс

В дисплее встроен контроллер: Philips PCD8544, который преобразовывает массивный параллельный интерфейс в более удобный серийный. PCD8544 управляется помощью синхронным серийным протоколом, который подобен SPI

Обратите внимание, что есть пины счетчика времени (SCLK) и ввода серийных данных (DN), а также активный-low выбор чипа (SCE)

Выше рассмотренных серийных коннекторов установлен еще один коннектор – D/C, по которому поступает информация о том, могут ли быть отображены данные, которые передаются.

Комплектующие

Мы собираемся связать ЖК-дисплей Nokia 5110 и Arduino. Вы изучите интерфейс Nokia 5110 Arduino с помощью двух примеров.

Во-первых, мы просто покажем некоторые данные на экране, а во втором примере мы будем читать с датчика температуры и влажности DHT22 показатели и покажем их на ЖК-экране Nokia 5110.

Nokia 5110 LCD — отличный выбор для отображения данных. Это дешевле обычных ЖК и его очень легко использовать с микроконтроллерами. Вам просто нужно подключить несколько проводов и всё готово к работе.

Для подключения Nokia 5110 к Ардуино нам нужны будут сам экран с микроконтроллером и еще ряд деталей.

  • Arduino UNO × 1
  • Nokia 5110 LCD × 1
  • Многооборотный прецизионный потенциометр — 1 кОм (25 витков) × 1
  • Резистор 10 кОм × 4
  • Резистор 1 кОм × 1
  • Резистор 330 Ом × 1
  • Перемычки × 1
  • Макет (универсальный) × 1

Дополнительно нам понадобится программное обеспечение в виде Arduino IDE, с которым вы скорее всего знакомы.

Игра на Ардуино с дисплеем LCD I2C

Для этого проекта нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • жидкокристаллический дисплей с I2C;
  • одна тактовая кнопка и резистор;
  • пьезодинамик;
  • провода «папа-папа», «папа-мама».


Arduino Game. Схема сборки игры на Ардуино

Вместо подключения кнопки к Ардуино через резистор на макетной плате можно использовать модуль с кнопкой. Пьезодинамик (пьезоизлучатель) подключается к плате при желании, можно обойтись и без него. Соберите схему, как на картинке выше, и загрузите следующий скетч. Скачать программу для игры «Дракончик» на Arduino с жк дисплеем можно здесь. Скорость игры и звуки можно изменить в программе.

Скетч для игры «Дракончик» на дисплее

#include <Wire.h>                             // библиотека для протокола IIC
#include <LiquidCrystal_I2C.h>        // подключаем библиотеку LCD IIC
LiquidCrystal_I2C LCD(0x27, 20, 2); // присваиваем имя lcd для дисплея

int level = 1;       // переменная для отсчета уровня
int pause = 400; // переменная для задержки
byte p = 0;          // переменная для времени прыжка

// создаем массивы дракончика, дерева, камня и птицы
byte dracon = {
 0b01110, 0b11011, 0b11111, 0b11100, 0b11111, 0b01100, 0b10010, 0b11011
};
byte derevo = {
 0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b11011, 0b01100, 0b01100
};
byte kamen = {
 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b11111
};
byte ptica = {
 0b00100, 0b00101, 0b01111, 0b11111, 0b10100, 0b00100, 0b00000, 0b00000
};

void setup() {
 pinMode (10, OUTPUT); // подключаем пьезодинамик
 pinMode (A1, INPUT);     // подключаем кнопку
 analogWrite(A1, LOW);
 LCD.init();                        // инициализация LCD дисплея
 LCD.backlight();              // включение подсветки дисплея

 // создаем символы дракончика, дерева, камня и птицы
 LCD.createChar(0, dracon);
 LCD.createChar(1, derevo);
 LCD.createChar(2, kamen);
 LCD.createChar(3, ptica);

 // начинаем игру: выводим надпись GO!
 LCD.setCursor(7, 0);
 LCD.print("GO!");
 delay(400);
 tone(10, 600);
 delay(100);
 noTone(10);
 LCD.clear();
}

void loop() {
  // первоначальное положение дракончика и препятствия
  byte d = 1;
  byte x = 15;
  byte y = 1;
  // выбираем препятствие, которое появится, рандомно
  byte i = random (1, 4);
  if (i == 3) y = 0;
  else y = 1;

  while (x > 0) {
    // очищаем экран и выводим номер уровня
    LCD.clear();
    LCD.setCursor(0, 0);
    LCD.print(level);

    // считываем данные с кнопки и учитываем количество циклов в прыжке
    // если дакончик находится в прыжке долго - возвращаем его вниз
    if (digitalRead(A1) == LOW) d = 1;
    if (digitalRead(A1) == HIGH) d = 0;
    if (p > 3) d = 1;

    // выводим дракончика в нужной строке
    LCD.setCursor(4, d);
    LCD.print(char(0));
    // выводим препятствие
    LCD.setCursor(x, y);
    tone(10, 50);
    LCD.print(char(i));
    noTone(10);

    // если дракончик наткнулся на препятствие выводим надпись GAME OVER!
    if (x == 4 && y == d) {
      delay(400);
      tone(10, 50);
      delay(100);
      noTone(10);
      delay(100);
      tone(10, 20);
      delay(300);
      noTone(10);
      LCD.clear();
      delay(200);
      LCD.setCursor(3, 0);
      LCD.print("GAME OVER!");
      delay(600);
      LCD.clear();
      delay(400);
      LCD.setCursor(3, 0);
      LCD.print("GAME OVER!");
      delay(600);
      LCD.clear();
      LCD.setCursor(3, 1);
      LCD.print("LEVEL: ");
      LCD.print(level);
      delay(400);
      LCD.setCursor(3, 0);
      LCD.print("GAME OVER!");
      delay(3000);
      LCD.clear();

      // начинаем игру заново, обнулив уровень игры
      LCD.setCursor(7, 0);
      LCD.print("GO!");
      delay(400);
      tone(10, 600);
      delay(100);
      noTone(10);
      LCD.clear();

      level = 0;
      pause = 400;
      p = 0;
      y = 1;
      x = 0;
      break;
    }

    // если дракончик прыгнул, издаем звук
    if (d == 0) { tone(10, 200); delay(100); noTone(10); }
    else { delay(100); }

    // если дракончик не столкнулся, то меняем положение препятствия
    // начинаем считать сколько циклов дракончик находится в прыжке
    delay(pause);
    x = x - 1;
    p = p + 1;
    if (p > 4) p = 0; 
 }

  // переходим на следующий уровень и сокращаем время задержки
  tone(10, 800);
  delay(20);
  level = level + 1;
  pause = pause - 20;
  if (pause < 0) pause = 0;
}

Элементы платы

Дисплей

Дисплей MT-16S2H-I умеет отображать все строчные и прописные буквы латиницы и кириллицы, а также типографские символы. Для любителей экзотики есть возможность создавать собственные иконки.

Экран выполнен на жидкокристаллической матрице, которая отображает 2 строки по 16 символов. Каждый символ состоит из отдельного знакоместа 5×8 пикселей.

Контроллер дисплея

Матрица индикатора подключена к встроенному чипу КБ1013ВГ6 с драйвером расширителя портов, которые выполняют роль посредника между экраном и микроконтроллером.

Контроллер КБ1013ВГ6 аналогичен популярным чипам зарубежных производителей HD44780 и KS0066, что означает совместимость со всеми программными библиотеками.

I²C-расширитель

Для экономии пинов микроконтроллера на плате дисплея также распаян дополнительный преобразователь интерфейсов INF8574A: микросхема позволит общаться экрану и управляющей плате по двум проводам через интерфейс I²C.

Контакты подключения

На плате дисплея выведено 18 контактов для подведения питания и взаимодействия с управляющей электроникой.

Вывод Обозначение Описание
1 GND Общий вывод (земля)
2 VCC Напряжение питания (5 В)
3 VO Управление контрастностью
4 RS Выбор регистра
5 R/W Выбор режима записи или чтения
6 E Разрешение обращений к индикатору (а также строб данных)
7 DB0 Шина данных (8-ми битный режим)(младший бит в 8-ми битном режиме)
8 DB1 Шина данных (8-ми битный режим)
9 DB2 Шина данных (8-ми битный режим)
10 DB3 Шина данных (8-ми битный режим)
11 DB4 Шина данных (8-ми и 4-х битные режимы)(младший бит в 4-х битном режиме)
12 DB5 Шина данных (8-ми и 4-х битные режимы)
13 DB6 Шина данных (8-ми и 4-х битные режимы)
14 DB7 Шина данных (8-ми и 4-х битные режимы)
15 LED+ Питания подсветки (+)
16 LED– Питания подсветки (–)
17 SDA Последовательная шина данных
18 SCL Последовательная линия тактированния

Обратите внимания, что физические контакты подсветки экрана и , также интерфейс шины I²C и расположены не в порядком соотношении с другими пинами экрана.

Питание

Экран совместим со всеми контроллерами с логическим напряжением от 3,3 до 5 вольт. Но для питания самого индикатора (пин VCC) необходимо строго 5 вольт

Если в вашем проекте нет линии 5 вольт, обратите внимание на дисплей текстовый экран 16×2 / I²C / 3,3 В.

Интерфейс передачи данных

Дисплей может работать в трёх режимах:

  • 8-битный режим — в нём используются и младшие и старшие биты (-)
  • 4-битный режим — в нём используются только младшие биты (-)
  • I²C режим — данные передаются по протоколу I²C/TWI. Адрес дисплея .

Использовать восьмибитный и четырёхбитный режим в данном дисплее не целесообразно. Ведь главное достоинство этой модели именно возможность подключения через I²C.
Если всё-таки есть необходимость использовать 4-битный или 8-битный режим, читайте документацию на текстовый экран 16×2.

Объединение питания

Для подключения питания к дисплею необходимо пять контактов:

Вывод Обозначение Описание
1 GND Общий вывод (земля)
2 VCC Напряжение питания (5 В)
3 VO Управление контрастностью
15 LED+ Питания подсветки (+)
16 LED– Питания подсветки (–)

Но если запаять перемычки и на обратной стороне дисплея, количество контактов питания можно сократить до трёх, объединив цепь питания и подсветки дисплея.

Мы взяли этот шаг на себя и спаяли перемычки самостоятельно.

Выбор адреса

Используя шину можно подключить несколько дисплеев одновременно, при этом количество занятых пинов останется прежним.

Для общения с каждым дисплеем отдельно, необходимо установить в них разные адреса. Для смены адреса на обратной стороне дисплея установлены контактные площадки , и .

Капнув припоем на контактные площадки, мы получим один из семи дополнительных адресов:

  • нет припоя, соответственно нет электрического контакта.
  • есть припой, соответственно есть электрический контакт.
J2 J1 J0 Адрес
L L L 0x38
L L H 0x39
L H L 0x3A
L H H 0x3B
H L L 0x3C
H L H 0x3D
H H L 0x3E
H H H 0x3F

Исходный код программы

Чтобы в программе подключить ЖК дисплей к ARDUINO UNO, необходимо сделать следующие несколько вещей:

Arduino

#include <LiquidCrystal.h>
lcd.begin(16, 2);
LiquidCrystal lcd(0, 1, 8, 9, 10, 11);
lcd.print(«hello, world!»);

1
2
3
4

#include <LiquidCrystal.h>

lcd.begin(16,2);

LiquidCrystallcd(,1,8,9,10,11);

lcd.print(«hello, world!»);

В первую очередь мы должны подключить заголовочный файл (‘#include <LiquidCrystal.h>’), в котором находятся все необходимые инструкции для взаимодействия с ЖК дисплеем, что значительно упростит взаимодействие с ним в 4 битном режиме. Используя этот заголовочный файл нам не нужно будет передавать в ЖК дисплей бит за битом и нам не нужно будет самим программировать какие-либо функции для взаимодействия с ЖК дисплеем.

Во второй строчке мы должны сказать плате ARDUINO UNO какой тип ЖК дисплея мы собираемся использовать, поскольку существует достаточно большое число типов подобных дисплеев, например, 20×4, 16×2, 16×1 и т.д. В нашем проекте мы собираемся подключать к ARDUINO UNO ЖК дисплей 16х2, поэтому мы и должны записать команду ‘lcd.begin(16, 2);’. А если бы мы подключали ЖК дисплей 16х1, то в этом случае изменилась бы и команда соответствующим образом — ‘lcd.begin(16, 1);’.

В следующей инструкции мы сообщаем плате ARDUINO UNO к каким контактам мы подсоединили ЖК дисплей. В нашем случае мы использовали контакты ЖК дисплея “RS, En, D4, D5, D6, D7”, которые подсоединены к контактам «0, 1, 8, 9, 10, 11» ARDUINO UNO, поэтому и приведенная команда выглядит следующим образом — “LiquidCrystal lcd(0, 1, 8, 9, 10, 11);”.

Для того, чтобы напечатать на экране дисплея строку символов, мы использовали команду lcd.print(«hello, world!»), которая выводит на экран дисплея строку ‘hello, world!’.

Как мы видим из представленного кода, нам не нужно заботиться больше ни о каких аспектах взаимодействия с ЖК дисплеем, нам нужно просто инициализировать ЖК дисплей в программе и тогда плата ARDUINO UNO будет готова к отображению информации на экране дисплея.

Далее представлен исходный код программы (с комментариями) для взаимодействия платы ARDUINO UNO с ЖК дисплеем 16х2.

Arduino

#include <LiquidCrystal.h> // инициализируем библиотеку для взаимодействия с ЖК дисплеем
LiquidCrystal lcd(0, 1, 8, 9, 10, 11); /// сообщаем Arduino номера контактов, к которым подключен ЖК дисплей — REGISTER SELECT PIN,ENABLE PIN,D4 PIN,D5 PIN, D6 PIN, D7 PIN
void setup()
{
// устанавливаем число столбцов и строк для ЖК дисплея
lcd.begin(16, 2);
}

void loop()
{
// устанавливаем курсор в нулевой столбец первой строки
lcd.print(» CIRCUIT DIGEST»); //печатаем строку
lcd.setCursor(0, 1); // устанавливаем курсор в нулевой столбец второй строки
lcd.print(«http://www.circuitdigest.com/»);//печатаем строку
delay(750); //задержка на 0.75 сек
lcd.scrollDisplayLeft();// переключаем данные на ЖК дисплее
lcd.setCursor(0, 0);// устанавливаем курсор в нулевой столбец первой строки
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

#include <LiquidCrystal.h> // инициализируем библиотеку для взаимодействия с ЖК дисплеем

LiquidCrystallcd(,1,8,9,10,11);/// сообщаем Arduino номера контактов, к которым подключен ЖК дисплей — REGISTER SELECT PIN,ENABLE PIN,D4 PIN,D5 PIN, D6 PIN, D7 PIN

voidsetup()

{

// устанавливаем число столбцов и строк для ЖК дисплея  

lcd.begin(16,2);

}

voidloop()

{

// устанавливаем курсор в нулевой столбец первой строки  

lcd.print(»   CIRCUIT DIGEST»);//печатаем строку

lcd.setCursor(,1);// устанавливаем курсор в нулевой столбец второй строки  

lcd.print(«http://www.circuitdigest.com/»);//печатаем строку

delay(750);//задержка на 0.75 сек

lcd.scrollDisplayLeft();// переключаем данные на ЖК дисплее

lcd.setCursor(,);// устанавливаем курсор в нулевой столбец первой строки  

}

Пример №2

Во втором примере мы подключим датчик температуры и влажности DHT22 к Arduino и с помощью DHT22 будем считывать температуру, влажность и тепловой индекс. Затем мы покажем эти данные на ЖК-дисплее Nokia 5110. Принципиальная схема интерфейса Nokia 5110, Arduino и DHT22 приведена ниже.

Схема соединения

Соединения ЖК-дисплея Nokia 5110 с Arduino описаны в первом примере. Соедините контакты датчика DHT22 с Arduino, как показано на схеме выше:

  • Контакт 1 DHT22 на 5В Arduino.
  • Контакт 2 DHT22 к контакту 8 Arduino.
  • Контакт 4 DHT22 к контакту заземления Arduino.

Если вы хотите узнать больше о взаимодействии DHT с Arduino, прочитайте наш урок Датчик температуры и влажности DHT22.

Код

Скачайте библиотеки Nokia 5110 и DHT ниже.

Код для второго примера ниже:

#include <PCD8544.h>
#include "DHT.h"
#define DHTPIN 8
#define DHTTYPE DHT22
PCD8544 lcd;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
   lcd.begin(84, 48);
   dht.begin();
}
void loop() {
    lcd.clear();
    float hum = dht.readHumidity();
    float temp = dht.readTemperature();         //Reading the temperature in degrees
    float fah = dht.readTemperature(true);      //Reading the temperature in fahrenheit
    if (isnan(hum) || isnan(temp) || isnan(fah)) {      //Checking if the arduino have recieved the values or not
     lcd.println("Failed to read from DHT sensor!");
     return;
}
  float heat_index = dht.computeHeatIndex(fah, hum);    //Reading the heat index in fahrenheit
  float heat_indexC = dht.convertFtoC(heat_index);      //Reading the heat index in degrees
  lcd.setCursor(0, 0);
  lcd.print("Humi: ");
  lcd.print(hum);
  lcd.print(" %\t");
  lcd.setCursor(0, 1);
  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.print(" *C ");
  lcd.setCursor(0,2);
  lcd.print("Temp: ");
  lcd.print(fah);
  lcd.print(" *F\t");
  lcd.setCursor(0,3);
  lcd.print("Hi: ");
  lcd.print(heat_indexC);
  lcd.print(" *C ");
  lcd.setCursor(0,4);
  lcd.print("Hi: ");
  lcd.print(heat_index);
  lcd.println(" *F ");
  delay(2000);
 }

Прежде всего, мы включили библиотеки для Nokia 5110 LCD и датчика температуры и влажности DHT22. После этого мы инициализировали контакт 8 для DHT22 (DHTPIN 8) и определили тип датчика DHT. Также доступны другие модели датчиков DHT, но мы использовали DHT22 из-за его высокой точности. Затем мы объявили переменную «lcd» типа PCD8544 для ЖК-дисплея и переменную «dht» типа DHT для датчика DHT22.

#include <PCD8544.h>
#include "DHT.h"
#define DHTPIN 8
#define DHTTYPE DHT22
PCD8544 lcd;
DHT dht(DHTPIN, DHTTYPE);

Затем в функции настройки setup мы установили разрешение для Nokia 5110 LCD. ЖК-дисплей Nokia5110 имеет разрешение 84х48, поэтому мы установили разрешение 84х48 в Arduino IDE. После этого мы начали получать данные с датчика DHT22 с помощью команды dht.begin().

lcd.begin(84, 48);
dht.begin();

В функции цикла loop мы читаем значения влажности, температуры и индекса тепла из DHT22 и сохраняем в переменных. В конце мы напечатали их на ЖК-экране Nokia 5110.

float hum = dht.readHumidity();
float temp = dht.readTemperature();
float fah = dht.readTemperature(true);
.
.
.
lcd.setCursor(0,4);
lcd.print("Hi: ");
lcd.print(heat_index);
lcd.println(" *F ");

Подключение LCD1602 к Arduino

Модуль оборудован четырех-пиновым разъемом стандарта 2.54мм

  • SCL: последовательная линия тактирования (Serial CLock)
  • SDA: последовательная линия данных (Serial DAta)
  • VCC: «+» питания
  • GND: «-» питания

Выводы отвечающие за интерфейс I2C на платах Arduino на базе различных контроллеров разнятся

Arduino Mega Arduino Uno/Nano/Pro Mini LCD I2C модуль Цвет проводов на фото
GND GND GND Черный
5V 5V VCC Красный
20 (SDA) A4 SDA Зелёный
21 (SCL) A5 SCL Жёлтый

Пример скетча

/*
Добавляем необходимые библиотеки
*/
#include <LiquidCrystal_I2C.h>

/*
Устанавливаем ЖК-дисплей по адресу 0x27, 16 символов и 2 строки
*/
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{
/*
Инициализируем ЖК-дисплей
*/
lcd.init();
/*
Включаем подсветку дисплея
*/
lcd.backlight();
/*
Устанавливаем курсор на первую строку и нулевой символ.
*/
lcd.setCursor(0, 0);
/*
Выводим на экран строку
*/
lcd.print(» micro-pi.ru «);
}

void loop()
{
/*
Устанавливаем курсор на вторую строку и 3 символ.
*/
lcd.setCursor(3, 1);
/*
Выводим на экран количество секунд с момента запуска ардуины
*/
lcd.print(millis() / 1000);
delay(1000);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

/*
  Добавляем необходимые библиотеки
*/
#include <LiquidCrystal_I2C.h>
 
/*
  Устанавливаем ЖК-дисплей по адресу 0x27, 16 символов и 2 строки
*/

LiquidCrystal_I2Clcd(0x27,16,2);

voidsetup()

{

/*

    Инициализируем ЖК-дисплей
  */

lcd.init();

/*

    Включаем подсветку дисплея
  */

lcd.backlight();

/*

    Устанавливаем курсор на первую строку и нулевой символ.
  */

lcd.setCursor(,);

/*

    Выводим на экран строку
  */

lcd.print(»   micro-pi.ru  «);

}
 
 

voidloop()

{

/*

    Устанавливаем курсор на вторую строку и 3 символ.
  */

lcd.setCursor(3,1);

/*

    Выводим на экран количество секунд с момента запуска ардуины
  */

lcd.print(millis()1000);

delay(1000);

}

Заметки на полях

Первый пример скетча для Arduino: LCD Demo

После благополучного подключения можно переходить к загрузке скетча и отображения данных на дисплее!

Программа для Arduino

Ниже приведена ссылка, по которой вы можете скачать скетч для управления LCD. Копируйте код в Arduino IDE и загружайте на плату:

Комментарии в коде выше должны вам помочь разобраться в программе. Большинство действий происходит в пределах функции lcdFunTime().

Скетч в действии

После загрузки на Arduino, скетч начнет отрабатывать и запустит демо – набор стандартных анимаций и отработку графических функций. Для начала отобразим несколько пикселей. После этого мы перейдем к отображению линий, прямоугольников и кругов, прогрузим растровое изображение и т.п.

После отработки скетча, монитор перейдет в режим передачи данных по серийному протоколу. Откройте серийный монитор (со скоростью передачи данных 9600 бит в секунду). То, что вы напечатаете в серийном мониторе, отобразится на LCD мониторе.

Если вас заинтересовали возможности отображения растровых изображений, читайте дальше. Мы рассмотрим как именно можно импортировать собственное растровое изображение 84х48 и отобразить его на экране.

Установка библиотеки LiquidCrystal I2C

Для работы с данным модулем необходимо установить библиотеку LiquidCrystal I2C. Скачиваем, распаковываем и закидываем в папку libraries в папке Arduino. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.

Библиотеку можно установить из самой среды следующим образом:

  1. В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Управлять библиотеками…
  2. В строке поиска вводим «LiquidCrystal I2C», находим библиотеку Фрэнка де Брабандера (Frank de Brabander), выбираем последнюю версию и кликаем Установить.
  3. Библиотека установлена (INSTALLED).

Проблемы подключения LCD1602 к Arduino по I2C

Если после загрузки скетча у вас не появилось никакой надписи на дисплее, попробуйте выполнить следующие действия:

  1. Можно регулировать контрастность индикатора потенциометром. Часто символы просто не видны из-за режима контрастности и подсветки.
  2. Проверьте правильность подключения контактов, подключено ли питание подсветки. Если вы использовали отдельный I2C переходник, то проверьте еще раз качество пайки контактов.
  3. Проверьте правильность I2C адреса. Попробуйте сперва поменять в скетче адрес устройства с 0x20 до 0x27 для PCF8574 или с 0x38 до 0x3F для PCF8574A. Если и это не помогло, можете запустить скетч I2C сканера, который просматривает все подключенные устройства и определяет их адрес методом перебора. Для изменения адресации необходимо установить джамперы в нужное положение, тем самым притянуть выводы A0, A1, A2 к положительному либо отрицательному потенциалу. На плате положения промаркированы.
  4. Если экран все еще останется нерабочим, попробуйте подключить LCD обычным образом.

Общие сведения

Большую часть модуля занимает ЖК дисплей, марки LCD 1602 с синей подсветкой, передача данных осуществляется по 4-битному режиму, подробнее в этой статье. На нижней части расположены шесть кнопок, пять из-за которых используются для навигации и одна кнопка дублирует reset. В верхнем левом углу установлен потенциометр, необходимый для регулировки контрастности ЖК дисплея. Так как LCD keypad shield устанавливается на плату Arduino свеху и фактически занимает разъемы, на модуле расположены дополнительные отверстия, для впаивания проводов или разъемов (на отдельную колодку. выведен интерфейс ICSP).
Из принципиальной схемы, можно увидеть, что база транзистора отвечающая за подсведку модуля подключена к выводу 10 платы Arduino, следовательно, можно отключать ее.

Принцип работы кнопок  
Кнопки располагаются в удобном порядке — вверх, вниз, влево, вправо, и SELECT. Все кнопки подключены к одному аналоговому входу «A0» используя цепочку резисторов, которые выдают разное опорное напряжение для «А0» при нажатии любой кнопки. На рисунке показана часть принципиальной схема LCD keypad shield

Их принциписальной схемы видно, если кнопки не нажаты напряжение на «A0» через резистор R2 (2кОм) будет 5В. Другие резисторы не влияют на схему, а при чтении аналогового вывода «A0» будет параметр на верхнем приделе 1023 (или приблизительно). Теперь рассмотрим, что произойдет, если будет нажата кнопка «Вниз». На выводе «А0» будет напряжением, которое разделено между резистором R2 (2кОм) которое подтянуто к +5В и резисторами R3 (330ОМ) и R4 (620Ом) общий суммой 950Ом, которые пытаются тянуть его вниз к 0В. Напряжения на «A0» будет составлять порядка 1.61В, это означает, что если выполнить команду analogRead () на A0, будет возвращено значение около 306, что означает нажатие кнопки «Вниз»
Такой же принцип применим и для других кнопок, напряжением и значение analogRead (), можно посмотреть ниже:

Напряжением и значение analogRead► RIGNT: 0.00В: 0 — 8 bit; 0 — 10 bit
► UP: 0.71В: 36 — 8 bit; 145 — 10 bit
► DOWN: 1.61В: 82 — 8 bit; 306 — 10 bit
► LEFT: 2.47В: 126 — 8 bit; 505 — 10 bit
► SELECT: 3.62В: 185 — 8 bit; 741 — 10 bit

Это позволяет сэкономить целый набор выводов и использовать их для более нужного использования. Принципиальная схема LCD keypad shield, показана на рисунке ниже.

Назначение выводов► A0: Вывод кнопок
► D4: LCD — DB4
► D5: LCD — DB5
► D6: LCD — DB6
► D7: LCD — DB7
► D8: LCD – RS
► D9: LCD Enable
► D10: LCD – отключение подсветки дисплея

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий