# The position of the top bar
top_pos = 25
+
# Displays data and text on the 0.96" LCD
def display_text(variable, data, unit):
# Maintain length of list
values[variable] = values[variable][1:] + [data]
# Scale the values for the variable between 0 and 1
- colours = [(v - min(values[variable]) + 1) / (max(values[variable]) - min(values[variable]) + 1) for v in values[variable]]
+ colours = [(v - min(values[variable]) + 1) / (max(values[variable])
+ - min(values[variable]) + 1) for v in values[variable]]
# Format the variable name and value
message = "{}: {:.1f} {}".format(variable[:4], data, unit)
print(message)
for i in range(len(colours)):
# Convert the values to colours from red to blue
colour = (1.0 - colours[i]) * 0.6
- r, g, b = [int(x * 255.0) for x in colorsys.hsv_to_rgb(colour, 1.0, 1.0)]
+ r, g, b = [int(x * 255.0) for x in colorsys.hsv_to_rgb(colour,
+ 1.0, 1.0)]
# Draw a 1-pixel wide rectangle of colour
draw.rectangle((i, top_pos, i+1, HEIGHT), (r, g, b))
# Draw a line graph in black
- line_y = HEIGHT - (top_pos + (colours[i] * (HEIGHT - top_pos))) + top_pos
+ line_y = HEIGHT - (top_pos + (colours[i] * (HEIGHT - top_pos)))\
+ + top_pos
draw.rectangle((i, line_y, i+1, line_y+1), (0, 0, 0))
# Write the text at the top in black
draw.text((0, 0), message, font=font, fill=(0, 0, 0))
st7735.display(img)
+
# Get the temperature of the CPU for compensation
def get_cpu_temperature():
process = Popen(['vcgencmd', 'measure_temp'], stdout=PIPE)
output, _error = process.communicate()
return float(output[output.index('=') + 1:output.rindex("'")])
+
# Tuning factor for compensation. Decrease this number to adjust the
# temperature down, and increase to adjust up
factor = 0.8
except ImportError:
from smbus import SMBus
-print("""compensated-temperature.py - Use the CPU temperature to compensate temperature
-readings from the BME280 sensor. Method adapted from Initial State's Enviro pHAT
-review: https://medium.com/@InitialState/tutorial-review-enviro-phat-for-raspberry-pi-4cd6d8c63441
+print("""compensated-temperature.py - Use the CPU temperature
+to compensate temperature readings from the BME280 sensor.
+Method adapted from Initial State's Enviro pHAT review:
+https://medium.com/@InitialState/tutorial-review-enviro-phat-for-raspberry-pi-4cd6d8c63441
Press Ctrl+C to exit!
bus = SMBus(1)
bme280 = BME280(i2c_dev=bus)
+
# Get the temperature of the CPU for compensation
def get_cpu_temperature():
process = Popen(['vcgencmd', 'measure_temp'], stdout=PIPE)
output, _error = process.communicate()
return float(output[output.index('=') + 1:output.rindex("'")])
+
# Tuning factor for compensation. Decrease this number to adjust the
# temperature down, and increase to adjust up
factor = 0.8
#!/usr/bin/env python
-import time
-import json
import requests
import ST7735
from bme280 import BME280
except ImportError:
from smbus import SMBus
-print("""luftdaten.py - Reads temperature, pressure, humidity, PM2.5, and PM10 from
-Enviro plus and sends data to Luftdaten, the citizen science air quality project.
+print("""luftdaten.py - Reads temperature, pressure, humidity,
+PM2.5, and PM10 from Enviro plus and sends data to Luftdaten,
+the citizen science air quality project.
-Note: you'll need to register with Luftdaten at: https://meine.luftdaten.info/ and
-enter your Raspberry Pi serial number that's displayed on the Enviro plus LCD
-along with the other details before the data appears on the Luftdaten map.
+Note: you'll need to register with Luftdaten at:
+https://meine.luftdaten.info/ and enter your Raspberry Pi
+serial number that's displayed on the Enviro plus LCD along
+with the other details before the data appears on the
+Luftdaten map.
Press Ctrl+C to exit!
# Create BME280 instance
bme280 = BME280(i2c_dev=bus)
-# Create PMS5003 instance
-pms5003 = PMS5003()
-
# Create LCD instance
disp = ST7735.ST7735(
port=0,
# Initialize display
disp.begin()
+# Create PMS5003 instance
+pms5003 = PMS5003()
+
+
# Read values from BME280 and PMS5003 and return as dict
def read_values():
values = {}
values["P1"] = str(pm_values.pm_ug_per_m3(10))
return values
+
# Get CPU temperature to use for compensation
def get_cpu_temperature():
process = Popen(['vcgencmd', 'measure_temp'], stdout=PIPE)
output, _error = process.communicate()
return float(output[output.index('=') + 1:output.rindex("'")])
+
# Get Raspberry Pi serial number to use as ID
def get_serial_number():
- with open('/proc/cpuinfo','r') as f:
+ with open('/proc/cpuinfo', 'r') as f:
for line in f:
- if line[0:6]=='Serial':
- return(line.split(":")[1].strip())
+ if line[0:6] == 'Serial':
+ return line.split(":")[1].strip()
+
# Check for Wi-Fi connection
def check_wifi():
else:
return False
+
# Display Raspberry Pi serial and Wi-Fi status on LCD
def display_status():
wifi_status = "connected" if check_wifi() else "disconnected"
draw.text((x, y), message, font=font, fill=text_colour)
disp.display(img)
+
def send_to_luftdaten(values, id):
pm_values = dict(i for i in values.items() if i[0].startswith("P"))
temp_values = dict(i for i in values.items() if not i[0].startswith("P"))
resp_1 = requests.post("https://api.luftdaten.info/v1/push-sensor-data/",
- json={
- "software_version": "enviro-plus 0.0.1",
- "sensordatavalues": [{"value_type": key, "value": val} for key, val in pm_values.items()]
- },
- headers={
- "X-PIN": "1",
- "X-Sensor": id,
- "Content-Type": "application/json",
- "cache-control": "no-cache"
- }
+ json={
+ "software_version": "enviro-plus 0.0.1",
+ "sensordatavalues": [{"value_type": key, "value": val} for
+ key, val in pm_values.items()]
+ },
+ headers={
+ "X-PIN": "1",
+ "X-Sensor": id,
+ "Content-Type": "application/json",
+ "cache-control": "no-cache"
+ }
)
resp_2 = requests.post("https://api.luftdaten.info/v1/push-sensor-data/",
- json={
- "software_version": "enviro-plus 0.0.1",
- "sensordatavalues": [{"value_type": key, "value": val} for key, val in temp_values.items()]
- },
- headers={
- "X-PIN": "11",
- "X-Sensor": id,
- "Content-Type": "application/json",
- "cache-control": "no-cache"
- }
+ json={
+ "software_version": "enviro-plus 0.0.1",
+ "sensordatavalues": [{"value_type": key, "value": val} for
+ key, val in temp_values.items()]
+ },
+ headers={
+ "X-PIN": "11",
+ "X-Sensor": id,
+ "Content-Type": "application/json",
+ "cache-control": "no-cache"
+ }
)
if resp_1.ok and resp_2.ok:
else:
return False
+
# Compensation factor for temperature
comp_factor = 1.2