On my Tufty2040 I run the following:
It’s flashed with the new V2 with filesystem uf2 file.
import time
import machine
import micropython
import picographics
from picographics import PicoGraphics, DISPLAY_TUFTY_2040, PEN_RGB332
display = PicoGraphics(display=DISPLAY_TUFTY_2040, rotate=180, pen_type=PEN_RGB332)
display.set_backlight(0.5)
display.set_font("bitmap8")
A = 1
C = 1
BACKLIGHT_LOW = micropython.const(0.35)
BACKLIGHT_HIGH = micropython.const(1.0)
LUMINANCE_LOW = micropython.const(800)
LUMINANCE_HIGH = micropython.const(3072) # 65535 to use the full range.
from breakout_bme280 import BreakoutBME280
from pimoroni_i2c import PimoroniI2C
i2c = PimoroniI2C(sda=(4), scl=(5))
bme = BreakoutBME280(i2c)
temperature, pressure, humidity = bme.read()
time.sleep(0.5)
from breakout_rtc import BreakoutRTC
from machine import RTC
RV3028 = BreakoutRTC(i2c)
rtc = BreakoutRTC(i2c)
if rtc.is_12_hour:
rtc.set_24_hour()
if rtc.read_periodic_update_interrupt_flag():
rtc.clear_periodic_update_interrupt_flag()
if rtc.update_time():
rtc_date = rtc.string_date()
rtc_time = rtc.string_time()
from machine import ADC, Pin
vbat_adc = ADC(29)
vref_adc = ADC(28)
vref_en = Pin(27)
vref_en.init(Pin.OUT)
vref_en.value(0)
usb_power = Pin(24, Pin.IN)
full_battery = 4.5
empty_battery = 2.5
lux_vref_pwr = Pin(27, Pin.OUT)
lux = ADC(26)
from pimoroni import Button
button_a = Button(7, invert=False)
button_b = Button(8, invert=False)
button_c = Button(9, invert=False)
button_up = Button(22, invert=False)
button_down = Button(6, invert=False)
button_boot = Button(23, invert=True)
t_color = display.create_pen(0,255,0)
h_color = display.create_pen(0,255,0)
p_color = display.create_pen(0,255,0)
white = display.create_pen(255,255,255)
black = display.create_pen(0,0,0)
red = display.create_pen(255,0,0)
green = display.create_pen(0,255,0)
blue = display.create_pen(0,0,255)
yellow = display.create_pen(255,255,0)
orange = display.create_pen(255,140,0)
cyan = display.create_pen(0,255,255)
WIDTH, HEIGHT = display.get_bounds()
display.set_pen(black)
display.clear()
def describe_temperature(t):
global t_color
if t < -10:
description = "Very Cold"
t_color = white
elif -10 <= t <= 0:
description = "Cold"
t_color = blue
elif 0 < t <= 12:
description = "Cool"
t_color = yellow
elif 12 < t <= 16:
description = "OK"
t_color = green
elif 16 < t <= 24:
description = "Warm"
t_color = green
elif 24 < t <= 27:
description = "Hot"
t_color = orange
elif t > 27:
description = "Very Hot"
t_color = red
return description
def describe_humidity(h):
global h_color
if h < 30:
description = "Low"
h_color = red
elif 30 <= h <= 60:
description = "OK"
h_color = green
elif 60 < h < 80:
description = "High"
h_color = yellow
elif h >= 80:
description = "Very High"
h_color = orange
return description
def describe_pressure(p):
global p_color
if p < 982:
description = "Very Low"
p_color = red
elif 982 <= p < 1004:
description = "Low"
p_color = yellow
elif 1004 <= p < 1026:
description = "OK"
p_color = green
elif 1026 <= p < 1048:
description = "High"
p_color = blue
elif p >= 1048:
description = "Very High"
p_color = orange
return description
def draw_graph(temp_value, press_value, humid_value):
if C == 1:
scaled_temp = int(t * 10)
if scaled_temp <= 9:
scaled_temp =9
if scaled_temp >= 310:
scaled_temp =310
describe_temperature(t)
display.set_pen(yellow)
display.rectangle(9,89,116,19)
display.set_pen(white)
display.circle(9,98,9)
display.set_pen(green)
display.rectangle(127,89,111,19)
display.set_pen(orange)
display.rectangle(240,89,28,19)
display.set_pen(red)
display.rectangle(270,89,44,19)
display.circle(310,98,9)
display.set_pen(black)
display.circle((scaled_temp),98,9)
display.set_pen(white)
display.circle((scaled_temp),98,5)
if C == 0:
scaled_temp = int((t * 5) + 160)
if scaled_temp <= 9:
scaled_temp =9
if scaled_temp >= 310:
scaled_temp =310
describe_temperature(t)
display.set_pen(blue)
display.circle(9, 98, 9)
display.rectangle(12, 89, 92, 19)
display.set_pen(white)
display.rectangle(106, 89, 53, 19)
display.set_pen(yellow)
display.rectangle(161,89,58,19)
display.set_pen(green)
display.rectangle(221,89,58,19)
display.set_pen(orange)
display.rectangle(281,89,13,19)
display.set_pen(red)
display.rectangle(296,89,15,19)
display.circle(310,98,9)
display.set_pen(black)
display.circle((scaled_temp),98,9)
display.set_pen(white)
display.circle((scaled_temp),98,5)
display.set_pen(t_color)
scaled_humid = int(h * (320 / 100))
if scaled_humid <= 9:
scaled_humid =9
if scaled_humid >= 310:
scaled_humid =310
describe_humidity(h)
display.set_pen(red)
display.circle(9, 164, 9)
display.rectangle(12,155,82,19)
display.set_pen(green)
display.rectangle(96,155,94,19)
display.set_pen(yellow)
display.rectangle(192,155,62,19)
display.set_pen(orange)
display.rectangle(256,155,55,19)
display.circle(310,164,9)
display.set_pen(black)
display.circle((scaled_humid),164,9)
display.set_pen(white)
display.circle((scaled_humid),164,5)
display.set_pen(h_color)
display.text(describe_humidity(h),130,125,scale=3)
scaled_press = int((p - 960) * 3)
if scaled_press <= 9:
scaled_press =9
if scaled_press >= 310:
scaled_press =310
describe_pressure(p)
display.set_pen(red)
display.circle(9, 230, 9)
display.rectangle(12,221,50,19)
display.set_pen(yellow)
display.rectangle(64,221,62,19)
display.set_pen(green)
display.rectangle(128,221,62,19)
display.set_pen(blue)
display.rectangle(192,221,62,19)
display.set_pen(orange)
display.rectangle(256,221,52,19)
display.circle(310, 230, 9)
display.set_pen(black)
display.line(127,221,127,240)
display.circle((scaled_press),230,9)
display.set_pen(white)
display.circle((scaled_press),230,5)
display.set_pen(p_color)
display.text(describe_pressure(p),130,191,scale=3)
def describe_month(month):
month = rtc.get_month()
if month == 1:
description = "Jan"
elif month == 2:
description = "Feb"
elif month == 3:
description = "Mar"
elif month == 4:
description = "Apr"
elif month == 5:
description = "May"
elif month == 6:
description = "Jun"
elif month == 7:
description = "Jul"
elif month == 8:
description = "Aug"
elif month == 9:
description = "Sep"
elif month == 10:
description = "Oct"
elif month == 11:
description = "Nov"
elif month == 12:
description = "Dec"
return description
def describe_date(date):
date = rtc.get_date()
if date == 1:
description = "st"
elif date == 2:
description = "nd"
elif date == 3:
description = "rd"
elif date == 21:
description = "st"
elif date == 22:
description = "nd"
elif date == 23:
description = "rd"
elif date == 31:
description = "st"
else:
description = "th"
return description
def auto_brightness(previous: float) -> (float, float):
luminance = lux.read_u16()
luminance_frac = max(0.0, float(luminance - LUMINANCE_LOW))
luminance_frac = min(1.0, luminance_frac / (LUMINANCE_HIGH - LUMINANCE_LOW))
backlight = BACKLIGHT_LOW + (luminance_frac * (BACKLIGHT_HIGH - BACKLIGHT_LOW))
backlight_diff = backlight - previous
backlight = previous + (backlight_diff * (1.0 / 8.0))
return (luminance, backlight)
backlight = BACKLIGHT_LOW
start_time = time.time()
display.set_pen(black)
display.clear()
display.update()
def set_pico_time():
# set the Pico's RTC from the RTC breakout
RV3028.update_time()
RTC().datetime([RV3028.get_year(), RV3028.get_month(), RV3028.get_date(),
RV3028.get_weekday(), RV3028.get_hours(), RV3028.get_minutes(),
RV3028.get_seconds(), 0])
print(f"Pico RTC set to breakout time: {RV3028.string_date()} {RV3028.string_time()}")
temperature, pressure, humidity = bme.read()
time.sleep(0.5)
temperature, pressure, humidity = bme.read()
time.sleep(0.5)
t = round(temperature)
min_temperature = t
max_temperature = t
while True:
display.set_pen(black)
display.clear()
if usb_power.value() == 1:
BACKLIGHT_LOW = micropython.const(0.35)
else:
BACKLIGHT_LOW = micropython.const(0.4)
vref_en.value(1)
vdd = 1.24 * (65535 / vref_adc.read_u16())
vbat = (
(vbat_adc.read_u16() / 65535) * 3 * vdd
)
vref_en.value(0)
percentage = 100 * ((vbat - empty_battery) / (full_battery - empty_battery))
if percentage > 100:
percentage = 100
if percentage < 0:
percentage = 0
if A == 1:
lux_vref_pwr.value(1)
(luminance, backlight) = auto_brightness(backlight)
lux_vref_pwr.value(0)
display.set_backlight(backlight)
time_elapsed = time.time() - start_time
hours = rtc.get_hours()
minutes = rtc.get_minutes()
month = rtc.get_month()
date = rtc.get_date()
weekday = rtc.get_weekday()
if rtc.read_periodic_update_interrupt_flag():
rtc.clear_periodic_update_interrupt_flag()
if rtc.update_time():
rtc_date = rtc.string_date()
rtc_time = rtc.string_time()
if button_a.is_pressed:
A = 1
if button_b.is_pressed:
if percentage > 100:
percentage = 100
if percentage < 0:
percentage = 0
if percentage >= 50:
display.set_pen(green)
display.text("Battery",0,9,scale=3)
display.text("{:0.2f}v".format(vbat),150,9,scale=3)
display.text("{:0.0f}%".format(percentage),265,9,scale=3)
elif 50 > percentage > 20:
display.set_pen(yellow)
display.text("Battery",0,9, scale=3)
display.text("{:0.2f}v".format(vbat),150,9,scale=3)
display.text("{:0.0f}%".format(percentage),265,9,scale=3)
elif percentage <= 20:
display.set_pen(red)
display.text("Battery",0,9,scale=3)
display.text("{:0.2f}v".format(vbat),150,9,scale=3)
display.text("{:0.0f}%".format(percentage),265,9,scale=3)
else:
display.set_pen(white)
weekday = rtc.get_weekday()
if weekday == 0:
display.text("Mon",0,9,scale=3)
if weekday == 1:
display.text("Tue",0,9,scale=3)
if weekday == 2:
display.text("Wed",0,9,scale=3)
if weekday == 3:
display.text("Thu",0,9,scale=3)
if weekday == 4:
display.text("Fri",0,9,scale=3)
if weekday == 5:
display.text("Sat",0,9, scale=3)
if weekday == 6:
display.text("Sun",0,9, scale=3)
display.text(f"{describe_month(month)} {date}{describe_date(date)}",60,9,scale=3)
if hours == 0:
display.text(f"{12}:{minutes:02} AM",190,9,scale=3)
elif 0 < hours < 10:
display.text(f"{hours:1}:{minutes:02} AM",190,9,scale=3)
elif 10 <= hours < 12:
display.text(f"{hours:2}:{minutes:02} AM",190,9,scale=3)
elif hours == 12:
display.text(f"{hours:2}:{minutes:02} PM",190,9,scale=3)
elif hours >12:
hours = hours - 12
if hours <10:
display.text(f"{hours:1}:{minutes:02} PM",190,9,scale=3)
elif 10 <= hours < 12:
display.text(f"{hours:2}:{minutes:02} PM",190,9,scale=3)
elif hours == 12:
display.text(f"{hours:2}:{minutes:02} AM",190,9,scale=3)
if button_c.is_pressed:
C = 1
min_temperature = t
max_temperature = t
time.sleep(0.2)
if button_up.is_pressed:
A = 0
display.set_backlight(1.0)
if button_down.is_pressed:
A = 0
display.set_backlight(0.0)
if button_boot.is_pressed:
set_pico_time()
temperature, pressure, humidity = bme.read()
pressuremb = pressure / 100
t = round(temperature)
h = round(humidity)
p = round(pressuremb)
if t <= 0:
C = 0
if t >= 12:
C = 1
display.set_pen(white)
display.text("{:0.0f}°C" .format(t), 5, 52, scale=4)
display.text("{:0.0f}%".format(h), 5, 118, scale=4)
display.text("{:0.0f}mb".format(p), 5, 184, scale=4)
draw_graph(temperature, pressure, humidity)
if t >= max_temperature:
max_temperature = t
if t <= min_temperature:
min_temperature = t
display.set_pen(cyan)
display.text(f"Min {min_temperature:.0f}", 110, 57, WIDTH, scale=3)
display.set_pen(cyan)
display.text(f"Max {max_temperature:.0f}", 225, 57, WIDTH, scale=3)
temperature, pressure, humidity = bme.read()
display.update()
time.sleep(0.25)
Which gets me this:
I’ve been tying to port it over to my new Tufty2350.
where I’m currently stuck is getting the date and time from the onboard RTC.
And the API isn’t helping?
Meet Badger, Tufty, and Blinky - the Digital Badge Crew
Here is my current code and the error message I’m getting.
import time
import math
import machine
import micropython
from badgeware import State, rtc
from breakout_bme280 import BreakoutBME280
from machine import RTC
from machine import I2C
A = 1
C = 1
temperature_sensor = BreakoutBME280(I2C())
reading = temperature_sensor.read()
reading = [round(r, 0) for r in reading]
temperature, pressure, humidity = reading
time.sleep(0.5)
def describe_temperature(t):
global t_color
if t < -10:
description = "Very Cold"
t_color = white
elif -10 <= t <= 0:
description = "Cold"
t_color = blue
elif 0 < t <= 12:
description = "Cool"
t_color = yellow
elif 12 < t <= 16:
description = "OK"
t_color = green
elif 16 < t <= 24:
description = "Warm"
t_color = green
elif 24 < t <= 27:
description = "Hot"
t_color = orange
elif t > 27:
description = "Very Hot"
t_color = red
return description
def describe_humidity(h):
global h_color
if h < 30:
description = "Low"
h_color = red
elif 30 <= h <= 60:
description = "OK"
h_color = green
elif 60 < h < 80:
description = "High"
h_color = yellow
elif h >= 80:
description = "Very High"
h_color = orange
return description
def describe_pressure(p):
global p_color
if p < 982:
description = "Very Low"
p_color = red
elif 982 <= p < 1004:
description = "Low"
p_color = yellow
elif 1004 <= p < 1026:
description = "OK"
p_color = green
elif 1026 <= p < 1048:
description = "High"
p_color = blue
elif p >= 1048:
description = "Very High"
p_color = orange
return description
def draw_graph(temp_value, press_value, humid_value):
if C == 1:
scaled_temp = int(t * 10)
if scaled_temp <= 9:
scaled_temp =9
if scaled_temp >= 310:
scaled_temp =310
describe_temperature(t)
screen.pen = (yellow)
screen.rectangle(9,89,116,19)
screen.pen = (white)
screen.circle(9,98,9)
screen.pen = (green)
screen.rectangle(127,89,111,19)
screen.pen = (orange)
screen.rectangle(240,89,28,19)
screen.pen = (red)
screen.rectangle(270,89,44,19)
screen.circle(310,98,9)
screen.pen = (black)
screen.circle((scaled_temp),98,9)
screen.pen = (white)
screen.circle((scaled_temp),98,5)
if C == 0:
scaled_temp = int((t * 5) + 160)
if scaled_temp <= 9:
scaled_temp =9
if scaled_temp >= 310:
scaled_temp =310
describe_temperature(t)
screen.pen = (blue)
screen.circle(9, 98, 9)
screen.rectangle(12, 89, 92, 19)
screen.pen = (white)
screen.rectangle(106, 89, 53, 19)
screen.pen = (yellow)
screen.rectangle(161,89,58,19)
screen.pen = (green)
screen.rectangle(221,89,58,19)
screen.pen = (orange)
screen.rectangle(281,89,13,19)
screen.pen = (red)
screen.rectangle(296,89,15,19)
screen.circle(310,98,9)
screen.pen = (black)
screen.circle((scaled_temp),98,9)
screen.pen = (white)
screen.circle((scaled_temp),98,5)
screen.pen = (t_color)
scaled_humid = int(h * (320 / 100))
if scaled_humid <= 9:
scaled_humid =9
if scaled_humid >= 310:
scaled_humid =310
describe_humidity(h)
screen.pen = (red)
screen.circle(9, 164, 9)
screen.rectangle(12,155,82,19)
screen.pen = (green)
screen.rectangle(96,155,94,19)
screen.pen = (yellow)
screen.rectangle(192,155,62,19)
screen.pen = (orange)
screen.rectangle(256,155,55,19)
screen.circle(310,164,9)
screen.pen = (black)
screen.circle((scaled_humid),164,9)
screen.pen = (white)
screen.circle((scaled_humid),164,5)
screen.pen = (h_color)
screen.text(describe_humidity(h),130,125,scale=3)
scaled_press = int((p - 960) * 3)
if scaled_press <= 9:
scaled_press =9
if scaled_press >= 310:
scaled_press =310
describe_pressure(p)
screen.pen = (red)
screen.circle(9, 230, 9)
screen.rectangle(12,221,50,19)
screen.pen = (yellow)
screen.rectangle(64,221,62,19)
screen.pen = (green)
screen.rectangle(128,221,62,19)
screen.pen = (blue)
screen.rectangle(192,221,62,19)
screen.pen = (orange)
screen.rectangle(256,221,52,19)
screen.circle(310, 230, 9)
screen.pen = (black)
screen.line(127,221,127,240)
screen.circle((scaled_press),230,9)
screen.pen = (white)
screen.circle((scaled_press),230,5)
screen.pen = (p_color)
screen.text(describe_pressure(p),130,191,scale=3)
def describe_month(month):
month = rtc.datetime[1]
if month == 1:
description = "Jan"
elif month == 2:
description = "Feb"
elif month == 3:
description = "Mar"
elif month == 4:
description = "Apr"
elif month == 5:
description = "May"
elif month == 6:
description = "Jun"
elif month == 7:
description = "Jul"
elif month == 8:
description = "Aug"
elif month == 9:
description = "Sep"
elif month == 10:
description = "Oct"
elif month == 11:
description = "Nov"
elif month == 12:
description = "Dec"
return description
def describe_date(date):
day = rtc.datetime[2]
if day == 1:
description = "st"
elif day == 2:
description = "nd"
elif day == 3:
description = "rd"
elif day == 21:
description = "st"
elif day == 22:
description = "nd"
elif day == 23:
description = "rd"
elif day == 31:
description = "st"
else:
description = "th"
return description
temperature, pressure, humidity = temperature_sensor.read()
time.sleep(0.5)
temperature, pressure, humidity = temperature_sensor.read()
time.sleep(0.5)
while True:
screen.pen = color.black
screen.clear()
rtc.datetime() # <<<< Line 331
'''
year = rtc.datetime[0]
month = rtc.datetime[1]
day = rtc.datetime[2]
hour = rtc.datetime[3]
minute = rtc.datetime[4]
seconds = rtc.datetime[5]
'''
if badge.pressed(BUTTON_A):
A = 1
if badge.pressed(BUTTON_B):
else:
screen.pen = color.white
weekday = dow
if weekday == 0:
screen.text("Mon",0,9)
if weekday == 1:
screen.text("Tue",0,9)
if weekday == 2:
screen.text("Wed",0,9)
if weekday == 3:
screen.text("Thu",0,9)
if weekday == 4:
screen.text("Fri",0,9)
if weekday == 5:
screen.text("Sat",0,9)
if weekday == 6:
sreen.text("Sun",0,9)
screen.text(f"{describe_month(month)} {date}{describe_date(date)}",60,9,)
if hours == 0:
screen.text(f"{12}:{minutes:02} AM",190,9)
elif 0 < hours < 10:
screen.text(f"{hours:1}:{minutes:02} AM",190,9)
elif 10 <= hours < 12:
screen.text(f"{hours:2}:{minutes:02} AM",190,9)
elif hours == 12:
screen.text(f"{hours:2}:{minutes:02} PM",190,9)
elif hours >12:
hours = hours - 12
if hours <10:
screen.text(f"{hours:1}:{minutes:02} PM",190,9)
elif 10 <= hours < 12:
screen.text(f"{hours:2}:{minutes:02} PM",190,9)
elif hours == 12:
screen.text(f"{hours:2}:{minutes:02} AM",190,9)
if badge.pressed(BUTTON_C):
C = 1
min_temperature = t
max_temperature = t
time.sleep(0.2)
if badge.pressed(BUTTON_UP):
A = 0
screen.set_backlight(1.0)
if badge.pressed(BUTTON_DOWN):
A = 0
screen.set_backlight(0.0)
temperature, pressure, humidity = bme.read()
pressuremb = pressure / 100
if t <= 0:
C = 0
if t >= 12:
C = 1
screen.pen = (white)
screen.text("{:0.0f}°C" .format(t), 5, 52)
screen.text("{:0.0f}%".format(h), 5, 118)
screen.text("{:0.0f}mb".format(p), 5, 184)
#draw_graph(temperature, pressure, humidity)
if t >= max_temperature:
max_temperature = t
if t <= min_temperature:
min_temperature = t
screen.pen = (cyan)
screen.text(f"Min {min_temperature:.0f}", 110, 57, WIDTH)
screen.pen = (cyan)
screen.text(f"Max {max_temperature:.0f}", 225, 57, WIDTH)
temperature, pressure, humidity = bme.read()
screen.update()
time.sleep(0.25)
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot
Traceback (most recent call last):
File "<stdin>", line 331, in <module>
TypeError: 'module' object isn't callable



