با سلام خدمت دوستان عزیز امروز براتون یک پروژه جالب با آردوینو آماده کردم که امیدوار مفید باشه براتون ….
این مقاله راجع به دماسنج دیجیتال با استفاده از آردوینو است. رنج این دما سنج از ۰ درجه سانتی گراد تا ۹۹٫۹ در جه سانتی گراد است. همچنین این امکان وجود دارد تا دما بر حسب فارنهایت محاسبه شود. سه ترمینال سنسور آنالوگ دما Lm35 به عنوان سنسور دما استفاده میشود . lm35 میتواند رنج دمایی بین -۵۵ درجه سانتی گراد تا +۱۵۵ را اندازه بگیرد. رنج ولتاژ تغذیه از ۴ تا ۳۰ ولت dc و جریان عبوری ۶۰ uA است . Lm35 در بسته to-92 فراهم است و استفاده از اون نیز بسیار سا ده هستش. ولتاژ خروجی از آردوینو ۱۰ میلی ولت به ازای هر درجه سانتی گراد افزایش مییابد.
به این معنی که اگر دما ۲۵ درجه سانتی گراد باشد ولتاژ سنسور ۲۵۰mV است. مداری که راجع به اون صحبت میکنیم شماتیک آن را در شکل زیر میبینید.
سنسور دما از طریق پورتهای آنالوگ به آردوینو متصل شده است. پین A0 آردوینو به عنوان تغذیه برای سنسور است و پین A2 آردوینو به عنوان زمین است. آردوینو ولتاژ خروجی سنسور را توسط ورودی A1 میخواند. پین دیجیتال ۴ آردوینو به عنوان سلکتور بین سانتی گاد و فارنهایت است. ترانزیستورهای درایور دیجیتال Q1 ,Q2,Q3 به پینهای ۱و ۲ و۳ آردوینو متصل است. پینهای a تا dp سون سگمنت به پینهای ۵ تا ۱۲ آ ردوینو متصل است.
مقاومتهای R9,R10 ,R11 جریان پایه از پاسخ فرکانس را محدود میکند. مقاومتهای R1 تا R8 جریان عبوری از سگمنتها را محدود میکند.
برنامه :
int i;
int backup;
int a;
int unit;
int value;
int vcc=A0;
int sensor=A1;
int gnd=A2;
int select=4;
int disp1=1;
int disp2=2;
int disp3=3;
int segA=5;
int segB=6;
int segC=7;
int segD=8;
int segE=9;
int segF=10;
int segG=11;
int segDP=12;
void setup()
{
pinMode(disp1, OUTPUT);
pinMode(disp2, OUTPUT);
pinMode(disp3, OUTPUT);
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(segDP, OUTPUT);
pinMode(sensor, INPUT);
pinMode(vcc, OUTPUT);
pinMode(gnd, OUTPUT);
pinMode(select, INPUT);
digitalWrite(vcc, HIGH);
digitalWrite(gnd, LOW);
}
void loop()
{
value=analogRead(sensor); //Reads the sensor LM35
value=value*5;
unit=digitalRead(select); //Reads the selector switch
if(unit==1)
{value=value;} // Output in celcius
else
{value=(value*1.8)+320;} //Output in Fahrenheit
backup=value; //Backs up the content in variable value
for(i=0;i<100;i++) //Loops the display loop 100 times(steadies the display)
{value=backup;
a=value%10;
digitalWrite(disp1,LOW);
digitalWrite(disp2,LOW);
digitalWrite(disp3, HIGH);
digitalWrite(segDP,HIGH);
display(a);
delay(4);
value = value/10;
a = value%10;
digitalWrite(disp3,LOW);
digitalWrite(disp2,HIGH);
digitalWrite(segDP,LOW);
display(a);
delay(4);
value=value/10;
a=value;
digitalWrite(disp2,LOW);
digitalWrite(disp1,HIGH);
digitalWrite(segDP,HIGH);
display(a);
delay(4);
}
}
int display (int a)
{
switch (a)
{
case 0:
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, HIGH);
break;
case 1:
digitalWrite(segA, HIGH);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
case 2:
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, LOW);
break;
case 3:
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, LOW);
break;
case 4:
digitalWrite(segA, HIGH);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;
case 5:
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, HIGH);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;
case 6:
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
); digitalWrite(segG, LOW
break;
case 7:
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
case 8:
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;
case 9:
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, HIGH);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;
}}
درباره برنامه:
ولتاژ خروجی سنسور توسط تابع خواندن آنالوگ بررسی میشود. تابع خواندن آنالوگ ولتاژ ورودی آنالوگ را میخواند و آن را به مقدار دیجیتال بین ۰ و ۱۰۲۳ تبدیل میکند. مقدار کد = مقدار دیجیتال خوانده شده سنسور این ولتاژ را میخواند و آن را به مقدار دیجیتال تبدبل میکند و آن را در متغیری به نام “value” میریزد. بنابراین برای ۳۰ درجه سانتی گراد عدد در متغیر “value” برابر ۳۰۰mV/(5/1023) است. این عدد در ۵ ضرب میشود تا به عدد ۳۰۵ برسیم و یک نقطه دسیمال قبل از آخرین عدد گزاشته میشود و در نتیجه بر روی سون سگمنت ۳۰٫۵ درجه سانتی گراد نمایش داده میشود.
این برنامه همچنین حالت پین دیجیتال ۴ را چک میکند و اگر پین یک باشد خروجی به صورت سانتی گراد نمایش داده میشود و اگر نه به شکل فارنهایت نمایش داده میشود.
منبع: میکرودیزاینرالکترونیک