Termometre devresi buyurun :) [Bitti]

Başlatan baran123, 27 Nisan 2014, 01:07:46

baran123

Merhaba önceden bayağı uğraşmıştım bu devreyle şimdide - değer ekledim arayan veya ihtiyacı olan arkadaşlar kullanıp geliştirebilirler şema ve kodlar aşşağıda, düzeltebileceğim veya daha iyi olur dediğiniz bir kısım var mı ?

Not isisde sıcaklık gösterme problemi,00,85 değerleri,hatası olan arkadaşlar işlemciye sağ tıklayıp "Edit Properties" kısmından "Processor Clock Frequency" 'i 4Mhz yapsınlar sorun düzelir.

Özellikleri :
1) (-10) - ( + 85)  arası ölçüm yapabiliyor.
2) Sıcaklık 09,05 gibi bir değer ise 1.displayı kapatıyor sadece 9,5 değeri gösteriyor
3) (-) değer gösteriyor
4) Sıcaklık (-10) - ( + 99) değerleri arasında değil ise 2 displayde de (-) işareti çıkıyor.

Tüm Dosyalar : http://www.dosya.tc/server29/wMWkLv/Termometre.rar.html

Şema


Kodlar

#include <16F84A.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT 
#use DELAY(CRYSTAL = 4MHz)            
                                      
#include "ds18b20.c"
           
#define DS     pin_A0                 
#define SH_CP  pin_A1                              
#define ST_CP  pin_A2

signed int temp;            
const int digit[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x6F};
                                 
void send(unsigned char data)
{                                  
   unsigned  char i;       
             
   for(i = 0x80; i > 0; i >>= 1)
   {                                
      if(i & data) output_high(DS);
      else output_low(DS);     
      output_high(SH_CP);           
      output_low(SH_CP);   
   }                                
}              

void main()
{
   setup_timer_0(RTCC_INTERNAL);     
   
   temp = ds1820_read(); 
   if(temp == 85) temp = 0;
          
   for(;;)             
   {  
      temp = ds1820_read();
      
      if((temp >= -9) && (temp <= 99))
      {              
         send(digit[temp % 10]);     
         send(digit[temp / 10]);    
         output_high(ST_CP);     
         output_low(ST_CP);
                          
         if((temp >= 0) && (temp < 10))
         {             
            send(digit[temp % 10]);
            send(0x00);               
            output_high(ST_CP);     
            output_low(ST_CP);  
         }
         
         if(temp < 0)   
         {                  
            send(digit[temp % 10]);     
            send(0x40);            
            output_high(ST_CP);     
            output_low(ST_CP); 
         }
      }
                         
      else                 
      {                        
         send(0x40);     
         send(0x40);            
         output_high(ST_CP);     
         output_low(ST_CP);
      }
   }
}                                                                                   


ds18b20 kütüphanem
#define ONE_WIRE_PIN PIN_A3

void onewire_reset() 
{
output_low(ONE_WIRE_PIN);
delay_us( 500 ); //1-wire resetleme için sıfıra çekilir
output_float(ONE_WIRE_PIN); //1-wire bir yapılır
delay_us( 500 ); // sensörün hazırlanması için beklenir.
output_float(ONE_WIRE_PIN);
} 
                      
void onewire_write(int data)
{
int count;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); // Sensöre yazma işlemine başlamak için  1-wire sıfıra çekilir.
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // yazılacak bilgi 1-wire'da
delay_us( 60 ); // Yazma işlemi zamanı doldurulur.
output_float(ONE_WIRE_PIN); // 1-wire bir yapılır,
delay_us( 2 ); // 1us'den fazla beklenir.
}
} 

int onewire_read()
{
int count, data;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir.
output_float(ONE_WIRE_PIN); //1-wire bir yapılır,
delay_us( 8 ); // Sensörün kendine gelmesi beklenir,
shift_right(&data,1,input(ONE_WIRE_PIN)); // sonuc bilgisi alınır.
delay_us( 120 ); //Okuma işlemi zamanı doldurulur.
}
return( data );
} 

float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);
while (busy == 0)
busy = onewire_read();
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 16.0;//18b20 icin
//result = (float) temp3 / 2.0;//18s20 icin
delay_ms(200);
return(result);
}

Recep METE

Arkadaşım çalışman için teşekkürler.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

aydınD


Recep METE

Arkadaşım, başlangıçta çıkan 85 sayısının çıkmaması için aşağıda program üzerinde gösterdiğim programcığı eklerseniz  sıfır derece ile başlarsınız 85 sayısı karşınıza çıkmaz.

#include <16F84A.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT 
#use delay(crystal=4MHz)            
                                      
#include "ds18b20.c"
           
#define DS     pin_A0                 
#define SH_CP  pin_A1                              
#define ST_CP  pin_A2

signed int temp;  
const int digit[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x6F};
                                 
void data(unsigned char veri)
{                                  
   unsigned  char i;       
     
   for(i = 0x80; i > 0; i >>= 1)
   {                       
      if(i&veri)output_high(DS);
      else output_low(DS);     
      output_high(SH_CP);           
      output_low(SH_CP);   
   }                                
}              

void main()
{     
   setup_timer_0(RTCC_INTERNAL);     
               
   while(TRUE)
   {   
      temp = ds1820_read();
      
      
      if(temp==85)
      temp=0;    // Arkadaşım böyle bir kod eklersen başlangıçta 85 gösterme sıkıntısından kurtulursun. 
      
           
      if((temp >= -9) && (temp <= 85))
      {            
         data(digit[temp % 10]);     
         data(digit[temp / 10]);    
         output_high(ST_CP);     
         output_low(ST_CP);
         
         if(temp < 0)
         {
            data(digit[temp % 10]);     
            data(0x40); //- değer göster    
            output_high(ST_CP);     
            output_low(ST_CP);
         }
      }             
   }                    
}                     

printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

mechanicalengine

Çalışmalarınız ve sonsuz desteğiniz için çok teşekkürler.

baran123

Ben teşekkür ederim arkadaşlar yardımlarınızla yaptım daha farklı versiyonlarda ekleyeceğim.

@aydınD aresden pek anlamadığım için çizmedim ama çizen bir arkadaş olursa burada paylaşalım herkes faydalansın

@semfero dediğini ekledim teşekkürler.

Kolay gelsin iyi çalışmalar.

aydınD


Recep METE

Alıntı yapılan: aydınD - 27 Nisan 2014, 13:50:21
bekliyor olacağım

Bende yeni versiyonunu (ver.2.0)'ını bekliyor olacağım.  :)
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

baran123

Yok mu ARES çizimi yapabilecek bir babayiğit bende v2.0 la uğraşayım :D

Recep METE

#9
Alıntı yapılan: baranekrem9 - 27 Nisan 2014, 14:31:43
Yok mu ARES çizimi yapabilecek bir babayiğit bende v2.0 la uğraşayım :D


@aydınD  rumuzlu arkadaş bu ares işinden iyi anlıyor zannedersem.Şifreli kapı+lcd'nin aresini hazırlamıştı.Göndermesini sabırla /sabırsızlıkla hala beklemekteyim.

http://postimg.cc/image/89wvixbft/
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

baran123

Alıntı yapılan: semfero - 27 Nisan 2014, 14:43:45

@aydınD  rumuzlu arkadaş bu ares işinden iyi anlıyor zannedersem.Şifreli kapı+lcd'nin aresini hazırlamıştı.Göndermesini sabırla /sabırsızlıkla hala beklemekteyim.

http://postimg.cc/image/89wvixbft/

valla @aydınD süper çizmiş aresi benim devrede ellerinden öpsün bence :D

Recep METE

Alıntı yapılan: baranekrem9 - 27 Nisan 2014, 14:49:28
valla @aydınD süper çizmiş aresi benim devrede ellerinden öpsün bence :D


bencede bencede  :D
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

baran123

#12
Yeni bir özellik ekledim sıcaklık 09,07 gibi ise 0 ı göstermiyor yani 10 dan küçük ise 0 yazan display kapanıyor kodu güncelledim.

Edit : Sıcaklık (-10) - ( + 85) aralığında değil ise 2 display de (-) değer çıkıyor

Recep METE

printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

baran123

öle yapmıyak yav millet dicek cücük kadar program ne versiyonu geliştirip geliştirip güncelliyim diyom burdan :D
ama sana özel bir versiyon çıkarıcam :D