دماسنج و کرنومتر کم مصرف،میکروکنترولرAtmega328 (برای دوچرخه)

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

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

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

دماسنج و کرنومتر کم مصرف،میکروکنترولرAtmega328 (برای دوچرخه)

پست توسط sinaset » دو شنبه 18 آبان 1394, 4:01 pm

بنام خداوند بخشنده و مهربان
با سلام

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

این مدار رو برای یکی از دوستان خوب گذشته ام طراحی کردم .. به کمک این مدار،می توانید دما را به کمک دماسنج داخلی میکروکنترولر atmega328 اندازه بگیرید و با قسمت کرنومتر هم 4 رکورد مختلف بزنید و ان را ذخیر کنید ..

از ویژگی های جالب این دماسنج، کار کردن با باتری سکه می باشد، این دماسنج نیازی به خاموش شدن ندارد! و هر 30 دقیقه یک بار دما را به مدت 5 ثانیه نمایش میدهد و سپس به مد power save می رود ..

*این مدار در حالت بی کاری حدود 1 میکرو آمپر مصرف می کند ( تقریبا با یک باتری سکه می تواند نزدیک به 1 سال کار کند..)

*به کمک دماسنج می توانید دمایی -40 تا +90 (حدود) را اندازه بگیرید ...

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

Novice Poster
Novice Poster
پست: 60
تاریخ عضویت: پنج شنبه 22 بهمن 1394, 9:03 pm
سپاس‌های ارسالی: 158 بار
سپاس‌های دریافتی: 24 بار

Re: دماسنج و کرنومتر کم مصرف،میکروکنترولرAtmega328 (برای دوچ

پست توسط javad_2010 » دو شنبه 9 فروردین 1395, 12:18 am

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

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

Re: دماسنج و کرنومتر کم مصرف،میکروکنترولرAtmega328 (برای دوچ

پست توسط sinaset » دو شنبه 9 فروردین 1395, 10:21 am

سلام بر شما

چندی پیش،به یاری خدا توانستم،کدها رو اصلاح کنم،اما چون میکروکنترولر این جانب مشکل داشت،نتونستم به مد پاور دان برم.
میکروکنترولر جدید خریداری شده ، انشالله اگر همه ازمایشات به پایان برسه و مشکلی در مود Power Down نباشد، کدها رو قرار میدهم .
---
در مدار ساخته شده این جانب از هیچ رگولاتور استفاده نکردم! چون رگولاتور مصرفی را به خودش اختصاص میدهد(حتا در حالتی که میکرو در حالت Power Down باشد) . و از یک باتری معمولی 3 ولتی (سکه ی ) استفاده کردم. و در ازمایشات که ان موقعه انجام دادم،کل مدار،در حالت power down حدود 1 میکرو امپر و کمتر استفاده میکرد.

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

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

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

Re: دماسنج و کرنومتر کم مصرف،میکروکنترولرAtmega328 (برای دوچ

پست توسط sinaset » پنج شنبه 19 فروردین 1395, 11:48 am

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


کدها و شماتیک مدار اماده شد.

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


ابتدا معرفی فایل پرتئوس

در پرتئوس میکروکنترولر Atmega328 دماسنج داخلی ندارد! (متاسفانه) و ما مجبور شدیم چیزی شبیه دما سنج داخلی میکرو را به کمک پتانسیو و .. بسازیم و ان را به ADC0 بدهیم . پس ADC0 فقط برای پرتئوس شبیه سازی شده و شما نباید در برنامه اصلی از ان استفاده کنید
ADC8 دماسنج میکروکنترولر atmega328 می باشد و ما باید در برنامه adc8 را صدا بزنیم تا بتوانیم مقدار دماسنج داخلی میکروکنترولر را بخوانیم
*در خط برنامه نویسی،کدویژن خط های که برای پرتئوس تغییر بدهید معرفی شده است،پس زیاد نگران این مسئله نباشید
 تصویر   که می ببینید مدار از سه کلید و کریستال 32.768 مگاهرتز و قسمتی شبیه سازی شده دماسنج داخلی میکروکنترولر ساخته شده است(که شامل یک ولتی متر،پتانسیو 10 کیلواهم و.. تشکیل شده ،که اصلا نیازی نیست شما انها در بسازید،چون فقط برای پرتئوس کاربرد دارد)  تصویر  وقتی مدار روشن میشود، ابتدا یک لودینگ می اید سپس یک متن نمایش داده میشود (شایان ) سپس میکروکنترولر به مد کم مصرف می رود.  سه کلید اصلی مدار :  کلید Stop,INFO Temp,Rec   کمک این کلید،می توانید میکروکنترولر را از حالت مدل کم مصرف بیدار کنید و مقدار دماسنج داخلی میکروکنترولر را نمایش دهید .*چون میکروکنترولر هر 1 ثانیه یک بار کدها را برسی می کند،لازم است نزدیک 1 ثانیه کلید را نکه دارید تا میکروکنترولر متوجه بشود   کمک این کلید در وضعیت کرنومتر،می توانید 6 رکوردها زده شده را ببینید،(*قبل از اینکه کرنومتر شروع به فعالیت بکند)، همچنین زمانی که کرنومتر شروع به فعالیت کرد می توانید به کمک این کلید ان را نگه دارید.  تصویر  کلید CHRONOMETER   کمک این کلید وقتی میکروکنترولر در حالت مدل کم مصرف می باشد،می توانیم ان را به وضعیت کرنومتر ببرید (* به مانند کلید قبلی باید حدود 1 ثانیه این کلید را نگه دارید)   یک بار کلیک کردن بر روی این کلید،میکروکنترولر به وضعیت کرنومتر می رود، سپس با زدن یک بار دیگر این کلید،میکروکنترولر شروع به شمارش کرنومتر خود می کند ، سپس می توانید به کلید قبلی (که ذکر کردیم) مقدار شمارش را نگه دارید .   می توانید با زدن دوباره کلید ( CHRONOMETER) شش رکورد اخر زده شده را ببینید و سپس میکروکنترولر به وضعیت powerdown یا همان مد کم مصرف می   تصویر  کلید TIME   کلید هم به مانند کلید های قبلی باید حدود 1 ثانیه نگه داشته شود، تا زمان به ما نمایش داده شود ساعت مدار به کمک کریستال 32.768 و تایمر 2 ساخته شده و از این نظر دقیق می باشد .   از اینکه ساعت نمایش داده داده شد، ابتدا ثانیه و دقیقه نمایش داده میشود . در همان زمان با زدن کلید Stop,INFO Temp,Rec می توانید ثانیه را افزایش بدهید و همچنین می توانید با زدن کلید CHRONOMETER می توانید دقیقه مدار را افزایش بدهید و ان را به میزان دلخواه خود تغییر بدهید .   از حدود چند ثانیه ثانیه و دقیقه از نمایشگر حذف میشوند و بعد ساعت نمایش داده میشود،در همان زمان می توانید با زدن کلید CHRONOMETER می توانید ساعت را به میزان دلخواه خودتان تغییر بدهید .  تصویر  کدها و ویژگی مدار:  *مصرف کمتر از 1 میکروآمپر در ساعت و استفاده از باتری 3 ولتی سکه ی برای   *ساعت خوب و دقیق برای   *دماسنج نسبتا خوب برای مدار(با قابلیت اندازه گیری دما منفی )  *کرنومتر مدار با قابلیت ذخیره 6 رکورد اخر زده شده.  *سایز کوچک و استفاده از المان های کم در مدار( یک نمایشگر، 3کلید و 3 مقاومت پول اپ،میکروکنترولر atmega328،باتری سکه ی،کریستال 32.768 کیلوهرتزی )  *نمایش هر 1 ساعتی یک بار دما بر روی صفحه   ....  کدها: 

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

/**************************************
name   : 'Temp mega328p'
date   : 1395/1/19
project: sinaset
V:v2
**************************************/
#include <mega328p.h>
#include <delay.h>               
#include <stdio.h>
#include <sleep.h>      //مد کم مصرف کردن               
#define ADC_VREF_TYPE ((1<<REFS1) | (1<<REFS0) | (1<<MUX3))  // (0<<MUX3)در پرتئوس وضعيت را بدين شکل کنيد
flash unsigned char s[11]=       //معرفي 0 تا 9
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
flash unsigned char helloshayan[21]=   //معرفي سلام در ابتدا برنامه
{0x0,0x76,0x79,0x38,0x38,0x3F,0x0,0x0,0x6D,0x76,0x77,0x6E,0x77,0x31,0x40,0x8,0xE,0x0,0x0,0x0,0x0};
flash unsigned char load[6]=     //معرفي لود در ابتدا برنامه
{0x1,0x8,0x20,0x10,0x4,0x2};

eeprom char save[24];   //ارايه ذخير سازي اطلاعات رکوردها
eeprom char up;

char sane=0,dag=25,sat=18,roz,mah,sal;     //متغيرهاي ساعت ،در تايمر 2
char ll=0,ii=0,xx=0,mm=0,x=0;  //معرفي متغير هاي کرنومتر در تايمر 0
bit show=0;   //گذشته نشود تابع روشن ميشودendدرصورت که عدد جلوي 
interrupt [TIM0_OVF] void timer0_ovf_isr(void)  //استفاده از تايمر 0 براي کرنومتر
{
    TCNT0=0x83;
    x++; 
   if (x>99)//هر 100 ميلي ثانيه
   {
   x=0,ii++;
      if(ii>9) //هر 1 ثاينه
      {
      ii=0,ll++;
          if (ll>9) //هر 10 ثانيه
           {
           ll=0,xx++;
            if(xx>5)  // هر 60 ثانيه
            {xx=0,mm++;
            if(mm>9)    //هر 10 دقيقه
            mm=0;
            }
           }
      }
   }      
}   
void loading (void)  //رقص نور يا لودينگي در ابتدا برنامه
{
    PORTB=0b1110;PORTD=load[1];delay_ms(50);
    PORTB=0b1101;PORTD=load[1];delay_ms(50);
    PORTB=0b1011;PORTD=load[1];delay_ms(50);    
    PORTB=0b0111;PORTD=load[1];delay_ms(50);
    PORTB=0b0111;PORTD=load[4];delay_ms(50);
    PORTB=0b0111;PORTD=load[5];delay_ms(50);
    PORTB=0b0111;PORTD=load[0];delay_ms(50);
    PORTB=0b1011;PORTD=load[0];delay_ms(50);
    PORTB=0b1101;PORTD=load[0];delay_ms(50);      
    PORTB=0b1110;PORTD=load[0];delay_ms(50); 
    PORTB=0b1110;PORTD=load[2];delay_ms(50);
    PORTB=0b1110;PORTD=load[3];delay_ms(50);
    PORTD=0x00;PORTB=0x00; delay_ms(50);   
}

void start(void)       //تابع شروع
{
  unsigned char p0=0,p1=0,p2=0,p3=0,p4=0,r;
  while(1)
  { 
   for(r=0;r<35;r++){
   PORTB=0b1110,PORTD=helloshayan[p4],delay_ms(1),
   PORTB=0b1101,PORTD=helloshayan[p3],delay_ms(1),
   PORTB=0b1011,PORTD=helloshayan[p2],delay_ms(1),
   PORTB=0b0111,PORTD=helloshayan[p1],delay_ms(1);
   }
   p0++;
   p4=p3;
   p3=p2;
   p2=p1;
   p1=p0;
   if(p0>20)p0=0;  //به کمک اين تکنيک سلام را در ابتدا برنامه حرکت ميدهيم   
   if(p0==20)break; //غيرفعال کردن تابع سلام تا خاموش شدن ميکرو
  } 
}

char sc1=0,sc2=0,sc3=0,sc4=0;
void segment(void) //معرفي يک تابع ،براي اسان تر و کم حجم شدن کدها
{   
    PORTB=0b1110,PORTD=s[sc4],delay_ms(1);   
    PORTB=0b1110,PORTD.7=0,delay_ms(1);       //نقطه
    PORTB=0b1101,PORTD=s[sc3],delay_ms(1);
    PORTB=0b1011,PORTD=s[sc2],delay_ms(1);   
    PORTB=0b1011,PORTD.7=0,delay_ms(1);       //نقطه
    PORTB=0b0111,PORTD=s[sc1],delay_ms(1);   
}   

void chronometer(void)    //کرنومتر
{
char rx,rxz;
char UPx_0,UPx_1,UPx_2,UPx_3;
   ii=0;ll=0;xx=0;mm=0;      
   sc1=ii;sc2=ll;sc3=xx;sc4=mm;   //مقدار دهي اوليه کرنومتر
   delay_ms(300);
    while(1)  //چرخه اولي قبل از شروع کرونومتر
    {
    segment();
    if(PINC.2==0){while(PINC.2==0);delay_ms(100);break;}; //در صورتي که اين کليد فشار داده شود،کرونومتر شروع ميشود
    if(PINC.1==0){while(PINC.1==0);delay_ms(200);goto Rec_info;}// در صورت کليک،نمايش رکوردها   
    } 

    TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);  //فعال سازي تايمر 0
    x=0,ii=0,ll=0,xx=0,mm=0;  //صفر کردن  شمارش
    while(1)   //چرخه براي  شروع شمارش و رکورد
   {    
    sc1=ii;   //ميلي ثانيه
    sc2=ll;   //ثانيه
    sc3=xx;   // هر 60 ثانيه
    sc4=mm;   // دقيقه
    segment();      
    delay_us(300);
     if(PINC.1==0 ){   //دکمه نگه داشتن رکورد
      while(PINC.1==0);
      TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); //خاموش کردن تايمر صفر
      if(up==0)save[0]=ii,delay_ms(7),save[1]=ll,delay_ms(7),save[2]=xx,delay_ms(7),save[3]=mm,delay_ms(7);//ذخير رکورد اول
      if(up==1)save[4]=ii,delay_ms(7),save[5]=ll,delay_ms(7),save[6]=xx,delay_ms(7),save[7]=mm,delay_ms(7);//دوم
      if(up==2)save[8]=ii,delay_ms(7),save[9]=ll,delay_ms(7),save[10]=xx,delay_ms(7),save[11]=mm,delay_ms(7);//سوم
      if(up==3)save[12]=ii,delay_ms(7),save[13]=ll,delay_ms(7),save[14]=xx,delay_ms(7),save[15]=mm,delay_ms(7);//چهارم
      if(up==4)save[16]=ii,delay_ms(7),save[17]=ll,delay_ms(7),save[18]=xx,delay_ms(7),save[19]=mm,delay_ms(7);//پنجم
      if(up==5)save[20]=ii,delay_ms(7),save[21]=ll,delay_ms(7),save[22]=xx,delay_ms(7),save[23]=mm,delay_ms(7);//ششم
      up++;delay_ms(6);if(up>5)up=0; //چرخي براي ذخير  رکوردها
      while(1){segment();if(PINC.2==0)goto Rec_info;}  //در پايان نمايش رکوردها
     }
   }
   Rec_info:
   UPx_0=0,UPx_1=1,UPx_2=2,UPx_3=3;
   for(rxz=0;rxz<6;rxz++){
   sc1=0;
   sc2=rxz; //نمايش شماره ذخير سازي
   sc3=10;//A نمايش حروف 
   sc4=0;
     for(rx=0;rx<255;rx++)segment();
     sc1=save[UPx_0];
     sc2=save[UPx_1];
     sc3=save[UPx_2];
     sc4=save[UPx_3]; 
      
     for(rx=0;rx<255;rx++)segment();
     UPx_0=UPx_0+4;
     UPx_1=UPx_1+4;
     UPx_2=UPx_2+4;
     UPx_3=UPx_3+4;   
   }          
}   
unsigned int read_adc(unsigned char adc_input)    //تابع نمونه گيري واحد اي دي سي
{
ADCSRA=(1<<ADEN);
ADMUX=adc_input | ADC_VREF_TYPE;
delay_us(10);
ADCSRA|=(1<<ADSC);
while (ADCSRA & (1<<ADSC));
return ADCW;
}
void sleep_mod(void)    //تابع رفتن به مود پاور دان
{
show=0;
PORTB=0b001111;
PORTD=0;
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
sleep_enable();   //فعال کردن مد اسليپ بعد از نمايش دما
}
void startup(void)   //تابعي براي غير فعال سازي مودپاور دان
{
sleep_disable(); 
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
}
interrupt [TIM2_OVF] void timer2_ovf_isr(void)    // تايمر 2 و استفاده از نوسان سازه 32768 تقسيم بر 128
{
   sane++;      //ساعت تايمر 2
   if(sane>59){
   sane=0,dag++;
      if(dag>59){
      dag=0,sat++;
      if(sat>23)sat=0;
      }
   }
  //   if(roz>30)roz=0,mah++;
  //   if(mah>11)mah=0,sal++;   
    if(dag==30 && sane==00)show=1,startup();   //هر 1 ساعتي يک بار دما را نمايش بده
    if(PINC.3==0)startup();            //کليد مد نظر را چک کن
    if(PINC.2==0)startup();            //کليد مد نظر را چک کن
    if(PINC.1==0)startup();            //کليد مد نظر را چک کن
}
void clock(void)      //تابع خواندن ساعت
{
char s1,s2,m1,m2,h1,h2;
unsigned char i,i2;

       for (i=0 ; i<100 ; i++) //حلقه براي نمايش حدود 5 ثانيه ي
      { 
       if(PINC.1==0)delay_ms(10),sane++;
       if(PINC.2==0)delay_ms(10),dag++;
       if(sane>59)sane=0,dag++;
       if(dag>59)dag=0;
       s1=sane/10;
       s2=sane%10;   
       m1=dag/10;
       m2=dag%10;
      
       for (i2=0 ; i2<20 ; i2++) //حلقه براي نمايش حدود 5 ثانيه ي
      {   
         PORTB=0b1110;PORTD=s[m1];delay_ms(1); 
         PORTB=0b1101;PORTD=s[m2];delay_ms(1);
         PORTB=0b1101,PORTD.7=1,delay_ms(1);   
         PORTB=0b1011,PORTD=s[s1],delay_ms(1);      
         PORTB=0b0111,PORTD=s[s2],delay_ms(1);      
      }
      }
      for (i=0 ; i<100 ; i++) //حلقه براي نمايش حدود 5 ثانيه ي
      {
       if(PINC.2==0)delay_ms(30),sat++;   
       if(sane>59)sane=0,dag++;
       if(dag>59)dag=0,sat++;
       if(sat>23)sat=0;

      h1=sat/10;
      h2=sat%10;
      for (i2=0 ; i2<25 ; i2++) //حلقه براي نمايش حدود 5 ثانيه ي
      {   
         PORTB=0b1110;PORTD=0b1110110;delay_ms(1); 
         PORTB=0b1101;PORTD=s[h1];delay_ms(1);
         PORTB=0b1011,PORTD=s[h2],delay_ms(1);            
      }
      }
      sleep_mod();    //رفتن به حالت اسليپ
}

void main(void)
{
int a=0;
char b=0,c=0,d=0,e=0;
unsigned char i,ix,i2;
char sleepMain=0;  //متغيري براي به خواب بردن برنامه،در بار اول
// ADC initialization
DIDR0=(1<<ADC5D) | (1<<ADC4D) | (0<<ADC3D) | (0<<ADC2D) | (0<<ADC1D) | (0<<ADC0D);
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
// timer 0
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (0<<CS00);
TCNT0=0x83;
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);
// Timer/Counter 2 initialization
ASSR=(0<<EXCLK) | (1<<AS2);
TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20);
TCCR2B=(0<<WGM22) | (1<<CS22) | (0<<CS21) | (1<<CS20);
TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (1<<TOIE2);

