Op de electronica markt zijn veel verschillende temperatuur sensoren te koop die heel eenvoudig op een Raspberry Pi zijn aan te sluiten. In dit stappenplan gaan we aan de slag met een BMP180 sensor, deze meet naast de actuele temperatuur ook de luchtdruk.
Met behulp van een Python script lezen we de data uit en converteren we deze naar leesbare waarden die we voor verschillende doeleinden kunnen gebruiken.
Gebruikte componenten
• BMP180 Luchtdruk en temperatuur sensor (2€)
• 4x Dupont verbindingskabel (female/female)
Raspberry Pi 3 model B
Raspbian Strech (November 2018 kernel 4.14)
Aansluitschema BMP180 sensor
Je kunt de BMP180 sensor aansluiten op de Raspberry Pi volgens onderstaand schema. De pinnen op de module kunnen verschillende labels hebben, bijvoorbeeld VCC in plaats van VIN. Let op dat de pin volgorde per gebruikte module kan verschillen. Mocht er op de module een pin ‘3Vo’ aanwezig zijn, gebruiken deze dan niet.
Raspberry Pi | Kleur | BMP Module |
---|---|---|
3.3V (PIN #1) | rood | VIN (VCC) |
GPIO2 SDA1 I2C (PIN #3) | groen | SDA |
GPIO3 SCL1 I2C (PIN #5) | geel | SCL |
GND (PIN #6) | zwart | GND |
I2C interface activeren
Om de waardes van de BPM180 uit te kunnen lezen gebruiken we een Python script dat via de I2C interface de sensor aanstuurt. Om toegang te krijgen tot de I2C interface dient deze in de Raspberry Pi geactiveerd te zijn, dit kan je doen met de raspi-config tool.
sudo raspi-config
Ga naar ‘Advanced options’ en ‘enable’ de I2C optie.
Python script
Het script om de sensor waarden uit te lezen maakt alleen gebruik van libraries die standaard aanwezig zijn.
#!/usr/bin/python | |
# BMP180 luchtdruk + temperatuur sensor | |
# https://www.raspberrytips.nl | |
import smbus | |
import time | |
from ctypes import c_short | |
DEVICE = 0x77 | |
bus = smbus.SMBus(1) | |
def convertToString(data): | |
return str((data[1] + (256 * data[0])) / 1.2) | |
def getShort(data, index): | |
return c_short((data[index] << 8) + data[index + 1]).value | |
def getUshort(data, index): | |
return (data[index] << 8) + data[index + 1] | |
def readBmp180(addr=DEVICE): | |
REG_CALIB = 0xAA | |
REG_MEAS = 0xF4 | |
REG_MSB = 0xF6 | |
REG_LSB = 0xF7 | |
CRV_TEMP = 0x2E | |
CRV_PRES = 0x34 | |
OVERSAMPLE = 3 | |
cal = bus.read_i2c_block_data(addr, REG_CALIB, 22) | |
AC1 = getShort(cal, 0) | |
AC2 = getShort(cal, 2) | |
AC3 = getShort(cal, 4) | |
AC4 = getUshort(cal, 6) | |
AC5 = getUshort(cal, 8) | |
AC6 = getUshort(cal, 10) | |
B1 = getShort(cal, 12) | |
B2 = getShort(cal, 14) | |
MB = getShort(cal, 16) | |
MC = getShort(cal, 18) | |
MD = getShort(cal, 20) | |
# Lees Temperatuur | |
bus.write_byte_data(addr, REG_MEAS, CRV_TEMP) | |
time.sleep(0.005) | |
(msb, lsb) = bus.read_i2c_block_data(addr, REG_MSB, 2) | |
UT = (msb << 8) + lsb | |
# Lees Luchtdruk | |
bus.write_byte_data(addr, REG_MEAS, CRV_PRES + (OVERSAMPLE << 6)) | |
time.sleep(0.04) | |
(msb, lsb, xsb) = bus.read_i2c_block_data(addr, REG_MSB, 3) | |
UP = ((msb << 16) + (lsb << 8) + xsb) >> (8 - OVERSAMPLE) | |
# Opmaak temperatuur | |
X1 = ((UT - AC6) * AC5) >> 15 | |
X2 = (MC << 11) / (X1 + MD) | |
B5 = X1 + X2 | |
temperature = (B5 + 8) >> 4 | |
# Opmaak luchtdruk | |
B6 = B5 - 4000 | |
B62 = B6 * B6 >> 12 | |
X1 = (B2 * B62) >> 11 | |
X2 = AC2 * B6 >> 11 | |
X3 = X1 + X2 | |
B3 = (((AC1 * 4 + X3) << OVERSAMPLE) + 2) >> 2 | |
X1 = AC3 * B6 >> 13 | |
X2 = (B1 * B62) >> 16 | |
X3 = ((X1 + X2) + 2) >> 2 | |
B4 = (AC4 * (X3 + 32768)) >> 15 | |
B7 = (UP - B3) * (50000 >> OVERSAMPLE) | |
P = (B7 * 2) / B4 | |
X1 = (P >> 8) * (P >> 8) | |
X1 = (X1 * 3038) >> 16 | |
X2 = (-7357 * P) >> 16 | |
pressure = P + ((X1 + X2 + 3791) >> 4) | |
return (temperature/10.0,pressure/ 100.0) | |
def main(): | |
deg = u'\xb0' | |
(temperature,pressure)=readBmp180() | |
print "Temperatuur : ", temperature,deg.encode('utf8'), "C" | |
print "Luchtdruk : ", pressure, "mbar" | |
if __name__=="__main__": | |
main() |
Je kunt dit script downloaden met behulp van:
wget https://raspberrytips.nl/bmp180sensor.py
Voer hierna het script uit:
python bmp180sensor.py
In het terminal venster zal nu de temperatuur in celsius en de gemeten luchtdruk milibar worden weergegeven.