Небольшой топик в DIY сообщество который нацелен на раскрытие темы управления компьютерными вентиляторами (3Pin и 4Pin) при помощи контроллера Esp8266. В статье изучим алгоритм управления шим сигналом напрямую и через мосфет, считывание оборотов вентилятора, а так же добавление девайса в умный дом силами HomeAssistant.
Если тема интересна то добро пожаловать под кат.
Начнем статью со спецификаций. Компьютерные вентиляторы стандартизированы, и если обозначить рамки моделей в пределах обычных домашних пк, то можно взять документ от Intel который описывает требования для этих девайсов.
(может не открываться в Рф и Белоруссии, используйте впн)
https://www.intel.com/content/dam/support/us/en/documents/intel-nuc/intel-4wire-pwm-fans-specs.pdf
Сразу добавлю сюда ссылки на свои даташиы от крупных производителей таких как NCOTUA
https://noctua.at/pub/media/wysiwyg/Noctua_PWM_specifications_white_paper.pdf
и DELTA
https://www.delta-fan.com/Upload/PWM/Delta_PWM.pdf
Открыв документ от интела, станет понятно что стандарт очень старый и датирован аж 2003 годом а его последнее обновление было в 2005 и видимо стандарт настолько идеален что его изменение с тех лет не потребовалось.
Если говорить про стандарт кратко то 4пин стандарт максимально прост и требует выполнение таковых условий:
В сноске можно заметить что производитель настойчиво предлагает установить подтяжку 3,3в для пина шим сигнала.
Для подсчета оборотов вентилятор делает 2 импульса на оборот крыльчатки, на выходе квадратная волна которую мы должны считать микроконтроллером.
Управление вентилятором не сильно сложнее, на вход подается ве та же квадратная волна разной скважности от которой будет зависеть скорость вращения вентилятора. Заполнение может быть от 0 до 100% но никто не обещает что вентиляторы будут останавливаться, а так же без ШИМ сигнала, все компьютерные вентиляторы будут крутиться на 100% оборотах так как не инвертирован.
Распиновку коннектора так же лучше взять из документов NOCTUA так как их документ выполнен значительно нагляднее.
Стоит игнорировать 5в и 24в вентиляторы так как это более редкие вариант которые не просто встретить в обычном пк.
Правда 12в вариант никак не отличается по распиновке от других, и вот как она выглядит:
Для вентиляторов 3пин ситуация идентичная но из уравнения убирается четвертый (синий) контакт шим управления. При этом дизайн разьема выполнен так что в 4пин можно установить вентилятор с 3пин подключением, и наоборот.
Для тестов я буду использовать вентиляторы XPG Vento PRO, так как они есть у меня в наличии, они поддерживают PWM а главное то что я делал обзор на них и прекрасно знаю их характеристики дабы сравнить их с тем что я получаю от микроконтроллера. https://mysku.me/blog/russia-stores/88421.html
Начнем с самого простого, а именно управление вентилятора по ШИМ сигналу.
Современные микроконтроллеры очень быстры, а огромное комьюнити и поддержка от производителя сделала данную задачу максимально тривиальной.
Для начала надо выбрать пины которые поддерживают ШИМ модуляцию. Все сильно зависит от того какое исполнение у вайшей платы с ESP8266, но зачастую нет никаких проблем поискать рапиновку по запросу «esp8266 вашаплата pinout».
Вот так для примера выглядит распиновка Wemos D1 mini, а пины с шим сигналом легко определить по небольшой загогулине вместо ровной линии от платы до номера контакта в инфографике.
Так же советую выбирать пины которые минимально заняты в сервисной жизни контроллера, например не лучшей идеей будет занимать пины Serial порта, пины общения с памятью или I2c который может понадобиться в будущем.
Подробнее про пины, шим и прерывания на ESP8266 можно почитать тут: https://arduino-esp8266.readthedocs.io/en/latest/reference.html
Для управления вентилятором я решил взять пин 6 (GPIO 12) так как он ничем не занят, а так же поддерживает PWM выход.
В начале кода я объявляю переменную для указания пина который будет использоваться под управление вентилятором. Можно делать это напрямую в коде но проще и удобнее заранее определить переменные дабы не искать их по коду если их понадобится изменить.
#define Fan_Pin_PWM 12
После чего надо настроить выбранный нами пин на выход.
pinMode(Fan_Pin_PWM, OUTPUT);
А теперь важный момент. В стандартном виде частота PWM выходов составляет всего 1кгц и она нам не подходит, ее нужно изменить до 25кгц в соответствии со стандартами для PWM вентиляторов. ЕSP8266 поддерживает частоту от 100гц до 40Кгц, но как говорит документация, чем выше частота и больше портов на высокой частоте, тем выше нагрузка на центральный процессор и меньше циклов процессора на выполнение нашего кода.
Для установки частоты заедем еще одну переменную настроек на 25000 и применим ее к шим выходам.
#define Fan_PWM_FRQ 25000
analogWriteFreq(Fan_PWM_FRQ);
Для управления сделаем небольшую функцию которая принимает проценты и устанавливает значение на пин. Я использовал простую функцию MAP которая превращает диапазон 0-100 до 0-1024.
void SetFanLevel(int percent) {
analogWrite(Fan_Pin_PWM, map(percent, 0, 100, 0, 1024));
}
А теперь все вместе. Я завел .h файл дабы не захламлять основной скетч функциями которым не требуется постоянная модификация.
//Fan.h
//Settings
#define Fan_Pin_PWM 12
#define Fan_PWM_FRQ 25000
//Functions
void InitFan(){
pinMode(Fan_Pin_PWM, OUTPUT);
analogWriteFreq(Fan_PWM_FRQ);
}
void SetFanLevel(int percent) {
analogWrite(Fan_Pin_PWM, map(percent, 0, 100, 0, 254));
}
Теперь код немного усложняется. Но логика очень простая. Мы будем использовать аппаратные прерывания на пине, выставим условие при котором будет вызываться функция, которая будет считать обороты.
Для начала заведем переменную в которой будут храниться обороты. Приставка volatile говорит микроконтроллеру что данная переменная должна храниться в RAM а не постоянной памяти.
//Data
volatile int Fan_InterrupCount;
Далее мы добавляем новую переменную для пина тахометра, пин так же выбран по поддерживаемыми фичам и нулевой загруженности сервисными задачами.
#define Fan_Pin_Tach 14
Для пина тахометра включим аппаратную подтяжку как это требует спецификация вентиляторов, напряжение контроллера как раз 3,3в.
pinMode(Fan_Pin_Tach, INPUT_PULLUP);
Теперь начинается самое интересное. Нам надо подписаться на изменение состояния пина. Для этого мы пишем данную строку, в ней м указываем какой пин будет вызывать прерывание, какая функция будет вызвана, а так же при каком условии вызывать прерывание. Состояний для вызова всего 3:
attachInterrupt(digitalPinToInterrupt(Fan_Pin_Tach), HandleInterrupt, FALLING);
Далее надо написать функцию которая будет обрабатывать прерывание, в моем случае это простейший счетчик который считает +1 если произошел импульс. Для того что бы функция могла быть вызвана прерыванием, она должна иметь атрибут IRAM_ATTR
void ICACHE_RAM_ATTR HandleInterrupt() {
Fan_InterrupCount++;
}
Таким образом контроллер уже будет считать импульсы от вентилятора, но теперь надо пересчитать их в обороты/секунда.
Для этого заведем 3 переменных, в первой мы настраиваем частоту опроса вентилятора, во второй будем хранить время для подсчета промежутка между расчётами оборотов, а в третей будут лежать последние рассчитанные обороты вентилятора.
#define Fan_RPM_Update_Period 1000
unsigned long Fan_PrevMills =0;
int Fan_RPM =0;
А так же заведем функцию подсчета оборотов. Она каждые 1000мс (или то как мы настроили) берет последнее кол-во прерываний, пересчитывает в обороты/сек, умножает результат на 60 (тк мы считаем обороты/минута, а получаем обороты за 1 секунду), обнуляет счетчик прерываний и записывает данные в переменную.
Данная функция должна работать в Loop и абсолютно не дружит с большими Delay(x) а так же зависаниями контроллера. Тут есть свои минусы и плюсы разных решений подсчета, но мне нравится именно это, когда каждую секунду ты просто получаешь данные от вентилятора.
void CalcFanRPM(){
if ((millis() - Fan_PrevMills) > Fan_RPM_Update_Period) {
Fan_PrevMills = millis();
int count = Fan_InterrupCount;
Fan_RPM = count / 2 * 60;
Fan_InterrupCount=0;
}
}
Для удобства в функцию расчета я добавил вызов функции DisplayFanRPM(), и теперь каждую 1сек в сериал порт выводятся данные об оборотах вентилятора.
void DisplayFanRPM() {
Serial.print(Fan_RPM, DEC);
Serial.print(" RPM\r\n");
}
Немного доработаем тестовый скетч и проверим результат.
#include "Fan.h"
int brightness = 0; // how bright the LED is
int fadeAmount = 1; // how many points to fade the LED by
void setup() {
InitFan();
}
void loop() {
CalcFanRPM();
SetFanLevel(brightness);
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 100) {
fadeAmount = -fadeAmount;
}
//Добавим вывод данных об уровне для удобства.
Serial.print(brightness, DEC);
Serial.print(" Level\r\n");
delay(300);
}
Максимальные обороты как и ожидалось оказались на уровне 2300об/мин, минимальные обороты аж 260, что немного больше чем должно быть но в целом в рамках нормы.
На графике видно что при понижении напряжения можно добиться еще меньше оборотов но об этом дальше.
А так выглядит наша импровизированная библиотека:
//Settings
#define Fan_Pin_Tach 14
#define Fan_Pin_PWM 12
#define Fan_PWM_FRQ 25000
#define Fan_RPM_Update_Period 1000
//Data
volatile int Fan_InterrupCount;
unsigned long Fan_PrevMills;
int Fan_RPM;
void ICACHE_RAM_ATTR HandleInterrupt() { //This is the function called by the interrupt
Fan_InterrupCount++;
}
void InitFan(){
Fan_InterrupCount=0;
Fan_RPM=0;
Fan_InterrupCount=0;
//Fan Controls
analogWriteFreq(Fan_PWM_FRQ);
pinMode(Fan_Pin_PWM, OUTPUT);
//Fan data
pinMode(Fan_Pin_Tach, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(Fan_Pin_Tach), HandleInterrupt, FALLING);
}
void SetFanLevel(int percent) {
analogWrite(Fan_Pin_PWM, map(percent, 0, 100, 0, 255));
}
void DisplayFanRPM() {
Serial.print(Fan_RPM, DEC);
Serial.print(" RPM\r\n");
}
void CalcFanRPM(){
if ((millis() - Fan_PrevMills) > Fan_RPM_Update_Period) {
Fan_PrevMills = millis();
int count = Fan_InterrupCount;
Fan_InterrupCount=0;
Fan_RPM = count / 2 * 60;
DisplayFanRPM();
}
}
Теперь опробуем управлять сразу двумя вентиляторами. На этом пункте придется убрать функционал замера оборотов, так как он начинает выдавать полную ерунду.
Дорабатываем функции инициализации вентилятора и применении уровня оборотов.
Теперь каждая из функций будет принимать сначала пин на котором находится вентилятор.
//Settings
#define Fan_PWM_FRQ 25000
void InitFan(int fanpin){
//Fan Controls
analogWriteFreq(Fan_PWM_FRQ);
pinMode(fanpin, OUTPUT);
}
void SetFanLevel(int fanpin,int percent) {
analogWrite(fanpin, map(percent, 0, 100, 0, 255));
}
Заменим код тестового скетча, теперь вентиляторы меняют свою скорость относительно друг друга.
#include "Fan.h"
int brightness = 0;
int fadeAmount = 1;
void setup() {
Serial.begin(115200);
InitFan(14);
InitFan(12);
}
void loop() {
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 100) {
fadeAmount = -fadeAmount;
}
Serial.print(brightness, DEC);
Serial.print(" Fan level\r\n");
SetFanLevel(14, brightness);
SetFanLevel(12, 100-brightness);
delay(300);
}
Для более наглядной демонстрации я поставил статичные обороты, левый крутится на 100% а правый на 1%
#include "Fan.h"
void setup() {
Serial.begin(115200);
InitFan(14);
InitFan(12);
SetFanLevel(14, 1);
SetFanLevel(12, 1);
}
void loop() {
}
Теперь перейдем к более практичному примеру управления вентилятором.
Первым делом конечно же создаем прошивку в ESPHOME и прошиваем ее в контроллер.
И теперь можно начать писать YAML файл для управления вентилятором.
fan:
- platform: speed
output: Vento_Pro_PWM
name: "XPG Vento PRO Test"
output:
- platform: esp8266_pwm
id: Vento_Pro_PWM
#Пин вентилятора
pin: 14
#Частота шим для управления вентилятором
frequency: "25000 Hz"
#Диапазон оборотов вентилятора
min_power: 1%
max_power: 100%
Для управления вентилятором я добавил карточку на тестовую страницу, это Mushrom карточка которой нет в обычном HomeAssistant.
А вот так работает управление из панели умного дома. Как видно все работает но при этом отключить вентилятор полностью не удастся, ниже минимальных оборотов он по PWM сигналу крутиться не может.
Решить проблему выключения вентилятора можно двумя возможными вариантами.
1 — Поставить мосфет. Достаточно любого мосфета на ток 2+А и с управлением от 3в, в коде ESPHOME добавить автоматизацию которая будет следить за выставленным уровнем вентилятора и если он более 0 то включить мосфет, а если 0 то выключить. Тем самым можно полностью выключать вертушку. В теории можно управлять питанием вентилятора через этот мосфет, но на практике я пробовал разную частоту контроллера но периодически вентиляторы пищали и сильно роняли обороты (хотя некоторые вентиляторы работают нормально), в общем не везде подойдет этот вариант.
2 — Поставить не мосфет а транзистор, за счет чего можно получить плавную регулировку напряжения (подавать шим сигнал не на вентилятор а на транзистор который управляет питанием вентилятора). С таким вариантом управления можно не только останавливать вентилятор, но и получить более низкие обороты чем заявлены производителем !
Cхема еще проще чем с мосфетом если взять не просто транзистор а сборку Дарлингтона (например TIP122).
Например вентилятор XPG VENTO PRO имеет заявленный диапазон от 450 до 2150 оборотов, при управлении сигналом PWM самые низкие обороты составили 242!
Но если регулировать его входное напряжение то можно добиться еще меньших оборотов, вплоть до 141!
Единственный минус такого способа это конечно же кпд, транзистор будет греться, но потребление обычных домашних вертушек достаточно низкое и небольшой радиатор может решить эту проблему.
При желании можно добавить еще один вентилятор в конфиг и управлять уже парой PWM вертушек, но не забываем ограничения PWM из документации, высокая частота требует много производительности от столь малого чипа, поэтому если вы хотите управлять несколькими вертушками то стоит взять контроллер помощнее (например ESP32)
Собственно в таком виде 2 вентилятора и контроллер отправились в серверную стойку где они управляются через NodeRed в зависимости от температуры воздуха в стойке.
На этом я закончу данный материал. Всем удачных самоделок и самых умных домов!
(Это можно очень просто сделать отключив электронику вентилятора — выпаяв из нее один контактов мотора и подключив свой ключ к нему и к оставшемуся контакту).
А взяв биполярник, можно сделать все еще круче)
Про регулировкой напряжением от StainlessSoul, не согласен. Есть же специально обученный вывод для управления и автор им воспользовался. Зачем городить огород из конденсатора и тд и тп?
Пы.сы. Ну и как вы правильно написали у esp8266 нет аппаратного pwm, и ему тяжело. Лучше взять esp32, у него от 6 до 16 аппаратных pwm (в зависимости от модификации чипа)
Ни каких претензий, просто восторг. ))
Я несколько таких переделал на литий. Получился фонарь-powerbank с зарядкой от USB. Удобно… :)
Ещё встречал аккумулятор типа кроны, был он в виде цилиндра.
Вот, картинку нашёл:
Был отличный способ их восстановления: каждый диск зажимался в тиски через изолирующие прокладки, и сжимался, в разумных пределах. После чего, аккумулятор работал лучше нового.(внутреннее сопротивление уменьшалось) Причиной выхода из строя, были плоские пружины внутри, они «сгнивали», а сжатие восстанавливало контакт.
А теперь подсчитайте стоимость в деньгах и трудозатраты во времени на применение этих двух вариантов. И прошу не забывать, что в случае Arduino/ESP мы, помимо собственно управления, получаем ещё миллиард плюшек.
В конце-концов, вас же не смущают наручные стрелочные часы, которые синхронизируются с радиостанцией?
Это как карьерный самосвал грузоподъёмностью в 100 тонн, на котором вы решили возить только детское ведёрко с песком…
аккумуляторы малогабаритные для электронных приборов встречались, не часто, не для всех. но применялись. не говоря уж о военной технике, где широко использовались.
да и обычные батарейки кто заряжал, кто варил, кто еще как извращался.
Заряжались они (элементы) достаточно успешно, позволяя сильно экономить на батарейках в магнитофонах, используя элементы питания до начала разрушения цинкового стаканчика.
Поэтому не нужно обобщать. В конце 90х некто Абдул Латиф Джандали уже выпускал дизайнерские техновещи, держа в голове «тыкать пальцем в экран». Но это не значит, что все должны идти таким путём — мне стилус долгое время был гораздо удобнее, и только когда резистивные экраны убили полностью — я был вынужден смириться с ёмкостным.
До того была проблема набора текста и интерфейсов. По выходу первого Айфона эта проблема решилась. Тогда и Гугл и МС очень быстро отправили свои наработки в мусор и выпустили ОС, заточенные под пальцы. Да и на Windows Mobile появились PocketCM Keyboard и Contacts, которые я с удовольствием использовал.
Китайцы кстати девайсы на Андроиде с резистивными экранами клепали ещё долго — для удешевления. Но это было полное дно.
В общем, вымерли они не из-за заговора производителей, а просто потому, что альтернатива в виде ёмкостного экрана кроет как бык овцу и не оставляет шансов в конкурентной борьбе.
Телефон на Windows Mobile у меня прекрасно работал в любое время года, и пальцем нажимался прекрасно. Только я там мог рисовать тонкие линии, в отличие от -и поэтому половина моих заметок была графическими и/или рукописными. При экране в 3 дюйма, замечу.
Видимо, причина прекращения выпуска новых бензиновых моторов европейскими производителями в этом же — «пипл против бензина, и требует прекращения их выпуска» да?
А что, на экраны были какие-то законодательные ограничения? Если так, передёргивать не надо. Впрочем, замечу, что электромобили, хоть и имеют ряд недостатков, типа запаса хода или длительности зарядки, также обладают кучей преимуществ, благодаря которым ДВС вполне могут остаться там же, где и резистивные экраны и конные повозки — чисто нишевым решением.
У вас есть много живых знакомых, которые хотели бы вернуться к резистивным экранам? Готовые обменять все эти гориллагласы на царапучий пластик, доставать стилус, чтобы тупо сделать поиск по книге контактов или чтобы набрать сообщение в мессенжере? Я таких не знаю, а те времена вспоминаю с лёгким содроганием.
Законодательные ограничения на бензиновые двигатели без поддержки населения там продавить не получится — знаете ли, демократия.
Эх, вот о чём реально жалею, так это о КПК. Где-то в середине 00-х некоторое время был у меня единственным личным компьютером, я на нём даже умудрялся работать в карманных версиях Ворда и Экселя. Не говоря уже о музыке, книгах, словарях, инженерном калькуляторе… Окончательно году в 12-м на планшет перешёл, и до сих пор иногда включаю, поностальгировать и в Героев погонять.
Если сарказм, то лет десять как устарел этот сарказм.
Под контроллером обычно понимают специализированное управляющее устройство.
Ещё, чтобы два раза не вставать, можно buzzer прикрепить и сигнализировать о сбоях.
В коде на ардуине сделать не проблема, в HA можно так же в коде либо автоматизацию сделать.
(Меа́ндр — периодический сигнал прямоугольной формы, широко используемый в радиотехнике и электронике.)
Мой друг стойку поставил на чердаке своего дома, для этого пришлось долго мониторить Kleinanzeigen (аналог Авито или OLX), чтобы найти по хорошей цене. Несмотря на то, что в Германии очень много отдают в дар, стойки пришлось брать за деньги.
Так что уже не 100%, а меньше.
выглядит стрёмно, но мне пофиг)
а, и ещё по глубине всё будет торчать, он же квадратный, а у стойки глубина почти метр и ленточная библиотека всё равно торчит сантиметров на 10 ещё
то есть надо 5 в высоту и два в глубину скручивать — 10 столиков наверно будут дороже, чем я стойку купил))
История ее сборки на лоджии и компоновка серверами и СХД эпична, лоджия достаточно маленькая и вдвоем там было не развернутся, но с помощь. молотка и какой-то матери удалось все собрать, разместить и подключить. Правда по итогу было сказано — Не трогать, ибо переделывать не будем. :)
Даже при полной нагрузке она почти бесшумна, везде топовые вертушки включая ноктуа и XPG из статьи.
В итоге места занимает мало, красиво, и огромные возможности.
Хоть и негромко работает, но его таки слыхать, особенно когда изменяются обороты, в зависимости от нагрузки на проц.
Вент вот такой:
В самом простом случае (если «совсем лень/некогда/не умею») даже штатный вентилятор можно не убирать и не отключать — поступление свежего холодного воздуха приведет к снижению температуры, оборотов и их скачков. Да, это тот случай, когда два вентилятора работают тише, чем один :).
Я как-то копал эту тему, и вроде его выпилили, так как он коряво работал.
Берите ESP32, всё может, не дорого стоит.
Минус только в том, что все крутилляторы будут привязаны к температуре процессора(если на разъем цп садить).
Лично я считаю такой вариант оптимальным. Спаял, опробовал и заказал ещё десяток таких платок заводского изготовления.
Даже странно, что китаёзы не додумались такие делать и продавать.
Может загуглите?
В компиляторах для однокристалок этот флаг обычно расшифровывают так — для переменой будет использована память, а не регистр при оптимизации. Для большинства остальных переменных будут использоваться регистры.
Но все зависит от конкретного компилятора и платформы.
Самый распространенный вариант я описал выше.
Флаг этот обычно юзают для тех переменных, к которым может быть доступ откуда угодно и очень желательно чтобы компилятор при оптимизации вообще не трогал ее.
Так что не в курсе что там у вас за вариант. Просвятите)))
все зависит от компилятора и кода.
для такого простого случая, где посути лишь счетчик прерываний и еще пару переменных, скорее всего оно могло действительно остаться доступным из какого-то регистра.
с ESP не сталкивался, там может быть иначе. (а что такое volatile, static, const и прочие скушные вещи вовсе неохото обсуждать)
А для корпусных вентиляторов есть такая функция в свежих мамках? (я и правда уже 10 лет ни разу не держал в руках свежую мамку)
Сосбтвенно у меня в ванной комнате трудится Noctua a14, уже несколько лет, в ближайшее время его ждет апгрейд с управлением оборотами тк сейчас он шпарит на 100% времени всегда.
При том свой я купил на авито с отрезанным проводом рублей за 300, к нему компактный блок на 12в тоже рублей за 250-300, провода и корпус не считаю но пусть будет 1к рублей.
Он мало того что тихий, так уже много лет работает без перерывов, ибо он настолько тихий что его можно вообще не вырубать и проблем нет! В том же леруа у большинства вытяжек отзывы очень негативные и связаны с ненадежностью.
А судя по датчику в уборной, даже когда моешься, влажность выше 61% не поднимается ( датчик в 10см от вентилятора стоит)
И да, поаккуратнее с производительностью, если не в частном доме…
Но зачем?
Особенно в комп, где есть вход для контроля обротов, даже ели нет управления оными…
Есть же куча решений без переусложнения, а следовательно дешевле и надежнее.
В то числе и mySKU.me/blog/aliexpress/80959.html
Большое спасибо.
Проделайте эксперимент. Возьмите источник питания, тестер и вентилятор. Плюс вентилятора подключите к плюсу источника питания. Минус тестера — к минусу источника питания. Плюс тестера — к выходу таходатчика вентилятора.
Возможно, ждет вас удивление…
Рано или поздно ему может надоесть получать 12-вольтовые импульсы.
И, кстати, при «ШИМе снизу» таходатчик имеет полное право показывать всякий бред: магнит вентилятора пролетает напротив датчика Холла, а мы в этот момент оторвали минус, и как же вентилятор «прижмет» сигнал к минусу, если минуса — нет?
Вот как минимум две причины, почему вентиляторы с более чем двумя проводами можно ШИМить только сверху.
Себе, чтобы получить обороты ниже минимальных, я сделал так: обычный китайский модуль stepdown на LM2596 настроен на 7 вольт. И ногу входа обратной связи я прижимаю ключом к минусу, когда нужны полные 12 вольт.
1. Мелочь: millis вызывается дважды без необходимости (вызов обычно дороже обращению к переменной, а т.к эта функция вызывается в цикле, то её лучше писать пооптимальнее)
2. Баг: вы определили Fan_RPM_Update_Period c 1000 ms, но вычисление Fan_RPM не использует это значение, а сама формула подразумевает, что функция CalcFanRPM вызывается раз в секунду. По факту в цикле она вызывается раз в 300 ms (delay(300)), т.е вызовы будут в 0, 300, 600, 900, 1200 ms. И только в 1200 будет произведёт расчёт (1200 > 1000). Правда он даст неверный (завышенный) результат, т.к. будет основан на количестве подсчитанных тиков произошедших за 1200 ms, а в формуле подразумевается, что это количество тиков за секунду (2).
Я бы написал так:
Не проверял (надеюсь не накосячил), но логика того, что и как я исправляю должна быть понятна.
Скорее всего после правки обороты станут более правильными.
Без переделки функции можете попробовать поменять delay на 250 (чтобы стало кратно 1000) — тоже должно помочь. Правда из-за «гонок» иногда могут быть выбросы, например когда реально прошло 999.9999 — обороты ещё не будут посчитанны, а следующий вызов будет в 1249.9999 и результат будет завышен.
В общем правильнее исправить функцию.
P.S. Возможно я ошибаюсь, опыт программирования микроконтроллеров стремится к нулю.
По факту код " if ((millis() — Fan_PrevMills) > Fan_RPM_Update_Period) {", функцию можно вызывать сколько угодно раз но сработает она только после того как прошел Fan_RPM_Update_Period который был настроен в 1000мс те 1 секунду. алгоритм косячит если вызывать функцию реже чем в 1 секунду, собственно вы это попытались пофиксить.
Ещё раз: с вашим кодом (delay = 300, Fan_RPM_Update_Perio = 1000) математика функции (то, что внутри if) первый раз запустится через 1200 ms после начала работы цикла. В этот момент у вас прерываниями насчитается тиков за 1200 ms, но формула посчитает так, как будто это было насчитано за 1000 ms. Показания будут завышены на 20%.
Подробности тут — elchupanibrei.livejournal.com/47610.html
Это что?
Я Вам тайну открою. То что Вы «мосфетом» обозвали это транзистор.
И близкая мне тема.
Нижайший вам поклон и благодарность.
Возможно благодаря вам я таки погружусь в мир микроконтроллеров… Благо уже и задачи начинают под это появляться… И Home Assistant уже есть…
Спасибо!
Читайте обсуждение выше, нокута 140мм с производительностью 130+кубометров/в час и шумом аж в 26дб, когда в магазинах почти все в районе 70-80 и с шумом до 45-50дб. В чем смысл ставить шумный и слабый мусор когда компьютерный вентилятор настолько лучше? (особенно за 300р с барахолки ?)
нашел его, SONOFF iFan03, 2000руб, управляет только 220в вертушками ( напоминаю что моя в разы ТИШЕ и ПРОИЗВОДИТЕЛЬНЕЕ в отличии от 220в решений), а главное для работы в умном доме все еще надо использовать кривое китайское облако с токеном для разработчика, что бы хоть как то этим чудом управлять.
Максимальные траты + худший исход. Гениально.
Ну и судя по гуглу, давление для своих вентиляторов в ванну никто не указывает.
Если вы перед вашим нокута 140мм поставите препятствия (например фильтр или длинную изгибающую трубу) то ваших 130+кубометров/в час ничего не остаётся. На выходе будет пшик.
А вот магазиный с 70-80 и с шумом до 45-50дб даже не подавится и выдаст в конце ветерок.
Вот в чем смысл. Понимаете?
Для ноктуа f14 redux это 1,91 mm H₂O или 250Па.
Для домашних вытяжек найти эту характеристику почти нереально но тут нашлась — аж 50Па, но тут вентилятор качает почти вдвое больший обьем воздуха lipetsk.poryadok.ru/catalog/ventilyatory_vytyazhnye/7697/
А в мой коммент ранее был вообще про новостройки где тяга такая что даже выключенная вертушка хорошо тянет, а включенная просто ускоряет осушение комнаты в разы.
Мой «махонький» вентилятор имеет почти в 5 раз больше статического давления чем дженерик вентилятор из хозмага.
mySKU.me/blog/diy/97421.html#comment4352449
Большое спасибо ТС и всем креативно-коментирующим.
Я думаю над еще одной статьей про управление подсветкой пк с esp8266
зы: чуть не в тему — эти wovibo бомбезные вентиляторы, очень тихие и производительные, я подсветку включаю очень редко, кота развлекать. Он надолго залипает как на текущую воду.
не совсем, большинство имеют стандартный порт под аргб ленты, но даже там гже не стандартный, я\ еще не видел каких то чудо лент со своим протоколом, все они на старом добром ws2812 совместимом протоколе.