Raspberry Pi özellikli çoklu sıcaklık sensörleri


19

Raspberry Pi ile bir sıcaklık sensörü kullanmak için birçok örnek gördüm, ancak 5-6 sıcaklık sensörünü Raspberry Pi ile nasıl çoğaltabilirim? Aynı anda birkaç kaynaktan sıcaklığı okumak istiyorum.

Raspberry Pi üzerindeki GPIO pinlerini her sensörden okumak için atayabilir miyim, temelde bir sensör için aynı yapılandırmayı çoğaltabilir miyim, yoksa tüm sensörlerin takacağı ve buna paralel olarak veri gönderecek bir çeşit çoklayıcıya ihtiyacım var mı? Ahududu Pi için?


1
Gönderen veri sayfası : "Her DS18B20 aynı 1-Wire otobüse çalışması için birden fazla DS18B20s sağlayan eşsiz bir 64-bit seri kodu vardır.". Veri sayfasını okumayı deneyin (her şeyi anlamadıysanız endişelenmeyin).
Gerben

Yanıtlar:


18

Sensörünüzün bir DS18B20 ve 1 telli bir devre olduğu ve 1 telli aynı veri yolunda birden fazla adresleme yapabilen ve 1 telli sıcaklık çekirdek modülünün 10 sıcaklık sensörünü okuyabildiği bir protokol olduğu göz önüne alındığında aynı otobüste. ( sürücü kaynak kodunun 49. satırını kontrol edin ).

