]>
zdv2.bktei.com Git - EVA-2020-02-2.git/blob - examples/all-in-one.py
eef99c36b7eea36846073685af9f371823e5642b
  10 from bme280 
import BME280
 
  11 from pms5003 
import PMS5003
, ReadTimeoutError 
as pmsReadTimeoutError
 
  12 from enviroplus 
import gas
 
  13 from subprocess 
import PIPE
, Popen
 
  15 from PIL 
import ImageDraw
 
  16 from PIL 
import ImageFont
 
  20     format
='%(asctime)s.%(msecs)03d %(levelname)-8s %(message)s', 
  22     datefmt
='%Y-%m-%d %H:%M:%S') 
  24 logging
.info("""all-in-one.py - Displays readings from all of Enviro plus' sensors 
  30 # BME280 temperature/pressure/humidity sensor 
  33 # PMS5003 particulate sensor 
  36 # Create ST7735 LCD display class 
  37 st7735 
= ST7735
.ST7735( 
  50 HEIGHT 
= st7735
.height
 
  52 # Set up canvas and font 
  53 img 
= Image
.new('RGB', (WIDTH
, HEIGHT
), color
=(0, 0, 0)) 
  54 draw 
= ImageDraw
.Draw(img
) 
  55 path 
= os
.path
.dirname(os
.path
.realpath(__file__
)) 
  56 font 
= ImageFont
.truetype(path 
+ "/fonts/Asap/Asap-Bold.ttf", 20) 
  60 # The position of the top bar 
  64 # Displays data and text on the 0.96" LCD 
  65 def display_text(variable
, data
, unit
): 
  66     # Maintain length of list 
  67     values
[variable
] = values
[variable
][1:] + [data
] 
  68     # Scale the values for the variable between 0 and 1 
  69     colours 
= [(v 
- min(values
[variable
]) + 1) / (max(values
[variable
]) 
  70                - min(values
[variable
]) + 1) for v 
in values
[variable
]] 
  71     # Format the variable name and value 
  72     message 
= "{}: {:.1f} {}".format(variable
[:4], data
, unit
) 
  74     draw
.rectangle((0, 0, WIDTH
, HEIGHT
), (255, 255, 255)) 
  75     for i 
in range(len(colours
)): 
  76         # Convert the values to colours from red to blue 
  77         colour 
= (1.0 - colours
[i
]) * 0.6 
  78         r
, g
, b 
= [int(x 
* 255.0) for x 
in colorsys
.hsv_to_rgb(colour
, 
  80         # Draw a 1-pixel wide rectangle of colour 
  81         draw
.rectangle((i
, top_pos
, i
+1, HEIGHT
), (r
, g
, b
)) 
  82         # Draw a line graph in black 
  83         line_y 
= HEIGHT 
- (top_pos 
+ (colours
[i
] * (HEIGHT 
- top_pos
)))\
 
  85         draw
.rectangle((i
, line_y
, i
+1, line_y
+1), (0, 0, 0)) 
  86     # Write the text at the top in black 
  87     draw
.text((0, 0), message
, font
=font
, fill
=(0, 0, 0)) 
  91 # Get the temperature of the CPU for compensation 
  92 def get_cpu_temperature(): 
  93     process 
= Popen(['vcgencmd', 'measure_temp'], stdout
=PIPE
, universal_newlines
=True) 
  94     output
, _error 
= process
.communicate() 
  95     return float(output
[output
.index('=') + 1:output
.rindex("'")]) 
  98 # Tuning factor for compensation. Decrease this number to adjust the 
  99 # temperature down, and increase to adjust up 
 102 cpu_temps 
= [get_cpu_temperature()] * 5 
 104 delay 
= 0.5  # Debounce the proximity tap 
 105 mode 
= 0     # The starting mode 
 109 # Create a values dict to store the data 
 110 variables 
= ["temperature", 
 124     values
[v
] = [1] * WIDTH
 
 129         proximity 
= ltr559
.get_proximity() 
 131         # If the proximity crosses the threshold, toggle the mode 
 132         if proximity 
> 1500 and time
.time() - last_page 
> delay
: 
 134             mode 
%= len(variables
) 
 135             last_page 
= time
.time() 
 137         # One mode for each variable 
 139             # variable = "temperature" 
 141             cpu_temp 
= get_cpu_temperature() 
 142             # Smooth out with some averaging to decrease jitter 
 143             cpu_temps 
= cpu_temps
[1:] + [cpu_temp
] 
 144             avg_cpu_temp 
= sum(cpu_temps
) / float(len(cpu_temps
)) 
 145             raw_temp 
= bme280
.get_temperature() 
 146             data 
= raw_temp 
- ((avg_cpu_temp 
- raw_temp
) / factor
) 
 147             display_text(variables
[mode
], data
, unit
) 
 150             # variable = "pressure" 
 152             data 
= bme280
.get_pressure() 
 153             display_text(variables
[mode
], data
, unit
) 
 156             # variable = "humidity" 
 158             data 
= bme280
.get_humidity() 
 159             display_text(variables
[mode
], data
, unit
) 
 165                 data 
= ltr559
.get_lux() 
 168             display_text(variables
[mode
], data
, unit
) 
 171             # variable = "oxidised" 
 173             data 
= gas
.read_all() 
 174             data 
= data
.oxidising 
/ 1000 
 175             display_text(variables
[mode
], data
, unit
) 
 178             # variable = "reduced" 
 180             data 
= gas
.read_all() 
 181             data 
= data
.reducing 
/ 1000 
 182             display_text(variables
[mode
], data
, unit
) 
 187             data 
= gas
.read_all() 
 188             data 
= data
.nh3 
/ 1000 
 189             display_text(variables
[mode
], data
, unit
) 
 195                 data 
= pms5003
.read() 
 196             except pmsReadTimeoutError
: 
 197                 logging
.warn("Failed to read PMS5003") 
 199                 data 
= data
.pm_ug_per_m3(1.0) 
 200                 display_text(variables
[mode
], data
, unit
) 
 206                 data 
= pms5003
.read() 
 207             except pmsReadTimeoutError
: 
 208                 logging
.warn("Failed to read PMS5003") 
 210                 data 
= data
.pm_ug_per_m3(2.5) 
 211                 display_text(variables
[mode
], data
, unit
) 
 217                 data 
= pms5003
.read() 
 218             except pmsReadTimeoutError
: 
 219                 logging
.warn("Failed to read PMS5003") 
 221                 data 
= data
.pm_ug_per_m3(10) 
 222                 display_text(variables
[mode
], data
, unit
) 
 225 except KeyboardInterrupt: