]>
zdv2.bktei.com Git - EVA-2020-02-2.git/blob - examples/all-in-one-no-pm.py
367ebeb0854926c4ad5bf6d145444c85b3a18172
  10 from bme280 
import BME280
 
  11 from enviroplus 
import gas
 
  12 from subprocess 
import PIPE
, Popen
 
  14 from PIL 
import ImageDraw
 
  15 from PIL 
import ImageFont
 
  17 print("""all-in-one.py - Displays readings from all of Enviro plus' sensors 
  21 # BME280 temperature/pressure/humidity sensor 
  24 # Create ST7735 LCD display class 
  25 st7735 
= ST7735
.ST7735( 
  38 HEIGHT 
= st7735
.height
 
  40 # Set up canvas and font 
  41 img 
= Image
.new('RGB', (WIDTH
, HEIGHT
), color
=(0, 0, 0)) 
  42 draw 
= ImageDraw
.Draw(img
) 
  43 path 
= os
.path
.dirname(os
.path
.realpath(__file__
)) 
  44 font 
= ImageFont
.truetype(path 
+ "/fonts/Asap/Asap-Bold.ttf", 20) 
  48 # The position of the top bar 
  52 # Displays data and text on the 0.96" LCD 
  53 def display_text(variable
, data
, unit
): 
  54     # Maintain length of list 
  55     values
[variable
] = values
[variable
][1:] + [data
] 
  56     # Scale the values for the variable between 0 and 1 
  57     colours 
= [(v 
- min(values
[variable
]) + 1) / (max(values
[variable
]) 
  58                - min(values
[variable
]) + 1) for v 
in values
[variable
]] 
  59     # Format the variable name and value 
  60     message 
= "{}: {:.1f} {}".format(variable
[:4], data
, unit
) 
  62     draw
.rectangle((0, 0, WIDTH
, HEIGHT
), (255, 255, 255)) 
  63     for i 
in range(len(colours
)): 
  64         # Convert the values to colours from red to blue 
  65         colour 
= (1.0 - colours
[i
]) * 0.6 
  66         r
, g
, b 
= [int(x 
* 255.0) for x 
in colorsys
.hsv_to_rgb(colour
, 
  68         # Draw a 1-pixel wide rectangle of colour 
  69         draw
.rectangle((i
, top_pos
, i
+1, HEIGHT
), (r
, g
, b
)) 
  70         # Draw a line graph in black 
  71         line_y 
= HEIGHT 
- (top_pos 
+ (colours
[i
] * (HEIGHT 
- top_pos
)))\
 
  73         draw
.rectangle((i
, line_y
, i
+1, line_y
+1), (0, 0, 0)) 
  74     # Write the text at the top in black 
  75     draw
.text((0, 0), message
, font
=font
, fill
=(0, 0, 0)) 
  79 # Get the temperature of the CPU for compensation 
  80 def get_cpu_temperature(): 
  81     process 
= Popen(['vcgencmd', 'measure_temp'], stdout
=PIPE
) 
  82     output
, _error 
= process
.communicate() 
  83     return float(output
[output
.index('=') + 1:output
.rindex("'")]) 
  86 # Tuning factor for compensation. Decrease this number to adjust the 
  87 # temperature down, and increase to adjust up 
  92 delay 
= 0.5  # Debounce the proximity tap 
  93 mode 
= 0  # The starting mode 
  97 # Create a values dict to store the data 
  98 variables 
= ["temperature", 
 109     values
[v
] = [1] * WIDTH
 
 114         proximity 
= ltr559
.get_proximity() 
 116         # If the proximity crosses the threshold, toggle the mode 
 117         if proximity 
> 1500 and time
.time() - last_page 
> delay
: 
 119             mode 
%= len(variables
) 
 120             last_page 
= time
.time() 
 122         # One mode for each variable 
 124             variable 
= "temperature" 
 126             cpu_temp 
= get_cpu_temperature() 
 127             # Smooth out with some averaging to decrease jitter 
 128             cpu_temps 
= cpu_temps
[1:] + [cpu_temp
] 
 129             avg_cpu_temp 
= sum(cpu_temps
) / float(len(cpu_temps
)) 
 130             raw_temp 
= bme280
.get_temperature() 
 131             data 
= raw_temp 
- ((avg_cpu_temp 
- raw_temp
) / factor
) 
 132             display_text(variable
, data
, unit
) 
 135             variable 
= "pressure" 
 137             data 
= bme280
.get_pressure() 
 138             display_text(variable
, data
, unit
) 
 141             variable 
= "humidity" 
 143             data 
= bme280
.get_humidity() 
 144             display_text(variable
, data
, unit
) 
 150                 data 
= ltr559
.get_lux() 
 153             display_text(variable
, data
, unit
) 
 156             variable 
= "oxidised" 
 158             data 
= gas
.read_all() 
 159             data 
= data
.oxidising 
/ 1000 
 160             display_text(variable
, data
, unit
) 
 165             data 
= gas
.read_all() 
 166             data 
= data
.reducing 
/ 1000 
 167             display_text(variable
, data
, unit
) 
 172             data 
= gas
.read_all() 
 173             data 
= data
.nh3 
/ 1000 
 174             display_text(variable
, data
, unit
) 
 177 except KeyboardInterrupt: