Adafruit_Learning_System_Gu.../CLUE/CLUE_Servo_Barometer/code.py
Anne Barela dc43693f17 Copy CLUE projects to new CLUE subdirectory
To "clean up" the Learn System repo, we need to move groups of guides into subdirectories. This PR duplicates the CLUE guides into the CLUE subdirectory so guides may be changed prior to deleting redundant project repos to make more space.
2025-02-24 11:21:29 -06:00

109 lines
3.4 KiB
Python

# SPDX-FileCopyrightText: 2022 Liz Clark for Adafruit Industries
# SPDX-License-Identifier: MIT
import time
import board
import simpleio
import adafruit_bmp280
import pwmio
import displayio
from adafruit_motor import servo
import terminalio
from adafruit_clue import clue
from adafruit_display_text import label
# pwm setup for servo
pwm = pwmio.PWMOut(board.D0, duty_cycle=2 ** 15, frequency=50)
gauge = servo.Servo(pwm)
# bmp280 sensor setup
i2c = board.I2C() # uses board.SCL and board.SDA
# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)
# change depending on your location's elevation
NOMINAL_PRESSURE = 1005.94
PRESSURE_RANGE = 40 # hPa, expected pressure range variance caused by local weather
PRESSURE_LOW_LIM = NOMINAL_PRESSURE - PRESSURE_RANGE
PRESSURE_HIGH_LIM = NOMINAL_PRESSURE + PRESSURE_RANGE
# board display
# scaling for terminalio font
display = board.DISPLAY
group = displayio.Group(scale=3)
# text elements
temp_header = "Temperature:"
press_header = "Pressure:"
temp_text = " ºC"
press_text = " hPa"
font = terminalio.FONT
blue = 0x0000FF
red = 0xFF0000
# temperature text elements
temp_label = label.Label(font, text=temp_header, color=red, x=5, y=10)
temp_data = label.Label(font, text=temp_text, color=red, x=5, y=25)
# pressure text elements
press_label = label.Label(font, text=press_header, color=blue, x=5, y=50)
press_data = label.Label(font, text=press_text, color=blue, x=5, y=65)
# adding text to display group
group.append(temp_label)
group.append(press_label)
group.append(temp_data)
group.append(press_data)
display.root_group = group
# function to convert celcius to fahrenheit
def c_to_f(temp):
temp_f = (temp * 9/5) + 32
return temp_f
# function to convert hPa to inHg
def hpa_to_inHg(hPa):
inches_mercury = hPa * 0.02953
return inches_mercury
# time.monotonic clock
clock = 0
# units state
metric_units = False
while True:
# non-blocking 2 second delay
if (clock + 2) < time.monotonic():
# map servo range to barometric pressure range
servo_value = simpleio.map_range(bmp280.pressure,
PRESSURE_LOW_LIM, PRESSURE_HIGH_LIM, 180, 0)
# set servo to pressure
gauge.angle = servo_value
# print data for debugging
print("\nTemperature: %0.1f C" % bmp280.temperature)
print("Pressure: %0.1f hPa" % bmp280.pressure)
print(servo_value)
# if metric units...
if metric_units:
# update temp & pressure text in celcius and hPa
temp_data.text = "%0.1f ºC" % bmp280.temperature
press_data.text = "%0.1f hPa" % bmp280.pressure
# if imperial units...
else:
# convert celcius to fahrenheit
temp_fahrenheit = c_to_f(bmp280.temperature)
# convert hPa to inHg
pressure_inHg = hpa_to_inHg(bmp280.pressure)
# update temp & pressure text
temp_data.text = "%0.1f ºF" % temp_fahrenheit
press_data.text = "%0.1f inHg" % pressure_inHg
# reset time.monotonic() clock
clock = time.monotonic()
# if a button is pressed, metric_units is True, show metric
if clue.button_a:
metric_units = True
# if b button is pressed, metric_units is False, show imperial units
if clue.button_b:
metric_units = False