Самодельная автоматическая вытяжка с регулировкой оборотов на arduino.

olegoriy
Offline
Зарегистрирован: 08.02.2015

Привет форумчане. Хотелось бы поделиться своим проектом.

Задумал сделать вытяжку в ванной с применением ардуины, но что бы было интересней добавил к часто повторяемым проектам, регулировку скорости вентилятора 220 вольт.

https://www.youtube.com/watch?v=zRnoZTSYxf4

Не ругайтесь пожалуйста что нет схемы. Рисовать схемы для меня просто ад!! Но если кому то ну прям очень нужно, то пишите я заморочусь.

#include <iarduino_DHT.h>              // подключаем библиотеку для работы с датчиком DHT
iarduino_DHT sensor(12);               // подключаем DHT датчик на 12 пин
#define dimPin 3                       // пин оптопары затвора симистора
#define zeroPin 2                      // пин оптопары определяющию зиро крос
#include <CyberLib.h>                  // шустрая библиотека для таймера
volatile int tic, Dimmer;              // вводим переменную диммер   
#define knopka1 10                     // Кнопка скорости
#define knopka2 11                     // Кнопка режима
#define NOGA1 4                        // Ноги экрана
#define NOGA2 7
#define NOGA3 8
#define NOGA4 A0
#define NOGA5 13
#define NOGAa 5
#define NOGAb 9
#define NOGAc A2
#define NOGAd A4
#define NOGAe A5
#define NOGAf 6
#define NOGAg A1
#define NOGAt A3


long p = 0;                    //  переменная Для работы со временем опроса датчика DHT
long i = 5000;                //  переменная Для работы со временем опроса датчика DHT
long p1 = 0;                 //  переменная Для работы со временем нажатия кнопок
long i1 = 200;              //  переменная Для работы со временем нажатия кнопок


int SH1 = 0;                 // переменная для работы с экраном
int SH2 = 0;                 // переменная для работы с экраном
int SH3 = 13;                // переменная для работы с экраном
int Z = 0;                   // переменная режима работы SPEED-humidity
int Y = 4;                   // переменная режима скорость  
int h =0;                    // пока не опросили датчик DHT влажность равна 0         

byte numberSegments[15] = {                                                        // масив для цифр экрана
  0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101,
  0b01111101, 0b00000111, 0b01111111, 0b01101111, 0b00000000, 0b11100011,
  0b11011100, 0b01101101, 0b01110110
};


 
void setup()
{
  pinMode(dimPin, OUTPUT);
  digitalWrite(dimPin, 0);
  pinMode(zeroPin, INPUT);                 // настраиваем порт на вход для отслеживания прохождения сигнала через ноль
  attachInterrupt(0, detect_up, FALLING);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
  StartTimer1(timer_interrupt, 40);        // время для одного разряда ШИМ
  StopTimer1();  
  
  pinMode(knopka1, INPUT);
  pinMode(knopka2, INPUT);
  pinMode(NOGA1, OUTPUT);
  pinMode(NOGA2, OUTPUT);
  pinMode(NOGA3, OUTPUT);
  pinMode(NOGA4, OUTPUT);
  pinMode(NOGA5, OUTPUT);
  pinMode(NOGAa, OUTPUT);
  pinMode(NOGAb, OUTPUT);
  pinMode(NOGAc, OUTPUT);
  pinMode(NOGAd, OUTPUT);
  pinMode(NOGAe, OUTPUT);
  pinMode(NOGAf, OUTPUT);
  pinMode(NOGAg, OUTPUT);
  pinMode(NOGAt, OUTPUT);
 }
 
void loop()
{ 
  unsigned long r = millis(); 
  if(r - p > i & Z == 1){
  switch(sensor.read()){                  // читаем показания датчика
  case DHT_OK:h = sensor.hum;  break;}
   p = r;}
  
  
  if (!digitalRead(knopka1)) {            // изменяем скорость          
  if(r - p1 > i1){
    Y = Y + 1;
    if(Y > 4) Y = 0;
  p1 = r;
  }} 

  if (!digitalRead(knopka2)) {            // изменяем режим       
  if(r - p1 > i1){
    Z=!Z;
  p1 = r;
  }} 

  
  if( Z == 0){                                 // режимы скорости
    SH3 = 13; 
    if(Y == 0){ SH1 = 0;SH2 = 0; Dimmer = 255;}
    if(Y == 1){ SH1 = 2;SH2 = 5; Dimmer = 140;}
    if(Y == 2){ SH1 = 5;SH2 = 0; Dimmer = 120;}
    if(Y == 3){ SH1 = 7;SH2 = 5; Dimmer = 100;}
    if(Y == 4){ SH1 = 9;SH2 = 9; Dimmer = 10;}                         
  }

  if( Z == 1){                                // режим скорость от влажности
     SH3 = 14; 
     SH1 = h/10;
     SH2 = h - (SH1*10) ;
     if(h < 50){Dimmer = 255;}
     if(h > 50 & h < 60){Dimmer = 140;}
     if(h > 60 & h < 70){Dimmer = 120;}
     if(h > 70 & h < 80){Dimmer = 100;}
     if(h > 80){Dimmer = 10;}                      
  }
  
  digitalWrite(NOGA1, LOW);                 // выводим значения на экран                      
  digitalWrite(NOGA2, HIGH);
  digitalWrite(NOGA3, HIGH);
  digitalWrite(NOGA4, HIGH);
  digitalWrite(NOGA5, HIGH);
  
  digitalWrite(NOGAa, bitRead(numberSegments[SH1], 0));
  digitalWrite(NOGAb, bitRead(numberSegments[SH1], 1));
  digitalWrite(NOGAc, bitRead(numberSegments[SH1], 2));
  digitalWrite(NOGAd, bitRead(numberSegments[SH1], 3));
  digitalWrite(NOGAe, bitRead(numberSegments[SH1], 4));
  digitalWrite(NOGAf, bitRead(numberSegments[SH1], 5));
  digitalWrite(NOGAg, bitRead(numberSegments[SH1], 6));
  digitalWrite(NOGAt, bitRead(numberSegments[SH1], 7));
  
  digitalWrite(NOGAa, bitRead(numberSegments[10], 0));
  digitalWrite(NOGAb, bitRead(numberSegments[10], 1));
  digitalWrite(NOGAc, bitRead(numberSegments[10], 2));
  digitalWrite(NOGAd, bitRead(numberSegments[10], 3));
  digitalWrite(NOGAe, bitRead(numberSegments[10], 4));
  digitalWrite(NOGAf, bitRead(numberSegments[10], 5));
  digitalWrite(NOGAg, bitRead(numberSegments[10], 6));
  digitalWrite(NOGAt, bitRead(numberSegments[10], 7));

  digitalWrite(NOGA1, HIGH);
  digitalWrite(NOGA2, LOW);
  digitalWrite(NOGA3, HIGH);
  digitalWrite(NOGA4, HIGH);
  digitalWrite(NOGA5, HIGH);
  
  digitalWrite(NOGAa, bitRead(numberSegments[SH2], 0));
  digitalWrite(NOGAb, bitRead(numberSegments[SH2], 1));
  digitalWrite(NOGAc, bitRead(numberSegments[SH2], 2));
  digitalWrite(NOGAd, bitRead(numberSegments[SH2], 3));
  digitalWrite(NOGAe, bitRead(numberSegments[SH2], 4));
  digitalWrite(NOGAf, bitRead(numberSegments[SH2], 5));
  digitalWrite(NOGAg, bitRead(numberSegments[SH2], 6));
  digitalWrite(NOGAt, bitRead(numberSegments[SH2], 7));
  
  digitalWrite(NOGAa, bitRead(numberSegments[10], 0));
  digitalWrite(NOGAb, bitRead(numberSegments[10], 1));
  digitalWrite(NOGAc, bitRead(numberSegments[10], 2));
  digitalWrite(NOGAd, bitRead(numberSegments[10], 3));
  digitalWrite(NOGAe, bitRead(numberSegments[10], 4));
  digitalWrite(NOGAf, bitRead(numberSegments[10], 5));
  digitalWrite(NOGAg, bitRead(numberSegments[10], 6));
  digitalWrite(NOGAt, bitRead(numberSegments[10], 7));

  digitalWrite(NOGA1, HIGH);
  digitalWrite(NOGA2, HIGH);
  digitalWrite(NOGA3, LOW);
  digitalWrite(NOGA4, HIGH);
  digitalWrite(NOGA5, HIGH);
  
  digitalWrite(NOGAa, bitRead(numberSegments[11], 0));
  digitalWrite(NOGAb, bitRead(numberSegments[11], 1));
  digitalWrite(NOGAc, bitRead(numberSegments[11], 2));
  digitalWrite(NOGAd, bitRead(numberSegments[11], 3));
  digitalWrite(NOGAe, bitRead(numberSegments[11], 4));
  digitalWrite(NOGAf, bitRead(numberSegments[11], 5));
  digitalWrite(NOGAg, bitRead(numberSegments[11], 6));
  digitalWrite(NOGAt, bitRead(numberSegments[11], 7));
  
  digitalWrite(NOGAa, bitRead(numberSegments[10], 0));
  digitalWrite(NOGAb, bitRead(numberSegments[10], 1));
  digitalWrite(NOGAc, bitRead(numberSegments[10], 2));
  digitalWrite(NOGAd, bitRead(numberSegments[10], 3));
  digitalWrite(NOGAe, bitRead(numberSegments[10], 4));
  digitalWrite(NOGAf, bitRead(numberSegments[10], 5));
  digitalWrite(NOGAg, bitRead(numberSegments[10], 6));
  digitalWrite(NOGAt, bitRead(numberSegments[10], 7));


  digitalWrite(NOGA1, HIGH);
  digitalWrite(NOGA2, HIGH);
  digitalWrite(NOGA3, HIGH);
  digitalWrite(NOGA4, LOW);
  digitalWrite(NOGA5, HIGH);
  
  digitalWrite(NOGAa, bitRead(numberSegments[12], 0));
  digitalWrite(NOGAb, bitRead(numberSegments[12], 1));
  digitalWrite(NOGAc, bitRead(numberSegments[12], 2));
  digitalWrite(NOGAd, bitRead(numberSegments[12], 3));
  digitalWrite(NOGAe, bitRead(numberSegments[12], 4));
  digitalWrite(NOGAf, bitRead(numberSegments[12], 5));
  digitalWrite(NOGAg, bitRead(numberSegments[12], 6));
  digitalWrite(NOGAt, bitRead(numberSegments[12], 7));
  
  digitalWrite(NOGAa, bitRead(numberSegments[10], 0));
  digitalWrite(NOGAb, bitRead(numberSegments[10], 1));
  digitalWrite(NOGAc, bitRead(numberSegments[10], 2));
  digitalWrite(NOGAd, bitRead(numberSegments[10], 3));
  digitalWrite(NOGAe, bitRead(numberSegments[10], 4));
  digitalWrite(NOGAf, bitRead(numberSegments[10], 5));
  digitalWrite(NOGAg, bitRead(numberSegments[10], 6));
  digitalWrite(NOGAt, bitRead(numberSegments[10], 7));

  digitalWrite(NOGA1, HIGH);
  digitalWrite(NOGA2, HIGH);
  digitalWrite(NOGA3, HIGH);
  digitalWrite(NOGA4, HIGH);
  digitalWrite(NOGA5, LOW);
  
  digitalWrite(NOGAa, bitRead(numberSegments[SH3], 0));
  digitalWrite(NOGAb, bitRead(numberSegments[SH3], 1));
  digitalWrite(NOGAc, bitRead(numberSegments[SH3], 2));
  digitalWrite(NOGAd, bitRead(numberSegments[SH3], 3));
  digitalWrite(NOGAe, bitRead(numberSegments[SH3], 4));
  digitalWrite(NOGAf, bitRead(numberSegments[SH3], 5));
  digitalWrite(NOGAg, bitRead(numberSegments[SH3], 6));
  digitalWrite(NOGAt, bitRead(numberSegments[SH3], 7));
  
  digitalWrite(NOGAa, bitRead(numberSegments[10], 0));
  digitalWrite(NOGAb, bitRead(numberSegments[10], 1));
  digitalWrite(NOGAc, bitRead(numberSegments[10], 2));
  digitalWrite(NOGAd, bitRead(numberSegments[10], 3));
  digitalWrite(NOGAe, bitRead(numberSegments[10], 4));
  digitalWrite(NOGAf, bitRead(numberSegments[10], 5));
  digitalWrite(NOGAg, bitRead(numberSegments[10], 6));
  digitalWrite(NOGAt, bitRead(numberSegments[10], 7));

}
  
  //----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
