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.
Hoi Richard,
Leuk dat je weer activiteit hebt op deze site.
Was lang stil.
Maar weer een leuk projectje.
Groetjes Ruud
Dank je!
Naar aanleiding van deze mogelijkheden op het gebied het gebruik van sensoren, vraag ik mij af of er ook sensoren zijn aan te sluiten op Pi4 om de temperatuur te meten van de Pi zelf. Het zou mooi zijn om te zien of de temperatuur van Pi te hoog oploopt en deze volgens bij te stellen naar beneden.
Daar is een Linux commando voor dat de processor temperatuur weergeeft.