В прошлой статье, если кто помнит, мы подключали к нашей Ардуине температурный датчик DS18B20 и измеряли температуру, причем результат измерений наблюдали пока что только в "Мониторе последовательного порта" программы Arduino IDE.

Естественно, что такой способ отображения вряд ли можно практически использовать в быту как настоящий термометр. Поэтому, нужно думать о том, куда и как можно вывести измеренное значение температуры. Сейчас в продаже имеются недорогие жидкокристаллические индикаторы на базе контроллера HD44780, которые выпускаются несколькими фирмами (китайскими тоже). Есть подобные изделия , сделанные у нас, в России. Для нас главное, чтобы они были совместимы с системой команд контроллера HD44780. А как там они будут называться - дело десятое. Вот как выглядят эти индикаторы:

 lsd

Этот индикатор может отображать 2 строки по 16 символов в каждой (16/2).

А вот какой прибор имеется у меня в наличии, и с которым мы будем проводить наши эксперименты:

lsd1

Здесь есть 2 строки по 8 символов. Впрочем, для наших нужд пока что больше и не нужно, тем более, что принцип работы, подключение и управление этими индикаторами ничем не отличается друг от друга.

В-общем, припаяю-ка я к нему шлейф, взятый из старого компьютера. С разъемом, естественно, чтобы можно было удобно подключить индикатор к нашей макетке:

lsd2

 

Индикатор имеет 14 выводов:

  • 1 — Vss, земля ⇨ подключаем к выводу GND Ардуины.
  • 2 — Vdd, питание ⇨ подключаем к выводу +5 В.
  • 3 — Vo, управление контрастностью напряжением ⇨  подключаем к ползунку потенциометра.
  • 4 — RS, выбор регистра ⇨ подключаем к выходу 12 Arduino.
  • 5 — R/W, чтение/запись ⇨ подключаем к GND (шине "-"), будем только записывать в индикатор.
  • 6 — E, он же Enable ⇨ подключаем к выходу 11 Arduino.
  • 7-10 — DB0-DB3, младшие биты 8-битного интерфейса; не подключены.
  • 11-14 — DB4-DB7, старшие биты интерфейса ⇨ подключаем последовательно к выходам 5-2 Arduino
  • 15 — A, питание для подсветки ⇨ +5 В 
  • 16 — K, земля для подсветки ⇨ GND

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

Поэтому, для начала не будем полностью подключать индикатор к Ардуине, а соберем вот такую схему:

lsd3

 

На термодатчик слева, оставшийся после прошлых экспериментов, не обращаем внимания, он нам понадобится потом. Зато обратим внимание на переменное сопротивление, крайние выводы которого подключены к шинам питания, а центральный (ползунок) - в выводу 3 индикатора. Переменный резистор можно взять, практически, любой. В данном случае, на фотографии - 2,2 ком. Далее я пробовал подключать сопротивление на 22 ком - особой разницы не заметил, кроме остроты настройки. Напомню, что этот резистор служит для настройки контрастности изображения. У меня, почему-то, пришлось его выкрутить доотказа в одну сторону. Соответственно, подключаем выводы 1 и 2 индикатора к шинам питания, согласно списку, который приведен выше. Соединяем макетную плату с Ардуиной проводами питания, включаем - и вуаля:

lsd4

 

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

Итак, мы протестировали наш индикатор - вроде работает. Пора подключать остальные выводы и начинать уже программировать.

 Подключаемся к Ардуине, сверяясь с таблицей выше:

lsd4 1

 

Выводы подсветки у меня находятся отдельно, с правой стороны и обозначены буквами "А" - это "+",  и "К" - это "-". Присоединяем их прямо к шине питания.

 В Arduino IDE за работу с индикаторами типа HD44780 отвечает библиотека LiquidCrystal, на всякий случай проверим ее наличие:

lsd5

 

Ок, библиотека присутствует. Тогда давайте загрузим а Ардуину такой скетч:

#include <LiquidCrystal.h> //подключаем библиотеку.


LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Указываем к каким пинам Ардуины подключен наш индикатор

void setup() {
 
  lcd.begin(8, 2);   // указываем тип индикатора - сколько столбцов и строк.
 
  lcd.print("Probelum");  // печатаем сообщение
}

void loop() {
   /* Устанавливаем курсор в 1 столбец 2й строки. Нумерация идёт с нуля,
  * первым аргументом идёт номер столбца.
  */
 lcd.setCursor(0, 1);
 /* Выводим на дисплей число секунд, прошедших с момента старта Arduino */
 lcd.print(millis() / 1000);

}

После загрузки скетча любуемся результатом:

lsd6

 

