DS18b20 sensör okuması ve bu değerlerle röle kontrolü

Başlatan sinasos, 28 Şubat 2019, 00:11:47

sinasos

Merhaba arkadaşlar;
sizlere fikir sormak için bu konuyu açıyorum. Konu hakkında bilgisi olanlar lütfen yardımcı olabilirlerse sevinirim
Selamlarımla
** 3 adet DS18b20 sensörü okuyup belirlediğimiz alt sınır değerinin altına hangi sensör değeri düşerse ona bağlı röleyi çalıştırmak istiyorum.
bu konuda bir sıkıntım yoktu ama röleler melodi çalmaya başlayınca :) sizlere fikir sormak istedim. Kod aşağıdaki gibidir.
Sensör okuma kodu

SENSOROKU:   '1. ISI SENSÖRÜ
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
SENSOROKU1:  '2. ISI SENSÖRÜ
           OWOUT   Comm_Pin1, 1, [$CC, $44]' ISI değerini oku
Bekle1:
           OWIN    Comm_Pin1, 4, [Busy1]    ' Busy değerini oku
           IF      Busy1 = 0 THEN Bekle1    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin1, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin1, 2, [HAM1.Lowbyte, HAM1.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla1
           RETURN
SENSOROKU2:  '3. ISI SENSÖRÜ
           OWOUT   Comm_Pin2, 1, [$CC, $44]' ISI değerini oku
Bekle2:
           OWIN    Comm_Pin2, 4, [Busy2]    ' Busy değerini oku
           IF      Busy2 = 0 THEN Bekle2    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin2, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin2, 2, [HAM2.Lowbyte, HAM2.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla2
           RETURN

Hesapla:                 ' Ham değerden Santigrat derece hesabı
    ISARET  = "+"
    IF ISARET_BITI = EKSI_ISI THEN
       ISARET   = "-" 
       ham=~ham+2
    endif
    float = (HAM*10)/16        '
    ISI1=FLOAT/10 
    RETURN 
Hesapla1:                 ' Ham değerden Santigrat derece hesabı
    ISARET1  = "+"
    IF ISARET_BITI = EKSI_ISI THEN
       ISARET1   = "-" 
       ham1=~ham1+2
    endif
    float1 = (HAM1*10)/16        '
    ISI2=FLOAT1/10 
    RETURN 
Hesapla2:                 ' Ham değerden Santigrat derece hesabı
    ISARET2  = "+"
    IF ISARET_BITI = EKSI_ISI THEN
       ISARET2   = "-" 
       ham2=~ham2+2
    endif
    float2 = (HAM2*10)/16        '
    ISI3=FLOAT2/10 
    RETURN 


Röle kontrol kodu

        IF ISI1<ALT_ISI THEN ROLE1=1
        IF ISI1=>ALT_ISI THEN ROLE1=0
       
        IF ISI2<ALT_ISI THEN ROLE2=1
        IF ISI2=>ALT_ISI THEN ROLE2=0
       
        IF ISI3<ALT_ISI THEN ROLE3=1
        IF ISI3=>ALT_ISI THEN ROLE3=0


Sorun şu ki !
3 sensörden 2. ve 3. sensörü takmadığımda, takılmayan sensörlerde ısı değeri 409 C olarak görünüyor. 1. sensörde takılı olmazsa 000 C olarak görünüyor.
üçünede sensör takar ve alt  ısıdan düşük bir değer olursa ; 1. röle çekiyor bırakıyor , 2. röle çekiyor bırakıyor, 3. röle çekiyor bırakıyor sürekli melodi çalıyor sanki röleler. :) okumada mı hata yapıyorum yoksa röle kontrolünde mi ?
Bu konuda yardımcı olabilirseniz çok mutlu olurum.
Teşekkürler...

ete

Sensör komutlarında ufak tefek kusurlar var.
Bi rtanesine ait kodun doğrusunu yazayım diğerlerini de buna göre değiştir.
Bekle:
           OWIN    Comm_Pin, 0, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 0, [HAM.Lowbyte, HAM.Highbyte,skip 3]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN


Bu şekilde muhtemelen okuma sorunu düzelecek. Devrede başka fiziksel bir kusur yok ise elbette.
Karşılaştırma kısmını şöyle yazın. Yine bir sensör için olanı veriyorum.
 IF ISI1<ALT_ISI then
           ROLE1=1
        else
           ROLE1=0
        EndIF

Burada bir sıkıntı var aslında. Diyelimki sıcaklık (ISI1=30) derece  ve ALT_ISI=31 derece bu durumda röle hemen çekecektir.
Ama hemen ardında yeni bir okuma yaptığınızda sıcaklık 30 yerine 31 deree çıkabiliyor. Bu durumda röle bir çekip bir bırakacaktır. Bu sorunu aşmanın yolu sıcaklık belirli sıcaklığın altında röle çeksin ama sıcaklık o sıcaklığın 2-3 derece yukarısında kapatsın demek gerekir.
Örnek vereyim. Ölçülen sıcaklık 20 derecenin altına düşünce röle=1 olsun ama 22 derecenin üzerinde Röle=0 olsun. Böylece ufak tefek ölçüm farklılıklarından kurtulmuş olursunuz.
Bu durumda karşılaştırma kısmı şöyle olabilir.
   IF ISI1<ALT_ISI then
           ROLE1=1
        else
           IF ISI1> (ALT_ISI+2) THEN ROLE1=0
        EndIF


Ete

sinasos

Teşekkür ederim ETE hocam;
birde müsait olduğunuzda size dht22 sensörün seri iletişiminin nasıl olmasını gerektiği konusunda fikrinizi sorabilirmiyim. 16f628 işlemci+2x16 LCD+433mhzRF alıcı kombinasyonu ile 12f675+DHT22 sensör+RF verici şeklinde bir sistemde veri iletişimini nasıl bir komut dizisiyle gönderebilirim. bu konuda da yardımcı olabilirseniz çok sevinirim.
Saygılarımla.

ete

DHT22 ile ilgili çalışmalar ve açıklamalar aşağıdaki linkte verilmiş durumda.
Sorduğun soru çok fazla genel bu sorunun cevabı sayfalarca olabilir. Bütün projeyi sormuşsun gibi bir durum var ortada.
İhtiyacın olan yalnızca DHT22 nin okuma kısmı ki oda linkte verilmiş.

https://etepic.com/index.php/topic,3451.15.html

Diğer kısımlar için başka bir sensörle yapılmış benzer projem var oda aşağıdaki linkte;

https://etepic.com/index.php/topic,62.0.html
yapan gereken işlemci ve sensör değişikliklerini yapıp uygulamak.

Çoğu zaman örnek anlatmaktan daha iyi sonuç verir.

Ete

. Kağan

Merhabalar,

SENSOROKU:

OWIN    Comm_Pin, 0, [Busy]    ' Busy değerini oku
Bekle:
IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
OWIN    Comm_Pin, 0, [HAM.Lowbyte, HAM.Highbyte,skip 3]' İki byte oku ve okumayı bitir.
GOSUB   Hesapla

RETURN   


Yukardaki kodda 18B20 nin data kodu "[$CC, $BE] köşeli parantezler arasına mı yerleştiriliyor?

Yani örneğin [$55,$28,$30,$C5,$B8,$00,$00,$00,$8E,$44] kodu bu arayamı geliyor. Yoksa sadece aradaki 6 bitmi [$30,$C5,$B8,$00,$00,$00] alınıyor?

Teşekkürler

sinasos

ETE hocam merhaba;
12f675 ile 16f628 arasında seri iletişim yoluyla termometre yapmaya çalışıyorum. bahsettiğiniz örneklerden yola çıkarak birşeyler ortaya çıkarttım. Ancak 12f675'e bağlı DHT22 sensör okumaya geçince kilitlenip kalıyor ve veri iletişimi sağlamıyor. Ayrıca 16f628a daki sensör okuma kısmıda karmakarışık oldu çıkamıyorum. Bu konuda ki fikriniz nedir ?
Teşekkürler.

VERİCİ :

@ DEVICE pic12F675 'işlemci 12F675
@ DEVICE pic12F675, WDT_ON              'Watch Dog timer açık
@ DEVICE pic12F675, PWRT_ON  'Power on timer açık
@ DEVICE pic12F675, PROTECT_OFF  'Kod Koruma kapalı
@ DEVICE pic12F675, MCLR_OFF      'MCLR pini kullanılMIYOR.
@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
DEFINE OSCCAL_1K 1  'bu  komut mutlaka olacak OSCCAL değerini yeniden pice yazdırıyor
DEFINE OSC 4
DEFINE SER2_BITS 9
DEFINE ADC_BITS 10    ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 1    ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 100 ' ADC sampling time (uSec)
include "modedefs.bas"
OPTION_REG.7=0
CMCON = 7
ANSEL = %00010011
ADCON0=%10000000
GPIO=0
TRISIO=%00000011
WPU=0
TRISIO.4=0
SENSOR VAR GPIO.5 'Sensör PORTB.7'ye bağlı
MESGUL VAR BYTE 'Çeşitli değişken tanımlamaları
BILGI VAR WORD
A VAR BYTE
B VAR BYTE
C VAR WORD
D var byte
E VAR BYTE
F var byte
G VAR BYTE
high gpio.1
pause 500
low gpio.1
pause 500
high gpio.1
pause 500
low gpio.1
pause 500

I       VAR BYTE
TAMRUT  VAR WORD
ONDARUT VAR BYTE
TAMISI  VAR WORD
ONDAISI VAR BYTE
control var byte
ISARET  VAR BIT


BASLA: 'Dongüye gir.
GOSUB ADCOKU
GOSUB SENSOROKU
high gpio.1
GOSUB GONDER

GOTO BASLA

ADCOKU:
ADCIN 0,C
return

SENSOROKU:
           output SENSOR
           SENSOR=1:PAUSEUS 5
           SENSOR=0
           pause 5      '1-10 ms bekle
           SENSOR=1         'Data pinini High yap
           Pauseus 40      '40 us bekle
           INPUT SENSOR
           PAUSEUS 5

           WHILE SENSOR=0:WEND
           PAUSEUS 80

             TAMRUT=0
            FOR I=15 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
              WHILE SENSOR=0:WEND 
               Pauseus 30
              IF SENSOR=1 then TAMRUT.0[I]=1
              while SENSOR=1:wend
              Next

            TAMISI=0
            FOR I=15 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
              WHILE SENSOR=0:WEND
               Pauseus 30
              IF SENSOR=1 then TAMISI.0[I]=1
              while SENSOR=1:wend
            Next           

            control=0
           
            FOR I=7 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
              WHILE SENSOR=0:WEND
               Pauseus 30
              IF SENSOR=1 then control.0[I]=1
              while SENSOR=1:wend 
            Next
           
            output SENSOR
            SENSOR=0
          IF TAMISI.BIT15=1 THEN
          TAMISI=TAMISI-48
          ISARET="-"
          ONDARUT=TAMRUT//10
          TAMRUT=TAMRUT/10
          ONDAISI=TAMISI//10
          TAMISI=TAMISI/10
           ELSE
           ISARET="+"
          ONDARUT=TAMRUT//10:TAMRUT=TAMRUT/10
          ONDAISI=TAMISI//10:TAMISI=TAMISI/10
          ENDIF
           
            return




GONDER:
D=C.LOWBYTE
E=C.HIGHBYTE

A=TAMISI.LOWBYTE
B=TAMISI.HIGHBYTE
           
F=TAMRUT.LOWBYTE
G=TAMRUT.HIGHBYTE

SEROUT2 GPIO.4,396,["AA",A]
SEROUT2 GPIO.4,396,["AA",A]
SEROUT2 GPIO.4,396,["AA",A]
SEROUT2 GPIO.4,396,["BB",B]
SEROUT2 GPIO.4,396,["BB",B]
SEROUT2 GPIO.4,396,["BB",B]
SEROUT2 GPIO.4,396,["CC",D]
SEROUT2 GPIO.4,396,["CC",D]
SEROUT2 GPIO.4,396,["CC",D]
SEROUT2 GPIO.4,396,["DD",E]
SEROUT2 GPIO.4,396,["DD",E]
SEROUT2 GPIO.4,396,["DD",E]
low gpio.1
SEROUT2 GPIO.4,396,["FF",F]
SEROUT2 GPIO.4,396,["FF",F]
SEROUT2 GPIO.4,396,["FF",F]
SEROUT2 GPIO.4,396,["GG",G]
SEROUT2 GPIO.4,396,["GG",G]
SEROUT2 GPIO.4,396,["GG",G]

RETURN

END



ALICI :

@ DEVICE pic16F628A 'işlemci 16F628
@ DEVICE pic16F628A, WDT_on 'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_OFF 'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF 'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF 'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
define OSC 4
DEFINE SER2_BITS 9
include "modedefs.bas" 'SERİN VE SEROUT KOMUTLARININ ÇALIŞMASI İÇİN GEREKLİ KÜTÜPHANE DOSYASI
DEFINE LCD_DREG PORTa
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
define LCD RWREG    PORTB   'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT    1   
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 4000
DEFINE LCD_DATAUS 250
PAUSE 10
LCDOUT $FE,$40,6,9,9,6,0,0,0,0 'Derece gösterimi için özel karakteri LCD'ye yüklüyoruz.
BILGI VAR WORD
ISARET VAR BYTE
C VAR WORD
d var word
VOLT VAR WORD
MVOLT VAR word
ONDA1 VAR WORD
ONDA2 VAR WORD
ARA VAR WORD
DEGER VAR BYTE
SYC var byte
USTISI VAR BYTE
USTNEM VAR BYTE
ISIHIS VAR BYTE
NEMHIS VAR BYTE

I       VAR BYTE
TAMRUT  VAR WORD
ONDARUT VAR BYTE
TAMISI  VAR WORD
ONDAISI VAR BYTE
control var byte

TRISB=%11110000 'PORTB TAMAMI GIRIS
TRISA=%00000000
CMCON=7 'KOMPARATÖR PİNLERİ DİJİTAL GİRİŞ VEYA ÇIKIŞ
symbol buzer=portb.3
symbol yukari=portb.4
symbol MENU=portb.5
symbol asagi=portb.6
SYMBOL RFAL=PORTB.7
read 0, USTISI
read 1, USTNEM

REKLAM:
    LCDOUT  $FE,$C0,"ISI VE NEM SiST."
    pause 1500


BASLA:
GOSUB BILGIAL
GOSUB AKUBAK
GOSUB SENSOROKU
GOSUB GOSTER

ana:
    if menu=0 then DONUS

GOTO BASLA 'BASLA etiketine dön

BILGIAL:
ISARET="+"
serin2 RFAL,396,[WAIT ("AA"),BILGI.LOWBYTE]
serin2 RFAL,396,[WAIT ("BB"),BILGI.HIGHBYTE]
serin2 RFAL,396,[WAIT ("CC"),C.LOWBYTE]
serin2 RFAL,396,[WAIT ("DD"),C.HIGHBYTE]
serin2 RFAL,396,[WAIT ("FF"),C.LOWBYTE]
serin2 RFAL,396,[WAIT ("GG"),C.HIGHBYTE]


RETURN

AKUBAK:
C=C+1
d=c*3
    volt=(d*/1250)/100
    mvolt=volt//10
    mvolt=mvolt+1
    volt=volt/10
IF MVOLT>9 THEN
VOLT=VOLT+1
MVOLT=0
ENDIF
IF MVOLT>11 THEN
VOLT=VOLT-1
MVOLT=9
ENDIF
RETURN

GOSTER:
if c<477 then
LCDOUT $FE,$1,"Pil Bitiyor:",Dec1 VOLT,",",DEC1 MVOLT," " 'LCD ekranın alt satırını temizle
else
LCDOUT $FE,$2,"Pil = ",Dec1 VOLT,",",DEC1 MVOLT,"       " 'LCD ekranın alt satırını temizle
endif
LCDOUT $FE,$C0,"ISI:",ISARET,DEC2 TAMISI,"  ","NEM:","%",DEC2 TAMRUT
RETURN

SENSOROKU:
           
          IF TAMISI.BIT15=1 THEN
          TAMISI=TAMISI-48
          ISARET="-"
          ONDARUT=TAMRUT//10
          TAMRUT=TAMRUT/10
          ONDAISI=TAMISI//10
          TAMISI=TAMISI/10
           ELSE
           ISARET="+"
          ONDARUT=TAMRUT//10:TAMRUT=TAMRUT/10
          ONDAISI=TAMISI//10:TAMISI=TAMISI/10
          ENDIF
    RETURN



ISIBAK:
bilgi=bilgi-64
IF BILGI.BIT13=1 THEN 'Sıcaklık negatif ise
ISARET="-" 'İşaret artık + değil -
BILGI=~BILGI 'Gelen bilgideki bitleri tersle, 1->0, 0->1
BILGI=BILGI+1 'Bilgiyi 1 arttır.
ENDIF
ARA=BILGI*625 '12 bit hassasiyet kullandığımız için her değer 0.0625 santigrat dereceye denk geliyor.

DEGER=DIV32 10000

ARA=BILGI*625
ONDA1= DIV32 1000
ARA=BILGI*625
ONDA2= DIV32 100
ONDA1=ONDA1-(DEGER*10)
ONDA2=ONDA2-((dEGER*100)+(ONDA1*10))
RETURN
    if menu=0 then DONUS
GOTO BASLA 'BASLA etiketine dön



donus:
read 0, USTISI
read 1, USTNEM
read 3, ISIHIS
read 4, NEMHIS
GOSUB TEMIZLE
LCDOUT $FE,$1, "  MENU  GiRiSi  "
PAUSE 500
AYARLA:
LOW buzer
WHILE MENU=0:WEND
GOSUB TEMIZLE
SYC=0
AYARLAR:
IF YUKARI=0 THEN
WHILE YUKARI=0:WEND
SYC=SYC+1
  IF SYC=5 THEN SYC=0
ENDIF

IF ASAGI=0 THEN
WHILE ASAGI=0:WEND
SYC=SYC-1
  IF SYC=255 THEN SYC=4
ENDIF

SELECT CASE SYC
CASE 0         
LCDOUT $FE,$80, " UST ISI AYARI  "
LCDOUT $FE,$C0, " ISI : ",dec2 USTISI,".0 C    "
IF MENU=0 then
WHILE MENU=0:WEND
GOTO bir
ENDIF
CASE 1         
LCDOUT $FE,$80, " UST NEM AYARI  "
LCDOUT $FE,$C0, " NEM : ",dec USTNEM ," %      "
IF MENU=0 then
WHILE MENU=0:WEND
GOTO IKI
ENDIF
CASE 2         
LCDOUT $FE,$80, "  ISI HiSTERi   "
LCDOUT $FE,$C0, "HiSTERi : ",dec ISIHIS ,"      "
IF MENU=0 then
WHILE MENU=0:WEND
GOTO UC
ENDIF
CASE 3         
LCDOUT $FE,$80, "  NEM HiSTERi   "
LCDOUT $FE,$C0, "HiSTERi : ",dec NEMHIS ,"      "
IF MENU=0 then
WHILE MENU=0:WEND
GOTO DORT
ENDIF

CASE 4
lcdout $fe,$80,"    MENUDEN     "
LCDOUT $FE,$C0,"     CIKIS      "
IF MENU=0 THEN AYARLANDI
END SELECT
GOTO AYARLAR
'------------------------------ BUZER SESİ -------------------------------------
BIP:
    HIGH buzer   
pause 50
     LOW buzer
pause 50       
  RETURN
BIPBIP:
     HIGH buzer   
    PAUSE 50
      LOW buzer
    PAUSE 100
     HIGH BUZER
    PAUSE 50
      LOW BUZER
RETURN

AYARLANDI:
           IF MENU=0 then AYARLANDI
       lcdout $fe,1
       LCDOUT $FE,$C0,"AYAR KAYDEDiLDi."
       GOSUB BIPBIP
       SYC=0
       PAUSE 800
       
        GOSUB TEMIZLE
        goto REKLAM       

'********************************* menü kısmı *****************************************
BIR:   
SET1: 
           LCDOUT $FE,$C0, "=>ISI : ",dec2 USTISI,".0 C    "
           IF YUKARI=0 then
                USTISI=USTISI+1
                ENDIF
              IF USTISI=100 THEN USTISI=0
              PAUSE 125
           
           IF ASAGI=0 then
                USTISI=USTISI-1
                ENDIF
              IF USTISI=255 THEN USTISI=25
              PAUSE 125

               
         IF MENU=0 THEN
         WRITE $01,USTISI:PAUSE 2
         GOTO ayarla
         ENDIF

    GOTO SET1
IKI:     
set2:
            LCDOUT $FE,$C0, "=>NEM : ",dec USTNEM ," %      "
            IF YUKARI=0 then
                USTNEM=USTNEM+1
                ENDIF
              IF USTNEM=100 THEN USTNEM=0
              PAUSE 125
           IF ASAGI=0 then
                USTNEM=USTNEM-1
                ENDIF
              IF USTNEM=255 THEN USTNEM=50
              PAUSE 125
         IF MENU=0 THEN
         WRITE $02,USTNEM:PAUSE 2
         GOTO AYARLA
         ENDIF
    GOTO SET2       
UC:     
set3:
            LCDOUT $FE,$C0, "=>HiSTERi : ",dec ISIHIS ," C      "
            IF YUKARI=0 then
                ISIHIS=ISIHIS+1
                ENDIF
              IF ISIHIS=100 THEN ISIHIS=0
              PAUSE 125
           IF ASAGI=0 then
                ISIHIS=ISIHIS-1
                ENDIF
              IF ISIHIS=255 THEN ISIHIS=2
              PAUSE 125
         IF MENU=0 THEN
         WRITE $03,ISIHIS:PAUSE 2
         GOTO AYARLA
         ENDIF
    GOTO SET3       


DORT:     
set4:
            LCDOUT $FE,$C0, "=>HiSTERi : ",dec NEMHIS ," %      "
            IF YUKARI=0 then
                NEMHIS=NEMHIS+1
                ENDIF
              IF NEMHIS=100 THEN NEMHIS=0
              PAUSE 125
           IF ASAGI=0 then
                NEMHIS=NEMHIS-1
                ENDIF
              IF NEMHIS=255 THEN NEMHIS=5
              PAUSE 125
         IF MENU=0 THEN
         WRITE $04,NEMHIS:PAUSE 2
         GOTO AYARLA
         ENDIF
    GOTO SET4       

goto ana

temizle:
LCDOUT  $FE,1
return

END


ete

Sorunun 12F675 tarafında ya sensör okumada yada Seri haberleşmede olduğu kesin gibi göüküyor.
Sensör okuma kısmına bakınca sen yanlış bir start sinyali ile sensör okumaya başlıyorsun.
Data sheet diyorki;
Host (yani mikroişlemci) data hattını LOW a çeker (yani hattı çıkış yapıp LOW uygulamak gerekiyor) ve en azından 1-5 ms bekler. Daha sonra aynı hattı HIGH yapar ve 20-40us bekler. Ardından hattı sensöre bırakmak için data hattını giriş yapar. O anda sensör hattı LOW a çeker ve yaklaşık 80 us low da tutup hattı high yapar ve yine bir 80us highda tuttuktan sonra okuma bilgilerini yollamaya başlar.

Sen ne yapmışsın birde ona bakalım.
Sen start sinyalini hattı çıkış yapıp HIGH vererek başlamışsın bu ters bir işlem. Start almamış olacak sensör. Dolayısıyla ne yapacağını bilemeyip kilitleniyordur mutlaka.
Sonuçta Okuma kısmını aşağıdaki ile değiştirip yeniden dene bakalım.
Kodu vermeden önce bir iki şeyi açıklayayım.
Bir pini Çıkış yapıp ona bir lojik değer vermenin iki yolu var.
OUTPUT PIN
Pın=0
Pauseus 40
şeklindeki 3 satır pini önce çıkış yapıp ona LOW lojik değeri verir ve 40us bekler.
Aynı işi şu komut diziside yapar
LOW PIN
Pauseus 40
Burada yalnızca iiki satır var ama LOW PIN komutu önce PIN'i çıkış olarak ayarlar ve ardından o pine LOW uygular.
Yukarıdakinin aynı işi yapar ama sadece iki komut satırı ile. Bu nedenle ben onu kullandım.
           LOW SENSOR 'bu komut hem sensör pinini çıkış yapar hemde pine LOW verir
           PAUSE 5
           SENSOR=1
           PAUSEUS 40
           INPUT SENSOR
           PAUSEUS 5           
           WHILE SENSOR=0:WEND
           PAUSEUS 80           
           
           TAMRUT=0
           FOR I=15 to 0 STEP-1
..............................
....................

Devamını sen yazarsın ben sadece başlangıcı düzelttim.

Haberleşme işine gelince, Programın başında ;
DEFINE SER2_BITS 9
komut satırını görüyorum. Bunu bilerek ve isteyerekmi yazdın? Standart dışı bir uygulama bu çünki.
Haberleşme genelde 8 bit üzerinden yapılır. Bu standar asenkron haberleme formatıdır ve 8N1 şeklinde 8 data biti, Noparity ve 1 stop biti şeklinde uygulanır. Sen ise 9 bit haberleşme seçerek standartın dışına çıkmışsın. Sorun olurmu bilemem hiç kullanmadım böyle bir şey. Ama standart sistemle çalışmak her zaman daha az sorun çıkartır onu bilirim.

Yollanan bilgiler de bence eksik.
İlk yollanan bilgiye bakarsak;
SEROUT2 GPIO.4,396,["AA",A]
SEROUT2 GPIO.4,396,["AA",A]
SEROUT2 GPIO.4,396,["AA",A]
3 defa "AA" işareti ardından A bilgisini yollamışsın. Programa bakıyorum  A=TAMISI.LOWBYTE yanlızca 1 byte bilgi.
bence şöyle olmalı, Burada B=TAMISI.HIGHBYTE olduğunu hemenbelirteyim.
SEROUT2 GPIO.4,396,["AA",B,A]  'high byte daima önce yollanmalı
Böylece bir tam bilgi AA işaretinin ardından yollanmış olur.
Alıcı tarafında da bu WAIT("AA"),B,A şeklinde alınırsa sorun kalmamış olur.
Diğer yollananlarıda bu mantığa göre düzeltmende yarar var.

Ete

sinasos

çok teşekkür ederim ETE hocam;
size birde seri iletişim kesildiğinde uyarı nasıl oluşturabilirim onu sorabilirmiyim ?

ete

Seri iletişim için kullanmış olduğun Komut SERIN2 normal şartlarda işlemciyi bloke eder. Daha doğrusu program oradan bir bilgi gelinceye kadar ayrılmaz. Seri iletişim komutlarını söylediğim şekilde değiştirirsen;
serin2 RFAL,396,[WAIT ("AA"),BILGI.HIGHBYTE, BILGI.LOWBYTE]

serin2 RFAL,396,[WAIT ("BB"),C.HIGHBYTE, C.LOWBYTE]

Yalnızca 2 komut beklemesi yapılacaktır. her biri yaklaşık 65535 ms tutarsa program buradan yaklaşık olarak 131 ms sonra geri dönecektir.
İp ucu bu olacak sanırım. GOSUB BILGIAL demeden önce, TMR-1 kesmesini aktive edip 1/1 bölme oranı ile sıfırdan saydırmaya başlarsan 65535 de kesme oluşacak ve program kesme komutuna gidecektir. Kesme işinde genel kaide şöyle, bir kesme oluştuğunda program şayet bir basic komutunu icra ediyor ise o komut bitmeden program kesmeye giremez. Bu durumda en azından 65535 ms sonra program birinci SERIN2 komutunu bitirecek ikinciye geçemeden kesme etiketine gidecektir. Kesme içinde bir değişkeni set edersen (YOK=1 şeklinde) ve her bir serin2 komutundan önce IF YOK=1 then IKAZ dersen ve IKAZ etiketinde seri iletişim kesildi ikazını yaparsan istediğin yerine gelmiş olur.
Biraz karışık oldu gibi ama anlaşılmaz değil. Anlamadı isen yazdıklarımı bir kaç defa oku bir sonuca varırsın sanırım.
Ete

sinasos

Hocam merhaba;
ben aşağıdaki şekilde sistemi yaptım. 628 'de boş yer kalmadı. 2020 byte doldu. Stabil çalışıyor. sadece birkaç dakikada bir ısıyı 2 kat gösteriyor. söylediğiniz gibi 8 bit üzerinden olarak değiştirdim. kesmeyi ilave edersem sığmaz. Başka bir şekilde çözmem mümkün mü ?

Alıcı:


@ DEVICE pic16F628A 'işlemci 16F628a
@ DEVICE pic16F628A, WDT_on 'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_OFF 'Power on timer açık
@ DEVICE pic16F628A, PROTECT_ON 'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF 'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
define OSC 4
DEFINE SER2_BITS 8
include "modedefs.bas" 'SERİN VE SEROUT KOMUTLARININ ÇALIŞMASI İÇİN GEREKLİ KÜTÜPHANE DOSYASI
DEFINE LCD_DREG PORTa
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
define LCD RWREG    PORTB   'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT    1   
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 4000
DEFINE LCD_DATAUS 250
PAUSE 10
LCDOUT $FE,$40,6,9,9,6,0,0,0,0 'Derece gösterimi için özel karakteri LCD'ye yüklüyoruz.
A       VAR WORD
C       VAR WORD
d       var WORD
F       var WORD
G       var WORD

T       VAR BYTE
Y       VAR BYTE
U       VAR BYTE
J       VAR BYTE

VOLT    VAR WORD
MVOLT   VAR word
ONDA1   VAR WORD
ONDA2   VAR WORD
ARA     VAR WORD
DEGER   VAR BYTE
ISARET  VAR BYTE
SYC     var byte
USTISI  VAR BYTE
USTNEM  VAR BYTE
ISIHIS  VAR BYTE
NEMHIS  VAR BYTE

I       VAR BYTE
TAMRUT  VAR WORD
ONDARUT VAR BYTE
TAMISI  VAR WORD
ONDAISI VAR BYTE
control var byte

TRISB=%11110000 'PORTB TAMAMI GIRIS
TRISA=%00000000
CMCON=7 'KOMPARATÖR PİNLERİ DİJİTAL GİRİŞ VEYA ÇIKIŞ
T=0
Y=0
U=0
J=0
symbol buzer=portb.3
symbol yukari=portb.4
symbol MENU=portb.5
symbol asagi=portb.6
SYMBOL RFAL=PORTB.7


BASLANGIC:
'    LCDOUT  $FE,$80,"  RF  KABLOSUZ  "
'    LCDOUT  $FE,$C0,"ISI VE NEM SiST."
    pause 1500
'    LCDOUT  $FE,1:
'    LCDOUT  $FE,$80,"TASARIM ELEKTRNK"
'    LCDOUT  $FE,$C0," 0356.214 63 73 "
'    pause 1500
read 1, USTISI
read 2, USTNEM
read 3, ISIHIS
read 4, NEMHIS

BASLA:
GOSUB GOSTER
GOSUB BILGIAL
GOSUB AKUBAK
GOSUB ISINEMBAK
GOSUB GOSTER

ana:
    if menu=0 then DONUS
IF YUKARI=0 AND ASAGI=0 THEN FABRIKA

GOTO BASLA 'BASLA etiketine dön
FABRIKA:
USTISI=25:WRITE $01,USTISI:PAUSE 2
USTNEM=50:WRITE $02,USTNEM:PAUSE 2
ISIHIS=5: WRITE $03,ISIHIS:PAUSE 2
NEMHIS=5: WRITE $04,NEMHIS:PAUSE 2
GOSUB AYARLANDI
RETURN

ISINEMBAK:
T=USTISI+ISIHIS
Y=USTISI-ISIHIS
U=USTNEM+NEMHIS
J=USTNEM-NEMHIS
IF A>T OR A<Y THEN GOSUB BEEP
IF F>U OR F<J THEN GOSUB BEPBEP
RETURN
BEEP:
    HIGH buzer   
pause 500
     LOW buzer
pause 50       
  RETURN

BEPBEP:
    HIGH buzer   
pause 100
     LOW buzer
pause 50       
     HIGH buzer   
pause 100
     LOW buzer
pause 50       
    HIGH buzer   
pause 100
     LOW buzer
pause 50       
    HIGH buzer   
pause 100
     LOW buzer
pause 50       

  RETURN
 
   
BILGIAL:
serin2 RFAL,396,[WAIT ("AA"),A.LOWBYTE]  'ISI BİLGİSİ
serin2 RFAL,396,[WAIT ("BB"),A.HIGHBYTE] 'ISI BİLGİSİ
serin2 RFAL,396,[WAIT ("CC"),C.LOWBYTE]  'PİL SEVİYESİ
serin2 RFAL,396,[WAIT ("DD"),C.HIGHBYTE] 'PİL SEVİYESİ
serin2 RFAL,396,[WAIT ("FF"),F.LOWBYTE]  'NEM BİLGİSİ
serin2 RFAL,396,[WAIT ("GG"),F.HIGHBYTE] 'NEM BİLGİSİ

IF A>0 THEN
ISARET="+"
ELSE
ISARET="-"
ENDIF

RETURN

AKUBAK:
C=C+1
d=c*3
    volt=(d*/1250)/100
    mvolt=volt//10
    mvolt=mvolt+1
    volt=volt/10
IF MVOLT>9 THEN
VOLT=VOLT+1
MVOLT=0
ENDIF
IF MVOLT>11 THEN
VOLT=VOLT-1
MVOLT=9
ENDIF

RETURN

GOSTER:
'LCDOUT $FE,$1,"T:",Dec2 T,"Y:",Dec2 Y,"U:",Dec2 U,"J:",Dec2 J
if c<477 then
LCDOUT $FE,$1,"Pil Bitiyor:",Dec1 VOLT,",",DEC1 MVOLT," " 'LCD ekranın alt satırını temizle
else
LCDOUT $FE,$2,"Pil = ",Dec1 VOLT,",",DEC1 MVOLT," Volt  " 'LCD ekranın alt satırını temizle
endif

LCDOUT $FE,$C0,"ISI:",ISARET,DEC2 A,"  ","NEM:","%",DEC2 F',dec2 volt,",",dec1 mvolt
PAUSE 50
RETURN



donus:
read 1, USTISI
read 2, USTNEM
read 3, ISIHIS
read 4, NEMHIS
GOSUB TEMIZLE
LCDOUT $FE,$1, "  MENU  GiRiSi  "
PAUSE 1500
AYARLA:
LOW buzer
WHILE MENU=0:WEND
GOSUB TEMIZLE
SYC=0
AYARLAR:
IF YUKARI=0 THEN
WHILE YUKARI=0:WEND
SYC=SYC+1
  IF SYC=5 THEN SYC=0
ENDIF

IF ASAGI=0 THEN
WHILE ASAGI=0:WEND
SYC=SYC-1
  IF SYC=255 THEN SYC=4
ENDIF

SELECT CASE SYC
CASE 0         
LCDOUT $FE,$80, "   ISI AYARI    "
LCDOUT $FE,$C0, " ISI : ",dec2 USTISI,".0 C    "
IF MENU=0 then
WHILE MENU=0:WEND
GOTO bir
ENDIF
CASE 1         
LCDOUT $FE,$80, "    NEM AYARI   "
LCDOUT $FE,$C0, " NEM : ",dec USTNEM ," %      "
IF MENU=0 then
WHILE MENU=0:WEND
GOTO IKI
ENDIF
CASE 2         
LCDOUT $FE,$80, "  ISI HiSTERi   "
LCDOUT $FE,$C0, "HiSTERi : ",dec ISIHIS ,"      "
IF MENU=0 then
WHILE MENU=0:WEND
GOTO UC
ENDIF
CASE 3         
LCDOUT $FE,$80, "  NEM HiSTERi   "
LCDOUT $FE,$C0, "HiSTERi : ",dec NEMHIS ,"      "
IF MENU=0 then
WHILE MENU=0:WEND
GOTO DORT
ENDIF

CASE 4
lcdout $fe,$80,"    MENUDEN     "
LCDOUT $FE,$C0,"     CIKIS      "
IF MENU=0 THEN AYARLANDI
END SELECT
GOTO AYARLAR
'------------------------------ BUZER SESİ -------------------------------------
BIP:
    HIGH buzer   
pause 50
     LOW buzer
pause 50       
  RETURN
BIPBIP:
     HIGH buzer   
    PAUSE 50
      LOW buzer
    PAUSE 100
     HIGH BUZER
    PAUSE 50
      LOW BUZER
'    PAUSE 100   
RETURN

AYARLANDI:
           IF MENU=0 then AYARLANDI
       lcdout $fe,1
       LCDOUT $FE,$C0,"AYAR KAYDEDiLDi."
       GOSUB BIPBIP
       SYC=0
       PAUSE 800
       
        GOSUB TEMIZLE
        goto BASLANGIC       

'********************************* menü kısmı *****************************************
BIR:   
SET1: 
           LCDOUT $FE,$C0, "=>ISI : ",dec2 USTISI,".0 C    "
           IF YUKARI=0 then
                USTISI=USTISI+1
                ENDIF
              IF USTISI=100 THEN USTISI=0
              PAUSE 125
           
           IF ASAGI=0 then
                USTISI=USTISI-1
                ENDIF
              IF USTISI=255 THEN USTISI=25
              PAUSE 125

               
         IF MENU=0 THEN
         WRITE $01,USTISI:PAUSE 2
         GOTO ayarla
         ENDIF

    GOTO SET1
IKI:     
set2:
            LCDOUT $FE,$C0, "=>NEM : ",dec USTNEM ," %      "
            IF YUKARI=0 then
                USTNEM=USTNEM+1
                ENDIF
              IF USTNEM=100 THEN USTNEM=0
              PAUSE 125
           IF ASAGI=0 then
                USTNEM=USTNEM-1
                ENDIF
              IF USTNEM=255 THEN USTNEM=50
              PAUSE 125
         IF MENU=0 THEN
         WRITE $02,USTNEM:PAUSE 2
         GOTO AYARLA
         ENDIF
    GOTO SET2       
UC:     
set3:
            LCDOUT $FE,$C0, "=>HiSTERi : ",dec ISIHIS ," C      "
            IF YUKARI=0 then
                ISIHIS=ISIHIS+1
                ENDIF
              IF ISIHIS=100 THEN ISIHIS=0
              PAUSE 125
           IF ASAGI=0 then
                ISIHIS=ISIHIS-1
                ENDIF
              IF ISIHIS=255 THEN ISIHIS=5
              PAUSE 125
         IF MENU=0 THEN
         WRITE $03,ISIHIS:PAUSE 2
         GOTO AYARLA
         ENDIF
    GOTO SET3       


DORT:     
set4:
            LCDOUT $FE,$C0, "=>HiSTERi : ",dec NEMHIS ," %      "
            IF YUKARI=0 then
                NEMHIS=NEMHIS+1
                ENDIF
              IF NEMHIS=100 THEN NEMHIS=0
              PAUSE 125
           IF ASAGI=0 then
                NEMHIS=NEMHIS-1
                ENDIF
              IF NEMHIS=255 THEN NEMHIS=5
              PAUSE 125
         IF MENU=0 THEN
         WRITE $04,NEMHIS:PAUSE 2
         GOTO AYARLA
         ENDIF
    GOTO SET4       

goto ana

temizle:
LCDOUT  $FE,1
return


END


Verici:



@ DEVICE pic12F675 'işlemci 12F675
@ DEVICE pic12F675, WDT_ON              'Watch Dog timer açık
@ DEVICE pic12F675, PWRT_ON  'Power on timer açık
@ DEVICE pic12F675, PROTECT_OFF  'Kod Koruma kapalı
@ DEVICE pic12F675, MCLR_OFF      'MCLR pini kullanılMIYOR.
@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
DEFINE OSCCAL_1K 1  'bu  komut mutlaka olacak OSCCAL değerini yeniden pice yazdırıyor
DEFINE OSC 4
DEFINE SER2_BITS 8
DEFINE ADC_BITS 10    ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 1    ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 100 ' ADC sampling time (uSec)
include "modedefs.bas"
OPTION_REG.7=0
CMCON = 7
ANSEL = %00010011
ADCON0=%10000000
GPIO=0
TRISIO=%00000011
WPU=0
TRISIO.4=0
SENSOR  VAR GPIO.5 'Sensör PORTB.7'ye bağlı
LED     VAR GPIO.1
SERIVER VAR GPIO.4

MESGUL VAR BYTE 'Çeşitli değişken tanımlamaları
'BILGI VAR WORD
A VAR BYTE
B VAR BYTE
C VAR WORD
D var byte
E VAR BYTE
F var BYTE
G VAR BYTE
J VAR BYTE
I       VAR BYTE
TAMRUT  VAR WORD
ONDARUT VAR BYTE
TAMISI  VAR WORD
ONDAISI VAR BYTE
control var byte
ISARET  VAR BIT
J=0
high LED:PAUSE 500
LOW LED:PAUSE 500
high LED:PAUSE 500
LOW LED:PAUSE 500
high LED:PAUSE 500
LOW LED

BASLA: 'Dongüye gir.
GOSUB ADCOKU
GOSUB SENSOROKU
GOSUB GONDER
'IF J=10 THEN
gosub SINYAL
'GOSUB SAY
GOTO BASLA

SAY:
J=J+1
IF J=>20 THEN J=0
RETURN

ADCOKU:
ADCIN 0,C
d=C.LOWBYTE
E=C.HIGHBYTE
RETURN

SENSOROKU:
           output SENSOR
           SENSOR=1:PAUSEUS 5
           SENSOR=0
           pause 5      '1-10 ms bekle
           SENSOR=1         'Data pinini High yap
           Pauseus 40      '40 us bekle
           INPUT SENSOR
           PAUSEUS 5
           WHILE SENSOR=0:WEND
           PAUSEUS 80

             TAMRUT=0
            FOR I=15 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
              WHILE SENSOR=0:WEND 
               Pauseus 30
              IF SENSOR=1 then TAMRUT.0[I]=1
              while SENSOR=1:wend
              Next

            TAMISI=0
            FOR I=15 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
              WHILE SENSOR=0:WEND
               Pauseus 30
              IF SENSOR=1 then TAMISI.0[I]=1
              while SENSOR=1:wend
            Next           

            control=0
           
            FOR I=7 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
              WHILE SENSOR=0:WEND
               Pauseus 30
              IF SENSOR=1 then control.0[I]=1
              while SENSOR=1:wend 
            Next
           
            output SENSOR
            SENSOR=0
          IF TAMISI.BIT15=1 THEN
          TAMISI=TAMISI-48
          ISARET="-"
          ONDARUT=TAMRUT//10
          TAMRUT=TAMRUT/10
          ONDAISI=TAMISI//10
          TAMISI=TAMISI/10
           ELSE
           ISARET="+"
          ONDARUT=TAMRUT//10:TAMRUT=TAMRUT/10':[TAMRUT.LOWBYTE,TAMRUT.HIGHBYTE]
          ONDAISI=TAMISI//10:TAMISI=TAMISI/10':[TAMISI.LOWBYTE,TAMISI.HIGHBYTE]
          ENDIF
         
         
return




GONDER:
A=TAMISI.LOWBYTE
B=TAMISI.HIGHBYTE
D=C.LOWBYTE
E=C.HIGHBYTE           
F=TAMRUT.LOWBYTE
G=TAMRUT.HIGHBYTE

SEROUT2 SERIVER,396,["AA",A]'ISI LOWBYTE
SEROUT2 SERIVER,396,["AA",A]'ISI LOWBYTE
SEROUT2 SERIVER,396,["AA",A]'ISI LOWBYTE
'SEROUT2 SERIVER,396,["AA",B,A]'ISI LOWBYTE
SEROUT2 SERIVER,396,["BB",B]'ISI HIGHBYTE
SEROUT2 SERIVER,396,["BB",B]'ISI HIGHBYTE
SEROUT2 SERIVER,396,["BB",B]'ISI HIGHBYTE

SEROUT2 SERIVER,396,["CC",D]'PİL LOWBYTE
SEROUT2 SERIVER,396,["CC",D]'PİL LOWBYTE
SEROUT2 SERIVER,396,["CC",D]'PİL LOWBYTE
'SEROUT2 SERIVER,396,["CC",E,D]'PİL LOWBYTE
SEROUT2 SERIVER,396,["DD",E]'PİL HIGHBYTE
SEROUT2 SERIVER,396,["DD",E]'PİL HIGHBYTE
SEROUT2 SERIVER,396,["DD",E]'PİL HIGHBYTE

SEROUT2 SERIVER,396,["FF",F]'NEM LOWBYTE
SEROUT2 SERIVER,396,["FF",F]'NEM LOWBYTE
SEROUT2 SERIVER,396,["FF",F]'NEM LOWBYTE
'SEROUT2 SERIVER,396,["FF",G,F]'NEM LOWBYTE
SEROUT2 SERIVER,396,["GG",G]'NEM HIGHBYTE
SEROUT2 SERIVER,396,["GG",G]'NEM HIGHBYTE
SEROUT2 SERIVER,396,["GG",G]'NEM HIGHBYTE
PAUSE 750
RETURN

SINYAL:
high LED
pause 10
low LED
pause 750
RETURN
END


ete

Seri komutlarında dediğim kısaltmaları yapsan epeyce bir kod tasarrufu sağlardın. O tür haberleşme sağlıklı değil ve gereksiz uzun. Timer için haberleşmeye girmeden sıfırlayıp gerekirse kesmeyi aktif etmeden her seri komut sonunda pır1.0=1 olmusmu bakman yeterli olur. 1 olmuş ise haberleşme kesilmiştir. Bunu her seri komuta uygulaman ve her sıfırlamada pır1.0=0 yapman gerekir.
Ete

sinasos

ETE Hocam merhaba;
dht 11 ve ds18b20 ile ısı ve nem ölçümü yaptım dht 11 ile ondalık kısmı bir türlü okuyamıyorum. 1. sorun bu ! 2. ve önemli olanı ise sensör kalibrasyonu için bir menü oluşturmam gerekiyor. nasıl bir algoritma oluşturabilirim ? örneğin sensör 21 gösterirken gerçek ısı 22.3 C olsun aradaki 1.3 C farkı menü üzerinden nasıl bir algoritma oluşturayım bilemedim? yardımcı olursanız çok sevinirim.
saygılarımla.



DHT11:
output  dta
LOW     dta
    Pause   18      '18 ms bekle
HIGH    dta         'Data pinini High yap
    Pauseus 40      '40 us bekle
input   dta
WHILE   dta=0:WEND
PAUSEUS 85

IF dta=1 then RETURN

TAMRUT=0
FOR I=7 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE dta=0:WEND 
  Pauseus 40
  IF dta=1 then TAMRUT.0[I]=1
  while dta=1:wend
Next

ONDARUT=0
FOR I=7 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE dta=0:WEND
   Pauseus 40
  IF dta=1 then ONDARUT.0[I]=1
  while dta=1:wend
Next

TAMISI=0
FOR I=7 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE dta=0:WEND
    Pauseus 40
  IF dta=1 then TAMISI.0[I]=1
  while dta=1:wend 
Next

ONDAISI=0
FOR I=7 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE dta=0:WEND 
   Pauseus 40
  IF dta=1 then ONDAISI.0[I]=1
  while dta=1:wend
 
Next

control=0
FOR I=7 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
  WHILE dta=0:WEND
   Pauseus 40
  IF dta=1 then control.0[I]=1
  while dta=1:wend
 
Next
      return


EKRAN1:

        lcdout $FE,$80, "I:",DEC2 TAMISI,".",DEC1 ONDAISI,0," N:%",DEC2 TAMRUT,".",DEC1 ONDARUT
        RETURN

DHT11 de Bu şekilde okuma yapıyorum ancak onda kısımlarını göremiyorum !


ISIKALIBRE:
       GOSUB TEMIZLE
       READ $07,FARKISI
       READ $08,FARKONDA       
KALIBRE_AYAR:
lcdout $fe,$80,"ISI KALiBRASYONU"
LCDOUT $FE,$C0,"=> ",FARKISARET1," ",DEC2 FARKISI,",",DEC1 FARKONDA,0,"C   "
           IF YUKARI=1 then
           IF FARKONDA=255 then FARKONDA=0
           IF FARKISI=255 THEN FARKISI=10
           FARKONDA=FARKONDA+1:pause 100
           IF FARKONDA=10 THEN
           FARKONDA=0:FARKISI=FARKISI+1
           IF FARKISI=20 THEN FARKISI=10
               IF FARKISI=>10 THEN
               FARKISARET1="+"
               ELSE
               FARKISARET1="-"
               ENDIF
              PAUSE 250
           ENDIF
           ENDIF
           IF ASAGI=1 then
           IF FARKONDA=255 then FARKONDA=0
                IF FARKISI=255 THEN FARKISI=10
           FARKONDA=FARKONDA-1:pause 100
           IF FARKONDA=255 THEN
           FARKONDA=9:FARKISI=FARKISI-1
           IF FARKISI=255 THEN FARKISI=20
               IF FARKISI=>10 THEN
               FARKISARET1="+"
               ELSE
               FARKISARET1="-"
               ENDIF
           PAUSE 250
           ENDIF
           ENDIF
         IF MENU=1 THEN
         WRITE $07,FARKISI:PAUSE 2
         WRITE $08,FARKONDA:PAUSE 2
         GOTO AYAR_MENUSU
         ENDIF
GOTO KALIBRE_AYAR:


Bu kısmı kalibre için menü olarak koydum. Ama nasıl bir algoritma yapmam lazım bilemedim !

ete

Öncelikle doğru okuma yapabildiğinden emin olman gerekir. Bunun için bilginin nasıl alınıp da değerlendirildiğini bilmende yarar var. Örnekle açıklayayım.
Sıcaklık=23,8 derece olduğunu varsayalım.
Bunu DHT den okuduğun zaman aslında 16 bit şeklinde 238 olarak okuman gerekiyor.
Pek çok kişi 16 bitlik Sıcaklık değerinin ilk 8 biti Tam sayı kısmını kalan 8 bit de ondalık kısmını veriyor gibi yanlış bir düşünce içerisinde.
Bu nedenle bance işin doğrusu senin yaptığın gibi bu okumayı 8 bit - 8 bit olarak değil de 16 bit olarak yapmak gerek.
Sonra Ondalık= TAMISI//10 ve ISI=TAMISI/10 şeklinde tam ve ondalık kısımları hesaplamak gerekir.
Ondlaık kısım için bir kalibrasyon menüsü yapmak bana hiç mantıklı gelmedi. Nerden  biliyorsun okuduğunun daha doğru olmadığını.
Doğru okuma ve değerlendirme kod parçası aşağıdadır. Burada OSC frekansı 4 Mhz dir.
SENSOROKU:     
           HIGH DTA:PAUSEus 5
           dta=0
           Pause 5      '1-10 ms bekle
           DTA=1         'Data pinini High yap
           Pauseus 40      '40 us bekle
           input DTA
           pauseus 5
           SAYAC=0
           WHILE DTA=0
             SAYAC=SAYAC+1
             PAUSEUS 5
             IF SAYAC=255 THEN CIK 'RETURN
           WEND
           
           PAUSEUS 80
           IF DTA=1 then hata

           TAMRUT=0
            FOR I=15 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
               SAYAC=0
               WHILE DTA=0
                 SAYAC=SAYAC+1
                 @ NOP
                 @ NOP
                 @ NOP
                 @ NOP
                 @ NOP
                 IF SAYAC=255 THEN CIK 'RETURN
               WEND
             
               Pauseus 30
              IF DTA=1 then TAMRUT.0[I]=1
                SAYAC=0           
                WHILE DTA=1
                  SAYAC=SAYAC+1
                  PAUSEUS 5
                  IF SAYAC=255 THEN CIK 'RETURN
                WEND
             Next

            TAMISI=0
            FOR I=15 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
               SAYAC=0
               WHILE DTA=0
                 @ NOP
                 @ NOP
                 @ NOP
                 @ NOP
                 @ NOP
                 IF SAYAC=255 THEN CIK 'RETURN
               WEND
               Pauseus 30
              IF DTA=1 then TAMISI.0[I]=1
                SAYAC=0
                WHILE DTA=1
                  SAYAC=SAYAC+1
                  PAUSEUS 5
                  IF SAYAC=255 THEN CIK 'RETURN
                WEND                           
            Next           

            control=0
            FOR I=7 to 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
              SAYAC=0
              WHILE DTA=0
                 @ NOP
                 @ NOP
                 @ NOP
                 @ NOP
                 @ NOP
                 IF SAYAC=255 THEN CIK 'RETURN
              WEND
             
              Pauseus 30
              IF DTA=1 then control.0[I]=1
                SAYAC=0
                WHILE DTA=1
                  SAYAC=SAYAC+1
                  PAUSEUS 5
                  IF SAYAC=255 THEN CIK 'RETURN
                WEND             
             
            Next
CIK:           
            output dta
            dta=1
            pauseus 50
            dta=0                         
            return


EKRAN:
      ONDARUT=TAMRUT//10:TAMRUT=TAMRUT/10
      ONDAISI=TAMISI//10:TAMISI=TAMISI/10
      LCDOUT $FE,$80,"NEM=",DEC TAMRUT,",",DEC ONDARUT
      LCDOUT $FE,$C0,"ISI=",dec TAMISI,",", DEC ONDAISI

      PAUSE 100
      RETURN


sinasos

ilginize çok teşekkür ederim hocam,
Kullandığım sensör DHT11 ama sanırım sizin hazırladığınız DHT22 için.

Doğruluk için ise kabul edilen kalibrasyon belgesine sahip ölçüm cihazlarını kullanarak sonuca ulaşmak istiyoruz. bu cihazdan elimizde var Trotech marka. onun ölçümü ile bizim ölçümümüz arasında 2 derece civarında fark var. o yüzden koymak istiyorum.
Saygılarımla.

Powered by EzPortal