From 784e1d15041850abaa223bf6883b727f93a73aba Mon Sep 17 00:00:00 2001 From: Dave Astels Date: Wed, 6 Feb 2019 21:16:20 -0500 Subject: [PATCH] Add Jar Minder v2 code --- Jar_Minder_v2/code.py | 258 ++++++++++++++++++++++++++++++++++ Jar_Minder_v2/description.txt | 3 + Jar_Minder_v2/font.py | 155 ++++++++++++++++++++ Jar_Minder_v2/settings.txt | 8 ++ 4 files changed, 424 insertions(+) create mode 100644 Jar_Minder_v2/code.py create mode 100644 Jar_Minder_v2/description.txt create mode 100644 Jar_Minder_v2/font.py create mode 100644 Jar_Minder_v2/settings.txt diff --git a/Jar_Minder_v2/code.py b/Jar_Minder_v2/code.py new file mode 100644 index 000000000..8012ae2fb --- /dev/null +++ b/Jar_Minder_v2/code.py @@ -0,0 +1,258 @@ +import digitalio +import board + +done = digitalio.DigitalInOut(board.A4) +done.direction = digitalio.Direction.OUTPUT +done.value = False + +import time +import pulseio +import busio +from adafruit_epd.epd import Adafruit_EPD +from adafruit_epd.il0373 import Adafruit_IL0373 +import adafruit_si7021 +import font + +#-------------------------------------------------- +# Setup + +spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO) +ecs = digitalio.DigitalInOut(board.D11) +dc = digitalio.DigitalInOut(board.D10) +srcs = digitalio.DigitalInOut(board.D9) +rst = digitalio.DigitalInOut(board.D6) +busy = digitalio.DigitalInOut(board.D12) +display = Adafruit_IL0373(152, 152, rst, dc, busy, srcs, ecs, spi) + +i2c = busio.I2C(board.SCL, board.SDA) +sensor = adafruit_si7021.SI7021(i2c) + +ON = 2**15 +OFF = 0 + +buzzer = pulseio.PWMOut(board.D5, variable_frequency=True) +buzzer.duty_cycle = OFF + +silence_button = digitalio.DigitalInOut(board.A5) +silence_button.direction = digitalio.Direction.INPUT +silence_button.pull = digitalio.Pull.UP + +#-------------------------------------------------- +# Default parameter values + +settings = {} +settings['temperature_range'] = (15, 30) +settings['humidity_range'] = (60, 70) +settings['title'] = 'Weed Minder' +settings['alarm_frequency'] = 4000 +settings['alarm_number_of_beeps'] = 3 +settings['alarm_seconds_beep_on'] = 0.5 +settings['alarm_seconds_between_beeps'] = 0.5 +settings['alarm_seconds_between_alarms'] = 5.0 +settings['alarm_timeout'] = 60.0 + +#-------------------------------------------------- +# Support functions + +def render_character(x, y, ch, color=Adafruit_EPD.BLACK): + """Render a character. + :param int x: horizontal position of the left edge of the character + :param int y: vertical position of the top edge of the character + :param str ch: a single character string to be displayed + :param Adafruit_EPD.* color: BLACK or RED, background is always white + """ + + if x < 144 and y < 144: + bitmap = font.bitmaps[ord(ch)] + for row_num in range(8): + row = bitmap[row_num] + for column_num in range(8): + if (row & 1) == 0: + display.draw_pixel(x + column_num, y + row_num, Adafruit_EPD.WHITE) + else: + display.draw_pixel(x + column_num, y + row_num, color) + row >>= 1 + + +def render_string(x, y, s, color=Adafruit_EPD.BLACK): + """Render a string. + :param int x: horizontal position of the left edge of the string + :param int y: vertical position of the top edge of the string + :param str ch: a string to be displayed + :param Adafruit_EPD.* color: BLACK or RED, background is always white + """ + + x_pos = x + for ch in s: + render_character(x_pos, y, ch, color) + x_pos += 8 + + +def centered(s): + """Computer the X position to center a string. + :param str s: the string to center + """ + + return 75 - (4 * len(s)) + + +def to_int_tuple(a): + """Convert an array of strings to a tuple of ints. + :param [int] a: array of strings to convert + """ + + return tuple([int(x.strip()) for x in a]) + + +def check_for_push(button, duration): + """Wait for a time, regularly checking for a button push. + :param DigitalInOut button: the button input to check + :param float duration: seconds to wait + Return True if the button is pushed, False if the time passes + """ + + stop_at = time.monotonic() + duration + while time.monotonic() < stop_at: + if not button.value: + return True + time.sleep(0.1) + return False + + +def sound_alarm(): + """Sound the alarm based on the settings.""" + + buzzer.frequency = settings['alarm_frequency'] + for _ in range(settings['alarm_number_of_beeps']): + buzzer.duty_cycle = ON + if check_for_push(silence_button, settings['alarm_seconds_beep_on']): + buzzer.duty_cycle = OFF + return True + buzzer.duty_cycle = OFF + if check_for_push(silence_button, settings['alarm_seconds_between_beeps']): + return True + return False + + + +def out_of_range(t, h): + """Check if either temperature and humidity is out of range. + :param float t: temperature reading + :param float h: humidity reading + """ + + if t < settings['temperature_range'][0]: + return True + if t > settings['temperature_range'][1]: + return True + if h < settings['humidity_range'][0]: + return True + if h > settings['humidity_range'][1]: + return True + return False + + +#-------------------------------------------------- +# Handle edit mode: allow the user to edit description and settings +# This is done by waking the device while holding the silence button pressed +# A low beep indicated entry and the display will indicate it as well + +if not silence_button.value: + buzzer.frequency = 440 + buzzer.duty_cycle = ON + time.sleep(0.5) + buzzer.duty_cycle = OFF + display.clear_buffer() + render_string(39, 64, 'EDIT MODE') + display.display() + while not silence_button.value: # wait for button to be released + pass + while silence_button.value: # wait for button to be pressed + pass + buzzer.duty_cycle = ON + time.sleep(0.5) + buzzer.duty_cycle = OFF + +# Pressing the silence button again reverts to monitor mode +# A low beep indicates this + +#-------------------------------------------------- +# Main script + +# Read settings file into setting dictionary +with open('settings.txt', 'r') as f: + for line in f: + key, value = line.strip().split(':').strip() + values = value.split('-') + if key == 'temperature_range': + setting = to_int_tuple(values) + elif key == 'humidity_range': + setting = to_int_tuple(values) + elif key == 'title': + setting = value + elif key == 'alarm_frequency': + setting = int(value) + elif key == 'alarm_number_of_beeps': + setting = int(value) + elif key == 'alarm_seconds_beep_on': + setting = float(value) + elif key == 'alarm_seconds_between_beeps': + setting = float(value) + elif key == 'alarm_timeout': + setting = float(value) + settings[key] = setting + + # Get text +with open('description.txt', 'r') as f: + text = [line.strip() for line in f] + +display.clear_buffer() +render_string(centered(settings['title']), 12, settings['title']) + +# Display text +row_index = 64 +for line in text: + if row_index > 112: + break + render_string(centered(line), row_index, line) + row_index += 10 + +temperature = int(sensor.temperature) +humidity = int(sensor.relative_humidity) +render_string(8, 32, '{0:2d} C'.format(temperature)) +render_string(112, 32, '{0:2d} %'.format(humidity)) + +if temperature < settings['temperature_range'][0]: + temperature_message = 'LOW TEMPERATURE' +elif temperature > settings['temperature_range'][1]: + temperature_message = 'HIGH TEMPERATURE' +else: + temperature_message = '' + +if humidity < settings['humidity_range'][0]: + humidity_message = 'LOW HUMIDITY' +elif humidity > settings['humidity_range'][1]: + humidity_message = 'HIGH HUMIDITY' +else: + humidity_message = '' + +if temperature_message: + render_string(centered(temperature_message), 122, temperature_message, Adafruit_EPD.RED) +if humidity_message: + render_string(centered(humidity_message), 132, humidity_message, Adafruit_EPD.RED) + +if temperature_message or humidity_message: + display.fill_rect(0, 0, 152, 10, Adafruit_EPD.RED) + display.fill_rect(0, 142, 152, 10, Adafruit_EPD.RED) + +display.display() + +timeout = time.monotonic() + settings['alarm_timeout'] + +while out_of_range(sensor.temperature, sensor.humidity) and time.monotonic() < timeout: + if sound_alarm(): + break + if check_for_push(silence_button, settings['alarm_seconds_between_alarms']): + break + +done.value = True diff --git a/Jar_Minder_v2/description.txt b/Jar_Minder_v2/description.txt new file mode 100644 index 000000000..1fb15f5e5 --- /dev/null +++ b/Jar_Minder_v2/description.txt @@ -0,0 +1,3 @@ +Description +of +Contents diff --git a/Jar_Minder_v2/font.py b/Jar_Minder_v2/font.py new file mode 100644 index 000000000..a595f2338 --- /dev/null +++ b/Jar_Minder_v2/font.py @@ -0,0 +1,155 @@ +""" + 8x8 monochrome bitmap fonts for rendering + Author: Daniel Hepper + + License: Public Domain + + Based on: + // Summary: font8x8.h + // 8x8 monochrome bitmap fonts for rendering + // + // Author: + // Marcel Sondaar + // International Business Machines (public domain VGA fonts) + // + // License: + // Public Domain + + Fetched from: http://dimensionalrift.homelinux.net/combuster/mos3/?p=viewsource&file=/modules/gfx/font8_8.asm + + Converted to Python by Dave Astels +""" + +# Constant: font8x8_basic +# Contains an 8x8 font map for unicode points U+0000 - U+007F (basic latin) + +bitmaps = [ + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0000 (nul) + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0001 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0002 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0003 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0004 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0005 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0006 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0007 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0008 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0009 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+000A + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+000B + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+000C + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+000D + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+000E + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+000F + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0010 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0011 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0012 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0013 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0014 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0015 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0016 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0017 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0018 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0019 + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+001A + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+001B + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+001C + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+001D + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+001E + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+001F + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0020 (space) + [ 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00], # U+0021 (!) + [ 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0022 (") + [ 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00], # U+0023 (#) + [ 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00], # U+0024 ($) + [ 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00], # U+0025 (%) + [ 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00], # U+0026 (&) + [ 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0027 (') + [ 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00], # U+0028 (() + [ 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00], # U+0029 ()) + [ 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00], # U+002A (*) + [ 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00], # U+002B (+) + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06], # U+002C (,) + [ 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00], # U+002D (-) + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00], # U+002E (.) + [ 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00], # U+002F (/) + [ 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00], # U+0030 (0) + [ 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00], # U+0031 (1) + [ 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00], # U+0032 (2) + [ 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00], # U+0033 (3) + [ 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00], # U+0034 (4) + [ 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00], # U+0035 (5) + [ 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00], # U+0036 (6) + [ 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00], # U+0037 (7) + [ 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00], # U+0038 (8) + [ 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00], # U+0039 (9) + [ 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00], # U+003A (:) + [ 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06], # U+003B (#) + [ 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00], # U+003C (<) + [ 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00], # U+003D (=) + [ 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00], # U+003E (>) + [ 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00], # U+003F (?) + [ 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00], # U+0040 (@) + [ 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00], # U+0041 (A) + [ 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00], # U+0042 (B) + [ 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00], # U+0043 (C) + [ 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00], # U+0044 (D) + [ 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00], # U+0045 (E) + [ 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00], # U+0046 (F) + [ 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00], # U+0047 (G) + [ 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00], # U+0048 (H) + [ 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00], # U+0049 (I) + [ 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00], # U+004A (J) + [ 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00], # U+004B (K) + [ 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00], # U+004C (L) + [ 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00], # U+004D (M) + [ 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00], # U+004E (N) + [ 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00], # U+004F (O) + [ 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00], # U+0050 (P) + [ 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00], # U+0051 (Q) + [ 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00], # U+0052 (R) + [ 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00], # U+0053 (S) + [ 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00], # U+0054 (T) + [ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00], # U+0055 (U) + [ 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00], # U+0056 (V) + [ 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00], # U+0057 (W) + [ 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00], # U+0058 (X) + [ 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00], # U+0059 (Y) + [ 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00], # U+005A (Z) + [ 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00], # U+005B ([) + [ 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00], # U+005C (\) + [ 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00], # U+005D (]) + [ 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00], # U+005E (^) + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF], # U+005F (_) + [ 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00], # U+0060 (`) + [ 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00], # U+0061 (a) + [ 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00], # U+0062 (b) + [ 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00], # U+0063 (c) + [ 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00], # U+0064 (d) + [ 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00], # U+0065 (e) + [ 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00], # U+0066 (f) + [ 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F], # U+0067 (g) + [ 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00], # U+0068 (h) + [ 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00], # U+0069 (i) + [ 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E], # U+006A (j) + [ 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00], # U+006B (k) + [ 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00], # U+006C (l) + [ 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00], # U+006D (m) + [ 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00], # U+006E (n) + [ 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00], # U+006F (o) + [ 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F], # U+0070 (p) + [ 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78], # U+0071 (q) + [ 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00], # U+0072 (r) + [ 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00], # U+0073 (s) + [ 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00], # U+0074 (t) + [ 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00], # U+0075 (u) + [ 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00], # U+0076 (v) + [ 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00], # U+0077 (w) + [ 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00], # U+0078 (x) + [ 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F], # U+0079 (y) + [ 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00], # U+007A (z) + [ 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00], # U+007B ({) + [ 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00], # U+007C (|) + [ 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00], # U+007D (}) + [ 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # U+007E (~) + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] # U+007F +] diff --git a/Jar_Minder_v2/settings.txt b/Jar_Minder_v2/settings.txt new file mode 100644 index 000000000..4d7ec844e --- /dev/null +++ b/Jar_Minder_v2/settings.txt @@ -0,0 +1,8 @@ +temperature_range:15-30 +humidity_range:60-70 +title:Jar Minder +alarm_frequency:4000 +alarm_number_of_beeps:3 +alarm_seconds_beep_on:0.5 +alarm_seconds_between_beeps:0.5 +alarm_timeout:60.0