
Потребуется:
Arduino - 1шт.
Датчик температуры - 1шт.
Твердотельное реле - 1шт.
В этом примере будут использоваться следующие компоненты:
Arduino Pro Mini.
Реле SSR-25DA. (Судя по описанию потребляемый ток всего 7.5mA)
Датчик температуры 18b20.
Пример подключения:
Для управления скоростью вращения вентилятора используется PIN 9 т.к. он ШИМ и после изменения частоты ШИМ эффект искажения работы некоторых функций проявится только для Servo library нам это не страшно т.к. здесь мы не используем такой функционал. Цифровой датчик температуры подключается к цифровому порту PIN 2. Так как вывод микроконтроллера держит 40mA то можно запитывать реле прямо с микроконтроллера, ему ничего не будет, но все равно на всякий случай воспользуемся транзистором кт315:

Распиновка транзисторов npn перехода:

Распиновка 1N4148

Частота бытовой сети куда будет подключаться вентилятор составляет 50Гц. Используемое реле SSR-25DA оборудовано датчиком пересечения ноля (cross zero sensor). Это значит что реле отключится/включится только в те моменты когда синусоида переменного тока будет пересекать значение 0. Поэтому частота работы ШИМ должна быть не выше чем 50Гц*2 = 100Гц (2 - потому, что за один период синусоида переменного тока пересекает ноль дважды).
Т.к. по умолчанию частота ШИМ гораздо выше надо ее разделить. Ниже таблица допустимых делителей для разных PIN:
PINs |
Частота, Гц |
Делитель |
3 |
31250 |
1, 8, 32, 64, 128, 256, 1024 |
5 |
62500 |
1, 8, 64, 256, 1024 |
6 |
62500 |
1, 8, 64, 256, 1024 |
9 |
31250 |
1, 8, 64, 256, 1024 |
10 |
31250 |
1, 8, 64, 256, 1024 |
11 |
31250 |
1, 8, 32, 64, 128, 256, 1024 |
Мы используем PIN 9, значит его частота по умолчанию 31250Гц, нам надо получить не более 100Гц, для этого разделим на 1024. Получим ~30Гц. Такой частоты уже достаточно для регулировки оборотов. Если вместо вентилятора подключить лампу накаливая то будет видно как она мерцает, для бытового канального вентилятора это не критично.
Скетч:
В скетче используется код получения значения температуры отсюда.
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
int ventPin = 9;
int maxTemp=28;
int minTemp=26;
int interval=20; //min 30sec recomended for 18B20
DallasTemperature sensors(&oneWire);
void setup(void) {
Serial.begin(9600);
sensors.begin();
setPwmFrequency(ventPin, 1024); //division on 1024 for ~30Hz
}
void loop(void) {
sensors.requestTemperatures();
Serial.print("Temp=");
float temp=sensors.getTempCByIndex(0);
Serial.print(temp);
Serial.print("; Power=");
int val = (((-1)*((maxTemp-temp)-(maxTemp-minTemp)))/2*100)*255/100;
if (val<0) {val=0;}
if (val>255) {val=255;}
Serial.print(val);
if (val>20) {
analogWrite(ventPin, val);
Serial.print("; Vent=on;");
} else {
analogWrite(ventPin, 0);
Serial.print("; Vent=off;");
}
delay(interval*1000);
}
void setPwmFrequency(int pin, int divisor) {
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
}
}
При требуемой мощности менее 20% вентилятор запускаться не будет вообще т.к. возможно не будет хватать времени для проворачивания ротора двигателя и он не будет крутиться. Начиная с 20% мощности на ротор начнет поступать ток и тока станет достаточно для проворачивания вентилятора.
Для информации:
Рассказы про частоту ШИМ arduino здесь.
Общий пример схемы подключения реле к ардуино через транзистор:

Полезные ссылки: авторегулирование.
|