PORTB=0x00;
DDRB=0xFF;

PORTC=0xFF;
DDRC=0x00;

PORTD=0x00;
DDRD=0xFF;
loading();       //فراخوني تابع لودينگ
start();       //فراخواني تابع استارت
#asm("sei")
while(1)
  {
    if(PINC.2==0)while(PINC.2==0)delay_ms(200),chronometer();   //پرش به کرنومتر
    if(PINC.1==0)while(PINC.1==0)delay_ms(200),show=1;    //براي خواندن دماسنج      
    if(PINC.3==0)while(PINC.3==0)delay_ms(200),clock();   //ساعت
    
     if(show==1)  //
    { 
       for (i=0 ; i<20 ; i++) //حلقه براي نمايش حدود 5 ثانيه ي
       { 
       a=read_adc(8);   //در پرتوس عدد مقابل رد اي دي سي بايد 0 باشد   
               
       if(a>314)b=a-314,b=b/1.22; //فرمول محاسبه مثبت بودن دما
       else b=314-a,b=b/1.22; //فرمول محاسبه منفي بودن دما
       c=b/100;
       d=(b-(c*100))/10;
       e=b-((c*100)+(d*10));                  

      for (ix=0;ix<150;ix++) //حلقه براي نمايش حدود 5 ثانيه ي
       { 
      if(a<=314) PORTB=0b1110,PORTD=0x40;else PORTD=0x00;delay_ms(1); 
      if(d>=1)PORTB=0b1101,PORTD=s[d];else PORTD=0x00;delay_ms(1);    
      PORTB=0b1011,PORTD=s[e],delay_ms(1);      
      PORTB=0b1011,PORTD.7=0,delay_ms(1);
      PORTB=0b0111,PORTD=0x39,delay_ms(1);
      }      
      }
      sleep_mod();         
    }
   sleepMain++;
   if(sleepMain==255)sleep_mod();  //به خواب رفتن ،در راه اندازي اوليه
   powersave();    //مد خواب ميکرو
  } 
}    


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

New Member
پست: 1
تاریخ عضویت: جمعه 10 دی 1395, 8:13 pm
سپاس‌های ارسالی: 3 بار

Re: دماسنج و کرنومتر کم مصرف،میکروکنترولرAtmega328 (برای دوچ

پست توسط yavar2xi » جمعه 10 دی 1395, 8:54 pm

سلام و خسته نباشید
امکان داره دماسنج با سنسور ds18b20 با 7 سگمنت قرار بدید

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

Re: دماسنج و کرنومتر کم مصرف،میکروکنترولرAtmega328 (برای دوچ

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

سلام و تشکر از نظر شما.
--
منظور شما ds18b20 با همین طرح می باشد؟!

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

ارسال پست

بازگشت به “طرح آماده و کامل شده AVR”