Ostatnio opisywałem czujnik LM75A, który jest banalny do podłączenia do Raspberry Pi i który jest banalny do odczytu za pomocą prostego skryptu w pythonie. Dzisiaj wgryziemy się w kod:

Zaczniemy od tego co lubię najbardziej: KOD. Najszybciej zaczniemy wpisując w terminalu

nano temperature.py

i zaczniemy kodować (rozumiem, że i2c jest skonfigurowane):


import smbus

sensorAddress = 0x48
i2c = smbus.SMBus(1)

print i2c.read_word_data(sensorAddress,0)

Czyli po kolej: importujemy bibliotekę smbus (zainstalowaną wcześniej)
podajemy adres czujnika (i2cdetect –y 1 żeby sprawdzić czy mamy coś podpięte i pod jakim adresem)

tworzymy obiekt reprezentujący szynę i2c (w raspberry pi rev2 jako parametr podajemy 1, w rev1 0)

i odczytujemy temperaturę. Wychodzimy z edytora i uruchamiamy skrypt:

python temperature.py

i mamy odczyt. Banalnie prosto. 🙂

A jeśli dziwi Cię dlaczego ten odczyt jest taki dziwny to dlatego, że odczytaliśmy surową wartość w formie jakiej wypluł czujnik. To jak to jest kodowane o co oznacza pisałem ostatnio zatem kod parsujący temperaturę z LM75A:

Zatem dodajemy kawałek kodu, który parsuje wartość odczytaną i zwraca prawidłową temperaturę

def Decode(raw):
    tempA = raw & 0xFF
    tempB = (raw >> 8) & 0xFF
    temp = (tempA << 8) | tempB
    temp = temp >> 5
    return temp

def Parse(input):
    signBit = input >> 10
    if signBit > 0:
        negativeTemperature = input
        return (negativeTemperature * 0.125) - 256
    return input * 0.125

raw = i2c.read_word_data(sensorAddress,0)
temp = Decode(raw)
print Parse(temp)

czyli mamy dwie funkcje, Decode, która tak przestawia bity aby zgodnie z tym co ostatnio pisałem uzyskać prawidłową liczbę w pythonie oraz Parse, która odpowiednio przelicza to na nasze dobrze znane stopnie Andersa Celsiusa.

Po sieci krąży jeszcze jedne kod do odczytu temperatury z LM75A:

tempA = temp & 0xFF
tempB = (temp >> 8) & 0xFF
temp = (tempA  << 8) | tempB
temp = temp >> 5

r = temp >> 7
if (temp & 0x8000):
r = (~r & 0x1FF)
r = r - 1
r = -r
r = r / 2.0
return str(r)

ma on jednak małą wadę, zaokrągla odczyt do .5 więc tracimy na rozdzielczości czujnika i z .125 robi nam się 0.5 stopnia Wprawdzie w zastosowaniach domowych i meteo nie ma to wielkiego znaczenia to jednak piszę o tym, ponieważ jedna z pierwszych moich wersji bazowała na tym kodzie i zaokrąglała własnie do .5. Teraz znalazłem czas, żeby napisać to po swojemu i mam .125

Ostatnia sprawa to spięcie całości. Potrzebujemy połączyć kość LM75A z Malinką:

image

Łączymy piny:

LM75ARaspberry PI
1 (SDA)2 (SDA)
2 (SCL)3 (SCL)
4 (GND)24 (Ground)
8 (VCC)1(3V3 Power)
51 (3V3 Power)
61 (3V3 Power)
71 (3V3 Power)

Piny 5 6 7 możemy połączyć dowolnie z “plusem” lub “minusem” – w ten sposób ustalamy adres jednak należy pamiętać, że piny 5, 6 i 7 MUSZĄ BYĆ POŁĄCZONE.

Miłej zabawy a w następnym odcinku serii na warsztat weźmiemy ciśnienie ale dopiero w przyszłym tygodniu.