ds18b20 den sıcaklık okuyup RF ile aktarma (!!! ÇOZULDU !

Başlatan futureng, 31 Aralık 2007, 10:21:34

futureng

Arkadaşlar ben bir proje yaptım. rf kullanarak sıcaklık verisini kablosuz lcd ekrana yazdırıyorum. Yaptığım proje 3 adet devreden oluşuyor: 1: 16f628 li RF verici devresi 2: 16f628 li RF alıcı devresi 3: 16f877 li LCD ekranlı devre.  Sıcaklık bilgisini 1-wire olarak okuyorum rf' e çevirip gönderiyorum. 2. devre ile datayı alıp  RS232 vasıtası ile 3. devreye aktarıyorum. 3.devre ise rs232 portundan aldığı bilgiyi LCD ekrana yazıyor. Sorunum şu = ds18b20 den sıcaklık datası okunduğunda bana 3 adet bilgi veriyor. 1-işaret, 2-Isı değeri, 3- Ondalık değeri bu 3 bilgiyi seri olarak gönderiyorum. Fakat dataları alırken LCD ekrana yorumlamak için nasıl bu bilgiyi çözdüreceğim. Sistem çalışıyor fakat sadece "sıcaklık"  bilgisini gönderip yorumlatabiliyorum. Çünkü diğer bilgiler LCD ekrana yazıalacak ham lıkta değil. Sıcaklık bilgisini direk Decimal e çevir diyorum o da basit olarak ekrana yazıyor. Fakat (-) dereceleri ve ondalığı nasıl ayırıp LCD ye gönderecem çözemedim. (JAL kullanıyorum.)
GimpTR.COM: Hayal Gücünüzün Gerçek Dünyadaki Görünüşü  http://www.gimptr.com

ete

Farz et ki yalnızca bir 628 kartı ile sıcaklığı okuyup LCD ekrana yazdırıyorsun. Nasıl yapardın.?. Aynı sistemi 877 li karta uygulaman gerekiyor.
Ancak işi kolaylaştırmak açısından ben olsam,
- sıcaklık bilgisini ondalıklı hale getirilmemiş halini yollardım. Böylece yalnız işaret ve sıcaklık bilgisini yollayıp 877 li kartta bu bilgiyi değerlendirirdim. Örnek vermek gerekir ise;
Sensörden okunan bilgiden ;
Isaret="+"
ISI= 328  bilgisini aldık. Bu aslında 32,8 demek olacak işlendikten sonra.
Kısaca sıcaklık bilgisinin 10 ile çarpılmış halini RF den yollaman işini kolaylaştıracak.
877 li devrede ise;
Ondalık=ISI/ Mod 10  (yada ISI//10)
ISI=ISI/10
şeklinde bilgiyi işledikten sonra LCD de göstermen işini halledecektir.
Basit bir soru ve bu kadar işi başarmış bir kişi olarak bu konuyu neden halledemediğini anlamadım yada bu soruyu sorma amacını anlayamadım sanırım.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

arslan74

Alıntı yapılan: "futureng"Arkadaşlar ben bir proje yaptım. rf kullanarak sıcaklık verisini kablosuz lcd ekrana yazdırıyorum. Yaptığım proje 3 adet devreden oluşuyor: 1: 16f628 li RF verici devresi 2: 16f628 li RF alıcı devresi 3: 16f877 li LCD ekranlı devre.  Sıcaklık bilgisini 1-wire olarak okuyorum rf' e çevirip gönderiyorum. 2. devre ile datayı alıp  RS232 vasıtası ile 3. devreye aktarıyorum. 3.devre ise rs232 portundan aldığı bilgiyi LCD ekrana yazıyor. Sorunum şu = ds18b20 den sıcaklık datası okunduğunda bana 3 adet bilgi veriyor. 1-işaret, 2-Isı değeri, 3- Ondalık değeri bu 3 bilgiyi seri olarak gönderiyorum. Fakat dataları alırken LCD ekrana yorumlamak için nasıl bu bilgiyi çözdüreceğim. Sistem çalışıyor fakat sadece "sıcaklık"  bilgisini gönderip yorumlatabiliyorum. Çünkü diğer bilgiler LCD ekrana yazıalacak ham lıkta değil. Sıcaklık bilgisini direk Decimal e çevir diyorum o da basit olarak ekrana yazıyor. Fakat (-) dereceleri ve ondalığı nasıl ayırıp LCD ye gönderecem çözemedim. (JAL kullanıyorum.)


Merhaba,

Eğer sen sıcaklığı düzgün oktub sonra düzgün bir şekilde RF ile karşı tarafa aktarabiliyorsan, zaten işin en önemli kısmını yapmışsın demektir. Gelen datayi LCD aktarmak bundan daha basit bir işlem.

Önelikle ( - ) eksi değerini okuyabiliyorsan onu ekrana cok basit bir şekilde karabilirsin. Yapman gereken ' if ' ile sorgulamak. Eğer eksi değer ise ekrana karakter olarak "-" işaretini gönderebilirsin. Virgülden sonraki yazıyı yazmak için ise sıcaklığı yazdıktan sonra "," karakterini ekrana yazarsın, sonrada virgülden sonraki değeri yazarsın.

Selamlar

futureng

sıcaklık okuma ve rf göndermek için JAL dilinde hazır libraryler var. onları ekleyip işiniz görüyorsunuz. Fakat o liblerin içinde assemble komutları var onları iyi irdelemek lazım. benim eksiğimde sanırım bu.

VERICI PROGRAMI
include 16f628_4i
include jlib
include rf  
include ds18b20
-- Bu program pina2 protundan RF vericiyLe bilgiyi gönderiyor

disable_a_d_functions
var byte sign, temp, float
forever loop
         read_temperature(sign, temp, float) delay_50ms
         rf_trans = temp delay_50ms
         delay_500ms

end loop  


ALICI-1- PROGRAMI

include 16f628_4i
include jlib
include rf
include H_RS232

disable_a_d_functions

pin_b2_direction = output
pin_b2 = low
var byte d

serial_setup ( 96 )
rf_rcv_led = high delay_2s rf_rcv_led = low
forever loop
 if  rf_recv (d) then
   h_asynch = d
end if
end loop  



ALICI-2- LCD YE YAZAN PROGRAM

include 16f877_4
include jlib
include H_rs232
include hd447804

disable_a_d_functions

var byte gelen
serial_setup ( 96 )
forever loop
hd44780_clear
  if H_asynch_poll ( gelen ) then print_decimal_2( hd44780, gelen, " " )
   else
   hd44780 ="V" hd44780 ="Y" hd44780 ="O" hd44780 ="K"
   end if
    delay_1s
end loop


Alıcı 2 deki programda rf ile gelen bilgi "gelen" değişkenine aktarılıyor. işte bu değişken içinde verici deki "read_temperature(sign, temp, float)" bu 3 sıcaklık bilgisi bir arada oluyor bunu ayıklamam gerekiyor.

rf_trans = sign delay_50ms
rf_trans = temp delay_50ms
rf_trans = float delay_50ms işte iş bu 3 komutta bitiyor bu komutu verince bu 3 adet bilgi ard arda rf ile gönderiliyor. Mesele bunu çözümlemede.
GimpTR.COM: Hayal Gücünüzün Gerçek Dünyadaki Görünüşü  http://www.gimptr.com

M_B

merhaba arkadas

soyle bır yontem dene.  

VERICI KISIM DA
include 16f628_4i
include jlib
include rf
include ds18b20
-- Bu program pina2 protundan RF vericiyLe bilgiyi gönderiyor

disable_a_d_functions
var byte sign, temp, float
forever loop
read_temperature(sign, temp, float) delay_50ms
rf_trans = sign delay_50ms
rf_trans = temp delay_50ms
rf_trans = float delay_50ms
delay_500ms
end loop

ALICI-1- PROGRAMI

include 16f628_4i
include jlib
include rf
include H_RS232

disable_a_d_functions

pin_b2_direction = output
pin_b2 = low
var byte d
var byte d1
var byte d2
serial_setup ( 96 )
rf_rcv_led = high delay_2s rf_rcv_led = low
forever loop
if rf_recv (d) then
delay_2s
rf_recv(d1)
delay_2s
rf_recv(d2)
h_asynch = d
delay_2s
h_asynch = d1
delay_2s
h_asynch = d2
end if
end loop


ALICI-2- LCD YE YAZAN PROGRAM

include 16f877_4
include jlib
include H_rs232
include hd447804

disable_a_d_functions

var byte gelen
var byte gelen1
var byte gelen2

serial_setup ( 96 )
forever loop
hd44780_clear
if H_asynch_poll ( gelen ) then print_decimal_2( hd44780, gelen, " " )
H_asynch_poll ( gelen1 )  hd44780 = gelen1
H_asynch_poll ( gelen2 )  hd44780 = gelen2

else
hd44780 ="V" hd44780 ="Y" hd44780 ="O" hd44780 ="K"
end if
delay_1s
end loop

----------------------------------------------
Verici kısımda :
rf_trans = temp delay_50ms
rf_trans = float delay_50ms  
eklemesı yapıldı
------------------------------------------------
ALICI-1- PROGRAMI :
rf_recv(d1)
delay_2s
rf_recv(d2)
h_asynch = d
delay_2s
h_asynch = d1
delay_2s
h_asynch = d2
eklemelerı yapıldı
------------------------------------------------
ALICI-2- LCD YE YAZAN PROGRAM
H_asynch_poll ( gelen1 ) hd44780 = gelen1
H_asynch_poll ( gelen2 ) hd44780 = gelen2
Eklemeleri yapıldı
-----------------------------------------------


Kolay gelsın
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

futureng

MÜJDE.. Problemi büyük oranda çözdüm. cevap şu:



1- Verici kısmında ds18b20 den 3 adet bilgi (işaret, sıcaklık, ondalık) alınıp sırayla gönderilir ve aralarına 50ms duraklama verilir.

2- Alıcı1 deki devre bu rf bilgisini aynen alır RS232 TX portu ile diğer alıcı LCD li Pic e gönderir.

3-Son alıcımız olan  devre ise RS232 nin RX portundan sıcaklık bilgilerini almaya başlar ve şöyle yorumlar.

  - Gelen bilgi - veya + işaretini içeriyorsa al ve ekrana yaz ve 50ms + 100us bekle( 100us beklemenin nedeni vericiden gelen bilgi son devreye ulaşana kadar geçen zaman kaybını minimize edip senkronlamak)        

  - Gelen ikinci bilgi varsa onuda al (bu bilgi sıcaklık bilgisi olacaktır) decimale çecir ekrana yaz ve 50ms + 100us

 - Gelen üçüncü bilgi varsa (buda ondalık değeri olacaktır.) onu da al decimale çevir önüne "." işareti koyup ekrana yaz.


değilse ekrana "veri yok" yaz.



Eveet işte mantık bu. Bazı sorunlar var elbet mesela 7-8 gösterimde bir bazen bir haneyi göstermiyor bu da sanırım bilgi senkronizasyonundaki aksaklıktan kaynaklanıyor.  kodlarını da yayınlayacağım yalnız yanıma almamışım. İnşallah birileri için yol gösterici olur.
GimpTR.COM: Hayal Gücünüzün Gerçek Dünyadaki Görünüşü  http://www.gimptr.com