در این آموزش قصد داریم نحوه اتصال سنسور دما DS18B20 به برد Arduino آردوینو را آموزش دهیم:) در ادامه آموزش با مرجع تخصصی آردوینو ، دیجی اسپارک همراه باشید. سنسور دماسنج DS18B20 از ۹ تا ۱۲ بیت محدوده کاری دارد و از نظر سنجش دما -۵۵ درجه سانتی گراد و +۱۲۵ درجه سانتی گراد میباشد. این سنسور با کابل و به صورت ضد آب ارایه میشود. از ویژگیهای بارز این سنسور ارسال اطلاعات از طریق یک پایه و به صورت دیجیتال میباشد.
کد نویسی پروژه سنسور دما DS18B20
جهت کامپایل برنامه نیاز به کتابخانه یOneWire.h دارید این کتابخانه را دانلود کنید. پس از دانلود فایل زیپ را در مسیر دلخواه قرار دهید و توسط مسیر زیر کتابخانه را به آردوینو اضافه کنید. Import Library–> add Library یکبار محیط آردوینو را ببندید و دوباره باز کنید.
#include <OneWire.h> int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2 //Temperature chip i/o OneWire ds(DS18S20_Pin); // on digital pin 2 void setup(void) { Serial.begin(9600); } void loop(void) { float temperature = getTemp(); Serial.println(temperature); delay(100); //just here to slow down the output so it is easier to read } float getTemp(){ //returns the temperature from one DS18S20 in DEG Celsius byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1000; } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return -1000; } if ( addr[0] != 0x10 && addr[0] != 0x28) { Serial.print("Device is not recognized"); return -1000; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); //using two's compliment float TemperatureSum = tempRead / 16; return TemperatureSum; }
شرح برنامه سنسور دما DS18B20
تابع getTemp آدرس۸ بیتی چیپ خوانده میشود درون آرایه آدرس قرار میگیرد. سپس بایت های دیتا طبق خروجی۱۲ بیتی سنسور خوانده میشود و درون آرایه دیتا قرار میدهد. اگر سنسور متصل نباشد تابع مقدار -۱۰۰۰ و اگر متصل باشد مقدار دما را برمیگرداند.
float getTemp(){ //returns the temperature from one DS18S20 in DEG Celsius byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1000; } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return -1000; } if ( addr[0] != 0x10 && addr[0] != 0x28) { Serial.print("Device is not recognized"); return -1000; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); //using two's compliment float TemperatureSum = tempRead / 16; return TemperatureSum; }
در نهایت دما خوانده شده از سنسور DS18B20 را چاپ میکند.
void loop(void) { float temperature = getTemp(); Serial.println(temperature); delay(100); //just here to slow down the output so it is easier to read }
خروجی به صورت زیر است.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
پروژه و دریافت بن ارسال رایگان
برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکههای اجتماعی از جمله آپارات و اینستگرام، با هشتگهای دیجی_اسپارک دانشجوکیت digispark daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
این سنسور حرف نداره، بین پروژه هاى کنترل دمایى که من دیدم ، این سنسور واقعا بینظیر بوده
ممنون از سایت خوبتون
سلام
من این مدارو میخوام بزارم تو ربات امدادگر از کجا دمای بدن مصدومو ببنیم ایا میشه نرم افزاری بزنم تو لب تاب که بتونم دمارو اونجا ببینم( البته ربات به صورت بیسیم اطلاعاتو بفرسته) نه با کابلUSBمیشه؟؟؟ اگه میشه میشه اموزششو یا تو اینجا بزارید یا بفرستید تو جیمیلم؟؟؟ و میشه به این مدار یه LCD وصل کنم و اونجا نشون بده؟؟؟؟ و میشه آموزش کامل اینارو بززارید ممنون…… من از طرفداران سایت شما هستم باتشکر
درود بله همه ی این کارایی که شما دوس دارین را میشه انجام داد ☺?
خواهشا بگید لازم دارم
اگه بتونم وبگید چه جوری من میخرم
پوریای عزیز تمامی این کار هایی که سوال پرسیدید به راحتی انجام پذیر هست برای انتقال اطلاعات به کامپیوتر باید از مثال های انتفال سریال آردونیو استفاده کنید که حتی تو مثال های همراه با نرم افزار آردوینو وجود داره، برای انتقال وایرلس باید یه ماژول وایرلس انتخاب کنید و خروجی سنسور را روی آن ارسال کنید، و جهت نمایش هم همینجور از یک ال سی دی که چند تایی از ان ها رو قبلا آموزش دادیم، خلاصه دوست عزیز ما آموزش رو از اتصال سنسور میزاریم خروجی که گرفته میشه شما باید با ماژول ها ال سی دی ها و … که نیاز شماست ترکیب کنید کمی بیشتر در باره خود آردوینو مطالعه کنید تمامی کارها به آسانی قابل انجام است موفق باشید
سلام
ببخشید چه جوری میتونم یه جوری تنظیم کنم که نفرسته به سریال بفرسته رو ال سی دی …. میشه توضیح کاملشو بزارید تو جیمیلم ممنون…. ونصب ال سی دی…. وبرنامه هاش… راستی یه چیزیم میشه به صورت بیسیم اطلاعاتو بفرسته روسریال اگه میشه بگید چه جوری مممممنون
سلام
ببخشید آیا این ماژول دمای بدن به صورت دقیق ارسال میکنه؟؟
با سلام
دقت سنسور ۲ درجه سانتی گراد است و به کالیبره نیاز دارد.
شما گفتید خروجی سنسورو باید روش تنظیم کنم چه جوری
نمیگید
تشکر بابت این پست خوب . یه سوال داشتم من همین مدار رو بدون پول آپ بستم. اما دما رو -۱۰۰۰ می زنه آیا بدون پول آپ امکان پذیر نیست؟
من هم همین مشکل رو دارم و دمای -۱۲۷ رو نشون میده و وقتی مذارم هر یک ثانیه دمارو چاپ کنه روی سریال گاهی دمای درست رو نشون میده و سایر اوقات -۱۲۷
هم بدون پول آپ بستم هم با پول اپ فرقی نکرد
البته من در پروتئوس دارم مدار رو میبندم و تست میکنم.
امکانش هست راهنمایی کنید چرا -۱۲۷ نشون میده؟
با سلام
– ۱۲۷ نمایانگر عدم ارتباط سنسور با میکرو است. آیا از مقاومت استفاده کرده اید؟
بله عرض کردم بعنوان پول آپ استفاده کردم از مقاومت ۴٫۷ ولی باز هم -۱۲۷ می بینم!
با سلام
در این صورت ممکن است سنسور آسیب دیده باشد. در ابتدا پیشنهاد میکنم از یک برنامه جدیدتر جهت تست سنسور استفاده کنید. کتابخانه DS18b20 را دانلود و از برنامه های پیش فرض استفاده و تست کنید.
سلام.
من این مدارو بستم اما دما رو ثابت نشون نمیده . طول می کشه تا به دمای ثابتی در محیط برسه.به نظرتون مشکل از کجاست؟
سلام
باید تنظیمات سریال مانیتور و کدهای برنامه را چک نمایید و اگر با ارور خاصی برخورد کردید از همین طریق اعلام نمایید تا بررسی کینم.
دوستان خواستم بپرسم اگه برنامشو بریزم رو آردوینو و یدفه سنسورو قطع کنم چه دمایی بعد از قطع سنسور ثبت میشه ؟ حداکثر رو میزنه یادم حداقل رو ؟
سلام
لطفا سوال خود را واضح تر بیان نمایید. همانطور که در برنامه گفته شده توسط تابع getTemp
اگر سنسور متصل نباشد تابع مقدار -۱۰۰۰ و اگر متصل باشد مقدار دما را برمیگرداند.
با سلام
نظر درمورد این اموزش خوب وسنسور بحال
اگه امکان دارد برای برد های وای فا )((node mcu32..wemos ))بزارید
یک نمونه کد را پیوست میکنم
#include
#include
#include
#include
#include
const char* ssid = “***********”; // یوزر نیم مودم یا روتر وای فای
const char* password = “**********”; // پسوورد روتر یا مودم وای فای
uint16_t port =8888;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
OneWire oneWire (2);//پین ۴
DallasTemperature temperature(&oneWire);
WiFiUDP udp;
void setup() {
Serial.begin(115200);
delay(10);
WiFi.begin(ssid,password);
while(WiFi.status() !=WL_CONNECTED){
delay(500);
Serial.print(“.”);
}
Serial.println(“”);
Serial.println(“wifi connected”);
Serial.print(“IP address: “);//ای پی ادرس در سریال متانیتور
Serial.println(WiFi.localIP());
udp.begin(port);
temperature.begin();
}
void loop() {
delay(1000);
Serial.println(temperature.getTempCByIndex(0));
//put your main code here, to run repeatedly:
int pacetSize = udp.parsePacket();
if(pacetSize ){
Serial.println(“Recive packet”);
udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
Serial.println(packetBuffer);
}
if(packetBuffer[0] ==’1′ && packetBuffer[2]==’1′){
Serial.println(“Send packet”);
String message=”1,1,0,0:”;
char payload[5];
temperature.requestTemperatures();
delay(10);
dtostrf(temperature.getTempCByIndex(0),1,2,payload);
message+= String(payload);
for(int i=0;i<4;i++){
udp.beginPacket(udp.remoteIP(),8888);
udp.print(message);
udp.endPacket();
delay(70);
}
Serial.println(message);
memset(packetBuffer,0,UDP_TX_PACKET_MAX_SIZE);
}
}
با سلام
ضمن تشکر از توجه شما، لطفا کدها را در یک فایل متنی و روی دراپ باکس و یا… آپلود کنید و لینک مربوطه را جهت بررسی ارسال کنید.
سلام چون onewire هست من ۸ عدد از این سنسور به یک پایه وصل کردم ولی همه جوابا ۰ در اومد متاسفانه باید چیکار کنم
سلام
از چه کتابخانه ای استفاده کردید؟
عالی بود ، خسته نباشی شهاب جان
سلام
از توجه شما ممنونم.
سلام وقتتون بخیر
من وقت کد میخوام Verifi کنم از خط های که ds استفاده شده ایراد میگیره و نمیشناسه.
ds.reset();
ds.select(addr);
مشکل از کجاست
از با کد دیگه تست کردم کار میکرد ، میخوام از روش شما استفاده کنم.
با سلام
ارور کامل را ارسال کنید تا بررسی شود.
سلام داخل پروتئوس سنسور رو تشخیص نمیده و ۱۰۰۰٫۰۰- نشون میده. فقط یه لحظاتی ۰٫۰۰ نشون میده. عملی هم تست کردم همینه. پول آپ ۴٫۷ کیلو هم وصل کردم. کتابخونه onewire ورژن ۲٫۳٫۷ دارم. مشکل چیه؟ چطور حل میشه؟ مدتیه درگیر راه اندازی این سنسور هستم ولی بر خلاف ظاهر ساده، اصلا نتیجه نمیگیرم.
با سلام
این مورد در پروتئوس تست نشده است.