Der Luftdruck gibt Aufschluss über das zukünftige Wettergeschehen. Außerdem kann er zum Messen der Meereshöhe verwendet werden. Mittlerweile gibt es günstige MEMS-Sensoren, mit denen der Luftdruck einfach gemessen werden kann. Einer davon ist der LPS25H von ST.
LPS25H von ST
Der LPS25H von ST ist ein Sensor, der den absoluten Luftdruck im Bereich von 260 -1260 hPA (bzw. mbar) messen kann. Außerdem ist im gleichen Gehäuse noch ein Temperatursensor verbaut, der ebenfalls ausgelesen werden kann.
Der Sensor kann über I2C oder SPI angesteuert und ausgelesen werden. Wir beschränken uns hier auf die Ansteuerung über I2C.
Der elektrische Anschluss ist sehr einfach. Er benötigt nur einen zusätzlichen 100 nF Filterkondensator.
Auslesen über I2C
Der HTS221 hat die I2C-Adresse 0×5c. Bevor der Sensor Werte liefert, muss man ihn aktivieren und zum Beispiel in einen continous mode mit einer Update-Rate von 1 Hz setzen. Dies geschieht, indem man den Wert 0×90 in das Register 0×20 schreibt. Außerdem kann man den resolution mode im Register 0×10 ändern.
Die gelieferten Messwerte muss man auch bei diesem Sensor umrechnen, allerdings geht das mit sehr einfachen Formeln. Weitere Kalibrierungswerte muss man nicht auslesen.
temp=42.5+(float)temp_out/480.0;
pressure=42.5+(float)press_out/4096.0;
Programm zum Auslesen des Sensors
Hier ist ein Programm, mit dem man den Sensor auf einem Raspberry Pi oder BeagleBone auslesen kann.
#include <stdio.h> #include <stdlib.h> #include <linux/i2c-dev.h> #include <fcntl.h> #include <unistd.h>
int main(void) { int file; int addr=0x5c; // adress of LPS25H char a=0;
signed short int temp_out=0; // output registers int press_out=0;
float temp; // calculated values for temperature and pressure float pressure;
printf("LPS25H\n"); if((file=open("/dev/i2c-1",O_RDWR))<0) // open i2c-bus { perror("cannot open i2c-1"); exit(1); } if(ioctl(file, I2C_SLAVE, addr)<0) // open slave { perror("cannot open slave address"); exit(1); }
a=i2c_smbus_read_byte_data(file,0x0f); // read WHO_AM_I printf("WHO_AM_I: %02X\n",a); i2c_smbus_write_byte_data(file,0x10,0x05); // setting resolution mode a=i2c_smbus_read_byte_data(file,0x10); // read RES_CONF printf("RES_CONF: %02X\n",a); a=i2c_smbus_read_byte_data(file,0x20); // read CTRL_REG1 printf("CTRL_REG1: %02X\n",a); if(a!=0x90) // check if device active { printf("setting device to active and continous mode\n"); i2c_smbus_write_byte_data(file,0x20,0x90); // setting device to active and 1 hz update rate a=i2c_smbus_read_byte_data(file,0x20); // read CTRL_REG1 printf("CTRL_REG1: %02X\n",a); } a=i2c_smbus_read_byte_data(file,0x27); // read STATUS_REG printf("STATUS_REG: %02X\n",a);
temp_out=i2c_smbus_read_word_data(file, 0xab); // read TEMP_OUT printf("TEMP_OUT: 0x%04X = %i\n",(unsigned short)temp_out,temp_out); press_out=i2c_smbus_read_word_data(file, 0xa9)<<16; // read PRESS_OUT high 16 bit press_out|=i2c_smbus_read_word_data(file, 0x28)<<8; // read PRESS_OUT lowest 8 bit press_out/=256; // align data correct printf("PRESS_OUT: 0x%08X = %i\n",(unsigned)press_out,press_out);
temp=42.5+(float)temp_out/480.0; // calculate actual temperature value printf("temp = %f C\n",temp);
pressure=42.5+(float)press_out/4096.0; // calculate actual pressure value printf("pressure = %f hPa\n",pressure);
close(file);
return 0; }
Bei mir wurden dann folgende Werte ausgelesen:
Verfügbarkeit und Evalboards.
Der LPS25H ist auf dem Sense HAT von Raspberry Pi verbaut. Außerdem ist der Sensor auf dem Motion MEMS and environmental sensor expansion board for STM32 Nucleo von ST verbaut, allerdings nur auf der ersten Version: X-NUCLEO-IKS01A1
Probleme
Bei meinen Versuchen mit je einem Sensor an einem Raspberry Pi und einem ESP8266 lieferten die Sensoren Werte, die etwa 40 hPa zu hoch waren. Den Grund dafür habe ich noch nicht gefunden. Über Kommentare dazu würde ich mich freuen.
Kommentare
Kommentarfunktion für diesen Artikel geschlossen.