EnglishRussian

I2C: Подключение к Ардуино OLED-дисплея по 2 проводкам

Для выполнения данного примера потребуется:

  • Базовая плата (Arduino, Cosmo Black Start или другие аналоги)
  • Символьный OLED индикатор WEH001602D
  • Микросхема PCF8574
  • Подтягивающие резисторы 1.5 кОм
  • Соедительные провода, макетная плата

Отличительная особенность I2C протокола — это использование всего двух последовательных линий управления — линии данных (SDA) и линии тактирования (SCL).

Обычные ЖК и OLED дисплеи имеют только параллельный интерфейс подключения к микроконтроллеру. Это требует от 7 до 11 свободных портов на микроконтроллере. Зачастую это ни всегда возможно. И в таких случаях целесообразно использовать последовательное подключение.

Для того, чтобы подключить дисплей по последовательному интерфейсу воспользуемся простой 8-битной микросхемой PCF8574. Она одновременно реализует I2C-шину и расширитель параллельных портов ввода/вывода.

Как видно из даташита, к PCF8574 можно подключить до 8 параллельных линий. Мы же воспользуемся лишь 7, т.к подключим OLED-дисплей в 4-битном режиме, как это дается на принципиальной схеме ниже.

Для ЖК-индикаторов оставшийся свободный контакт можно использовать для включения подсветки экрана. Мы же в примере используем OLED-дисплей, поэтому подсветку делать не нужно.

С микросхемы PCF8574 линии I2C нужно подключить к контактам A5 (SCL) и A4 (SDA) Arduino, предварительно поставив на эти линии подтягивающие резисторы по 1.5 кОм. О том как правильно подобрать номинал подтягивающих резисторов рекомендуем почитать тут.

После сбора всей схемки остается написание скетча управления дисплеем. Для примера воспользуемся готовой библиотекой LiquidCrystal_I2C. Последняя версия этой библиотеки написана под обновленную версию Arduino 1.0 IDE.

Скачайте и установите LiquidCrystal_I2C в директории arduino-1.0/libraries. Для использования OLED-дисплея необходимо немного подправить инициализацию в LiquidCrystal_I2C, т. к. у индикаторов winstar несколько отличается инициализация.

Откройте файл LiquidCrystal_I2C.cpp и найдите строчки:

// we start in 8bit mode, try to set 4 bit mode
write4bits(0x03);
delayMicroseconds(4500); // wait min 4.1ms
	
// second try
write4bits(0x03);
delayMicroseconds(4500); // wait min 4.1ms
	
// third go!
write4bits(0x03); 
delayMicroseconds(150);
	
// finally, set to 4-bit interface
write4bits(0x02); 

Замените их на:

write4bits(0x00);
delayMicroseconds(100);
write4bits(0x00);
delayMicroseconds(100);
write4bits(0x00);
delayMicroseconds(100);
write4bits(0x00);
delayMicroseconds(100);
write4bits(0x00); 
delayMicroseconds(150);
	
// finally, set to 4-bit interface
write4bits(0x02);

Теперь запустите Arduino IDE и напишите тестовый скетч «Hello World».

#include <wire.h>
#include <liquidcrystal_i2c.h>

LiquidCrystal_I2C lcd(0x20,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display

void setup()
{
  lcd.init();
  lcd.print("Hello, world!");
}

void loop()
{
  lcd.setCursor(0, 1);
  lcd.print(millis()/1000);
}

Залейте скетч в микроконтроллер, затем выключите и снова включите питание.

Сделаем пример более практичным, отобразим на дисплее температуру. Для этого подключим термодатчик DS18B20 к одному из свободных цифровых портов, например к 8. Скачайте и установите последние версии библиотек OneWire и DallasTemperature.

Далее запишем такой несложный скетч.

#include <onewire.h>
#include <dallastemperature.h>
#include <wire.h> 
#include <liquidcrystal_i2c.h>
#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x20,16,2); 

void setup(void)
{
  lcd.init();
  sensors.begin();
  lcd.print("Temperature: ");
}

void loop(void)
{ 
  sensors.requestTemperatures();
  lcd.setCursor(0, 1);
  lcd.print(sensors.getTempCByIndex(0));
  lcd.print((char)223);
  lcd.print("C ");
  delay(500);
}