- Ардуино для школьников. Индикатор на TM1637, LCD 1602 HD44780

Подключение индикатора на TM1637 и LCD 1602(HD44780) к Ардуино

Практика для школьников. Мясищев А.А.

Четвертый урок: Изучение работы семисегментного индикатора на основе контроллера TM1637. Подключение его к Ардуино и снятие показаний с датчика температуры DS18B20

Фото индикатора и его выводы

Фото подключения индикатора и датчика DS18B20 к Ардуино

Соединение с Arduino выглядит так:

VCC to Arduino 5v

GND to Arduino GND

CLK к произвольному цифровому контакту Arduino, описанному в программе

DIO к произвольному цифровому выходу Arduino, описанному в программе

Сначала создается новый объект типа TM1637Display следующим образом:

#include <TM1637Display.h>

#define CLK 9 //can be any digital pin

#define DIO 8 //can be any digital pin

TM1637Display display(CLK, DIO);

Далее записываются необходимые функции

display.setBrightness(param);

Здесь устанавливается яркость свечения сегментов. Параметр param принимает значение от 0 для самой низкой яркости и до 7 для самого высокой.

display.clear();

Выполняется очистка дисплея.

Ниже представлена тестовая программа, которая иллюстрирует работу индикатора. Результаты работы даны в комментариях.

#include <Arduino.h>

#include <TM1637Display.h>

// Подключение TM1637

#define CLK 2

#define DIO 3

#define TEST_DELAY 2000

TM1637Display display(CLK, DIO);

void setup()

{

display.clear();

display.setBrightness(7); // Включение индикатора на полную яркость (0-мин. яркость)

}

void loop()

{

char data[4];

data[0] = 0b01011011;

data[1] = 0b01101101;

data[2] = {SEG_A | SEG_F | SEG_G | SEG_B}; // Построение собственного символа

data[3] = {SEG_A | SEG_F | SEG_E | SEG_D};

display.setSegments(data+0,4,0); //Вывод 4-х элементов массива начиная

// с крайней правой стороны индикатора (25оС)

delay(2000);

data[0]=display.encodeDigit(2);

data[1]=display.encodeDigit(3)| 0b10000000; // для получения символа с двоеточием

data[2]=display.encodeDigit(5);

data[3]=display.encodeDigit(12);

display.setSegments(data); // Вывод 23:5С

delay(2000);

display.clear();

display.setSegments(data+2, 2, 0);//Вывод 2-х элементов массива от 2-го(5С__) начиная

// с крайней правой стороны индикатора

delay(2000);

display.clear();

display.setSegments(data+2, 2, 1);//Вывод 2-х элементов массива от 2-го(_5С_) начиная

// с 1-й от края правой стороны индикатора

delay(2000);

display.clear();

display.setSegments(data+1, 3, 1);//Вывод 3-х элементов массива от 1-го элемента

// (_3:5С) начиная с 1-й крайней правой позиции индикатора

delay(2000);

// Ниже представлена распечатка десятичных чисел с отображением и

// без отображения нолей

display.showNumberDec(0, false); // Результат: ___0

delay(TEST_DELAY);

display.showNumberDec(0, true); // Результат: 0000

delay(TEST_DELAY);

display.showNumberDec(1, false); // Результат: ___1

delay(TEST_DELAY);

display.showNumberDec(1, true); // Результат: 0001

delay(TEST_DELAY);

display.showNumberDec(301, false); // Результат: _301

delay(TEST_DELAY);

display.showNumberDec(301, true); // Результат: 0301

delay(TEST_DELAY);

display.clear();

display.showNumberDec(14, false, 2, 1); // Результат: _14_

delay(TEST_DELAY);

display.clear();

display.showNumberDec(4, true, 2, 2); // Результат: 04__

delay(TEST_DELAY);

display.showNumberDec(-1, false); // Результат: __-1

delay(TEST_DELAY);

display.showNumberDec(-12); // Результат: _-12

delay(TEST_DELAY);

display.showNumberDec(-999); // Результат: -999

delay(TEST_DELAY);

}

Программа получения температуры с датчика и отображения ее на индикаторе. Причем двоеточие должно мигать с интервалом примерно 1 секунда.

