| 01 | Содержание: 
 |  | 
| 02 | На заметку: | 
У данной статьи есть видеоверсия! Подписывайтесь на канал , чтобы быть в курсе обновлений! |  | 
| 05 | Но поскольку, по умолчанию, вентилятор напрямую подключается к гребенке GPIO — это подразумевает постоянную его работу. Несмотря на относительную бесшумность работы вентилятора, его постоянная работа не является эффективным использованием активной системы охлаждения. В то же время, постоянное шуршание вентилятора может просто раздражать. | Проверено — автор рекомендует:Купить Корпус для Raspberry Pi 3 Model B с активным охлаждением (4 цвета) | 
| 06 | Дискомфорта доставляет и тот факт, что даже если Raspberry Pi 3 выключен, при подключенном питании вентилятор все равно будет работать. Да и в конце концов, почему бы просто не сэкономить немного электроэнергии? |  | 
| 07 | В данной статье будет показано, как при помощи нехитрых и не сложных манипуляций превратить существующую систему охлаждения в умную, которая будет включаться только тогда, когда процессору это действительно необходимо. |  | 
| 08 | Вся модификация состоит из 2 частей — аппаратной и программной. |  | 
| 09 | Аппаратная часть Заключается во внедрении в схему подключения вентилятора обычного транзистора, при помощи которого управляющий пин GPIO будет управлять включением вентилятора. Подойдет любой транзистор с подходящими характеристиками: 
 |  | 
| 10 | В данном примере используется NPN-транзистор 2N5551. Схема подключения следующая: | Проверено — автор рекомендует:Купить Транзистор 2N5551 (NPN, TO-92) Видео-инструкция о покупке со скидками на Aliexpress | 
| 12 | Наглядная схема: |  | 
| 14 | На заметку: | 
Токоограничивающий резистор нужен для устранения нагрузки с пина GPIO, максимальный ток которого не должен превышать 16 мА.
                         |  | 
| 15 | Программная часть Работа скрипта основана на ежесекундном запросе температуры процессора. Из терминала подобную информацию можно получить выполнив команду vcgencmd с параметром measure_temp: |  | 
| 16 | 1 vcgencmd measure_temp |  | 
| 18 | Логика скрипта такова — при достижении заданной температуры (более 60°С) вентилятор включается, и отключается только когда температура снизится более чем на 10°С от максимального порога (менее 50°С). |  | 
| 19 | Python | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 #!/usr/bin/python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO                     # Импортируем библиотеку по работе с GPIO
import sys, traceback                       # Импортируем библиотеки для обработки исключений
from time import sleep                      # Импортируем библиотеку для работы со временем
from re import findall                      # Импортируем библиотеку по работе с регулярными выражениями
from subprocess import check_output         # Импортируем библиотеку по работе с внешними процессами
def get_temp():
    temp = check_output(["vcgencmd","measure_temp"]).decode()    # Выполняем запрос температуры
    temp = float(findall('\d+\.\d+', temp)[0])                   # Извлекаем при помощи регулярного выражения значение температуры из строки "temp=47.8'C"
    return(temp)                            # Возвращаем результат
try:
    tempOn = 60                             # Температура включения кулера
    controlPin = 14                         # Пин отвечающий за управление
    pinState = False                        # Актуальное состояние кулера
    
    # === Инициализация пинов ===
    GPIO.setmode(GPIO.BCM)                  # Режим нумерации в BCM
    GPIO.setup(controlPin, GPIO.OUT, initial=0) # Управляющий пин в режим OUTPUT
    while True:                             # Бесконечный цикл запроса температуры
        temp = get_temp()                   # Получаем значение температуры
        if temp > tempOn and not pinState or temp < tempOn - 10 and pinState:
            pinState = not pinState         # Меняем статус состояния
            GPIO.output(controlPin, pinState) # Задаем новый статус пину управления
        print(str(temp) + "  " + str(pinState)) # Выводим температуру в консоль
        sleep(1)                            # Пауза - 1 секунда
except KeyboardInterrupt:
    # ...
    print("Exit pressed Ctrl+C")            # Выход из программы по нажатию Ctrl+C
except:
    # ...
    print("Other Exception")                # Прочие исключения
    print("--- Start Exception Data:")
    traceback.print_exc(limit=2, file=sys.stdout) # Подробности исключения через traceback
    print("--- End Exception Data:")
finally:
    print("CleanUp")                        # Информируем о сбросе пинов
    GPIO.cleanup()                          # Возвращаем пины в исходное состояние
    print("End of program")                 # Информируем о завершении работы программы |  | 
| 20 | Как поместить Python-скрипт в автозагрузку Остается сделать так, чтобы скрипт, контролирующий работу вентилятора охлаждения, автоматически запускался каждый раз при загрузке системы. |  | 
| 21 | Для этого, в конец файла /etc/rc.local: |  | 
| 22 | 1 sudo nano /etc/rc.local |  | 
| 23 | Нужно поместить команду запуска скрипта перед строкой exit 0: |  | 
| 24 | 1 sudo python /home/pi/temp_control.py & |  | 
| 25 | На заметку: | 
Наличие символа & в конце команды обязательно, так как он является флагом запуска процесса в фоновом режиме. Если по каким-то причинам забыть его указать, то после перезагрузки загрузка системы завершится черным экраном. В этом случае, необходимо переключиться в консоль Ctrl+Alt+F1, остановить исполнение скрипта Ctrl+C. И далее отредактировать команду автозапуска так, как указано выше.
                         |  | 
| 26 | После перезагрузки скрипт будет автоматически запущен и вентилятор будет включаться при наступлении заданных условий. |  | 
| 27 | Чтобы проверить факт запуска, после перезагрузки, нужно переключиться в консоль Ctrl+Alt+F1, и убедиться, что данные об актуальной температуре поступают, после этого вернуться в оконный интерфейс можно комбинацией клавиш Ctrl+Alt+F7. |  | 
| 28 | Как проверить? Для проверки работоспособности скрипта нужно «разогреть» процессор до нужной температуры и посмотреть, как на это будет реагировать система охлаждения. |  | 
| 29 | «Нагревать» процессор будет утилита sysbench, которую предварительно нужно установить: |  | 
| 30 | 1 sudo apt-get install sysbench |  | 
| 31 | Запуск утилиты с задействованием 4 ядер: |  | 
| 32 | 1 sysbench --num-threads=4 --test=cpu --cpu-max-prime=20000 --validate run |  | 
| 33 | Температура процессора сразу начнет повышаться. |  | 
| 34 | Контроль температуры будет осуществляться упрощенным вариантом скрипта управления на Python: |  | 
| 35 | Python | 1 2 3 4 5 6 7 8 9 10 11 12 13 import os                                   # Импортируем библиотеку по работе с ОС
from time import sleep                      # Импортируем библиотеку для работы со временем
from re import findall                      # Импортируем библиотеку по работе с регулярными выражениями
def get_temp():
    temp = os.popen("vcgencmd measure_temp").readline()  # Выполняем запрос температуры
    temp = float(findall('\d+\.\d+', temp)[0]) # Извлекаем при помощи RE значение температуры из строки "temp=47.8'C"
    return(temp)                            # Возвращаем результат
while True:                                 # Бесконечный цикл запроса температуры
    temp = get_temp()                       # Получаем значение температуры
    print(temp)                             # Выводим температуру в консоль
    sleep(1)                                # Ждем 1 секунду |  | 
| 37 | Принудительно завершить, как выполнение теста утилитой sysbench, так и Python-скрипта можно сочетанием клавиш Ctrl+C. |  | 
| 38 | Удаление скрипта из автозагрузки Для удаления скрипта из автозагрузки нужно просто удалить строку с запуском скрипта из файла /etc/rc.local. |  | 
| 39 | Похожие запросы: 
 |  |