Рубрики
Схемы на Arduino

Вентилятор на Arduino Uno, управляемый с помощью температуры

В этом проекте на Arduino мы будем управлять скоростью вращения вентилятора постоянного тока в соответствии с температурой в комнате и показывать изменения этих параметров (температуры и скорости вращения вентилятора) на жидкокристаллическом (ЖК) дисплее 16×2. В проекте будет происходить обмен данными между Arduino, ЖК дисплеем и датчиком температуры DHT11. Управлять скоростью вращения вентилятора постоянного тока мы будем с помощью широтно-импульсной (ШИМ) модуляции, с помощью которой можно управлять средним значением напряжения, подаваемого на вентилятор.

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

  1. Плата Arduino UNO (купить на AliExpress).
  2. Датчик температуры и влажности DHT11 (купить на AliExpress).
  3. Транзистор 2n2222 (купить на AliExpress).
  4. ЖК дисплей 16×2 (купить на AliExpress).
  5. Вентилятор постоянного тока.
  6. Резистор 1 кОм (купить на AliExpress).
  7. Батарейка на 9 В.
  8. Соединительные провода.

Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158

Принципы ШИМ модуляции

Наша конструкция будет состоять из трех частей. В первой части будет измеряться температура с помощью датчика температуры и влажности DHT11. Вторая часть будет считывать значение температуры с выходного контакта DHT11, преобразовывать ее в температуру по шкале Цельсия и управлять скоростью вращения вентилятора постоянного тока с помощью ШИМ. А третья часть проекта будет показывать значение температуры и скорости вращения вентилятора на ЖК дисплее.

В этом проекте мы использовали датчик DHT11, который подробно описан в статье про измерение температуры и влажности с помощью Arduino. Но в этом проекте мы этот датчик будем использовать только для измерения температуры.

Принцип функционирования проекта достаточно прост. Мы будем создавать сигнал ШИМ модуляции на соответствующем контакте ШИМ платы Arduino, который будем подавать на базу транзистора. В соответствии с этим управляющим напряжением транзистор будет изменять значение напряжения на своем выходе, с которого и подается управляющее напряжение на вентилятор.

Пример ШИМ модуляции на цифровом осциллографе представлен на следующем рисунке.

Скорость вращения вентилятора и соответствующие ей значения ШИМ и ее коэффициента заполнения представлены в следующей таблице.

Температура Цикл занятости ШИМ Значение, передаваемое в функцию управления ШИМ в Arduino Скорость вращения вентилятора
менее 26 0% 0 выключен
26 20% 51 20%
27 40% 102 40%
28 60% 153 60%
29 80% 204 80%
больше 29 100% 255 100%

Что такое ШИМ? Простыми словами это такая технология, с помощью которой мы можем управлять напряжением или мощностью. К примеру, мы подаем на электродвигатель напряжение 5 Вольт, которое будет заставлять его вращаться с некоторой скоростью. Если после этого мы снизим подаваемое напряжение на 2 Вольта (т. е. до 3 Вольт), то скорость вращения электродвигателя также уменьшится. Более подробно об использовании ШИМ можно прочитать в следующей статье: управлению яркостью свечения светодиода с помощью ШИМ.

Основная идея ШИМ состоит в использовании цифровых импульсов с определенным коэффициентом заполнения (циклом занятости), который и будет отвечать за скорость вращения вентилятора.

К примеру, мы будем использовать ШИМ с коэффициентом заполнения 50% — это будет означать что на управляемое устройство мы будем подавать половину максимального напряжения импульса.

Формула для расчета коэффициента заполнения будет выглядеть следующим образом:

Duty Cycle= Ton/T

где T – общее время импульса Ton+Toff (сумма его активного и пассивного состояния)
Ton – время активного состояния импульса (означает 1 )
Toff – время пассивного состояния импульса (означает 0)

Более наглядно это представлено на следующих рисунках.

Работа схемы

Схема устройства представлена на следующем рисунке.

ЖК дисплей подключен к плате Arduino в 4-битном режиме, более подробно об этом можно прочитать в статье про подключение ЖК дисплея к Arduino. Контакты ЖК дисплея RS, EN, D4, D5, D6 и D7 подсоединены к цифровым контактам Arduino 7, 6, 5, 4, 3 и 2. Датчик DHT11 подсоединен к контакту 12 Arduino через подтягивающий резистор. Контакт 9 Arduino используется для управления скоростью вращения вентилятора (с помощью транзистора).

Исходный код программы

Сначала мы произведем подключение библиотек для работы с ЖК дисплеем и датчиком температуры (dht), а затем инициализируем контакты для подключения ЖК дисплея, датчика температуры и вентилятора.

Затем инициализируем все остальные нужные нам вещи в секции setup. А затем в секции loop мы будем использовать dht-функции для считывания значений с датчика температуры, извлекать из этих значений температуру, переводить ее в температуру по шкале Цельсия и отображать ее значение на ЖК дисплее.

После этого мы будем сравнивать значение температуры с заранее установленными нами температурными порогами (выше приведенная в тексте статьи таблица) и исходя из результатов сравнения будем генерировать соответствующее значение ШИМ на выходном контакте, к которому подключен транзистор, управляющий скоростью вращения вентилятора.

Для генерации ШИМ мы будем использовать функцию analogWrite(pin, PWM value). Мы будем использовать все 8 бит. Значение ШИМ будет эквивалентно аналоговому значения напряжения. То есть, к примеру, если мы хотим сгенерировать ШИМ с коэффициентом заполнения 20%, то мы в эту функцию (analogWrite) должны передать значение 255/5.

Далее приведен полный текст программы.

Внимание: если код этой программы не хочет у вас компилироваться из-за ошибки в строке «dht DHT;», то попробуйте способ работы с датчиком DHT11, описанный в этой статье. То есть в начале программы используйте строки:

Заметьте что теперь название библиотеки обязательно пишется с большой буквы. И формат команды «dht DHT;» тоже изменился — в ней теперь нужно указывать параметры.

Далее считывание данных температуры и влажности в основном цикле программы осуществляется с помощью команд:

Видео, демонстрирующее работу схемы

Также про вентилятор на симуляторе Arduino Uno, управляемый с помощью температуры, можно посмотреть следующее подробное обучающее видео (на английском языке):

24 ответа к “Вентилятор на Arduino Uno, управляемый с помощью температуры”

Доброго дня. Несколько вопросов.
1. Возможно ли применение датчика DS18B20
2. Как использовать дисплей с шиной i2c
3. Возможно ли применение Arduino Nano.

Датчик DHT11 уже есть в этом проекте, а дополнительные вентиляторы можно добавить различными способами в зависимости от того как вы планируете их использовать. Можно по аналогии цеплять на другие контакты платы Ардуино, но тогда для каждого понадобится отдельная батарейка. Но можно сделать и вариант с совместным питанием нескольких вентиляторов от одного источника

Доброго дня. А подскажите — если вместо 2n2222 поставить КТ817Б который расчитан на высокий ток (хочу поставить 6 вентилояторов в нагрузку) как это отразится на работе схемы?

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

Интересная схема можно ли с вами связаться чтобы купить по боксбери в сборе для простой установки

Связаться то можно, но только я ничего не продаю. У меня сайт чисто информационный

К сожалению, про управление компрессором у нас никаких статей на сайте нет. Но есть, к примеру, статьи про управление водяным насосом. Если подойдут, то могу подсказать ссылки на них

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

Добрый вечер. На моем сайте уже достаточно много схем, где транзистор управляет нагрузкой в своей цепи именно так, как изображено на представленной схеме. Это самый простой способ, но не самый лучший, конечно. Лучше использовать реле, тогда будет обеспечена хорошая развязка между цепью вентилятора и платой Ардиуно. А какой вариант предлагаете вы? Можете пример привести?

Меня возмутила передача сигнала по одному проводу.
И хотел уточнить, это сложившаяся практика?
Или, всё-таки, может быть существует некое соглашение об общем подключении, когда достаточно указать один провод?

Реле потребует два провода точно, но не обеспечит необходимую скорость для передачи используемого сигнала.

Ну в этой схеме особенно большая скорость передачи не нужна. У каждого элемента есть свои достоинства и недостатки, идеального во всех отношениях элемента не существует

Передача сигнала по одному проводу — сейчас это очень часто используется, в том числе во многих датчиках. Например, в датчике температуры DS18B20. Хотя один из его контактов все же подключается к общей земле с платой Ардуино. Я, конечно, тоже в определенной мере привык к старым схемам подключения транзисторов, в которых на базу транзистора подается напряжение смещения через одиночный резистор или через базовый делитель на двух резисторах и только после этого на базу подается сигнал относительно земли, но времена меняются, техника идет вперед

А где вы собирали эту схему? я попробовал собрать в ISIS PROFESSIONAL , но там нет gnd да и других некоторых портов

Лично я не собирал, студенты мои собирали. А почему вы думаете что она не должна работать? На мой взгляд, в ней все прозрачно. ISIS PROFESSIONAL — не работал с ним, поэтому, к сожалению, не могу ничего подсказать по этому поводу

Есть какое нибудь видео по сборке схемы?
Никак не могу понять что с чем соединять и как это сделать.
Или фотография уже готовой схемы в живую.

Нет, такого видео нет. Вроде бы на приведенной в статье схеме отчетливо видно что с чем соединять. Соединения какого элемента на схеме у вас вызывают затруднения?

Да не за что, мы рады что у вас получилось. Заходите к нам еще ))

Доброго.. подскажите что значить в коде dht DHT;
пробовал на двух копиях проги и в обоих случаях там остановка компиляции…

Это создание объекта для работы с датчиком DHT11. Возможно, у вас код этой программы не хочет запускаться из-за того что он был написан для старых версий Arduino IDE — в то время название библиотек можно было писать маленькими буквами, сейчас уже нельзя. Используйте код программы для работы с датчиком DHT11 из этой статьи. Я сейчас добавлю соответствующее пояснение в основной текст программы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *