Датчики дальности и ШИМ вентиляторов
- Войдите на сайт для отправки комментариев
Здравствуйте!
Помогите решить проблему с подключением такой схемы к блоку на 12 вольт.
Проблема в том, что при подключении к блоку, вентиляторы начинают постоянно крутиться, а постепенно увеличивать скорость, и очень сильно начинает греться вся плата, особенно стабилизатор напряжения(палец можно обжечь).
Идея программы в том, что при поднесении к каждому из датчиков поочереди, кулеры начинают крутиться быстрее и быстрее.
при работе от USB одного вентилятора - все ок.
на схеме поставил двигатель, но в жизни - это 9 кулеров от компа + нижний светодиод - это 3 светодиодных ленты по 20 см длиной.
Не судите строго) первый раз строил схему и играюсь с ардуино по интрукции из "матрешки", дополняя своими задумками)
Буду рад критике и учениям от более продвинутых)
Код программы:
int IRpin = A1; // IR photodiode on analog pin A0 int IRemitter = 2;// IR emitter LED on digital pin 2 int ambientIR; // variable to store the IR coming from the ambient int obstacleIR; // variable to store the IR coming from the object int value[10]; // variable to store the IR values int distance; // variable that will tell if there is an obstacle or not int fanpin = 11; int flag=0; int firstled = 7; int ledcount = 5; int pause; void blink(int ledpin) { digitalWrite(ledpin,HIGH); delay(200); digitalWrite(ledpin,LOW); } void setup(){ for(int i=0;i<ledcount;i++) { pinMode(i+firstled,OUTPUT); blink(i+firstled); } digitalWrite(firstled,HIGH); pinMode(IRemitter,OUTPUT); Serial.begin(9600); // initializing Serial monitor pinMode(fanpin,OUTPUT); TCCR2B = (TCCR2B & 0xF8) | 0x01; //TCCR2B = TCCR2B & B11111000 | B00000001;//pwm частота arduino 32КГц //TCCR0B = TCCR0B & B11111000 | B00000001; delay(100); } void loop(){ distance = readIR(5); // calling the function that will read the distance and passing the «accuracy» to it Serial.println(distance); // writing the read value on Serial monitor buzzer();// uncomment to activate the buzzer function } int readIR(int times){ for(int x=0;x<times;x++) { digitalWrite(IRemitter,LOW); // turning the IR LEDs off to read the IR coming from the ambient delay(2); // minimum delay necessary to read values ambientIR = analogRead(IRpin); // storing IR coming from the ambient digitalWrite(IRemitter,HIGH); // turning the IR LEDs on to read the IR coming from the obstacle delay(2); // minimum delay necessary to read values obstacleIR = analogRead(IRpin); // storing IR coming from the obstacle value[x] = ambientIR-obstacleIR; // calculating changes in IR values and storing it for future average distance+=value[x]; //Serial.println(ambientIR); //Serial.println(obstacleIR); //delay(100); } /*for(int x=0;x<times;x++) { // calculating the average based on the «accuracy» }*/ return(distance/times); // return the final value } //— Function to sound a buzzer for audible measurements —// void buzzer(){ switch(flag){ case 0: if(distance>7) { break; } else{ pause+=1; } if(pause>10){ if(distance>3){ flag+=102; analogWrite(fanpin,flag); Serial.println("FIRST"); delay(100); IRemitter = 3; pinMode(3,OUTPUT); IRpin= A2; digitalWrite(firstled,LOW); delay(200); digitalWrite(8,HIGH); pause =0; }} break; case 102: if(distance>7) { break; } else{ pause+=1; } if(pause>10){ if(distance>4){ flag+=51; analogWrite(fanpin,flag); Serial.println("SECOND"); delay(100); IRemitter = 4; pinMode(4,OUTPUT); IRpin= A3; digitalWrite(8,LOW); delay(200); digitalWrite(9,HIGH); pause=0; }} break; case 153: if(distance>7) { break; } else{ pause+=1; } if(pause>10) { if(distance>4){ flag+=51; analogWrite(fanpin,flag); IRemitter = 5; pinMode(5,OUTPUT); IRpin= A4; digitalWrite(9,LOW); delay(200); digitalWrite(10,HIGH); Serial.println("Third"); pause=0; }} break; case 204: if(distance>7) { break; } else{ pause+=1; } if(pause>10){ if(distance>4){ flag+=51; analogWrite(fanpin,flag); IRemitter = 5; pinMode(5,OUTPUT); IRpin= A4; digitalWrite(9,LOW); delay(200); digitalWrite(10,HIGH); Serial.println("Four"); pause=0; }} break; /*case 204: IRemitter = 6; pinMode(6,OUTPUT); IRpin= A5; digitalWrite(10,LOW); delay(200); digitalWrite(11,HIGH); break;*/ } //Serial.println(flag); if(flag==255) { for(int j=0;j<3;j++) { for(int i=5;i<8;i++) { digitalWrite(i,HIGH); } delay(1000); for(int i=5;i<8;i++) { digitalWrite(i,LOW); } } flag+=1; } delay(10); } //end
Можете конечно надеяться, что у кого то появиться желание лазать по каким то левым ссылкам, а можете попробовать запостить схему сюда.
Первый раз на форуме прошу помощь)