- Ардуино для школьников. Индикатор на 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