From 2653cc7df540b308b95f641b6cfa6824bd496aea Mon Sep 17 00:00:00 2001 From: Gee Bartlett Date: Tue, 28 Jun 2022 10:11:03 +0100 Subject: [PATCH] Enviro MicroPython examples (#406) Co-authored-by: Gee Bartlett Co-authored-by: helgibbons <50950368+helgibbons@users.noreply.github.com> --- .../examples/pico_enviro/bme688_sensor.py | 62 ++++++++++++ .../examples/pico_enviro/button_test.py | 69 ++++++++++++++ micropython/examples/pico_enviro/lcd.py | 95 +++++++++++++++++++ micropython/examples/pico_enviro/light.py | 58 +++++++++++ micropython/examples/pico_enviro/mic.py | 85 +++++++++++++++++ micropython/examples/pico_enviro/particle.py | 92 ++++++++++++++++++ 6 files changed, 461 insertions(+) create mode 100644 micropython/examples/pico_enviro/bme688_sensor.py create mode 100644 micropython/examples/pico_enviro/button_test.py create mode 100644 micropython/examples/pico_enviro/lcd.py create mode 100644 micropython/examples/pico_enviro/light.py create mode 100644 micropython/examples/pico_enviro/mic.py create mode 100644 micropython/examples/pico_enviro/particle.py diff --git a/micropython/examples/pico_enviro/bme688_sensor.py b/micropython/examples/pico_enviro/bme688_sensor.py new file mode 100644 index 00000000..030be0a1 --- /dev/null +++ b/micropython/examples/pico_enviro/bme688_sensor.py @@ -0,0 +1,62 @@ +"""BME688 / BME680 demo + +This demo will work for both the BME680 and BME688. +""" +import time +from picographics import PicoGraphics, DISPLAY_ENVIRO_PLUS +from pimoroni import RGBLED +from breakout_bme68x import BreakoutBME68X, STATUS_HEATER_STABLE +from pimoroni_i2c import PimoroniI2C + +PINS_BREAKOUT_GARDEN = {"sda": 4, "scl": 5} +PINS_PICO_EXPLORER = {"sda": 20, "scl": 21} + +i2c = PimoroniI2C(**PINS_BREAKOUT_GARDEN) +bmp = BreakoutBME68X(i2c, address=0x77) + + +display = PicoGraphics(display=DISPLAY_ENVIRO_PLUS) +display.set_backlight(1.0) + +led = RGBLED(6, 7, 8, invert=True) # seting pins for the RGB led +led.set_rgb(0, 0, 0) + + +# setup background +BG = display.create_pen(0, 0, 0) +TEXT = display.create_pen(255, 255, 255) +TEMP = display.create_pen(255, 0, 0) +PRESS = display.create_pen(255, 255, 0) +HUMID = display.create_pen(0, 255, 0) + +display.set_pen(BG) +display.clear() + + +def draw_graph(temp_value, press_value, humid_value): + scaled_temp = int(temp_value + 40) # Range from -40 to +60 = 1-100 + scaled_press = int((press_value - 87000) / ((108400 - 87000) / 100)) # Range 108400 - 87000 = 1 -100 + scaled_humid = int(humid_value) # Range 1 - 100 + display.set_pen(BG) + display.clear() + display.set_pen(TEMP) + display.rectangle(0, 60, scaled_temp, 60) + display.text("TEMP: {:0.2f}c".format(temp_value), scaled_temp + 5, 80, scale=2) + display.set_pen(PRESS) + display.text("PRESS: {:0.2f}Pa".format(press_value), scaled_press + 5, 140, scale=2) + display.rectangle(0, 120, scaled_press, 60) + display.set_pen(HUMID) + display.text("HUMID: {:0.2f}%".format(humid_value), scaled_humid + 5, 200, scale=2) + display.rectangle(0, 180, scaled_humid, 60) + display.set_pen(TEXT) + display.text("BME688 enviro Sensor", 5, 10, scale=2) + display.update() + + +while True: + temperature, pressure, humidity, gas, status, _, _ = bmp.read() + draw_graph(temperature, pressure, humidity) + heater = "Stable" if status & STATUS_HEATER_STABLE else "Unstable" + print("{:0.2f}c, {:0.2f}Pa, {:0.2f}%, {:0.2f} Ohms, Heater: {}".format( + temperature, pressure, humidity, gas, heater)) + time.sleep(1.0) diff --git a/micropython/examples/pico_enviro/button_test.py b/micropython/examples/pico_enviro/button_test.py new file mode 100644 index 00000000..e08025c7 --- /dev/null +++ b/micropython/examples/pico_enviro/button_test.py @@ -0,0 +1,69 @@ +# This example shows you a simple, non-interrupt way of reading Pico Enviro's buttons with a loop that checks to see if buttons are pressed. + +import time +from pimoroni import Button +from picographics import PicoGraphics, DISPLAY_ENVIRO_PLUS + +display = PicoGraphics(display=DISPLAY_ENVIRO_PLUS) + +display.set_backlight(1.0) +display.set_font("bitmap8") + +button_a = Button(12, invert=True) +button_b = Button(13, invert=True) +button_x = Button(14, invert=True) +button_y = Button(15, invert=True) + + +WHITE = display.create_pen(255, 255, 255) +BLACK = display.create_pen(0, 0, 0) +TEAL = display.create_pen(0, 255, 255) +MAGENTA = display.create_pen(255, 0, 255) +YELLOW = display.create_pen(255, 255, 0) +RED = display.create_pen(255, 0, 0) +GREEN = display.create_pen(0, 255, 0) +BLUE = display.create_pen(0, 0, 255) + +WIDTH, HEIGHT = display.get_bounds() + +while True: + if button_a.is_pressed: # if a button press is detected then... + display.set_pen(BLACK) # set pen to black + display.clear() # clear display to the pen colour + display.set_pen(WHITE) # change the pen colour + display.text("Button A pressed", 10, 10, WIDTH - 10, 3) # display some text on the screen + display.update() # update the display + time.sleep(1) # pause for a sec + + elif button_b.is_pressed: + display.set_pen(BLACK) + display.clear() + display.set_pen(TEAL) + display.text("Button B pressed", 10, 10, WIDTH - 10, 3) + display.update() + time.sleep(1) + + elif button_x.is_pressed: + display.set_pen(BLACK) + display.clear() + display.set_pen(MAGENTA) + display.text("Button X pressed", 10, 10, WIDTH - 10, 3) + display.update() + time.sleep(1) + + elif button_y.is_pressed: + display.set_pen(BLACK) + display.clear() + display.set_pen(YELLOW) + display.text("Button Y pressed", 10, 10, WIDTH - 10, 3) + display.update() + time.sleep(1) + + else: + display.set_pen(BLACK) + display.clear() + display.set_pen(RED) + display.text("Press any button!", 10, 10, WIDTH, 3) + display.update() + + time.sleep(0.1) # this number is how frequently the pico checks for button presses diff --git a/micropython/examples/pico_enviro/lcd.py b/micropython/examples/pico_enviro/lcd.py new file mode 100644 index 00000000..dcb4713e --- /dev/null +++ b/micropython/examples/pico_enviro/lcd.py @@ -0,0 +1,95 @@ +import time +import random +from picographics import PicoGraphics, DISPLAY_ENVIRO_PLUS +from pimoroni import RGBLED + +display = PicoGraphics(display=DISPLAY_ENVIRO_PLUS) +display.set_backlight(1.0) + +led = RGBLED(6, 7, 8) +led.set_rgb(255, 255, 255) + +WIDTH, HEIGHT = display.get_bounds() + +# From CPython Lib/colorsys.py + + +def hsv_to_rgb(h, s, v): + if s == 0.0: + return v, v, v + i = int(h * 6.0) + f = (h * 6.0) - i + p = v * (1.0 - s) + q = v * (1.0 - s * f) + t = v * (1.0 - s * (1.0 - f)) + i = i % 6 + if i == 0: + return v, t, p + if i == 1: + return q, v, p + if i == 2: + return p, v, t + if i == 3: + return p, q, v + if i == 4: + return t, p, v + if i == 5: + return v, p, q + + +class Ball: + def __init__(self, x, y, r, dx, dy, pen): + self.x = x + self.y = y + self.r = r + self.dx = dx + self.dy = dy + self.pen = pen + + +# initialise shapes +balls = [] +for i in range(0, 100): + r = random.randint(0, 10) + 3 + balls.append( + Ball( + random.randint(r, r + (WIDTH - 2 * r)), + random.randint(r, r + (HEIGHT - 2 * r)), + r, + (14 - r) / 2, + (14 - r) / 2, + display.create_pen(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)), + ) + ) + + +hue = 0 +while True: + hue += 1 + r, g, b = [int(255 * c) for c in hsv_to_rgb(hue / 360.0, 1.0, 1.0)] # rainbow magic + led.set_rgb(r, g, b) # pretty colours Led + BG = display.create_pen(r, g, b) + display.set_pen(BG) + display.clear() + + for ball in balls: + ball.x += ball.dx + ball.y += ball.dy + + xmax = WIDTH - ball.r + xmin = ball.r + ymax = HEIGHT - ball.r + ymin = ball.r + + if ball.x < xmin or ball.x > xmax: + ball.dx *= -1 + + if ball.y < ymin or ball.y > ymax: + ball.dy *= -1 + + display.set_pen(ball.pen) + display.circle(int(ball.x), int(ball.y), int(ball.r)) + + display.update() + +time.sleep(0.01) diff --git a/micropython/examples/pico_enviro/light.py b/micropython/examples/pico_enviro/light.py new file mode 100644 index 00000000..d05cd172 --- /dev/null +++ b/micropython/examples/pico_enviro/light.py @@ -0,0 +1,58 @@ +import time +from picographics import PicoGraphics, DISPLAY_ENVIRO_PLUS +from pimoroni import RGBLED +from pimoroni_i2c import PimoroniI2C +from breakout_ltr559 import BreakoutLTR559 + +display = PicoGraphics(display=DISPLAY_ENVIRO_PLUS) +display.set_backlight(1.0) + +led = RGBLED(6, 7, 8, invert=True) # seting pins for the RGB led +led.set_rgb(0, 0, 0) + + +# setup background +BG = display.create_pen(0, 0, 0) +TEXT = display.create_pen(255, 255, 255) +PROX = display.create_pen(255, 0, 0) +LUX = display.create_pen(255, 255, 0) +display.set_pen(BG) +display.clear() + + +def draw_graph(lux_value, prox_value): + scaled_lux = int(200 / 1600 * lux_value) + scaled_prox = int(200 / 1600 * prox_value) + display.set_pen(BG) + display.clear() + display.set_pen(LUX) + display.rectangle(0, 240 - scaled_lux, 120, scaled_lux) + display.text("PROX: {0}".format(prox_value), 125, 120, scale=2) + display.set_pen(PROX) + display.text("LUX: {0}".format(lux_value), 5, 120, scale=2) + display.rectangle(120, 240 - scaled_prox, 120, scaled_prox) + display.set_pen(TEXT) + display.text("Light+Prox Sensor", 5, 10, scale=2) + display.text("PROX: {0}".format(prox_value), 125, 120, scale=2) + display.update() + + +PINS_BREAKOUT_GARDEN = {"sda": 4, "scl": 5} +PINS_PICO_EXPLORER = {"sda": 20, "scl": 21} + +i2c = PimoroniI2C(**PINS_BREAKOUT_GARDEN) +ltr = BreakoutLTR559(i2c) + +part_id = ltr.part_id() +print("Found LTR559. Part ID: 0x", '{:02x}'.format(part_id), sep="") + +# Draw blank graph +draw_graph(0, 0) + + +while True: + reading = ltr.get_reading() + if reading is not None: + print("Lux:", reading[BreakoutLTR559.LUX], "Prox:", reading[BreakoutLTR559.PROXIMITY]) + draw_graph(reading[BreakoutLTR559.LUX], reading[BreakoutLTR559.PROXIMITY]) + time.sleep(0.1) diff --git a/micropython/examples/pico_enviro/mic.py b/micropython/examples/pico_enviro/mic.py new file mode 100644 index 00000000..36644b1c --- /dev/null +++ b/micropython/examples/pico_enviro/mic.py @@ -0,0 +1,85 @@ +''' +Audio Sensor Example + +''' +from picographics import PicoGraphics, DISPLAY_ENVIRO_PLUS +from pimoroni import RGBLED +from machine import Pin, ADC +import time + +print("""mic.py - displays a waveform on the attached screen +""") + +display = PicoGraphics(display=DISPLAY_ENVIRO_PLUS) +display.set_backlight(1.0) + +# Setup RGB Led +led = RGBLED(6, 7, 8, invert=True) +led.set_rgb(0, 0, 0) + +# Setup background +BG = display.create_pen(0, 0, 0) +TEXT = display.create_pen(255, 255, 255) +MIC = display.create_pen(255, 0, 0) +display.set_pen(BG) +display.clear() + +# Setup analogue Channel for Mic +MIC_PIN = 26 +mic = ADC(Pin(26)) + +# array for storing +results = [] + +# Settings for bandwith and side +BANDWIDTH = 2000 +SAMPLE_N = 240 + + +# Drawing routines +def draw_background(): + display.set_pen(BG) + display.clear() + display.set_pen(TEXT) + display.text("Sound Sensor", 5, 10, scale=3) + + +def draw_txt_overlay(sensor_data): + display.set_pen(MIC) + display.text("Peak: {0}".format(sensor_data), 5, 60, scale=3) + + +def draw_wave(results_array): + + result_index = 0 + for result in results_array: + display.set_pen(MIC) + display.pixel(result_index, int(120 + result)) + result_index += 1 + + +def read_mic(): + return mic.read_u16() + + +def take_sample(frequency, length=240): + buffer = [] + for index in range(length): + buffer.append(read_mic()) + time.sleep(1 / frequency) + return buffer + + +while True: + + results = take_sample(BANDWIDTH, SAMPLE_N) + + # Rescale for display + for result_index in range(len(results)): + results[result_index] = (results[result_index] - 33100) / 30 + # Display Upates + draw_background() + draw_wave(results) + draw_txt_overlay(max(results)) + display.update() + time.sleep(0.2) diff --git a/micropython/examples/pico_enviro/particle.py b/micropython/examples/pico_enviro/particle.py new file mode 100644 index 00000000..4fb71d58 --- /dev/null +++ b/micropython/examples/pico_enviro/particle.py @@ -0,0 +1,92 @@ +''' +Particle Sensor Example + +This example requires seperate MicroPython drivers for the PMS5003 particulate sensor. +(You can find it at https://github.com/pimoroni/pms5003-micropython ) +or install from PyPi by searching for 'pms5003-micropython' in Thonny's 'Tools > Manage Packages' + +''' +from picographics import PicoGraphics, DISPLAY_ENVIRO_PLUS +from pimoroni import RGBLED +from pms5003 import PMS5003 +import machine +import time + +print("""particle.py - Continuously print all data values. +and draw a pretty histogram on display +""") + + +# Configure the PMS5003 for Enviro+ +pms5003 = PMS5003( + uart=machine.UART(1, tx=machine.Pin(8), rx=machine.Pin(9), baudrate=9600), + pin_enable=machine.Pin(3), + pin_reset=machine.Pin(2), + mode="active" +) + +display = PicoGraphics(display=DISPLAY_ENVIRO_PLUS) +display.set_backlight(1.0) + +# Setup RGB Led +led = RGBLED(6, 7, 8, invert=True) +led.set_rgb(0, 0, 0) + +# Setup background +BG = display.create_pen(0, 0, 0) +TEXT = display.create_pen(255, 255, 255) +PM10 = display.create_pen(255, 0, 0) +PM25 = display.create_pen(255, 255, 0) +PM100 = display.create_pen(0, 255, 0) +PM125 = display.create_pen(255, 255, 0) +PM1000 = display.create_pen(255, 255, 0) +display.set_pen(BG) +display.clear() + +# array for storing +results = [] + + +# Drawing routines +def draw_background(): + display.set_pen(BG) + display.clear() + display.set_pen(TEXT) + display.text("PMS5003 Sensor", 5, 10, scale=3) + + +def draw_txt_overlay(sensor_data): + display.set_pen(PM10) + display.text("PM1.0: {0}".format(sensor_data.pm_ug_per_m3(1.0)), 5, 60, scale=3) + display.set_pen(PM25) + display.text("PM2.5: {0}".format(sensor_data.pm_ug_per_m3(2.5)), 5, 80, scale=3) + display.set_pen(PM100) + display.text("PM10: {0}".format(sensor_data.pm_ug_per_m3(10)), 5, 100, scale=3) + + +def draw_hist(results_array): + + result_index = 0 + for result in results_array: + display.set_pen(PM100) + display.rectangle(2 * result_index, 240 - result.pm_ug_per_m3(10), 2, 240) + display.set_pen(PM25) + display.rectangle(2 * result_index, 240 - result.pm_ug_per_m3(2.5), 2, 240) + display.set_pen(PM10) + display.rectangle(2 * result_index, 240 - result.pm_ug_per_m3(1.0), 2, 240) + result_index += 1 + + +while True: + draw_background() + data = pms5003.read() + print(data) + results.append(data) + + if (len(results) > 120): # Scroll the result list by removing the first value + results.pop(0) + + draw_hist(results) + draw_txt_overlay(data) + display.update() + time.sleep(0.5)