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):
[code language=”python”]
import smbus
sensorAddress = 0x48
i2c = smbus.SMBus(1)
print i2c.read_word_data(sensorAddress,0)
[/code]
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ę
[code language=”python”]
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)
[/code]
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:
[code language=”python”]
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)
[/code]
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ą:
Łączymy piny:
LM75A | Raspberry PI |
1 (SDA) | 2 (SDA) |
2 (SCL) | 3 (SCL) |
4 (GND) | 24 (Ground) |
8 (VCC) | 1(3V3 Power) |
5 | 1 (3V3 Power) |
6 | 1 (3V3 Power) |
7 | 1 (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.