Проект 9. Климат-контроль на рабочем месте

Устройство поможет вам сохранять определенную температуру на рабочем месте.

Описание работы:

Для начала работы подключите питание к Arduino. Загорится индикатор, на котором будет высвечиваться текущая температура в комнате. Чтобы установить ограничения по температуре, необходимо вращать потенциометр. При вращении потенциометра влево, на индикаторе будет высвечиваться и уменьшаться температура до 16 градусов. При вращении потенциометра вправо, на индикаторе будет высвечиваться и увеличиваться температура до 32 градусов. Установите нужную температуру, которую необходимо поддерживать и оставьте потенциометр в покое, через секунду на индикаторе будет снова высвечиваться текущая температура. При увеличении температуры в комнате, включиться вентилятор. При дальнейшем увеличении температуры, скорость вращения вентилятора будет увеличиваться до максимальной. Существует 4 скорости работы вентилятора. Скорость зависит от разницы температуры между комнатной температурой и температурой выставленной с помощью потенциометра. При разнице температуры больше 1 градуса, но меньше 2 градусов, скорость составляет 25%. При разнице температуры больше 2 градусов, но меньше 4 градусов, скорость составляет 50%. При разнице температуры больше 4 градуса, но меньше 8 градусов, скорость составляет 75%. При разнице температуры больше 8 градуса, скорость составляет 100%.

Нам понадобится:

Для реализации проекта нам необходимо установить следующие библиотеки:

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE.

Схема сборки:

Устанавливаем Trema-модуль датчик температуры и влажности I2C в 3 посадочную площадку, в верхнюю I2C колодку.

  • Полученные результат представлен ниже на рисунке.

Код программы:

#include <iarduino_4LED.h>                                    // Подключаем библиотеку iarduino_4LED
iarduino_4LED dispLED(1, A0);                                 // Объявляем объект для работы с функциями библиотеки iarduino_4LED, с указанием выводов дисплея ( CLK , DIO )
                                                              //
#include <iarduino_AM2320.h>                                  // Подключаем библиотеку iarduino_AM2320.
iarduino_AM2320 SensTH;                                       // Объявляем объект SensorTH для работы с датчиком AM2320, используя функции и методы библиотеки iarduino_AM2320.
                                                              //
int menu;                                                     // Переменная выбора события.
int pinPot = A3;                                              // Объявляем пин для работы с потенциометром.
int pinPowerKey = 2;                                          // Объявляем пин для работы с силовым ключом.
                                                              //
float ptVol;                                                  // Переменная для чтения показаний с потенциометра.
float potVoluePrev;                                           // Переменная для предыдущих показаний с потенциометра.
int i;                                                        // Переменная счета.
int led;                                                      // Переменная выбора горящей точки.
                                                              //
bool counter = false;                                         // Переменная события, разрешает/запрещает событие каждые полсекунды.
long prevmicros;                                              // Переменная для хранения значений таймера.
                                                              //
void setup()                                                  //
{                                                             //
  pinMode(pinPowerKey, OUTPUT);                               // Переводим вывод pinPowerKey в режим выхода.
                                                              //
  dispLED.begin();                                            // Инициируем LED дисплей.
  SensTH.begin();                                             // Инициируем работу с датчиком AM2320.
                                                              //
  menu = 1;                                                   // Событие 1.
  ptVol = map(analogRead(pinPot), 5, 1018, 16, 32);           // Читаем показания с потенциометра и масштабируем значения в диапазон от 16 до 32.
  potVoluePrev = ptVol;                                       // Сохраняем показания потенциометра в предыдущей переменной.
}                                                             //
                                                              //
