这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» DIY与开源设计» 电子DIY» 采用arduinoNano制作的一款简洁型金属探测器

共5条 1/1 1 跳转至

采用arduinoNano制作的一款简洁型金属探测器

工程师
2020-11-26 21:11:24 打赏

金属探测器? 大家估计会喜欢吧?!

如下是电路图和源码,大家可以按此制作DIY


image.png

BOM清单:

R1= 330 Ω, resistor

R2= 1 KΩ, resistor

C1= 10nF, ceramic capacitor

D1= 1N4148, diode

BUZ1= Buzzer

LED1= 5mm any color LED

Arduino UNO Board or equivalent


成品图:



#define vinPin A5

#define buz 9

#define pulsePin A4


#define led 10


long sumExpect=0; //running sum of 64 sums

long ignor=0; //number of ignored sums

long diff=0; //difference between sum and avgsum

long pTime=0;

long buzPeriod=0;


void setup()

{

Serial.begin(9600);

pinMode(pulsePin, OUTPUT);

digitalWrite(pulsePin, LOW);

pinMode(vinPin, INPUT);

pinMode(buz, OUTPUT);

digitalWrite(buz, LOW);

pinMode(led, OUTPUT);

}


void loop()

{

int minval=1023;

int maxval=0;

long unsigned int sum=0;

for (int i=0; i<256; i++)

{

//reset the capacitor

pinMode(vinPin,OUTPUT);

digitalWrite(vinPin,LOW);

delayMicroseconds(20);

pinMode(vinPin,INPUT);

applyPulses();

//read the charge of capacitor

int val = analogRead(vinPin); //takes 13x8=104 microseconds

minval = min(val,minval);

maxval = max(val,maxval);

sum+=val;

long unsigned int cTime=millis();

char buzState=0;

if (cTime

{

if (diff>0)

buzState=1;

else if(diff<0)

buzState=2;

}

if (cTime>pTime+buzPeriod)

{

if (diff>0)

buzState=1;

else if (diff<0)

buzState=2;

pTime=cTime;

}

if (buzPeriod>300)

buzState=0;


if (buzState==0)

{

digitalWrite(led, LOW);

noTone(buz);

}

else if (buzState==1)

{

tone(buz,2000);

digitalWrite(led, HIGH);

}

else if (buzState==2)

{

tone(buz,500);

digitalWrite(led, HIGH);

}

}


//subtract minimum and maximum value to remove spikes

sum-=minval;

sum-=maxval;

if (sumExpect==0)

sumExpect=sum<<6; //set sumExpect to expected value

long int avgsum=(sumExpect+32)>>6;

diff=sum-avgsum;

if (abs(diff)>10)

{

sumExpect=sumExpect+sum-avgsum;

ignor=0;

}

else

ignor++;

if (ignor>64)

{

sumExpect=sum<<6;

ignor=0;

}

if (diff==0)

buzPeriod=1000000;

else

buzPeriod=avgsum/(2*abs(diff));

}


void applyPulses()

{

for (int i=0;i<3;i++)

{

digitalWrite(pulsePin,HIGH); //take 3.5 uS

delayMicroseconds(3);

digitalWrite(pulsePin,LOW); //take 3.5 uS

delayMicroseconds(3);

}

}





关键词: arduino 探测器 金属探测器

工程师
2020-11-26 21:19:29 打赏
2楼

电路,很简洁嘛!


工程师
2020-11-26 21:22:58 打赏
3楼

不知道探测距离有多远?


工程师
2020-11-26 21:26:26 打赏
4楼

请问电感线圈 L1 如何制作或设计?


工程师
2020-11-26 22:03:22 打赏
5楼

确实写的不错的


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]