Arduino:Примеры/Термостат с отображением информации на LCD-дисплее

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Проверка/Оформление/Редактирование: Мякишев Е.А.


Cat poo.png Черновик


Термостат с отображением информации на LCD-дисплее

Данный пример демонстрирует построение термостата с отображением информации на ЖК-дисплее. Arduino считывает температуру с I2C-датчика температуры TC74A0-5.0VAT и если текущее значение температуры больше или равно значению уставки, включает кратковременную сигнализацию и вентилятор. При понижении температуры ниже уставки срабатывания вентилятор отключается. На ЖК-дисплее отображается текущая температура и значение уставки срабатывания. Две кнопки используются для настройки уставки срабатывания(больше/меньше).

Необходимые компоненты

Монтажная схема

Соберите схему согласно монтажной схеме.

Arduino uno lcd 16 2 1 temp tc74 motor sound 1 bb.png

Подключение дисплея:

Контакт ЖК-дисплея Обозначение контакта ЖК-дисплея Место подключения
1 Vss плата Arduino: Земля, GND
2 Vdd плата Arduino: Питание, +5В, 5V
3 Vo Средний контакт потенциометра
4 Rs плата Arduino: 2ой цифровой контакт
5 RW плата Arduino: Земля, GND
6 En плата Arduino: 3ий цифровой контакт
7 D0 Линия передачи данных 0 (не используется)
8 D1 Линия передачи данных 1 (не используется)
9 D2 Линия передачи данных 2 (не используется)
10 D3 Линия передачи данных 3 (не используется)
11 D4 плата Arduino: 4ый цифровой контакт
12 D5 плата Arduino: 5ый цифровой контакт
13 D6 плата Arduino: 6ой цифровой контакт
14 D7 плата Arduino: 7ой цифровой контакт
15 A плата Arduino: Питание, +5В, 5V
16 K плата Arduino: Земля, GND

Распиновка параллельного ЖК-дисплея

Контакт Обозначение Назначение
1 Vss Земля
2 Vdd Питание, +5В
3 Vo Настройка контрастности
4 Rs Выбор режима(командный или отображение данных)
5 RW Чтение/запись
6 En Готовность данных
7 D0 Линия передачи данных 0 (не используется)
8 D1 Линия передачи данных 1 (не используется)
9 D2 Линия передачи данных 2 (не используется)
10 D3 Линия передачи данных 3 (не используется)
11 D4 Линия передачи данных 4
12 D5 Линия передачи данных 5
13 D6 Линия передачи данных 6
14 D7 Линия передачи данных 7
15 A Анод подсветки
16 K Катод подсветки
Распиновка I2C-датчика температуры TC74A0-5.0VAT

Код

#include <Wire.h>                                                            // Подключаем библиотеку Wire для работы с I2C устройствами
#include <LiquidCrystal.h>                                                   // Подключаем библиотеку LiquidCrystal для работы с ЖК-дисплеем

#define TEMP_ADDR    72                                                      // Адрес нашего I2C датчика температуры          
#define SPEAKER      8                                                       // Контакт к которому подключен динамик
#define DOWN_BUTTON  9                                                       // Контакт к которому подключена кнопка уменьшения температуры срабатывания
#define UP_BUTTON    10                                                      // Контакт к которому подключена кнопка увеличения температуры срабатывания
#define FAN          11                                                      // Контакт к которому подключен моторчик(вентилятор)

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);                                         // Инициализация библиотеки LiquidCrystal с номерами контактов к которым подключен дисплей

// Определяем пользовательский символ градуса для отображения на ЖК-дисплее
byte degree[8] = {
  B00110,
  B01001,
  B01001,
  B00110,
  B00000,
  B00000,
  B00000,
  B00000,
};

// Определяем пользовательский символ "вентилятор включен" для отображения на ЖК-дисплее
byte fan_on[8] = {
  B00100,
  B10101,
  B01110,
  B11111,
  B01110,
  B10101,
  B00100,
  B00000,
};

// Определяем пользовательский символ "вентилятор выключен" для отображения на ЖК-дисплее
byte fan_off[8] = {
  B00100,
  B00100,
  B00100,
  B11111,
  B00100,
  B00100,
  B00100,
  B00000,
};

// Переменная для устранения дребезга контакта кнопки
boolean lastDownTempButton = LOW;
boolean currentDownTempButton = LOW;
boolean lastUpTempButton = LOW;
boolean currentUpTempButton = LOW;

int set_temp = 23;                                                           // Температура срабатывания по умолчанию
boolean one_time = false;                                                    // переменная для единичного срабатывания динамика

void setup()
{
  pinMode(FAN, OUTPUT);
 
  Wire.begin();                                                             // Создание объекта Wire для датчика температуры
 
  lcd.begin(16, 2);                                                         // Настройка ЖК-дисплея (число столбцов и строк)
 
  // Определяем пользовательские символы
  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); 
}

/*
* Функция анти-дребезга, которая работает с несколькими контактами
*/
boolean debounce(boolean last, int pin)
{
  boolean current = digitalRead(pin);
  if (last != current)
  {
    delay(5);
    current = digitalRead(pin);
  }
  return current;
}

void loop()
{
  // Получаем температуру от I2C датчика температуры
  // Отправка запроса
  Wire.beginTransmission(TEMP_ADDR);                                       // Выбор ведомого устройства отправкой его адреса 
  Wire.write(0);                                                           // Отправка 0, тем самым указывая что мы хотим прочитать данные из регистра температуры нашего датчика               
  Wire.endTransmission();                                                  // Отправка стоп-бита, тем самым сообщаем об окончании записи на устройство

  // Чтение температуры с датчика 
  Wire.requestFrom(TEMP_ADDR, 1);                                          // Запрос 1 байта по адресу устройства
  while(Wire.available() == 0);                                            // Ожидаем ответа
  int c = Wire.read();                                                     // Чтение данных в переменную, значение температуры в градусах Цельсия

  lcd.setCursor(8,0);                                                      // Перемещаем курсор на ЖК-дисплее
  lcd.print(c);                                                            // Выводим значение температуры в заданной позиции
  
  // Считывания состояний кнопок с использованием антидребезга
  currentDownTempButton = debounce(lastDownTempButton, DOWN_BUTTON);
  currentUpTempButton  = debounce(lastUpTempButton, UP_BUTTON);
 
  // Если нажата кнопка уменьшения уставки срабатывания, то уменьшаем значение уставки
  if (lastDownTempButton== LOW && currentDownTempButton == HIGH)
  {
    set_temp--;
  }
  // Если нажата кнопка увеличения уставки срабатывания, то увеличиваем значение уставки
  else if (lastUpTempButton== LOW && currentUpTempButton  == HIGH)
  {
    set_temp++;
  }
  
  // Выводим значение уставки срабатывания на ЖК-дисплей
  lcd.setCursor(8,1);
  lcd.print(set_temp);

  lastDownTempButton = currentDownTempButton;
  lastUpTempButton = currentUpTempButton;
 
  // Если текущая температура равна или больше значения уставки, то....
  if (c >= set_temp)
  {
    // Запускаем звуковую сигнализацию...  
    if (!one_time)
    { 
      tone(SPEAKER, 400);
      delay(500);
      one_time = true;
    }
    // отключаем звуковую сигнализацию...
    else
    {
      noTone(SPEAKER);
    }
    // Включаем вентилятор и обновляем значок активности вентилятора на включен
    digitalWrite(FAN, HIGH);
    lcd.setCursor(15,1);
    lcd.write(2);
  }
  // Если значение температуры ниже уставки срабатывания, то....
  else
  {
    // Убеждаемся, что звуковая сигнализация выключена, сбрасываем значение переменной 'one_time'
    // Отключаем вентилятор и обновляем значок активности вентилятора на выключен
    noTone(SPEAKER);
    one_time = false;
    digitalWrite(FAN, LOW);
    lcd.setCursor(15,1);
    lcd.write(1);
  }
}

См.также

Внешние ссылки