]>
zdv2.bktei.com Git - EVA-2020-02-2.git/blob - examples/all-in-one.py
87acc6fd8fbf09e4f5ebd9fd72a90ec2b674f3dc
   9     # Transitional fix for breaking change in LTR559 
  10     from ltr559 
import LTR559
 
  15 from bme280 
import BME280
 
  16 from pms5003 
import PMS5003
, ReadTimeoutError 
as pmsReadTimeoutError
 
  17 from enviroplus 
import gas
 
  18 from subprocess 
import PIPE
, Popen
 
  20 from PIL 
import ImageDraw
 
  21 from PIL 
import ImageFont
 
  25     format
='%(asctime)s.%(msecs)03d %(levelname)-8s %(message)s', 
  27     datefmt
='%Y-%m-%d %H:%M:%S') 
  29 logging
.info("""all-in-one.py - Displays readings from all of Enviro plus' sensors 
  35 # BME280 temperature/pressure/humidity sensor 
  38 # PMS5003 particulate sensor 
  41 # Create ST7735 LCD display class 
  42 st7735 
= ST7735
.ST7735( 
  55 HEIGHT 
= st7735
.height
 
  57 # Set up canvas and font 
  58 img 
= Image
.new('RGB', (WIDTH
, HEIGHT
), color
=(0, 0, 0)) 
  59 draw 
= ImageDraw
.Draw(img
) 
  60 path 
= os
.path
.dirname(os
.path
.realpath(__file__
)) 
  61 font 
= ImageFont
.truetype(path 
+ "/fonts/Asap/Asap-Bold.ttf", 20) 
  65 # The position of the top bar 
  69 # Displays data and text on the 0.96" LCD 
  70 def display_text(variable
, data
, unit
): 
  71     # Maintain length of list 
  72     values
[variable
] = values
[variable
][1:] + [data
] 
  73     # Scale the values for the variable between 0 and 1 
  74     colours 
= [(v 
- min(values
[variable
]) + 1) / (max(values
[variable
]) 
  75                - min(values
[variable
]) + 1) for v 
in values
[variable
]] 
  76     # Format the variable name and value 
  77     message 
= "{}: {:.1f} {}".format(variable
[:4], data
, unit
) 
  79     draw
.rectangle((0, 0, WIDTH
, HEIGHT
), (255, 255, 255)) 
  80     for i 
in range(len(colours
)): 
  81         # Convert the values to colours from red to blue 
  82         colour 
= (1.0 - colours
[i
]) * 0.6 
  83         r
, g
, b 
= [int(x 
* 255.0) for x 
in colorsys
.hsv_to_rgb(colour
, 
  85         # Draw a 1-pixel wide rectangle of colour 
  86         draw
.rectangle((i
, top_pos
, i
+1, HEIGHT
), (r
, g
, b
)) 
  87         # Draw a line graph in black 
  88         line_y 
= HEIGHT 
- (top_pos 
+ (colours
[i
] * (HEIGHT 
- top_pos
)))\
 
  90         draw
.rectangle((i
, line_y
, i
+1, line_y
+1), (0, 0, 0)) 
  91     # Write the text at the top in black 
  92     draw
.text((0, 0), message
, font
=font
, fill
=(0, 0, 0)) 
  96 # Get the temperature of the CPU for compensation 
  97 def get_cpu_temperature(): 
  98     process 
= Popen(['vcgencmd', 'measure_temp'], stdout
=PIPE
, universal_newlines
=True) 
  99     output
, _error 
= process
.communicate() 
 100     return float(output
[output
.index('=') + 1:output
.rindex("'")]) 
 103 # Tuning factor for compensation. Decrease this number to adjust the 
 104 # temperature down, and increase to adjust up 
 107 cpu_temps 
= [get_cpu_temperature()] * 5 
 109 delay 
= 0.5  # Debounce the proximity tap 
 110 mode 
= 0     # The starting mode 
 114 # Create a values dict to store the data 
 115 variables 
= ["temperature", 
 129     values
[v
] = [1] * WIDTH
 
 134         proximity 
= ltr559
.get_proximity() 
 136         # If the proximity crosses the threshold, toggle the mode 
 137         if proximity 
> 1500 and time
.time() - last_page 
> delay
: 
 139             mode 
%= len(variables
) 
 140             last_page 
= time
.time() 
 142         # One mode for each variable 
 144             # variable = "temperature" 
 146             cpu_temp 
= get_cpu_temperature() 
 147             # Smooth out with some averaging to decrease jitter 
 148             cpu_temps 
= cpu_temps
[1:] + [cpu_temp
] 
 149             avg_cpu_temp 
= sum(cpu_temps
) / float(len(cpu_temps
)) 
 150             raw_temp 
= bme280
.get_temperature() 
 151             data 
= raw_temp 
- ((avg_cpu_temp 
- raw_temp
) / factor
) 
 152             display_text(variables
[mode
], data
, unit
) 
 155             # variable = "pressure" 
 157             data 
= bme280
.get_pressure() 
 158             display_text(variables
[mode
], data
, unit
) 
 161             # variable = "humidity" 
 163             data 
= bme280
.get_humidity() 
 164             display_text(variables
[mode
], data
, unit
) 
 170                 data 
= ltr559
.get_lux() 
 173             display_text(variables
[mode
], data
, unit
) 
 176             # variable = "oxidised" 
 178             data 
= gas
.read_all() 
 179             data 
= data
.oxidising 
/ 1000 
 180             display_text(variables
[mode
], data
, unit
) 
 183             # variable = "reduced" 
 185             data 
= gas
.read_all() 
 186             data 
= data
.reducing 
/ 1000 
 187             display_text(variables
[mode
], data
, unit
) 
 192             data 
= gas
.read_all() 
 193             data 
= data
.nh3 
/ 1000 
 194             display_text(variables
[mode
], data
, unit
) 
 200                 data 
= pms5003
.read() 
 201             except pmsReadTimeoutError
: 
 202                 logging
.warn("Failed to read PMS5003") 
 204                 data 
= data
.pm_ug_per_m3(1.0) 
 205                 display_text(variables
[mode
], data
, unit
) 
 211                 data 
= pms5003
.read() 
 212             except pmsReadTimeoutError
: 
 213                 logging
.warn("Failed to read PMS5003") 
 215                 data 
= data
.pm_ug_per_m3(2.5) 
 216                 display_text(variables
[mode
], data
, unit
) 
 222                 data 
= pms5003
.read() 
 223             except pmsReadTimeoutError
: 
 224                 logging
.warn("Failed to read PMS5003") 
 226                 data 
= data
.pm_ug_per_m3(10) 
 227                 display_text(variables
[mode
], data
, unit
) 
 230 except KeyboardInterrupt: