Lcd Termometre

Başlatan efsanepoldem, 04 Aralık 2013, 10:39:20

efsanepoldem

  Arkadaşlar gönderdiğim devre görüleceği üzere sıcaklık, ayarlanan set değerine geldiğinde çıkış vermektedir. Yalnız bu devre şu an ds1621
sıcaklık sensörü ile çalışmakta, ben ise bunu ds18b20 sensörü ile çalıştırmak istiyorum. Devrede ne gibi değişiklikler yapmam lazım programa neler eklemem lazım yardımcı olursanız sevinirim.

ete

Yalnızca programı değiştirmek yetmez. DS1621 I2C sistemi ile çalışıyor. Bir DTA ve birde CLK hattı vardır. Her bir hattın birer de pullup direnci vardır.

DS18B20 sensörü ise Onewire (tekhat) haberleşme sistemini kullanır ve yalnızca bir hattı vardır.

Bu iki sensörü yer değiştirmek istiyor isen şunları yapacaksın;

DS1621 in CLK  hattını ve pullup direncini iptal et.
DS1621 in DTA hattını DS18B20 sensörünün Data hattı olarak kullan.

Bu donanım değişikliğidir.
Gelelim Yazılım değişikliğine,
Programda aşağıdaki bölümü bulacaksın,
Read_Temp:
   i2cwrite i2c_sda,i2c_scl,$90,$ac,[0]   'Access Config [ACh]
   Pause 1
   I2CWrite i2c_sda, i2c_scl,$90,[$ee]    'Start Convert T [EEh]
   Pause 1
   I2CRead i2c_sda, i2c_scl, $90,$aa,[Temp],Error  'Read Temperature [AAh]
   TempNeg = " "
   TempX = Temp.HighByte
   if TempX >= 128 then
      TempNeg = "-"
      TempX = 256 - (TempX + Temp.7)
   endif
return
Bunların yerine aşağıdakileri yaz;
Read_Temp:
           OWOUT   i2c_sda, 1, [$CC, $44]
Bekle:
           OWIN    i2c_sda, 4, [Error]   
           IF Error = 0 THEN Bekle 
           OWOUT   i2c_sda, 1, [$CC, $BE]
           OWIN    i2c_sda, 2, [Temp.Lowbyte, Temp.Highbyte]
           TempNeg = " "
           IF TEMP.11 = 1 THEN
               TempNeg = "-" 
               Temp=~Temp+1 
          Endif
         TEMP =(TEMP*10)/16 
           RETURN

Ayrıca Ekrana yazma şeklide biraz değişecek;
   Lcdout $fe, 1, TempNeg, Dec TempX,".", Dec (Temp.7/1*50/10),223,"C   OUT:",dec
Relayout 
yerine,
   Lcdout $fe, 1, TempNeg, Dec temp/10,".", Dec1 (Temp//10),223,"C   OUT:",Dec Relayout
yazman gerekir.

Ete

efsanepoldem

Hocam  sayenizde   ds18b20 modifiyesini yaptım sistem gayet güzel çalıştı fakat şimdi de rolenin devreye girip çıkması lazım fakat çıkış sürekli high 'de duruyor. Bunu anlayamadım
program şöyle:
Chk_RelayOut:
    if Temphi < 128 then 'Set Temp = pos.temp.
      if temp.highbyte < 128 then 'Temp = pos.temp
         if temp.highbyte = temphi then
            if temp.7 >= Templo then
               RelayOut = 0
            else
               RelayOut = 1
            endif
         else
            if temp.highbyte >= temphi then
               RelayOut = 0
            else
               RelayOut = 1
            endif
         endif   
      else  'Set Temp = neg.temp.
         RelayOut = 0
      endif
   else 'Set Temp = neg.temp.
      if temp.highbyte > 128 then 'Temp = neg.temp
         if temp.highbyte = temphi then
            if temp.7 <= Templo then
               RelayOut = 0
            else
               RelayOut = 1
            endif
         else
            if temp.highbyte <= temphi then
               RelayOut = 1
            else
               RelayOut = 0
            endif
         endif   
      else  'Set Temp = pos.temp.
         RelayOut = 0
      endif
   endif   
return

ete

Tabiiki programın bir yeri ile oynarsanız bir sürü yer etkilenir. Bir kısmını görürsün bir kısmı çalışınca ortaya çıkar. Buda onlardan birisi. Her şeyden önce rölelerin sürülüş mantığınıda açıklasan daha iyi olur sanırım.

Chk_RelayOut: başlığı altındakileri aşağıda yazdıklarımla değiştir.

if Temphi < 128 then 'Set Temp = pos.temp.
      if temp.highbyte < 128 then 'Temp = pos.temp
         if (Temp/10) = temphi then
            if (temp//10) >= Templo then
               RelayOut = 0
            else
               RelayOut = 1
            endif
         else
            if (temp/10) >= temphi then
               RelayOut = 0
            else
               RelayOut = 1
            endif
         endif   
      else  'Set Temp = neg.temp.
         RelayOut = 0
      endif
   else 'Set Temp = neg.temp.
      if (temp/10) > 128 then 'Temp = neg.temp
         if (temp/10) = temphi then
            if (temp//10) <= Templo then
               RelayOut = 0
            else
               RelayOut = 1
            endif
         else
            if (temp/10) <= temphi then
               RelayOut = 1
            else
               RelayOut = 0
            endif
         endif   
      else  'Set Temp = pos.temp.
         RelayOut = 0
      endif
   endif   
return

Ete

efsanepoldem

Sn ETE size ne kadar teşekkür etsem azdır. Biz buraya eksik bile yazsak anında işi çözüyorsunuz. Sonsuz teşekkürler

efsanepoldem

 Sn. ETE Hocam acayip bir durumla karşı karşıyayım. Hatırlarsanız 2 gün öncegönderdiğim programdaki değişiklikleri yapıp sonuç almıştık. Fakat bende dedim ki  pic16f88 işlemcisi pic16f628 e göre daha pahalı. Bu programı 628 e göre değiştireyim dedim. Programa cmcon=7 eklentisini yaptım. Fakat set değeri noktadan sonra 4 hane çıkıyor ve tset değeri ayarlanamıyor. Bu devre pic 16f88 ile sorunsuz çalışmasına rağmen 628 de neden böyle fazladan rakamlar çıktı anlayamadım. Sizce nerede bir yanlış yapıyorum.

ete

Programda bir gariplik göremedim. İkisininde aynı çalışması gerekir. Ancak başından beri bu programın yazılış şeklini beğenmedim. Sağ el ile sürekli sol kulak tutuluyormuşçasına bir program yazılmış. Bazı örnekler vereyim;
Set sıcaklığının ondalık kısmını ekrana yazdıran komuta bir bak,    Dec(TempLo/1*50/10),223,"C"
Bu komut şöyle yazılsa çok daha iyi çalışır Dec1 TempLo,223,"C" neden orada hesap yaptırmış onuda anlamış değilim. TempLo denilen sayı 0-9 arasında bir sayı peki bunu 1 e bölmek ne demek oluyor yada 1*50 yazacağına yalnızca 50 yazsaydı . Zaten bu hesabın amacını gerçekten anlamadım. Şöyle bir bakarsak X/1*50/10 demek X/5 demek oluyor bana kalırsa zira 50/10=5 dir X/1*5 ise X/5 dir. SOnuçta bunu direk yazmayıp neden bu şekilde yazmış onuda analamadım.

SET sıcaklık ayarlamasıda bir tuhaf,
Set sıcaklığını azaltma kısmına bakalım;
   if Sw_DEC = 0 then ........................'şayet Azalt tuşuna basılmış ise
      if TempHi > 128 then....................'o andaki set sıcaklık tamsayı kısmı 128 den büyük ise
         if Temphi > 201 then.................'aynı sayı 201 den büyük ise.
            TempLo = TempLo ^ 1 ...........'Ondalık kısmı 1 ile XOR yap. Bu işlem sayı çift ise artırır tek ise azaltır
            if TempLo = 1 then TempHi = TempHi - 1   'ondalık=1 ise tam sayı kısmından bir çıkart denilmiş.
         endif   

      else.......................................' Tamsayı  128 den büyük değil ise
         TempLo = TempLo ^ 1    .....'aynı işi yeniden yaptırıyor   
         if TempLo = 1 then TempHi = TempHi - 1
      endif
   endif
Dikkat edilirse Sayının 128 büyük olması ve 201 den büyük olması ile olmaması arasında işlem farkı yok. Her ikisinde de aynı işi yaptırıyor o halde neden sorguluyorsun? belli değil. Programın yazılış mantığına bakılırsa işi iyi bilen birisi yazmış ama amacını henüz keşfedemedim maalesef. Sanki İleri programlama dillerini bilen birisi çok fazla anlamadan Basic de program yazmış gibi duruyor.
Kullandığı kod mantığı eksi sıcaklıklarıda ayarlamada işe yarayabilir gibi gözüküyor ama emin değilim denemek gerekir ancak şu anda deneyecek imkanım yok maalesef.

16F88 ile çalışırken Set sıcaklığı kaç hane çalışıyor bunu görebiliyormusun?.
Ete

efsanepoldem

   evet 2 haneli ve noktadan sonra 1 hane . yani 22.5 gibi.

ete

Set sıcaklığının düzgün çalışmasını istiyor isen programın başlarında yer alan 2 adet read satırından evvel şu komutu ilave et.
DATA @0,22,0
Bu satırıları yazdıktan sonra bir kere programı çalıştır sonra gerekirse o satırı silebilirsin. Amaç bir kereliğine eproma bu bilginin yazdırılmasıdır.

Ayrıca LCD gösterim sistemide sürekli LCD yi resetleyerek çalıştığı için güzel görünmüyor.
Aşağıdaki şekilde kullanırsan daha titremesiz oluyor.

Disp_Temp:   
   Lcdout $fe, 02, TempNeg, Dec temp/10,".", Dec1 (Temp//10),223,"C   OUT:",Dec Relayout
   Lcdout $fe, $c2, "SET: ",sDec TempHi,".",Dec(TempLo/1*50/10),223,"C"
return

Disp_SetTemp:
   Lcdout $fe, 02, TempNeg, Dec temp/10,".", Dec1 (Temp//10),223,"C   OUT:",Dec Relayout
   Lcdout $fe, $c0, " TSET: ",sDec TempHi,".",Dec(TempLo/1*50/10),223,"C"
return

Ete


efsanepoldem

#9
    Hocam söylediklerinizi harfiyyen yaptım, çok güzel oldu. Bu şekilde birilerine yardımcı olmanız ne kadar güzel hem de hiç karşılık beklemeden. Klavye başına oturup, dakikalarca usanmadan metin yazarak, birilerine yardımcı oluyorsunuz. Valla ne diyeyim Allah yolunuzu açık etsin. Teşekkür ederim
   Hocam bu arada şimdi fark ettim. set tuşuna basıp ayar yapmak istediğimiz de ayar yapabiliyoruz fakat set tuşuna tekrar bastığımızda normal ekrana dönmesi lazım fakat buradan çıkmıyor. Ayrıca sormak istediğim   if  SetTemp then   diye bir satır var
bildiğim kadarıyla SetTemp =0 yada SetTemp =1 mi diye sorgulanmalı diye biliyorum.  if  SetTemp then yazımı ne anlama geliyor? Tam herşey bitti derken başka sıkıntılar çıkıyor. Bu program yazma işi tam bir sabır işi imiş.

erhn

#10
Aşağıdaki ısı  kontrol devresini 4 röle halinde yapmak istiyorum. Nasıl yapabilirim?

Temp var word 'DS1621 Temperature
TempLo var byte 'DS1621 Temp. Low byte
TempHi var byte 'DS1621 Temp. High byte
TempX var byte 'misc. storage variables
TempNeg var byte ' "
SetTemp var bit ' "
i2c_sda var PortA.2 'DS1621 Data pin
i2c_scl var PortA.3 'DS1621 Clock pin
RelayOut var PortA.0 'Relay output pin
Sw_SET var PortA.1 'Set temp. switch
Sw_DEC var PortB.6 'Dec temp. switch
Sw_INC var PortB.7 'Inc temp. switch

TrisA = %11110
PortA = 0
TrisB = %11000000
PortB = 0
SetTemp = 0

EEPROM 0,[22,0] 'Default temp. 22.0°C, stored at EEprom location 0 and 1
Read 0, TempHi 'Get Temp. High.byte from EEprom address 0
Read 1, TempLo 'Get Temp. Low.byte from EEprom address 1

Main:
gosub Read_Temp
gosub Chk_RelayOut
gosub Chk_Switches
if not settemp then gosub Disp_Temp
pause 100
goto Main

Read_Temp:
i2cwrite i2c_sda,i2c_scl,$90,$ac,[0] 'Access Config [ACh]
Pause 1
I2CWrite i2c_sda, i2c_scl,$90,[$ee] 'Start Convert T [EEh]
Pause 1
I2CRead i2c_sda, i2c_scl, $90,$aa,[Temp],Error 'Read Temperature [AAh]
TempNeg = " "
TempX = Temp.HighByte
if TempX >= 128 then
TempNeg = "-"
TempX = 256 – (TempX + Temp.7)
endif
return

Disp_Temp:
Lcdout $fe, 1, TempNeg, Dec TempX,".", Dec (Temp.7/1*50/10),223,"C Tout:",dec Relayout
Lcdout $fe, $c0, "(",SDec TempHi,".",Dec(TempLo/1*50/10),223,"C)"
return

Disp_SetTemp:
Lcdout $fe,1,TempNeg, Dec TempX,".", Dec (Temp.7/1*50/10),223,"C Tout:",dec Relayout
Lcdout $fe, $c0, "Tset: ",sDec TempHi,".",Dec(TempLo/1*50/10),223,"C"
return

Error:
Lcdout $fe, 1, "Error!", $fe, $C0, "Reading Temp."
goto Main

Chk_RelayOut:
if Temphi < 128 then 'Set Temp = pos.temp.
if temp.highbyte < 128 then 'Temp = pos.temp
if temp.highbyte = temphi then
if temp.7 < Templo then
RelayOut = 1
else
RelayOut = 0
endif
else
if temp.highbyte < temphi then
RelayOut = 1
else
RelayOut = 0
endif
endif
else 'Set Temp = neg.temp.
RelayOut = 1
endif
else 'Set Temp = neg.temp.
if temp.highbyte > 128 then 'Temp = neg.temp
if temp.highbyte = temphi then
if temp.7 > Templo then
RelayOut = 1
else
RelayOut = 0
endif
else
if temp.highbyte > temphi then
RelayOut = 0
else
RelayOut = 1
endif
endif
else 'Set Temp = pos.temp.
RelayOut = 0
endif
endif
return

Chk_Switches:
if Sw_SET = 0 then
if SetTemp then
gosub Disp_Temp
else
gosub Disp_SetTemp
endif
while SW_SET = 0 : wend
if SetTemp then
Write 0, TempHi 'Store TempHi to EEprom location 0
Write 1, TempLo 'Store TempLo to EEprom location 1
endif
settemp = not Settemp
endif

if not settemp then return

if Sw_DEC = 0 then
if TempHi > 128 then
if Temphi > 201 then
TempLo = TempLo ^ 1 'invert state of TempLo
if TempLo = 1 then TempHi = TempHi – 1
endif
else
TempLo = TempLo ^ 1
if TempLo = 1 then TempHi = TempHi – 1
endif
endif

if Sw_INC = 0 then
if TempHi < 128 then
if TempHi < 125 then
TempLo = TempLo ^ 1
if TempLo = 0 then TempHi = TempHi + 1
endif
else
TempLo = TempLo ^ 1
if TempLo = 0 then TempHi = TempHi + 1
endif
endif
gosub Disp_SetTemp
return

end


ete

4 röle halinde yapmak istemekle sanırım 3 röle daha ilave etmek istiyorsun. O halde önce oturup bir şema çizeceksin. O şemada ilave 3 röleyi boş pin kalmış ise pinlere bağlayacaksın.
Sonra programda rölenin bağlandığı pini tanımlayacaksın. Bak bakalım mevcut röle nasıl tanımlanmış.
RelayOut var PortA.0 'Relay output pin

Sonra mevcut tek rölenin çektirilme şartlarına bakacak ve diğer 3 rölenin hangi şartlarda çekilecek hangi şartlarda bırakılacak onları belirleyeceksin.

Sonra o şartlarıda aşağıdaki bölüme ekleyeceksin. Bu bölüm mevcut rölenin çektirilme yada bıraktırılma şartlarını içermektedir.
Chk_RelayOut:
if Temphi < 128 then 'Set Temp = pos.temp.
if temp.highbyte < 128 then 'Temp = pos.temp
if temp.highbyte = temphi then
if temp.7 < Templo then
RelayOut = 1
else
RelayOut = 0
endif
else
if temp.highbyte < temphi then
RelayOut = 1
else
RelayOut = 0
endif
endif
else 'Set Temp = neg.temp.
RelayOut = 1
endif
else 'Set Temp = neg.temp.
if temp.highbyte > 128 then 'Temp = neg.temp
if temp.highbyte = temphi then
if temp.7 > Templo then
RelayOut = 1
else
RelayOut = 0
endif
else
if temp.highbyte > temphi then
RelayOut = 0
else
RelayOut = 1
endif
endif
else 'Set Temp = pos.temp.
RelayOut = 0
endif
endif
return


Hepsi bu kadar.

Ete

Powered by EzPortal