#include <OneWire.h>

#include <DallasTemperature.h>

#include <stdio.h>

#include <stdlib.h>

#include <TM1637Display.h>

// Подключение TM1637

#define CLK 2

#define DIO 3

TM1637Display display(CLK, DIO);

#define ONE_WIRE_BUS 10 // Подключение датчика температуры к 10 выводу

OneWire oneWire(ONE_WIRE_BUS); // Создание экземпляра класса

DallasTemperature sensors(&oneWire); // Создание экземпляра класса

byte buf[10];

void setup() {

Serial.begin(9600);

sensors.begin();

display.clear();

display.setBrightness(7);

}

void loop() {

char data[4];

sensors.requestTemperatures();

float cel=sensors.getTempCByIndex(0); // Определение температуры

Serial.println(cel);

dtostrf(cel,4,1,buf); // Запись числа cel в символьный массив buf

int temH=buf[0]-48; //Преобразование десятичного кода символа в число

int temL=buf[1]-48;

int temLL=buf[3]-48;

// Вывод температуры с двоеточием

data[0]=display.encodeDigit(temH);

data[1]=display.encodeDigit(temL)| 0b10000000; // для получения символа с двоеточием

data[2]=display.encodeDigit(temLL);

data[3]=display.encodeDigit(12);

display.setSegments(data);

delay(1000);

// Вывод температуры без двоеточия

data[0]=display.encodeDigit(temH);

data[1]=display.encodeDigit(temL);

data[2]=display.encodeDigit(temLL);

data[3]=display.encodeDigit(12);

display.setSegments(data);

delay(300);

}

В библиотеке TM1637Display.h каждая из четырех цифр имеет 7 сегментов, которые могут быть адресованы отдельно. Каждый сегмент представлен буквой, как показано ниже, которая адресована одним битом.

//

// A

// ---

// F | | B

// -G-

// E | | C

// ---

// D

В приведенной ниже таблице показано сопоставление между числами и сегментами

// XGFEDCBA

0b00111111, // 0

0b00000110, // 1

0b01011011, // 2

0b01001111, // 3

0b01100110, // 4

0b01101101, // 5

0b01111101, // 6

0b00000111, // 7

0b01111111, // 8

0b01101111, // 9

0b01110111, // A

0b01111100, // b

0b00111001, // C

0b01011110, // d

0b01111001, // E

0b01110001 // F

display.setSegments ()

Эта функция позволяет выводить на каждое знакоместо индикатора символ, соответствующий таблице. Например:

display.setSegments(data+0,4,0); отображаются элементы массива с 1-го до 4-го с крайней левой позиции. Символы определяются в каждом элементе массива.

char data[4];

data[0] = 0b01011011;

data[1] = 0b01101101;

data[2] = 0b01011011;

data[3] = 0b00111001;

display.setSegments(data+0,4,0);

Отображается 252C

Двоеточие совмещено со вторым(слева) знакоместом индикатора. Для отображения двоеточия к бинарному символу(табл.) добавляется единица в старшем бите.

Например:

char data[4];

data[0] = 0b01011011;

data[1] = 0b11101101;

data[2] = 0b01011011;

data[3] = 0b00111001;

display.setSegments(data+0,4,0);

Отображается 25:2C

display.encodeDigit()

Эта функция по номеру элемента массива(нумерация с 0) с табл. возвращает код символа.

Например

char data[4];

data[0]=display.encodeDigit(3);

data[1]=display.encodeDigit(4)| 0b10000000; // для получения символа с двоеточием

data[2]=display.encodeDigit(5);

data[3]=display.encodeDigit(12);

display.setSegments(data);

Отображает 34:5С

display.showNumberDec()

Эта функция распечатывает десятичные числа. Пример ее работы в 1-й программе.

Простейший пример, организовать счетчик от 0 до 9999

void loop(){

for(i = 0; i < 9999; i++){ // Увеличить счетчик на единицу

display.showNumberDec(i); // Распечатка переменной i

delay (250); // Задержка в четверть секунды

}

}

Вариант подключения к Arduino Nano

