Forum: Mikrocontroller und Digitale Elektronik BME280 auslesen


von Andi (Gast)


Lesenswert?

Hallo,

ich möchte einen BME280 auslesen.
https://www.bosch-sensortec.com/de/homepage/products_3/environmental_sensors_1/bme280/bme280_1


Hier gibt es vom Herstelle Code dazu:
https://github.com/BoschSensortec/BME280_driver

Wenn ich nun aus der bme280.c Datei die Funktion der Luftfeuchte 
verwenden will habe würde ich in meinem Programm die bme280.h und 
bme280.c includieren.

Zum testen will ich es zuerst am Raspberry PI versuchen. Einen andern 
SPI Temperatursensor habe ich schon einmal ausgelesen, das war aber ohne 
api.

Wie landet nun aber der Wert in einer Variable?

die Funktion sieht so aus:
1
/*!
2
 *  @brief This API is used to read uncompensated humidity.
3
 *  in the registers 0xF7, 0xF8 and 0xF9
4
 *  @note 0xFD -> MSB -> bit from 0 to 7
5
 *  @note 0xFE -> LSB -> bit from 0 to 7
6
 *
7
 *
8
 *
9
 *  @param v_uncomp_humidity_s32 : The value of uncompensated humidity
10
 *
11
 *
12
 *
13
 *  @return results of bus communication function
14
 *  @retval 0 -> Success
15
 *  @retval -1 -> Error
16
 *
17
 *
18
*/
19
BME280_RETURN_FUNCTION_TYPE bme280_read_uncomp_humidity(
20
s32 *v_uncomp_humidity_s32)
21
{
22
  /* used to return the communication result*/
23
  BME280_RETURN_FUNCTION_TYPE com_rslt = ERROR;
24
  /* Array holding the MSB and LSb value
25
  a_data_u8[0] - Humidity MSB
26
  a_data_u8[1] - Humidity LSB
27
  */
28
  u8 a_data_u8[BME280_HUMIDITY_DATA_SIZE] = {
29
  BME280_INIT_VALUE, BME280_INIT_VALUE};
30
  /* check the p_bme280 structure pointer as NULL*/
31
  if (p_bme280 == BME280_NULL) {
32
    return E_BME280_NULL_PTR;
33
    } else {
34
      com_rslt = p_bme280->BME280_BUS_READ_FUNC(
35
      p_bme280->dev_addr,
36
      BME280_HUMIDITY_MSB_REG, a_data_u8,
37
      BME280_HUMIDITY_DATA_LENGTH);
38
      *v_uncomp_humidity_s32 = (s32)(
39
      (((u32)(a_data_u8[BME280_HUMIDITY_MSB_DATA]))
40
      << BME280_SHIFT_BIT_POSITION_BY_08_BITS)|
41
      ((u32)(a_data_u8[BME280_HUMIDITY_LSB_DATA])));
42
    }
43
  return com_rslt;
44
}

von Mick (Gast)


Lesenswert?

Du musst zuerst einen 32bit integer (32s) als Variable definieren.
Beim Aufrufen der Methode bme280_read_uncomp_humidity übergibst du dann 
die Variable als Pointer.

Das Ganze sieht dann etwa so aus:
1
s32 humidity;
2
bme280_read_uncomp_humidity(&humidity);
3
printf("Die Feuchtigkeit beträgt : %d\n", humidity);

von Kurt (kurtcontroller)


Lesenswert?

Hi Leute,

ich habe diesen Sensor bei Watterott gekauft.

Python funktioniert. Leider in 'C' nicht.

Was mache ich falsch.

// Testprogramm -
// Auslesen BME280
//

#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include "bme280.h"
#include "bme280.c"

int main(int argc, char **argv)
{

   s32 temperature, humidity, pressure;

   bme280_read_uncomp_temperature(&temperature);
   bme280_read_uncomp_humidity(&humidity);
   bme280_read_uncomp_humidity(&pressure);

   printf("Die Temparatur   beträgt:  %d\n", temperature);
   printf("Die Feuchtigkeit beträgt:  %d\n", humidity);
   printf("Der Luftdruck    beträgt:  %d\n", pressure);
   return 0;
}

Ausgabe Temparatur und Feuchtigkeit ist '0'. Luftdruck = 33760

Gruß
Kurt

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.