آموزش راه اندازی سنسور دما دیجیتال DS18B20(نسخه 3.0)

در اين بخش مي‌توانيد آموزش و مثال‌های مرتبط با میکروکنترلرهای AVR را مشاهده بفرمایید

مدیران انجمن: SAMAN, sinaset, شوراي نظارت

Colonel II
Colonel II
نمایه کاربر
پست: 7014
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9183 بار
سپاس‌های دریافتی: 21046 بار
تماس:

آموزش راه اندازی سنسور دما دیجیتال DS18B20(نسخه 3.0)

پست توسط sinaset » سه شنبه 16 شهریور 1395, 8:58 am

بنام خدا
باسلام

آموزش راه اندازی سنسور دما دیجیتال DS18B20

تصویر

سنسور دما DS18b20 یک سنسور دیجیتال خوب و پیشرفته می باشد! این سنسور توانایی های جالبی از جمله،ارتباط تک سیمه،با میکروکنترولر دارد! علاوه بر نکته ی که گفته شد،این سنسورها هر کدام،داریی یک شماره سریال می باشند،که به کمک همین قابلیت می توان،چنده ده سنسور را فقط با یک سیم به میکروکنترولر ارتباط داد!

مشخصات سنسور:

اندازه گیری دمایی -55 تا 125+
دقت انداگیری 12 بیت ( در 750 میلی ثانیه)
ولتاژ کاری 3.0 تا 5.5 ولت
قابلیت تنظیم آرم داخلی(برای یک دمایی خاص)
و..
درون ایسی ds18b20
همانجور که در تصویر زیر می ببینید،این ایسی دما از قسمت ها مختلفی تشکیل شده.
تصویر
تصویر
پایه های ایسی :
پایه Vdd پایه مثبت ایسی
پایه GND پایه منفی ایسی
پایه DQ پایه ارتباطات ایسی.
---------
تصویر
پایه DQ ایسی باید با یک مقاومت 4.7 تا 10 کیلواهم،به مثبت اتصال پیدا کند (یا پول آپ شود)
 فهرست مطالب تاپیک:
صفحه اول
ارتباط با ایسی DS18B20
استفاده از 20 سنسور DS18b20
دماسنج با سون سگمنت.
2 سون سگمنت و علامت منفی

صفحه دوم
ورژن 3 با سون سگمنت 4 رقمی (نمایش ممیز و علامت منفی)

باتشکر.
 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 7014
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9183 بار
سپاس‌های دریافتی: 21046 بار
تماس:

Re: آموزش راه اندازی سنسور دما دیجیتال DS18B20

پست توسط sinaset » یک شنبه 18 مهر 1395, 4:08 pm

بنام خدا
باسلام


ارتباط با ایسی DS18B20
 تصویر 
ارتباط با ایسی بسیار ساده می باشد! به طور ساده،ما ابتدا یک دستور سرچ به به کمک 1wire می فرستیم! سپس ایسی کد شناسایی خودش را برای ما می فرستد! ما آن کد شناسایی را درون یک متغیر رشته ی ذخیر می کنیم، [HIGHLIGHT=#00b0f0]سپس در برنامه،هر وقت بخواهیم، دما را بخوانیم،کافیست! فقط کدشناسایی ایسی را براش از طریق 1wire بفرستیم ، تا ایسی بعد از دریافت کد شناسایی،مقدار دمایی خود را برای ما بفرستد!

[HIGHLIGHT=#00b050]حال همین مراحل را در کد نویسی شرح می دهیم ! 

به غیر از کتابخانه مورد نیز، این کتابخانه انحصاری برای ایسی را فعال می کنیم :

کد: انتخاب همه

#include <ds18b20.h>    //کتابخانه ايسي دماسنج در کدويژن
#include <1wire.h>   //فعال سازي واحد


سپس یک رشته 9 تایی تعریف می کنیم (برای اینکه کدشناسایی ایسی 64 بیت! می باشد)

کد: انتخاب همه

unsigned char DS18B20_Rom_Codes[9];    //متغير 9 رشته ي،براي گرفتن شماره سريال ايسي


سپس وارد حلقه main میشویم،در انجا یک متغیر اعشاری تعریف می کنیم (برای نمایش دما ایسی،با دقت 0.1 )

کد: انتخاب همه

float Thermometer;    //متغير  اعشاري براي گرفتن دما


با دستور زیر، 1wire را مقدار دهی اولیه می کنیم (لازم به ذکر است،از طریق تنظیمات project/configure/c compiler/Libraries/1wire کتابخانه wire را فعال سازی کنید و پایه که ایسی به ان اتصال پیدا کرده است را مشخص کنید)

کد: انتخاب همه

    w1_init();       //مقداري اوليه 1 واير


اما در ادامه،باید یک عملیات سرچ انجام شود،و کدشناسایی ایسی پیدا و برای ما فرستاده شود تا در یک متغیر ان را ذخیر کنیم.
به کمک تابع w1_search و کد f0 (که ایسی ds18b20 به دیدن ان کدشناسایش را می فرستد) از ایسی درخواست کدشناسایی می کنیم

کد: انتخاب همه

w1_search(0xf0,DS18B20_Rom_Codes);     //کد براي معرفي ايسي و ريختن شمار ايسي به درون متغير ذکر شده


همانجور که در بالا می ببیند،کدشناسایی در همان رشته 9 تایی که در گذشته تعریف کرده ایم، ریخته میشود(DS18B20_Rom_Codes)

حال به درون حلقه while می رویم، در انجا کافیست،به کمک تابع زیر،مقدار دما را فرابخوانیم و سپس در متغیر اعشاری دما بریزیم

کد: انتخاب همه

      Thermometer = ds18b20_temperature(DS18B20_Rom_Codes);
      // به کمک تابع ،کد شناسايي بر روي خط فرستاده ميشود،و بعد ايسي مقدر دما را بر روي براي ما مي فرستد
       //ريخته ميشودthermometerو آن مقدار بر روي متغير


حال دیگر همه چیز تمام است و می توان دما را بر روی LCD نمایش داد

کل کدهایی برنامه:

کد: انتخاب همه

/*******************************************************
Project : temp DS18B20
Version :1.0
Date    : 1395.7.18
Edit  : siaset
ref: centralclubs.com
Chip type         : ATmega8A
AVR Core Clock frequency: 8.000000 MHz
*******************************************************/
#include <mega8.h>
#include <stdio.h> 
#include <alcd.h>
#include <delay.h>
#include <ds18b20.h>    //کتابخانه ايسي دماسنج در کدويژن
#include <1wire.h>   //فعال سازي واحد

unsigned char DS18B20_Rom_Codes[9];    //متغير 9 رشته ي،براي گرفتن شماره سريال ايسي
      
void main(void){    
    float Thermometer;    //متغير  اعشاري براي گرفتن دما
    char str[16];      
   
    lcd_init(16);
    w1_init();       //!wire مقدار دهي اوليه
    w1_search(0xf0,DS18B20_Rom_Codes);     //کد براي معرفي ايسي و ريختن شمار ايسي به درون متغير ذکر شده
   
    ///**** کدهايي زير را در صورت عدم تمايل مي توانيد تا جايي مشخص شده حذف کنيد
    sprintf(str,"CODE_IC1:%x%x%x",DS18B20_Rom_Codes[3],DS18B20_Rom_Codes[2],DS18B20_Rom_Codes[1]);  //LCDدريافت کد ايسي ،براي نمايش بر روي
    lcd_puts(str); // LCD نمايش بر روي
    delay_ms(2000);
    lcd_clear();   
    /////****///
                              
    while(1){
      Thermometer = ds18b20_temperature(DS18B20_Rom_Codes);
      // به کمک تابع ،کد شناسايي بر روي خط فرستاده ميشود،و بعد ايسي مقدر دما را بر روي براي ما مي فرستد
       //ريخته ميشودthermometerو آن مقدار بر روي متغير
      sprintf(str,"TEMP:%.1f C  ",Thermometer);//ريختن مقدار متغير بر روي رشته 
      lcd_clear();
      lcd_gotoxy(0,0);
      lcd_puts(str); //LCD نمايش بر روي 
      delay_ms(1000);         
    }
}


[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید] شبیه ساز و برنامه.
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 5
تاریخ عضویت: جمعه 10 دی 1395, 11:00 pm
سپاس‌های ارسالی: 2 بار
سپاس‌های دریافتی: 5 بار

Re: آموزش راه اندازی سنسور دما دیجیتال DS18B20

پست توسط h.kiya » شنبه 11 دی 1395, 12:13 am

آقا سینا بی زحمت یه توضیح می دید که چند تا سنسور رو چطور با 1 سیم راه اندازی کنیم
ممنون

Colonel II
Colonel II
نمایه کاربر
پست: 7014
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9183 بار
سپاس‌های دریافتی: 21046 بار
تماس:

Re: آموزش راه اندازی سنسور دما دیجیتال DS18B20

پست توسط sinaset » شنبه 11 دی 1395, 9:16 am

بنام خدا
--
سلام بر شما
انشالله در این پست توضیح خواهم داد،تشکر از تذکر شما.
--
استفاده از 20 سنسور DS18b20 در کنار هم.!
 تصویر  تصویر  این اموزش قصد داریم 20 ایسی دما ds18b20 را بهم دیگر برای یک میکرو راه اندازی کنیم!
همانجور که در گذشته نیز گفتیم،این ایسی ها دما،هر کدام یک کد شناسایی کارخانه ی نیز دارن،که کار را برای ما نیز اسان می کند، حال کافیست ما ابتدا یک دستور شناسایی برای همه ایسی بفرستیم،تا خودشان را معرفی کنند! سپس در برنامه به کمک کدهایی شناسایی ،هر ایسی که خواستیم را می توانیم صدا بزنیم و دمایی ان را بخوانیم!

در این برنامه بدلیل زیاد بودن تعداد ایسی ها و عدم نمایش صحیح بر روی LCD ،نمایش از طریق رابط uart انجام میشود.(پس یک مبدل uart به usb تهیه کنید،)
مراحل برنامه نویسی:

به قسمت های مهم می پردازیم..

متغیری تعریف میکنیم،که به کمک ان بتوانیم تعداد ایسی های موجود در مدار را بدست بیاوریم.

کد: انتخاب همه

unsigned char IC_DS18B20@0x020;  //متغير براي دريافت تعداد ايسي ها


20 آرایه دو بعدی تعریف می کنیم،تا کدهایی شناسایی هر ایسی را در ان قرار دهیم.

کد: انتخاب همه

unsigned char DS18B20_Rom_Codes[20][9]@0x200;  //ارايه دو بعدي براي دريافت کدهايي شناسايي ايسي ها


20 متغیر از نوع اعشاری برای دمایی هر ایسی تعریف می کنیم

کد: انتخاب همه

float Thermometer[20]; 


به کمک دستور مهم زیر،از ایسی های می خواهیم خودشان را معرفی کنند،سپس کدشناسایی هر ایسی را در یکی از ارایه های DS18B20_Rom_Codes قرار میدهیم.

کد: انتخاب همه

IC_DS18B20=w1_search(0xf0,DS18B20_Rom_Codes);  


به کمک دستور ها زیر، کدشناسایی 20 ایسی نمایش داده میشود،(به کمک شماره کدشناسایی هر ایسی،می توانید هر ایسی را جداگانه پیدا کنید! یا مکان دقیق ایسی را در مدار بدانید و ..)

کد: انتخاب همه

   sprintf(str,"CODE_IC1:%x%x%x",DS18B20_Rom_Codes[0][3],DS18B20_Rom_Codes[0][2],DS18B20_Rom_Codes[0][1]),puts(str); 
   sprintf(str,"  CODE_IC2:%x%x%x",DS18B20_Rom_Codes[1][3],DS18B20_Rom_Codes[1][2],DS18B20_Rom_Codes[1][1]),puts(str);
   sprintf(str,"  CODE_IC3:%x%x%x",DS18B20_Rom_Codes[2][3],DS18B20_Rom_Codes[2][2],DS18B20_Rom_Codes[2][1]),puts(str); 
   sprintf(str,"  CODE_IC4:%x%x%x",DS18B20_Rom_Codes[3][3],DS18B20_Rom_Codes[3][2],DS18B20_Rom_Codes[3][1]),puts(str);
   sprintf(str,"  CODE_IC5:%x%x%x\r\n",DS18B20_Rom_Codes[4][3],DS18B20_Rom_Codes[4][2],DS18B20_Rom_Codes[4][1]),puts(str);
   sprintf(str,"CODE_IC6:%x%x%x",DS18B20_Rom_Codes[5][3],DS18B20_Rom_Codes[5][2],DS18B20_Rom_Codes[5][1]),puts(str);
   sprintf(str,"  CODE_IC7:%x%x%x",DS18B20_Rom_Codes[6][3],DS18B20_Rom_Codes[6][2],DS18B20_Rom_Codes[6][1]),puts(str);
   sprintf(str,"  CODE_IC8:%x%x%x",DS18B20_Rom_Codes[7][3],DS18B20_Rom_Codes[7][2],DS18B20_Rom_Codes[7][1]),puts(str); 
   sprintf(str,"  CODE_IC9:%x%x%x",DS18B20_Rom_Codes[8][3],DS18B20_Rom_Codes[8][2],DS18B20_Rom_Codes[8][1]),puts(str);
   sprintf(str,"  CODE_IC10:%x%x%x\r\n",DS18B20_Rom_Codes[9][3],DS18B20_Rom_Codes[9][2],DS18B20_Rom_Codes[9][1]),puts(str); 
   sprintf(str,"CODE_IC11:%x%x%x",DS18B20_Rom_Codes[10][3],DS18B20_Rom_Codes[10][2],DS18B20_Rom_Codes[10][1]),puts(str);
   sprintf(str,"  CODE_IC12:%x%x%x",DS18B20_Rom_Codes[11][3],DS18B20_Rom_Codes[11][2],DS18B20_Rom_Codes[11][1]),puts(str);
   sprintf(str,"  CODE_IC13:%x%x%x",DS18B20_Rom_Codes[12][3],DS18B20_Rom_Codes[12][2],DS18B20_Rom_Codes[12][1]),puts(str); 
   sprintf(str,"  CODE_IC14:%x%x%x",DS18B20_Rom_Codes[13][3],DS18B20_Rom_Codes[13][2],DS18B20_Rom_Codes[13][1]),puts(str);
   sprintf(str,"  CODE_IC15:%x%x%x\r\n",DS18B20_Rom_Codes[14][3],DS18B20_Rom_Codes[14][2],DS18B20_Rom_Codes[14][1]),puts(str); 
   sprintf(str,"CODE_IC16:%x%x%x",DS18B20_Rom_Codes[15][3],DS18B20_Rom_Codes[15][2],DS18B20_Rom_Codes[15][1]),puts(str);
   sprintf(str,"  CODE_IC17:%x%x%x",DS18B20_Rom_Codes[16][3],DS18B20_Rom_Codes[16][2],DS18B20_Rom_Codes[16][1]),puts(str);
   sprintf(str,"  CODE_IC18:%x%x%x",DS18B20_Rom_Codes[17][3],DS18B20_Rom_Codes[17][2],DS18B20_Rom_Codes[17][1]),puts(str); 
   sprintf(str,"  CODE_IC19:%x%x%x",DS18B20_Rom_Codes[18][3],DS18B20_Rom_Codes[18][2],DS18B20_Rom_Codes[18][1]),puts(str);
   sprintf(str,"  CODE_IC20:%x%x%x\r\n",DS18B20_Rom_Codes[19][3],DS18B20_Rom_Codes[19][2],DS18B20_Rom_Codes[19][1]),puts(str);


به کمک دستور زیر،دمایی هر ایسی خوانده میشود و سپس هر کدام در متغیر رشته ی Thermometer ذخیره میشود..

کد: انتخاب همه

      for (i=0;i<IC_DS18B20;i++)   { //حلقه ي براي خواندن مقدار دما ها
        Thermometer = ds18b20_temperature(DS18B20_Rom_Codes);  //خواندن دمايي هر ايسي                     
      }


در پایان نیز،مقدار دمای هر ایسی برای نمایش فرستاده میشود

کد: انتخاب همه

      sprintf(str,"\r\nT1:%.1f  ",Thermometer[0]),puts(str);     //نمايش دما 20 ايسي
      sprintf(str,"T2:%.1f  ",Thermometer[1]),puts(str);
      sprintf(str,"T3:%.1f  ",Thermometer[2]),puts(str);
      sprintf(str,"T4:%.1f  ",Thermometer[3]),puts(str);
      sprintf(str,"T5:%.1f  ",Thermometer[4]),puts(str);
      sprintf(str,"T6:%.1f  ",Thermometer[5]),puts(str);
      sprintf(str,"T7:%.1f  ",Thermometer[6]),puts(str);
      sprintf(str,"T8:%.1f  ",Thermometer[7]),puts(str); 
      sprintf(str,"\r\nT9:%.1f  ",Thermometer[8]),puts(str); 
      sprintf(str,"T10:%.1f  ",Thermometer[9]),puts(str);
      sprintf(str,"T11:%.1f  ",Thermometer[10]),puts(str);
      sprintf(str,"T12:%.1f  ",Thermometer[11]),puts(str);
      sprintf(str,"T13:%.1f  ",Thermometer[12]),puts(str);
      sprintf(str,"T14:%.1f  ",Thermometer[13]),puts(str);
      sprintf(str,"T15:%.1f  ",Thermometer[14]),puts(str);
      sprintf(str,"T16:%.1f  ",Thermometer[15]),puts(str);
      sprintf(str,"\r\nT17:%.1f  ",Thermometer[16]),puts(str); 
      sprintf(str,"T18:%.1f  ",Thermometer[17]),puts(str);
      sprintf(str,"T19:%.1f  ",Thermometer[18]),puts(str);
      sprintf(str,"T20:%.1f  ",Thermometer[19]),puts(str);      


کل کدهایی برنامه:

کد: انتخاب همه

/*******************************************************
Project : 20 temp ds18b20 uart
Version :
Date    : 09/02/2016
Edit  : siaset


Chip type         : ATmega8A
AVR Core Clock frequency: 8.000000 MHz
*******************************************************/
#include <mega8.h>
#include <stdio.h> 
#include <ds18b20.h> 
#include <1wire.h>

unsigned char IC_DS18B20@0x020;  //متغير براي دريافت تعداد ايسي ها
unsigned char DS18B20_Rom_Codes[20][9]@0x200;  //ارايه دو بعدي براي دريافت کدهايي شناسايي ايسي ها
typedef unsigned char byte;
      
void main(void){    
    float Thermometer[20];   //متغير دما
    char str[32];        //رشته
    int i=0; 


//فعال سازي يو آرت
// USART Transmitter: On
// USART Baud Rate: 9600
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x33;
 
    w1_init();  //مقدار دهي اوليه به واحد 1 واير
   
    puts("TEMP 5 DS18B20 \r\n");    //چاپ يک متن
   
    IC_DS18B20=w1_search(0xf0,DS18B20_Rom_Codes);   //شناسايي ايسي ها و ذخيره کدهايي شناسايي
   
    //خطوط زير براي نمايش کدشناسايي 20 ايسي مي باشد،که مي تواند در اينده به شما کمک کند
   sprintf(str,"CODE_IC1:%x%x%x",DS18B20_Rom_Codes[0][3],DS18B20_Rom_Codes[0][2],DS18B20_Rom_Codes[0][1]),puts(str);
   sprintf(str,"  CODE_IC2:%x%x%x",DS18B20_Rom_Codes[1][3],DS18B20_Rom_Codes[1][2],DS18B20_Rom_Codes[1][1]),puts(str);
   sprintf(str,"  CODE_IC3:%x%x%x",DS18B20_Rom_Codes[2][3],DS18B20_Rom_Codes[2][2],DS18B20_Rom_Codes[2][1]),puts(str); 
   sprintf(str,"  CODE_IC4:%x%x%x",DS18B20_Rom_Codes[3][3],DS18B20_Rom_Codes[3][2],DS18B20_Rom_Codes[3][1]),puts(str);
   sprintf(str,"  CODE_IC5:%x%x%x\r\n",DS18B20_Rom_Codes[4][3],DS18B20_Rom_Codes[4][2],DS18B20_Rom_Codes[4][1]),puts(str);
   sprintf(str,"CODE_IC6:%x%x%x",DS18B20_Rom_Codes[5][3],DS18B20_Rom_Codes[5][2],DS18B20_Rom_Codes[5][1]),puts(str);
   sprintf(str,"  CODE_IC7:%x%x%x",DS18B20_Rom_Codes[6][3],DS18B20_Rom_Codes[6][2],DS18B20_Rom_Codes[6][1]),puts(str);
   sprintf(str,"  CODE_IC8:%x%x%x",DS18B20_Rom_Codes[7][3],DS18B20_Rom_Codes[7][2],DS18B20_Rom_Codes[7][1]),puts(str); 
   sprintf(str,"  CODE_IC9:%x%x%x",DS18B20_Rom_Codes[8][3],DS18B20_Rom_Codes[8][2],DS18B20_Rom_Codes[8][1]),puts(str);
   sprintf(str,"  CODE_IC10:%x%x%x\r\n",DS18B20_Rom_Codes[9][3],DS18B20_Rom_Codes[9][2],DS18B20_Rom_Codes[9][1]),puts(str); 
   sprintf(str,"CODE_IC11:%x%x%x",DS18B20_Rom_Codes[10][3],DS18B20_Rom_Codes[10][2],DS18B20_Rom_Codes[10][1]),puts(str);
   sprintf(str,"  CODE_IC12:%x%x%x",DS18B20_Rom_Codes[11][3],DS18B20_Rom_Codes[11][2],DS18B20_Rom_Codes[11][1]),puts(str);
   sprintf(str,"  CODE_IC13:%x%x%x",DS18B20_Rom_Codes[12][3],DS18B20_Rom_Codes[12][2],DS18B20_Rom_Codes[12][1]),puts(str); 
   sprintf(str,"  CODE_IC14:%x%x%x",DS18B20_Rom_Codes[13][3],DS18B20_Rom_Codes[13][2],DS18B20_Rom_Codes[13][1]),puts(str);
   sprintf(str,"  CODE_IC15:%x%x%x\r\n",DS18B20_Rom_Codes[14][3],DS18B20_Rom_Codes[14][2],DS18B20_Rom_Codes[14][1]),puts(str); 
   sprintf(str,"CODE_IC16:%x%x%x",DS18B20_Rom_Codes[15][3],DS18B20_Rom_Codes[15][2],DS18B20_Rom_Codes[15][1]),puts(str);
   sprintf(str,"  CODE_IC17:%x%x%x",DS18B20_Rom_Codes[16][3],DS18B20_Rom_Codes[16][2],DS18B20_Rom_Codes[16][1]),puts(str);
   sprintf(str,"  CODE_IC18:%x%x%x",DS18B20_Rom_Codes[17][3],DS18B20_Rom_Codes[17][2],DS18B20_Rom_Codes[17][1]),puts(str); 
   sprintf(str,"  CODE_IC19:%x%x%x",DS18B20_Rom_Codes[18][3],DS18B20_Rom_Codes[18][2],DS18B20_Rom_Codes[18][1]),puts(str);
   sprintf(str,"  CODE_IC20:%x%x%x\r\n",DS18B20_Rom_Codes[19][3],DS18B20_Rom_Codes[19][2],DS18B20_Rom_Codes[19][1]),puts(str);   
   
                              
    while(1){
      for (i=0;i<IC_DS18B20;i++)   { //حلقه ي براي خواندن مقدار دما ها
        Thermometer[I] = ds18b20_temperature(DS18B20_Rom_Codes[I]);  //خواندن دمايي هر ايسي
                           
      }
      sprintf(str,"\r\nT1:%.1f  ",Thermometer[0]),puts(str);     //نمايش دما 20 ايسي
      sprintf(str,"T2:%.1f  ",Thermometer[1]),puts(str);
      sprintf(str,"T3:%.1f  ",Thermometer[2]),puts(str);
      sprintf(str,"T4:%.1f  ",Thermometer[3]),puts(str);
      sprintf(str,"T5:%.1f  ",Thermometer[4]),puts(str);
      sprintf(str,"T6:%.1f  ",Thermometer[5]),puts(str);
      sprintf(str,"T7:%.1f  ",Thermometer[6]),puts(str);
      sprintf(str,"T8:%.1f  ",Thermometer[7]),puts(str); 
      sprintf(str,"\r\nT9:%.1f  ",Thermometer[8]),puts(str); 
      sprintf(str,"T10:%.1f  ",Thermometer[9]),puts(str);
      sprintf(str,"T11:%.1f  ",Thermometer[10]),puts(str);
      sprintf(str,"T12:%.1f  ",Thermometer[11]),puts(str);
      sprintf(str,"T13:%.1f  ",Thermometer[12]),puts(str);
      sprintf(str,"T14:%.1f  ",Thermometer[13]),puts(str);
      sprintf(str,"T15:%.1f  ",Thermometer[14]),puts(str);
      sprintf(str,"T16:%.1f  ",Thermometer[15]),puts(str);
      sprintf(str,"\r\nT17:%.1f  ",Thermometer[16]),puts(str); 
      sprintf(str,"T18:%.1f  ",Thermometer[17]),puts(str);
      sprintf(str,"T19:%.1f  ",Thermometer[18]),puts(str);
      sprintf(str,"T20:%.1f  ",Thermometer[19]),puts(str);                     
    }
}



[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]شبیه ساز و برنامه.
باتشکر.[/I][/I]
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 5
تاریخ عضویت: جمعه 10 دی 1395, 11:00 pm
سپاس‌های ارسالی: 2 بار
سپاس‌های دریافتی: 5 بار

Re: آموزش راه اندازی سنسور دما دیجیتال DS18B20

پست توسط h.kiya » شنبه 11 دی 1395, 12:27 pm

ممنون آقا سینا بابت راهنمایی مفیدتون

Colonel II
Colonel II
نمایه کاربر
پست: 7014
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9183 بار
سپاس‌های دریافتی: 21046 بار
تماس:

Re: آموزش راه اندازی سنسور دما دیجیتال DS18B20

پست توسط sinaset » سه شنبه 14 دی 1395, 2:48 pm

باسلام

دماسنج با سون سگمنت.

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

اما با این وجود کدها خدمت همه کاربران:
(نسخه ساده اولیه)

کد: انتخاب همه

/**************************************
name   : 'Temp 7seg ds18b20'
date   : 1395/10/14
**************************************/
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <sleep.h>
#include <ds18b20.h>    //کتابخانه ايسي دماسنج در کدويژن
#include <1wire.h>   //فعال سازي واحد
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))
flash unsigned char s[10]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char DS18B20_Rom_Codes[9];    //متغير 9 رشته ي،براي گرفتن شماره سريال ايسي
float Thermometer;    //متغير  اعشاري براي گرفتن دما

void main(void)
{
int i;
char  b=0,c=0,d=0,e=0;      

PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;

w1_init();       //!wire مقدار دهي اوليه
w1_search(0xf0,DS18B20_Rom_Codes);     //کد براي معرفي ايسي و ريختن شمار ايسي به درون متغير ذکر شده

while(1)
  {
   Thermometer = ds18b20_temperature(DS18B20_Rom_Codes);   
   for(i=0;i<1000;i++)
   {
    b=Thermometer;   
    c=b/100;
   d=(b-(c*100))/10;
   e=b-((c*100)+(d*10));            

    PORTB=1;
    if(b<=0) PORTD=~0x40; 
    else PORTD=0xff;
    delay_ms(1);
      
   PORTB=2;
    if(d==0)PORTD=0xff;
   else PORTD=~s[d];
   delay_ms(1);
               
   PORTB=4;
   PORTD=~s[e];
   delay_ms(1);
   
    PORTB=4;
   PORTD.7=0;
   delay_ms(1);

    PORTB=8;
   PORTD=~0x39;
   delay_ms(1);    
    };
      
   }



[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]برنامه.
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 1
تاریخ عضویت: شنبه 4 آذر 1396, 5:53 pm
سپاس‌های ارسالی: 3 بار

Re: آموزش راه اندازی سنسور دما دیجیتال DS18B20(دماسنج با 7سگ

پست توسط 2ehsan67 » چهار شنبه 15 آذر 1396, 9:29 pm

سلام مهندس جان. وقتتون بخیر
تشکر بابت مطالب مفیدی که داخل سایت گذاشتید.
ببخشید چندتا سوال داشتم . ممنون میشم اگه منو راهنمایی کنید.
در مورد ds18b20 بود که تو سایت 20 سنسور را به میکرو متصل کردین
اول اینکه این کدهای شناسایی ثابت و مختص هر آی سی هستن؟ یعنی میخام یک بار برای همیشه اینها را سرچ کنم و سپس داخل eeprom ذخیره کنم و دیگه سرچ نکنم و به همون ترتیب از eeprom فرا بخونم.
دوم اینکه unsigned char DS18B20_Rom_Codes[20][9]@0x200 در این عبارت چرا بعد از ماتریس دو بعدی عبارت @0x200 را نوشتید؟ علت خاصی داره؟
سوم اینکه چرا در نمایش کد CODE_IC1:%x%x%x که باید 3 عدد در مبنای 16 را نشون بده 6 عدد را برای ما بر میگردونه؟ مثل fdfc47

Colonel II
Colonel II
نمایه کاربر
پست: 7014
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9183 بار
سپاس‌های دریافتی: 21046 بار
تماس:

Re: آموزش راه اندازی سنسور دما دیجیتال DS18B20(دماسنج با 7سگ

پست توسط sinaset » پنج شنبه 16 آذر 1396, 10:30 am

سلام بر شما
خواهش میکنم . (البته مهندس نیستم..)
بله کدهای شناسایی در هر ایسی ذخیره شده است،می توانید بعد از ازمایشات و مشخص شدن هر ایسی براساس کدشناسایی دیگر کدشناسایی ارسال نکنید.(ضمن اینکه برای اطمینا بیشتر یکبار این ازمایش را با پرتئوس و همچنین سخت افزاری (بخصوص به صورت عملی! چون پرتئوس انچنان نمی شود به ان اطمینان کرد) ازمایش کنید .
در رابطه با سوال دومتان.چون خیلی وقته ان را ساخته ام،الان بخاطرم نیست علتش چیست! اما به کمک ان کد،ادرس ذخیره سازی متغییر در حافظه رم مشخص میشود(بصورت ثابت)! (اگر نوشته نشود،میکرو خودش براساس بایت های خالی ادرسی را پیدا و در ان اطلاعات را ذخیره سازی می کند) منتها در اینجا بنظرم نیازی برای مشخص کردن ادرس ثابت برای متغیر نیست! فکر میکنم زمانی که داشتم مدار را ازمایش میکردم،می خواستم بدانم،دقیقا چه مقدارهای در متغیر ریخته میشود (برای ازمایش و درک نحویه عملکرد).اگر ان را حذف کنید قاعدتا نباید مشکل باشد..
این سوالتان مثل سوال قبل جواب میدهم(چون درست بخاطرم نیست!) اما فکر میکنم،کدهایی یک ایسی زیاد بود! و با چند عدد از کدهایی ارسالی تفاوت احساس میشد! ضمن اینکه تاپیک جنبه اموزشی دارد،برای همین است،سعی شده بود،کدهایی ایسی به روی LCD نمایش داده شود،تا کاربران بتواند درک بهتره نسبت به ایسی و .. داشته باشند.
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 3
تاریخ عضویت: جمعه 10 فروردین 1397, 3:38 am
سپاس‌های ارسالی: 1 بار
سپاس‌های دریافتی: 1 بار

Re: آموزش راه اندازی سنسور دما دیجیتال DS18B20(دماسنج با 7سگ

پست توسط sadegh42 » جمعه 10 فروردین 1397, 4:22 am

سلام
ممنون از مطالبی که ارایه کردید
میتوانم خواهش کنم مدار را با دورقم(دو سون سگمنت) وعلامت منفی را با یک دیود نورانی هم ارایه کنید
با سپاس فراوان

Colonel II
Colonel II
نمایه کاربر
پست: 7014
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9183 بار
سپاس‌های دریافتی: 21046 بار
تماس:

Re: آموزش راه اندازی سنسور دما دیجیتال DS18B20(دماسنج با 7سگ

پست توسط sinaset » جمعه 10 فروردین 1397, 8:59 am

بنام خدا
باسلام

به درخواست کاربر محترم ..

ورژن 2 با 2 سون سگمنت و علامت منفی

 تصویر 
در ورژن جدید،کدنویسی بهتره شده،ریفرش سون سگمنت بهتر و دقیق و درست تر انجام می میشود
در ورژن جدید دمایی منفی نیز نمایش داده میشود (با روشن شدن یک LED)

کدها:


کد: انتخاب همه

/**************************************
name   : 'Temp 7seg 2 digit ds18b20-v2 '
date   : 1397/1/10
by Sinaset
Site:centralclubs.com
**************************************/
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <sleep.h>
#include <ds18b20.h>    //کتابخانه ايسي دماسنج در کدويژن
#include <1wire.h>   //فعال سازي واحد

flash unsigned char s[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char DS18B20_Rom_Codes[9];    //متغير 9 رشته ي،براي گرفتن شماره سريال ايسي
float Thermometer;    //متغير  اعشاري براي گرفتن دما
int  b=0,m;
bit Y=0;   


interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1H=0xD8F0 >> 8;
TCNT1L=0xD8F0 & 0xff;   
    if(Y==0)
    {
    PORTB=1;
    PORTD=~s[B]; [/B]
    Y=1;
    }
    else
    {

   PORTB=2;
    PORTD=~s[m];
    Y=0;
    }
}


void main(void)
{
PORTB=0x00;
DDRB=0xFF;
PORTD=0x00;
DDRD=0xFF;

DDRC.0=1;
PORTC.0=0;

// Timer/Counter 1 initialization
// Clock value: 125.000 kHz
// Timer Period: 10 ms
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
TCNT1H=0xD8;
TCNT1L=0xF0;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<TOIE0);

w1_init();       //!wire مقدار دهي اوليه
w1_search(0xf0,DS18B20_Rom_Codes);     //کد براي معرفي ايسي و ريختن شمار ايسي به درون متغير ذکر شده
#asm("sei")
while(1)
  { 
    Thermometer = ds18b20_temperature(DS18B20_Rom_Codes);   
    if(Thermometer>=0)
    {
    b=Thermometer / 10;
    m=Thermometer, 
    m=m % 10;
    if(PORTC.0==1)PORTC.0=0;
    }
    else
    {
    b=(Thermometer / 10) * -1;
    m=Thermometer * -1, 
    m=m % 10;
    PORTC.0=1;
    }    
   }

   

   



دانلود برنامه و شبیه ساز از [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 3
تاریخ عضویت: جمعه 10 فروردین 1397, 3:38 am
سپاس‌های ارسالی: 1 بار
سپاس‌های دریافتی: 1 بار

Re: آموزش راه اندازی سنسور دما دیجیتال DS18B20(دماسنج با 7سگ

پست توسط sadegh42 » جمعه 10 فروردین 1397, 12:26 pm

سلام
بزرگوار نمیدونم چطوری از شما تشکر کنم
فقط میتونم بگم :
خدا خیرت دهد :) :)

New Member
پست: 3
تاریخ عضویت: جمعه 10 فروردین 1397, 3:38 am
سپاس‌های ارسالی: 1 بار
سپاس‌های دریافتی: 1 بار

Re: آموزش راه اندازی سنسور دما دیجیتال DS18B20(دماسنج با 7سگ

پست توسط sadegh42 » جمعه 10 فروردین 1397, 11:13 pm

سلام بزرگوار
سوال داشتم ونیاز به کمک حضرت عالی
1-اگر بخواهم خروجی سون سگمنت رو در پورتc قرار بدم و پین 1و2 سون سگمنت رو بندازم روی پایه 2و3 از ای سی(PD3 & PD2)
ds18b20 رو در پایه 23(PC0مثلا)چه تغیراتی در فایل ایجاد میشه

2- در پورت B سه عدد دگمه بزارم برای ست دما -بالا وپایین کردن نقطه SET POINT
ودر پورت D یک رله تا دما به اون نقطه رسید رله فعال بشه

منتظر راهنمایی جناب عالی هستم
با تشکر واحترام

ارسال پست

بازگشت به “آموزش و مثال‌ها AVR”