Ноутбук и компьютер - Информационный портал

Вентилятор с помощью ардуино, который зависит от температуры. Еще один термостат на Arduino, но с OpenTherm Многоканальный терморегулятор на ардуино нано

Принципиальная схема самодельного четырехканального термостата с отображением температур, построен на основе Arduino UNO, LM325 и с дисплеем 1602А, позволяет управлять четырьмя раздельными нагрузками.

Здесь описывается модернизированный вариант устройства, который кроме пассивного измерения и индикации температуры еще может управлять четырьмя нагревателями, с целью поддержания заданной температуры в четырех разных местах, в которых в первом варианте было возможно только измерение температуры.

Работа четырехканального термометра и его программы очень подробно описана в предыдущей статье (Л.1), поэтому здесь речь будет только об изменениях для реализации работы четырехканального термостата.

Принципиальная схема

Принципиальная схема показана на рис.1.

Рис. 1.Принципиальная схема термостата на Arduino UNO, LM325 с дисплеем 1602А.

В отличие от первой схемы (Л.1) здесь присутствуют четыре транзисторных ключа, нагруженных на обмотки реле К1-К4, управляющие четырьмя различными нагревательными устройствами (Н1-Н4). Управляющие команды на эти ключи поступают от четырех цифровых портов D9-D12 платы ARDUINO UNO.

Программа

Программа приведена в таблице 1.

Таблица 1.

Первое отличие в том, что заданы порты для управления нагревателями. Это порты D9-D12, заданы они здесь:

pinMode(12, OUTPUT);

pinMode(11, OUTPUT);

pinMode(10, OUTPUT);

pinMode(9, OUTPUT);

Можно выбрать другие свободные цифровые порты, после подключения индикатора остались еще D8 и D13. Но автор выбрал именно эти: D9, D10, D11, D12. Второе отличие в том, что для управления нагревателями используется компараторная функция if. В строках:

if(temp < -15)digitalWrite(12, HIGH);

if(temp > -15)digitalWrite(12, LOW);

if(tempi < 1)digitalWrite(11, HIGH);

if(tempi > 1)digitalWrite(11, LOW);

if(temp2 < 20)digitalWrite(10, HIGH);

if(temp2 > 20)digitalWrite(10, LOW);

if(temp3 < 10)digitalWrite(9, HIGH);

if(temp3 > 10)digitalWrite(9, LOW);

В этих строках указывается при какой температуре, какой логический уровень должен быть на соответствующем порту. Например, при температуре первого датчика (Т1) ниже -15°С на порту D12 будет логическая единица. При температуре второго датчика (Т2) ниже 1°С на порту D11 будет логическая единица.

При температуре третьего датчика (ТЗ) ниже 20°С на порту D10 будет логическая единица. При температуре четвертого датчика (Т4) ниже 10°С на порту D9 будет логическая единица. Конечно, температуры можно задать и совсем другие, - любые, которые нужны для конкретного применения данного прибора.

Более того, уже в готовом устройстве, при необходимости их легко изменить. Для этого нужно подключить персональный компьютер к USB-порту платы ARDUINO UNO и загрузить программу с другими данными по температурным порогам. В принципе, для этого можно предусмотреть на корпусе готового прибора разъем USB.

Обычно, в «типовом» терморегуляторе есть петля гистерезиса, то есть, цепь, которая создает разницу между тепера-турой включения нагревателя и температурой его выключения. Это нужно для того чтобы нагреватель включался / выключался не очень часто. Особенно это важно, если нагревателем управляет электромагнитное реле.

Потому что контакты реле не рассчитаны на такой режим работы, и могут быстро выйти из строя от подгорания из-за искрения. Но гистерезис вносит погрешность в работу термостата. Здесь было решено не создавать гистерезис, а для того чтобы контакты реле переключались не слишком часто просто замедлить работу прибора. Для этого в строке:

время индикации увеличено до трех секунд. В результате, измерения повторяются с периодом в три секунды, и в любом случае, реле не может переключаться чаще, чем один раз в три секунды.

Детали

Электромагнитные реле К1-К4 можно применить любые с обмотками на 12V и контактами, достаточно мощными для управления конкретными нагревателями.

Выходные каскады можно сделать и по другим схемам, например, на оптоси-мисторах. В этом случае, к соответствующим портам платы ARDUINO UNO подключаются, через токоограничительные резисторы, светодиоды оптосимис-торов или, так называемых, «твердотельных реле».

Каравкин В. РК-08-17.

Литература: 1. Каравкин В. - Четырехканальный термометр на ARDUINO UNO, РК-06-17.

