воскресенье, 1 мая 2016 г.

Работаем с LCD дисплеем 1602


Всем читателям привет! Рад нашей новой встрече на страницах блога. Спасибо вам что посещаете мои странички. Сегодня мы научимся работать с жидкокристаллическим дисплеем (далее LCD). Так же разберемся с некоторыми проблемами, с которыми вы можете столкнуться. А пока начнём с самого начала.


Несколько важных замечаний:
1.       Дисплеи могут отличаться количеством символов и строк. Например 1602 означает что у нас двухстрочный дисплей с длиной строки в 16 символов. 1604 означает что у нас четерехстрочный дисплей, с длиной строки в 16 символов.
2.       Мы будем работать с дисплеем с I2C модулем, благодаря чему управление LCD дисплеем будет осуществляться двумя проводами (подключенные к А4 и А5), конечно же дисплей нужно будет еще запитать двумя проводами, которые мы подключим к пинам «земля» и «+5В». Благодаря I2C модулю мы избавимся от кучи проводов!
3.       Для записи скетча в плату ардуино, мы будем пользоваться программами старых версий (1.6.4 для «Виндовс 7 или 8» и 1.6.0. для «ХР»). При использовании новой версии 1.6.7 возникает проблема – не все символы (или только один) будут выводиться на экран дисплея. Возможно что в новых версиях эту проблему исправят)… Я предлагаю использовать архив с уже готовой к работе программы (то есть не требует установки на компьютер, это важно если у вас на компостере уже установлена новая версия).
4.       У дисплея может быть другой IIC адрес, вместо 0x27 может оказаться 0x3F. Чтобы точно определить адрес можете воспользоваться «сканером». Просто запишите скетч «сканер» подключите дисплей и включите ардуино. Откройте окно «порта» и посмотрите какой адрес у вашего устройства.
5.       Для работы дисплея мы будем использовать библиотеку LiquidCrystal_I2C. Если вы используете программу из архива, то установка библиотеки не потребуется (она уже имеется в архиве).

// i2c_scanner
#include <Wire.h>
  