Задание. Составить программу для отображения температуры так, как показано на последнем рисунке. Использовать Arduino UNO. Значок температуры(градус) должен мигать примерно 1 раз в секунду.

Пятый урок: Подключение LCD 1602 индикатора на базе контроллера HD44780 к Ардуино и снятие показаний с датчика температуры DS18B20

Схема подключения индикатора к Ардуино

Выводы дисплея:

На дисплее имеется 16pin разъем для подключения. Выводы промаркированы на тыльной стороне платы.

1 (VSS) - Питание контроллера (-)

2 (VDD) - Питание контроллера (+)

3 (VO) - Вывод управления контрастом

4 (RS) - Выбор получения данных или команд. При RS=0В, полученные данные воспринимаются как команды (очистить дисплей, перевести курсор и т.д.). При RS=5В, полученные данные воспринимаются как символы, которые отображаются LCD

5 (R/W) - Чтение/запись ( режим записи при соединении с землей)

6 (E) - Еnable (запись команды, символа по спаду сигнала с 5В на 0В)

7-10 (DB0-DB3) - Младшие биты 8-битного интерфейса

11-14 (DB4-DB7) - Старшие биты интерфейса

15 (A) - Анод (+) питания подсветки

16 (K) - Катод (-) питания подсветки

Для настройки контрастности следует использовать потенциометр на 10 кОм. Каким он будет по форме - не важно. На крайние ноги подается +5V и GND, центральная ножка соединяется с выводом VO

Для работы дисплея используется встроенная с среду Arduino IDE библиотека LiquidCrystal.h

Функции библиотеки:

//Работа с курсором

lcd.setCursor(0, 0); // Устанавливаем курсор (номер ячейки, строка)

lcd.home(); // Установка курсора в ноль (0, 0)

lcd.cursor(); // Включить видимость курсора (подчеркивание)

lcd.noCursor(); // Убрать видимость курсора (подчеркивание)

lcd.blink(); // Включить мигание курсора (курсор 5х8)

lcd.noBlink(); // Выключить мигание курсора (курсор 5х8)

//Вывод информации

lcd.print("Hello"); // Вывод информации

lcd.clear(); // Очистка дисплея, (удаление всех данных) установка курсора в ноль

lcd.rightToLeft(); // Запись производится справа налево

lcd.leftToRight(); // Запись производится слева на право

lcd.scrollDisplayRight(); // Смещение всего изображенного на дисплее на один символ вправо

lcd.scrollDisplayLeft(); // Смещение всего изображенного на дисплее на один символ влево

//Информация полезная для шпионов:)

lcd.noDisplay(); // Информация на дисплее становится невидимой, данные не стираются

// если, в момент когда данная функция активна, ничего не выводить на дисплей, то

lcd.display(); // При вызове функции display() на дисплее восстанавливается вся информация

Схема подключения индикатора и температурного датчика DS18B20 к Ардуино

Программа (Для получения нового значения температуры необходимо нажать на кнопку reset)

#include <OneWire.h>

#include <DallasTemperature.h>

#include <LiquidCrystal.h> // Добавляем необходимую библиотеку

#define ONE_WIRE_BUS 8 // Подключение датчика температуры к 8 выводу

OneWire oneWire(ONE_WIRE_BUS); // Создание экземпляра класса

DallasTemperature sensors(&oneWire); // Создание экземпляра класса

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7)

void setup(){

sensors.begin(); // Вызов метода класса

lcd.begin(16, 2); // Задаем размерность экрана

lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки

lcd.print(" Temperature:"); // Выводим текст

lcd.setCursor(4, 1); // Устанавливаем курсор в начало 2 строки

sensors.requestTemperatures();

float cel=sensors.getTempCByIndex(0); // Определение температуры

lcd.print(cel); // Выводим текст

lcd.print("C");

}

void loop(){

}

Фото собранного устройства

Задание.

1. Составить программу вывода температуры с периодичностью примерно в 1 секунду

2. Составить программу вывода температуры с одной значащей цифрой после запятой. Число должно округляться в большую сторону. Например для температуры 24.75, должно выводиться значение 24.8

18.11.2018