Изучаем Arduino: инструметы и методы технического волшебства - [54]

Шрифт
Интервал

Рис. 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 -

10.5.3. Установка порогового значения температуры с помощью кнопок

В главе 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 заданной пороговой температуры при нажатии одной из кнопок. Потом значение температуры обновляется на экране ЖК-дисплея.

10.5.4. Добавляем вентилятор и звуковое оповещение

Теперь добавим фрагмент кода для управления вентилятором и динамиком. Хотя ЖК-дисплей и так информирует нас обо всем, никогда не помешает дополнительное звуковое оповещение о событиях. Например, подача звукового сигнала перед включением вентилятора. В этом примере мы используем команды tone() в паре с задержкой delay() и notone(). Чтобы задать длительность звука, можно указать второй аргумент команды tone(). Добавив переменную состояния, можно устанавливать звуковое оповещение динамиком только один раз при превышении порогового значения температуры.

Фрагмент кода, приведенный в листинге 10.7, проверяет температуру и управляет динамиком, вентилятором и индикатором вентилятора на ЖК-дисплее.

Листинг 10.7. Выдача звукового оповещения при превышении пороговой температуры

// Стало жарко!

if (с>= set_temp)

// Издать звук динамиком

if ( !one_time)

{

tone(SPEAKER, 400);

delay(500);

one time = true;

}

- 217 -

// Выключить динамик

else

{

noTone (SPEAKER);

}

// Включить вентилятор и знак на ЖК-дисплее

digitalWrite(FAN, HIGH);

lcd.setCursor(15,1);

lcd.write(2);

}

// Стало прохладнее

else

{

// Выключить динамик

// Сбросить состояние one time в false

// Выключить вентилятор и значок на ЖК-дисплее

noTone(SPEAKER);

one time = false;

digitalWrite(FAN, LOW);

lcd.setCursor(15,1);

lcd.write(1);

}

Переменная one_time позволяет выдать однократный, а не непрерывный звуковой сигнал. После того как динамик издает звук длительностью 500 мс частотой 400 Гц, переменная устанавливается в true и сбрасывается в false только тогда, когда температура падает обратно ниже заданного порога.