Читая первую часть заголовка многие из вас, наверняка, подумали – еще один термостат на многострадальной Arduino. И… Это правда – да, это очередной термостат для очередного котла, очередного дома, но правда это только отчасти – в статье я не хочу концентрироваться на самом устройстве – их (статей) действительно предостаточно. Несомненно, я опишу термостат, но больше хотел бы рассказать о том, как я связывал сам микроконтроллер с котлом. Итак, кому интересно – прошу…

Как все начиналось

Прежде всего хочу сказать, что я нисколько не программист и с настоящим микроконтроллером дела до этого не имел. Мое первое знакомство с МК AVR (да и вообще с МК) было еще в старшей школе, когда мне захотелось узнать, как же все-таки работает эта загадочная штука. Я прочел несколько статей и с тех пор в памяти у меня остались лишь отрывки, которые можно было описать всего двумя словами – DDR и PORT – на этом мои познания и обрывались. Потом был универ, 5-й курс – «Программирование микроконтроллеров» где мы все познакомились с MSC51 в виртуальной среде. Тут уже были и прерывания, и таймеры, и все остальное. Ну, вот с таким багажом знаний я и пришел к проблеме. Закончим на этой автобиографической ноте и перейдем к более интересной части.

Итак, собственно, с чего началось создание термостата – после установки автономного отопления с газовым котлом, я, как и многие, столкнулся с обычными проблемами – температура в доме очень зависела от погоды на улице – мороз – в квартире холодно, нужно увеличивать температуру теплоносителя в батареях, потеплело – наоборот. Такие танцы с бубном меня не сильно устраивали, т.к. регулировка котла осложнялась тем, что он был установлен за дверцей, а дверца подперта микроволновкой, на которой лежала куча хлама. Ну, вы поняли – иголка в яйце, яйцо в утке и т.д.

Решалась эта проблема очень просто – датчиком OTC (Outside Temperature Compensation), который подключается к котлу и позволяет ему автоматически подстраивать температуру теплоносителя в зависимости от уличной температуры. Проблема, казалось бы, решена, но чтение сервис-мануала на котел (Ferolli Domiproject C24D) быстро растоптало мою надежду – подключение датчика внешней температуры в данной модели не предусмотрено. Все? Все. И вот, наверное, можно было бы закончить, но летом в котле в грозу до сих пор непонятным мне способом сгорает плата управления, и разговаривая с сервис-мэном (плату в последствии отремонтировали) я спросил, возможно ли подключение OTC на мой котел? Он ответил, что подключают, используя внешние термостаты. Это отложилось у меня в памяти, но я не особо на этом концентрировался до наступления холодов, а дальше всё таже проблема.

Листая все ту же сервисную инструкцию, но уже с целью посмотреть, как же подключается термостат, я заметил, что на те же клеммы подключается «OpenTherm регулятор». Тут-же я понял – вот ОНО! Поиск в Google «OpenTherm Arduino» же меня опять огорчил – ничего особо толкового. Был монитор сообщений, но это не то – мне и слушать, то нечего – нужен именно термостат.

Автоматический вентилятор Ардуино, который включается сам, когда температура в помещении достигнет определенной величины.

В этом уроке вы узнаете о вентиляторах с регулятором температуры на Ардуино, используя датчик и реле DHT22. Мы будем использовать датчик DHT22 для получения значения температуры и выведем это значение температуры на ЖК-дисплее. Затем мы проверим, будет ли значение температуры больше 35 или нет, если температура будет больше 35, тогда реле будет активировано и вентилятор начнет вращаться.

Комплектующие

Нам понадобятся следующие детали для нашего проекта:

Принципиальная схема вентилятора Ардуино

Принципиальная схема нашего вентилятора выглядит так:

Давайте разберемся с соединением всех деталей. Прежде всего сделайте подключение ЖК-дисплея к Ардуино следующим образом:

  • Подсоедините вывод VSS на ЖК-дисплее к земле Arduino.
  • Подключите контакт VDD к 5V Arduino.
  • Подсоедините вывод V0 к центральному выводу потенциометра 10K. Подключите два других контакта потенциометра к 5V и к земле.
  • Подсоедините штырь RS к контакту 2 Arduino.
  • Подключите контакт R/W к земле Arduino. Это поместит ЖК-дисплей в режим чтения.
  • Подключите контакт E (Enable) к контакту 3 Arduino.
  • Подключите контакты D4-D7 к контакту 4, 5, 6, 7 Ардуино.
  • Подключите контакт 15, который является положительным выводом подсветки светодиода на 5-контактный штырь через резистор 220 Ом.
  • Подключите контакт 16, который является отрицательным выводом подсветки светодиода к земле Arduino.

