Работа с жидкокристаллическим дисплеем OLED 128x64 I2C (0.96 дюйма)
Цель работы
Научиться использовать жидкокристаллический дисплей OLED 0.96 дюйма с платами типа Arduino
Задачи работы
- Установить библиотеку для работы с дисплеем OLED 128x64 I2C (контроллер SSD1306)
- Собрать установку и разработать скетч для Arduino для вывода на ЖК дисплей показаний датчиков давления BMP180 и влажности DHT
Инструменты для выполения работы
- Компьютер с подключением к сети Internet
- Плата NodeMCU ESP-12e V3 с USB интерфейсом
Теоретическая часть
В OLED (Organic Light-Emitting Diode) дисплеях используется технология в которой светодиоды сами излучают свет без дополнительного подсвечивания как например в LCD дисплеях. Дисплей OLED состоит из тонкой многослойной органической пленки, помещенной между анодом и катодом. OLED обладает высоким потенциалом применения практически для всех типов дисплеев и рассматривается в качестве конечной технологии для следующего поколения плоских дисплеев.
Особенности OLED I2C дисплея
Не требуется подсветка дисплея
Высокое разрешение: 128x64 пикселей.
Угол обзора: больше 160 градусов.
Полностью совместим с Arduino, контроллерами 51 серии, MSP430 серии, STM32 / 2, КСО IC и т.д.
Ультра-низкое энергопотребление: при полном свечении экрана 0.08W
Рабочее напряжение: 3V ~ 5 В постоянного тока.
Рабочая температура: -30 C ~ 70 C.
I2C / IIC интерфейс, нужно только 2 провода.
Драйвер IC: SSD1306.
Размер платы: 2.7см х 2.8см.
Размер дисплея: 2.7см х 1,95см (0,96″ дюйма)
Подключение OLED I2C дисплея
VCC —– +5v (+5 вольт)
GND —– GND (земля)
SDA —– pin SDA (pin A4 для Arduino nano V3; pin D2 для NodeMCU V3)
SCL —– pin SCL (pin A5 для Arduino nano V3; pin D1 для NodeMCU V3)
Библиотеки для OLED I2C дисплея
Для работы с дисплеем OLED I2C существуют библиотеки от разных авторов, вот несколько:
1. от Adafruit (требуется установка обеих библиотек) - Adafruit GFX и Adafruit SSD1306
2. от Oscar Liang - OzOLED
3. "Seeed OLED Display 128*64 library" от Seeed-Studio.
Мы будем использовать последнюю (п.3).
Выполнение работы
Установка библиотек для работы с датчиками и дисплеем
Создаем новый скетч и сохраняем его с названием OledAndSensors. Проверяем, правильно ли выбрана плата и порт.
Скачиваем архив с библиотекой для работы с дисплеем по ссылке: https://github.com/Seeed-Studio/OLED_Display_128X64/archive/master.zip
Устанавливаем библиотеку через менеджер библиотек: выбираем пункт меню "Скетч -> Управление библиотеками -> Добавить .ZIP библиотеку" и находим скачанный архив OLED_Display_128X64-master.zip.
Загружаем библиотеки для работы с датчиками BMP180 ("Adafruit BMP085 Unified"), DHT ("DHT sensor library") через менеджер библиотек. Подключаем библиотеку для работы с дисплеем "Grove - OLED Display 0.96".
Сборка установки и разработка скетча для Arduino
Подключаем датчики DHT и BMP180 как это делалось в предыдущих работах.
Подключаем OLED дисплей к I2C пинам платы NodeMCU. Так как датчик BMP180 так же подключается по шине I2C - выполняем их параллельное подключение, т.е. к тем же контактам.
В функции setup() инициальзируем дисплей, очищаем его и выводим текст приветствия.
// Init OLED Display
SeeedOled.sendCommand(0xA8); // Multiplex ratio
SeeedOled.sendCommand(0x3F); // ^ от 16 до 64
SeeedOled.sendCommand(0xD3); // Смещение изображения на дисплее (Offset)
SeeedOled.sendCommand(0x00); // ^ Offset
SeeedOled.sendCommand(0x40); // Установка начальной строки в RAM
SeeedOled.sendCommand(0xA1); // Развертка: А0 - справа/налево; А1 - слева/направо.
SeeedOled.sendCommand(0xC8); // 0хC8 – данные выводятся построчно сверху вниз, 0хС0 – снизу вверх
SeeedOled.sendCommand(0xDA); // Конфигурация COM
SeeedOled.sendCommand(0x12); // ^
SeeedOled.sendCommand(0x81); // Set Brightness
SeeedOled.sendCommand(0x7F); // ^ Brightness
SeeedOled.sendCommand(0xA4); // output ram to display
SeeedOled.sendCommand(0xA6); // none inverted normal display mode
SeeedOled.sendCommand(0xD5); // Частота обновления экрана
SeeedOled.sendCommand(0x80); // ^ Частота
SeeedOled.sendCommand(0x8D); // Управление внутренним преобразователем
SeeedOled.sendCommand(0x14); // ^ 0х10 - отклычить (Vcc внешнее); 0х14 - включить (внутренний DC/DC)
SeeedOled.sendCommand(0xAF); // Включить дисплей
SeeedOled.init(); //initialze SEEED OLED display
SeeedOled.clearDisplay(); //clear the screen and set start position to top left corner
SeeedOled.setNormalDisplay(); //Set display to normal mode (i.e non-inverse mode)
SeeedOled.setPageMode(); //Set addressing mode to Page Mode
SeeedOled.setTextXY(0,0); //Set the cursor to Xth Page, Yth Column
SeeedOled.putString("Sensors data"); // здесь можете написать ваш текст
Далее в функции loop() считываем значение давления и температуры с датчика BMP180, выводим их используя функции позиционирования начала вывода и собственно вывода строки на дисплей, пример (значения с датчиков необходимо получить ранее):
SeeedOled.setTextXY(2,0);
SeeedOled.putString("[BMP180]");
SeeedOled.setTextXY(3,0);
SeeedOled.putString( ("Pressure:" + String(event.pressure)).c_str() );
SeeedOled.setTextXY(4,0);
SeeedOled.putString( ("Temp, *C: " + String(temperature)).c_str() );
Считываем значение влажности и температуры с датчика DHT, выводим их аналогично данным с датчика BMP180, только ниже.
Добавляем задержку
delay(1000);
| |
#include <SeeedOLED.h>
#include <DHT.h>
#include <DHT_U.h>
#include <Adafruit_BMP085_U.h>
Adafruit_BMP085_Unified bmp(10085);
DHT_Unified dht(13,DHT11);
void setup() {
// put your setup code here, to run once:
//В функции setup() запускаем последовательный порт
//и инициализируем датчик BMP180
Serial.begin(9600);
bmp.begin();
Serial.begin(9600);
dht.begin();
//инициальзируем дисплей, очищаем его и выводим текст приветствия
SeeedOled.sendCommand(0xA8); // Multiplex ratio
SeeedOled.sendCommand(0x3F); // ^ от 16 до 64
SeeedOled.sendCommand(0xD3); // Смещение изображения на дисплее (Offset)
SeeedOled.sendCommand(0x00); // ^ Offset
SeeedOled.sendCommand(0x40); // Установка начальной строки в RAM
SeeedOled.sendCommand(0xA1); // Развертка: А0 - справа/налево; А1 - слева/направо.
SeeedOled.sendCommand(0xC8); // 0хC8 – данные выводятся построчно сверху вниз, 0хС0 – снизу вверх
SeeedOled.sendCommand(0xDA); // Конфигурация COM
SeeedOled.sendCommand(0x12); // ^
SeeedOled.sendCommand(0x81); // Set Brightness
SeeedOled.sendCommand(0x7F); // ^ Brightness
SeeedOled.sendCommand(0xA4); // output ram to display
SeeedOled.sendCommand(0xA6); // none inverted normal display mode
SeeedOled.sendCommand(0xD5); // Частота обновления экрана
SeeedOled.sendCommand(0x80); // ^ Частота
SeeedOled.sendCommand(0x8D); // Управление внутренним преобразователем
SeeedOled.sendCommand(0x14); // ^ 0х10 - отклычить (Vcc внешнее); 0х14 - включить (внутренний DC/DC)
SeeedOled.sendCommand(0xAF); // Включить дисплей
SeeedOled.init(); //initialze SEEED OLED display
SeeedOled.clearDisplay(); //clear the screen and set start position to top left corner
SeeedOled.setNormalDisplay(); //Set display to normal mode (i.e non-inverse mode)
SeeedOled.setPageMode(); //Set addressing mode to Page Mode
SeeedOled.setTextXY(0,0); //Set the cursor to Xth Page, Yth Column
SeeedOled.putString("Sensors data");// здесь можете написать ваш текст
}
void loop() {
// put your main code here, to run repeatedly:
//считываем значение давления
sensors_event_t event;
bmp.getEvent(&event);
//Выводим давление в hPa
Serial.print("Pressure (hPa): ");
Serial.print(event.pressure);
//Считываем значение температуры
float temperature;
bmp.getTemperature(&temperature);
// считываем значение давления и температуры с датчика BMP180,
//выводим их используя функции позиционирования начала вывода
//и собственно вывода строки на дисплей,
//пример (значения с датчиков необходимо получить ранее
SeeedOled.setTextXY(2,0);//указываем номер строки и первый символ, с которого начинается вывод информации
SeeedOled.putString("[BMP180]");
SeeedOled.setTextXY(3,0);
SeeedOled.putString(("Pres,hPa: " + String(event.pressure)).c_str());
SeeedOled.setTextXY(4,0);
SeeedOled.putString( ("Temp,*C: " + String(temperature)).c_str() );
//delay(5000);
dht.temperature().getEvent(&event);
if(isnan(event.temperature))
Serial.println("Error reading temperature!");
else
{
Serial.print("Temperature:");
Serial.print(event.temperature);
Serial.println(" *C");
}
dht.humidity().getEvent(&event);
if(isnan(event.relative_humidity))
Serial.println("Error reading humidity!");
else
{
Serial.print("Humidity:");
Serial.print(event.relative_humidity);
Serial.println("%");
}
// считываем значение давления и температуры с датчика BMP180,
//выводим их используя функции позиционирования начала вывода
//и собственно вывода строки на дисплей,
//пример (значения с датчиков необходимо получить ранее
SeeedOled.setTextXY(5,0);
SeeedOled.putString("[DHT11]");
SeeedOled.setTextXY(6,0);
SeeedOled.putString(("Humidity,%:" + String(event.relative_humidity)).c_str());
SeeedOled.setTextXY(7,0);
SeeedOled.putString( ("Temp,*C:" + String(temperature)).c_str() );
//Считываем значение влажности и температуры с датчика DHT,
//выводим их аналогично данным с датчика BMP180, только ниже
delay(5000);
}
|