Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 

Repository files navigation

bme280

Arduino and linux I2C sketch for Bosch BME280 atmospheric preassure, temperature and humidity sensor. No external library is required for Arduino. Linux app uses i2c library.

It is written based on BME280 datasheet published at https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME280-DS002.pdf and uses the same logic as the provided driver https://github.com/BoschSensortec/BME280_driver

Now in Raspberry Pi, it is easy to collect environmental data in any time series databases; for example, in RRD:

rrdtool create /var/env.rrd \
          --step 1m \
          DS:temperature:GAUGE:1d:-50:50 \
          RRA:AVERAGE:0.5:1m:1h \
          RRA:AVERAGE:0.5:1m:1d \
          RRA:AVERAGE:0.5:1h:1d \
          RRA:AVERAGE:0.5:1h:1M \
          RRA:AVERAGE:0.5:1d:1y \
          RRA:AVERAGE:0.5:1d:10y \
          RRA:MIN:0.5:1m:1h \
          RRA:MIN:0.5:1m:1d \
          RRA:MIN:0.5:1h:1d \
          RRA:MIN:0.5:1h:1M \
          RRA:MIN:0.5:1d:1y \
          RRA:MIN:0.5:1d:10y \
          RRA:MAX:0.5:1m:1h \
          RRA:MAX:0.5:1m:1d \
          RRA:MAX:0.5:1h:1d \
          RRA:MAX:0.5:1h:1M \
          RRA:MAX:0.5:1d:1y \
          RRA:MAX:0.5:1d:10y \
          DS:humidity:GAUGE:1d:0:100 \
          RRA:AVERAGE:0.5:1m:1h \
          RRA:AVERAGE:0.5:1m:1d \
          RRA:AVERAGE:0.5:1h:1d \
          RRA:AVERAGE:0.5:1h:1M \
          RRA:AVERAGE:0.5:1d:1y \
          RRA:AVERAGE:0.5:1d:10y \
          RRA:MIN:0.5:1m:1h \
          RRA:MIN:0.5:1m:1d \
          RRA:MIN:0.5:1h:1d \
          RRA:MIN:0.5:1h:1M \
          RRA:MIN:0.5:1d:1y \
          RRA:MIN:0.5:1d:10y \
          RRA:MAX:0.5:1m:1h \
          RRA:MAX:0.5:1m:1d \
          RRA:MAX:0.5:1h:1d \
          RRA:MAX:0.5:1h:1M \
          RRA:MAX:0.5:1d:1y \
          RRA:MAX:0.5:1d:10y \
          DS:pressure:GAUGE:1d:800:1200 \
          RRA:AVERAGE:0.5:1m:1h \
          RRA:AVERAGE:0.5:1m:1d \
          RRA:AVERAGE:0.5:1h:1d \
          RRA:AVERAGE:0.5:1h:1M \
          RRA:AVERAGE:0.5:1d:1y \
          RRA:AVERAGE:0.5:1d:10y \
          RRA:MIN:0.5:1m:1h \
          RRA:MIN:0.5:1m:1d \
          RRA:MIN:0.5:1h:1d \
          RRA:MIN:0.5:1h:1M \
          RRA:MIN:0.5:1d:1y \
          RRA:MIN:0.5:1d:10y \
          RRA:MAX:0.5:1m:1h \
          RRA:MAX:0.5:1m:1d \
          RRA:MAX:0.5:1h:1d \
          RRA:MAX:0.5:1h:1M \
          RRA:MAX:0.5:1d:1y \
          RRA:MAX:0.5:1d:10y
          
cat bme280.php
<?php
$t = htmlspecialchars($_REQUEST['t']);
$h = htmlspecialchars($_REQUEST['h']);
$p = htmlspecialchars($_REQUEST['p']);
$values = array(sprintf("N:%.1f:%.1f:%.1f", $t, $h, $p));
if (!rrd_update("/var/env.rrd", $values)) {
  header('HTTP/1.1 500 Internal Server Error');
  print_r(rrd_error());
  exit;
}
?>

cat bme280.sh
#!/bin/bash
curl "http://example.com/bme280.php?$(./bme280 /dev/i2c-1 1 1 --raw)"

crontab -e
0-59 * * * * bme280.sh

Later you may graph the data:

cat /opt/nginx/html/env.php
<?php
$height = "-h 100";
$width = "-w 1000";
$start = "-s end-1w";
$end = "-e now";
$file_t = "/opt/nginx/html/images/temperature.png";
$file_h = "/opt/nginx/html/images/humidity.png";
$file_p = "/opt/nginx/html/images/pressure.png";
$def_t = "DEF:t=/var/env.rrd:temperature:LAST";
$def_h = "DEF:h=/var/env.rrd:humidity:LAST";
$def_p = "DEF:p=/var/env.rrd:pressure:LAST";
$line_t = "LINE1:t#0000FF:'temperature'";
$line_h = "LINE1:h#0000FF:'humidity'";
$line_p = "LINE1:p#0000FF:'pressure'";
$values = [$end, $start, $height, $width, "-t Temperature, deg C", $def_t, $line_t];
rrd_graph($file_t, $values);
print_r(rrd_error());
$values = [$end, $start, $height, $width, "-t Relative Humidity, %", $def_h, $line_h];
rrd_graph($file_h, $values);
print_r(rrd_error());
#$values = [$end, $start, $height, $width, "-l 990", "-u 1040", "-r", $def_p, $line_p];
$values = [$end, $start, $height, $width, "-t Atmospheric Pressure, mb(hPa)", "-A", "-Y", $def_p, $line_p];
rrd_graph($file_p, $values);
print_r(rrd_error());
?>
<html>
<head>
<meta http-equiv="Cache-control" content="no-store">
</head>
<body>
<img src="images/temperature.png" />
<br />
<img src="images/humidity.png" />
<br />
<img src="images/pressure.png" />
</body>
</html>

http://example.com/env.php

Or you may just get the last number of any metric using this PHP

cat env_lastupdate_temperature.php
<?php
$last_update = rrd_lastupdate("/var/env.rrd");
print_r($last_update["data"][0]);
?>

This can be useful in timer/relay applications that use ESP8266 wifi chip to get simple environmental number over http and act upon it. For example, turn on/off the heater when the temperature drops/exceeds certain limits, or turn on/off the fan when humidity rises/drops certain levels.

About

Arduino sketch for Bosch BME280 atmospheric preassure, temperature and humidity sensor (no external library is required)

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages