1. 概述

本文介绍如何使用 ESP8266 控制风扇转速,并通过 Web 服务器调整风扇速度及获取当前转速。该方案适用于支持 PWM 调速的 4Pin 风扇。

2. 所需工具

硬件:

  • ESP8266 开发板(NodeMCU / Wemos D1 Mini)
  • 4Pin PWM 风扇
  • 大 4Pin 转小 4Pin 线(2 个小 4Pin 12V 接口,2 个小 4Pin 5V 接口,每个小4pin有2个引脚,2个空的,空的可以插入杜邦线引脚,某宝几块钱,如果没有这线也可以其他方法实现供电)
  • 杜邦线(公对公)
  • 电源(12V,适配风扇功率)

软件:

  • Arduino IDE(安装 ESP8266 开发板库)
  • Postman 或浏览器(用于发送 HTTP 请求)

3. 连接示意图

风扇引脚说明

pwm风扇 功能 连接
12V 供电 小4pin 12v
GND 小4pin GND
PWM 调速 esp8266 D1
绿 TACHO 反馈 esp8266 D2

ESP8266 供电

线材 功能 连接
5V(红) 供电 小 4Pin 5V -> ESP8266 VIN
GND(黑) 接地 小 4Pin GND -> ESP8266 GND
D1 PWM 调速 接风扇
D2 TACHO 反馈 接风扇

4. 代码实现

代码功能

  • 连接 WiFi
  • 通过 HTTP 请求调整风扇转速(PWM 输出)
  • 读取风扇 TACHO 信号,计算 RPM
  • 通过 Web API 获取当前风扇转速
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const char* ssid = "yang1234"; // wifi名字
const char* password = "y123456789"; // wifi密码

const int pwmPin = 5;    // D1, 控制风扇速度
const int tachPin = 4;   // D2, 读取风扇转速反馈信号

ESP8266WebServer server(80);
volatile int pulseCount = 0;
unsigned long lastTime = 0;
int fanSpeed = 255; // 默认全速

void IRAM_ATTR countPulse() {
  pulseCount++;
}

int getFanRPM() {
  unsigned long elapsedTime = millis() - lastTime;
  int rpm = (pulseCount * 30) / (elapsedTime / 1000); // 计算 RPM
  pulseCount = 0;
  lastTime = millis();
  return rpm;
}

void handleSetSpeed() {
  if (server.hasArg("speed")) {
    fanSpeed = server.arg("speed").toInt();
    fanSpeed = constrain(fanSpeed, 0, 255);
    analogWrite(pwmPin, fanSpeed);
    server.send(200, "text/plain", "Speed set to(0-255) " + String(fanSpeed));
  } else {
    server.send(400, "text/plain", "Missing 'speed' parameter");
  }
}

void handleGetRPM() {
  int rpm = getFanRPM();
  server.send(200, "text/plain", "Current RPM: " + String(rpm));
}

void setup() {
  Serial.begin(115200);
  pinMode(pwmPin, OUTPUT);
  pinMode(tachPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(tachPin), countPulse, FALLING);

  analogWrite(pwmPin, fanSpeed);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nConnected to WiFi");
  Serial.println(WiFi.localIP());

  server.on("/setSpeed", HTTP_GET, handleSetSpeed);
  server.on("/getRPM", HTTP_GET, handleGetRPM);
  server.begin();
}

void loop() {
  server.handleClient();
}

5. 使用方法

1️⃣ 连接 ESP8266

  • 上电后,ESP8266 连接 yang1234 WiFi,并获取 IP 地址(串口监视器查看)。
  • 假设 IP 地址为 192.168.31.100(可以通过路由器查看esp8266的ip)

2️⃣ 设置风扇速度

在浏览器或 Postman 访问:

http://192.168.31.100/setSpeed?speed=128
  • speed=0:最低速度
  • speed=128:50% 速度
  • speed=255:100% 速度

3️⃣ 获取风扇当前转速

在浏览器或 Postman 访问:

http://192.168.31.100/getRPM

返回:

Current RPM: 1200

6. 说明

  • analogWrite(pwmPin, speed); 控制风扇转速
  • attachInterrupt(digitalPinToInterrupt(tachPin), countPulse, FALLING); 监听 TACHO 信号,有风扇差异,计算rpm可能不一样,根据情况修改
  • getFanRPM() 计算风扇 RPM

7. 结论

本方案通过 ESP8266 控制风扇 PWM 实现调速,并获取风扇实时转速数据。用户可以通过 Web API 远程控制风扇运行状态,适用于 DIY 智能风扇控制系统。