Arduino Pro Mini + i2c + lcd 2004 (20x4)

Долгая и муторная эпопея подключения arduino к lcd по i2c закончилась победой.
Небольшой мануал на тему "как это сделать", так как информации в интернете много, а в целом не всегда все сразу получается. Начнем.

Шаг 1.
Подключаем дисплей как указано на картинке:

А именно: SDA к A4, SCL к A5, vcc к vcc, gnd к gnd. Желательно, конечно, отдельно подавать питание на дисплей, но питания от ардуино в данном случае хватит.
Возможно у вас могут быть перепутаны ноги SDA\SCL или A5\A4 на вашей плате или перепутаны подписи к ним. С этим позже разберемся.

Шаг 2.
Надо найти адрес нашего монитора. Так как на i2c шине может быть подключено до 127 устройств параллельно, то у каждого устройства должен быть свой адрес. Для этого воспользуемся i2c сканером. В интернете их великое множество, я использовал такой:


#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  while (!Serial); 
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }   
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}


Заливаем этот скетч в ардуино и запускаем. Ждем результата в консоли в виде


I2C Scanner
Scanning...
I2C device found at address 0x3F


Если все именно так и получилось в консоли, то значит все подключено правильно и ничего не перепутано. Записываем адрес монитора, в моем случае это 0x3F.
Если же у вас ошибки или сканирование просто повисло (более 5 секунд ничего не пишет), то скорее всего у вас перепутаны ноги SDA\SCL (ну или A5\A4), потому просто берем и меняем из местами либо на ардуино, либо на мониторе. Запускаем сканер еще раз!

Внимание! Будьте внимательны и убедитесь, что скетч заливается нормально, то есть arduino ide выдает "Загрузка завершена" без ошибок в консоли. Иначе пробуйте залить снова.

Шаг 3.
Пробуем что нибудь вывести на дисплее.
Для этого нам понадобится библиотека LiquidCrystal_I2C.
Ее можно поставить, как из Arduino Ide (Меню->Скетч->Подключить библиотеку->Управлять библиотеками), так и из Git. Я рекомендую вариант из Git - https://github.com/agnunez/ESP8266-I2C-LCD1602 . Это немного пропатченная библиотека.

Теперь берем скетч, типа этого:


#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

// Set the LCD address to 0x27 for a 16 chars and 2 line display
// Arduino UNO => PIN 4 = SCL, PIN 5 = SDA
// NodeMCU Dev Kit => D1 = SCL, D2 = SDA
LiquidCrystal_I2C lcd(0x3F, 20, 4);

void setup()
{
  // initialize the LCD
  lcd.begin();

}

void loop()
{
  lcd.print("Hello LCD Line 1");
        lcd.setCursor(0, 1);
  lcd.print("Hello LCD Line 2");
        lcd.setCursor(0, 2);
  lcd.print("Hello LCD Line 3");
        lcd.setCursor(0, 3);
  lcd.print("Hello LCD Line 4");
  delay(4000);
}


Заливаем его в ардуино и смотрим на дисплей. Если все получилось и надписи видны - круто.
Если нет, то крутим потенциометр:

 Крутим его в одну сторону до упора и в другую, настраивая таким образом яркость\контрастность дисплея. У меня он изначально был в самом крайнем положении (в 0) и я долго не мог понять, почему у меня не выводится текст.

На этом пожалуй все.

Комментарии

Популярные сообщения из этого блога

Сброс пароля на камере Besder

Мерцание и рябь внешнего монитора