آردوینو Arduino Uno پروژه های آردوینو پکیج سنسور آردوینو

پروژه اتصال سنسور دما DS18B20 ضد آب برد آردوینو با تابع Temp

نوشته شده توسط شهاب کمالی

در این آموزش قصد داریم نحوه اتصال سنسور دما DS18B20 به برد Arduino آردوینو را آموزش دهیم:) در ادامه  آموزش با مرجع تخصصی آردوینو ، دیجی اسپارک همراه باشید. سنسور دماسنج DS18B20 از ۹ تا ۱۲ بیت محدوده کاری دارد و از نظر سنجش دما -۵۵ درجه سانتی گراد و +۱۲۵ درجه سانتی گراد می‌باشد. این سنسور با کابل و به صورت ضد آب ارایه می‌شود. از ویژگی‌های بارز این سنسور ارسال اطلاعات از طریق یک پایه و به صورت دیجیتال می‌باشد.

 

arudino to 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

}

خروجی به صورت زیر است.

output-arduino-ds18b20

 


سخت افزار مورد نیاز


برد آردوینو Arduino UNO

سنسور دماسنج DS18B20

مقاومت ۴٫۷ کیلو اهم

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

پروژه و دریافت بن ارسال رایگان

برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکه‌های اجتماعی از جمله آپارات و اینستگرام، با هشتگ‌های دیجی_اسپارک   دانشجوکیت    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 ورژن ۲٫۳٫۷ دارم. مشکل چیه؟ چطور حل میشه؟ مدتیه درگیر راه اندازی این سنسور هستم ولی بر خلاف ظاهر ساده، اصلا نتیجه نمیگیرم.