Затем подключите релейный модуль к Arduino. На стороне входа модуля реле выполните соединения следующим образом:

  • Подключите вывод VCC модуля реле к выводу 5V Arduino.
  • Подключите вывод IN модуля реле к выходу 9 Arduino.
  • Подключите вывод GND модуля реле к GND Ардуино.

На выходной стороне модуля реле подключите минус 9В-батареи к общему (C) модулю реле и подключите NC модуля реле к минусу вентилятора. Затем подключите плюс батареи к плюсу вентилятора.

В конце сделайте соединения для датчика температуры и влажности DHT22.

  • Подключите контакт 1 DHT22, который является выводом VCC, к 5V Ардуино.
  • Подключите контакт 2 DHT22, который является выводом данных к выходу 8 Arduino.
  • Подключите контакт 4 от DHT22, который является заземляющим контактом, к земле Arduino.

Скетч для Ардуино

Ниже вы можете скопировать и загрузить код в свою Ардуино Уно.

#include "DHT.h" #include "LiquidCrystal.h" LiquidCrystal lcd(7, 8, 9, 10, 11 ,12); #define DHTPIN 6 #define DHTTYPE DHT22 DHT sensor(DHTPIN, DHTTYPE); int relay_pin = 9; void setup() { lcd.begin(16,2); sensor.begin(); pinMode(relay_pin, OUTPUT); digitalWrite(relay_pin, HIGH); } void loop() { lcd.clear(); float t = sensor.readTemperature(); //считывание температуры с датчика // Проверка, посылает ли датчик значения или нет if (isnan(t)) { lcd.print("Failed"); delay(1000); return; } lcd.setCursor(0,0); lcd.print("Temp: "); lcd.print(t); lcd.print(" C"); if (t > 35){ digitalWrite(relay_pin, LOW); lcd.setCursor(0,1); lcd.print("Fan is ON "); delay(10); } else{ digitalWrite(relay_pin, HIGH); lcd.setCursor(0,1); lcd.print("Fan is OFF "); } delay(2000); }

Объяснение кода

Прежде всего, мы включили библиотеки для датчика DHT22 и для ЖК-дисплея. Библиотеки помогут сделать код более простым.

Скачать все необходимые библиотеки для своих проектов вы можете на нашем сайте в разделе - .

#include "DHT.h" #include "LiquidCrystal.h"

Затем мы инициализировали контакты к которым мы подключили ЖК-дисплей и датчик DHT22. После этого мы определили тип датчика DHT, который используется. Существует множество других типов датчиков DHT, таких как DHT11, поэтому здесь важно определить тип.

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); #define DHTPIN 8 #define DHTTYPE DHT22 DHT sensor(DHTPIN, DHTTYPE);

В функции настройки мы дали команду DHT22 и LCD, чтобы начать общение с Arduino. Затем мы объявили контакт реле как выходной вывод, потому что мы дадим напряжение от Ардуино к реле для активации реле. Реле работает обратно (High означает Low для реле).

Lcd.begin(16,2); sensor.begin(); pinMode(relay_pin, OUTPUT); digitalWrite(relay_pin, HIGH);

В функции цикла мы очищаем ЖК-экран, а затем считываем значение температуры от датчика.

Lcd.clear(); float t = sensor.readTemperature(); if (isnan(t)) { lcd.print("Failed"); delay(1000); return; }

Затем мы печатаем значение температуры на ЖК-дисплее, и если значение температуры будет больше 35, тогда реле будет активировано, и вентилятор начнет вращаться.

Lcd.setCursor(0,0); lcd.print("Temp: "); lcd.print(t); lcd.print(" C"); if (t > 35){ digitalWrite(relay_pin, LOW); lcd.setCursor(0,1); lcd.print("Fan is ON "); delay(10); }

На этом всё. Хороших вам проектов!

Поделится с вами опытом создания умного регулятора вращения вентиляторов, с участием термодатчика, LCD-дисплея и, конечно же, Arduino.

Несколько месяцев назад я прочел ряд статей об Arduino и весьма заинтересовался данным девайсом, а вскоре решил приобрести. Надо отметить, что я далек от микроэлектроники, поэтому плата расположила к себе прежде всего относительной простотой в освоении. Набаловавшись с LED-ами и «Hello world»-ами, захотелось сделать что-нибудь практичное, заодно более детально ознакомиться с возможностями Arduino . Памятуя об аномально жарком лете 2010 года, возникла идея собрать регулятор оборотов кулера в зависимости от температуры с выводом всех сопутствующих характеристик на LCD. Надеюсь, что кому-нибудь данная схема или ее вариации смогут пригодиться, поэтому решил выложить свои наброски.

Для данной схемы нам понадобится:

  • Собственно сама плата Arduino или аналог ;
  • Макетная плата для сборки компонентов схемы;
  • Дисплей WH1601A-NGG-CT с подстроечным резистором на 20 кОм или аналогичный;
  • Резисторы – 220 Ом , 10 кОм , 4.7 кОм ;
  • Биполярный транзистор SS8050D или аналогичный ему;
  • Цифровой температурный датчик DS18B20 ;
  • Диод 1N4148 или аналог;
  • Вентилятор осевой трехпроводной (на 12В), например - компьютерный;
  • Разъем гнезда питания 2,1/5,5 мм.

Компьютерный кулер имеет три провода , два из которых - красный (+12V) и черный (GND) используются для питания, а третий (желтый) связан с таходатчиком, построенном на элементе Холла. К сожалению, 5V с платы нам явно недостаточно, но 6 цифровых выходов Arduino могут работать в режиме ШИМ (они отмечены на самой плате белыми квадратиками, либо буквами PWM), поэтому мы можем регулировать подачу сигнала с платы на реле, которое будет отвечать за изменение напряжения, подаваемого на вентилятор.

Получать информацию об оборотах мы будем с третьего провода от таходатчика, воспользовавшись модифицированным способом , основанным на реализации прерываний , которые у большинства Arduino могут приходить на цифровые pin 2 (прерывание 0) и 3 (прерывание 1). Кстати, у Arduino Mega наличествует еще 4 дополнительных пина с возможностью получения прерываний.

Теперь необходимо расположить цифровой датчик температуры , данные которого мы будем использовать для регулирования напряжения, подаваемого на цифровой выход с ШИМ, а следовательно для «открытия» канала напряжения вентилятора. Для датчиков фирмы Dallas существует собственная библиотека Arduino – DallasTemperature , которую впоследствии мы и будем подключать в скетче. Библиотеку необходимо распаковать в каталог arduino-0018/libraries /.

Осталось последнее – подключить LCD , где у нас будет отображаться вся текущая информация о температуре и скорости вентилятора. Поскольку я использовал для сборки экран WH1601A, могут иметь место известные проблемы с отображением строк. Для их устранения мы воспользуемся библиотекой LiquidCrystalRus , которую необходимо также распаковать в каталог arduino-0018/libraries/ .

//Подключаем библиотеку для термодатчика #include //Подключаем библиотеку для LCD #include #define PowerPin 9 // pin для контроля питания вентилятора #define HallSensor 2 // pin для датчика оборотов вентилятора (прерывание) #define TempPin 7 // pin для датчика температуры LiquidCrystalRus lcd(12, 11, 10, 6, 5, 4, 3); //Подключение LCD DallasTemperature tempSensor; int NbTopsFan, Calc, fadeValue; //целочисленные переменные для расчетов float temper; //вещественная переменная для хранения температуры typedef struct{ // Вводим новый тип переменных для вентиляторов char fantype; unsigned int fandiv; }fanspec; //Массив переменных нового типа fanspec fanspace={{0,1},{1,2},{2,8}}; //Переменная, отвечающая за выбор типа датчика вентилятора (1 – униполярный датчик Холла, 2 –биполярный датчик Холла) char fan = 2; //Эта функция у нас будет вызываться при каждом прерывании void rpm () { NbTopsFan++; } // Функция расчета подаваемого напряжения на цифровой pin с ШИМ void temp () { fadeValue = min (int (temper*7),255); // Умножаем температуру на коэффициент, // берем от произведения целое число } // Т.к. максимальное значение ШИМ составляет 255, то подавать больше не имеет смысла – берем минимум из двух void setup () { tempSensor.begin (TempPin); //Запускаем температурный датчик lcd.begin (16, 2); //Задаем характеристики LCD lcd.setDRAMModel (LCD_DRAM_WH1601); //И тип дисплея pinMode (HallSensor, INPUT ); // Настраиваем pin на получение прерываний attachInterrupt (0, rpm, RISING ); //Привязываем прерывание по номеру 0 к нашей функции, причем высчитываться она будет каждый раз при смене сигнала } void loop () { temper = tempSensor.getTemperature(); // Получаем температуру temp(); // Высчитываем подаваемое напряжение на ШИМ analogWrite (PowerPin, fadeValue); // Подаем его NbTopsFan = 0; // Обнуляем переменную, содержащую обороты delay (1000); //Ждем 1 секунду Calc = ((NbTopsFan * 60)/fanspace.fandiv); //Рассчитываем величину оборотов за 60 секунд, поделенную на множитель вентилятора lcd.print (Calc, DEC ); //Выводим рассчитанную величину в десятичном виде lcd.print (" rpm - " ); lcd.print (temper); //Выводим температуру lcd.home (); }

Похожие публикации