Her er basis kode for PWM styring av en PC vifte:
Sitat// fan PWMconst int pwmFanPin = GPIO_NUM_14;const int pwmFanFreq = 25000; // 25kHz for PC vifterconst int pwmFanChannel = 0; //PWM Kanalconst int pwmFanResolution = 8;int iFanSpeed =1; // Init speed
void setup() {
// configure Fan PWMledcSetup(pwmFanChannel, pwmFanFreq, pwmFanResolution);// attach the channel to the GPIO to be controlledledcAttachPin(pwmFanPin, pwmFanChannel);// Init speedledcWrite(pwmFanChannel, iFanSpeed);}
void loop() {// Sett ønsket hastighet fra 0 - 255iFanSpeed= 255;ledcWrite(pwmFanChannel, iFanSpeed);}
Mange PC vifter kan en styre hastigheten på, men ikke alle. Dersom vifta har 4 kabler (og ikke bare 3) kan den styres. Lederne er:
- 12V
- Jord
- PWM (plus bredde modulasjon) styresignal inn
- Puls informasjon om hvor fort vifta faktisk går (Tach)
PC vifter har PWM signal på 25kHz (antakeligvis for at en ikke skal kunne høre den med ørene) og tidligere var det litt klønete å få til med en Arduino, men med en ESP32 går det som en lek.
Vi bruker en av de 6-16 (avhengig av ESP32 type) innebyggede PWM kanalene i ESP32'en og styrer dette med noen få linjer kode.
Her er koden satt inn for å styre vifta fra MQTT:
Sitat#include <EspMQTTClient.h>
// fan PWM
const int pwmFanPin = GPIO_NUM_14;const int pwmFanFreq = 25000; // 25kHz for PC vifterconst int pwmFanChannel = 0; //PWM Kanalconst int pwmFanResolution = 8;int iFanSpeed =1; // Init speed
//MQTT
EspMQTTClient MQTTclient("ThePromisedLAN", // SSID"Hallelujah!", // WiFi Password"192.168.1.2", // MQTT Broker server ip"", // MQTTUsername Can be omitted if not needed"", // MQTTPassword Can be omitted if not needed"vifteClient", // Client name that uniquely identify your device1883 // The MQTT port, default to 1883. this line can be omitted);
void setup() {
Serial.begin(115200);
// configure Fan PWM
ledcSetup(pwmFanChannel, pwmFanFreq, pwmFanResolution);// attach the channel to the GPIO to be controlledledcAttachPin(pwmFanPin, pwmFanChannel);// Init speedledcWrite(pwmFanChannel, iFanSpeed);
// MQTTclient.setKeepAlive();
MQTTclient.setKeepAlive(60);
}
void loop() {
MQTTclient.loop();}
void onConnectionEstablished()
{Serial.println("onConnectionEstablished");MQTTclient.publish("vifteClient/status", "started"); // Denne MÅ ikke være med
MQTTclient.subscribe("vifteClient/fanSpeed", [](const String & payload) {
Serial.print("fanSpeed: ");Serial.println(payload);iFanSpeed=payload.toInt();iFanSpeed= map(iFanSpeed,0,100,0,255); // la den går fra 0 til 100 istedet for 0 til 255ledcWrite(pwmFanChannel, iFanSpeed);});}
Det er også mulig å LESE den REELLE hastigheten på vifta ved å telle pulser fra den siste ledningen fra PC vifta men det må bli en annen gang.
OBS:
- Pulsene fra vifta er 12V og vil skade ESP32 om de kobles direkte.
- Det er ofte 2 eller 4 pulser / rotasjon
Anbefalte kommentarer
Bli med i samtalen
Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.