Используется для аквариума.
Разная скорость вентилятора в ночное и дневное время с 5 заданными параметрами. (5, 30, 50, 80, 100%)
В заданное время включается LCD, это и было использовано как триггер(V15)
Регулировка скорости вентилятора от 0 до 255, это минимально и максимально возможные скорости вентилятора. В моем случае, это 700-1800 об/мин.
То есть, 0% = 700 об/мин и 100% = 1800 об/мин.
В "моём"* коде: 1% = 707 об/мин, 30% = 540 об/мин, 50% = 900 об/мин, 80% = 1440 об/мин, 100% = 1800 об/мин.
Код брал на просторах интернетов для плавного управления светодиодом, только изменил частоту на 25000.
Кроме того, я использую BLYNK (для управления) и GyverPortal (для прошивки "по воздуху").
GyverPortal позволяет подключиться к устройству через браузер и залить в устройство новую прошивку.
В приложении BLYNK настройка вентиляторов выглядит так:
// Dev - "WEMOS D1 MINI ESP32"
//#define BLYNK_PRINT Serial
#define BLYNK_AUTH_TOKEN "XXXXXXXXXXXXXX-TOKEN-XXXXXXXXXXXXX"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <GyverPortal.h>
const int FanPin = 17;
const int freq = 25000;
const int FanChannel = 0;
const int resolution = 8;
char ssid[] = "SID";
char pass[] = "password";
int myCooller = 0;
GyverPortal portal;
void build(){
BUILD_BEGIN();
GP.THEME(GP_DARK);
GP.TITLE("=COOLLER CONTROL=");
GP.HR();
*_GP += F("<p style='text-align: center;'><img src='https://blynk.novoross.ru/uploads/monthly_2023_06/small.aquabot.png.18dc6cf076c1e8e01d57a07c31178d12.png'/>");
*_GP += F("<a href='/ota_update'><img src='https://blynk.novoross.ru/uploads/monthly_2023_07/large.UpDateFirmware64.png.c97b51cf1b455e4f5f9e683bf9ecbf6f.png'/></a></p>");
GP.HR();
*_GP += F("<p style='text-align: center;'><em>v.0.0.1H - 19-07-2023</em></p>");
BUILD_END();
}
WidgetLED led1(V40);
BlynkTimer timer;
BLYNK_CONNECTED() {
Blynk.syncAll();
}
BLYNK_WRITE(V15){
int pinValue = param.asInt();
if(param.asInt() == 0) { myCooller = 0; }
if(param.asInt() == 255) { myCooller = 1; }
}
BLYNK_WRITE(V41){ // Ночной режим
int pinValue = param.asInt();
if (myCooller == 1){
if(param.asInt() == 1) {
ledcWrite(FanChannel, 0);
Blynk.setProperty(V41, "label", "День минимум");
}
if(param.asInt() == 2) {
ledcWrite(FanChannel, 76);
Blynk.setProperty(V41, "label", "День 30%");
}
if(param.asInt() == 3) {
ledcWrite(FanChannel, 128);
Blynk.setProperty(V41, "label", "День 50%");
}
if(param.asInt() == 4) {
ledcWrite(FanChannel, 200);
Blynk.setProperty(V41, "label", "День 80%");
}
if(param.asInt() == 5) {
ledcWrite(FanChannel, 255);
Blynk.setProperty(V41, "label", "День максимум");
}
}
}
BLYNK_WRITE(V42) { // Дневной режим
int pinValue = param.asInt();
if (myCooller == 0) {
if(param.asInt() == 1) {
ledcWrite(FanChannel, 0);
Blynk.setProperty(V42, "label", "Ночь минимум");
}
if(param.asInt() == 2) {
ledcWrite(FanChannel, 76);
Blynk.setProperty(V42, "label", "Ночь 30%");
}
if(param.asInt() == 3) {
ledcWrite(FanChannel, 128);
Blynk.setProperty(V42, "label", "Ночь 50%");
}
if(param.asInt() == 4) {
ledcWrite(FanChannel, 200);
Blynk.setProperty(V42, "label", "Ночь 80%");
}
if(param.asInt() == 5) {
ledcWrite(FanChannel, 255);
Blynk.setProperty(V42, "label", "Ночь максимум");
}
}
}
void blinkLedWidget() { // по таймеру (1сек) мигаю виртуальным светодиодом и запрашиваю состояние виртуальных пинов
if (led1.getValue()) {
led1.off();
} else {
led1.on();
}
Blynk.syncVirtual(V15); // день или ночь
Blynk.syncVirtual(V41); // ночная скорость куллера
Blynk.syncVirtual(V42); // дневная скорость куллера
}
void setup() {
Serial.begin(115200);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass, IPAddress(91,204,228,77), 8480);
ledcSetup(FanChannel, freq, resolution);
ledcAttachPin(FanPin, FanChannel);
ledcWrite(FanChannel, 1);
Blynk.syncVirtual(V15);
Blynk.syncVirtual(V41);
portal.attachBuild(build);
portal.start();
portal.enableOTA("name", "password");
timer.setInterval(1000L, blinkLedWidget);
}
void loop()
{
Blynk.run();
timer.run();
portal.tick();
}
В планах изменить немного схему подключения и код. Дело в том, что при запуске охлаждения, вентилятор до полной загрузки платы, включается на полную скорость, это секунды, но все равно шумно, особенно ночью.
Буду использовать для питания вентилятора силовой ключ (IRF520). Он не подаст питание на вентилятор, пока плата не загрузится, таким образом вентилятор включится на уже заданных оборотах.