Индикатор исправно отсчитывает секунды, прошедшие с момента загрузки скетча (или с момента включения питания контроллера).

 Кроме функций, которые мы использовали в скетче, существуют еще и другие:

  • home() и clear()
    Первый метод возвращает курсор в начало экрана; clear() делает то же самое, заодно стирая всё, что было на дисплее до этого.
  • write(ch)
    Выводит одиночный символ ch на дисплей.
  • Cursor() и noCursor()
    включит и выключить отображение курсора (символ подчеркивания).
      • blink() и noBlink()
        Включить и выключить мигание курсора, если включено его отображение.
      • display() и noDisplay()
        Включить и выключить дисплей.
      • scrollDisplayLeft() и scrollDisplayRight()
        Прокрутить экран на один символ влево или вправо.
      • autoscroll() и noAutoscroll()
        Включить и выключить режим автопрокрутки. В этом режиме при выводе каждого следующего символа содержимое экрана будет смещено на один символ влево (или вправо, если включен режим вывода справа налево), а выводимый символ займёт место первого сдвинутого. Проще говоря, в этом режиме все последующие символы выводятся в одно и то же место, вытесняя текущее содержимое экрана.
      • leftToRight() и rightToLeft()
        Устанавливают направление вывода текста: слева направо и справа налево, соответственно.
      • createChar(ch, bitmap)
        Самая крутая функция: позволяет создать свой символ с кодом ch (от 0 до 7), пользуясь массивом битовых масок bitmap для задания тёмных и светлых точек.

    Однако, изучение всех функций управления индикатором оставим любителям самостоятельных исследований - информации в сети полно, а сами опять сосредоточимся на нашем термометре. Снова подключим наш термодатчик DS18B20, который мы подключали в прошлой статье.  Откроем скетч, который мы тогда использовали для измерения температуры и попробуем вывести температуру на наш индикатор:

  • #include <OneWire.h>          //подключаем библиотеку "1-Wire"
    #include <LiquidCrystal.h> //подключаем библиотеку LiquidCrystal.

    OneWire  ds(10);                  // Указываем, к какому пину Ардуины подключен датчик DS18B20
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Указываем к каким пинам Ардуины подключен наш индикатор


    void setup(void) {
      lcd.begin(8, 2);   // указываем тип индикатора - сколько столбцов и строк.

    }

    void loop() {
      byte data[2];           // объявляем массив из 2-х байт
      String znak;            // переменная, знак температуры.
      ds.reset();             // инициализируем датчик
      ds.write(0xCC);         // пропускаем адресацию к конкретному датчику (у нас он один)
      ds.write(0x44);         // даем команду измерять температуру
      delay(1000);           // ждем 1 секунду, пока измеряется температура
     
      ds.reset();            // снова инициализируем датчик
      ds.write(0xCC);        // снова пропускаем адресацию
      ds.write(0xBE);         // даем команду готовности считывать температуру
      data[0] = ds.read();    //считываем  младший
      data[1] = ds.read();    // и старщий байты
      if bitRead(data[1],7)   // если старший бит старшего байта - 1, это отрицательная темпер.
         {znak = "";}
         else
         {znak = "+";}
      int Temp = (data[1] << 8) + data[0];  // преобразуем считанную информацию

      Temp = Temp >> 4;                     // к нужному виду.
     
    lcd.clear();                            //очищаем экран индикатора
    lcd.print("Temper:");                   // печатаем сообщение

     /* Устанавливаем курсор во 2й столбец 2й строки. Нумерация идёт с нуля,
      * первым аргументом идёт номер столбца.
      */
     lcd.setCursor(2, 1);

          if (Temp < 0)            // если температура отрицательная, то выводим только ее.
             lcd.print(Temp);
             else
             lcd.print(znak + Temp); // если положительная -  дополнительно выводим знак "+".
     
    }

  • Все, что красным шрифтом, относится к обслуживанию индикатора. Вывод в последовательный порт убран, сейчас он уже не нужен. Думаю, что из комментариев работа программы ясна. Единственное, что хочется пояснить - как мы помним, на "Монитор последовательного порта" положительная температура выводилась без знака, а отрицательная уже со знаком "-". Поэтому, нам необходимо организовать дополнительно индикацию знака "+" на положительных температурах. Что мы и проделали с помощью вот этого кусочка кода:
  •     if (Temp < 0)            // если температура отрицательная, то выводим только ее.
             lcd.print(Temp)
  •          else
  •          lcd.print(znak + Temp); // если положительная - дополнительно выводим знак "+".
  • Загружаем скетч и получаем результат:
    • Как видим - наш термометр работает, показывает правильную температуру, в том числе - и отрицательную, проверено. Желающие, используя другие возможности такого индикатора, могут поэкспериментировать с другими функциями по выводу текста. 
    • Еще пару слов по поводу поддержки русского языка. Наши китайские товарищи, как пишут коллеги, достаточно легкомысленно отнеслись к этому вопросу, разбросав русские буквы по таблице знакогенератора в полном беспорядке. Поэтому, вот так просто вывести текст на русском языке, как мы выводим по-английски - скорее всего, не получится, желающие могут поэкспериментировать, сам не пробовал. 
    • Вот ссылка на библиотеку LiquidCrystalRus, якобы она позволяет воспроизводить русские буквы на нашем индикаторе. По отзывам - у одних получается, у других - нет, поэтому, однозначно рекомендовать не могу. Пробуйте. Сначала устанавливается библиотека стандартным способом, потом - подключается к скетчу тоже, как обычно, через #include. Команды те же самые, только вместо английских букв выводишь русские, типа - "Здравствуй , мир!".

Добавить комментарий