Одной из задач, решаемых системами домашней автоматизации, является изменение климата в помещении с целью его поддержания в оптимальном для человека состоянии. Самым простым способом реализовать такое поддержание – управление вентилятором.
Для создания не очень сложных систем домашней автоматизации сегодня зачастую применяют одноплатный компьютер Raspberry Pi, с помощью которого можно без проблем реализовать управление вентилятором.
В данном обучающем проекте Raspberry будет управлять небольшим вентилятором 12 В на основании показаний температуры датчика TMP102. TMP102 представляет собой цифровой датчик температуры, измеряющем в диапазоне от –25 °C до +85 °C и имеющем точность 0.5 °C. Связь с TMP102 осуществляется по протоколу I2C. Напряжение питания датчика может быть в диапазоне от 1.4 В до 3.6 В, сам он располагается в миниатюрном корпусе SOT563. Чтобы не заморачиваться с пайкой этого компонента, компания Sparkfun выпускает удобные модули с TMP102. Ниже представлена схема подключения Raspberry Pi к датчику температуры TMP102 и цепи управления вентилятором. Цепь управления состоит из NPN-транзистора 2N3904, резистора 180 Ом и диода Шоттки. Диод предназначен для предотвращения повреждения вентилятора транзистором из-за потенциального оттока напряжения при отключении вентилятора. Диод в этой конфигурации иногда называют демпфером. Транзистор в данной конфигурации работает в качестве ключа, включая и отключая вентилятор. При такой схеме подключения и таких компонентах можно управлять нагрузкой с потребляемым током до 2 А.

Код для Raspberry Pi представлен ниже. Этот код позволяет включать вентилятор, когда температура поднимается выше TEMP_THRESHOLD. Вентилятор будет работать до тех пор, пока температура не опустится ниже порога TEMP_HYST. Таким образом, вентилятор будет поддерживать оптимальную температуру в определенном диапазоне.
import RPi.GPIO as GPIO
import smbus
import time
I2C_BUS = 0
bus = smbus.SMBus(I2C_BUS)
#7-битный адрес, будет смещен, чтобы добавить бит записи/чтения
DEVICE_ADDRESS = 0x48
TEMP_THRESHOLD = 78
TEMP_HYST = 2
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
FAN_PIN = 23
GPIO.setup(FAN_PIN, GPIO.OUT)
while True:
time.sleep(1)
#Считываем регистр с температурой
temp_reg_12bit = bus.read_word_data(DEVICE_ADDRESS , 0 )
temp_low = (temp_reg_12bit & 0xff00) >> 8
temp_high = (temp_reg_12bit & 0x00ff)
#конвертируем температуру
temp = ((( temp_high * 256 ) + temp_low) >> 4 )
#обрабатываем отрицательную температуру
if temp > 0x7FF:
temp = temp-4096;
temp_C = float(temp) * 0.0625
temp_F = temp_C * 9/5+32
print "Temp = %3.1f C -- %3.1f F" % (temp_C,temp_F)
#управляем вентилятором на основании данных о температуре
if(temp_F > TEMP_THRESHOLD):
GPIO.output(FAN_PIN, True)
if(temp_F < (TEMP_THRESHOLD - TEMP_HYST)):
GPIO.output(FAN_PIN, False)
© digitrode.ru