Sensörlerinizin 10 tanesini aynı 3 pime (3v3, GND ve 1 telli IO pimine - konektördeki 4 numaralı pim (bu sürücüde sabit olarak kodlanmıştır!) Bağlarsanız ve çıkışlarını / sys / bus / w1 / cihazlar / 28 * / w1_slave burada 28 * bireysel benzersiz 1 telli adres. Adafruit mükemmel öğretici kontrol edin . Veri pimi yukarı çekerek 4K7 direnç unutmayın (4 numaralı - SADECE!) Pi'nin dahili olarak çekilmesi kabaca 50K verdiğinden ve bu sensör için çok fazla olduğundan, bu ekstra bileşene ihtiyacınız olacak.

Sadece parazit gücü kullanmaya çalışmadığınızdan emin olmalısınız. Tüm cihazların 3 pimini bağlarsanız, iyi olmalısınız.


Hey, şu anda bazı DS18B20'lerle 10 sensörlü bir sıcaklık kaydedici tasarım sürecindeyim, parazit güç biti dışında yukarıda söylediklerinizi aldım: You should just make sure you are not trying to use parasitic power.Bununla ne demek istiyorsun? Pi'nin GPIO'sundaki pin1'den 3.3V yerine harici bir güç kaynağı kullanmam gerekir mi? Yoksa 3V3'ü değil, sadece GND + Verilerini kullanırsam parazit gücü mü? - kullanıcı adınıza hot-link vermeyi reddetti :-(
Jim

2
@Jim Parazit gücü DS18B20'nin bir özelliği olup, VCC'ye değil veri yoluna yalnızca GND ve IO pinlerini bağlarsınız. Marco Poli, bu modda çalıştırmamanız gerektiğini söylüyor, bunun yerine DS18B20'lerden Pi'ye 3 kabloyu bağlıyor. Harici bir güç kaynağına ihtiyacınız olmayacak.
NoChecksum

Merhaba yorumunuzla ilgili olarak, this is hardcoded in the driverbu, sıcaklık sensörlerini farklı bir GPIO pinine (veya birden fazla GPIO pinine) bağlamanın işe yaramayacağı anlamına mı geliyor?
Bprodz

4

Referans için, burada 1 telli GPIO'yu ısırmak ve ilk sensör için sıcaklık değerini döndürmek için Python'un kısa bir snippet'i. Bir liste veya benzeri bir şey olarak bağlı tüm sensörler için temps döndürmek için değiştirilecek kadar basit olmalıdır.

import subprocess, time

def read_onewire_temp():
    '''
    Read in the output of /sys/bus/w1/devices/28-*/w1_slave
    If the CRC check is bad, wait and try again (up to 20 times).
    Return the temp as a float, or None if reading failed.
    '''
    crc_ok = False
    tries = 0
    temp = None
    while not crc_ok and tries < 20:
        # Bitbang the 1-wire interface.
        s = subprocess.check_output('cat /sys/bus/w1/devices/28-*/w1_slave', shell=True).strip()
        lines = s.split('\n')
        line0 = lines[0].split()
        if line0[-1] == 'YES':  # CRC check was good.
            crc_ok = True
            line1 = lines[1].split()
            temp = float(line1[-1][2:])/1000
        # Sleep approx 20ms between attempts.
        time.sleep(0.02)
        tries += 1
    return temp

çalıştırmak için ithalat alt işleminin içe aktarma süresine ihtiyacı var
Paul Anderson

2

1 telli bir otobüsle konuşmak acı verici olabilir. İster 1 sensörle ister 100 ile konuşun, zamanlama hakkında düşünmeniz gerekir. Birkaç yıl önce DS18B20 için bir kod yazdım, ama Meclis'te. Herhangi bir faydası varsa, burada:

;***************************************************************
;Title:     Temperature Logger
;Description:   Polls temperature every two seconds and returns a value
;       in degC as well as the slope (rising, falling, steady)
;***************************************************************
Screen  EQU $F684
;System Equates
PortA   EQU $0000
DDRA    EQU $0002
;Program Equates
TxPin   EQU %00000001
RxPin   EQU %00000010
IntPin  EQU %10000000
;Commands
SkipROM EQU $CC
Convert EQU $44
ReadPad EQU $BE
;Constants
ASCII_0 EQU 48
Poll_D  EQU 2000
;Macros
TxOn    macro    ; Send the 1-wire line Low
    MOVB    #TxPin,DDRA
    MOVB    #$00,PortA
    endm

TxOff   macro    ;Releases the 1-wire line letting it return to High.
    MOVB    #$00,DDRA
    endm


;-------------------------------------
;Main 
;-------------------------------------
    ORG $0D00

        ; Clear registers and initialise ports
Start:  MOVB    #$00, DDRA
Main:   LDD     #$00
        JSR     Init
        LDAA    #SkipROM
        JSR     Write
        LDAA    #Convert
        JSR     Write
        JSR     Wait
        JSR     Init
        LDAA    #SkipROM
        JSR     Write
        LDAA    #ReadPad
        JSR     Write
        JSR     Read    ; read first 8 bits
        TFR     A, B
        JSR     Read    ; read second 8 bits
        ; Convert bytes to BCD
        LSRB
        LSRB
        LSRB
        LSRB
        STD     TempNew
        PSHA
        PSHB
        LDAB    #6
        MUL
        TBA
        PULB
        ABA
        CLRB
Conv_Lp:SUBA    #10
        BMI     Conv_Dn
        INCB
        BRA     Conv_Lp
Conv_Dn:ADDA    #10
        TFR     A, Y
        PULA
        ABA
        TFR     Y, B
        ; convert BCD bytes to ASCII and store in temp register
        LDX     #Temp
        ADDA    #ASCII_0
        STAA    0, X
        INX
        ADDB    #ASCII_0
        STAB    0, X
        LDX     #OutUp  ; print 'The current temp is '
        JSR     Echo
        LDX     #Temp   ; print ASCII bytes
        JSR     Echo
        ; compare stored temp with previously stored and print 'rising', 'falling' or 'steady'
        LDD     TempNew
        SUBD    TempOld
        BGT     Rising
        BEQ     Same
        LDX     #Fall
        BRA     EchDir
Rising: LDX     #Rise
        BRA     EchDir
Same:   LDX     #Steady
EchDir: JSR     Echo
        ; wait 2 seconds
        LDX     #Poll_D
Bla_Lp: JSR     Del1ms
        DBNE    X, Bla_Lp
        ; set new temp as old temp and loop
        LDD     TempNew
        STD     TempOld
        JMP     Main
        SWI


;-------------------------------------
;Subroutines
;-------------------------------------
Init:   TxOn        ; turn pin on
        uDelay  500 ; for 480us
        TxOff       ; turn pin off
        uDelay  70  ; wait 100us before reading presence pulse
        JSR Wait
        RTS
Wait:   LDX #120
Wait_Lp:JSR Del1ms
        DBNE    X, Wait_Lp
        RTS

Write:  PSHX
        PSHA
        LDX     #8  ; 8 bits in a byte
Wr_Loop:BITA    #%00000001
        BNE     Wr_S1   ; bit is set, send a 1
        BEQ     Wr_S0   ; bit is clear, send a 0
Wr_Cont:LSRA    ; shift input byte
        uDelay  100
        DBNE    X, Wr_Loop  ; shifted < 8 times? loop else end
        BRA     Wr_End
Wr_S1:  TxOn    ; on for 6, off for 64
        uDelay  6
        TxOff
        uDelay  64
        BRA     Wr_Cont
Wr_S0:  TxOn    ; on for 60, off for 10
        uDelay  60
        TxOff
        uDelay  10
        BRA     Wr_Cont
Wr_End: PULA
        PULX
        RTS

Read:   PSHB
        LDAB    #%00000001
        CLRA
Rd_Loop:TxOn    ; on for 6, off for 10
        uDelay  6
        TxOff
        uDelay  10
        BRSET   PortA, #RxPin, Rd_Sub1  ; high? add current bit to output byte
Rd_Cont:uDelay  155 ; delay and shift.. 0? shifted 8 times, end
        LSLB
        BNE     Rd_Loop
        BRA     Rd_End
Rd_Sub1:ABA 
        BRA     Rd_Cont
Rd_End: PULB
        RTS

uDelay  macro    ;Delay a mutliple of 1us (works exactly for elays > 1us)
        PSHD
        LDD   #\1
        SUBD  #1
        LSLD
\@LOOP  NOP
        DBNE  D, \@LOOP
        PULD
        endm

;-------------------------------------
;General Functions
;-------------------------------------
; delays
Del1us: RTS

Del1ms: PSHA
        LDAA    #252
Del_ms: JSR     Del1us
        JSR     Del1us
        JSR     Del1us
        CMPA    $0000
        CMPA    $0000
        NOP
        DECA
        BNE     Del_ms
        CMPA    $0000
        NOP
        PULA
        RTS

; display text from address of X to \0
Echo:   PSHY
        PSHB
        LDAB    0, X
Ech_Lp: LDY Screen
        JSR 0, Y
        INX
        LDAB    0, X
        CMPB    #0
        BNE Ech_Lp
        PULB
        PULY
        RTS

Interrupt:
        SWI
        RTI

;-------------------------------------
;Variables
;-------------------------------------
    ORG   $0800
OutUp:  DC.B    'The current temperature is ', 0
Rise:   DC.B    ' and Rising', $0D, $0A, 0
Steady: DC.B    ' and Steady', $0D, $0A, 0
Fall:   DC.B    ' and Falling', $0D, $0A, 0
Temp:   DS  2
    DC.B    0
TempOld:DS  2
TempNew:DS  2

3
Raspberry pi, zaten 1 telli bir çekirdek modülüne ve özellikle 1 telli sıcaklık sensörleri için (de DS18B20'yi içeren) bir çekirdek modülüne sahiptir. Sadece modülleri yükleyin ve sıcaklık normal bir dosya okuma komutuyla bir dosyadan okunur. Hazır modülleri kullanmayı seçerseniz, protokolü manuel olarak uygulamanız gerekmez.
Marco Poli

2

İlgileniyorsanız, bir Ahududu Pi ve bir Pyhton kodu ile bir DS18B20 sıcaklık sensörü (yukarıda belirtildiği gibi Pi'de aynı GPIO pinini kullanarak istediğiniz kadar zincirlenebilir) kullanmak için yazdığım bir kılavuz Bir web sitesindeki grafik ve şemalarda sıcaklıkları toplayan ve görüntüleyen RESTful hizmeti. Belirtilen GitHub hesabındaki tüm kodlar herkese açık. http://macgyverdev.blogspot.se/2014/01/weather-station-using-raspberry-pi.html


1

Ne tür bir sıcaklık sensörü kullanıyorsunuz? DS18B20 gibi bir şeyiniz varsa, o kadar çok tane varsa, 18446744073709551615 sensöre kadar zincirleyebilirsiniz.


Sensör aslında bir DS18B20 tipidir, ancak zincirleme ile kastedileni detaylandırabilir ve mümkünse böyle bir tekniğin uygulanması için bir kaynağa işaret edebilirsiniz. Eğer zincirlenmişlerse sensör girişleri arasında nasıl bir ayrım yapılır? Almam gerekiyor ve grafik sıcaklık sensörü 1, sıcaklık sensörü 2 .... sıcaklık sensörü n çıkışı.
jc303

2
@JadCooper'ın her ds18b20 sensörünün içinde 16 bit seri numarası vardır. Bununla bir sensörü ele aldığınızda, yalnızca bu sensörden veri döndürür. (Bu öğretici) Bkz [ learn.adafruit.com/... pi bunları kullanmak için
TheDoctor

0

Cevaplamak:

5-6 sıcaklık sensörlerini Raspberry Pi'ye nasıl çoğaltabilirim?

Pi'ye bağlanmak için çeşitli otobüslere sahip alabileceğiniz modüllerde eklenti vardır.
Bu video hızlarını karşılaştırıyor: https://www.youtube.com/watch?v=YbWidNBycls Birden çok sensörle iletişim kurarak birden fazla GPIO elde etmek için yeniden derlenmiş bir çekirdek kullanıyor. Nasıl elde ettiğine dair sonuçlarını yayınlamadı. Ancak sadece bir pim kullanmak yerine çoğullamak mümkündür.

Güncelleme. Şimdi gönderdi. 81 sensörü 9 ayrı GPIO'ya bağladı ve tüm sıcaklıkları 3 saniyenin altında elde edebildi: https://www.youtube.com/watch?v=JW9wzbp35w8


0

çoklu sensörü okumak için ideal yol I2C sensörleri kullanmaktır.

çoklu sensörleri birbirine bağlamanın tek yolu budur veya analog sensörleri kullanabilirsiniz, ancak çok fazla analog pin alacaktır, ancak i2c sadece 2 hat kullanacaktır. Pi2 / 3 kullandığınızı varsayalım, o zaman I2C portuna sahip bir ahududu Pi şapkası almanızı öneririz, böylece tüm i2c cihazlarınızı saniyeler içinde Pi'ye bağlayabilir ve donanımınızın doğru olduğundan emin olursunuz.

şimdi bir I2C adpter ile Pi sensör parçası üzerinde hareket edelim var. TI, AD, NXP, freescale ve diğer birçok şirket I2C ile sıcaklık sensörü yapar, ancak iki sensörden daha fazla bir sensör bağlamak istersiniz.

  1. Farklı I2C adresli 6 farklı I2C sensörü alın, aynı adrese sahip iki sensörünüz varsa işe yaramaz.

  2. adres hattı ile sensörler alabilir ve sadece adresi değiştirebilir ve herhangi bir adres çakışması olmadan bunları Pi ile bağlayabilirsiniz. Bu TMP 100 sensörünü kullanmanızı öneririm , bunu tercih ederim çünkü kayan adres hattı desteğine sahip 2 adres hattı vardır, böylece 6 sensörü bir i2c hattı ile bağlayabilirsiniz.

aynı sensörleri kullanmanın avantajı, kodunuzu yazmak için 6 veri sayfasını okumak zorunda olmamanızdır, bir veri sayfasını incelemeniz ve kodu kolayca yazmanız gerekir. tüm sensörleriniz aynıysa, karşılaştırmak için daha iyi sonuçlara sahip olursunuz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.