void timer_interrupt() {       // прерывания таймера срабатывают каждые 40 мкс
  tic++;                       // счетчик
  if (tic > Dimmer)            // если настало время включать ток
    digitalWrite(dimPin, 1);   // врубить ток
}

void  detect_up() {    // обработка внешнего прерывания на пересекание нуля снизу
  tic = 0;                                  // обнулить счетчик
  ResumeTimer1();                           // перезапустить таймер
  attachInterrupt(0, detect_down, RISING);  // перенастроить прерывание
}

void  detect_down() {  // обработка внешнего прерывания на пересекание нуля сверху
  tic = 0;                                  // обнулить счетчик
  StopTimer1();                             // остановить таймер
  digitalWrite(dimPin, 0);                  // вырубить ток
  attachInterrupt(0, detect_up, FALLING);   // перенастроить прерывание
}
//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
  
 

   

 

Пушной звер
Пушной звер аватар
Offline
Зарегистрирован: 17.03.2013

DHT11? сетевой вентелятор диммером?

скорость там изменять нельзя, точнее можно изменением частоты в небольших пределах, но в целом, взять вентель от компа на 12 вольт, както логичнее.

ну а DHT, лучше заранее сменить на чтото вроде sht20.

Bruzzer
Offline
Зарегистрирован: 17.03.2020