void setup()
{
  Wire.begin();
   Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}

 void loop()
{
  byte error, address;
  int nDevices;
   Serial.println("Scanning...");
   nDevices = 0;
  for(address = 1; address < 127; 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("Unknow 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
}


Теперь приступим к сборке схемы. Все очень просто: нам нужно подключить 4 вывода от I2C модуля к плате ардуино. При этом подключаем выводы так: GND — GND, VCC — 5V, SDA — A4, SCL — A5. На картинках и фотографиях все предельно понятно (поэтому в этот раз мы обойдемся без схемы). Благодаря I2C плате мы можем управлять LCD двумя проводами. А вот какбы выглядела наша схема без этой "волшебной" платы:

А теперь самое время записать скетч в плату ардуино. Скетч выведет на экран «R6LCA RadioScout» а в нижней начнет отчет времени в секундах слева, а справа будет «LCD 1602». Сам скетч:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
void setup()
{
  lcd.init();                    
  lcd.backlight();// Включаем подсветку дисплея
  lcd.print("R6LCA RadioScout");
  lcd.setCursor(8, 1);
  lcd.print("LCD 1602");
}
void loop()
{
  // Устанавливаем курсор на вторую строку и нулевой символ.
  lcd.setCursor(0, 1);
  // Выводим на экран количество секунд с момента запуска ардуины
  lcd.print(millis()/1000);

}
Как видите все действительно просто. По крайней мере изучив материал блога, у вас точно все должно получиться. Но не будем останавливаться на таком простом примере. Ведь у нас есть датчик температуры и влажности, и даже датчик атмосферного давления. Вы наверно уже догадались над чем нам предстоит еще поработать. Так что до новых встреч! 

19 комментариев:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. тоже самое не пойму в чем дело

    ОтветитьУдалить
  3. Запустил, все загрузилось. но экран просто синий, пустой. В чем дело? Пробовал много скетчей (те, которые просто выводят слова на экран, и этот с секундомером), экран на всех скетчах просто пустой и синий. В чем дело? Помогите, пожалуйста.

    ОтветитьУдалить
    Ответы
    1. С зади есть резистор покрутите его по часовой или против до появления изображения, все заработает

      Удалить
    2. Спасибо, Я уже разобрался!
      Сейчас разбираюсь с ОLEd дисплеем i2c 0,96"

      Удалить
  4. Или адрес дисплея указан не верно или как писали выше, проблема в контрасте.

    ОтветитьУдалить
  5. #include
    #include
    // Set the LCD address to 0x3F for a 16 chars and 2 line display
    LiquidCrystal_I2C lcd(0x3F, 16, 2);
    void setup()
    {
    lcd.begin();
    lcd.backlight();// Включаем подсветку дисплея
    lcd.print("R6LCA RadioScout");
    lcd.setCursor(8, 1);
    lcd.print("LCD 1602");
    }
    void loop()
    {
    // Устанавливаем курсор на вторую строку и нулевой символ.
    lcd.setCursor(0, 1);
    // Выводим на экран количество секунд с момента запуска ардуины
    lcd.print(millis()/1000);

    }

    ОтветитьУдалить
  6. Ардуино НАНО v.3
    #include
    #include
    LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей
    void setup()
    {
    lcd.begin();
    lcd.print("R6LCA RadioScout");
    lcd.setCursor(8, 1);
    lcd.print("LCD 1602");
    }
    void loop()
    {
    // Устанавливаем курсор на вторую строку и нулевой символ.
    lcd.setCursor(0, 1);
    // Выводим на экран количество секунд с момента запуска ардуины
    lcd.print(millis()/1000);

    }

    ОтветитьУдалить
  7. Arduino: 1.8.3 (Windows Store 1.8.6.0) (Windows 10), Плата:"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

    sketch_jun19c:1: error: #include expects "FILENAME" or

    exit status 1
    #include expects "FILENAME" or

    Этот отчёт будет иметь больше информации с
    включенной опцией Файл -> Настройки ->
    "Показать подробный вывод во время компиляции"
    в чём дело?

    ОтветитьУдалить
  8. показывает только первый знак водимого текста что делать?
    Arduino uno , windows8 , progman 1.8.4

    ОтветитьУдалить
    Ответы
    1. У меня получилось под версией arduino-1.6.4
      LiquidCrystal_I2C lcd(0x3F,16,2)

      Удалить
  9. работает только так но без времени

    #include
    #include
    LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
    void setup()
    {
    lcd.init();
    lcd.backlight();// Включаем подсветку дисплея
    lcd.print("R");
    lcd.print("6");
    lcd.print("L");
    lcd.print("C");
    lcd.print("A ");
    lcd.print(" ");
    lcd.print("R");
    lcd.print("a");
    lcd.print("d");
    lcd.print("i");
    lcd.print("o");
    lcd.print("S");
    lcd.print("c");
    lcd.print("o");
    lcd.print("u");
    lcd.print("t");
    lcd.setCursor(8, 1);
    lcd.print("L");
    lcd.print("C");
    lcd.print("D");
    lcd.print(" ");
    lcd.print("1");
    lcd.print("6");
    lcd.print("0");
    lcd.print("2");

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

    }

    ОтветитьУдалить
  10. У меня получилось под версией arduino-1.6.4
    LiquidCrystal_I2C lcd(0x3F,16,2)
    Всё работает

    ОтветитьУдалить
  11. У меня проблема...
    Верхняя строка всегда белая, чтобы я не выводил.

    ОтветитьУдалить
  12. Arduino: 1.8.5 (Windows 7), Плата:"Arduino Nano, ATmega328P"

    C:\Users\MAX PRO222\Documents\Arduino\sketch_jan06d\sketch_jan06d.ino: In function 'void setup()':

    sketch_jan06d:4: error: 'Icd' was not declared in this scope

    Icd.init()

    ^

    C:\Users\MAX PRO222\Documents\Arduino\sketch_jan06d\sketch_jan06d.ino: In function 'void loop()':

    sketch_jan06d:12: error: 'Icd' was not declared in this scope

    Icd.setCursor(1);

    ^

    exit status 1
    'Icd' was not declared in this scope

    Этот отчёт будет иметь больше информации с
    включенной опцией Файл -> Настройки ->
    "Показать подробный вывод во время компиляции"

    ОтветитьУдалить
    Ответы
    1. Помоги пж я начинающий ардруинщик (у меня ардуино нано надеюсь это порможет)

      Удалить
  13. Arduino: 1.8.10 (Windows 7), Плата:"Arduino/Genuino Uno"

    sketch_nov04a:1:9: error: #include expects "FILENAME" or

    sketch_nov04a:2:10: error: #include expects "FILENAME" or

    exit status 1
    #include expects "FILENAME" or

    Этот отчёт будет иметь больше информации с
    включенной опцией Файл -> Настройки ->
    "Показать подробный вывод во время компиляции"

    ОтветитьУдалить
  14. Блин помогите разобраться! Вот какая ошибка.
    Arduino: 1.8.10 (Windows 7), Плата:"Arduino/Genuino Uno"

    sketch_nov04b:2:10: error: LiquidCrystal_I2C.h: No such file or directory

    Несколько библиотек найдено для "Wire.h"
    compilation terminated.

    Используется: C:\Program
    exit status 1
    LiquidCrystal_I2C.h: No such file or directory


    ОтветитьУдалить