Need Help: Pico weather station guide using the Pico Explorer

I’ve added color options to the Humidity and Pressure readings. I also tweaked some settings to match what I use on other Weather setups I have here at home. The pressure bands mostly. For me its a BME688 on a Breakout Garden base. It shouldn’t be too hard to see what I did and modify your existing file if you wish.
I just built on top of Hel’s awesome code.

# This example lets you plug a BME680 or BME688 breakout into your Pico Explorer to make a little indoor weather station, with barometer style descriptions.

import utime

from breakout_bme68x import BreakoutBME68X
from pimoroni_i2c import PimoroniI2C

# Pico Explorer boilerplate
import picoexplorer as display
width = display.get_width()
height = display.get_height()
display_buffer = bytearray(width * height * 2)
display.init(display_buffer)

PINS_BREAKOUT_GARDEN = {"sda": 4, "scl": 5}
PINS_PICO_EXPLORER = {"sda": 20, "scl": 21}

i2c = PimoroniI2C(**PINS_BREAKOUT_GARDEN)
bme = BreakoutBME68X(i2c)

# lets set up some pen colours to make drawing easier
tempcolour = display.create_pen(255, 255, 255)  # this colour will get changed in a bit
humidcolour = display.create_pen(255, 255, 255)  # this colour will get changed in a bit
presscolour = display.create_pen(255, 255, 255)  # this colour will get changed in a bit
white = display.create_pen(255, 255, 255)
black = display.create_pen(0, 0, 0)
red = display.create_pen(255, 0, 0)


# converts the temperature into a barometer-type description and pen colour
def describe_temperature(temperature):
    global tempcolour
    if temperature < 0:
        description = "very cold"
        tempcolour = display.create_pen(0, 0, 255)
    elif 0 <= temperature < 20:
        description = "cold"
        tempcolour = display.create_pen(255, 255, 0)
    elif 13 <= temperature < 25:
        description = "temperate"
        tempcolour = display.create_pen(0, 255, 0)
    elif 25 <= temperature < 30:
        description = "hot"
        tempcolour = display.create_pen(255, 140, 0)
    elif temperature >= 30:
        description = "very hot"
        tempcolour = display.create_pen(255, 0, 0)
    else:
        description = ""
        tempcolour = display.create_pen(0, 0, 0)
    return description

# converts pressure into barometer-type description
def describe_pressure(pressure):
    global presscolour
    if pressure < 982:
        description = "storm"
        presscolour = display.create_pen(255, 0, 0)
    elif 982 <= pressure < 1004:
        description = "rain"
        presscolour = display.create_pen(255, 255, 0)
    elif 1004 <= pressure < 1026:
        description = "change"
        presscolour = display.create_pen(0, 255, 0)
    elif 1026 <= pressure < 1048:
        description = "fair"
        presscolour = display.create_pen(0, 0, 255)
    elif pressure >= 1048:
        description = "dry"
        presscolour = display.create_pen(255, 140, 0)
    else:
        description = ""
        presscolour = display.create_pen(0, 0, 0)
    return description


# converts humidity into good/bad description
def describe_humidity(humidity):
    global humidcolour
    if humidity < 30:
        description = "dry"
        humidcolour = display.create_pen(255, 0, 0)
    elif 30 <= humidity <= 60:
        description = "good"
        humidcolour = display.create_pen(0, 255, 0)
    elif humidity > 60:
        description = "humid"
        humidcolour = display.create_pen(255, 140, 0)
    return description


while True:
    # read the sensors
    temperature, pressure, humidity, gas_resistance, status, gas_index, meas_index = bme.read()

    # pressure comes in pascals which is a reight long number, lets convert it to the more manageable hPa
    pressurehpa = pressure / 100

    # draw a thermometer/barometer thingy
    display.set_pen(125, 125, 125)
    display.circle(190, 190, 40)
    display.rectangle(180, 45, 20, 140)

    # switch to red to draw the 'mercury'
    display.set_pen(red)
    display.circle(190, 190, 30)
    thermometerheight = int(120 / 30 * temperature)
    if thermometerheight > 120:
        thermometerheight = 120
    if thermometerheight < 1:
        thermometerheight = 1
    display.rectangle(186, 50 + 120 - thermometerheight, 10, thermometerheight)

    # drawing the temperature text
    display.set_pen(white)
    display.text("temperature:", 10, 10, 240, 3)
    display.set_pen(tempcolour)
    display.text('{:.1f}'.format(temperature) + 'C', 10, 30, 240, 5)
    display.set_pen(white)
    display.text(describe_temperature(temperature), 10, 60, 240, 3)

    # and the pressure text
    display.set_pen(white)
    display.text("pressure:", 10, 90, 240, 3)
    display.set_pen(presscolour)
    display.text('{:.0f}'.format(pressurehpa) + 'mb', 10, 110, 240, 5)
    display.set_pen(white)
    display.text(describe_pressure(pressurehpa), 10, 140, 240, 3)

    # and the humidity text
    display.set_pen(white)
    display.text("humidity:", 10, 170, 240, 3)
    display.set_pen(humidcolour)
    display.text('{:.0f}'.format(humidity) + '%', 10, 190, 240, 5)
    display.set_pen(white)
    display.text(describe_humidity(humidity), 10, 220, 240, 3)

    # time to update the display
    display.update()

    # waits for 1 second and clears to black
    utime.sleep(1)
    display.set_pen(black)
    display.clear()
1 Like