olegoriy пишет:

Не ругайтесь пожалуйста что нет схемы. Рисовать схемы для меня просто ад!!

Не буду ругаться, что нет схемы. Ругнусь, что нет описания. Что регулирует, в каких диапазонах, основные элементы ...

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

ТС, ты программированию не у индусов учился? 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ТС, ты программированию не у индусов учился? 

ну вот, опять, в кои-то веки появился TC пишущий латиницей на понятном русском языке и, ...облом )))

olegoriy
Offline
Зарегистрирован: 08.02.2015

З

olegoriy
Offline
Зарегистрирован: 08.02.2015

Пушной звер пишет:

DHT11? сетевой вентелятор диммером?

скорость там изменять нельзя, точнее можно изменением частоты в небольших пределах

DTH11 понятно что чушь не сусветная, просто попался под руку. А сетевой вентилятор диммером почему нет? Ведь все получилось. Я видел похожие схемы и управление на очень брендовых системах. У меня пылесос на такой же схеме, с изменением скорости мотора, хотя могу ошибаться, если хотите сниму осцифолограмму с семистора пылесоса. А вон возмите плату управления воротами, там точно такая же схема, так вообще для трехфазного двигателя с конденцатором, хотя в их схему мне слабо вериться.

olegoriy
Offline
Зарегистрирован: 08.02.2015

DetSimen пишет:

ТС, ты программированию не у индусов учился? 

Неее я вообще не когда не учился программированию. Честно!! Объясните пожалуйста что не так???

Пушной звер
Пушной звер аватар
Offline
Зарегистрирован: 17.03.2013

olegoriy пишет:

Я видел похожие схемы и управление на очень брендовых системах. У меня пылесос на такой же схеме, с изменением скорости мотора,

ага, и в дрели еще... там двиг коллекторный.

хотя возможно в том, чтото другое, а вообще они только частотой управляются, в небольших приделах.

olegoriy
Offline
Зарегистрирован: 08.02.2015

Пушной звер пишет:

olegoriy пишет:

Я видел похожие схемы и управление на очень брендовых системах. У меня пылесос на такой же схеме, с изменением скорости мотора,

ага, и в дрели еще... там двиг коллекторный.

хотя возможно в том, чтото другое, а вообще они только частотой управляются, в небольших приделах.

Ну а если глушить симистором полуволны через одну (не так как в коде) получиться 25 герц, или это так не сработает??

Morroc
Offline
Зарегистрирован: 24.10.2016

Если конденсатор внутри вытяжки есть, то можно им поиграться - мощность падает и вентиль просто не разгоняется до максимальных оборотов, чисто по шуму этого достаточно должно быть, я у себя так сделал (сами обороты может и не сильно меняются, но жужжит заметно тише). Ну а потом пару конденсаторов, пару релюшек... ) А потом в 3д принтерах, например, тоже ведь применяют вентиляторы, которые не предназначены для управления оборотами, но тем не менее управляют тупо ШИМом и работает.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

olegoriy пишет:

Ну а если глушить симистором полуволны через одну (не так как в коде) получиться 25 герц

Что, правда?