void loop()                                                   //
{                                                             //
  switch(menu)                                                // Выбираем событие.
  {                                                           //
  case 1:                                                     // Событие 1.
  if (micros() - prevmicros > 500000)                         // Если прошло пол секунды.
  {                                                           //
    prevmicros = micros();                                    // Сохраняем нынешнее значение счетчика Arduino.
    counter = !counter;                                       // Изменяем переменную событию на противоположную переменную.
    if (!counter)                                             // Если переменная события false.
    {                                                         //
      switch(SensTH.read())                                   // Читаем показания датчика температуры.
      {                                                       //
        case AM2320_OK:                                       // Ответ с полученными данными.
        dispLED.light(7);                                     // Устанавливаем максимальную яркость свечения LED индикатора.
        dispLED.print(SensTH.tem, TEMP);                      // Выводим значение температуры на дисплей.
                                                              //
        if(SensTH.tem - ptVol >= 1 && SensTH.tem - ptVol <= 2)// Если разница температур на потенциометре и датчике температуры больше 1, но меньше 2.
        {led = 4; analogWrite(pinPowerKey, 63);}              // Выбираем 4 точку на индикаторе, подаем 25% напряжение на силовой ключ.
                                                              //
        if(SensTH.tem - ptVol >= 2 && SensTH.tem - ptVol <= 4)// Если разница температур на потенциометре и датчике температуры больше 2, но меньше 4.
        {led = 3; analogWrite(pinPowerKey, 127);}             // Выбираем 3 точку на индикаторе, подаем 50% напряжение на силовой ключ.
                                                              //
        if(SensTH.tem - ptVol >= 4 && SensTH.tem - ptVol <= 8)// Если разница температур на потенциометре и датчике температуры больше 4, но меньше 8.
        {led = 2; analogWrite(pinPowerKey, 191);}             // Выбираем 2 точку на индикаторе, подаем 75% напряжение на силовой ключ.
                                                              //
        if(SensTH.tem - ptVol >= 8)                           // Если разница температур на потенциометре и датчике температуры больше 8.
        {led = 1; analogWrite(pinPowerKey, 255);}             // Выбираем 1 точку на индикаторе, подаем 100% напряжение на силовой ключ.
                                                              //
        if(SensTH.tem - ptVol <= 1)                           // Если разница температур на потенциометре и датчике температуры меньше 1.
        {led = 0; analogWrite(pinPowerKey, 0);}               // Выбираем 0 точку на индикаторе, подаем 0% напряжение на силовой ключ.
        break;                                                // Выходим из оператора case.
      }                                                       //
    }                                                         //
    if (counter) {dispLED.point(led, true); }                 // Включаем заданную точку на индикаторе.
    if (!counter){dispLED.point(led, false);}                 // Выключаем заданную точку на индикаторе.
  }                                                           //
  ptVol = map(analogRead(pinPot), 5, 1018, 16, 32);           // Читаем показания с потенциометра и масштабируем значения в диапазон от 16 до 32.
  if(ptVol != potVoluePrev){menu = 2;}                        // Если показания потенциометра не совпадают с предыдущими показаниями, то переходим к событию 2.
  break;                                                      // Выходим из оператора case.
                                                              //
  case 2:                                                     // Событие 2.
    dispLED.point(1, false);                                  // Выключаем 1 точку на индикаторе.
    dispLED.point(3, false);                                  // Выключаем 3 точку на индикаторе.
    dispLED.point(4, false);                                  // Выключаем 4 точку на индикаторе.
                                                              //
    ptVol = map(analogRead(pinPot), 5, 1018, 16, 32);         // Читаем показания с потенциометра и масштабируем значения в диапазон от 16 до 32.
    if (ptVol - potVoluePrev < 60) {i++;}                     // Если разность показания потенциометра и предыдущих показаний потенциометра меньше 60, то увеличиваем переменную счета.
    if (ptVol != potVoluePrev)                                // Если показания потенциометра не совпадают с предыдущими показаниями.
    {                                                         //
      i = 0;                                                  // Обнуляем переменную счета.
      dispLED.light(2);                                       // Устанавливаем уровень яркости свечения LED индикатора.
      dispLED.print(ptVol, TEMP);                             // Выводим показания потенциометра в виде температуры.
      potVoluePrev = ptVol;                                   // Сохраняем показания потенциометра в предыдущей переменной.
    }                                                         //
    if (i >= 100) {menu = 1; i = 0; led = 0;}                 // Если переменная счета больше 100, переходим к событию 1, обнуляем переменную счета, выбираем 0 точку на индикаторе.
  break;                                                      // Выходим из оператора case.
  }                                                           //
}                                                             //

Алгоритм работы:

В начале скетча (до кода setup) выполняются следующие действия:

В коде setup выполняются следующие действия:

  • Переводим вывод для силового ключа в режим выхода.
  • Инициируем LED дисплей.
  • Инициируем работу с датчиком температуры.
  • Считываем показания потенциометра, сохраняя показания в предыдущую и нынешнюю переменную потенциометра.
  • Выбираем событие 1.

В коде loop выполняются следующие действия:

  • Выбор события.
  • Событие 1. В нем каждые пол секунды выполняем считывание показаний с датчика температуры. Выводим значение температуры на дисплей. Устанавливаем максимальную яркость свечения LED индикатора. Зажигаем точку в соответствии со скоростью вращения вентилятора. Считываем показания потенциометра, если показания изменились переходим к событию 2.
  • Событие 2. В нем гасим все точки, кроме второй. Читаем показания потенциометра. Если разница показания потенциометра и предыдущих показаний потенциометра меньше 60, то увеличиваем переменную счета. Если показания потенциометра не совпадают с предыдущими показаниями, обнуляем переменную счета, устанавливаем небольшой уровень яркости свечения LED индикатора. Выводим показания потенциометра в виде температуры. Сохраняем показания потенциометра в предыдущей переменной. Если переменная счета больше 100, переходим к событию 1, обнуляем переменную счета, выбираем 0 точку на индикаторе.

Ссылки

Обсуждение