Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

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

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

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


Ambox content.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

Код

  1. #include <Wire.h>                                                            // Подключаем библиотеку Wire для работы с I2C устройствами
  2. #include <LiquidCrystal.h>                                                   // Подключаем библиотеку LiquidCrystal для работы с ЖК-дисплеем
  3.  
  4. #define TEMP_ADDR    72                                                      // Адрес нашего I2C датчика температуры          
  5. #define SPEAKER      8                                                       // Контакт к которому подключен динамик
  6. #define DOWN_BUTTON  9                                                       // Контакт к которому подключена кнопка уменьшения температуры срабатывания
  7. #define UP_BUTTON    10                                                      // Контакт к которому подключена кнопка увеличения температуры срабатывания
  8. #define FAN          11                                                      // Контакт к которому подключен моторчик(вентилятор)
  9.  
  10. LiquidCrystal lcd(2, 3, 4, 5, 6, 7);                                         // Инициализация библиотеки LiquidCrystal с номерами контактов к которым подключен дисплей
  11.  
  12. // Определяем пользовательский символ градуса для отображения на ЖК-дисплее
  13. byte degree[8] = {
  14.   B00110,
  15.   B01001,
  16.   B01001,
  17.   B00110,
  18.   B00000,
  19.   B00000,
  20.   B00000,
  21.   B00000,
  22. };
  23.  
  24. // Определяем пользовательский символ "вентилятор включен" для отображения на ЖК-дисплее
  25. byte fan_on[8] = {
  26.   B00100,
  27.   B10101,
  28.   B01110,
  29.   B11111,
  30.   B01110,
  31.   B10101,
  32.   B00100,
  33.   B00000,
  34. };
  35.  
  36. // Определяем пользовательский символ "вентилятор выключен" для отображения на ЖК-дисплее
  37. byte fan_off[8] = {
  38.   B00100,
  39.   B00100,
  40.   B00100,
  41.   B11111,
  42.   B00100,
  43.   B00100,
  44.   B00100,
  45.   B00000,
  46. };
  47.  
  48. // Переменная для устранения дребезга контакта кнопки
  49. boolean lastDownTempButton = LOW;
  50. boolean currentDownTempButton = LOW;
  51. boolean lastUpTempButton = LOW;
  52. boolean currentUpTempButton = LOW;
  53.  
  54. int set_temp = 23;                                                           // Температура срабатывания по умолчанию
  55. boolean one_time = false;                                                    // переменная для единичного срабатывания динамика
  56.  
  57. void setup()
  58. {
  59.   pinMode(FAN, OUTPUT);
  60.  
  61.   Wire.begin();                                                             // Создание объекта Wire для датчика температуры
  62.  
  63.   lcd.begin(16, 2);                                                         // Настройка ЖК-дисплея (число столбцов и строк)
  64.  
  65.   // Определяем пользовательские символы
  66.   lcd.createChar(0, degree);                  
  67.   lcd.createChar(1, fan_off);
  68.   lcd.createChar(2, fan_on);
  69.  
  70.   // Выводим на ЖК-дисплей статичные надписи
  71.   lcd.setCursor(0,0);
  72.   lcd.print("Current:");
  73.   lcd.setCursor(10,0);
  74.   lcd.write((byte)0);
  75.   lcd.setCursor(11,0);
  76.   lcd.print("C");
  77.   lcd.setCursor(0,1);
  78.   lcd.print("Set:");
  79.   lcd.setCursor(10,1);
  80.   lcd.write((byte)0);
  81.   lcd.setCursor(11,1);
  82.   lcd.print("C");
  83.   lcd.setCursor(15,1);
  84.   lcd.write(1);
  85. }
  86.  
  87. /*
  88. * Функция анти-дребезга, которая работает с несколькими контактами
  89. */
  90. boolean debounce(boolean last, int pin)
  91. {
  92.   boolean current = digitalRead(pin);
  93.   if (last != current)
  94.   {
  95.     delay(5);
  96.     current = digitalRead(pin);
  97.   }
  98.   return current;
  99. }
  100.  
  101. void loop()
  102. {
  103.   // Получаем температуру от I2C датчика температуры
  104.   // Отправка запроса
  105.   Wire.beginTransmission(TEMP_ADDR);                                       // Выбор ведомого устройства отправкой его адреса
  106.   Wire.write(0);                                                           // Отправка 0, тем самым указывая что мы хотим прочитать данные из регистра температуры нашего датчика              
  107.   Wire.endTransmission();                                                  // Отправка стоп-бита, тем самым сообщаем об окончании записи на устройство
  108.  
  109.   // Чтение температуры с датчика
  110.   Wire.requestFrom(TEMP_ADDR, 1);                                          // Запрос 1 байта по адресу устройства
  111.   while(Wire.available() == 0);                                            // Ожидаем ответа
  112.   int c = Wire.read();                                                     // Чтение данных в переменную, значение температуры в градусах Цельсия
  113.  
  114.   lcd.setCursor(8,0);                                                      // Перемещаем курсор на ЖК-дисплее
  115.   lcd.print(c);                                                            // Выводим значение температуры в заданной позиции
  116.  
  117.   // Считывания состояний кнопок с использованием антидребезга
  118.   currentDownTempButton = debounce(lastDownTempButton, DOWN_BUTTON);
  119.   currentUpTempButton  = debounce(lastUpTempButton, UP_BUTTON);
  120.  
  121.   // Если нажата кнопка уменьшения уставки срабатывания, то уменьшаем значение уставки
  122.   if (lastDownTempButton== LOW && currentDownTempButton == HIGH)
  123.   {
  124.     set_temp--;
  125.   }
  126.   // Если нажата кнопка увеличения уставки срабатывания, то увеличиваем значение уставки
  127.   else if (lastUpTempButton== LOW && currentUpTempButton  == HIGH)
  128.   {
  129.     set_temp++;
  130.   }
  131.  
  132.   // Выводим значение уставки срабатывания на ЖК-дисплей
  133.   lcd.setCursor(8,1);
  134.   lcd.print(set_temp);
  135.  
  136.   lastDownTempButton = currentDownTempButton;
  137.   lastUpTempButton = currentUpTempButton;
  138.  
  139.   // Если текущая температура равна или больше значения уставки, то....
  140.   if (c >= set_temp)
  141.   {
  142.     // Запускаем звуковую сигнализацию...  
  143.     if (!one_time)
  144.     {
  145.       tone(SPEAKER, 400);
  146.       delay(500);
  147.       one_time = true;
  148.     }
  149.     // отключаем звуковую сигнализацию...
  150.     else
  151.     {
  152.       noTone(SPEAKER);
  153.     }
  154.     // Включаем вентилятор и обновляем значок активности вентилятора на включен
  155.     digitalWrite(FAN, HIGH);
  156.     lcd.setCursor(15,1);
  157.     lcd.write(2);
  158.   }
  159.   // Если значение температуры ниже уставки срабатывания, то....
  160.   else
  161.   {
  162.     // Убеждаемся, что звуковая сигнализация выключена, сбрасываем значение переменной 'one_time'
  163.     // Отключаем вентилятор и обновляем значок активности вентилятора на выключен
  164.     noTone(SPEAKER);
  165.     one_time = false;
  166.     digitalWrite(FAN, LOW);
  167.     lcd.setCursor(15,1);
  168.     lcd.write(1);
  169.   }
  170. }

См.также

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