3 Commits

4 changed files with 62 additions and 8 deletions

View File

@@ -104,6 +104,17 @@ So, as the `Config` class uses python's magic function for getting and setting a
- [lcdMenu](https://git.privacynerd.de/BlueFox/lcdMenu) - used for the menus - [lcdMenu](https://git.privacynerd.de/BlueFox/lcdMenu) - used for the menus
## Learning curve
Here are some of the websites I learnt a lot from while programming this project - mainly here for documentation reasons.
- [A handy guide into configuration files in json](https://bhave.sh/micropython-json-config/)
- [The official micropython wiki page about the same topic](https://docs.micropython.org/en/latest/library/json.html)
- [StackOverflow thread about how to format a json file (used by this project to make it a bit more readable)](https://stackoverflow.com/questions/16311562/python-json-without-whitespaces)
- [A guide about magic functions for settings and getting attributes](https://staskoltsov.medium.com/python-magic-methods-to-get-set-attributes-716a12d0b106)
- [The official guide into git submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules)
## License ## License
This project is licensed under GPL-3.0-or-later. See [LICENSE](LICENSE). This project is licensed under GPL-3.0-or-later. See [LICENSE](LICENSE).

49
main.py
View File

@@ -32,10 +32,51 @@ def manual():
if config.PIN_IN_BTN_1.value() == 1 or config.PIN_IN_BTN_2.value() == 1: if config.PIN_IN_BTN_1.value() == 1 or config.PIN_IN_BTN_2.value() == 1:
return True # exit on press of these buttons; True to disable the Quitting message from lcdMenu return True # exit on press of these buttons; True to disable the Quitting message from lcdMenu
def timer(): def timer():
# display WIP timer_menu = lcdMenu(config.LCD, btn_mapping, scroll_direction=True, cycle=True, hide_menu_name=False, name="TIMERS")
config.LCD.clear() timer_values = [config.TIMER_1_DURATION, config.TIMER_2_DURATION, config.TIMER_3_DURATION]
config.LCD.putstr(" Still work-in-progress") timer_splits = [lambda: divmod(round(timer_values[0]), 60), lambda: divmod(round(timer_values[1]), 60), lambda: divmod(round(timer_values[2]), 60)]
sleep(3)
def run_timer(timer_number: int, _timer: int):
interrupt_pin = config.PIN_IN_BTN_1
reset_pin = config.PIN_IN_BTN_2
start_stop_pin = config.PIN_IN_SWITCH
original = _timer
config.LCD.clear()
config.LCD.putstr(f"Timer {timer_number}".center(16))
last_start_stop_value = start_stop_pin.value()
config.PIN_OUT_RELAIS.value(last_start_stop_value)
last_time_ns = time_ns()
while True:
config.LCD.move_to(0,1)
_timer_div = divmod(round(_timer), 60)
config.LCD.putstr(f"{_timer_div[0]:02d}:{_timer_div[1]:02d}".center(16))
if interrupt_pin.value() == 1:
timer_values[timer_number-1] = _timer # save the current state
last_start_stop_value = 0 # turn the LEDs off!
config.PIN_OUT_RELAIS.value(last_start_stop_value)
return None
if reset_pin.value() == 1:
_timer = original # reset the timers
if _timer <= 0:
config.PIN_OUT_RELAIS.off()
return True
sleep(0.05)
if last_start_stop_value != (new_value := start_stop_pin.value()):
last_start_stop_value = new_value
config.PIN_OUT_RELAIS.value(new_value)
last_time_ns = time_ns()
if start_stop_pin.value() == 1:
_timer -= (time_ns() - last_time_ns) / 1000**3
last_time_ns = time_ns()
timer_programs = [(f"{timer_splits[0]()[0]:02d}:{timer_splits[0]()[1]:02d}", lambda: run_timer(1, timer_values[0])),
(f"{timer_splits[1]()[0]:02d}:{timer_splits[1]()[1]:02d}", lambda: run_timer(2, timer_values[1])),
(f"{timer_splits[2]()[0]:02d}:{timer_splits[2]()[1]:02d}", lambda: run_timer(3, timer_values[2])),
("Exit", timer_menu.stop)]
timer_menu.setup(timer_programs) # give it the callback list
timer_menu.run()
del timer_menu, timer_programs
collect()
return True # disable the "Quitting" message from lcdMenu return True # disable the "Quitting" message from lcdMenu
def uv_on(): def uv_on():
config.PIN_OUT_RELAIS.value(1) config.PIN_OUT_RELAIS.value(1)

View File

@@ -39,7 +39,10 @@ class Config:
"LCD_I2C_ADDR", # the i2c adress of the display "LCD_I2C_ADDR", # the i2c adress of the display
"LCD_I2C_NUM_ROWS", # how many rows for character display has the display? "LCD_I2C_NUM_ROWS", # how many rows for character display has the display?
"LCD_I2C_NUM_COLS", # and how many characters can it display per row? "LCD_I2C_NUM_COLS", # and how many characters can it display per row?
"LCD"] # the actual lcd object (of the PCF8574T I2C_LCD class, see libraries) "LCD", # the actual lcd object (of the PCF8574T I2C_LCD class, see libraries)
"TIMER_1_DURATION", # the duration of the first timer in seconds
"TIMER_2_DURATION", # the duration of the second first timer in seconds
"TIMER_3_DURATION"] # the duration of the third timer in seconds
self._config_file = config_file self._config_file = config_file
self.load_config() self.load_config()
@@ -130,4 +133,3 @@ def log(log_level: int, message: str):
print(f"{message}") print(f"{message}")
elif cfg.LOG_LEVEL >= log_level: # if log level is valid elif cfg.LOG_LEVEL >= log_level: # if log level is valid
print(f"[{log_mapping[log_level]}] {message}") print(f"[{log_mapping[log_level]}] {message}")