Для облегчения вывода информации на ЖК-дисплей заранее определим некоторые параметры. Решим, что температуру всегда будем отображать в виде двух цифр.
Надписи "Current:" и "Set:" всегда будут неизменными, их можно вывести на экран один раз. Так как температура представлена в виде двух цифр, местоположение двух надписей " 0 С" тоже будет фиксированным. Текущее значение температуры будет отображаться в позиции (8,0) и обновляться при каждом цикле loop(), значение пороговой температуры размещено в позиции (8, 1) и обновляется при нажатии кнопки. Значок включения вентилятора будет отображаться в нижней правой части дисплея в позиции (15,1) и обновляться, когда изменяется состояние.
При работе программы ЖК-дисплей будет выглядеть примерно так, как показано на рис.10.4.
Рис. 10.4. Отображение данных на ЖК-дисплее
Знак градуса, символы включенного и выключенного вентилятора не входят в стандартный набор символов. Следовательно, в начале программы нужно сформировать соответствующие массивы, как показано в листинге 10.3.
Листинг 10.3. Массивы, опредеяющие пользовательские символы
// Пользовательский символ градуса
byte degree[8] = {
В00110,
В01001,
В01001,
В00110,
B00000, B00000, B00000, B00000,
};
// Символ "вентилятор включен"
byte fan_on[8] = {
В00100,
B10101,
В01110,
B11111,
В01110,
- 214 -
B10101,
B00100,
B00000,
};
// Символ "вентилятор выключен"
byte fan_off[8] = {
B00100,
B00100,
B00100,
B11111,
B00100,
B00100,
B00100,
B00000,
};
Вывод данных на экран ЖК-дисплея будет осуществлен в функции setup(). Размещаем курсор в нужной позиции и с помощью библиотечных функций print() и write() выводим надписи на экран (листинг 10.4).
Листинг 10.4. Вывод иформации на экран ЖК-дисплея
// Создаем пользовательские символы
lcd.createChar(0, degree);
lcd.createChar(1, fan_off);
lcd.createChar(2, fan_on);
// Отображаем статические надписи на экране ЖК-дисплея
lcd.setCursor(0,0);
lcd.print("Current:");
lcd.setCursor(10,0);
lcd.write ( (byte) 0);
lcd.setCursor(11,0);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Set:");
lcd.setCursor(10,1);
lcd.write ( (byte) 0);
lcd.setCursor(11,1);
lcd.print("C");
lcd.setCursor(15,1);
lcd.write(1);
В каждом цикле loop() обновляем текущее значение температуры и состояние значка включения вентилятора. Перед этим помещаем в нужное место курсор.
- 215 -
В главе 2 мы использовали функцию предотвращения дребезга debounce(). Здесь немного изменим ее, чтобы устранить дребезг нескольких кнопок. Одна кнопка увеличивает пороговое значение температуры, другая уменьшает его. Необходимо определить переменные для хранения текущего и предьщущего состояний кнопок:
// Переменные, используемые при устранении дребезга кнопок
boolean lastDownTempButton = LOW;
boolean currentDownTempButton = LOW;
boolean lastUpTempButton = LOW;
boolean currentUpTempButton = LOW;
Переделаем функцию устранения дребезга debounce() для случая нескольких кнопок. Добавим второй аргумент, задающий кнопку, для которой устраняем дребезг (листинг 10.5).
Листинг 10.5. Функция устранения дребезга двух кнопок
// Функция проверки дребезга для нескольких кнопок
boolean debounce(boolean last, int pin)
{
boolean current = digitalRead(pin);
if (last != current)
{
delay (5);
current = digitalRead(pin);
}
return current;
}
В основном цикле программы loop() проверяем состояние кнопок, устраняем дребезг, изменяем при нажатии кнопки значение переменной пороговой температуры set_temp и обновляем значение на экране ЖК-дисплея (листинг 10.6).
Листинг 10.6. Программа установки пороговой температуры с помощью двух кнопок
// Устранение дребезга нескольких кнопок
currentDownTempButton = debounce(lastDownTempButton, DOWN_BUTTON);
currentUpTempButton = debounce(lastUpTempButton, UP_BUTTON);
// Уменьшить значение set_temp
if (lastDownTempButton == LOW && currentDownTempButton == HIGH)
{
set_temp--;
}
- 216 -
// Увеличить значение set_temp
else if (lastUpTempButton == LOW && currentUpTempButton == HIGH)
{
set_temp++;
}
// Вывести значение set_temp на ЖК-дисплей
lcd.setCursor(8,1);
lcd.print(set_temp);
// Изменить последние значения статуса кнопок
lastDownTempButton = currentDownTempButton;
lastUpTempButton = currentUpTempButton;
В листинге 10.6 запускаем функцию устранения дребезга debounce() для каждой кнопки, а затем изменяем переменную set_temp заданной пороговой температуры при нажатии одной из кнопок. Потом значение температуры обновляется на экране ЖК-дисплея.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии