مشکل راه اندازی موتور کولر آبی با میکروکنترلر

با سلا و عرض ادب 

موتور کولر آبی را توسط ATmega8 ورله ۵ولت برنامه نویسی کرده ام  مشکل اینکه میکرو با بار اهمی بودن مشکل کار می کند ولی زمانیکه بار القایی  (موتور پمپ کولر) بعد از چندبار فرمان دادن میکرو هنگ می کنه(از کار می افتد) و دوبار باید تغذیه میکرو را قطع  ودوباره وصل کنم تا راه بیفه آیا از کار افتادن میکرو در اثر نویز بار القایی نیست  ممنون می شم اگر راهنمایی بفرمایید با تشکر

با تشکر از توجه شما

منبع تعذیه   220ولت به 5ولت   700میلی آمپر مشتر ک برای رله ها و میکرو  ضمناً با آزمایشی که در دو محیط مختلف انجام دادم در همه محیط ها این مشکل وجود ندارد احتمالاً بعضی محیط ها نویز بیشتر دارند  

کد رو هم پیوست می کنم ممنون می شم بررسی بفرمایید  توضیح کد: ابتدا باید پمپ  روشن شود و سپس دور کند  درصورت لزوم دور تند را می توان روشن کرد . تازمانیکه پمپ به تنهایی روشن است led روشن و خاموش می شود و بازر هرچند لحظه آلارم می دهد اگر دور کند روشن نشود بعد ا ز پند لحظه پمپ خاموش می شود می توان زمان راهم تنظیم کرد از 1 تا10 ساعت 

 باتشکر

#include <TM1637.h>
// Pin 19 - > DIO
// Pin 18 - > CLK
TM1637 tm(18, 19);//-----------18 >>port C4    19 >>port C5

int buttstatelast;
int buttstate;
int stateled;
int buttstate_l;
int buttstate_h;
bool buzer = false;
String seg;
unsigned long t1=0, t2=0, t3=0 ,t4=0, t5=0;

int c_tme;
unsigned long interval;
int aw;
int tt;
int t=1;
int q=0;
int r=0;

void setup() {
//Serial.begin(9600);
tm.begin();
int q=0;
aw=0;
//------------
pinMode(12,OUTPUT);//----------------LED-pomp----port B4
pinMode(11,OUTPUT);//---------------LED-slow-----port B3
pinMode(10,OUTPUT);//---------------LED -HI------port B2
pinMode(9,OUTPUT);//---------------Buzzer-------port B1

pinMode(5,OUTPUT);//------------relay pomp--------port D5
pinMode(6,OUTPUT);//-----------relay SLOW---------port D6
pinMode(7,OUTPUT);//-----------relay HI-----------port D7

pinMode(0,INPUT);//----------------key pomp-motor----port D0
pinMode(1,INPUT);//----------------key Slow-motor----port D1
pinMode(2,INPUT);//----------------key HI-motor------port D2
pinMode(3,INPUT);//----------------key button timer–port D3
stateled=0;
}

void loop() {
unsigned long currentTime = millis();
unsigned long interval = t * 3600000;
//unsigned long interval = t * 80000;

stateled= digitalRead(5);
aw=digitalRead(3);//---------timer D3
buttstate=digitalRead(0);//-------------pomp d1
buttstate_l=digitalRead(1);//------------Slow
buttstate_h=digitalRead(2);//-------------HI

if(buttstate==1 && buttstatelast==0 ){
t3=currentTime;
stateled=!stateled;
digitalWrite(12, stateled);//----led pomp
digitalWrite(5, stateled);//-----relay pomp
}
buttstatelast=buttstate;

if(digitalRead(1)==1 && digitalRead(5)==1 ){//------slow
digitalWrite(7, LOW);
digitalWrite(10, LOW);
delay(10);
digitalWrite(11, HIGH);//—led Slow
digitalWrite(6, HIGH);//----relay Slow
digitalWrite(12, HIGH);
}

if(digitalRead(2)==1 && digitalRead(5)==1 && digitalRead(11)==1){//------------HI
digitalWrite(11, LOW);
digitalWrite(6, LOW);

        digitalWrite(7, HIGH);
        digitalWrite(10, HIGH);
        digitalWrite(12, HIGH);

}

if(digitalRead(5)==0){
digitalWrite(7, 0);
digitalWrite(11, 0);
digitalWrite(5, 0);
digitalWrite(6, 0);
digitalWrite(2, 0);
digitalWrite(10, 0);

}

if(digitalRead(5)==1 && digitalRead(7)==0 && digitalRead(11)==0){
if(currentTime > t4+ 300){
digitalWrite(12, !digitalRead(12));
t4=currentTime;
r++;
if(r>=20){r=0;}
if(r==0){digitalWrite(9, !digitalRead(9));delay(100);}

}

}

if(currentTime > t3+ 360000){
if(digitalRead(5)==1 && digitalRead(7)==0 && digitalRead(11)==0){
digitalWrite(6, 0);
digitalWrite(7, 0);
digitalWrite(10, 0);
digitalWrite(11, 0);
digitalWrite(5, 0);
digitalWrite(12, 0);
digitalWrite(9, 1);
delay(200);
digitalWrite(9, 0);

t3=currentTime;
}
}

if(currentTime - t1 >= interval){
if(digitalRead(5)==1 && digitalRead(7)==1 || digitalRead(11)==1){
digitalWrite(6, 0);
digitalWrite(7, 0);
digitalWrite(10, 0);
digitalWrite(11, 0);
digitalWrite(5, 0);
digitalWrite(12, 0);
buttstatelast=buttstate;
//delay(100);
}
t1 = currentTime;
}

if(aw==HIGH){
t++;
while (aw==HIGH) {
aw=digitalRead(3);
}

}

if(t==1 && buzer==false){//--------------------------------int1
digitalWrite(9,1);//--------------------buzzer
buzer = true;
t2 = currentTime;
}
if(currentTime > t2+ 500 && digitalRead(9)==1){
digitalWrite(9, 0);
t2=currentTime;
}

if(t==2 && buzer==false){//-----------------------int2
digitalWrite(9,0);//--------------------buzzer
}
if(t==3 && buzer==false){//-------------------int 3
digitalWrite(9,0);//--------------------buzzer
}

if(t==4 && buzer==false){//------------------int4
digitalWrite(9,0);//--------------------buzzer
}

//------------------int 5
if(t==5 && buzer==false){
digitalWrite(9,0);//--------------------buzzer
}

//------------------int 6
if(t==6 && buzer==false){
digitalWrite(9,0);//--------------------buzzer
}

//------------------int 7
if(t==7 && buzer==false){
digitalWrite(9,0);//--------------------buzzer
}

//------------------int 8
if(t==8 && buzer==false){
digitalWrite(9,0);//--------------------buzzer
}
//------------------int 9
if(t==9 && buzer==false){
digitalWrite(9,0);//--------------------buzzer
}
if(t==10 && buzer==false){
digitalWrite(9,0);//--------------------buzzer
}

if(t==1){
tm.display(" “);
showHOXX(1);
}
if(t==2){
tm.display(” “);
showHOXX(2);
}
if(t==3){
tm.display(” “);
showHOXX(3);
}
if(t==4){
tm.display(” “);
showHOXX(4);
}
if(t==5){
tm.display(” “);
showHOXX(5);
}
if(t==6){
tm.display(” “);
showHOXX(6);
}
if(t==7){
tm.display(” “);
showHOXX(7);
}
if(t==8){
tm.display(” “);
showHOXX(8);
}
if(t==9){
tm.display(” “);
showHOXX(9);
}
if(t==10){
tm.display(” ");
showHOXX(10);
}

if(t>10){
tm.display(" ");
showHOXX(10);
}

//------------------int 0
if(t> 10){
t=1;
buzer = false;
}

}
void showHOXX(int t){
switch(t){
case 1: tm.display(“HH01”); break;
case 2: tm.display(“HH02”); break;
case 3: tm.display(“HH03”); break;
case 4: tm.display(“HH04”); break;
case 5: tm.display(“HH05”); break;
case 6: tm.display(“HH06”); break;
case 7: tm.display(“HH07”); break;
case 8: tm.display(“HH08”); break;
case 9: tm.display(“HH09”); break;
case 10: tm.display(“HH10”); break;
default: tm.display(" "); break;
}
delay(50);
}

با سلام

برای تغذیه میکرو از چه منبع تغذیه ای استفاده میکنید؟؟ چند ولت چند آمپر؟؟

همچنین کدی که نوشته اید را نیز در صورت امکان قرار میدهید

 

ویرایش اول:

در مورد کدی که نوشته اید.

چند نکته خدمت شما توضیح میدهم میتوانید انجام بدهید هم کد شما سریع تر میشود و هم دیباگ کد ساده تر میشود.

در مرحله اول شما دارید با خواندن اینکه یکی از 4 پایه ورودی که HIGH میشود تشخیص میدهید که کلید خورده است یا خیر. به دلیل نویز هایی که در GND وجود دارد اکثرا به صورت معکوس استفاده میشود.

یعنی پایه مربوط به خواندن را با استفاده از یک مقاومت به VCC وصل میشود و کلید این پایه را به GND وصل میکند از این رو مطمئن میشوید که کلید خورده است.

مورد بعدی بهتر هست از دستور interrupts استفاده بنمایید (آردوینو UNO فقط 2 عدد از این پایه ها دارد. از این رو پیشنهاد میکنم به سمت ESP32 بروید)

برای بحث زمان بندی ها پیشنهاد میکنم از تایمر های خود میکرو استفاده بنمایید. 

 

مورد بعدی در زمینه اینکه میکرو در چه وضعیتی هست نیز سریال پرینت را فعال نگه دارید و در هر بخش کد یک شکلک یا هرچیزی که دوست دارید قرار بدهید تا متوجه بشوید که داخل یک لوپ گیر نکرده است و برنامه در حال اجرا میباشد. و در انتها نیز یک println قرار بدهید که متوجه بشوید که لوپ تکمیل شده است.

برای اینکه برق از سمت سیستم شما به برد آردوینو نرود از طریق یک تبدیل USB-TTL فقط لاین های دیتا و GND را به میکرو وصل بکنید و VCC را وصل نکنید تا دیتا را به بیرون بکشید.

 

احتمال خیلی بالا در زمینه تغذیه ای که استفاده کرده اید نویز داشته باشید و از طرفی دارید 3 عدد رله استفاده میکنید که در همچین محیطی نویز زیادی ایجاد میکنند.

میکرو رله از منبع مشترک ۵ولت ۷۰۰میلی آمپر

باسلام و تشکر از توجه شما سوال را دوباره ویرایش کرده ام ممنون می شم بررسی بفرمایید با تشکر

با آدابتور های قوی تر نیز بررسی کرده اید؟؟ مثلا 5 ولت 2 آمپر (شارژر موبایل) یا در صورتی که امکانش را دارید 9 ولت را به فیش آدابتوری روی برد آردوینو بزنید (12 فشار وارد میکند- 6 الی 9 عالی هست)