diff --git a/.github/workflows/pio-build-multi-platform.yml b/.github/workflows/pio-build-multi-platform.yml index 19a22cc..c49ca51 100644 --- a/.github/workflows/pio-build-multi-platform.yml +++ b/.github/workflows/pio-build-multi-platform.yml @@ -14,11 +14,10 @@ jobs: # Set fail-fast to false to ensure that feedback is delivered for all matrix combinations. Consider changing this to true when your workflow is stable. fail-fast: false - # Set up a matrix to run the following 3 configurations: - # 1. - # 2. - # 3. - # + # Set up a matrix to run the following 2 configurations: + # 1. + # 2. + # To add more build types (Release, Debug, RelWithDebInfo, etc.) customize the build_type list. matrix: os: [ubuntu-latest, windows-latest] @@ -52,3 +51,7 @@ jobs: - name: Build PlatformIO Project for 4MB flash run: pio run --environment esp32dev working-directory: ./EleksTubeHAX_pio + + - name: Build PlatformIO Project for 8MB flash + run: pio run --environment esp32dev8MB + working-directory: ./EleksTubeHAX_pio diff --git a/EleksTubeHAX_pio/.vscode/settings.json b/EleksTubeHAX_pio/.vscode/settings.json deleted file mode 100644 index e69de29..0000000 diff --git a/EleksTubeHAX_pio/boards/esp32dev8MB.json b/EleksTubeHAX_pio/boards/esp32dev8MB.json new file mode 100644 index 0000000..e251ac0 --- /dev/null +++ b/EleksTubeHAX_pio/boards/esp32dev8MB.json @@ -0,0 +1,37 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32_out.ld" + }, + "core": "esp32", + "extra_flags": "-DARDUINO_ESP32_DEV", + "f_cpu": "240000000L", + "f_flash": "40000000L", + "flash_mode": "dio", + "mcu": "esp32", + "variant": "esp32" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_board": "esp-wroom-32.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Espressif ESP32 Dev Module 8MB", + "upload": { + "flash_size": "8MB", + "maximum_ram_size": 327680, + "maximum_size": 8388608, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://en.wikipedia.org/wiki/ESP32", + "vendor": "Espressif" +} diff --git a/EleksTubeHAX_pio/partition_noOta_1Mapp_3Mspiffs.csv b/EleksTubeHAX_pio/partition_noOta_1Mapp_3Mspiffs.csv index 61ce0cf..da6a1ce 100644 --- a/EleksTubeHAX_pio/partition_noOta_1Mapp_3Mspiffs.csv +++ b/EleksTubeHAX_pio/partition_noOta_1Mapp_3Mspiffs.csv @@ -5,9 +5,9 @@ # # app0 must be aligned on 0x10000 (!) # -# Name, Type, SubType, Offset, Size, Flags -# partition table 0x0000, 0x9000, <- automatically generated, do not un-comment. -nvs, data, nvs, 0x9000, 0x7000, -app0, app, factory, 0x10000, 0x120000, +# Name, Type, SubType, Offset, Size, Flags +# partition table 0x000000, 0x009000, <- automatically generated, do not un-comment. +nvs, data, nvs, 0x009000, 0x007000, +app0, app, factory, 0x010000, 0x120000, spiffs, data, spiffs, 0x130000, 0x2D0000, # end of 4 MB flash 0x400000 \ No newline at end of file diff --git a/EleksTubeHAX_pio/partition_noOta_1Mapp_7Mspiffs.csv b/EleksTubeHAX_pio/partition_noOta_1Mapp_7Mspiffs.csv new file mode 100644 index 0000000..fb09d0c --- /dev/null +++ b/EleksTubeHAX_pio/partition_noOta_1Mapp_7Mspiffs.csv @@ -0,0 +1,13 @@ +# +# manual: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html +# +# examples: https://github.com/espressif/arduino-esp32/tree/master/tools/partitions +# +# app0 must be aligned on 0x10000 (!) +# +# Name, Type, SubType, Offset, Size, Flags +# partition table 0x000000, 0x009000, <- automatically generated, do not un-comment. +nvs, data, nvs, 0x009000, 0x007000, +app0, app, factory, 0x010000, 0x120000, +spiffs, data, spiffs, 0x130000, 0x6D0000, +# end of 8 MB flash 0x800000 \ No newline at end of file diff --git a/EleksTubeHAX_pio/platformio.ini b/EleksTubeHAX_pio/platformio.ini index 183bdb1..05555f7 100644 --- a/EleksTubeHAX_pio/platformio.ini +++ b/EleksTubeHAX_pio/platformio.ini @@ -8,17 +8,10 @@ ; Please visit documentation for the other options and examples ; https://docs.platformio.org/page/projectconf.html -[env:esp32dev] +; common settings for all environments +[env] platform = espressif32 -board = esp32dev framework = arduino - -build_flags = - -DCORE_DEBUG_LEVEL=5 ; Set to 0 for no debug; saves flash memory - ; Set to 5 for full debug - -; https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html -board_build.partitions = partition_noOta_1Mapp_3Mspiffs.csv upload_speed = 921600 monitor_speed = 115200 lib_deps = @@ -38,22 +31,39 @@ lib_deps = ; These libraries and source files are causing boot-loop-crash. Do not use. TO-DO: replace with different libraries and source files. ;milesburton/DallasTemperature ;OneWire - -; === Tested and working with following versions. If you have issues, revert to libraries listed below. === -; arduino-libraries/NTPClient@^3.2.1 -; adafruit/Adafruit NeoPixel@^1.12.0 -; paulstoffregen/Time@^1.6.1 -; paulstoffregen/DS1307RTC -; bodmer/TFT_eSPI@^2.5.43 -; knolleary/PubSubClient@^2.8 -; bblanchon/ArduinoJson@^7.0.3 -; milesburton/DallasTemperature@^3.11.0 -; sparkfun/SparkFun APDS9960 RGB and Gesture Sensor@^1.4.3 -; makuna/RTC@^2.4.2 - -extra_scripts = + + ; === Tested and working with following versions. If you have issues, revert to libraries listed below. === + ; adafruit/Adafruit NeoPixel@^1.12.0 + ; paulstoffregen/Time@^1.6.1 + ; paulstoffregen/DS1307RTC + ; bodmer/TFT_eSPI@^2.5.43 + ; knolleary/PubSubClient@^2.8 + ; bblanchon/ArduinoJson@^7.0.3 + ; sparkfun/SparkFun APDS9960 RGB and Gesture Sensor@^1.4.3 + ; makuna/RTC@^2.4.2 +build_flags = + -DCORE_DEBUG_LEVEL=5 ; Set to 0 for no debug; saves flash memory or set to 5 for full debug +extra_scripts = ; copy configuration files into TFT_eSPI library folder script_configure_tft_lib.py ; modify the library files from the APDS9660 gesture sensor library to match ID if the used sensor - script_adjust_gesture_sensor_lib.py - \ No newline at end of file + script_adjust_gesture_sensor_lib.py + + +; env for all clocks with 4MB flash on PCB! +[env:esp32dev] +board = esp32dev +lib_deps = + ${env.lib_deps} + ;add env specific libraries here +board_build.partitions = partition_noOta_1Mapp_3Mspiffs.csv ; https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html + + +; This is for all clocks with 8MB flash on PCB (like the IPSTUBE clocks)! +[env:esp32dev8MB] +board = esp32dev8MB +lib_deps = + ${env.lib_deps} + ;add env specific libraries here +board_build.partitions = partition_noOta_1Mapp_7Mspiffs.csv ; https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html + diff --git a/EleksTubeHAX_pio/script_adjust_gesture_sensor_lib.py b/EleksTubeHAX_pio/script_adjust_gesture_sensor_lib.py index cdcd353..93d17f6 100644 --- a/EleksTubeHAX_pio/script_adjust_gesture_sensor_lib.py +++ b/EleksTubeHAX_pio/script_adjust_gesture_sensor_lib.py @@ -1,3 +1,10 @@ +# In pure Python environment, the script looks broken! +# Import from SCons.Script is already available, if the PlatformIO build environment is used to call it. +#from SCons.Script import Import + +#To have access to the PIO build environment variables, we need to import the env modul +Import("env") + def inplace_change(filename, old_string, new_string): # Safely read the input filename using 'with' with open(filename) as f: @@ -16,10 +23,15 @@ def inplace_change(filename, old_string, new_string): print("===== adjusting APDS sensor libs ===== ") +# Get the board type from the used environment +board = env.GetProjectOption("board") + new_string_to_check = "#define APDS9960_ID_3" -filename1 = "./.pio/libdeps/esp32dev/SparkFun APDS9960 RGB and Gesture Sensor/src/SparkFun_APDS9960.h" -filename2 = "./.pio/libdeps/esp32dev/SparkFun APDS9960 RGB and Gesture Sensor/src/SparkFun_APDS9960.cpp" +# define target files with the name of the board in the path +filename1 = "./.pio/libdeps/" + board + "/SparkFun APDS9960 RGB and Gesture Sensor/src/SparkFun_APDS9960.h" +filename2 = "./.pio/libdeps/" + board + "/SparkFun APDS9960 RGB and Gesture Sensor/src/SparkFun_APDS9960.cpp" + with open(filename1) as f: s = f.read() if new_string_to_check not in s: @@ -28,4 +40,5 @@ def inplace_change(filename, old_string, new_string): inplace_change(filename2,"if( !(id == APDS9960_ID_1 || id == APDS9960_ID_2) ) {","if( !(id == APDS9960_ID_1 || id == APDS9960_ID_2 || id == APDS9960_ID_3) ) {") else: print("Lib files seems to be adjusted already! Doing nothing.") + print("Done adjusting APDS sensor libs!") \ No newline at end of file diff --git a/EleksTubeHAX_pio/script_configure_tft_lib.py b/EleksTubeHAX_pio/script_configure_tft_lib.py index 677f33d..ae16260 100644 --- a/EleksTubeHAX_pio/script_configure_tft_lib.py +++ b/EleksTubeHAX_pio/script_configure_tft_lib.py @@ -1,27 +1,32 @@ -# Import("env") # should not be required; un-comment if you have issues -import shutil +# In pure Python environment, the script looks broken! +# Import from SCons.Script is already available, if the PlatformIO build environment is used to call it. +#from SCons.Script import Import + +#To have access to the PIO build environment variables, we need to import the env modul from SCons.Script +Import("env") -# print("Current CLI targets", COMMAND_LINE_TARGETS) -# print("Current Build targets", BUILD_TARGETS) +import shutil print("===== copying TFT config files ===== ") # https://stackoverflow.com/questions/123198/how-to-copy-files # source file location: EleksTubeHAX_pio\src\GLOBAL_DEFINES.h & _USER_DEFINES.h -# target file location: EleksTubeHAX_pio\.pio\libdeps\esp32dev\TFT_eSPI\User_Setup.h +# target file location: EleksTubeHAX_pio\.pio\libdeps\esp32dev8MB\TFT_eSPI\User_Setup.h + +# Get the board type from the used environment +board = env.GetProjectOption("board") + +# define target file and directory with the name of the board in the path +targetDir = "./.pio/libdeps/" + board + "/TFT_eSPI" +targetFile = targetDir + "/User_Setup.h" # copy using Python libraries # "copy" changes file timestamp -> lib is always recompiled. -# "copy2" keeps file timestamp -> lib is compiled once -ret = shutil.copy2('./src/_USER_DEFINES.h', './.pio/libdeps/esp32dev/TFT_eSPI') +# "copy2" keeps file timestamp -> lib is compiled once (until changed define files) +ret = shutil.copy2('./src/_USER_DEFINES.h', targetDir) print("Copied {ret}".format(**locals())) -ret2 = shutil.copy2('./src/GLOBAL_DEFINES.h', './.pio/libdeps/esp32dev/TFT_eSPI/User_Setup.h') +ret2 = shutil.copy2('./src/GLOBAL_DEFINES.h', targetFile) print("Copied {ret2}".format(**locals())) -# copy using Windows command line -# native "copy" command keeps file timestamp -> lib is compiled once -# env.Execute("copy .\\src\\_USER_DEFINES.h .\\.pio\\libdeps\\esp32dev\\TFT_eSPI") -# env.Execute("copy .\\src\\GLOBAL_DEFINES.h .\\.pio\\libdeps\\esp32dev\\TFT_eSPI\\User_Setup.h") - print("Done copying TFT config files!") diff --git a/EleksTubeHAX_pio/src/Backlights.cpp b/EleksTubeHAX_pio/src/Backlights.cpp index d4625fd..f9de9f4 100644 --- a/EleksTubeHAX_pio/src/Backlights.cpp +++ b/EleksTubeHAX_pio/src/Backlights.cpp @@ -124,7 +124,7 @@ void Backlights::breathPattern() { void Backlights::testPattern() { const uint8_t num_colors = 4; // or 3 if you don't want black - uint8_t num_states = NUM_DIGITS * num_colors; + uint8_t num_states = NUM_BACKLIGHT_LEDS * num_colors; uint8_t state = (millis()/test_ms_delay) % num_states; uint8_t digit = state/num_colors; @@ -191,7 +191,7 @@ float Backlights::phaseToHue(uint32_t phase) { void Backlights::rainbowPattern() { // Divide by 3 to spread it out some, so the whole rainbow isn't displayed at once. // TODO Make this /3 a parameter - const uint16_t phase_per_digit = (max_phase/NUM_DIGITS)/3; + const uint16_t phase_per_digit = (max_phase/NUM_BACKLIGHT_LEDS)/3; // Rainbow roatation speed now configurable uint16_t duration = uint16_t(round(getRainbowDuration() * 1000)); diff --git a/EleksTubeHAX_pio/src/Backlights.h b/EleksTubeHAX_pio/src/Backlights.h index 84800f6..e37619b 100644 --- a/EleksTubeHAX_pio/src/Backlights.h +++ b/EleksTubeHAX_pio/src/Backlights.h @@ -21,7 +21,7 @@ class Backlights: public Adafruit_NeoPixel { public: Backlights() : config(NULL), pattern_needs_init(true), off(true), - Adafruit_NeoPixel(NUM_DIGITS, BACKLIGHTS_PIN, NEO_GRB + NEO_KHZ800) + Adafruit_NeoPixel(NUM_BACKLIGHT_LEDS, BACKLIGHTS_PIN, NEO_GRB + NEO_KHZ800) {} enum patterns { dark, test, constant, rainbow, pulse, breath, num_patterns }; diff --git a/EleksTubeHAX_pio/src/Button.cpp b/EleksTubeHAX_pio/src/Buttons.cpp similarity index 62% rename from EleksTubeHAX_pio/src/Button.cpp rename to EleksTubeHAX_pio/src/Buttons.cpp index 3323fe4..8494958 100644 --- a/EleksTubeHAX_pio/src/Button.cpp +++ b/EleksTubeHAX_pio/src/Buttons.cpp @@ -5,12 +5,9 @@ void Button::begin() { millis_at_last_loop = millis_at_last_transition; #ifdef DEBUG_OUTPUT - Serial.print("init button "); - Serial.println(bpin); + Serial.print("init button: ");Serial.println(bpin); #endif - - pinMode(bpin, INPUT); - + pinMode(bpin, INPUT); down_last_time = isButtonDown(); if (down_last_time) { button_state = down_edge; @@ -22,14 +19,11 @@ void Button::begin() { void Button::loop() { millis_at_last_loop = millis(); bool down_now = isButtonDown(); - -#ifdef DEBUG_OUTPUT + #ifdef DEBUG_OUTPUT if (down_now) { - Serial.print("[B "); - Serial.print(bpin); - Serial.print("]"); - } -#endif + Serial.print("[B ");Serial.print(bpin);Serial.println("]"); + } + #endif state previous_state = button_state; @@ -43,33 +37,33 @@ void Button::loop() { millis_at_last_transition = millis_at_last_loop; } else if (down_last_time == true && down_now == true) { - // Been pressed. For how long? + // Been pressed. For how long? if (millis_at_last_loop - millis_at_last_transition >= long_press_ms) { - // Long pressed. Did we just transition? + // Long pressed. Did we just transition? if (previous_state == down_long_edge || previous_state == down_long) { - // No, we already detected the edge. + // No, we already detected the edge. button_state = down_long; } else { // Previous state was something else, so this is the transition. // down -> down_long_edge does NOT update millis_at_last_transition. - // We'd rather know how long it's been down than been down_long. + // We'd rather know how long it's been down than been down_long. button_state = down_long_edge; } } else { - // Not yet long pressed + // Not yet long pressed button_state = down; } } else if (down_last_time == true && down_now == false) { - // Just released. From how long? - if (previous_state == down_long_edge || previous_state == down_long) { + // Just released. From how long? + if (previous_state == down_long_edge || previous_state == down_long) { // Just released from a long press. button_state = up_long_edge; } else { - // Just released from a short press. + // Just released from a short press. button_state = up_edge; } millis_at_last_transition = millis_at_last_loop; @@ -88,4 +82,46 @@ const String Button::state_str[Button::num_states] = "up_edge", "up_long_edge" }; - + +//-------------------------------------------- + +#ifdef ONE_BUTTON_ONLY_MENU +//One Button in Buttons only +void Buttons::begin() { + mode.begin(); +} + +void Buttons::loop() { + mode.loop(); +} + +bool Buttons::stateChanged() { + return mode.stateChanged(); +} + +#endif + +#ifndef ONE_BUTTON_ONLY_MENU +//Buttons +void Buttons::begin() { + left.begin(); + mode.begin(); + right.begin(); + power.begin(); +} + +void Buttons::loop() { + left.loop(); + mode.loop(); + right.loop(); + power.loop(); +} + +bool Buttons::stateChanged() { + return + left.stateChanged() || + mode.stateChanged() || + right.stateChanged() || + power.stateChanged(); +} +#endif \ No newline at end of file diff --git a/EleksTubeHAX_pio/src/Buttons.h b/EleksTubeHAX_pio/src/Buttons.h index 7de158d..e1011cd 100644 --- a/EleksTubeHAX_pio/src/Buttons.h +++ b/EleksTubeHAX_pio/src/Buttons.h @@ -47,59 +47,77 @@ class Button { void loop(); // These are only updated when loop() is called, not when the getters are called. - state getState() { return button_state; } - String getStateStr() { return state_str[button_state]; } - bool stateChanged() { return state_changed; } - void setDownEdgeState() { button_state = down_edge; } - uint32_t millisInState() { return millis_at_last_loop-millis_at_last_transition; } - - bool isIdle() { return button_state == idle; } - bool isDownEdge() { return button_state == down_edge; } - bool isDown() { return button_state == down; } - bool isDownLongEdge() { return button_state == down_long_edge; } - bool isDownLong() { return button_state == down_long; } - bool isUpEdge() { return button_state == up_edge; } - bool isUpLongEdge() { return button_state == up_long_edge; } - bool isDownLongy() { return button_state == down_long_edge || button_state == down_long; } - bool isDowny() { return button_state == down_edge || button_state == down || isDownLongy(); } - bool isUpy() { return button_state == idle || button_state == up_edge || button_state == up_long_edge; } + state getState() { return button_state; } + String getStateStr() { return state_str[button_state]; } + bool stateChanged() { return state_changed; } + void setDownEdgeState() { button_state = down_edge; } + void setDownLongEdgeState() { button_state = down_long_edge; } + void setUpEdgeState() { button_state = up_edge; } + void setUpLongEdgeState() { button_state = up_long_edge; } + uint32_t millisInState() { return millis_at_last_loop-millis_at_last_transition; } + + bool isIdle() { return button_state == idle; } + bool isDownEdge() { return button_state == down_edge; } + bool isDown() { return button_state == down; } + bool isDownLongEdge() { return button_state == down_long_edge; } + bool isDownLong() { return button_state == down_long; } + bool isUpEdge() { return button_state == up_edge; } + bool isUpLongEdge() { return button_state == up_long_edge; } + bool isDownLongy() { return button_state == down_long_edge || button_state == down_long; } + bool isDowny() { return button_state == down_edge || button_state == down || isDownLongy(); } + bool isUpy() { return button_state == idle || button_state == up_edge || button_state == up_long_edge; } private: // Config - const uint8_t bpin; - const uint8_t active_state; - const uint32_t long_press_ms; + const uint8_t bpin; + const uint8_t active_state; + const uint32_t long_press_ms; // Internal state - bool down_last_time; - bool state_changed; - uint32_t millis_at_last_transition; - uint32_t millis_at_last_loop; - state button_state; + bool down_last_time; + bool state_changed; + uint32_t millis_at_last_transition; + uint32_t millis_at_last_loop; + state button_state; bool isButtonDown() { return digitalRead(bpin) == active_state; } }; +#ifdef ONE_BUTTON_ONLY_MENU + +class Buttons { +public: + Buttons() : mode(BUTTON_MODE_PIN) {} + + void begin(); + void loop(); + bool stateChanged(); + + // Just making them public, so we don't have to proxy everything. + Button mode; +private: +}; + +#endif /* * A simple helper class to call common functions on all buttons at once. */ - +#ifndef ONE_BUTTON_ONLY_MENU class Buttons { public: Buttons() : left(BUTTON_LEFT_PIN), mode(BUTTON_MODE_PIN), right(BUTTON_RIGHT_PIN), power(BUTTON_POWER_PIN) {} - void begin() - { left.begin(); mode.begin(); right.begin(); power.begin(); } - void loop() - { left.loop(); mode.loop(); right.loop(); power.loop(); } - bool stateChanged() - { return left.stateChanged() || mode.stateChanged() || right.stateChanged() || power.stateChanged(); } + void begin(); + void loop(); + bool stateChanged(); // Just making them public, so we don't have to proxy everything. Button left, mode, right, power; private: }; +#endif + #endif // BUTTONS_H diff --git a/EleksTubeHAX_pio/src/ChipSelect.cpp b/EleksTubeHAX_pio/src/ChipSelect.cpp index bff2d15..8958f06 100644 --- a/EleksTubeHAX_pio/src/ChipSelect.cpp +++ b/EleksTubeHAX_pio/src/ChipSelect.cpp @@ -1,25 +1,169 @@ #include "ChipSelect.h" +#ifdef HARDWARE_IPSTUBE_CLOCK +// Define the pins for each LCD's enable wire +// The order is from left to right, so the first pin is for the seconds ones, the last for the hours tens +// LCD2 is the leftmost one - seconds one - pin 21 as GPIO15 +// LCD3 is the second from the left - seconds ten - pin 22 as GPIO2 +// LCD4 is the third from the left - minutes one - pin 23 as GPIO27 +// LCD5 is the fourth from the left - minutes ten - pin 17 as GPIO14 +// LCD6 is the fifth from the left - hours one - pin 18 as GPIO12 +// LCD7 is the rightmost one - hours ten - pin 20 as GPIO13 +const int lcdEnablePins[NUM_DIGITS] = {GPIO_NUM_15,GPIO_NUM_2,GPIO_NUM_27,GPIO_NUM_14,GPIO_NUM_12,GPIO_NUM_13}; +const int numLCDs = NUM_DIGITS; +#endif + void ChipSelect::begin() { - pinMode(CSSR_LATCH_PIN, OUTPUT); - pinMode(CSSR_DATA_PIN, OUTPUT); - pinMode(CSSR_CLOCK_PIN, OUTPUT); + #ifndef HARDWARE_IPSTUBE_CLOCK + pinMode(CSSR_LATCH_PIN, OUTPUT); + pinMode(CSSR_DATA_PIN, OUTPUT); + pinMode(CSSR_CLOCK_PIN, OUTPUT); + + digitalWrite(CSSR_DATA_PIN, LOW); + digitalWrite(CSSR_CLOCK_PIN, LOW); + digitalWrite(CSSR_LATCH_PIN, LOW); + update(); + #else + // Initialize all six different pins for the CS of each LCD as OUTPUT and set it to HIGH (disabled) + for (int i = 0; i < numLCDs; ++i) { + pinMode(lcdEnablePins[i], OUTPUT); + digitalWrite(lcdEnablePins[i], HIGH); + } + #endif +} + +void ChipSelect::clear(bool update_) { +#ifndef HARDWARE_IPSTUBE_CLOCK + setDigitMap(all_off, update_); +#else + disableAllCSPins(); +#endif +} + +void ChipSelect::setAll(bool update_) { +#ifndef HARDWARE_IPSTUBE_CLOCK + setDigitMap(all_on, update_); +#else + enableAllCSPins(); +#endif +} + +void ChipSelect::setDigit(uint8_t digit, bool update_) { + #ifndef HARDWARE_IPSTUBE_CLOCK + // Set the bit for the given digit in the digits_map + setDigitMap(1 << digit, update_); + if (update_) update(); + #else + // Set the actual currentLCD value for the given digit and activate the corresponding LCD - digitalWrite(CSSR_DATA_PIN, LOW); - digitalWrite(CSSR_CLOCK_PIN, LOW); - digitalWrite(CSSR_LATCH_PIN, LOW); - update(); + // first deactivate the current LCD + disableDigitCSPins(currentLCD); + //store the current + currentLCD = digit; + //activate the new one + enableDigitCSPins(digit); + // NO UPDATE, cause update enables and disables the pin, but needs to be "enabled", while eTFT_SPI is writing into it. + #endif } -void ChipSelect::update() { - // Documented in README.md. Q7 and Q6 are unused. Q5 is Seconds Ones, Q0 is Hours Tens. - // Q7 is the first bit written, Q0 is the last. So we push two dummy bits, then start with - // Seconds Ones and end with Hours Tens. - // CS is Active Low, but digits_map is 1 for enable, 0 for disable. So we bit-wise NOT first. +void ChipSelect::update() { + #ifndef HARDWARE_IPSTUBE_CLOCK + // Documented in README.md. Q7 and Q6 are unused. Q5 is Seconds Ones, Q0 is Hours Tens. + // Q7 is the first bit written, Q0 is the last. So we push two dummy bits, then start with + // Seconds Ones and end with Hours Tens. + // CS is Active Low, but digits_map is 1 for enable, 0 for disable. So we bit-wise NOT first. + + uint8_t to_shift = (~digits_map) << 2; + + digitalWrite(CSSR_LATCH_PIN, LOW); + shiftOut(CSSR_DATA_PIN, CSSR_CLOCK_PIN, LSBFIRST, to_shift); + digitalWrite(CSSR_LATCH_PIN, HIGH); + #else + //this is just, to follow the "update" logic of the other hardware! + //for IPSTUBE clocks, the CS pin is already pulled to LOW by the "setDigit" function and stays there, till another "setDigit" is called. + //so all writing done by the eTFT_SPI lib functions in the time, the pin is low, will write out directly to the LCD. + //"Update" never will work, because, if pin was HIGH, no writing was done. + digitalWrite(lcdEnablePins[currentLCD], LOW); + #endif +} + +bool ChipSelect::isSecondsOnes() { +#ifndef HARDWARE_IPSTUBE_CLOCK + return (digits_map&SECONDS_ONES_MAP > 0); +#else + return true; +#endif +} + +bool ChipSelect::isSecondsTens() { +#ifndef HARDWARE_IPSTUBE_CLOCK + return (digits_map&SECONDS_TENS_MAP > 0); +#else + return true; +#endif +} - uint8_t to_shift = (~digits_map) << 2; +bool ChipSelect::isMinutesOnes() { +#ifndef HARDWARE_IPSTUBE_CLOCK + return (digits_map&MINUTES_ONES_MAP > 0); +#else + return true; +#endif +} + +bool ChipSelect::isMinutesTens() { +#ifndef HARDWARE_IPSTUBE_CLOCK + return (digits_map&MINUTES_TENS_MAP > 0); +#else + return true; +#endif +} + +bool ChipSelect::isHoursOnes() { +#ifndef HARDWARE_IPSTUBE_CLOCK + return (digits_map&HOURS_ONES_MAP > 0); +#else + return true; +#endif +} + +bool ChipSelect::isHoursTens() { +#ifndef HARDWARE_IPSTUBE_CLOCK + return (digits_map&HOURS_TENS_MAP > 0); +#else + return true; +#endif +} + + +void ChipSelect::enableAllCSPins() { +#ifdef HARDWARE_IPSTUBE_CLOCK + // enable each LCD + for (int i = 0; i < numLCDs; ++i) { + digitalWrite(lcdEnablePins[i], LOW); + } +#endif +} + +void ChipSelect::disableAllCSPins() { +#ifdef HARDWARE_IPSTUBE_CLOCK + // disable each LCD + for (int i = 0; i < numLCDs; ++i) { + digitalWrite(lcdEnablePins[i], HIGH); + } +#endif +} + +void ChipSelect::enableDigitCSPins(uint8_t digit) { +#ifdef HARDWARE_IPSTUBE_CLOCK + // enable the LCD for the given digit + digitalWrite(lcdEnablePins[digit], LOW); +#endif +} - digitalWrite(CSSR_LATCH_PIN, LOW); - shiftOut(CSSR_DATA_PIN, CSSR_CLOCK_PIN, LSBFIRST, to_shift); - digitalWrite(CSSR_LATCH_PIN, HIGH); +void ChipSelect::disableDigitCSPins(uint8_t digit) { +#ifdef HARDWARE_IPSTUBE_CLOCK + // disable the LCD for the given digit + digitalWrite(lcdEnablePins[digit], HIGH); +#endif } diff --git a/EleksTubeHAX_pio/src/ChipSelect.h b/EleksTubeHAX_pio/src/ChipSelect.h index 8ad41b7..e24f2a6 100644 --- a/EleksTubeHAX_pio/src/ChipSelect.h +++ b/EleksTubeHAX_pio/src/ChipSelect.h @@ -9,11 +9,13 @@ class ChipSelect { public: - ChipSelect() : digits_map(all_off) {} + ChipSelect() {}; void begin(); void update(); + int currentLCD = 0; + // These speak the indexes defined in Hardware.h. // So 0 is disabled, 1 is enabled (even though CS is active low, this gets mapped.) // So bit 0 (LSB), is index 0, is SECONDS_ONES @@ -23,22 +25,28 @@ class ChipSelect { // Helper functions // Sets just the one digit by digit number - void setDigit(uint8_t digit, bool update_ = true) { setDigitMap(0x01 << digit, update_); } - void setAll(bool update_ = true) { setDigitMap(all_on, update_); } - void clear(bool update_ = true) { setDigitMap(all_off, update_); } - void setSecondsOnes() { setDigit(SECONDS_ONES); } - void setSecondsTens() { setDigit(SECONDS_TENS); } - void setMinutesOnes() { setDigit(MINUTES_ONES); } - void setMinutesTens() { setDigit(MINUTES_TENS); } - void setHoursOnes() { setDigit(HOURS_ONES); } - void setHoursTens() { setDigit(HOURS_TENS); } - bool isSecondsOnes() { return ((digits_map & SECONDS_ONES_MAP) > 0); } - bool isSecondsTens() { return ((digits_map & SECONDS_TENS_MAP) > 0); } - bool isMinutesOnes() { return ((digits_map & MINUTES_ONES_MAP) > 0); } - bool isMinutesTens() { return ((digits_map & MINUTES_TENS_MAP) > 0); } - bool isHoursOnes() { return ((digits_map & HOURS_ONES_MAP) > 0); } - bool isHoursTens() { return ((digits_map & HOURS_TENS_MAP) > 0); } - + void setDigit(uint8_t digit, bool update_=true); + void enableDigitCSPins(uint8_t digit); + void disableDigitCSPins(uint8_t digit); + + void setAll(bool update_=true); + void clear(bool update_=true); + + void setSecondsOnes() { setDigit(SECONDS_ONES); } + void setSecondsTens() { setDigit(SECONDS_TENS); } + void setMinutesOnes() { setDigit(MINUTES_ONES); } + void setMinutesTens() { setDigit(MINUTES_TENS); } + void setHoursOnes() { setDigit(HOURS_ONES); } + void setHoursTens() { setDigit(HOURS_TENS); } + bool isSecondsOnes(); + bool isSecondsTens(); + bool isMinutesOnes(); + bool isMinutesTens(); + bool isHoursOnes(); + bool isHoursTens(); + + void enableAllCSPins(); + void disableAllCSPins(); private: uint8_t digits_map; const uint8_t all_on = 0x3F; diff --git a/EleksTubeHAX_pio/src/Clock.cpp b/EleksTubeHAX_pio/src/Clock.cpp index e3348b2..32589cb 100644 --- a/EleksTubeHAX_pio/src/Clock.cpp +++ b/EleksTubeHAX_pio/src/Clock.cpp @@ -1,7 +1,7 @@ #include "Clock.h" #include "WiFi_WPS.h" -#ifdef HARDWARE_SI_HAI_CLOCK // SI HAI IPS Clock XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +#if defined(HARDWARE_SI_HAI_CLOCK) || defined(HARDWARE_IPSTUBE_CLOCK) // for Clocks with DS1302 chip #SI HAI or IPSTUBE XXXXXXXXXXXXXXXXXX // If it is a SI HAI Clock, use differnt RTC chip drivers #include #include diff --git a/EleksTubeHAX_pio/src/GLOBAL_DEFINES.h b/EleksTubeHAX_pio/src/GLOBAL_DEFINES.h index 4111ebb..83566b4 100644 --- a/EleksTubeHAX_pio/src/GLOBAL_DEFINES.h +++ b/EleksTubeHAX_pio/src/GLOBAL_DEFINES.h @@ -74,12 +74,26 @@ #define HOURS_ONES_MAP (0x01 << HOURS_ONES) #define HOURS_TENS_MAP (0x01 << HOURS_TENS) +// Define the activate and deactivate state for the diplay power transistor +// also define, how the dimming value is calculated +#ifndef HARDWARE_IPSTUBE_CLOCK + #define ACTIVATEDISPLAYS HIGH // Activate is HIGH for the IPSTUBEs + #define DEACTIVATEDISPLAYS LOW // Deactivate is LOW for the IPSTUBEs + #define CALCDIMVALUE(x) (x) // Dimming value is directly used for software dimming +#else + #define ACTIVATEDISPLAYS LOW // Activate is LOW for the Elekstube + #define DEACTIVATEDISPLAYS HIGH // Deactivate is HIGH for the Elekstube + #define CALCDIMVALUE(x) (255 - x) // Dimming value is inverted for hardware dimming +#endif + + #ifdef HARDWARE_SI_HAI_CLOCK // SI HAI IPS Clock XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //#define ONE_WIRE_BUS_PIN (xx) // DS18B20 connected to GPIOxx; comment this line if sensor is not connected // WS2812 (or compatible) LEDs on the back of the display modules. #define BACKLIGHTS_PIN (32) + #define NUM_BACKLIGHT_LEDS (6) // 6 LEDs on the bottom of every LCD. // Buttons, active low, externally pulled up (with actual resistors!) #define BUTTON_LEFT_PIN (35) @@ -139,6 +153,7 @@ // WS2812 (or compatible) LEDs on the back of the display modules. #define BACKLIGHTS_PIN (GPIO_NUM_12) + #define NUM_BACKLIGHT_LEDS (6) // 6 LEDs on the bottom of every LCD. // No Buttons on SE verion!!! // Set to pins, which should always be HIGH! @@ -203,6 +218,7 @@ // WS2812 (or compatible) LEDs on the back of the display modules. #define BACKLIGHTS_PIN (12) + #define NUM_BACKLIGHT_LEDS (6) // 6 LEDs on the bottom of every LCD. // Buttons, active low, externally pulled up (with actual resistors!) #define BUTTON_LEFT_PIN (33) @@ -262,6 +278,7 @@ // WS2812 (or compatible) LEDs on the back of the display modules. #define BACKLIGHTS_PIN (12) + #define NUM_BACKLIGHT_LEDS (6) // 6 LEDs on the bottom of every LCD. // Buttons, active low, externally pulled up (with actual resistors!) #define BUTTON_LEFT_PIN (33) @@ -317,5 +334,123 @@ #define USER_SETUP_LOADED #endif // original EleksTube IPS clock Gen2 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +#ifdef HARDWARE_IPSTUBE_CLOCK // IPSTUBE clock models (H401 and H402) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + + // WS2812 (or compatible) LEDs on the back of the display modules. + #define BACKLIGHTS_PIN (GPIO_NUM_5) //pin 35 is GPIO5 + + // ATTENTION: SOME IPSTUBE clocks has a LED stripe on the bottom of the clock! SOME NOT! Define the number of LEDs here! + //#define NUM_BACKLIGHT_LEDS (34) // 6 LEDs on the bottom of every LCD. For IPSTUBE clock with LED stripe: 28 LEDs in a stripe on the bottom of the clock = 34 LEDs in total. + #define NUM_BACKLIGHT_LEDS (6) // 6 LEDs on the bottom of every LCD. For IPSTUBE clock without LED stripe. + + // Only one Button on IPSTUBE clocks! + #define ONE_BUTTON_ONLY_MENU + + // Set the other pins, to pins, which should always be in a defined, non changing state like Always HIGH or Always LOW! + // Pin 9 = CPU_PU = Chip enabled = Always LOW on this board + // Pin 3 = VDD3P3 = 3.3V analog power supply = Always LOW on this board + // Pin 5 = SENSOR_VP = GPIO36 = Unconnected = SHOULD be HIGH = Always HIGH + #ifdef ONE_BUTTON_ONLY_MENU + #define BUTTON_MODE_PIN (GPIO_NUM_0) // Only ONE Button on the back of the clock - pin 23 is GPIO0 = BOOT Button + #else + #define BUTTON_LEFT_PIN (3) + #define BUTTON_RIGHT_PIN (3) + #define BUTTON_POWER_PIN (3) + #define BUTTON_MODE_PIN (GPIO_NUM_0) // Only ONE Button on the back of the clock - pin 23 is GPIO0 = BOOT Button + #endif + + // 3-wire to DS1302 RTC + #define DS1302_SCLK (GPIO_NUM_22) // pin 39 is GPIO22 + #define DS1302_IO (GPIO_NUM_19) // pin 38 is GPIO19 + #define DS1302_CE (GPIO_NUM_21) // pin 42 is GPIO21 + + // Chip Select shift register, to select the display + // No shift register on this board - Chip Select of the displays is directly connected to the ESP32 + // #define CSSR_DATA_PIN (-1) + // #define CSSR_CLOCK_PIN (-1) + // #define CSSR_LATCH_PIN (-1) + + // All IPSTUBEs has the LCDs pins VCC power (LED Anode) and VDD (Power Supply for Analog) connectected to the VCC (3.3V) and Ground to Ground (PCB), so the displays are Always-On! + // EXCEPT: The Q1 transistor is present! + // Then the GPIO4 pin is connected to the transistor and Ground of the LCDs is running through the transistor, so the LCDs can be turned on and off AND dimmed! + #define TFT_ENABLE_PIN (GPIO_NUM_4) // pin 24 is GPIO4 + //if transistor is present and we want hardware dimming, we need to choose a PWM channel for this, can always be defines, even if not used + #define TFT_PWM_CHANNEL 0 + + // Skip reinitialization + // This feature is only for IPSTUBE clocks by now!!! Can also be used on other clocks, but not tested yet! + // Always skip reinitialization for IPSTUBE clocks, because the displays are either always on (versions without Q1 transistor) + // and a reinit just shows strange patterns on the displays and forces an unnecessary redraw of the clock digits. + // or seems to don't need a reinit (with Q1) -> this is an assumption, because the display came back on after a few hours without problems + // NOTE: If this causes wake up issues for you, disable it by commenting the following line out and go back to full reinit after display power off + #define TFT_SKIP_REINIT + + // Hardware dimming! + // This feature is only supported by IPSTUBE clocks by now!!! + // DON'T USE IT WITH OTHER CLOCKS! IT MAY DAMAGE YOUR CLOCK! + + // In case you have an IPSTUBE clock that does not support hardware dimming because of missing Q1 transistor: + // This will NOT damage your clock, but the dimming of the displays will be totally disabled! Also the LCD power switch will not work! + // If you notice, that the night time dimming or manual dimming does not work, you will have a clock without the Q1 transistor + // and you can/should comment the following line out to get back to the software dimming! + + // Comment the next line out, to DISABLE hardware dimming with GPIO4 pin (TFT_ENABLE_PIN) for a IPSTUBE clock + #define DIM_WITH_ENABLE_PIN_PWM + + //NOTE: If NIGTHTIME_DIMMING is enabled: + // For the main LCDs: The dimming will be set to the hard coded value TFT_DIMMED_INTENSITY in the given time period EVERY HOUR beginning at NIGHT_TIME + // and will set back to the maximum brightness at DAY_TIME...Disable NIGHTTIME_DIMMING if you want to use the manual set dimming value all the time + // For the backlight dimming: The dimming will ALWAYS stay to the hard coded value BACKLIGHT_DIMMED_INTENSITY in the given night time period! + // The check for it is done and the value is apply every loop...Disable NIGHTTIME_DIMMING if you want to use the manual set dimming value all the time + + // TODO: Store the dimming values and dimming times in the NVS partition to keep the last dimming value and not use the hard coded values + // make the times and values adjustable in the menu and/or via MQTT for both main and backlight dimming + + // TODO: Save the values changed via MQTT/in HA in the NVS partition to keep the values after a reboot. Maybe define a "save command" in HA or trigger after + // a few minutes of inactivity only if changed something or in the "free time" of the loop cycle... + // Save it every time receiving MQTT commands is a BAD idea, we know that already ;) + + // configure library \TFT_eSPI\User_Setup.h + // ST7789 135 x 240 display with no chip select line + #define ST7789_DRIVER // Configure all registers + + #define TFT_WIDTH 135 + #define TFT_HEIGHT 240 + + //#define CGRAM_OFFSET // Library will add offsets required + #define TFT_SDA_READ // Read and write on the MOSI/SDA pin, no separate MISO pin + + #define TFT_MISO -1 // No MISO + #define TFT_MOSI (GPIO_NUM_32) // pin 12 is GPIO32 + #define TFT_SCLK (GPIO_NUM_33) // pin 13 is GPIO33 + + #define TFT_CS (-1) // MUST be -1 for IPSTUBE clocks -> chipselect class does the magic also without a shift register + #define TFT_DC (GPIO_NUM_25) // pin 14 is GPIO25 - Data Command, aka Register Select or RS + #define TFT_RST (GPIO_NUM_26) // pin 15 is GPIO26 - Connect reset to ensure display initialises + + #define TOUCH_CS -1 // No Touch + + //Fonts to load for TFT + //#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH + #define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters + #define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters + //#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm + //#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. + //#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. + //#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT + //#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + + #define SMOOTH_FONT + + #define SPI_FREQUENCY 40000000 + + #define SPI_READ_FREQUENCY 20000000 + + /* + * To make the Library not over-write all this: + */ + #define USER_SETUP_LOADED + +#endif // IPSTUBE clock models (H401 and H402) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX #endif /* GLOBAL_DEFINES_H_ */ diff --git a/EleksTubeHAX_pio/src/Menu.cpp b/EleksTubeHAX_pio/src/Menu.cpp index b273fe8..3ea4453 100644 --- a/EleksTubeHAX_pio/src/Menu.cpp +++ b/EleksTubeHAX_pio/src/Menu.cpp @@ -1,11 +1,13 @@ #include "Menu.h" // Big ol' state machine: menu and buttons as the state, buttons as the transition triggers. + +#ifndef ONE_BUTTON_ONLY_MENU void Menu::loop(Buttons &buttons) { - Button::state left_state = buttons.left.getState(); // decrement value - Button::state mode_state = buttons.mode.getState(); // next menu + Button::state left_state = buttons.left.getState(); // decrement value Button::state right_state = buttons.right.getState(); // increment value Button::state power_state = buttons.power.getState(); // exit menu + Button::state mode_state = buttons.mode.getState(); // next menu // Reset the change value in every case. We don't always change the state though. change = 0; @@ -26,7 +28,7 @@ void Menu::loop(Buttons &buttons) { } // Menu is idle. A button is pressed, go into the menu, but don't act on the button press. It just wakes up the menu. - if (state == idle && (left_state == Button::down_edge || right_state == Button::down_edge || mode_state == Button::down_edge)) { + if (state == idle && (left_state == Button::up_edge || right_state == Button::up_edge || mode_state == Button::up_edge)) { state = states(1); // Start at the beginning of the menu. millis_last_button_press = millis(); @@ -35,7 +37,7 @@ void Menu::loop(Buttons &buttons) { } // Go to the next menu option - if (state != idle && mode_state == Button::down_edge) { + if (state != idle && mode_state == Button::up_edge) { uint8_t new_state = (uint8_t(state) + 1) % num_states; if (new_state == 0) { new_state = 1; // Skip over idle when incrementing through the menu. @@ -48,19 +50,19 @@ void Menu::loop(Buttons &buttons) { } // Exit with a power button. - if (state != idle && (power_state == Button::down_edge)) { + if (state != idle && (power_state == Button::up_edge)) { state = idle; state_changed = true; return; } - // In a menu, and a left or right button has been pressed - if (state != idle && (left_state == Button::down_edge || right_state == Button::down_edge)) { + // In a menu, and a left (negative change value) or right button (positive change value) has been pressed! + if (state != idle && (left_state == Button::up_edge || right_state == Button::up_edge)) { // Pressing both left and right at the same time cancels out? Sure, why not... - if (left_state == Button::down_edge) { + if (left_state == Button::up_edge) { change--; } - if (right_state == Button::down_edge) { + if (right_state == Button::up_edge) { change++; } @@ -72,3 +74,91 @@ void Menu::loop(Buttons &buttons) { // get here, but I think they're all "just do nothing." If there's an explicit state we want to handle, // add an if() block above. } +#endif + +#ifdef ONE_BUTTON_ONLY_MENU +void Menu::loop(Buttons &buttons) { + Button::state mode_state = buttons.mode.getState(); // next menu + + // Reset the change value in every case. We don't always change the state though. + change = 0; + state_changed = false; + + // Early out for idle state, which will be most of the time. + if (state == idle && mode_state == Button::idle) { + // Everything is idle. Do nothing. + return; + } + + // Go idle if the user hasn't pressed a button in a long time. + if (state != idle && millis() - millis_last_button_press > idle_timeout_ms) { + // Go idle. + state = idle; + state_changed = true; + return; + } + + // Menu is idle. A button is pressed, go into the menu, but don't act on the button press. It just wakes up the menu. + if (state == idle && (mode_state == Button::up_edge)) { + state = states(1); // Start at the beginning of the menu. + + millis_last_button_press = millis(); + state_changed = true; + return; + } + + // In a menu, and button long pressed! -> simulate right button press + ///Must be done BEFORE the next menu option + if (state != idle && (mode_state == Button::up_long_edge)) { + change++; + + millis_last_button_press = millis(); + state_changed = true; + return; + } + + // Go to the next menu option + if (state != idle && mode_state == Button::up_edge) { + uint8_t new_state = (uint8_t(state) + 1) % num_states; + if (new_state == 0) { + new_state = 1; // Skip over idle when incrementing through the menu. + } + state = states(new_state); + + millis_last_button_press = millis(); + state_changed = true; + return; + } + + // Some other button state, but it doesn't trigger any change in state. There are LOTS of states that will + // get here, but I think they're all "just do nothing." If there's an explicit state we want to handle, + // add an if() block above. +} +#endif + +#ifndef WIFI_USE_WPS +const String Menu::state_str[Menu::num_states] = { + "idle", + "backlight_pattern", + "pattern_color", + "backlight_intensity", + "twelve_hour", + "blank_hours_zero", + "utc_offset_hour", + "utc_offset_15m", + "selected_graphic" + }; + #else + const String Menu::state_str[Menu::num_states] = { + "idle", + "backlight_pattern", + "pattern_color", + "backlight_intensity", + "twelve_hour", + "blank_hours_zero", + "utc_offset_hour", + "utc_offset_15m", + "selected_graphic", + "start_wps" + }; + #endif diff --git a/EleksTubeHAX_pio/src/Menu.h b/EleksTubeHAX_pio/src/Menu.h index 15a8075..c73e836 100644 --- a/EleksTubeHAX_pio/src/Menu.h +++ b/EleksTubeHAX_pio/src/Menu.h @@ -16,27 +16,44 @@ class Menu { void begin() {} void loop(Buttons &buttons); +#ifndef WIFI_USE_WPS enum states { - idle=0, // idle == out of menu - backlight_pattern, // Change the backlight patterns + idle=0, // idle == out of menu. + backlight_pattern, // Change the backlight patterns. pattern_color, // Change the backlight pattern color. TODO pattern speeds? backlight_intensity, // Change how bright the backlight LEDs are. - twelve_hour, // Select 12 hour or 24 hour format + twelve_hour, // Select 12 hour or 24 hour format. blank_hours_zero, // Whether to blank the leading zero in the hours column. - utc_offset_hour, // Change the UTC offset by an hour - utc_offset_15m, // Change the UTC offset by 15 minutes - selected_graphic, // Select clock "font" 0...9 -> first char in file name "00.bmp to 90.bmp" + utc_offset_hour, // Change the UTC offset by an hour. + utc_offset_15m, // Change the UTC offset by 15 minutes. + selected_graphic, // Select clock "font" 0...9 -> first char in file name "00.bmp to 90.bmp". + // When there's more things to change in the menu, add them here. + num_states + }; + #else + enum states { + idle=0, // idle == out of menu. + backlight_pattern, // Change the backlight patterns. + pattern_color, // Change the backlight pattern color. TODO pattern speeds? + backlight_intensity, // Change how bright the backlight LEDs are. + twelve_hour, // Select 12 hour or 24 hour format. + blank_hours_zero, // Whether to blank the leading zero in the hours column. + utc_offset_hour, // Change the UTC offset by an hour. + utc_offset_15m, // Change the UTC offset by 15 minutes. + selected_graphic, // Select clock "font" 0...9 -> first char in file name "00.bmp to 90.bmp". start_wps, // connect to WiFi using wps pushbutton mode - // When there's more things to change in the menu, add them here. - num_states }; + #endif - states getState() { return(state); } - int8_t getChange() { return(change); } - bool stateChanged() { return(state_changed); } + const static String state_str[num_states]; + states getState() { return(state); } + int8_t getChange() { return(change); } + + String getStateStr() { return state_str[state]; } + bool stateChanged() { return(state_changed); } private: const uint16_t idle_timeout_ms = 10000; // Timeout and return to idle after 10 seconds of inactivity. diff --git a/EleksTubeHAX_pio/src/Mqtt_client_ips.cpp b/EleksTubeHAX_pio/src/Mqtt_client_ips.cpp index 4f3c48b..cd2e94c 100644 --- a/EleksTubeHAX_pio/src/Mqtt_client_ips.cpp +++ b/EleksTubeHAX_pio/src/Mqtt_client_ips.cpp @@ -499,7 +499,8 @@ void callback(char* topic, byte* payload, unsigned int length) { // A new messa if(doc["color"].is()) { MqttCommandBackColorPhase = backlights.hueToPhase(doc["color"]["h"]); MqttCommandBackColorPhaseReceived = true; - } + } + doc.clear(); } if (strcmp(command[0], "use_twelve_hours") == 0 && strcmp(command[1], "set") == 0) { @@ -510,6 +511,7 @@ void callback(char* topic, byte* payload, unsigned int length) { // A new messa MqttCommandUseTwelveHours = strcmp(doc["state"], MQTT_STATE_ON) == 0; MqttCommandUseTwelveHoursReceived = true; } + doc.clear(); } if (strcmp(command[0], "blank_zero_hours") == 0 && strcmp(command[1], "set") == 0) { @@ -520,6 +522,7 @@ void callback(char* topic, byte* payload, unsigned int length) { // A new messa MqttCommandBlankZeroHours = strcmp(doc["state"], MQTT_STATE_ON) == 0; MqttCommandBlankZeroHoursReceived = true; } + doc.clear(); } if (strcmp(command[0], "pulse_bpm") == 0 && strcmp(command[1], "set") == 0) { @@ -530,6 +533,7 @@ void callback(char* topic, byte* payload, unsigned int length) { // A new messa MqttCommandPulseBpm = doc["state"]; MqttCommandPulseBpmReceived = true; } + doc.clear(); } if (strcmp(command[0], "breath_bpm") == 0 && strcmp(command[1], "set") == 0) { @@ -540,6 +544,7 @@ void callback(char* topic, byte* payload, unsigned int length) { // A new messa MqttCommandBreathBpm = doc["state"]; MqttCommandBreathBpmReceived = true; } + doc.clear(); } if (strcmp(command[0], "rainbow_duration") == 0 && strcmp(command[1], "set") == 0) { diff --git a/EleksTubeHAX_pio/src/NTPClient_AO.cpp b/EleksTubeHAX_pio/src/NTPClient_AO.cpp index f69a4f5..a936d36 100644 --- a/EleksTubeHAX_pio/src/NTPClient_AO.cpp +++ b/EleksTubeHAX_pio/src/NTPClient_AO.cpp @@ -92,7 +92,7 @@ bool NTPClient::forceUpdate() { return false; } - #ifdef DEBUG_NTPClient +#ifdef DEBUG_NTPClient Serial.print("NTP Data:"); char s1[4]; for (int i = 0; i < NTP_PACKET_SIZE; i++) { @@ -100,7 +100,7 @@ bool NTPClient::forceUpdate() { Serial.print(s1); } Serial.println("."); - #endif +#endif /* unsigned char version = _packetBuffer[0]; @@ -117,34 +117,34 @@ bool NTPClient::forceUpdate() { //Perform a few validity checks on the packet if((_packetBuffer[0] & 0b11000000) == 0b11000000) //Check for LI=UNSYNC { - #ifdef DEBUG_NTPClient +#ifdef DEBUG_NTPClient Serial.println("err: NTP UnSync"); - #endif - return false; +#endif + return false; } if((_packetBuffer[0] & 0b00111000) >> 3 < 0b100) //Check for Version >= 4 { - #ifdef DEBUG_NTPClient +#ifdef DEBUG_NTPClient Serial.println("err: Incorrect NTP Version"); - #endif - return false; +#endif + return false; } if((_packetBuffer[0] & 0b00000111) != 0b100) //Check for Mode == Server { - #ifdef DEBUG_NTPClient +#ifdef DEBUG_NTPClient Serial.println("err: NTP mode is not Server"); - #endif - return false; +#endif + return false; } if((_packetBuffer[1] < 1) || (_packetBuffer[1] > 15)) //Check for valid Stratum { - #ifdef DEBUG_NTPClient +#ifdef DEBUG_NTPClient Serial.println("err: Incorrect NTP Stratum"); - #endif - return false; +#endif + return false; } if( _packetBuffer[16] == 0 && _packetBuffer[17] == 0 && @@ -152,10 +152,10 @@ bool NTPClient::forceUpdate() { _packetBuffer[20] == 0 && _packetBuffer[21] == 0 && _packetBuffer[22] == 0 && _packetBuffer[23] == 0) //Check for ReferenceTimestamp != 0 { - #ifdef DEBUG_NTPClient +#ifdef DEBUG_NTPClient Serial.println("err: Incorrect NTP Ref Timestamp"); - #endif - return false; +#endif + return false; } diff --git a/EleksTubeHAX_pio/src/TFTs.cpp b/EleksTubeHAX_pio/src/TFTs.cpp index 094343d..d226676 100644 --- a/EleksTubeHAX_pio/src/TFTs.cpp +++ b/EleksTubeHAX_pio/src/TFTs.cpp @@ -8,13 +8,26 @@ void TFTs::begin() { chip_select.begin(); chip_select.setAll(); - // Turn power on to displays. +#ifdef DIM_WITH_ENABLE_PIN_PWM + //if hardware dimming is used, we need to attach the pin to a PWM channel + ledcAttachPin(TFT_ENABLE_PIN, TFT_PWM_CHANNEL); + ledcChangeFrequency(TFT_PWM_CHANNEL, 20000, 8); + //not needed here, because enableAllDisplays() is called later and it is called from there and if enabled is false, this does nothing + //ProcessUpdatedDimming(); +#else + // Set pin for turning display power on and off. pinMode(TFT_ENABLE_PIN, OUTPUT); - enableAllDisplays(); +#endif + // Signal, that the image in the buffer is invalid and needs to be reloaded and refilled InvalidateImageInBuffer(); // Initialize the super class. init(); + //to avoid flickering patterns on the screens + fillScreen(TFT_BLACK); + + // Signal, that the display is enabled now and do the hardware dimming if enabled + enableAllDisplays(); // Set SPIFFS ready if (!SPIFFS.begin()) { @@ -28,16 +41,35 @@ void TFTs::begin() { } void TFTs::reinit() { +#ifndef TFT_SKIP_REINIT // Start with all displays selected. chip_select.begin(); chip_select.setAll(); +#ifdef DIM_WITH_ENABLE_PIN_PWM + ledcAttachPin(TFT_ENABLE_PIN, TFT_PWM_CHANNEL); + ledcChangeFrequency(TFT_PWM_CHANNEL, 20000, 8); + //same thing as on first init, not needed here, because enableAllDisplays() is called later and it is called from there and if enabled is false, this does nothing + //ProcessUpdatedDimming(); +#else // Turn power on to displays. pinMode(TFT_ENABLE_PIN, OUTPUT); - enableAllDisplays(); +#endif + // Signal, that the image in the buffer is invalid and needs to be reloaded and refilled + // needed, because the last drawing can be long time ago?!? + InvalidateImageInBuffer(); - // Initialize the super class. + // Initialize the super class (again). init(); + //to avoid flickering patterns on the screens + fillScreen(TFT_BLACK); + //signal that the display are enabled now, also do the hardware dimming if enabled + enableAllDisplays(); + +#else + //skip full inintialization, just reenable displays by signaling to enable them + enableAllDisplays(); +#endif } void TFTs::clear() { @@ -70,7 +102,7 @@ void TFTs::showNoWifiStatus() { fillRect(0, TFT_HEIGHT - 27, TFT_WIDTH, 27, TFT_BLACK); setCursor(5, TFT_HEIGHT - 27, 4); // Font 4. 26 pixel high print("NO WIFI !"); - } +} void TFTs::showNoMqttStatus() { chip_select.setSecondsTens(); @@ -78,7 +110,38 @@ void TFTs::showNoMqttStatus() { fillRect(0, TFT_HEIGHT - 27, TFT_WIDTH, 27, TFT_BLACK); setCursor(5, TFT_HEIGHT - 27, 4); print("NO MQTT !"); +} + +void TFTs::enableAllDisplays() { + // Turn power on to displays. + enabled = true; +#ifndef DIM_WITH_ENABLE_PIN_PWM + digitalWrite(TFT_ENABLE_PIN, ACTIVATEDISPLAYS); +#else + //if hardware dimming is used, only activate with the current dimming value + ProcessUpdatedDimming(); +#endif +} + +void TFTs::disableAllDisplays() { + // Turn power off to displays. + enabled = false; +#ifndef DIM_WITH_ENABLE_PIN_PWM + digitalWrite(TFT_ENABLE_PIN, DEACTIVATEDISPLAYS); +#else + //if hardware dimming is used, deactivate via the dimming value + ProcessUpdatedDimming(); +#endif +} + +void TFTs::toggleAllDisplays() { + if (enabled) { + disableAllDisplays(); } + else { + enableAllDisplays(); + } +} void TFTs::showTemperature() { #ifdef ONE_WIRE_BUS_PIN @@ -138,7 +201,10 @@ void TFTs::showDigit(uint8_t digit) { if (NextNumber > 9) NextNumber = 0; // pre-load only seconds, because they are drawn first NextFileRequired = current_graphic * 10 + NextNumber; } -} + #ifdef HARDWARE_IPSTUBE_CLOCK + chip_select.update(); + #endif + } void TFTs::LoadNextImage() { if (NextFileRequired != FileInBuffer) { @@ -153,6 +219,23 @@ void TFTs::InvalidateImageInBuffer() { // force reload from Flash with new dimmi FileInBuffer=255; // invalid, always load first image } +void TFTs::ProcessUpdatedDimming() { +#ifdef DIM_WITH_ENABLE_PIN_PWM + //hardware dimming is done via PWM on the pin defined by TFT_ENABLE_PIN + //ONLY for IPSTUBE clocks in the moment! Other clocks may be damaged! + if (enabled) { + ledcWrite(TFT_PWM_CHANNEL, CALCDIMVALUE(dimming)); + } else { + //no dimming means 255 (full brightness) + ledcWrite(TFT_PWM_CHANNEL, CALCDIMVALUE(0)); + } +#else + // "software" dimming is done via alpha blending in the image drawing function + // signal that the image in the buffer is invalid and needs to be reloaded and refilled + InvalidateImageInBuffer(); +#endif +} + bool TFTs::FileExists(const char* path) { fs::File f = SPIFFS.open(path, "r"); bool Exists = ((f == true) && !f.isDirectory()); @@ -310,9 +393,11 @@ bool TFTs::LoadImageIntoBuffer(uint8_t file_index) { } uint16_t color = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xFF) >> 3); +#ifndef DIM_WITH_ENABLE_PIN_PWM //skip alpha blending for dimming if hardware dimming is used if (dimming < 255) { // only dim when needed color = alphaBlend(dimming, color, TFT_BLACK); } // dimming +#endif UnpackedImageBuffer[row+y][col+x] = color; } // col @@ -421,6 +506,10 @@ bool TFTs::LoadImageIntoBuffer(uint8_t file_index) { // Colors are already in 16-bit R5, G6, B5 format for (col = 0; col < w; col++) { +#ifdef DIM_WITH_ENABLE_PIN_PWM + //skip alpha blending for dimming if hardware dimming is used + UnpackedImageBuffer[row+y][col+x] = (lineBuffer[col*2+1] << 8) | (lineBuffer[col*2]); +#else if (dimming == 255) { // not needed, copy directly UnpackedImageBuffer[row+y][col+x] = (lineBuffer[col*2+1] << 8) | (lineBuffer[col*2]); } else { @@ -439,6 +528,7 @@ bool TFTs::LoadImageIntoBuffer(uint8_t file_index) { b = b >> 8; UnpackedImageBuffer[row+y][col+x] = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); } // dimming + #endif } // col } // row FileInBuffer = file_index; diff --git a/EleksTubeHAX_pio/src/TFTs.h b/EleksTubeHAX_pio/src/TFTs.h index b7fdd55..b220cde 100644 --- a/EleksTubeHAX_pio/src/TFTs.h +++ b/EleksTubeHAX_pio/src/TFTs.h @@ -15,7 +15,11 @@ class TFTs : public TFT_eSPI { public: TFTs() : TFT_eSPI(), chip_select(), enabled(false) - { for (uint8_t digit=0; digit < NUM_DIGITS; digit++) digits[digit] = 0; } + { + #ifndef HARDWARE_IPSTUBE_CLOCK + for (uint8_t digit=0; digit < NUM_DIGITS; digit++) digits[digit] = 0; + #endif + } // no == Do not send to TFT. yes == Send to TFT if changed. force == Send to TFT. enum show_t { no, yes, force }; @@ -39,9 +43,9 @@ class TFTs : public TFT_eSPI { void showDigit(uint8_t digit); // Controls the power to all displays - void enableAllDisplays() { digitalWrite(TFT_ENABLE_PIN, HIGH); enabled = true; } - void disableAllDisplays() { digitalWrite(TFT_ENABLE_PIN, LOW); enabled = false; } - void toggleAllDisplays() { if (enabled) disableAllDisplays(); else enableAllDisplays(); } + void enableAllDisplays(); + void disableAllDisplays(); + void toggleAllDisplays(); bool isEnabled() { return enabled; } // Making chip_select public so we don't have to proxy all methods, and the caller can just use it directly. @@ -51,6 +55,7 @@ class TFTs : public TFT_eSPI { uint8_t NumberOfClockFaces = 0; void LoadNextImage(); void InvalidateImageInBuffer(); // force reload from Flash with new dimming settings + void ProcessUpdatedDimming(); String clockFaceToName(uint8_t clockFace); uint8_t nameToClockFace(String name); diff --git a/EleksTubeHAX_pio/src/_USER_DEFINES - empty.h b/EleksTubeHAX_pio/src/_USER_DEFINES - empty.h index 7145f9a..05f38dc 100644 --- a/EleksTubeHAX_pio/src/_USER_DEFINES - empty.h +++ b/EleksTubeHAX_pio/src/_USER_DEFINES - empty.h @@ -14,11 +14,12 @@ // ************* Type of the clock hardware ************* -#define HARDWARE_Elekstube_CLOCK // uncomment for the original Elekstube clock -//#define HARDWARE_Elekstube_CLOCK_Gen2 // uncomment for the original Elekstube clock Gen2.1 (ESP32 Pico D4 Chip) -//#define HARDWARE_SI_HAI_CLOCK // uncomment for the SI HAI copy of the clock -//#define HARDWARE_NovelLife_SE_CLOCK // uncomment for the NovelLife SE version; non-SE not tested -//#define HARDWARE_PunkCyber_CLOCK // uncomment for the PunkCyber / RGB Glow tube / PCBway clock +#define HARDWARE_Elekstube_CLOCK // uncomment for the original Elekstube clock +//#define HARDWARE_Elekstube_CLOCK_Gen2 // uncomment for the original Elekstube clock Gen2.1 (ESP32 Pico D4 Chip) +//#define HARDWARE_SI_HAI_CLOCK // uncomment for the SI HAI copy of the clock +//#define HARDWARE_NovelLife_SE_CLOCK // uncomment for the NovelLife SE version (Gesture only) - tested and working!; Non-SE version (Buttons only) NOT tested!; Pro version (Buttons and Gesture) NOT tested! +//#define HARDWARE_PunkCyber_CLOCK // uncomment for the PunkCyber / RGB Glow tube / PCBway clock +//#define HARDWARE_IPSTUBE_CLOCK // uncomment for the IPSTUBE clock models (H401 and H402) // ************* Clock font file type selection (.clk or .bmp) ************* @@ -26,19 +27,19 @@ // ************* Display Dimming / Night time operation ************* -#define DIMMING // uncomment to enable hardware dimming -#define NIGHT_TIME 22 // dim displays at 10 pm -#define DAY_TIME 7 // full brightness after 7 am -#define BACKLIGHT_DIMMED_INTENSITY 1 // 0..7 -#define TFT_DIMMED_INTENSITY 20 // 0..255 +#define NIGHTTIME_DIMMING // uncomment to enable dimming in the given time period between NIGHT_TIME and DAY_TIME +#define NIGHT_TIME 22 // dim displays at 10 pm +#define DAY_TIME 7 // full brightness after 7 am +#define BACKLIGHT_DIMMED_INTENSITY 1 // 0..7 +#define TFT_DIMMED_INTENSITY 20 // 0..255 // ************* WiFi config ************* -#define WIFI_CONNECT_TIMEOUT_SEC 20 -#define WIFI_RETRY_CONNECTION_SEC 15 -#define WIFI_USE_WPS //uncomment to use WPS instead of hard coded wifi credentials -#define WIFI_SSID "__enter_your_wifi_ssid_here__" // not needed if WPS is used -#define WIFI_PASSWD "__enter_your_wifi_password_here__" // not needed if WPS is used. Caution - Hard coded password is stored as clear text in BIN file +#define WIFI_CONNECT_TIMEOUT_SEC 20 +#define WIFI_RETRY_CONNECTION_SEC 15 +#define WIFI_USE_WPS //uncomment to use WPS instead of hard coded wifi credentials +#define WIFI_SSID "__enter_your_wifi_ssid_here__" // not needed if WPS is used +#define WIFI_PASSWD "__enter_your_wifi_password_here__" // not needed if WPS is used. Caution - Hard coded password is stored as clear text in BIN file // ************* Geolocation ************* diff --git a/EleksTubeHAX_pio/src/main.cpp b/EleksTubeHAX_pio/src/main.cpp index dc9bb60..3eea258 100644 --- a/EleksTubeHAX_pio/src/main.cpp +++ b/EleksTubeHAX_pio/src/main.cpp @@ -80,7 +80,7 @@ void setup() { menu.begin(); // Setup the displays (TFTs) initaly and show bootup message(s) - tfts.begin(); // and count number of clock faces available + tfts.begin(); tfts.fillScreen(TFT_BLACK); tfts.setTextColor(TFT_WHITE, TFT_BLACK); tfts.setCursor(0, 0, 2); // Font 2. 16 pixel high @@ -267,12 +267,12 @@ void loop() { if(MqttCommandMainBrightnessReceived) { MqttCommandMainBrightnessReceived = false; tfts.dimming = MqttCommandMainBrightness; - tfts.InvalidateImageInBuffer(); + tfts.ProcessUpdatedDimming(); updateClockDisplay(TFTs::force); } if(MqttCommandBackBrightnessReceived) { - MqttCommandBackBrightnessReceived = false; + MqttCommandBackBrightnessReceived = false; backlights.setIntensity(uint8_t(MqttCommandBackBrightness)); } @@ -393,22 +393,25 @@ void loop() { #endif // NovelLife_SE Clone XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX // Power button: If in menu, exit menu. Else turn off displays and backlight. - if (buttons.power.isDownEdge() && (menu.getState() == Menu::idle)) { +#ifndef ONE_BUTTON_ONLY_MENU + if (buttons.power.isUpEdge() && (menu.getState() == Menu::idle)) { + #ifdef DEBUG_OUTPUT + Serial.println("Power button pressed."); + #endif tfts.chip_select.setAll(); tfts.fillScreen(TFT_BLACK); - tfts.toggleAllDisplays(); if (tfts.isEnabled()) { -#ifndef HARDWARE_SI_HAI_CLOCK + #ifndef HARDWARE_SI_HAI_CLOCK tfts.reinit(); // reinit (original EleksTube HW: after a few hours in OFF state the displays do not wake up properly) -#endif + #endif tfts.chip_select.setAll(); tfts.fillScreen(TFT_BLACK); - updateClockDisplay(TFTs::force); } backlights.togglePower(); } +#endif menu.loop(buttons); // Must be called after buttons.loop() backlights.loop(); @@ -678,7 +681,7 @@ void GestureStart() } } -//Handle Interrupt from gesture sensor and simulate a short button press (state down_edge) of the corresponding button, if a gesture is detected +//Handle Interrupt from gesture sensor and simulate a short button press of the corresponding button, if a gesture is detected void HandleGestureInterupt() { if( isr_flag == 1 ) { @@ -702,30 +705,30 @@ void HandleGesture() { if ( apds.isGestureAvailable() ) { switch ( apds.readGesture() ) { case DIR_UP: - buttons.left.setDownEdgeState(); + buttons.left.setUpEdgeState(); Serial.println("Gesture detected! LEFT"); break; case DIR_DOWN: - buttons.right.setDownEdgeState(); + buttons.right.setUpEdgeState(); Serial.println("Gesture detected! RIGHT"); break; case DIR_LEFT: - buttons.power.setDownEdgeState(); + buttons.power.setUpEdgeState(); Serial.println("Gesture detected! DOWN"); break; case DIR_RIGHT: - buttons.mode.setDownEdgeState(); + buttons.mode.setUpEdgeState(); Serial.println("Gesture detected! UP"); break; case DIR_NEAR: - buttons.mode.setDownEdgeState(); + buttons.mode.setUpEdgeState(); Serial.println("Gesture detected! NEAR"); break; case DIR_FAR: - buttons.power.setDownEdgeState(); + buttons.power.setUpEdgeState(); Serial.println("Gesture detected! FAR"); break; - default: + default: Serial.println("Movement detected but NO gesture detected!"); } } @@ -758,10 +761,12 @@ void checkDimmingNeeded() { // dim the display in the defined night time if (isNightTime(current_hour)) { //check if it is in the defined night time Serial.println("Set to night time mode (dimmed)!"); tfts.dimming = TFT_DIMMED_INTENSITY; + tfts.ProcessUpdatedDimming(); backlights.setDimming(true); } else { - Serial.println("Set to day time mode (normal brightness)!"); + Serial.println("Setting daytime mode (max brightness)"); tfts.dimming = 255; // 0..255 + tfts.ProcessUpdatedDimming(); backlights.setDimming(false); } updateClockDisplay(TFTs::force); // redraw all the clock digits -> software dimming will be done here diff --git a/Hardware modification/README.md b/Hardware modification/README.md deleted file mode 100644 index ceee438..0000000 --- a/Hardware modification/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Hardware modification -Original EleksTube has a few problems in the hardware design. Most notably it forces 5V signals into ESP32 which is not happy about it. And it is outside of safe operating limits. -This will extend the lifetime of ESP32. Mine died because of this... -## Conversion -CH340 chip, used for USB-UART conversion can operate both on 5V and 3.3V. On the board it is powered by 5V. Cut one trace on the bottom side of the board that supplies the chip with 5V and route 3.3V over the resistors / capacitors to VDD and VREF. diff --git a/Photos/PunkCyber_ips_clock.jpg b/Photos/PunkCyber_ips_clock.jpg deleted file mode 100644 index cb651fb..0000000 Binary files a/Photos/PunkCyber_ips_clock.jpg and /dev/null differ diff --git a/README.md b/README.md index a3bfe49..79eaf38 100644 --- a/README.md +++ b/README.md @@ -1,187 +1,618 @@ # EleksTubeHAX - An aftermarket custom firmware for the desk clock -![EleksTube IPS clock](/Photos/Clock1.jpg) -### This is Home Assistant Edition with extensive MQTT support, see below -Supported hardware models: -### "EleksTube IPS clock", "SI HAI IPS clock", "NovelLife SE clock", "PunkCyber clock", "RGB Glow Tube DIY clock" +![EleksTube IPS clock](/documentation/ImagesMD/EleksTube_IPS_Classic_Edition.jpg) -Buy your own clock under the name "EleksTube IPS Clock" on eBay, Banggood, Aliexpress, etc. Look for places that offer 30-day guarantee, otherwise it can be a fake product! +### This is the "Home Assistant Edition" with extendent MQTT support, more info see below! -[Reddit discussion on the original hack is here.](https://www.reddit.com/r/arduino/comments/mq5td9/hacking_the_elekstube_ips_clock_anyone_tried_it/) +## Supported hardware models -[Original documentation and software from EleksMaker.](https://wiki.eleksmaker.com/doku.php?id=ips) +### Original EleksTube Models + +1. **EleksTube IPS Clock (Original Version)** +2. **EleksTube IPS Clock Gen2** + - EleksTube IPS Classic Edition/Pro/PR1/PR2 + +### Other Supported Models + +3. **SI HAI IPS Clock** +4. **NovelLife SE Clock** + - With gesture sensor + - Without gesture sensor +5. **PunkCyber IPS Clock f/k/a RGB Glow Tube DIY Clock** +6. **IPSTUBE Clock - Model H401 and H402** + - With bottom LED stripe + - Without bottom LED stripe + +### Notes + +- **EleksTube IPS Clock** is the original model created by the inventor in 2021. There are now many similar designs and clones on the market with varying hardware modifications. +- All "Original EleksTube" clocks sold after July 2022 are "Gen2" versions. Refer to the [Blog post on EleksTube website](https://elekstube.com/blogs/news/instructions-on-elekstube-clock-for-gen2-systems) for more details. +- Newer versions from EleksTube, such as PR1 and PR2, Pro and special editions (Pink etc.), are based on the base Gen2 version and sometimes called Gen3, because the original firmware version is already at Version 3.x for them. The "basic" version is now officially called "**EleksTube IPS Classic Edition**" +- In 2024 the IPSTUBE clocks become the cheapest and most available "clone" variant of the EleksTube clocks on the market. They are offered by a wide range of seller and under a lot of different names, but they all have the "IPSTUBE" logo printed in front. Most of the offers have words like Nixie, Tube, Clock, LED, Light, RGB, IPS and Glow in description. + +### Purchasing Information + +You can buy the "EleksTube IPS Clock" or its clones from eBay, Banggood, AliExpress, the EleksTube website, and other retailers. + +Ensure the seller offers at least a 30-day guarantee to avoid purchasing fake products or beeing tricked. + +### Firmware Compatibility + +- This firmware supports and has been tested on various clock models listed above. +- If you discover a new clone or version of these types of clocks, please report it by creating an issue in the "Issues" section of the GitHub project. Provide as many details as possible to help expand compatibility. -Firmware supports and was tested on different clock versions. Note that "EleksTube IPS" is the original, from the inventor of this type of the clock in 2021. Later appeared more and more similarly looking clock designs, copies of the original with more or less hardware modifications. In this repository we try to support most popular models. You can identify them by looking closely of the main board design: -![EleksTube IPS clock](/Photos/EleksTube_original_PCB.jpg) -![SI HAI IPS clock](/Photos/SI_HAI_ips_clock.jpg) -![NovelLife SE clock](/Photos/NovelLife_SE.jpg) -![PunkCyber / RGB Glow tube](/Photos/PunkCyber_ips_clock.jpg) +## Mainboard/PCB views -# Main clock features +EleksTube IPS - Orginal Version - with hardware modification +![EleksTube IPS clock](/documentation/ImagesMD/EleksTube_original_PCB.jpg) +EleksTube IPS - Gen2 (EleksTube IPS Classic Edition/Pro/PR1/PR2) +![EleksTube IPS clock - Gen2](/documentation/ImagesMD/EleksTube_Gen2_PCB.jpg) +SI HAI IPS +![SI HAI IPS clock](/documentation/ImagesMD/SI_HAI_ips_clock.jpg) +NovelLife SE +![NovelLife SE clock](/documentation/ImagesMD/NovelLife_SE.jpg) +PunkCyber IPS +![PunkCyber / RGB Glow tube](/documentation/ImagesMD/PunkCyber_IPS_clock_PCB.jpg) +IPSTUBE - H401 +![IPSTUBE clock - Model H401](/documentation/ImagesMD/IPSTUBE_H401_PCB.jpg) +IPSTUBE - H402 +![IPSTUBE clock - Model H402](/documentation/ImagesMD/IPSTUBE_H402_PCB.jpg) -- Up to 7 clock faces loaded onto the clock simultaneously; selected in menu or over MQTT +For detailed pictures for most of the clocks see the `documentation` subfolder. + +## Main clock features + +- Show the actual time on the LCDs of the clock with the selected clock face +- Multiple clock faces can be loaded into the clocks flash memory. Switchable via clock menu +- 12/24 hour view (switchable via clock menu) +- On-Screen menu to change settings/configuration of the clock - WiFi connectivity with NTP server synchronization -- Supported either WPS connection or hardcoded WiFi credentials -- Optional IP geolocation for autiomatic Timezone and DST adjustment -- Manual time zone adjust in 15-minute increments -- Optional MQTT client for remote control - clock faces and on/off can be controlled with mobile phone (SmartNest, SmartThings, Google assistant, Alexa, etc.) or included into existing home automation network -- RGB baclights (wall lights) for nice ambient with multiple modes -- Optional DS18B20 temperature sensor -- Dimming of the clock and backlights during the night time -- Different image files supported (BMP classic or paletized) and proprietary compressed files -- Supports smaller images which are centered on displays +- Supports either WPS connection or hardcoded WiFi credentials +- Manual time zone adjustment in 1 h and 15 minute slots +- RGB backlights (wall lights) for nice ambient light with multiple modes ("Off", "Test", "Constant", "Rainbow", "Pulse" and "Breath") +- Dimming of the displays (via alpha blending) and backlights (hardware) during the night time (start and end time configurable in code) +- Turning displays on and off (not supported on all clock versions) +- Keeping time even when power is off by using battery-powered real-time clock (not supported on all clocks) +- Saving and loading clock configuration from the flash, so storing all settings, even when power is off +- Supports various bitmap image file variants (classic or palletized BMP) and proprietary compressed files (CLK) +- Maximum image size is 135 x 240 (Width x Height) pixels +- Supports smaller images – they will be automatically centered - Advanced error handling for best user experience -- WiFi and MQTT errors are displayed below clock faces -- Supported hardware: original "EleksTube IPS clock"; "SI HAI clock" (chinese cknockoff); NovelLife SE clock (without gesture sensor); "PunkCyber" or "RGB Glow Tube DIY" clock (from pcbway). NOTE: EleksTube IPS Gen 2 was not tested. If someone owns it, please test this firmware and contact us (best to open Issue on GitHub and report back) -- (in works: ) Integrated web server to input configuration (or maybe load new clock faces) - -# Home Assistant Edition with extensive MQTT features - -- Device detected as two different lights, main and back -- Supported on/off, brightness, effects (main and back), color (back) -- Main light clock faces may be named, see clockfaces.txt on SPIFFS -- Supported 12/24 hours and blank zeroes settings switches -- Supported effect's speed change for backlight -- All options are discoverable via Home Assistant MQTT - -Detailed description: -Interaction with Home Assistant occurs according to the MQTT integration documentation: -https://www.home-assistant.io/integrations/light.mqtt/ -https://www.home-assistant.io/integrations/switch.mqtt/ -https://www.home-assistant.io/integrations/number.mqtt/ -https://www.home-assistant.io/integrations/mqtt/#mqtt-discovery -It is preferable (but not mandatory) to use MQTT Discovery (#define MQTT_HOME_ASSISTANT_DISCOVERY), in which case the device and all entities will be found by the MQTT integration without user intervention. Otherwise, all settings will need to be done manually. -#define MQTT_CLIENT is used as a unique device name (i.e. it should be different if you have several IPS clocks) and is the "root" part of the topic for all entities that will be interacted with via MQTT. Further analysis is easier to perform using, for example, "MQTT Explorer", a common add-on for users who prefer manual configuration. +- WiFi and MQTT errors are displayed below the digits +- Supports Home Assistant integration with extensive MQTT support (see below for details) +- Debug outputs via the serial port +- Optional MQTT client for remote control - Switch clock faces and turn displays on/off can be controlled via MQTT messages +- With a MQTT broker (SmartNest, SmartThings, Mosquitto etc.), this can also be integrated via a mobile phones app, a website or into an existing home automation network (and can be controlled via Google assistant, Alexa, etc.) +- Optional IP-based geolocation for automatic timezone and DST adjustments (only supported geolocation provider is "[Abstract](https://www.abstractapi.com/)") + +## Home Assistant Edition with extensive MQTT features + +If activated in the code, this version of the firmware can be remote controlled via Home Assistant. One of the leading free home automation solutions (see [Home Assistant Homepage](https://www.home-assistant.io)). + +Features: + +- Device detected as two different lights - main and back +- Turn displays on/off +- Control brightness level +- Change modes/effects of the LEDs (main and back) +- Change the color of the LEDs (in constant mode) +- Switching 12/24 hours mode +- Switching blank zeroes setting +- Modes/Effects speed change for backlight +- All options are discoverable via Home Assistant MQTT (if switched on) + +Note: Main light clock faces may be named and needs to be changed, if other clock faces are used. See `clockfaces.txt` in the `data` folder. + +### Detailed description: + +Interactions between the firmware of the clock and Home Assistant is possible like descriped in the MQTT integration documentations: + +- [MQTT Discovery](https://www.home-assistant.io/integrations/mqtt/#mqtt-discovery) +- [MQTT Light integration](https://www.home-assistant.io/integrations/light.mqtt/) +- [MQTT Switch integration](https://www.home-assistant.io/integrations/switch.mqtt/) +- [MQTT Number integration](https://www.home-assistant.io/integrations/number.mqtt/) + +It is preferable (but not mandatory) to use MQTT Discovery (uncomment `#define MQTT_HOME_ASSISTANT_DISCOVERY` and the following define statements), in which case the device and all entities will be found by the MQTT integration without user intervention. Otherwise, all settings will need to be done manually. + +`#define MQTT_CLIENT` is used as a unique device name (i.e. it should be different if you have several IPS clocks) and is the "root" part of the topic for all entities that will be interacted with via MQTT. + +Further analysis is easier to perform using an MQTT message reader tool, for example, "MQTT Explorer", a common HA Add-On for users who prefer manual configuration. See [HA forum post for MQTT Explorer Add-On](https://community.home-assistant.io/t/addon-mqtt-explorer-new-version/603739). It can be also used as a stand-alone application. See [Homepage of MQTT Explorer project](https://mqtt-explorer.com/) # How to use this firmware If you just want to use new firmware without setting up all the tools and libraries and everything, navigate to folder `\pre-built-firmware\` and modify `_ESP32 write flash.cmd` to upload selected version to your clock. If you want more features, continue reading below. -### Hardware modification -Original EleksTube has a few problems in the hardware design. Most notably it forces 5V signals into ESP32 which is not happy about it. And it is outside of safe operating limits. This will extend the lifetime of ESP32. Mine died because of this... -_Conversion:_ -CH340 chip, used for USB-UART conversion can operate both on 5V and 3.3V. On the board it is powered by 5V. Cut one trace on the bottom side of the board that supplies the chip with 5V and route 3.3V over the resistors / capacitors to VDD and VREF. -See folder "Hardware modification" for the photo. +## Clock specific features + +Some clock models have specific functionatlities or hardware specials which are only available for this model + +#### NovelLife SE Clock with gesture sensor + +- No buttons on the clock, only a gesture sensor +- Gesture sensor is supported by simulating the buttons like the other clocks have + +| gesture | button | +|--|--| +| down, near | Power | +| up, far | Mode | +| left | Left | +| right | Right | + +- The movement of the finger/hand from behind the glass tubes of the watch, over the glass tubes, directly and closely over the sensor to the front of the watch is the “down” gesture. +- The movement of the finger/hand from in front of the watch, directly and closely over the sensor, further over the glass tubes and behind it is the “up” gesture. +- The movement of the finger/hand starting left side from the sensor and moving over the sensor to the right side is the “right” gesture. +- The movement of the finger/hand starting right side from the sensor and moving over the sensor to the left side is the “left” gesture. +- Moving the finger/hand from directly above the sensor (from 5-8 cm away) toward the sensor (up to about 1 cm away) is the “near” gesture. +- Moving from close by the sensor (coming from the front and putting the finger/hand in 1cm distance over the sensor) to a bit more far away (5-7cm distance) is the "far" gesture. + +#### IPSTUBE Clock - Model H401 and H402 + +- This model has a 8MB flash memory, so either more clock faces can be stored on the clock or in a better quality (i.e. no palettization/conversion needed). + +##### One button menu + +- The clock has only one button. +- So there is a special menu mode active for this model. +- Short pressing the button brings up the menu. +- Short pressing while in the menu changes the menu scope. +- Long pressing (1-1.5 sec at least) changes the value of the actual selected menu scope. +- This makes navigating through the menus a bit "unhandy". +- The values always changes "to the right", because the long button press is emulating a "right button" press in the menu. +- This limits the selection of values (like in for timezone values or absolut color values). +- The selection is looping to the first value after reaching the last value. + +##### LCD stripe -# Backup first! -If you mess-up your clock, it's only your fault. Backup images from other uses DO NOT WORK as the original EleksTube firmware is locked by MAC address of ESP32. +- Some versions of this model have a LED stripe with 28 RGB LEDs installed on the bottom. +- The stripe is a continuation of the 6 LED on the bottom of the LCDs, called "backlight". +- In the moment, the stripe is following the configuration of the backlight (modes, colour etc.). +- All models have a 3-pin socket on the board, so theoratically the stripe is retrofittable with any LED stripe made of WS2812B LEDs and some work. + +## How to use this firmware + +### Pre-Build images + +If you just want to use this firmware without setting up all the tools and libraries and everything, navigate to folder `pre-built-firmware` and modify `_ESP32 write flash.cmd` to upload the firmware version for your clock. + +See also the `README.MD` in the `pre-built-firmware` subfolder of the repo. + +If you want more features and configure the firmware, check also section "How to build this firmware". + +### Backup first! + +**Always backup YOUR clocks firmware version as first step!** + +If you mess-up your clock, it's only your fault! + +Note for original EleksTube clocks: Backup images from other users **DO NOT WORK** as the original EleksTube firmware is locked to the MAC address of the ESP32. + +For other clocks it MAY work, but don't assume it! +Most clocks have MAC address binding! +Surely known for EleksTubes and IPSTUBEs! ### Install the USB Serial Port Device Driver -[EleksTube instructions](https://wiki.eleksmaker.com/doku.php?id=ips) instruct for installing a serial port driver. -On Windows 10, plug-in the cable and run Windows Update. It will find and install the driver. -On Linux it works out of the box. -### Save your original FW +Windows + +- On Windows, plug-in the cable into the clock and connect it to an USB port of your PC. Then run Windows Update. It will find and install the driver and generate an virtual COM port.
+Windows device manager COM port example:
+![Windows device manager COM port example](/documentation/ImagesMD/WindowsDeviceManagerCOMport.png) +- Only if Windows Update is not working for you, see the chinese manufacturers website for newest [CH340 driver](https://www.wch-ic.com/downloads/CH341SER_ZIP.html) for Windows and install them manually. + +Linux + +- On an up-to-date Linux it works out of the box. COM port should be something like `/dev/ttyUSB0`. +- If it is not working, see this [tutorial](https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers/linux) and see the chinese manufacturers website for newest [CH340 driver](https://www.wch-ic.com/downloads/CH341SER_ZIP.html) for Linux. + +### Save your original firmware + +To read from (or write to) the clock, it needs to be in the "download mode". Most clocks will go into this mode automatically, when the ESPTool tries to read or write to them. +Some clocks needs a button pressed while the powering phase (plugging the USB cable), like the IPSTUBEs. + Windows users: -* In this folder you have `esptool.exe` which is used to talk to the ESP32 in your clock over the USB-Serial chip on the board. -* Open Device Manager and find out which COM port represents your clock. -* Modify file `_ESP32 save flash 4MB.cmd` with your COM port number. -* Run this file. It will generate `backup1.bin`. Save it to a safe place. This is your precious backup. + +- In the folder "pre-built-firmware" of this repo you have the `esptool.exe`, which is used to talk to the ESP32 in your clock over the USB-Serial chip on the board of the clock. +- Open Device Manager and find out which virtual COM port represents your clock. +- Modify file `_ESP32 save flash 4MB.cmd` with your COM port number (or 8MB version for the IPSTUBE). +- Run the CMD file. +- It will generate a file named `backup1.bin`. Save it to a safe place! +- This is your precious backup. Linux users: -* You probably already know where to get Esptool and how to use it. :) -# How to build this firmware -Unfortunately, it's not simple plug-and-play. You need to do some things. These instructions assume you already know how to use the Visual Studio Code & PlatformIO plugin, and just need to know WHAT to do. +- You probably already know where to get `ESPTool` and how to use it. :) +- If not, this guide from the Tasmota project is very easy to follow: [ESPTool](https://tasmota.github.io/docs/Esptool/#put-device-in-firmware-upload-mode) +- Adopt the settings for your connected clock and save the firmware file to your device. + +### Restore backup + +You can write back your original firmware by modyfing the file `_ESP32 write flash.cmd`. + +- Set correct COM port and the name of your firmware backup file +- If needed, set the size to be written +- Run the CMD file and flash the firmware file +- Check if clock is working + +### Known backup problems + +#### COM port problems + +There are a lot of possible issues known with so called "virtual COM ports". +Some common ones are listed below. + +- On Windows: No COM port at all, but "unknown device" in the device manager -> Try to install the CH340 drivers manually. +- ESPTool fails to read or write all of the firmware -> Check your cable and if possible try another and a shorter one. Try to reduce the baud rate of the connection (like to 115200 or even below). Try to use an external powered USB hub, to avoid under powering. +- ESPTool is giving an error like "device is not in the download mode" -> Try to hold the power button while plugging the USB-C (power) cable. If this doesn't help, you may have a timing problem with the USB-UART chip. This is known for some combinations of USB controllers (especially 3.x) and the CH340. Try to use a USB2.x HUB with external USB power supply or, if nothing helps, try to use another computer. + +For more info ask your favorite search engine or AI Chatbot :) + +#### Lost firmware file + +If you lost your orginal firmware file and wants to restore the orginal firmware you normaly have a problem, because even if you get a backup file from another user, it is locked to the MAC address of the other ESP32 MAC. +Under some conditions, it should be possible to change the encoded MAC address in the firmware. This worked for EleksTube Gen1 clocks. See [Issue 8]('https://github.com/SmittyHalibut/EleksTubeHAX/issues/8'). + +Note: There is no gurantee, that you are able to change the MAC address in the firmware file successfully! If the orginal manufacturer decides to encode the MAC address or hide it, the descriped method will not work! + +So remember: +**Always backup your original firmware!** + +## How to build this firmware + +Unfortunately, it's not simple plug-and-play. + +You need to do some things. + +These instructions assume you already know how to use the **Visual Studio Code** and the **PlatformIO IDE** extension for it, and just need to know what to do. + +### Download this code -## Download this code -You're either reading this file after downloading it already, or you're reading it on github. I'll assume you can figure out how to get the code from github and put it somewhere on your local machine. This is your preference. +You're either reading this file after downloading/cloning it already, or you're reading it on GitHub. -## Setup Visual Studio Code & PlatformIO plugin -Follow guide here: https://platformio.org/install/ide?install=vscode -* Download, install and run VSCode -* Go to Extensions, Search for Platformio IDE and install it (it will take a while - observe status messages in the bottom right corner). -If you don't have Python already installed it will be automatically added by Platformio. In case of issues, install it manually. +If the last point applies, then we assume you can figure out how to get the code from GitHub and put it somewhere on your local machine. -### Development board support -ESP32 environment from Espressif is required. It will be installed automatically when this project is opened in VSCode & Platformio. Or before first compilation. It will take a while - observe status messages in the bottom right corner. -Developed and tested on version 2.0.11. -Flash size settings that are already configured in `partition_noOta_1Mapp_3Mspiffs.csv`: Flash Size: 4MB; Partition Scheme: No OTA (1 MB app, 3 MB SPIFFS). To fit as many images as possible. -Upload port is set to 921600 baud in the `platformio.ini` file Some clocks do not support such high speed, if you have issues, reduce this to 512000 baud. +### Visual Studio Code & PlatformIO IDE -### Libraries in use -All these libraries are in use. The most recent versions are automatically installed from the Platformio servers as soon as the project is opened or before first compilation. It will take a while - observe status messages in build log screen. -Compiles and works fine with listed library versions, as of 2024-02-03. Newer (or possibly older) versions should be fine too. If you have issues with automatic install, here are locations of the originals. +Follow this guide here: [Install PlatformIO IDE](https://platformio.org/install/ide?install=vscode) + +In short: + +- Download, install and run VSCode +- Go to Extensions, search for "PlatformIO IDE" and install it (it will take a while - observe status messages in the bottom right corner). +If you don't have Python already installed it will be automatically added by PlatformIO. In case of issues, install Python 3.x manually. + +#### ESP32 platform support + +The EspressIF 32 development platform for PlatformIO is required to support the ESP32 microcontroller. It will be installed automatically when this project is opened in VSCode/PlatformIO or if the first build is triggered. It will take a while - observe status messages in the bottom right corner. + +Tested on version 6.0.9 from the [PlatformIO registry](https://registry.platformio.org/platforms/platformio/espressif32). + +The default environment for this project (and most clocks) are using the "board" definition of the orginal "Espressif ESP32 Dev Module" named "esp32dev". +The IPSTUBE needs to use the "esp32dev8MB" environment with a custom board definition ("Espressif ESP32 Dev Module 8MB"). + +Flash size settings are already configured in the following files. + +| filename | environment | flash size | app part size | data part size | +|----------|-------------|------------|---------------|----------------| +| `partition_noOta_1Mapp_3Mspiffs.csv` | esp32dev | 4.0 MB | 1.2 MB | 2.8 MB | +| `partition_noOta_1Mapp_7Mspiffs.csv` | esp32dev8MB | 8.0 MB | 1.2 MB | 6.8 MB | + +No OTA partition, one app partition, one data partition as SPIFFS to store the images of the clock faces. + +These files are used by PlatformIO to create the partions on the flash of the ESP32 when uploading. + +Upload port is set to 921600 baud in the `platformio.ini` file. +**Note**: Some clocks do not support such high speed, if you have issues, reduce this to 512000 baud or even lower. + +#### Libraries in use + +All the listed libraries are in use (see `platform.ini` file). + +The most recent versions are automatically installed from the [PlatformIO registry](https://registry.platformio.org) (or the given source location) as soon as the project is opened or before first compilation. + +It will take a while to initally install them - observe status messages in build log screen. + +Compiles and works fine with listed library versions below, as of 2024-02-03. Newer (or possibly older) versions should be fine too. + +If you have issues with automatic installation, here are locations of the original source code. | Library | Author | Version | Link | | ------ | ------ | ------ | ------ | | NTPClient | Fabrice Weinberg | 3.2.1 | https://github.com/arduino-libraries/NTPClient | | Adafruit NeoPixel | Adafruit | 1.12.0 | https://github.com/adafruit/Adafruit_NeoPixel | -| DS1307RTC | Paul Stoffregen | 1.14.1 | http://playground.arduino.cc/code/time | -| Time | Paul Stoffregen | 1.6.1 | http://playground.arduino.cc/Code/Time/ | +| DS1307RTC | Paul Stoffregen | 1.4.1 | https://github.com/PaulStoffregen/DS1307RTC | +| Time | Paul Stoffregen | 1.6.1 | https://github.com/PaulStoffregen/Time | | TFT_eSPI | Bodmer | 2.5.34 | https://github.com/Bodmer/TFT_eSPI | | PubSubClient | Nick O'Leary | 2.8.0 | https://www.arduinolibraries.info/libraries/pub-sub-client | | ArduinoJson | Benoit Blanchon | 7.0.2 | https://github.com/bblanchon/ArduinoJson.git | | RTC by Makuna | Michael C.Miller | 2.4.2 | https://github.com/Makuna/Rtc/wiki | +| SparkFun APDS9960 RGB and Gesture Sensor | SparkFun | 1.4.3 | https://github.com/sparkfun/SparkFun_APDS-9960_Sensor_Arduino_Library | + +**Notes**: +`RTC by Makuna` is only required for "SI HAI clock". + +`sparkfun/SparkFun APDS9960 RGB and Gesture Sensor` is only required by NovelLife SE clocks with gesture sensor. + +`IPgeolocation` and `NTPclient` libraries were copied into the project and heavily updated (mostly bug fixes and error-catching). + +`DS1307RTC` is only available in version "0.0.0-alpha+sha.c2590c0033" from the PlatformIO registry. This version is working and should be compiled from the latest code version in the original repo of the lib. But to have a "nicer" version number (1.4.1), add `https://github.com/PaulStoffregen/DS1307RTC.git#1.4.1` instead of `paulstoffregen/DS1307RTC` into the `platform.ini`. + +#### Configure the `TFT_eSPI` library + +The supplied `script_configure_tft_lib.py` takes care of the library configuration. It copies two files (`_USER_DEFINES.h` and `GLOBAL_DEFINES.h`) into the library folder before building. This makes sure, the TFT_eSPI library is initalized with the correct values for each clock type. -Note: `RTC by Makuna` is only required for "SI HAI clock". -IPgeolocation and NTPclient libraries were coped into the project and heavily updated (mostly bug fixes and error-catching). +If you have issues with the scripts, copy the files manually every time the `TFT_eSPI` library is updated. -### Configure the `TFT_eSPI` library -Supplied `script_configure_tft_lib.py` takes care for library configuration. Copies both files `_USER_DEFINES.h` and `GLOBAL_DEFINES.h` into the library folder before building. Tested on Windows. -If for some reason you have issues, manually fopy the files every time the `TFT_eSPI` library is updated. +#### Configure the `APDS9960` library + +The supplied `script_adjust_gesture_sensor_lib.py` modifies some files of the APDS9960 library before building. It adds the support for the ID of the used (cloned) gesture chip (needed for NovelLife SE with gesture sensor only). + +### Configure, Build and Upload new firmware -## Configure, Build and Upload New Firmware Make sure you configured everything in `_USER_DEFINES.h`: -* Rename `_USER_DEFINES - empty.h` to `_USER_DEFINES.h` -* Select hardware platform (Elekstube, NovelLife, SI_HAI, PunkCyber/RGB Glow tube) :: un-comment appropriate hardware define -* Select if you prefer WPS or hardcoded credentials for WIFI (comment 'WIFI_USE_WPS' line and add credentials if desired) -* Select image type: .BMP files (default) or .CLK files + +- Rename/Copy `_USER_DEFINES - empty.h` to `_USER_DEFINES.h` +- Select the target hardware platform (Elekstube, NovelLife, SI_HAI, PunkCyber, IPSTUBE) by uncommenting the appropriate hardware define (only ONE clock type can be defined at a time, so comment out the unwanted) +- Select if you prefer WPS or hardcoded credentials for WiFi (comment '#define WIFI_USE_WPS' line and enter your WiFi network credentials to the other lines and uncomment them) +- Select image type for the clock faces to store: Bitmap files (.BMP) or .CLK files (uncomment #define USE_CLK_FILES) Optionally: -* Uncomment MQTT service (if in use) -* Your MQTT credentials :: Register on [SmartNest.cz](https://www.smartnest.cz/), create a Thermostat device, copy your username, API key and Thermostat Device ID. -* Uncomment Geolocation (if in use) -* Your Geolocation API :: Register on [Abstract API](https://www.abstractapi.com/), select Geolocation API and copy your API key. -* Uncomment and define pin for external DS18B20 temperature sensor (if connected) -Connect the clock to your computer with USB. You'll see a new serial port pop up. Platformio will automatically select the port. If you have Bluetooth virtal ports on your machine, it might hang and you must manually select the COM port in the `platformio.ini`. +- Enable integrated MQTT service (uncomment `#define MQTT_ENABLED` line and enter your MQTT credentials. From your local broker or from an internet-based broker. +E.g. register on [SmartNest.cz](https://www.smartnest.cz/), create a Thermostat device, copy your username, API key and Thermostat Device ID. +- Use IP-based geolocation by Abstract (uncomment `#define GEOLOCATION_ENABLED` and enter your geolocation API key: Register on [Abstract API](https://www.abstractapi.com/), select Geolocation API and copy your API key. +- Enable temperature sensor (uncomment and define pin for external DS18B20 temperature sensor) - not available for most of the clocks. +- Enable Home Assistant support by uncomment `#define MQTT_HOME_ASSISTANT` and the following block of comments for Auto-Discovery in HA. + +Connect the clock to your computer via a USB cable. You'll see, that a new serial port is detected and showing up in the device configuration. If not, check the section "Install the USB Serial Port Device Driver". + +PlatformIO will automatically select the right port for uploading (in most cases). + +Most clocks will go into to the download mode automatically, when PlatformIO is trying to upload the builded firmware files. +Some clocks needs a button pressed while the powering phase (plugging the USB cable), like the IPSTUBEs. + + **Note**: If you have Bluetooth virtual ports on your machine, it might hang and you must manually select the COM port in the `platformio.ini`, see [Upload options](https://docs.platformio.org/en/latest/projectconf/sections/env/options/upload/index.html). + +#### 1st Compile the code and upload the firmware file (to the app partition) + +Compile the code via the "Build" command of PlatformIO extension and upload the code via the "Upload" command in the matching environment for your clock (esp32dev is right for all clocks, except IPSTUBE) + +![alt text](/documentation/ImagesMD/PlatformIOBuild.png) + +At this point, it should build cleanly and upload successfully. + +Building: +![alt text](/documentation/ImagesMD/PlatformIOBuildOutput.png) + +Uploading: +![alt text](/documentation/ImagesMD/PlatformIOUploadOutput.png) + +Note: For IPSTUBE clocks use "esp32dev8MB" environment + +**Note**: On auto-reset clocks, you'll see the clock boot up after upload. It will go into the setup routine and ask for WPS or connecting to the configured WiFi network. On some clocks, you need to to a manual reset (power off/on cylce) + +**Note**: After the initally flash, your clock will **NOT SHOW ANYTHING** on the displays after the setup phase! +This is, because it doesn't have any bitmaps to display on the flash memory yet! + +**The screens will stay blank until you upload data!** + +See "2nd Fill data partition (SPIFFS) with images". + +#### 2nd Fill data partition (SPIFFS) with images + +The repository comes with a "predefined" set of BMP files in the `data` subdirectory of the `EleksTubeHAX_pio` folder. + +Each set of 10 images (one image for each digit) is called a "clock face" and can be chosen from the clock menu. Each set represents normally a different design or 'fonts' for the clock. +See below if you want to make your own. + +Note: If MQTT is enabled, clock face switching can also be done via the MQTT "set temperature" topic. + +Note: All files in the `data` directory will be packed into the SPIFFS flash image! Make sure to tidy it up regulary. -### Compile and Upload the Code -Compile and upload the code. At this point, it should build cleanly and upload successfully. You'll see the clock boot up and ask for WPS. But it doesn't have any bitmaps to display on the screen yet. +##### Generate and upload -### Upload Bitmaps -The repository comes with a set of CLK and BMP files in the `data/` directory. See below if you want to make your own. -In Platformio extension go to Project tasks and expand: Esp32 -> Platform -> Build Filesystem image & Upload filesystem image. -This will upload the files to the SPIFFS filesystem on the micro. They'll stay there, even if you re-upload the firmware multiple times. +- In PlatformIO extension go to "Project Tasks" and expand: esp32dev -> Platform +- Select "Build Filesystem Image" first +- Then connect the clock +- Click "Upload Filesystem Image" -### Custom Bitmaps -If you want to change clock faces / fonts: -* Create your own BMP files or select from the provided folder. Resolution must be max 135 x 240 pixels, 24 bit RGB. Can be smaller, it will be centered on the display. Cut away any black border, this only eats away valuable Flash storage space! -* Name them `10.bmp` through `19.bmp`; `20.bmp` to `29.bmp`, and so on. You can add as many as you can fit into SPIFFS space. -* Run your preferred image editor and play with reduced bit depths / paletization of the image. Very good results are with Dithering and 256-color palette. Size reduction is approx 70%. With very simple images (like 7-segment) even 16-color palette is enough and reduces size even further. +![alt text](/documentation/ImagesMD/PlatformIOBuildFilesystem.png) -Alternatively: -* Run the tool `\Prepare_images\Convert_BMP_to_CLK.exe` -* Select all prepared BMP files at once. It will create CLK files with smaller size. Size reduction is approx 30%. +This will upload the files to the SPIFFS filesystem on the ESP32 (flash of the clock). -* Put files in the `\data` directory. -* Then do the "Build Filesystem image & Upload filesystem image" dance again. -Each set of images can be chosen in the menu or via the MQTT "set temperature". +Note: The data will stay there, even if you re-upload the real firmware to the app partition, because the data partition is not overriden or modified by that. + +Note: For IPSTUBE clocks use "esp32dev8MB" environment + +#### Custom clock faces from Bitmaps + +If you want to change the uploaded clock faces for the clock: + +- Create your own set of BMP files or select and copy some from the provided sets in the `data - other graphics` folder of this repo or download some from the internet (see below). +- Maximum resolution of each image is 135 x 240 pixels (HxW). They can be smaller, then the picture will be centered on the display. +- Maximum color depth is 24 bit RGB. But recommended is palettized Bitmaps with 256 colors palette. +- Name them `10.bmp` (for digit Zero) through `19.bmp` (for digit Nine); `20.bmp` to `29.bmp`, and so on. Note: There is no set 00-09.bmp! +- You can add max 8 clock face sets in the moment (Due to a problem in the detection meachanism - will be fixed soon). + +Tips: + +- Cut away any black border, this only eats away valuable flash storage space! +- Run your preferred image editor and play with reduced bit depths / palettization of the image! +- Very good results are with Dithering and 256-color palette. Size reduction is approx 70%. +- With very simple images (like 7-segment digits) even 16-color palette is enough and reduces size even further. + +#### CLK files as alternative + +Before supporting palettized Bitmaps, there was a special format used to store images, to safe some space on the flash of the clock. You can still switch to use CLK (Clock) files only, but there is no space saving anymore, if palattized Bitmaps are used! + +To convert existing image files to CLK format: + +- Run the tool `\Prepare_images\Convert_BMP_to_CLK.exe` (Windows only) +- You can select all BMP files to be converted at once. It will create CLK files from it. +- For a 24 bit depth Bitmap, size reduction is approx 30%. +- If needed, rename the generated files and put them in the `data` directory. +- Then do the "Build Filesystem Image & Upload Filesystem Image" dance again. + +Note: It is either Bitmap or CLK! No mixing, so make sure to "clean" the `data` folder before switching. + +#### Clock faces Here are links to some good 3rd party sets out there: -* https://github.com/upiir/ips_clock_100x_themes -* https://github.com/upiir/elekstube_ips_custom_theme -* https://github.com/upiir/rgb_glow_tube_clock -If you have your own "font" that'll work and want it listed here, please file an Issue and/or Pull Request. +- +- +- + +If you have your own clock face that'll work and want it listed here, please file an Issue and/or Pull Request. + +#### Configure your WiFi network + +- For WPS: When prompted by the clock, press WPS button on your router (or in web-interface of your router). Clock will automatically connect to the WiFi and save data for future use. No need to input your credentials anywhere in the source code. The clock will remember WiFi connection details even if you unplug the clock. +- Without WPS: Add your WiFi credentials into `_USER_DEFINES.h` file before building the firmware. + +Note: The `_USER_DEFINES.h` is included in the default `.gitignore` file, so that your personal credentials will not be pushed to a git repo by default, if you are using a forked git repo. + +## Known problems/limitations + +##### No RTC for SI HAI IPS Clock + +There is no battery on the SI HAI IPS clock, so the clock will loose the time, if powered off. + +##### One Button menu for IPSTUBE clocks + +The value always changes "to the right", on a long button press. +Values smaller then the starting value ("to the left") can never be seleted (like in for timezone values or absolut color values). + +##### No display turn off for some IPSTUBE clocks + +Depending on the board version of the IPSTUBEs models H401 and H402, the transistor Q1 is present on the board or not. +If the transistor (marked A19TF, seems a 3401) is present, the displays can be turned on and off like on other clocks. +If the transistor is not present, the TFT LCDs can NOT turned on or off by software without modifing the hardware! +The ground pin for the LCDs is connected directly to ground on these boards. -### Configure your WiFi network -* For WPS: When prompted by the clock, press WPS button on your router (or in web-interface of your router). Clock will automatically connect to the WiFi and save data for future use. No need to input your credentials anywhere in the source code. The clock will remember WiFi connection details even if you unplug the clock. -* Without WPS: Add your WiFi credentials into `_USER_DEFINES.h` file before building the firmware. +It should be possible to solder a transistor on position Q1, to bring the switching funcionality to the boards. +Not tried yet! + +In general, the pin 1 and pin 7 of each FPC for each TFT LCD are connected together directly to the +V3.3 line of the PCB. +Pin 1 is the general VCC power (LED Anode) and pin 7 is the VDD (Power Supply for Analog). +So there is no way to control the VDD on pin 7 seperately (real dimming) or to turn on or turn off power to pin 1, even if the transistor is present. +But turning on an off via ground pin is possible. + +##### Precision gesture sensor + +The accuracy of the gesture sensor on the Novellife clock is not very good. It needs some 'training' to be able to control the clock. + +## Development Process/History -# Development Process See [Old Readme File](/README_OLD.md) for details. -Hardware pinout and notes are in the document `Hardware pinout.xlsx` +[Reddit discussion on the original hack is here.](https://www.reddit.com/r/arduino/comments/mq5td9/hacking_the_elekstube_ips_clock_anyone_tried_it/) + +[Original documentation and software from EleksMaker.](https://wiki.eleksmaker.com/doku.php?id=ips) + +For Elekstube OV and SI HAI: +Hardware pinout and notes are in the document `Hardware pinout.xlsx` in the `documentation` folder + +There was an offical "manual" and software package avaiable for the original Elekstube clock. +The website is not maintained anymore, so just for archive purpose: +See [EleksTube instructions](https://wiki.eleksmaker.com/doku.php?id=ips) + +### Hardware modifications + +#### PunkCyber IPS clock: No CH340 chip soldered on PCB of newer editions + +##### Problem + +Short story: CH340 chip is missing. + +Long story: The original version of the "PunkCyber IPS Clock" was buyable from PCBWay as "RGB Glow Tube DIY Clock" and is no longer available from there (see [PCBWay | RGB Glow Clock]('https://www.pcbway.com/project/gifts_detail/RGB_Glow_Tube_Clock_907ad35c.html')). This version had a CH340 chip soldered and two USB-C ports, where the right one was working, to communicate with a PC via the USB-UART chip. + +The clock is still available to buy from other resellers. It is already assembled and in a box, sold as "PunkCyber IPS Clock". + +All these newer versions of the clock do NOT have the CH340 chip and the components for the "auto download mode circuit" soldered! Just empty soldering header. +So both USB-C ports are only for giving power to the clock. + +A communication (like downloading or uploading firmware) is not possible easily without this chip! + +The original manufacturer has an 'interesting' way to update the firmware "over-the-air", by connecting your mobile phone to the Wifi-Access-Point of the clock and joining a WeChat channel and let them control the clock from there (see the discussion on the PCBWay site). + +##### Solution + +If you want to bring the EleksTubeHAX firmware to the clock, we need either to solder a CH340 chip and the transistors and resistors on there designated places, or use an "external" USB-UART bridge/board. + +The "easiser" way is the external board solution IMO. + +Below the missing chip are some soldering headers: + +![PunkCyber / RGB Glow tube](/documentation/ImagesMD/PunkCyber_PCB_CH340_header.jpg) + +BOOT is connected to GPIO0 (pin 25) on the ESP32 +EN is connected to EN (pin 3) on the ESP32 +G is connected to Ground (pins 1/38/15) on the ESP32 +R is connected to GPIO1 / TxD (pin 35) on the ESP32 +T is connected to GPIO3 / RxD (pin 34) on the ESP32 + +So we just need to connect +G on the PCB to Ground on the UART bridge/board +R on the PCB to Rx on the UART bridge/board +T on the PCB to Tx on the UART bridge/board + +| Pin PCB | Pin UART | +| ------ | ------ | +| G | GND | +| R | Rx | +| T | Tx | + +We also need a way to put the clock into the download mode, so we need some kind of a switch between +left header of BOOT 1 (to ESP32) and +right header of BOOT 1 (Ground). + +Best way is to solder "sockets" to the existing headers, so that there longer pin side is pointing downwards from the not printed side of the PCB. Reason is easy, there is enough space between the backplate and the PCB to leave them soldered on for re-usage and they are not visible from the upper side. + +![soldered sockets with backplate](/documentation/ImagesMD/PunkCyber_soldered_sockets.jpg) +Soldered sockets + +![soldered sockets with backplate](/documentation/ImagesMD/PunkCyber_soldered_sockets_with_backplate.jpg) +Soldered sockets with backplate + +BOOT needs to be shorted, while the USB-C cable is connected to one of the USB-C ports (while powering) and then released to go into the download mode. + +Normally, all USB-UART bridges/boards should work, but for me, the UART bridge mode of the Flipper Zero (STM chip) didn't work properly! I have no idea why. + +So I successfully used an old FT232 board, which was still flying around (with Mini-USB :)) to read/backup the orginal firmware and write the EleksTubeHAX version. + +To get one on your own, search for "USB to UART" on your favorite seller platform, like the ones with A from US or PRC. Costs should not exceed 2-7 EUR/USD. + +![PunkCyber connected via FT232](/documentation/ImagesMD/PunkCyber_connected_UART-USB_bridge_and_reset_button.jpg) +Working solution + +![PunkCyber successfull backup](/documentation/ImagesMD/PunkCyber_backup_successful.jpg) +Successful backup + +Thanks to @Fastdruid for finding a good way to overcome this problem! (see [Issue 62]('https://github.com/SmittyHalibut/EleksTubeHAX/issues/62')) + +#### EleksTube Gen1: 5V on CH340 and ESP32 + +##### Problem + +The "Original Version" (Gen1) of the Elekstube clock has a few issues in the hardware design. Most notably, it forces 5V signals from the USB-UART chip into the ESP32, which is not happy about it. This is outside of the safe operating limits and significantly reduces the lifetime of the ESP32. Mine (from the original author) died because of this... + +##### Solution + +The CH340 chip, used for USB-UART conversion, can operate both on 5V and 3.3V. On the Gen1 board it is powered by 5V. +We can switch it to 3.3V. +Cut one trace on the bottom side of the board that supplies the chip with 5V and route the 3.3V over the resistors / capacitors to VDD and VREF of the CH340. + +![EleksStube Gen1 hardware modification](/documentation/ImagesMD/EleksTube_IPS_CH340C_mod.jpg) + +Note: This problem does not appear on Gen2 hardware from Elekstube! All clocks sold today (Autumn 2024) do not require any hardware modification! + +## Main Contributors -# Main Contributors - Mark Smith, aka Smitty ... @SmittyHalibut on GitHub, Twitter, and YouTube. - Aljaz Ogrin, aka aly-fly ... @aly-fly on GitHub and Instagram - Misc code snips either commited by or copied from: @icebreaker-ch, @meddle99, @OggyP, @bitrot-alpha - Home Assistant support by @victorvuelma and @gamba69 - in future (on to-do list) also from: @RedNax67, @wfdudley, @judge2005 -*Happy hacking!* - +_Happy hacking!_ diff --git a/TO-DO.txt b/TO-DO.txt index 585737e..004ceb9 100644 --- a/TO-DO.txt +++ b/TO-DO.txt @@ -3,4 +3,4 @@ - MQTT transmissions in a single block. - Temperature sensor readout in a single block. - Limit IP Geolocation to every Sunday (copy code from the fork) -- Add static zime zone data if IP Geo is disabled (copy code from the fork) +- Add static time zone data if IP Geo is disabled (copy code from the fork) diff --git a/data - other graphics/30 dog.bmp b/data - other graphics/30 dog.bmp deleted file mode 100644 index da732b2..0000000 Binary files a/data - other graphics/30 dog.bmp and /dev/null differ diff --git a/documentation/Hardware IPSTUBE/Clock Components.md b/documentation/Hardware IPSTUBE/Clock Components.md new file mode 100644 index 0000000..ab26482 --- /dev/null +++ b/documentation/Hardware IPSTUBE/Clock Components.md @@ -0,0 +1,13 @@ +# IPSTUBE Clock - Model H401 and H402 + +## Identified components + +- **ESP32** as ESP32-D0WD-V3 with Package: QFN 5*5, see [datasheet](https://eu.mouser.com/datasheet/2/891/Espressif_Systems_01292021_esp32-1991551.pdf) +- **XT25F64** as XT25F64BDXI/HGT with Package: DFN8 4x3x0.55 mm, see [datasheet](https://file2.dzsc.com/product/19/06/22/216185_132959081.pdf) +- **DS1302** as DS1302Z+ with Package: SO (208 mils/150 mils), see [datasheet](https://www.analog.com/media/en/technical-documentation/data-sheets/DS1302.pdf) +- **CH340** as CH340N with Package: SOP-8 3.9mm 150mil, see [datasheet](https://web.archive.org/web/20230328023924/http://wch-ic.com/downloads/file/79.html?time=2023-01-31%2005:37:01&code=byrlQteadwoMguMjmbWlPKyCiEACwGGapSxnN8I1) +- **ME6118** as ME6118A33(2121/33) with Package SOT223, see [datasheet](https://datasheetspdf.com/download_new.php?id=1330628) +- **TFT Display** with FPC ST7789 as ER-TFT1.14-2, see [datasheet](https://www.buydisplay.com/download/manual/ER-TFT1.14-2_Datasheet.pdf) +- **RGB-LEDs** as WS2812B, see [datasheet](https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf) +- **RGB-LED stripe** with WS2812b RGB LEDs. As a stripe of LEDs with small distance to connect to the connector on the board +- **Transistor** on position Q1 (if present), marked A19TF. Seems to be a 3401 model like [datasheet](https://wmsc.lcsc.com/wmsc/upload/file/pdf/v2/lcsc/1811131826_KIA-Semicon-Tech-KIA3401_C116049.pdf) \ No newline at end of file diff --git a/documentation/Hardware IPSTUBE/H401/01 - H401 - Box.jpg b/documentation/Hardware IPSTUBE/H401/01 - H401 - Box.jpg new file mode 100644 index 0000000..49f9ced Binary files /dev/null and b/documentation/Hardware IPSTUBE/H401/01 - H401 - Box.jpg differ diff --git a/documentation/Hardware IPSTUBE/H401/02 - H401 - Box content - opened housing.jpg b/documentation/Hardware IPSTUBE/H401/02 - H401 - Box content - opened housing.jpg new file mode 100644 index 0000000..cf46167 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H401/02 - H401 - Box content - opened housing.jpg differ diff --git a/documentation/Hardware IPSTUBE/H401/03 - H401 - Clock front - light.jpg b/documentation/Hardware IPSTUBE/H401/03 - H401 - Clock front - light.jpg new file mode 100644 index 0000000..bdf0c17 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H401/03 - H401 - Clock front - light.jpg differ diff --git a/documentation/Hardware IPSTUBE/H401/04 - H401 - Clock front - dark.jpg b/documentation/Hardware IPSTUBE/H401/04 - H401 - Clock front - dark.jpg new file mode 100644 index 0000000..0301c06 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H401/04 - H401 - Clock front - dark.jpg differ diff --git a/documentation/Hardware IPSTUBE/H401/05 - H401 - Clock rear.jpg b/documentation/Hardware IPSTUBE/H401/05 - H401 - Clock rear.jpg new file mode 100644 index 0000000..efab934 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H401/05 - H401 - Clock rear.jpg differ diff --git a/documentation/Hardware IPSTUBE/H401/06 - H401 - Clock top.jpg b/documentation/Hardware IPSTUBE/H401/06 - H401 - Clock top.jpg new file mode 100644 index 0000000..e846b91 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H401/06 - H401 - Clock top.jpg differ diff --git a/documentation/Hardware IPSTUBE/H401/07 - H401 - Clock bottom with LED stripe.jpg b/documentation/Hardware IPSTUBE/H401/07 - H401 - Clock bottom with LED stripe.jpg new file mode 100644 index 0000000..f7e3589 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H401/07 - H401 - Clock bottom with LED stripe.jpg differ diff --git a/documentation/Hardware IPSTUBE/H401/08 - H401 - PCB top - three displays missing - reset button bridged.jpg b/documentation/Hardware IPSTUBE/H401/08 - H401 - PCB top - three displays missing - reset button bridged.jpg new file mode 100644 index 0000000..2824042 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H401/08 - H401 - PCB top - three displays missing - reset button bridged.jpg differ diff --git a/documentation/Hardware IPSTUBE/H401/09 - H401 - PCB bottom.jpg b/documentation/Hardware IPSTUBE/H401/09 - H401 - PCB bottom.jpg new file mode 100644 index 0000000..1c78768 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H401/09 - H401 - PCB bottom.jpg differ diff --git a/documentation/Hardware IPSTUBE/H402/01 - H402 - Box front.jpg b/documentation/Hardware IPSTUBE/H402/01 - H402 - Box front.jpg new file mode 100644 index 0000000..847df11 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H402/01 - H402 - Box front.jpg differ diff --git a/documentation/Hardware IPSTUBE/H402/02 - H402 - Box side.jpg b/documentation/Hardware IPSTUBE/H402/02 - H402 - Box side.jpg new file mode 100644 index 0000000..d180567 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H402/02 - H402 - Box side.jpg differ diff --git a/documentation/Hardware IPSTUBE/H402/03 - H402 - Box content.jpg b/documentation/Hardware IPSTUBE/H402/03 - H402 - Box content.jpg new file mode 100644 index 0000000..e6c2570 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H402/03 - H402 - Box content.jpg differ diff --git a/documentation/Hardware IPSTUBE/H402/04 - H402 - Clock front.jpg b/documentation/Hardware IPSTUBE/H402/04 - H402 - Clock front.jpg new file mode 100644 index 0000000..9afc622 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H402/04 - H402 - Clock front.jpg differ diff --git a/documentation/Hardware IPSTUBE/H402/05 - H402 - Clock rear.jpg b/documentation/Hardware IPSTUBE/H402/05 - H402 - Clock rear.jpg new file mode 100644 index 0000000..9b76052 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H402/05 - H402 - Clock rear.jpg differ diff --git a/documentation/Hardware IPSTUBE/H402/06 - H402 - Clock top.jpg b/documentation/Hardware IPSTUBE/H402/06 - H402 - Clock top.jpg new file mode 100644 index 0000000..5a7fef8 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H402/06 - H402 - Clock top.jpg differ diff --git a/documentation/Hardware IPSTUBE/H402/07 - H402 - Clock bottom.jpg b/documentation/Hardware IPSTUBE/H402/07 - H402 - Clock bottom.jpg new file mode 100644 index 0000000..a790a9d Binary files /dev/null and b/documentation/Hardware IPSTUBE/H402/07 - H402 - Clock bottom.jpg differ diff --git a/documentation/Hardware IPSTUBE/H402/08 - H402 - PCB bottom in housing.jpg b/documentation/Hardware IPSTUBE/H402/08 - H402 - PCB bottom in housing.jpg new file mode 100644 index 0000000..c4adcb4 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H402/08 - H402 - PCB bottom in housing.jpg differ diff --git a/documentation/Hardware IPSTUBE/H402/09 - H402 - PCB bottom.jpg b/documentation/Hardware IPSTUBE/H402/09 - H402 - PCB bottom.jpg new file mode 100644 index 0000000..3be38a5 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H402/09 - H402 - PCB bottom.jpg differ diff --git a/documentation/Hardware IPSTUBE/H402/10 - H402 - PCB top.jpg b/documentation/Hardware IPSTUBE/H402/10 - H402 - PCB top.jpg new file mode 100644 index 0000000..15d4c05 Binary files /dev/null and b/documentation/Hardware IPSTUBE/H402/10 - H402 - PCB top.jpg differ diff --git a/documentation/Hardware IPSTUBE/KiCAD - Unfinished Schematics/Test1.kicad_sch b/documentation/Hardware IPSTUBE/KiCAD - Unfinished Schematics/Test1.kicad_sch new file mode 100644 index 0000000..ef2ef2a --- /dev/null +++ b/documentation/Hardware IPSTUBE/KiCAD - Unfinished Schematics/Test1.kicad_sch @@ -0,0 +1,15640 @@ +(kicad_sch + (version 20231120) + (generator "eeschema") + (generator_version "8.0") + (uuid "ea08b12c-2c1c-4ed5-90cf-379b326169cc") + (paper "A4") + (lib_symbols + (symbol "Connector:Conn_01x08_Socket" + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 10.16 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x08_Socket" + (at 0 -12.7 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x08, script generated" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_locked" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_01x08_Socket_1_1" + (arc + (start 0 -9.652) + (mid -0.5058 -10.16) + (end 0 -10.668) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -7.112) + (mid -0.5058 -7.62) + (end 0 -8.128) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -4.572) + (mid -0.5058 -5.08) + (end 0 -5.588) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -2.032) + (mid -0.5058 -2.54) + (end 0 -3.048) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -10.16) (xy -0.508 -10.16) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -7.62) (xy -0.508 -7.62) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -5.08) (xy -0.508 -5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -2.54) (xy -0.508 -2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 0) (xy -0.508 0) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 2.54) (xy -0.508 2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 5.08) (xy -0.508 5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 7.62) (xy -0.508 7.62) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 0.508) + (mid -0.5058 0) + (end 0 -0.508) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 3.048) + (mid -0.5058 2.54) + (end 0 2.032) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 5.588) + (mid -0.5058 5.08) + (end 0 4.572) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 8.128) + (mid -0.5058 7.62) + (end 0 7.112) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 7.62 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 5.08 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -5.08 0) + (length 3.81) + (name "Pin_6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -7.62 0) + (length 3.81) + (name "Pin_7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -10.16 0) + (length 3.81) + (name "Pin_8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Connector:Conn_Coaxial_Small" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0.254 3.048 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_Coaxial_Small" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "small coaxial connector (BNC, SMA, SMB, SMC, Cinch/RCA, LEMO, ...)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "BNC SMA SMB SMC LEMO coaxial connector CINCH RCA MCX MMCX U.FL UMRF" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "*BNC* *SMA* *SMB* *SMC* *Cinch* *LEMO* *UMRF* *MCX* *U.FL*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_Coaxial_Small_0_1" + (polyline + (pts + (xy -2.54 0) (xy -0.508 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 0 0) + (radius 0.508) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Conn_Coaxial_Small_1_1" + (arc + (start -1.1916 -0.6311) + (mid 0.327 -1.3081) + (end 1.3484 0.0039) + (stroke + (width 0.3048) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 1.3484 -0.0039) + (mid 0.327 1.3081) + (end -1.1916 0.6311) + (stroke + (width 0.3048) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -2.54 0 0) + (length 1.27) + (name "In" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 0 180) + (length 1.27) + (name "Ext" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Connector:USB_C_Plug" + (pin_names + (offset 1.016) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "P" + (at -10.16 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "USB_C_Plug" + (at 10.16 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "" + (at 3.81 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.usb.org/sites/default/files/documents/usb_type-c.zip" + (at 3.81 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "USB Type-C Plug connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "usb universal serial bus" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "USB*C*Plug*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "USB_C_Plug_0_0" + (rectangle + (start -0.254 -35.56) + (end 0.254 -34.544) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 -32.766) + (end 9.144 -33.274) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 -30.226) + (end 9.144 -30.734) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 -25.146) + (end 9.144 -25.654) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 -22.606) + (end 9.144 -23.114) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 -17.526) + (end 9.144 -18.034) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 -14.986) + (end 9.144 -15.494) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 -9.906) + (end 9.144 -10.414) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 -7.366) + (end 9.144 -7.874) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 -2.286) + (end 9.144 -2.794) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 0.254) + (end 9.144 -0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 7.874) + (end 9.144 7.366) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 12.954) + (end 9.144 12.446) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 18.034) + (end 9.144 17.526) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 20.574) + (end 9.144 20.066) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 25.654) + (end 9.144 25.146) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "USB_C_Plug_0_1" + (rectangle + (start -10.16 27.94) + (end 10.16 -35.56) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (arc + (start -8.89 -3.81) + (mid -6.985 -5.7067) + (end -5.08 -3.81) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -7.62 -3.81) + (mid -6.985 -4.4423) + (end -6.35 -3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -7.62 -3.81) + (mid -6.985 -4.4423) + (end -6.35 -3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (rectangle + (start -7.62 -3.81) + (end -6.35 3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (arc + (start -6.35 3.81) + (mid -6.985 4.4423) + (end -7.62 3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -6.35 3.81) + (mid -6.985 4.4423) + (end -7.62 3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (arc + (start -5.08 3.81) + (mid -6.985 5.7067) + (end -8.89 3.81) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -8.89 -3.81) (xy -8.89 3.81) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -5.08 3.81) (xy -5.08 -3.81) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "USB_C_Plug_1_1" + (circle + (center -2.54 1.143) + (radius 0.635) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center 0 -5.842) + (radius 1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 0 -5.842) (xy 0 4.318) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -3.302) (xy -2.54 -0.762) (xy -2.54 0.508) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -2.032) (xy 2.54 0.508) (xy 2.54 1.778) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 4.318) (xy 0 6.858) (xy 1.27 4.318) (xy -1.27 4.318) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (rectangle + (start 1.905 1.778) + (end 3.175 3.048) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (pin passive line + (at 0 -40.64 90) + (length 5.08) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -15.24 180) + (length 5.08) + (name "RX2-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -17.78 180) + (length 5.08) + (name "RX2+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -40.64 90) + (length 5.08) hide + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -10.16 180) + (length 5.08) + (name "TX1+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -7.62 180) + (length 5.08) + (name "TX1-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 15.24 25.4 180) + (length 5.08) + (name "VBUS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 20.32 180) + (length 5.08) + (name "CC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 7.62 180) + (length 5.08) + (name "D+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 12.7 180) + (length 5.08) + (name "D-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -30.48 180) + (length 5.08) + (name "SBU1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 15.24 25.4 180) + (length 5.08) hide + (name "VBUS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -40.64 90) + (length 5.08) hide + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 0 180) + (length 5.08) + (name "RX1-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -2.54 180) + (length 5.08) + (name "RX1+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -40.64 90) + (length 5.08) hide + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -25.4 180) + (length 5.08) + (name "TX2+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -22.86 180) + (length 5.08) + (name "TX2-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 15.24 25.4 180) + (length 5.08) hide + (name "VBUS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 17.78 180) + (length 5.08) + (name "VCONN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -33.02 180) + (length 5.08) + (name "SBU2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 15.24 25.4 180) + (length 5.08) hide + (name "VBUS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -7.62 -40.64 90) + (length 5.08) + (name "SHIELD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "S1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:Battery_Cell" + (pin_numbers hide) + (pin_names + (offset 0) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "BT" + (at 2.54 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Battery_Cell" + (at 2.54 0 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0 1.524 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 1.524 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Single-cell battery" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "battery cell" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Battery_Cell_0_1" + (rectangle + (start -2.286 1.778) + (end 2.286 1.524) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (rectangle + (start -1.524 1.016) + (end 1.524 0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 0 0.762) (xy 0 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 1.778) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 3.048) (xy 1.778 3.048) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 3.556) (xy 1.27 2.54) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Battery_Cell_1_1" + (pin passive line + (at 0 5.08 270) + (length 2.54) + (name "+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -2.54 90) + (length 2.54) + (name "-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:C_Small" + (pin_numbers hide) + (pin_names + (offset 0.254) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" + (at 0.254 1.778 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 0.254 -2.032 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "capacitor cap" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "C_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "C_Small_0_1" + (polyline + (pts + (xy -1.524 -0.508) (xy 1.524 -0.508) + ) + (stroke + (width 0.3302) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.524 0.508) (xy 1.524 0.508) + ) + (stroke + (width 0.3048) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "C_Small_1_1" + (pin passive line + (at 0 2.54 270) + (length 2.032) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -2.54 90) + (length 2.032) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:Crystal" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "Y" + (at 0 3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Crystal" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Two pin crystal" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "quartz ceramic resonator oscillator" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Crystal*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Crystal_0_1" + (rectangle + (start -1.143 2.54) + (end 1.143 -2.54) + (stroke + (width 0.3048) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.54 0) (xy -1.905 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.905 -1.27) (xy -1.905 1.27) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.905 -1.27) (xy 1.905 1.27) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 0) (xy 1.905 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Crystal_1_1" + (pin passive line + (at -3.81 0 0) + (length 1.27) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 1.27) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:D" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "D" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO-???* *_Diode_* *SingleDiode* D_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "D_0_1" + (polyline + (pts + (xy -1.27 1.27) (xy -1.27 -1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 0) (xy -1.27 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 1.27) (xy 1.27 -1.27) (xy -1.27 0) (xy 1.27 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "D_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "K" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:LED" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "D" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LED" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Light emitting diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "LED diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "LED* LED_SMD:* LED_THT:*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "LED_0_1" + (polyline + (pts + (xy -1.27 -1.27) (xy -1.27 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 0) (xy 1.27 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 -1.27) (xy 1.27 1.27) (xy -1.27 0) (xy 1.27 -1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -3.048 -0.762) (xy -4.572 -2.286) (xy -3.81 -2.286) (xy -4.572 -2.286) (xy -4.572 -1.524) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.778 -0.762) (xy -3.302 -2.286) (xy -2.54 -2.286) (xy -3.302 -2.286) (xy -3.302 -1.524) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "LED_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "K" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:Q_PNP_BCE" + (pin_names + (offset 0) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "Q" + (at 5.08 1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Q_PNP_BCE" + (at 5.08 -1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 5.08 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "PNP transistor, base/collector/emitter" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "transistor PNP" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Q_PNP_BCE_0_1" + (polyline + (pts + (xy 0.635 0.635) (xy 2.54 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.635 -0.635) (xy 2.54 -2.54) (xy 2.54 -2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.635 1.905) (xy 0.635 -1.905) (xy 0.635 -1.905) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.286 -1.778) (xy 1.778 -2.286) (xy 1.27 -1.27) (xy 2.286 -1.778) (xy 2.286 -1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center 1.27 0) + (radius 2.8194) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Q_PNP_BCE_1_1" + (pin input line + (at -5.08 0 0) + (length 5.715) + (name "B" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 5.08 270) + (length 2.54) + (name "C" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 -5.08 90) + (length 2.54) + (name "E" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:R" + (pin_numbers hide) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "R" + (at 2.032 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "R" + (at 0 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at -1.778 0 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "R res resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "R_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "R_0_1" + (rectangle + (start -1.016 -2.54) + (end 1.016 2.54) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "R_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Diode:SD05_SOD323" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "D" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SD05_SOD323" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Diode_SMD:D_SOD-323" + (at 0 -5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.littelfuse.com/~/media/electronics/datasheets/tvs_diode_arrays/littelfuse_tvs_diode_array_sd_c_datasheet.pdf.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "5V, 450W Discrete Bidirectional TVS Diode, SOD-323" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "transient voltage suppressor thyrector transil" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "D?SOD?323*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "SD05_SOD323_0_1" + (polyline + (pts + (xy 1.27 0) (xy -1.27 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.54 -1.27) (xy 0 0) (xy -2.54 1.27) (xy -2.54 -1.27) + ) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.508 1.27) (xy 0 1.27) (xy 0 -1.27) (xy -0.508 -1.27) + ) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 1.27) (xy 2.54 -1.27) (xy 0 0) (xy 2.54 1.27) + ) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "SD05_SOD323_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "A1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "A2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Interface_USB:CH340N" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -7.62 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "CH340N" + (at 7.62 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Package_SO:SOP-8_3.9x4.9mm_P1.27mm" + (at -3.81 19.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://aitendo3.sakura.ne.jp/aitendo_data/product_img/ic/inteface/CH340N/ch340n.pdf" + (at -2.54 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "USB serial converter, 2Mbps, UART, SOP-8" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "USB UART Serial Converter Interface" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOP*3.9x4.9mm*P1.27mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "CH340N_0_1" + (rectangle + (start -7.62 5.08) + (end 7.62 -7.62) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "CH340N_1_1" + (pin bidirectional line + (at -10.16 -2.54 0) + (length 2.54) + (name "UD+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -10.16 -5.08 0) + (length 2.54) + (name "UD-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -10.16 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 10.16 -5.08 180) + (length 2.54) + (name "~{RTS}" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 7.62 270) + (length 2.54) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 10.16 2.54 180) + (length 2.54) + (name "TXD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 10.16 0 180) + (length 2.54) + (name "RXD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -10.16 2.54 0) + (length 2.54) + (name "V3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "LED:WS2812B" + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "D" + (at 5.08 5.715 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + ) + (property "Value" "WS2812B" + (at 1.27 -5.715 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + ) + ) + (property "Footprint" "LED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm" + (at 1.27 -7.62 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf" + (at 2.54 -9.525 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Description" "RGB LED with integrated controller" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "RGB LED NeoPixel addressable" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "LED*WS2812*PLCC*5.0x5.0mm*P3.2mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "WS2812B_0_0" + (text "RGB" + (at 2.286 -4.191 0) + (effects + (font + (size 0.762 0.762) + ) + ) + ) + ) + (symbol "WS2812B_0_1" + (polyline + (pts + (xy 1.27 -3.556) (xy 1.778 -3.556) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 -2.54) (xy 1.778 -2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 4.699 -3.556) (xy 2.667 -3.556) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.286 -2.54) (xy 1.27 -3.556) (xy 1.27 -3.048) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.286 -1.524) (xy 1.27 -2.54) (xy 1.27 -2.032) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 3.683 -1.016) (xy 3.683 -3.556) (xy 3.683 -4.064) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 4.699 -1.524) (xy 2.667 -1.524) (xy 3.683 -3.556) (xy 4.699 -1.524) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 5.08 5.08) + (end -5.08 -5.08) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "WS2812B_1_1" + (pin power_in line + (at 0 7.62 270) + (length 2.54) + (name "VDD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 7.62 0 180) + (length 2.54) + (name "DOUT" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "VSS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -7.62 0 0) + (length 2.54) + (name "DIN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "MCU_Espressif:ESP32-PICO-D4" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U2" + (at 5.4962 -48.26 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ESP32-PICO-D4" + (at 2.9562 -48.26 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_DFN_QFN:QFN-48-1EP_7x7mm_P0.5mm_EP5.3x5.3mm" + (at 31.75 -39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "RF Module, ESP32 SoC, Wi-Fi 802.11b/g/n, Bluetooth, BLE, 32-bit, 2.7-3.6V, external antenna, QFN-48" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "RF Radio BT ESP ESP32 Espressif external antenna" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "QFN*1EP*7x7mm*P0.5mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "ESP32-PICO-D4_0_0" + (pin power_in line + (at -5.08 40.64 270) + (length 2.54) + (name "VDDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 20.32 -25.4 180) + (length 2.54) + (name "IO34" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 20.32 -27.94 180) + (length 2.54) + (name "IO35" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 -20.32 180) + (length 2.54) + (name "IO32" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 -22.86 180) + (length 2.54) + (name "IO33" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 -12.7 180) + (length 2.54) + (name "IO25" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 -15.24 180) + (length 2.54) + (name "IO26" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 -17.78 180) + (length 2.54) + (name "IO27" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 5.08 180) + (length 2.54) + (name "IO14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 10.16 180) + (length 2.54) + (name "IO12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 40.64 270) + (length 2.54) + (name "VDD3P3_RTC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 35.56 180) + (length 2.54) + (name "LNA_IN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 7.62 180) + (length 2.54) + (name "IO13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "20" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 2.54 180) + (length 2.54) + (name "IO15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "21" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 25.4 180) + (length 2.54) + (name "IO2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "22" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 30.48 180) + (length 2.54) + (name "IO0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "23" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 20.32 180) + (length 2.54) + (name "IO4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "24" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -20.32 0 0) + (length 2.54) + (name "IO16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "25" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at 20.32 -33.02 180) + (length 2.54) + (name "VDD_SDIO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "26" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -20.32 -2.54 0) + (length 2.54) + (name "IO17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "27" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 15.24 180) + (length 2.54) + (name "SD2/IO9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "28" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 12.7 180) + (length 2.54) + (name "SD3/IO10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "29" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -2.54 40.64 270) + (length 2.54) + (name "VDDA3P3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -20.32 -12.7 0) + (length 2.54) + (name "CMD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "30" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -20.32 -10.16 0) + (length 2.54) + (name "CLK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "31" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -20.32 -5.08 0) + (length 2.54) + (name "SD0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "32" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -20.32 -7.62 0) + (length 2.54) + (name "SD1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "33" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 17.78 180) + (length 2.54) + (name "IO5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "34" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 0 180) + (length 2.54) + (name "IO18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "35" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 -10.16 180) + (length 2.54) + (name "IO23" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "36" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 2.54 40.64 270) + (length 2.54) + (name "VDD3P3_CPU" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "37" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 -2.54 180) + (length 2.54) + (name "IO19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "38" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 -7.62 180) + (length 2.54) + (name "IO22" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "39" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -2.54 40.64 270) + (length 2.54) hide + (name "VDDA3P3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 22.86 180) + (length 2.54) + (name "U0RXD/IO3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "40" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 27.94 180) + (length 2.54) + (name "U0TXD/IO1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "41" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 -5.08 180) + (length 2.54) + (name "IO21" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "42" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -7.62 40.64 270) + (length 2.54) + (name "VDDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "43" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -25.4 0) + (length 2.54) + (name "XTAL_N_NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "44" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -27.94 0) + (length 2.54) + (name "XTAL_P_NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "45" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 40.64 270) + (length 2.54) hide + (name "VDDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "46" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -30.48 0) + (length 2.54) + (name "CAP2_NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "47" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -33.02 0) + (length 2.54) + (name "CAP1_NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "48" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -40.64 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "49" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -20.32 30.48 0) + (length 2.54) + (name "SENSOR_VP" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -20.32 27.94 0) + (length 2.54) + (name "SENSOR_CAPP" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -20.32 25.4 0) + (length 2.54) + (name "SENSOR_CAPN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -20.32 22.86 0) + (length 2.54) + (name "SENSOR_VN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -20.32 35.56 0) + (length 2.54) + (name "EN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (symbol "ESP32-PICO-D4_0_1" + (rectangle + (start -17.78 38.1) + (end 17.78 -38.1) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + ) + (symbol "Memory_Flash:AT25SF081-SSHD-X" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -6.35 11.43 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AT25SF081-SSHD-X" + (at 11.43 11.43 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 0 -15.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.adestotech.com/wp-content/uploads/DS-AT25SF081_045.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "8-Mbit, 2.5V Minimum SPI Serial Flash Memory with Dual-I/O and Quad-I/O Support, SOIC-8" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "SPI DSPI QSPI 8Mbit 2.5V" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOIC?8*3.9x4.9mm*P1.27mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "AT25SF081-SSHD-X_0_1" + (rectangle + (start -7.62 10.16) + (end 7.62 -10.16) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "AT25SF081-SSHD-X_1_1" + (pin input line + (at -10.16 7.62 0) + (length 2.54) + (name "~{CS}" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -10.16 0 0) + (length 2.54) + (name "SO/IO1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -10.16 -2.54 0) + (length 2.54) + (name "~{WP}/IO2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -12.7 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -10.16 2.54 0) + (length 2.54) + (name "SI/IO0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 5.08 0) + (length 2.54) + (name "SCK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -10.16 -5.08 0) + (length 2.54) + (name "~{HOLD}/IO3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 12.7 270) + (length 2.54) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Regulator_Linear:AP1117-33" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -3.81 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AP1117-33" + (at 0 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_SMD:SOT-223-3_TabPin2" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.diodes.com/datasheets/AP1117.pdf" + (at 2.54 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "1A Low Dropout regulator, positive, 3.3V fixed output, SOT-223" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "linear regulator ldo fixed positive obsolete" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOT?223*TabPin2*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "AP1117-33_0_1" + (rectangle + (start -5.08 -5.08) + (end 5.08 1.905) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "AP1117-33_1_1" + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at 7.62 0 180) + (length 2.54) + (name "VO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -7.62 0 0) + (length 2.54) + (name "VI" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Switch:SW_Push" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "SW" + (at 1.27 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "SW_Push" + (at 0 -1.524 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Push button switch, generic, two pins" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "switch normally-open pushbutton push-button" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "SW_Push_0_1" + (circle + (center -2.032 0) + (radius 0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 1.27) (xy 0 3.048) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 1.27) (xy -2.54 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 2.032 0) + (radius 0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 2.54) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 0 180) + (length 2.54) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Timer_RTC:DS1302Z+" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -8.89 8.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "DS1302Z+" + (at 6.35 8.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 0 -12.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://datasheets.maximintegrated.com/en/ds/DS1302.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Trickle-Charge Timekeeping Chip, 2.0V to 5.5V VCC, 0°C to +70°C, SOIC-8" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "RTC, Trickle-Charge Timekeeping Chip" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOIC*3.9x4.9mm?P1.27mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "DS1302Z+_1_1" + (rectangle + (start -10.16 7.62) + (end 10.16 -7.62) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (pin power_in line + (at -2.54 10.16 270) + (length 2.54) + (name "VCC2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 -2.54 0) + (length 2.54) + (name "X1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 -5.08 0) + (length 2.54) + (name "X2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -10.16 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 2.54 0) + (length 2.54) + (name "CE" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 12.7 5.08 180) + (length 2.54) + (name "I/O" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 5.08 0) + (length 2.54) + (name "SCLK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 10.16 270) + (length 2.54) + (name "VCC1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "power:+3.3V" + (power) + (pin_numbers hide) + (pin_names + (offset 0) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3.3V" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3.3V\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+3.3V_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+3.3V_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "power:+5V" + (power) + (pin_numbers hide) + (pin_names + (offset 0) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+5V\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+5V_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+5V_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "power:GND" + (power) + (pin_numbers hide) + (pin_names + (offset 0) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "GND_0_1" + (polyline + (pts + (xy 0 0) (xy 0 -1.27) (xy 1.27 -1.27) (xy 0 -2.54) (xy -1.27 -1.27) (xy 0 -1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "GND_1_1" + (pin power_in line + (at 0 0 270) + (length 0) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + ) + (junction + (at 74.93 -20.32) + (diameter 0) + (color 0 0 0 0) + (uuid "01477993-b686-4c90-befa-ed554d164908") + ) + (junction + (at 300.99 -11.43) + (diameter 0) + (color 0 0 0 0) + (uuid "04617865-d17f-4fd4-a8c7-c2f1bb05447e") + ) + (junction + (at 38.1 -21.59) + (diameter 0) + (color 0 0 0 0) + (uuid "06dc321b-c223-42bc-a331-0a0622f03933") + ) + (junction + (at 57.15 -41.91) + (diameter 0) + (color 0 0 0 0) + (uuid "0833f4fe-98fe-461f-90ad-272447c0ec08") + ) + (junction + (at 33.02 20.32) + (diameter 0) + (color 0 0 0 0) + (uuid "0b0a2f22-3a7e-442e-855a-2e2a57ff5655") + ) + (junction + (at 193.04 -41.91) + (diameter 0) + (color 0 0 0 0) + (uuid "0f24255f-287d-4081-98e0-ca6007704fc7") + ) + (junction + (at 231.14 153.67) + (diameter 0) + (color 0 0 0 0) + (uuid "1703634d-df53-4ddc-9d3e-62f4b42df660") + ) + (junction + (at 107.95 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "1867e66c-66fa-42d1-891d-a14fac13b60e") + ) + (junction + (at 88.9 20.32) + (diameter 0) + (color 0 0 0 0) + (uuid "1c79ff08-a34c-4730-8121-505c481f0aa1") + ) + (junction + (at 74.93 -41.91) + (diameter 0) + (color 0 0 0 0) + (uuid "1df3d94e-376e-4c91-ba19-43a00e41feb1") + ) + (junction + (at 35.56 21.59) + (diameter 0) + (color 0 0 0 0) + (uuid "1f8e480d-6782-4c9f-af5d-e6e79b0f426a") + ) + (junction + (at 146.05 48.26) + (diameter 0) + (color 0 0 0 0) + (uuid "211dc8ee-61cb-4ad5-97f7-d68beb8c067a") + ) + (junction + (at 179.07 50.8) + (diameter 0) + (color 0 0 0 0) + (uuid "229fef88-1f21-4c49-bb17-49761a7f55dc") + ) + (junction + (at 170.18 48.26) + (diameter 0) + (color 0 0 0 0) + (uuid "22befa02-7921-42d3-ad7d-83122b1f39e1") + ) + (junction + (at 72.39 21.59) + (diameter 0) + (color 0 0 0 0) + (uuid "23b1a97a-e754-44c0-a2f2-61ad067188bb") + ) + (junction + (at 226.06 132.08) + (diameter 0) + (color 0 0 0 0) + (uuid "24d0690f-d898-42e7-bd7c-16b1e62b1675") + ) + (junction + (at 194.31 -20.32) + (diameter 0) + (color 0 0 0 0) + (uuid "2708329f-1645-4655-9e56-5b836e2303a5") + ) + (junction + (at 233.68 132.08) + (diameter 0) + (color 0 0 0 0) + (uuid "27503d22-c92c-41aa-975c-fc299f7917a7") + ) + (junction + (at 57.15 -22.86) + (diameter 0) + (color 0 0 0 0) + (uuid "277de4d3-e5cd-4030-b0e3-d0dc67a3580c") + ) + (junction + (at 146.05 50.8) + (diameter 0) + (color 0 0 0 0) + (uuid "2e7e9017-5ce0-40e0-9e10-b6f7a93035d4") + ) + (junction + (at 146.05 53.34) + (diameter 0) + (color 0 0 0 0) + (uuid "2f69948d-46f3-48b9-8435-9051b2fc51b4") + ) + (junction + (at 43.18 85.09) + (diameter 0) + (color 0 0 0 0) + (uuid "372f21fa-a8f2-44b0-9191-4812c0b57685") + ) + (junction + (at 69.85 22.86) + (diameter 0) + (color 0 0 0 0) + (uuid "37971307-4b6d-4a45-bb46-b18f9acf7b86") + ) + (junction + (at 100.33 22.86) + (diameter 0) + (color 0 0 0 0) + (uuid "3f236726-cd46-4a15-8bf7-83ea881e55aa") + ) + (junction + (at 275.59 35.56) + (diameter 0) + (color 0 0 0 0) + (uuid "3f9ca63b-b660-4559-be5f-e7a691545b33") + ) + (junction + (at 224.79 132.08) + (diameter 0) + (color 0 0 0 0) + (uuid "44ee05e2-dd11-4fae-be99-88a4331a57ed") + ) + (junction + (at 90.17 -24.13) + (diameter 0) + (color 0 0 0 0) + (uuid "455001f2-0bb1-4c45-85e6-148ddac580ce") + ) + (junction + (at 245.11 77.47) + (diameter 0) + (color 0 0 0 0) + (uuid "4c1bfc53-6735-4304-9dd7-cd8f5506dca2") + ) + (junction + (at 257.81 132.08) + (diameter 0) + (color 0 0 0 0) + (uuid "4c3d7b62-a019-46b6-8153-4d6d2bbe342f") + ) + (junction + (at 213.36 142.24) + (diameter 0) + (color 0 0 0 0) + (uuid "4eb78015-89b7-4592-883e-642831cd4076") + ) + (junction + (at 31.75 17.78) + (diameter 0) + (color 0 0 0 0) + (uuid "4f4420b7-1afd-4a8d-a206-fb894dfa8e48") + ) + (junction + (at 107.95 -41.91) + (diameter 0) + (color 0 0 0 0) + (uuid "4f5a63db-5310-48ab-a8a4-0504803c74ab") + ) + (junction + (at 260.35 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "51e1cb43-7ee4-4f9c-bcb0-d094e10456a4") + ) + (junction + (at 252.73 30.48) + (diameter 0) + (color 0 0 0 0) + (uuid "538bcaf3-aa4d-4ebd-a7d0-e4bcef11500a") + ) + (junction + (at 38.1 -41.91) + (diameter 0) + (color 0 0 0 0) + (uuid "539250ee-2a5a-4d99-aadf-203469c71c13") + ) + (junction + (at 86.36 85.09) + (diameter 0) + (color 0 0 0 0) + (uuid "5545040e-4f1a-4fd4-9fbd-b79ce785bf21") + ) + (junction + (at 129.54 85.09) + (diameter 0) + (color 0 0 0 0) + (uuid "55cf1e59-6d51-4c9b-a613-7fc0498f1f01") + ) + (junction + (at 300.99 50.8) + (diameter 0) + (color 0 0 0 0) + (uuid "58b725b6-96d3-454d-b102-feea428b853c") + ) + (junction + (at 267.97 132.08) + (diameter 0) + (color 0 0 0 0) + (uuid "5e73e5a6-5801-48c6-bfc3-6a69b4aee236") + ) + (junction + (at 184.15 71.12) + (diameter 0) + (color 0 0 0 0) + (uuid "61894be7-66fe-45da-baa9-19d68c2637dc") + ) + (junction + (at 228.6 -17.78) + (diameter 0) + (color 0 0 0 0) + (uuid "62252251-a50c-4804-b4d5-3ee5071517d0") + ) + (junction + (at 223.52 -20.32) + (diameter 0) + (color 0 0 0 0) + (uuid "646970ee-9da3-4b63-9a1a-5a2eb2b1eb0e") + ) + (junction + (at 87.63 21.59) + (diameter 0) + (color 0 0 0 0) + (uuid "65e1f0cc-6c99-4b3e-ba33-d36c8be74006") + ) + (junction + (at 64.77 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "7270db2e-003f-400c-a802-db1d39fd23dd") + ) + (junction + (at 54.61 22.86) + (diameter 0) + (color 0 0 0 0) + (uuid "78169b46-aeb5-4de5-8821-090b370dd66f") + ) + (junction + (at 226.06 125.73) + (diameter 0) + (color 0 0 0 0) + (uuid "791fdcc1-f17e-4ac7-b79b-2a8011deb8ed") + ) + (junction + (at 300.99 63.5) + (diameter 0) + (color 0 0 0 0) + (uuid "7a716731-c661-4954-884f-451d751c0eab") + ) + (junction + (at 215.9 73.66) + (diameter 0) + (color 0 0 0 0) + (uuid "7b48e269-88f9-444e-b75f-044f41a0b857") + ) + (junction + (at 71.12 17.78) + (diameter 0) + (color 0 0 0 0) + (uuid "7bb88885-09c8-41a5-8a71-a4563637e62a") + ) + (junction + (at 252.73 132.08) + (diameter 0) + (color 0 0 0 0) + (uuid "7eb5e163-9389-4a66-9360-b318adc580bb") + ) + (junction + (at 67.31 -62.23) + (diameter 0) + (color 0 0 0 0) + (uuid "7f4bf395-4a6e-4e9f-9247-12b6cb8fb4bd") + ) + (junction + (at 255.27 132.08) + (diameter 0) + (color 0 0 0 0) + (uuid "831d7a26-59fc-49bc-8669-1e508c8d730d") + ) + (junction + (at 240.03 147.32) + (diameter 0) + (color 0 0 0 0) + (uuid "877bca80-0286-4c88-a406-93fe66f2fde3") + ) + (junction + (at 251.46 132.08) + (diameter 0) + (color 0 0 0 0) + (uuid "89d7940a-b333-4f2e-8f8a-fc364bbc1c8c") + ) + (junction + (at 55.88 21.59) + (diameter 0) + (color 0 0 0 0) + (uuid "8a3f763c-f570-4b77-aceb-edde2fecf2c6") + ) + (junction + (at 158.75 48.26) + (diameter 0) + (color 0 0 0 0) + (uuid "8bcbaeeb-0a3f-4679-9bca-908939a1624f") + ) + (junction + (at 179.07 48.26) + (diameter 0) + (color 0 0 0 0) + (uuid "8e3a2a08-a257-4a4c-aa26-b17aa3da5c9d") + ) + (junction + (at 87.63 -41.91) + (diameter 0) + (color 0 0 0 0) + (uuid "965db221-d925-4256-9a4a-2e8f33ceae98") + ) + (junction + (at 104.14 20.32) + (diameter 0) + (color 0 0 0 0) + (uuid "98df331d-7eae-4939-bfeb-fd46be992339") + ) + (junction + (at 255.27 105.41) + (diameter 0) + (color 0 0 0 0) + (uuid "9d592eab-cff6-4045-b3fc-f4a46051c473") + ) + (junction + (at 64.77 85.09) + (diameter 0) + (color 0 0 0 0) + (uuid "9f3bd539-a1d0-44b0-bbfd-5c3b872bedbd") + ) + (junction + (at 261.62 -40.64) + (diameter 0) + (color 0 0 0 0) + (uuid "a1e659c0-aec0-45f1-9f0d-09164aca2ae4") + ) + (junction + (at 129.54 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "a380d9b6-74c7-4584-bd7b-55870acb9123") + ) + (junction + (at 227.33 132.08) + (diameter 0) + (color 0 0 0 0) + (uuid "a61eab26-6332-48c7-b82e-57ee0e23e77d") + ) + (junction + (at 50.8 17.78) + (diameter 0) + (color 0 0 0 0) + (uuid "a92cf3d7-40ba-484c-b079-62d2e1e65c53") + ) + (junction + (at 107.95 85.09) + (diameter 0) + (color 0 0 0 0) + (uuid "a9c09045-b3cb-4b41-8b96-be5b095a9b7a") + ) + (junction + (at 241.3 -20.32) + (diameter 0) + (color 0 0 0 0) + (uuid "abf05e16-889a-4e38-a402-3d1e6d4ac359") + ) + (junction + (at 102.87 17.78) + (diameter 0) + (color 0 0 0 0) + (uuid "aca37da6-e07f-433f-bafd-e2a6a1b5b14f") + ) + (junction + (at 85.09 -62.23) + (diameter 0) + (color 0 0 0 0) + (uuid "ad012640-adb8-493a-a494-1e3910b2d713") + ) + (junction + (at 35.56 17.78) + (diameter 0) + (color 0 0 0 0) + (uuid "b0f846de-a6bf-45ed-8ba9-4317ff1f2450") + ) + (junction + (at 198.12 132.08) + (diameter 0) + (color 0 0 0 0) + (uuid "b2f1aa7e-a4d4-4699-8048-d5d0fd2182ee") + ) + (junction + (at 21.59 -21.59) + (diameter 0) + (color 0 0 0 0) + (uuid "b47ca4d4-9bae-4bdc-afe3-56c8f8f6ff34") + ) + (junction + (at 179.07 53.34) + (diameter 0) + (color 0 0 0 0) + (uuid "b5439f43-50f2-4f07-99de-5d0831e75ae1") + ) + (junction + (at 107.95 0) + (diameter 0) + (color 0 0 0 0) + (uuid "b616ac36-113b-4de9-b7b3-1d1f2b931029") + ) + (junction + (at 232.41 111.76) + (diameter 0) + (color 0 0 0 0) + (uuid "b8e89827-9e52-411d-9bb4-db2aca4dec8e") + ) + (junction + (at 34.29 -62.23) + (diameter 0) + (color 0 0 0 0) + (uuid "b8f4bb9a-71ed-4e1e-8620-98dda564a7e1") + ) + (junction + (at 83.82 22.86) + (diameter 0) + (color 0 0 0 0) + (uuid "ba09bdc0-825b-4358-98c7-cdd3e026c9db") + ) + (junction + (at 234.95 111.76) + (diameter 0) + (color 0 0 0 0) + (uuid "bd7f889d-0dd9-49f4-a47d-448748cd2b23") + ) + (junction + (at 157.48 50.8) + (diameter 0) + (color 0 0 0 0) + (uuid "bf5afff3-f6c2-48b5-9d9d-ad6e41492f5e") + ) + (junction + (at 233.68 111.76) + (diameter 0) + (color 0 0 0 0) + (uuid "bff2146c-010f-4a58-b04d-235d0c6a1075") + ) + (junction + (at 57.15 95.25) + (diameter 0) + (color 0 0 0 0) + (uuid "c116691b-9bfd-4f1a-abda-5fcf1e24db52") + ) + (junction + (at 194.31 0) + (diameter 0) + (color 0 0 0 0) + (uuid "c4824e1d-8582-4458-88e3-23283b178076") + ) + (junction + (at 105.41 21.59) + (diameter 0) + (color 0 0 0 0) + (uuid "cb5507de-4a01-4db1-a911-c4c33c83b44c") + ) + (junction + (at 213.36 149.86) + (diameter 0) + (color 0 0 0 0) + (uuid "ccb58bf1-e857-4d2d-9929-5fef95a5b717") + ) + (junction + (at 251.46 -25.4) + (diameter 0) + (color 0 0 0 0) + (uuid "cd18fd1d-ec07-4ae9-ac14-45a3ae3d4949") + ) + (junction + (at 86.36 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "ce3ddda4-f78b-40fe-8508-ebe6179842b4") + ) + (junction + (at 160.02 80.01) + (diameter 0) + (color 0 0 0 0) + (uuid "ce87fe1e-c94b-45c6-980b-ffe20669c31f") + ) + (junction + (at 233.68 125.73) + (diameter 0) + (color 0 0 0 0) + (uuid "d3533a16-e560-4ce6-b182-3341927c7de1") + ) + (junction + (at 43.18 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "d3e97509-24e2-4ffc-ab5f-7ebe58940a6f") + ) + (junction + (at 52.07 20.32) + (diameter 0) + (color 0 0 0 0) + (uuid "d5abc979-caa7-4704-b396-1b9bbd28a1c3") + ) + (junction + (at 157.48 80.01) + (diameter 0) + (color 0 0 0 0) + (uuid "d7a85a9b-10bf-41c6-aff0-4db2fa501f4c") + ) + (junction + (at 240.03 142.24) + (diameter 0) + (color 0 0 0 0) + (uuid "dbab17fc-56c2-49c2-b14b-058213a4e8f8") + ) + (junction + (at 229.87 132.08) + (diameter 0) + (color 0 0 0 0) + (uuid "dc8de11f-6806-4902-89fe-4227e9bfd1c0") + ) + (junction + (at 300.99 -20.32) + (diameter 0) + (color 0 0 0 0) + (uuid "dde4180a-8997-4214-aa68-ed5c8b67fd33") + ) + (junction + (at 73.66 20.32) + (diameter 0) + (color 0 0 0 0) + (uuid "df526ada-0aa5-483a-b46f-804bd8db8cac") + ) + (junction + (at 161.29 80.01) + (diameter 0) + (color 0 0 0 0) + (uuid "df5b0305-1a12-430d-af35-9d1403863c66") + ) + (junction + (at 238.76 111.76) + (diameter 0) + (color 0 0 0 0) + (uuid "dffb1895-5cd3-49f2-833e-344d67309ab9") + ) + (junction + (at 300.99 78.74) + (diameter 0) + (color 0 0 0 0) + (uuid "e06880eb-c543-4d6a-9c56-b0846bbb85a6") + ) + (junction + (at 264.16 132.08) + (diameter 0) + (color 0 0 0 0) + (uuid "e19625ad-a59a-4e5f-b347-59dd7ab3b65d") + ) + (junction + (at 236.22 111.76) + (diameter 0) + (color 0 0 0 0) + (uuid "e66b99f7-a4f3-49f0-ab5d-efb542065adc") + ) + (junction + (at 193.04 -20.32) + (diameter 0) + (color 0 0 0 0) + (uuid "e6812ba0-a451-4afd-85c4-e7930e0a2e69") + ) + (junction + (at 236.22 -17.78) + (diameter 0) + (color 0 0 0 0) + (uuid "e73e7f9a-17ca-4a19-8168-be0e3cda50c1") + ) + (junction + (at 68.58 -62.23) + (diameter 0) + (color 0 0 0 0) + (uuid "e7b968db-383a-40d4-b40e-5ce1d50f5dc7") + ) + (junction + (at 200.66 -25.4) + (diameter 0) + (color 0 0 0 0) + (uuid "e9450a9d-412d-4fd2-a076-0832f7d8fa10") + ) + (junction + (at 54.61 -62.23) + (diameter 0) + (color 0 0 0 0) + (uuid "edb2aa63-d818-4c27-9baf-b0b89cbdddd6") + ) + (junction + (at 187.96 110.49) + (diameter 0) + (color 0 0 0 0) + (uuid "ee53ee0d-a0fc-41d5-8fdc-45b2ad8f4438") + ) + (junction + (at 107.95 -24.13) + (diameter 0) + (color 0 0 0 0) + (uuid "ef187bc0-54f0-4516-8735-ee24a089c89c") + ) + (junction + (at 300.99 40.64) + (diameter 0) + (color 0 0 0 0) + (uuid "f063b6f2-681d-4fe0-b3d4-d252c19b41b9") + ) + (junction + (at 175.26 87.63) + (diameter 0) + (color 0 0 0 0) + (uuid "f42c5803-f205-483e-ab8d-7811aacc9d98") + ) + (junction + (at 86.36 17.78) + (diameter 0) + (color 0 0 0 0) + (uuid "f4914598-f773-4db1-b9b9-b1b814aeab36") + ) + (junction + (at 34.29 22.86) + (diameter 0) + (color 0 0 0 0) + (uuid "f6a35b0e-1138-4c40-8452-35662009729c") + ) + (junction + (at 176.53 55.88) + (diameter 0) + (color 0 0 0 0) + (uuid "fb3c31f3-89ee-4253-9149-0e0f7a418af5") + ) + (wire + (pts + (xy 245.11 68.58) (xy 245.11 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "010a6bde-42fe-47f2-a582-22a894c8e197") + ) + (wire + (pts + (xy 219.71 -25.4) (xy 224.79 -25.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "04039d7f-b75e-4a0d-8e09-6dbe9e0648f4") + ) + (wire + (pts + (xy 43.18 85.09) (xy 64.77 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "041fe72f-cbd5-498b-a4e6-10245435eef7") + ) + (wire + (pts + (xy 251.46 -25.4) (xy 251.46 -69.85) + ) + (stroke + (width 0) + (type default) + ) + (uuid "04a3d203-7f97-42b2-8a44-b45522adfc2b") + ) + (wire + (pts + (xy 57.15 -17.78) (xy 54.61 -17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0560cd43-20a1-4478-b017-0bd99c51c99e") + ) + (wire + (pts + (xy 279.4 173.99) (xy 279.4 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "06546012-3503-4727-9374-f18280b7dc71") + ) + (wire + (pts + (xy 19.05 -8.89) (xy 19.05 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0720b097-3596-4ee0-b99f-a74f1013f087") + ) + (wire + (pts + (xy 207.01 149.86) (xy 213.36 149.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0782aa37-7be5-4bd1-b4c5-0afcb55b2784") + ) + (wire + (pts + (xy 86.36 85.09) (xy 107.95 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "08172a4b-c84c-4e1e-9db6-84a393ea74a4") + ) + (wire + (pts + (xy 292.1 40.64) (xy 300.99 40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "09f64126-bd22-4c30-9e7d-d14325b3d45c") + ) + (wire + (pts + (xy 25.4 -6.35) (xy 25.4 -21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0a085435-73cc-4072-8188-057835423cd0") + ) + (wire + (pts + (xy 279.4 19.05) (xy 279.4 114.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0b02a1c6-55a2-435d-a6a9-2307b2b4552a") + ) + (wire + (pts + (xy 148.59 102.87) (xy 129.54 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0c822039-6bee-4b23-8682-2a6ca07795cc") + ) + (wire + (pts + (xy 196.85 19.05) (xy 196.85 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0da308c2-94db-4429-8900-e38dfd092a69") + ) + (wire + (pts + (xy 261.62 -40.64) (xy 300.99 -40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0f78c1f4-fda7-4c32-b399-ae559143ae44") + ) + (wire + (pts + (xy 184.15 72.39) (xy 184.15 71.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0facb8f5-8038-4ea2-86cd-6b63d4cb7d03") + ) + (wire + (pts + (xy 265.43 78.74) (xy 300.99 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1239ddfa-ae6d-47c6-8ac5-3188ea7eda91") + ) + (wire + (pts + (xy 57.15 -15.24) (xy 55.88 -15.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1248f509-f54b-420b-8aba-e08211f3044a") + ) + (wire + (pts + (xy 214.63 7.62) (xy 21.59 7.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "12e614ca-adab-44e9-849a-268a115f529e") + ) + (wire + (pts + (xy 222.25 71.12) (xy 222.25 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "12f1091b-b857-4c4f-95e9-6dcf3f3cd372") + ) + (wire + (pts + (xy 54.61 -62.23) (xy 67.31 -62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "13aa9f84-436d-4d47-976b-75661e8b8759") + ) + (wire + (pts + (xy 57.15 -22.86) (xy 57.15 -41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "14f467ed-69f5-4dc3-9a75-38940efa01e4") + ) + (wire + (pts + (xy 243.84 139.7) (xy 243.84 142.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "15724517-c0dd-4182-a51e-b970e4c84bad") + ) + (wire + (pts + (xy 220.98 87.63) (xy 275.59 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "17134359-ee6f-4284-bf89-deb471ed3b06") + ) + (wire + (pts + (xy 140.97 29.21) (xy 140.97 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "17c39c2c-6b2f-45d4-a648-5ef0bfe6c80a") + ) + (wire + (pts + (xy 115.57 95.25) (xy 121.92 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "19aee368-8445-41be-98ef-c429d057f51c") + ) + (wire + (pts + (xy 86.36 102.87) (xy 64.77 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1a3b68ab-c89e-43c6-8951-68654b56cc4d") + ) + (wire + (pts + (xy 52.07 20.32) (xy 73.66 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c688c9d-a029-4938-905b-3d9d6f54d90a") + ) + (wire + (pts + (xy 226.06 125.73) (xy 226.06 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1ce273d3-8811-4cba-ad82-7c1b6eb688a6") + ) + (wire + (pts + (xy 224.79 73.66) (xy 215.9 73.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1d77831b-b06e-4509-9cde-d71860080eb6") + ) + (wire + (pts + (xy 167.64 87.63) (xy 167.64 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1d8ddd40-a601-48ab-b7f4-54561f486570") + ) + (wire + (pts + (xy 21.59 -6.35) (xy 25.4 -6.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1e82c688-c208-4383-b1c6-b7e83e0d7c22") + ) + (wire + (pts + (xy 68.58 -62.23) (xy 85.09 -62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1f2bb69e-e96b-4f4d-9601-1681be7c093d") + ) + (wire + (pts + (xy 87.63 -24.13) (xy 90.17 -24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "22269bf7-0b11-451b-bc09-aa91ed3093cd") + ) + (wire + (pts + (xy 175.26 80.01) (xy 175.26 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "223f4b96-49c4-4f80-9f55-18909bf87efd") + ) + (wire + (pts + (xy 74.93 -5.08) (xy 78.74 -5.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "22548990-41ce-4cae-a20b-d9f2ac06022f") + ) + (wire + (pts + (xy 107.95 -11.43) (xy 104.14 -11.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "22baeee4-83a0-4bc8-a373-3a29994c35a0") + ) + (wire + (pts + (xy 236.22 111.76) (xy 238.76 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "243f1161-5430-4265-a63b-efcd29f0f622") + ) + (wire + (pts + (xy 175.26 87.63) (xy 195.58 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "254b33f7-7484-4796-ab9b-0426377f790c") + ) + (wire + (pts + (xy 176.53 55.88) (xy 179.07 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "259251af-4cfe-49a6-a3d9-8825467ed1fa") + ) + (wire + (pts + (xy 238.76 102.87) (xy 238.76 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "27a80228-866c-4629-899d-960debf5bdab") + ) + (wire + (pts + (xy 223.52 80.01) (xy 232.41 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "28387685-6cf3-4d81-9eb8-cbefea057b90") + ) + (wire + (pts + (xy 209.55 2.54) (xy 36.83 2.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "291a3ee3-06ed-4bca-97ce-54413f3634e4") + ) + (wire + (pts + (xy 100.33 -19.05) (xy 100.33 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2984fc40-61bf-4c0d-a40a-ec14e53eb24a") + ) + (wire + (pts + (xy 170.18 48.26) (xy 170.18 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2ac2a330-68ab-450b-8a49-1018fd1bda4c") + ) + (wire + (pts + (xy 184.15 71.12) (xy 175.26 71.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2bde3143-ccb3-431c-bd71-0cd0737aeab8") + ) + (wire + (pts + (xy 21.59 85.09) (xy 43.18 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2c03a01f-15d5-4449-a27e-b41f16796924") + ) + (wire + (pts + (xy 237.49 0) (xy 194.31 0) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2cc166ca-c549-4130-beeb-75c1c827a918") + ) + (wire + (pts + (xy 180.34 132.08) (xy 198.12 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2d7e4a55-b69c-41ad-81dd-489ab48fea60") + ) + (wire + (pts + (xy 255.27 110.49) (xy 255.27 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2eafd55e-17ee-448c-88cf-8ae98fbe5174") + ) + (wire + (pts + (xy 213.36 76.2) (xy 213.36 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2f60664e-eccd-4edf-96f4-565967e476e5") + ) + (wire + (pts + (xy 215.9 73.66) (xy 208.28 73.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2fa5197d-903e-42fd-8e69-493ca21fae7c") + ) + (wire + (pts + (xy 57.15 -10.16) (xy 52.07 -10.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "30522895-8787-49ea-be5f-68da45ff410c") + ) + (wire + (pts + (xy 261.62 -40.64) (xy 261.62 -33.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3069ff42-5e9a-4b89-ad9f-93c592aa1ca9") + ) + (wire + (pts + (xy 229.87 -24.13) (xy 228.6 -24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "30e2c69f-c2e4-456f-bd0e-3f3ce7556c5a") + ) + (wire + (pts + (xy 300.99 40.64) (xy 300.99 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "30ff23bc-b3e4-46f0-bead-0fc991ef3e23") + ) + (wire + (pts + (xy 17.78 -19.05) (xy 17.78 -62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3210181d-3360-4221-841f-475d36451520") + ) + (wire + (pts + (xy 90.17 -21.59) (xy 85.09 -21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "327a2e9c-c912-4acd-a6f5-d00be8bfeec6") + ) + (wire + (pts + (xy 87.63 -41.91) (xy 87.63 -24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "33226bea-922f-4797-b5a3-59a4e19e412f") + ) + (wire + (pts + (xy 194.31 110.49) (xy 210.82 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "33fedacd-46f2-4dee-bea9-29073bf6fd6f") + ) + (wire + (pts + (xy 73.66 -7.62) (xy 73.66 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "34881d84-03cc-43b1-95b7-a0622440a7fe") + ) + (wire + (pts + (xy 207.01 140.97) (xy 207.01 149.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "34d786b4-4915-4da1-a952-4cd1d5476a54") + ) + (wire + (pts + (xy 267.97 106.68) (xy 267.97 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "354ed543-94db-4942-9260-9b34d4d61fa5") + ) + (wire + (pts + (xy 232.41 -24.13) (xy 236.22 -24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "35bf65fb-e0d3-45e9-9464-36914b17c7e7") + ) + (wire + (pts + (xy 199.39 29.21) (xy 140.97 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "35e433b5-8790-464e-958d-4ccfc07685f5") + ) + (wire + (pts + (xy 180.34 110.49) (xy 180.34 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "368126f5-b4d1-4a17-a27a-4541aa9bb2d9") + ) + (wire + (pts + (xy 16.51 -11.43) (xy 16.51 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "369951b1-9697-4986-aa96-507a34bd0bf9") + ) + (wire + (pts + (xy 213.36 -41.91) (xy 213.36 -38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "37c5eb31-0c4e-4f7a-896c-199eadcb0b3c") + ) + (wire + (pts + (xy 146.05 46.99) (xy 146.05 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "37ccb56c-c97f-4e84-af60-b25a29843bd8") + ) + (wire + (pts + (xy 240.03 119.38) (xy 257.81 119.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "38100ad7-5c68-4f42-a8cc-055b1c831c27") + ) + (wire + (pts + (xy 140.97 66.04) (xy 138.43 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "38bdf451-7bb3-431e-a0c9-857407610205") + ) + (wire + (pts + (xy 275.59 35.56) (xy 292.1 35.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "38ee1bf0-4608-453a-b521-99132ca0ff82") + ) + (wire + (pts + (xy 190.5 110.49) (xy 187.96 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "39ec0bd1-7e5f-42a9-99ba-d175b1613687") + ) + (wire + (pts + (xy 217.17 -38.1) (xy 213.36 -38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3c982349-a2f4-4512-883d-e0a10a440af4") + ) + (wire + (pts + (xy 78.74 -5.08) (xy 78.74 -20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3d185a6e-38b2-49f4-9f8f-7fc93593772e") + ) + (wire + (pts + (xy 67.31 -62.23) (xy 68.58 -62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3e06bc57-3f66-410f-aec6-e3252e551c25") + ) + (wire + (pts + (xy 232.41 71.12) (xy 232.41 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3e43a3cc-e353-46e6-90c9-c194a6e84344") + ) + (wire + (pts + (xy 182.88 91.44) (xy 182.88 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f1d1a31-d37d-4afc-9502-be910cefa698") + ) + (wire + (pts + (xy 300.99 78.74) (xy 300.99 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f6704c0-ae8e-4617-bbf6-ee2a43931903") + ) + (wire + (pts + (xy 38.1 -13.97) (xy 35.56 -13.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3fa03afe-7959-4c74-b9d1-3be8cb662cba") + ) + (wire + (pts + (xy 257.81 132.08) (xy 257.81 147.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "41205ffd-2c27-49d6-a235-dbe3ad998a91") + ) + (wire + (pts + (xy 52.07 -10.16) (xy 52.07 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "415b2641-50a1-4aa0-9eb9-58d24da2d6a2") + ) + (wire + (pts + (xy 226.06 132.08) (xy 227.33 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4167cae7-1f9f-4519-960b-e3e4efe1e2a6") + ) + (wire + (pts + (xy 129.54 80.01) (xy 129.54 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "437737b8-a76e-479e-a5d8-31df36bb3b61") + ) + (wire + (pts + (xy 194.31 -20.32) (xy 223.52 -20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4385e3c3-d570-40ca-b950-275b5b54929b") + ) + (wire + (pts + (xy 55.88 -15.24) (xy 55.88 21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "45490c5c-4a50-4673-8239-147b3b04c334") + ) + (wire + (pts + (xy 209.55 -25.4) (xy 200.66 -25.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "45525238-dbd6-420e-82c2-a9542eea4293") + ) + (wire + (pts + (xy 137.16 13.97) (xy 201.93 13.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "457bbe03-5e18-483d-8b71-ebb84b4723cd") + ) + (wire + (pts + (xy 240.03 77.47) (xy 245.11 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "45ce62fd-9ac5-4558-a266-d224751c2ea8") + ) + (wire + (pts + (xy 107.95 -21.59) (xy 100.33 -21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "467732d4-7404-4d15-9581-e5d663ef62da") + ) + (wire + (pts + (xy 71.12 -10.16) (xy 71.12 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "46827785-68e0-4ef0-9e5d-6af5473d7fc5") + ) + (wire + (pts + (xy 236.22 -24.13) (xy 236.22 -17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "46e7fd6e-88b2-4093-a5b6-3edd8540329b") + ) + (wire + (pts + (xy 130.81 43.18) (xy 130.81 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "46fd7328-a50b-4cb7-abfb-6f4e6a924f54") + ) + (wire + (pts + (xy 252.73 113.03) (xy 252.73 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "47219aae-ff49-41cc-8815-6c347a417ba5") + ) + (wire + (pts + (xy 157.48 50.8) (xy 179.07 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "474664c4-6e78-4d33-ba8b-2f9369adc013") + ) + (wire + (pts + (xy 267.97 124.46) (xy 267.97 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "47875751-9c9b-4119-a67e-a0b51dfb245c") + ) + (wire + (pts + (xy 213.36 142.24) (xy 215.9 142.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "48434ac0-0147-41f4-a603-61b03981b5d0") + ) + (wire + (pts + (xy 255.27 105.41) (xy 248.92 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "485515a6-22bb-45fa-a8b6-b0d720a82f69") + ) + (wire + (pts + (xy 93.98 95.25) (xy 100.33 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "48e67fb4-44ae-4258-b3ef-e1f679a736e8") + ) + (wire + (pts + (xy 68.58 -62.23) (xy 68.58 -60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4a2bbba3-5f83-4f5e-a595-3df01688365e") + ) + (wire + (pts + (xy 170.18 76.2) (xy 160.02 76.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4a641183-549f-464d-a557-4a339fb8b425") + ) + (wire + (pts + (xy 107.95 0) (xy 74.93 0) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4af87f9d-60f7-4b84-b6b0-4a50914c54ec") + ) + (wire + (pts + (xy 19.05 20.32) (xy 33.02 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4befb730-7d59-4b28-851b-bce2746ad5ef") + ) + (wire + (pts + (xy 179.07 58.42) (xy 176.53 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4c3d53e5-4718-4c32-9f9a-4d8c96cf5801") + ) + (wire + (pts + (xy 215.9 26.67) (xy 222.25 26.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4c4309f2-507e-4a3f-9790-315ac35c5034") + ) + (wire + (pts + (xy 54.61 -20.32) (xy 54.61 -62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4caff7db-b688-435b-937a-4093503a6a1a") + ) + (wire + (pts + (xy 203.2 74.93) (xy 203.2 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4d2ea9df-f572-418c-bd61-7924b21af4bb") + ) + (wire + (pts + (xy 224.79 71.12) (xy 224.79 73.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4d9a35b5-4f81-4532-bfa9-557127897253") + ) + (wire + (pts + (xy 252.73 16.51) (xy 252.73 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4db0a1ed-e38d-4438-bd06-68a37c84e0bd") + ) + (wire + (pts + (xy 241.3 -20.32) (xy 241.3 -17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4e51bd6a-e48f-4cd5-9e7e-d3d6cf5aab75") + ) + (wire + (pts + (xy 157.48 80.01) (xy 160.02 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4edf346f-2d6b-47df-b997-306228f4e74b") + ) + (wire + (pts + (xy 93.98 -24.13) (xy 90.17 -24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4f8465a2-b551-4b2e-be6a-5771c5907cb9") + ) + (wire + (pts + (xy 237.49 -40.64) (xy 261.62 -40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "504bb433-cb37-4b5b-91dd-f6923a8df4bf") + ) + (wire + (pts + (xy 227.33 -8.89) (xy 227.33 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5087f707-91fe-4e70-8fd0-9555a1eb50b3") + ) + (wire + (pts + (xy 252.73 132.08) (xy 255.27 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "51fef384-1390-4f37-bd67-a1587bcbac9d") + ) + (wire + (pts + (xy 105.41 -16.51) (xy 105.41 21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "523dc820-2cab-4e28-9cf5-aa90af5130d9") + ) + (wire + (pts + (xy 21.59 -41.91) (xy 38.1 -41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "52fe9c61-8de7-44ce-b91a-70f0625caf47") + ) + (wire + (pts + (xy 223.52 142.24) (xy 227.33 142.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5323e831-724e-44d4-9a13-309ffe966806") + ) + (wire + (pts + (xy 215.9 26.67) (xy 215.9 -53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "53a88edd-7ac8-451f-8753-bfb25e214a27") + ) + (wire + (pts + (xy 267.97 105.41) (xy 255.27 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "54004199-8ce8-4c38-b387-49ed54b58151") + ) + (wire + (pts + (xy 50.8 -12.7) (xy 50.8 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "54317601-162d-4826-9140-8b9182eb2e24") + ) + (wire + (pts + (xy 260.35 73.66) (xy 260.35 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "54434f58-fca6-4333-a0e0-94ce3bc06f58") + ) + (wire + (pts + (xy 229.87 71.12) (xy 229.87 76.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5499e4ba-8851-44ae-b0d6-6dd5584eca12") + ) + (wire + (pts + (xy 158.75 -49.53) (xy 193.04 -49.53) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5534e35c-e89f-4d1b-a21a-f57df2c7589c") + ) + (wire + (pts + (xy 222.25 26.67) (xy 222.25 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "55c98c57-3b31-401d-925f-68ed1227f60e") + ) + (wire + (pts + (xy 200.66 -25.4) (xy 200.66 16.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "56698d1e-7f30-4e45-9b15-7a28bb04c07b") + ) + (wire + (pts + (xy 232.41 111.76) (xy 233.68 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5675fd4f-442b-43da-a265-57b8d982ac95") + ) + (wire + (pts + (xy 146.05 48.26) (xy 146.05 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "584aafb6-6dd7-4cfb-a045-ebaeaead302f") + ) + (wire + (pts + (xy 64.77 85.09) (xy 64.77 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5854ef59-6540-4157-a5b5-eb9e7950fe8c") + ) + (wire + (pts + (xy 229.87 132.08) (xy 233.68 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "589fcbc8-ddb5-4541-89c7-c9bc4a9bb8a1") + ) + (wire + (pts + (xy 170.18 48.26) (xy 179.07 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "59926593-d6b8-4062-b9c2-aecf8316e2da") + ) + (wire + (pts + (xy 238.76 111.76) (xy 248.92 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5a1ac192-412a-465b-9364-72ce882e5b9e") + ) + (wire + (pts + (xy 193.04 -44.45) (xy 193.04 -41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5a3f6c53-eba3-47b2-ad7b-3f466605f90a") + ) + (wire + (pts + (xy 240.03 147.32) (xy 240.03 142.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d0ff1c0-4a30-450b-abb9-42bfb2b8d3c5") + ) + (wire + (pts + (xy 237.49 30.48) (xy 237.49 0) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5dcb4cee-d321-4d2a-8666-cae522dce51a") + ) + (wire + (pts + (xy 38.1 -41.91) (xy 57.15 -41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5de85a23-9f8c-43a9-bfea-7cb937041483") + ) + (wire + (pts + (xy 232.41 -27.94) (xy 232.41 -24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5f004063-0951-43ee-8065-a81150ef8cb3") + ) + (wire + (pts + (xy 227.33 142.24) (xy 227.33 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5feebd47-7121-4ece-8c18-8aec4c5dd86b") + ) + (wire + (pts + (xy 215.9 -53.34) (xy 222.25 -53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "60d246f3-92fe-42b3-8b06-f52229d8d377") + ) + (wire + (pts + (xy 240.03 17.78) (xy 102.87 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "61ee44d2-3db1-4f4d-8035-eb9bb1748643") + ) + (wire + (pts + (xy 231.14 153.67) (xy 241.3 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "621b10d2-ce29-4670-9f0d-e618a8c5612d") + ) + (wire + (pts + (xy 21.59 -21.59) (xy 25.4 -21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "62bae297-18c1-4fea-b37d-4da73606587b") + ) + (wire + (pts + (xy 189.23 -20.32) (xy 193.04 -20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "62d52120-022e-44da-888b-cf0a63d8d301") + ) + (wire + (pts + (xy 236.22 116.84) (xy 257.81 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "63082d9e-76b0-44ad-88c7-10547b8e9943") + ) + (wire + (pts + (xy 86.36 17.78) (xy 102.87 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "63a886b2-bb95-4f19-8e8d-a515ddd1bba9") + ) + (wire + (pts + (xy 203.2 140.97) (xy 207.01 140.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "63bc0032-c1ad-46c8-b96c-34c7e7ae55a6") + ) + (wire + (pts + (xy 175.26 71.12) (xy 175.26 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "673f5008-b98a-4a25-b647-96f3d039750e") + ) + (wire + (pts + (xy 208.28 73.66) (xy 208.28 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "68c7f42f-26f7-42c4-bc77-656efd849fd9") + ) + (wire + (pts + (xy 31.75 17.78) (xy 35.56 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "69a0c323-ecbc-4188-9678-ff32d617c649") + ) + (wire + (pts + (xy 57.15 -22.86) (xy 60.96 -22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6a23dbdd-c7d7-4472-bebc-74150d81d295") + ) + (wire + (pts + (xy 300.99 -40.64) (xy 300.99 -20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6ae28da8-f3fe-4254-b793-c1e21eb74e73") + ) + (wire + (pts + (xy 227.33 -8.89) (xy 222.25 -8.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6aeb1e3c-dc9f-4f64-a844-4ef6c3379947") + ) + (wire + (pts + (xy 240.03 30.48) (xy 240.03 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6c43c937-c217-4296-ac2c-8669a0cd3c60") + ) + (wire + (pts + (xy 86.36 85.09) (xy 86.36 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6c49334a-f3e0-4224-919f-e8a6a4c08fd2") + ) + (wire + (pts + (xy 240.03 147.32) (xy 250.19 147.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6cdbc550-ae9d-418e-a198-948fbd54b5c5") + ) + (wire + (pts + (xy 161.29 38.1) (xy 161.29 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6d68b1db-3b29-47ee-bf35-b941da318d51") + ) + (wire + (pts + (xy 233.68 125.73) (xy 233.68 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6e92c0f1-3369-4298-ba8f-f4b3543810ae") + ) + (wire + (pts + (xy 87.63 -16.51) (xy 87.63 21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "70e397ee-aad8-4f3c-be94-1c46decc40cd") + ) + (wire + (pts + (xy 86.36 -13.97) (xy 86.36 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "713fd175-41d0-4dc2-b668-a6af8aeeff42") + ) + (wire + (pts + (xy 71.12 17.78) (xy 86.36 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7166793f-fe19-4401-8cf9-9d54fb90aa7e") + ) + (wire + (pts + (xy 196.85 19.05) (xy 279.4 19.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "71d30397-b23a-4a5b-9500-37e78923c6cd") + ) + (wire + (pts + (xy 251.46 -25.4) (xy 261.62 -25.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "730a3c62-f2c5-4c01-9e3b-d5a3b2ebca4b") + ) + (wire + (pts + (xy 191.77 24.13) (xy 191.77 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "74699697-0afe-401b-bf59-131598bbfe28") + ) + (wire + (pts + (xy 107.95 -6.35) (xy 107.95 0) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7483428c-388d-4b14-a541-54e1d0f5f60d") + ) + (wire + (pts + (xy 57.15 95.25) (xy 58.42 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "74aeb726-3f74-457a-8d02-a54bf5a3537c") + ) + (wire + (pts + (xy 72.39 -12.7) (xy 72.39 21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "74d7d21e-8364-4349-a4ce-6d40c8b2f872") + ) + (wire + (pts + (xy 243.84 142.24) (xy 240.03 142.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7645c8f0-9c38-4a0c-9889-c1c0050e98c8") + ) + (wire + (pts + (xy 93.98 -8.89) (xy 93.98 -24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "76fa9f32-3ffe-4ee3-90d6-1123b55672af") + ) + (wire + (pts + (xy 29.21 95.25) (xy 35.56 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "77683aff-248d-4f69-9247-ca83e9e8d848") + ) + (wire + (pts + (xy 74.93 -12.7) (xy 72.39 -12.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "77c86e3b-097b-4d4c-ac20-c7070c27a41f") + ) + (wire + (pts + (xy 100.33 22.86) (xy 234.95 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "78ebc4df-c362-4966-b331-032b1c7cfed4") + ) + (wire + (pts + (xy 17.78 -16.51) (xy 21.59 -16.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "790b3f37-3752-41ae-9e31-e0b88508b415") + ) + (wire + (pts + (xy 33.02 -8.89) (xy 33.02 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "79d5d5db-3486-47ec-a094-b2dd4bbfec3f") + ) + (wire + (pts + (xy 41.91 -6.35) (xy 41.91 -21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7be547bf-a4b6-4f20-b1fe-51c40c67c605") + ) + (wire + (pts + (xy 90.17 -19.05) (xy 83.82 -19.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7c098379-0f0b-4645-99e8-54357b8da11a") + ) + (wire + (pts + (xy 161.29 80.01) (xy 167.64 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7c4678a5-8b2b-4604-942b-aca2e0ffc351") + ) + (wire + (pts + (xy 248.92 105.41) (xy 248.92 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7cbf3859-eb7a-410a-a7f6-c97649a0207a") + ) + (wire + (pts + (xy 220.98 78.74) (xy 222.25 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7cdb44c5-759f-4157-a173-c9855ea655fb") + ) + (wire + (pts + (xy 275.59 30.48) (xy 275.59 35.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e7a5acc-847f-48df-a1cd-c73a08d67207") + ) + (wire + (pts + (xy 73.66 20.32) (xy 88.9 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e8208e4-d839-4776-87a9-040ca828c194") + ) + (wire + (pts + (xy 146.05 53.34) (xy 179.07 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7ea619ef-e7fb-4978-b892-9df9096e84ab") + ) + (wire + (pts + (xy 251.46 -19.05) (xy 251.46 -25.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7ebd8b4b-b516-463b-90cd-ea716b0850b3") + ) + (wire + (pts + (xy 207.01 60.96) (xy 207.01 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7f29bd04-9d2e-4d61-8525-85f8377145b8") + ) + (wire + (pts + (xy 228.6 -17.78) (xy 228.6 -13.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7f4a9f2f-ce0b-412b-a78b-86e6e9f05cea") + ) + (wire + (pts + (xy 74.93 -20.32) (xy 74.93 -41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7f524ac4-00ec-4135-8087-e51551a67a01") + ) + (wire + (pts + (xy 74.93 -17.78) (xy 67.31 -17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7f585d11-d844-40f2-bdb8-3b72075275c2") + ) + (wire + (pts + (xy 87.63 -41.91) (xy 107.95 -41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7fad7140-7ce3-4765-a3d1-9011947989a6") + ) + (wire + (pts + (xy 167.64 87.63) (xy 175.26 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "80947fde-46fe-4256-b0fd-f4cb1a7ebb1d") + ) + (wire + (pts + (xy 229.87 132.08) (xy 229.87 133.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8109f490-ceac-4dbc-9814-2fac79914e93") + ) + (wire + (pts + (xy 226.06 158.75) (xy 226.06 147.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "82cb37c2-f2cf-46c0-b6f0-234f43027906") + ) + (wire + (pts + (xy 69.85 22.86) (xy 69.85 -15.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "832fe46d-5128-4535-8740-7bc5e3d41f5c") + ) + (wire + (pts + (xy 38.1 -19.05) (xy 34.29 -19.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "83d63b84-18da-4d5f-8720-3f51e143ee4c") + ) + (wire + (pts + (xy 34.29 -16.51) (xy 34.29 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "83e77af3-07f9-4333-b536-3ae60e4f5450") + ) + (wire + (pts + (xy 57.15 -7.62) (xy 60.96 -7.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "84532b64-a3c9-43c7-9a38-5ad3ba20cc9f") + ) + (wire + (pts + (xy 205.74 60.96) (xy 207.01 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "84a17ea3-545a-4696-a966-f902d131b785") + ) + (wire + (pts + (xy 157.48 64.77) (xy 157.48 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8605d7b5-eae0-4cc4-bbab-f0a81b67bcaa") + ) + (wire + (pts + (xy 50.8 95.25) (xy 57.15 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8729a25c-f846-4479-9f32-8252f29af726") + ) + (wire + (pts + (xy 146.05 50.8) (xy 157.48 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "873ab230-c4c1-42db-abf3-f27afde1ae6d") + ) + (wire + (pts + (xy 227.33 74.93) (xy 210.82 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8761b189-20c8-4517-aa56-a6f272d86b61") + ) + (wire + (pts + (xy 107.95 -8.89) (xy 111.76 -8.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "888ac290-47ce-4764-9fa8-c6cf7a382892") + ) + (wire + (pts + (xy 236.22 144.78) (xy 236.22 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "88b50d79-b40e-4f59-b8b0-ef7cff4a4b07") + ) + (wire + (pts + (xy 35.56 17.78) (xy 35.56 21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8922d9de-1892-43e8-89a6-c98f16a3eb1c") + ) + (wire + (pts + (xy 224.79 -7.62) (xy 219.71 -7.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "897fd662-3d9b-452e-a304-80e75a6d0e62") + ) + (wire + (pts + (xy 107.95 -16.51) (xy 105.41 -16.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8a6a8fcb-aad4-4e04-9bf6-e49906d0db8a") + ) + (wire + (pts + (xy 279.4 114.3) (xy 278.13 114.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8ad5869f-13c5-44eb-8591-35745a1455be") + ) + (wire + (pts + (xy 74.93 -20.32) (xy 78.74 -20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8c0e9f33-7296-4bde-b11e-a3e3f59f912d") + ) + (wire + (pts + (xy 200.66 -27.94) (xy 200.66 -25.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8cc1e21a-cd97-4c77-bf18-599a6b59362a") + ) + (wire + (pts + (xy 148.59 71.12) (xy 148.59 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8df6a2ac-efca-40d7-9d3a-4da62ecc27c3") + ) + (wire + (pts + (xy 38.1 -21.59) (xy 38.1 -41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8ec955b0-b3e8-4a21-8d80-dbab9e27ac8b") + ) + (wire + (pts + (xy 231.14 144.78) (xy 236.22 144.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8f587f38-6031-40af-8967-31d9aaeb01de") + ) + (wire + (pts + (xy 38.1 -6.35) (xy 41.91 -6.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8fb61d73-f03b-4134-8b20-73464125ba78") + ) + (wire + (pts + (xy 17.78 22.86) (xy 34.29 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8ffaef93-c022-4c84-b475-abd1ac47edfc") + ) + (wire + (pts + (xy 64.77 85.09) (xy 86.36 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "90370926-6ec2-41ac-9511-4fdba556c4f5") + ) + (wire + (pts + (xy 232.41 30.48) (xy 232.41 21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9045b62e-efe7-431d-9861-7a485b11738b") + ) + (wire + (pts + (xy 278.13 111.76) (xy 278.13 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "91f06b0d-02a0-43d3-8994-40d80aac73c9") + ) + (wire + (pts + (xy 111.76 -8.89) (xy 111.76 -24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "928fd6fb-c48f-4b1e-a956-d609f23ccdb0") + ) + (wire + (pts + (xy 194.31 0) (xy 107.95 0) + ) + (stroke + (width 0) + (type default) + ) + (uuid "93106fae-f784-4dca-a3ce-a8797fea6c70") + ) + (wire + (pts + (xy 212.09 30.48) (xy 212.09 6.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9311169c-e6b4-4ba9-b05c-3df0301b0ae2") + ) + (wire + (pts + (xy 257.81 132.08) (xy 264.16 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "94148d09-21a7-455c-ae09-c41a19e950da") + ) + (wire + (pts + (xy 100.33 -21.59) (xy 100.33 -62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "943fef87-3997-4e00-8622-1c2ff57fabd0") + ) + (wire + (pts + (xy 57.15 -12.7) (xy 50.8 -12.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9533d1c6-8f39-4cbc-a8f5-43ae4c5269bb") + ) + (wire + (pts + (xy 60.96 -7.62) (xy 60.96 -22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9561a5af-afd6-4398-aad3-dc629a81514d") + ) + (wire + (pts + (xy 137.16 95.25) (xy 137.16 13.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "95c2ea3c-6957-4df5-8f52-9f33b6bffbb3") + ) + (wire + (pts + (xy 217.17 -5.08) (xy 217.17 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9608a809-efe9-4c11-b7c0-7becc5ba54d3") + ) + (wire + (pts + (xy 213.36 149.86) (xy 213.36 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "963923d3-d0aa-454c-a9c8-7aa6b1f3c251") + ) + (wire + (pts + (xy 224.79 -7.62) (xy 224.79 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "963b1849-ba7c-4fc7-bc1c-72ebc7d6a955") + ) + (wire + (pts + (xy 107.95 -19.05) (xy 100.33 -19.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "96966f5c-5687-4ed4-a00d-f5e522f91c41") + ) + (wire + (pts + (xy 182.88 99.06) (xy 236.22 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "97546d9b-6398-4758-a205-e36b5481651c") + ) + (wire + (pts + (xy 72.39 95.25) (xy 78.74 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "981a245b-27a0-4b30-8a4c-99471197ddd2") + ) + (wire + (pts + (xy 146.05 55.88) (xy 176.53 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "98baeaf7-5647-48ef-b73f-d9f6403db8c6") + ) + (wire + (pts + (xy 251.46 139.7) (xy 251.46 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "990709fa-ad9e-4be5-b1ae-55f35e3f6ed2") + ) + (wire + (pts + (xy 264.16 132.08) (xy 267.97 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "99758a84-cc94-4ba4-bd1a-76a7880665cf") + ) + (wire + (pts + (xy 107.95 -41.91) (xy 107.95 -24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9985e5df-6ebc-4dd3-86e0-10ea4d6e3b28") + ) + (wire + (pts + (xy 130.81 71.12) (xy 148.59 71.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9a09bb68-523b-4ac2-b757-c92fcf175a97") + ) + (wire + (pts + (xy 231.14 153.67) (xy 231.14 144.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9ac0970d-a630-47e6-98bc-16166431436e") + ) + (wire + (pts + (xy 160.02 80.01) (xy 161.29 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9b0ea619-8442-4092-b7e9-dced1deff53e") + ) + (wire + (pts + (xy 90.17 -11.43) (xy 88.9 -11.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9c5e8e68-057b-4513-b944-e3d3ea9236fa") + ) + (wire + (pts + (xy 223.52 -20.32) (xy 223.52 -17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9c7dc374-19a4-4b29-b0a2-6348b4c6c95c") + ) + (wire + (pts + (xy 74.93 -10.16) (xy 71.12 -10.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9cebe6cc-f217-4df6-8f5a-787f6d700c5c") + ) + (wire + (pts + (xy 194.31 -33.02) (xy 194.31 -20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9dcebed5-4e23-44da-a75d-195c24f144b8") + ) + (wire + (pts + (xy 83.82 22.86) (xy 100.33 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9ee5b47f-b622-47ff-81ad-4d14c96c6b25") + ) + (wire + (pts + (xy 107.95 102.87) (xy 86.36 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9f735017-fe12-4354-8b35-0c12676fb7e3") + ) + (wire + (pts + (xy 210.82 74.93) (xy 210.82 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9f9d7032-c520-4f00-9deb-77f66e49e96d") + ) + (wire + (pts + (xy 129.54 80.01) (xy 157.48 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a066a177-7b53-4813-aa5c-90f2141105cf") + ) + (wire + (pts + (xy 264.16 153.67) (xy 264.16 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a12343f2-1fb6-41bf-b490-aa12ef01f736") + ) + (wire + (pts + (xy 21.59 -19.05) (xy 17.78 -19.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a1ca9695-d056-40d3-9f94-4517b54012ec") + ) + (wire + (pts + (xy 233.68 111.76) (xy 234.95 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a1cbcacc-168a-4de1-9417-4e3e64143e48") + ) + (wire + (pts + (xy 85.09 -21.59) (xy 85.09 -62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a20211e5-8eb1-4bf6-8104-6810b36604c0") + ) + (wire + (pts + (xy 74.93 -41.91) (xy 87.63 -41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a30ec98b-3919-4fd2-92d9-707bfd51a177") + ) + (wire + (pts + (xy 265.43 73.66) (xy 260.35 73.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a401220d-0e3a-446e-bb00-a99e282f6392") + ) + (wire + (pts + (xy 224.79 119.38) (xy 224.79 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a42c700f-46eb-4bf7-84ec-4f77b82f3950") + ) + (wire + (pts + (xy 43.18 102.87) (xy 21.59 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a478453e-89c9-4c71-b8d3-a05f5a52105a") + ) + (wire + (pts + (xy 229.87 -27.94) (xy 229.87 -24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a5454cdf-ad64-41b5-9529-bec71caeb523") + ) + (wire + (pts + (xy 35.56 21.59) (xy 55.88 21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a60b8778-f358-460d-bd05-59167503f38a") + ) + (wire + (pts + (xy 105.41 21.59) (xy 232.41 21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a65e35a4-bac3-4f05-9064-793ebc3732a8") + ) + (wire + (pts + (xy 102.87 -13.97) (xy 107.95 -13.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a663cca0-67d8-492b-a028-2cad23f8497f") + ) + (wire + (pts + (xy 240.03 90.17) (xy 300.99 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a68265d5-5130-488e-b70e-4161b2262472") + ) + (wire + (pts + (xy 21.59 -21.59) (xy 21.59 -41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a68c51f8-b116-43bd-88f6-fd15fe3ec3c8") + ) + (wire + (pts + (xy 20.32 21.59) (xy 35.56 21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a6a3016c-6fd7-47b4-a30a-14b1c98f8672") + ) + (wire + (pts + (xy 54.61 -17.78) (xy 54.61 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a6d26064-cc83-4550-b3d7-a1b70ed63835") + ) + (wire + (pts + (xy 38.1 -11.43) (xy 31.75 -11.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a83caf8b-9196-42bc-a37c-89bd721fce16") + ) + (wire + (pts + (xy 179.07 53.34) (xy 179.07 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a8bbb416-21eb-4ca2-b133-3cb1010217c3") + ) + (wire + (pts + (xy 88.9 20.32) (xy 104.14 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a8cec13f-69d8-41f4-902d-5197e7984e55") + ) + (wire + (pts + (xy 245.11 83.82) (xy 252.73 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a92e6feb-32e3-4448-ac02-3affcf84afeb") + ) + (wire + (pts + (xy 90.17 -8.89) (xy 93.98 -8.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a9727d6a-0d4c-4396-8a8e-571a29b67aa3") + ) + (wire + (pts + (xy 198.12 140.97) (xy 198.12 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aaa40d3c-c7a8-4656-80db-68128651fdc3") + ) + (wire + (pts + (xy 55.88 21.59) (xy 72.39 21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aac35984-ff80-4604-86ba-3e77e08315a3") + ) + (wire + (pts + (xy 228.6 -24.13) (xy 228.6 -17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aaddeb81-3119-4c31-baee-be4d7f95e91d") + ) + (wire + (pts + (xy 260.35 50.8) (xy 300.99 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aae8621d-069c-4aba-9549-30801869293d") + ) + (wire + (pts + (xy 275.59 35.56) (xy 275.59 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "abb9f7b8-58c3-4e24-8089-04a9c7baf170") + ) + (wire + (pts + (xy 104.14 20.32) (xy 242.57 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ada71256-7ed0-438e-bbbc-61bdb82d6793") + ) + (wire + (pts + (xy 87.63 -16.51) (xy 90.17 -16.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ae017cd3-3931-4b2c-8b3d-040651d4123d") + ) + (wire + (pts + (xy 233.68 132.08) (xy 251.46 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ae0ab75b-4afb-4968-a25e-e0fc21037596") + ) + (wire + (pts + (xy 209.55 -40.64) (xy 217.17 -40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ae25fa99-97ca-444d-bb48-0bf3db152697") + ) + (wire + (pts + (xy 199.39 30.48) (xy 199.39 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ae516215-de0b-4ca9-9523-88be890d7c88") + ) + (wire + (pts + (xy 227.33 71.12) (xy 227.33 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "af54ce20-edf9-4d0e-b1f4-8ba077abe458") + ) + (wire + (pts + (xy 176.53 58.42) (xy 176.53 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "af585882-33a4-4b03-adb7-22e1aecd6b79") + ) + (wire + (pts + (xy 57.15 -41.91) (xy 74.93 -41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "af94ea35-dbd7-470d-b306-2020b1dfb398") + ) + (wire + (pts + (xy 17.78 -16.51) (xy 17.78 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b0391915-8457-4dc5-ba91-3b72b3b7985d") + ) + (wire + (pts + (xy 38.1 -16.51) (xy 34.29 -16.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b1a23e51-c506-4984-a74e-afe5d2ace110") + ) + (wire + (pts + (xy 219.71 -7.62) (xy 219.71 -25.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b1bb8621-22ed-403a-aeb8-c30746ba3cd1") + ) + (wire + (pts + (xy 90.17 -5.08) (xy 217.17 -5.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b2167954-b4fc-4f97-941b-1f451a6ab01c") + ) + (wire + (pts + (xy 260.35 74.93) (xy 260.35 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b22208d1-6498-4b60-aab2-61525d500c55") + ) + (wire + (pts + (xy 34.29 -62.23) (xy 54.61 -62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b2778812-ddbe-4293-b162-e44a594c629c") + ) + (wire + (pts + (xy 233.68 123.19) (xy 233.68 125.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b294065a-e3f9-4aea-a785-03b806073b6d") + ) + (wire + (pts + (xy 170.18 64.77) (xy 170.18 76.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b3394481-0619-4f54-8878-d1a7ad2e5811") + ) + (wire + (pts + (xy 90.17 -6.35) (xy 90.17 -5.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b39d365d-4a03-41b6-8773-570546d4af93") + ) + (wire + (pts + (xy 17.78 -62.23) (xy 34.29 -62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b3cb4233-9b3b-45a4-be3b-d695f12082a8") + ) + (wire + (pts + (xy 160.02 80.01) (xy 160.02 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b4b43e72-5c20-4ef0-97cd-91102dafbff4") + ) + (wire + (pts + (xy 72.39 21.59) (xy 87.63 21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b5455c6d-160e-4d97-bfef-4eea514f9486") + ) + (wire + (pts + (xy 255.27 132.08) (xy 257.81 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b6caecb7-070b-4cc6-a005-b2a897964617") + ) + (wire + (pts + (xy 242.57 30.48) (xy 242.57 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b717818b-0526-4bc0-a653-faae47b33986") + ) + (wire + (pts + (xy 74.93 -7.62) (xy 73.66 -7.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b736b1e1-7c8d-46bf-a732-00d754ea3522") + ) + (wire + (pts + (xy 161.29 25.4) (xy 161.29 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b89e103b-b70b-462d-9229-c6d431c124dc") + ) + (wire + (pts + (xy 104.14 -11.43) (xy 104.14 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b93d3696-82b8-4c33-ae24-049fd574f444") + ) + (wire + (pts + (xy 300.99 63.5) (xy 300.99 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ba1fb24c-bd06-47ab-90a2-a61e96f0542c") + ) + (wire + (pts + (xy 38.1 -8.89) (xy 33.02 -8.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ba6ea922-8f86-4185-9bde-ee8a97b785b2") + ) + (wire + (pts + (xy 193.04 -41.91) (xy 193.04 -20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bba859f7-ef5a-4481-a3be-78bf6e149962") + ) + (wire + (pts + (xy 209.55 30.48) (xy 209.55 2.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bd1ca2b1-4837-4ee4-8687-cb9ad48ae966") + ) + (wire + (pts + (xy 252.73 30.48) (xy 275.59 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bd41fbef-3d05-4856-8e4e-84d77f13f61d") + ) + (wire + (pts + (xy 35.56 -13.97) (xy 35.56 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bd83c682-31dc-42d8-a628-b4bd6ac3b0a4") + ) + (wire + (pts + (xy 204.47 -69.85) (xy 204.47 -38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bdb7c962-7fcd-4466-9e4a-f8ea4a221b88") + ) + (wire + (pts + (xy 111.76 -24.13) (xy 107.95 -24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bf16e524-0703-41a0-8ea8-906c6d3b92b8") + ) + (wire + (pts + (xy 234.95 111.76) (xy 236.22 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bf6b0e05-6b7f-4f5a-bc21-d2062d8861c6") + ) + (wire + (pts + (xy 227.33 132.08) (xy 229.87 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c04a43e7-c6f8-4bfe-a14f-7751e94af779") + ) + (wire + (pts + (xy 204.47 30.48) (xy 204.47 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c243ccc8-554e-4ef7-b720-7572cc252790") + ) + (wire + (pts + (xy 107.95 85.09) (xy 107.95 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c28ed5b1-76ac-4eb2-bef6-de783a66abb4") + ) + (wire + (pts + (xy 34.29 22.86) (xy 54.61 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c2c83ea0-dad4-41be-be4b-021e64e4a952") + ) + (wire + (pts + (xy 217.17 111.76) (xy 213.36 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c303ce2d-8f3d-49b0-8416-5b3b0eaea53c") + ) + (wire + (pts + (xy 158.75 48.26) (xy 170.18 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c376eb9e-7c5d-4007-a725-02ea5e0665e9") + ) + (wire + (pts + (xy 182.88 72.39) (xy 184.15 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c3f715c9-87f1-4b59-a2d2-855e5bca5cbc") + ) + (wire + (pts + (xy 160.02 76.2) (xy 160.02 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c49812b9-6efc-4708-be73-f88658eca840") + ) + (wire + (pts + (xy 229.87 76.2) (xy 213.36 76.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c4da4ccf-3abd-4535-a17d-37233da92e55") + ) + (wire + (pts + (xy 213.36 -41.91) (xy 193.04 -41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c57c5cec-e297-4903-9d89-d92a94bae88b") + ) + (wire + (pts + (xy 157.48 59.69) (xy 157.48 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c6c17d73-ec15-46a3-b252-b1d0712b89f2") + ) + (wire + (pts + (xy 226.06 147.32) (xy 240.03 147.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c7418c9c-def8-4b4c-9fe5-dfa9f1c84fcb") + ) + (wire + (pts + (xy 191.77 24.13) (xy 278.13 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c835c09a-a42f-4397-ac31-8c3183476022") + ) + (wire + (pts + (xy 33.02 20.32) (xy 52.07 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c88bd5a0-bbc9-4ce7-856e-5795e526e859") + ) + (wire + (pts + (xy 74.93 -2.54) (xy 74.93 0) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c8f518d3-f836-4a8f-a629-8bd10a334de9") + ) + (wire + (pts + (xy 54.61 22.86) (xy 69.85 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c94df90b-8b7a-40dc-982e-d6882644aefe") + ) + (wire + (pts + (xy 69.85 22.86) (xy 83.82 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c98b11b2-9698-47c8-8390-6431b346ca76") + ) + (wire + (pts + (xy 129.54 102.87) (xy 107.95 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ca32e9fd-e61c-4542-a633-12a4c1dd9d15") + ) + (wire + (pts + (xy 251.46 132.08) (xy 252.73 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ca46efc3-36f2-4634-9ea2-c348a22757fc") + ) + (wire + (pts + (xy 224.79 132.08) (xy 226.06 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cb8281a0-05e9-4097-9509-b4d8ee3f9301") + ) + (wire + (pts + (xy 198.12 132.08) (xy 224.79 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ccd3e21d-d6e9-4765-8ee9-6e399f5d3b18") + ) + (wire + (pts + (xy 215.9 73.66) (xy 215.9 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ce2312d9-960b-4dfe-aa93-845b73ee80d9") + ) + (wire + (pts + (xy 50.8 17.78) (xy 71.12 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ced8be50-6015-478e-8ff4-f2c7fa84bb93") + ) + (wire + (pts + (xy 209.55 -25.4) (xy 209.55 -40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d0b81c7d-e789-4bbd-b087-8a2cb8d69549") + ) + (wire + (pts + (xy 129.54 85.09) (xy 129.54 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d1b97e4a-859c-4956-8692-f608d4f87e08") + ) + (wire + (pts + (xy 83.82 -19.05) (xy 83.82 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d1f3bd66-5292-46f6-a698-b90c434b2e1f") + ) + (wire + (pts + (xy 300.99 -11.43) (xy 300.99 40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d327aa60-946f-4d8d-8bd4-b763cfc10d85") + ) + (wire + (pts + (xy 87.63 21.59) (xy 105.41 21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d406dc48-6e68-4787-b194-8c50f27a8d12") + ) + (wire + (pts + (xy 205.74 77.47) (xy 205.74 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d47ffe95-56a0-4296-bb8a-ff8efb6a2d4d") + ) + (wire + (pts + (xy 251.46 -11.43) (xy 300.99 -11.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d526d571-3027-432a-8a40-14b4801c5c93") + ) + (wire + (pts + (xy 38.1 -21.59) (xy 41.91 -21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d593bfe6-4899-4e0d-8325-c2addb57daa2") + ) + (wire + (pts + (xy 226.06 125.73) (xy 226.06 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d5f52cda-7dbe-4d73-99f4-8ef08806e41a") + ) + (wire + (pts + (xy 43.18 85.09) (xy 43.18 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d6bda8b5-bebf-48da-957b-68a4fdb4cdb1") + ) + (wire + (pts + (xy 231.14 158.75) (xy 231.14 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d6f9d970-4ddf-44e5-825a-961d1d5e84a1") + ) + (wire + (pts + (xy 53.34 6.35) (xy 53.34 -5.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d75ec0c7-c6dd-4cfa-8862-044a9b3d2e50") + ) + (wire + (pts + (xy 233.68 118.11) (xy 233.68 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d84389b9-b50b-458b-b0d0-7115de6d8de0") + ) + (wire + (pts + (xy 247.65 74.93) (xy 260.35 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "da8d1b6f-0394-4ea2-a3a0-e1e6f6f6c180") + ) + (wire + (pts + (xy 234.95 30.48) (xy 234.95 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "db8b1ca1-c4e0-47d8-9c87-1dfc72692e9a") + ) + (wire + (pts + (xy 236.22 -17.78) (xy 236.22 -13.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc05e729-9ada-4ee9-87c4-3d6cb07951ce") + ) + (wire + (pts + (xy 146.05 53.34) (xy 146.05 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc2d01bf-09a7-4683-bd35-64b89dbbafed") + ) + (wire + (pts + (xy 85.09 -62.23) (xy 100.33 -62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc654df8-659a-4383-aa20-b3d8dfa9ffb1") + ) + (wire + (pts + (xy 224.79 -27.94) (xy 224.79 -25.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc84f55e-08c5-4b79-ab10-d44cd135d464") + ) + (wire + (pts + (xy 189.23 30.48) (xy 189.23 25.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc88944b-8356-408e-b723-cfe06281ee77") + ) + (wire + (pts + (xy 251.46 -69.85) (xy 204.47 -69.85) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dd19b252-be8f-43ad-af2d-da751f950778") + ) + (wire + (pts + (xy 234.95 107.95) (xy 234.95 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ddb2d6a5-3c75-44bb-9f25-774a0a837b54") + ) + (wire + (pts + (xy 184.15 -20.32) (xy 184.15 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "df0d6ee6-1b17-4ad1-9104-4f8f9a7a85af") + ) + (wire + (pts + (xy 223.52 -20.32) (xy 241.3 -20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "df2a4189-ae7d-46e0-88ac-f69864e5fdba") + ) + (wire + (pts + (xy 247.65 68.58) (xy 247.65 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "df76d7d2-b680-447d-9b75-59ee8efe2755") + ) + (wire + (pts + (xy 146.05 48.26) (xy 158.75 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e01d5823-482a-4d93-a8c4-320ccd79f851") + ) + (wire + (pts + (xy 214.63 30.48) (xy 214.63 7.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e0c5f154-8537-4fa6-ad5b-519e050bdaf1") + ) + (wire + (pts + (xy 21.59 85.09) (xy 21.59 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e0f6c9ba-b065-4562-9b59-9b835badf717") + ) + (wire + (pts + (xy 64.77 102.87) (xy 43.18 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e0f77958-1c47-46ab-b233-54f75ab3ef38") + ) + (wire + (pts + (xy 213.36 142.24) (xy 213.36 149.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e1ecbbf8-9bc7-4b77-ae80-79679ea2b42b") + ) + (wire + (pts + (xy 35.56 17.78) (xy 50.8 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e267a2cc-6d45-411f-9344-c5053a7e5e18") + ) + (wire + (pts + (xy 102.87 17.78) (xy 102.87 -13.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e295ce11-5f14-4b29-b267-5011c489d442") + ) + (wire + (pts + (xy 245.11 77.47) (xy 245.11 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e3882d58-3e37-4fd7-9469-8f7546df0203") + ) + (wire + (pts + (xy 90.17 -13.97) (xy 86.36 -13.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e388a6a9-fb46-49f1-8731-2011ab9905b1") + ) + (wire + (pts + (xy 240.03 142.24) (xy 240.03 119.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e48da0a2-d346-49e3-9cd6-7fe2712d5e37") + ) + (wire + (pts + (xy 158.75 -49.53) (xy 158.75 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e61c3ae9-015f-49d1-8a38-a2e5989fb5fa") + ) + (wire + (pts + (xy 107.95 -41.91) (xy 115.57 -41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e78ca754-ca3f-4971-a2ee-42d50d720f80") + ) + (wire + (pts + (xy 21.59 -11.43) (xy 16.51 -11.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e7bc1866-6300-412d-a947-4ef317648b78") + ) + (wire + (pts + (xy 171.45 25.4) (xy 189.23 25.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e8c67b90-6a90-41ee-bbb0-03e87d0fe7df") + ) + (wire + (pts + (xy 36.83 -3.81) (xy 38.1 -3.81) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e8cc4e11-46da-4767-b42d-a72e21999212") + ) + (wire + (pts + (xy 300.99 -20.32) (xy 300.99 -11.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e948bc1d-7ac3-496d-94d9-6f8c74f33a22") + ) + (wire + (pts + (xy 200.66 -33.02) (xy 194.31 -33.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e9fb0a9a-c393-4b74-bde3-dbc855b2eb24") + ) + (wire + (pts + (xy 53.34 -5.08) (xy 57.15 -5.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eb2005dd-1290-40b2-8b36-99600bc23594") + ) + (wire + (pts + (xy 34.29 -19.05) (xy 34.29 -62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eb802474-3f60-42f8-bb43-4ba79d048bdb") + ) + (wire + (pts + (xy 210.82 110.49) (xy 210.82 107.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ec6b0e99-7c6b-45e4-a65d-593902af6cdf") + ) + (wire + (pts + (xy 21.59 -13.97) (xy 20.32 -13.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ece179bc-8475-4ae6-a713-2d4b6e99c642") + ) + (wire + (pts + (xy 210.82 107.95) (xy 234.95 107.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ece1f476-6024-4df3-a196-8813d850024b") + ) + (wire + (pts + (xy 67.31 -62.23) (xy 67.31 -17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ed2ee657-1a6c-4630-acdc-14cdd40a36c7") + ) + (wire + (pts + (xy 201.93 30.48) (xy 201.93 13.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eeca1c29-0b16-4f88-a59a-ea1b7bacc46f") + ) + (wire + (pts + (xy 36.83 2.54) (xy 36.83 -3.81) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ef571b70-46d8-4c06-b048-b866e6d11c7a") + ) + (wire + (pts + (xy 193.04 -20.32) (xy 194.31 -20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ef778d08-2af4-429d-a885-31458f360a71") + ) + (wire + (pts + (xy 236.22 99.06) (xy 236.22 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ef810c18-ea4f-4f0b-91ac-5d1d65077525") + ) + (wire + (pts + (xy 21.59 -3.81) (xy 21.59 7.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "efe2f9e1-3db6-4faf-bda7-ee221d263b34") + ) + (wire + (pts + (xy 248.92 153.67) (xy 264.16 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f02ef9e0-a648-4d02-889b-116c36f8283d") + ) + (wire + (pts + (xy 252.73 118.11) (xy 252.73 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f03bcdc9-6c3f-4a92-bfd5-b6c886e8112c") + ) + (wire + (pts + (xy 267.97 132.08) (xy 279.4 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f095a0c2-8d17-4312-ba95-82018a88031b") + ) + (wire + (pts + (xy 16.51 17.78) (xy 31.75 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f13ac403-0b4e-488f-9f9c-52f775f58b64") + ) + (wire + (pts + (xy 194.31 30.48) (xy 194.31 0) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f5a05502-9dcf-44f0-9f15-dbaddbe7aa0d") + ) + (wire + (pts + (xy 212.09 6.35) (xy 53.34 6.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f5e1b914-6c61-4393-9ae5-4022e928d5cf") + ) + (wire + (pts + (xy 241.3 -20.32) (xy 300.99 -20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f6746707-9ad4-4d23-b4e7-4687cd0d8163") + ) + (wire + (pts + (xy 146.05 50.8) (xy 146.05 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f6b0446a-dc2a-4611-a79d-3df7f922f72a") + ) + (wire + (pts + (xy 204.47 74.93) (xy 203.2 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f75e99a0-2450-4274-a637-780546cf4dc0") + ) + (wire + (pts + (xy 21.59 -8.89) (xy 19.05 -8.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f82c0cc6-71d8-474a-81c4-475dd0576254") + ) + (wire + (pts + (xy 88.9 -11.43) (xy 88.9 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f8b38bc0-9340-4497-b0ae-be8a90c193e5") + ) + (wire + (pts + (xy 252.73 111.76) (xy 257.81 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f8c2d012-6acb-41a0-b429-747a678043db") + ) + (wire + (pts + (xy 213.36 111.76) (xy 213.36 142.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f8ef7021-9f96-4dad-8ae9-af70c9592563") + ) + (wire + (pts + (xy 179.07 48.26) (xy 179.07 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f8f3e704-b6fb-4dd2-a3a3-739ca1ef9c91") + ) + (wire + (pts + (xy 222.25 -8.89) (xy 222.25 -27.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f9c13919-f4c3-413d-a525-af94ae19529e") + ) + (wire + (pts + (xy 31.75 -11.43) (xy 31.75 17.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f9e10db3-05c1-498d-8d58-c8bc7f5f8f8a") + ) + (wire + (pts + (xy 300.99 63.5) (xy 300.99 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fbd3f603-2460-4199-9160-b981d4ebf7ff") + ) + (wire + (pts + (xy 57.15 -20.32) (xy 54.61 -20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fbfda513-76a6-4ade-8b6e-3028bef15ec6") + ) + (wire + (pts + (xy 69.85 -15.24) (xy 74.93 -15.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fc906936-fe56-4d69-8219-9e1a0ee944c7") + ) + (wire + (pts + (xy 107.95 85.09) (xy 129.54 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fcce82b6-00b1-456d-956e-64fda2795c4f") + ) + (wire + (pts + (xy 240.03 82.55) (xy 240.03 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fd0228c6-49f6-4d50-908b-2761e817cf84") + ) + (wire + (pts + (xy 200.66 16.51) (xy 252.73 16.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fd225222-475c-4c08-bbe4-b4b19a8c132d") + ) + (wire + (pts + (xy 226.06 111.76) (xy 232.41 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fdd60d18-2853-4ddc-b8fc-59aa6930cd0c") + ) + (wire + (pts + (xy 20.32 -13.97) (xy 20.32 21.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fde4b56e-ec68-416f-9faa-843e1bbe6fe2") + ) + (wire + (pts + (xy 186.69 110.49) (xy 187.96 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ffe5aa24-d405-4499-8b79-46d2935f081e") + ) + (global_label "+3.3V" + (shape input) + (at 149.86 48.26 90) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + (uuid "1b1e7363-2211-41b6-8865-adead35288ad") + (property "Intersheetrefs" "${INTERSHEET_REFS}" + (at 149.86 39.59 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + ) + (global_label "+5.0V" + (shape input) + (at 215.9 111.76 90) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + (uuid "96e5cfb5-eabf-443a-825b-9ccdab1de191") + (property "Intersheetrefs" "${INTERSHEET_REFS}" + (at 215.9 103.09 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + ) + (global_label "+3.3V" + (shape input) + (at 232.41 111.76 90) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + (uuid "f0f9902d-d7b9-4ba3-b002-ea19299fa55a") + (property "Intersheetrefs" "${INTERSHEET_REFS}" + (at 232.41 103.09 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 170.18 62.23 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0273ff78-8d9e-42cc-b406-faa0678db851") + (property "Reference" "C17" + (at 172.72 60.9662 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 172.72 63.5062 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 170.18 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 170.18 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 170.18 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a8a99ce9-b83d-41c9-8ae3-a498b7727925") + ) + (pin "2" + (uuid "659a3921-1495-49f7-8a9b-092387dbf202") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Diode:SD05_SOD323") + (at 219.71 142.24 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "04614ffa-486a-4ced-ad03-067a70d82578") + (property "Reference" "D1" + (at 219.964 138.938 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SD05_SOD323" + (at 219.71 138.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Diode_SMD:D_0201_0603Metric" + (at 219.71 147.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.littelfuse.com/~/media/electronics/datasheets/tvs_diode_arrays/littelfuse_tvs_diode_array_sd_c_datasheet.pdf.pdf" + (at 219.71 142.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "5V, 450W Discrete Bidirectional TVS Diode, SOD-323" + (at 219.71 142.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3803fd9a-59f7-42e3-9d3a-858cba48aae3") + ) + (pin "2" + (uuid "04ecd035-a360-46f7-a9c2-0c60733d8ab7") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 252.73 115.57 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "058c5c4c-359f-4470-9889-23380ac2f5e6") + (property "Reference" "C1" + (at 255.27 114.3062 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "~" + (at 255.27 116.8462 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 252.73 115.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 252.73 115.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 252.73 115.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7d79f9cb-eac0-4644-9b14-6158b844ffd4") + ) + (pin "2" + (uuid "10149415-3498-47aa-b4a6-ab5a0fd8252e") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 34.29 148.59 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "07c83010-4d7d-45f9-8868-a8dfdef86244") + (property "Reference" "C8" + (at 36.83 147.3262 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 36.83 149.8662 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 34.29 148.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 34.29 148.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 34.29 148.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "2377ef56-58cd-407c-84dd-1574d197d4ed") + ) + (pin "2" + (uuid "f570e21b-2d40-48b4-8cef-cfe3aed35dc0") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "LED:WS2812B") + (at 64.77 95.25 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "179c0415-ae94-4230-b514-b2c2f45d236f") + (property "Reference" "LED4" + (at 76.2 89.7538 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "WS2812B" + (at 76.2 92.2938 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "LED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm" + (at 63.5 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf" + (at 62.23 85.725 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Description" "RGB LED with integrated controller" + (at 64.77 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8a3ba5fe-8ae4-4c5e-8f68-bf9d187d6a35") + ) + (pin "4" + (uuid "e257c00c-07d1-4623-a337-7b256a4a9c86") + ) + (pin "2" + (uuid "a71d3e4d-70be-445f-87cd-155a91f69c4d") + ) + (pin "3" + (uuid "c0d428dd-a201-4e4b-be01-e8bf35bb4316") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "LED4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "LED:WS2812B") + (at 86.36 95.25 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "1c80475f-c50f-4257-bc89-7044184ea06d") + (property "Reference" "LED5" + (at 97.79 89.7538 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "WS2812B" + (at 97.79 92.2938 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "LED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm" + (at 85.09 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf" + (at 83.82 85.725 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Description" "RGB LED with integrated controller" + (at 86.36 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "526955ab-5709-4489-abd2-eedd2c24cd7d") + ) + (pin "4" + (uuid "968109ff-0782-41c1-ae3f-14572898d480") + ) + (pin "2" + (uuid "05d62640-91ae-48b7-bf18-80639d1e5a43") + ) + (pin "3" + (uuid "754bc330-c9fc-4170-b2b2-8ea01c934e02") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "LED5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 229.87 125.73 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "24431fe8-eb91-4a87-b7e8-e0c5bf6c7706") + (property "Reference" "D2" + (at 229.87 119.38 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 229.87 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 229.87 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 229.87 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 229.87 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 229.87 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 229.87 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "66d9b714-cccd-4f22-8ef3-f9ca7990b278") + ) + (pin "2" + (uuid "90ef92a6-9403-4e50-970c-b5d1b4857f2a") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:Battery_Cell") + (at 261.62 -30.48 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "27c49357-184c-4845-bf13-f1ed986bb769") + (property "Reference" "BT1" + (at 265.43 -29.9086 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "Battery_Cell" + (at 265.43 -27.3686 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "" + (at 261.62 -28.956 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 261.62 -28.956 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Single-cell battery" + (at 261.62 -30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1fd372bc-66d7-4f31-828e-9e8a839906cf") + ) + (pin "2" + (uuid "e754111b-fae6-4964-98c8-760062ce488d") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "BT1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 130.81 43.18 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "28c4668d-03f3-49d3-9fe6-5997d1d614ba") + (property "Reference" "#PWR07" + (at 130.81 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 130.81 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 130.81 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 130.81 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+5V\"" + (at 130.81 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0ca22a33-63f4-467b-983c-dbe68c459673") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "#PWR07") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 33.02 157.48 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "2a7f519d-b7e6-4ce0-a032-5eecdaa27b66") + (property "Reference" "C9" + (at 35.56 156.2162 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 35.56 158.7562 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 33.02 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 33.02 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 33.02 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5b7fed36-1f40-420a-9af6-c44942b75c67") + ) + (pin "2" + (uuid "4ac37974-4580-48bb-a3a4-f590821b31e7") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 86.36 140.97 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2c6391bf-6c1b-4a86-9149-ba88b5e9088e") + (property "Reference" "D5" + (at 86.36 137.668 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 86.36 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 86.36 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 86.36 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 86.36 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 86.36 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 86.36 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a5383235-3cb6-4702-be3b-4b5f2b56fe87") + ) + (pin "2" + (uuid "d8dac8d4-a22d-4008-a3b3-4bb3c66b6ed7") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 33.02 185.42 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "320fbb78-d686-48a5-86ed-16abc5394ce3") + (property "Reference" "C16" + (at 35.56 184.1562 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 35.56 186.6962 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 33.02 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 33.02 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 33.02 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "106f739a-b7fa-49b6-a6be-e10ab4ebcc19") + ) + (pin "2" + (uuid "20faf77b-1f25-4390-9ecc-7cfa815e44a0") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 229.87 133.35 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "349e7367-f679-4c14-af79-2bd252b2270a") + (property "Reference" "#PWR01" + (at 229.87 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 229.87 138.43 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 229.87 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 229.87 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 229.87 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "863e5d75-4b9e-466b-bba7-562c320eaf3b") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "#PWR01") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:USB_C_Plug") + (at 238.76 173.99 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "357c1eba-039b-44bb-aaa2-25fa9dca0648") + (property "Reference" "P1" + (at 242.57 186.69 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "USB_C_Plug" + (at 242.57 189.23 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_USB:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal" + (at 238.76 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.usb.org/sites/default/files/documents/usb_type-c.zip" + (at 238.76 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "USB Type-C Plug connector" + (at 238.76 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "A2" + (uuid "03d1c661-bea9-41f1-8baf-4dad95bf7a5a") + ) + (pin "B9" + (uuid "9d2c7d97-f3be-4e91-b8e4-4ae8d391092e") + ) + (pin "A10" + (uuid "74e1b62e-1e30-4d45-99a3-72c013d05511") + ) + (pin "A6" + (uuid "1c0f6be3-3c96-4264-af06-8e1222afefab") + ) + (pin "B3" + (uuid "1b7ce75c-4af3-4544-ab32-baf50c9229e0") + ) + (pin "A1" + (uuid "982e47db-4e50-45b5-abcd-10eded383af5") + ) + (pin "A4" + (uuid "d5585dbd-df25-4f96-b000-cfab759d6a03") + ) + (pin "B4" + (uuid "8a362699-0dc7-452f-962a-2160c899813a") + ) + (pin "A12" + (uuid "231180f3-b829-4add-9af1-91521bcd2c0a") + ) + (pin "A5" + (uuid "b2963634-48dc-423f-85a2-25a7b2688567") + ) + (pin "A7" + (uuid "bf0c8b54-3ac6-4de4-847d-6ee3dea11076") + ) + (pin "B11" + (uuid "5736fb64-fbad-4ef9-9d96-59d1f9a2bfaa") + ) + (pin "A9" + (uuid "71c04ed7-241d-4668-8c2e-f37de1766c4b") + ) + (pin "S1" + (uuid "0014301e-0b7e-431f-9ada-c27e953cf645") + ) + (pin "A3" + (uuid "b8beb7b8-6257-4ee7-b935-88bd1622cc0e") + ) + (pin "A11" + (uuid "78cb23d1-637b-4cb0-8d82-e1c638920f75") + ) + (pin "A8" + (uuid "9df3ce45-9a03-4ee6-aa06-84fd21ab572f") + ) + (pin "B2" + (uuid "0af8dcdf-4d7e-4171-90f2-2951fe745609") + ) + (pin "B1" + (uuid "9588c66f-66fe-4397-8d4c-a3eb7fc84c02") + ) + (pin "B8" + (uuid "7e19889f-3350-4648-b453-ecd3cb32f62a") + ) + (pin "B10" + (uuid "51d82862-cd5f-46ac-a796-3b64cc0c56da") + ) + (pin "B5" + (uuid "d5d7d4f4-ea76-4ea5-809d-814db6204c12") + ) + (pin "B12" + (uuid "17dcaa76-375f-4fbd-ae09-d1bd6a497fd1") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "P1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 62.23 139.7 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3764569e-8abd-4101-974d-fe245d1fab8a") + (property "Reference" "D20" + (at 62.23 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 62.23 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 62.23 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 62.23 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 62.23 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 62.23 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 62.23 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c47f51e0-9dbf-4ab3-8dd0-ce878fe276a8") + ) + (pin "2" + (uuid "ea360df9-9c7d-4c4d-9a16-c7f466f1e56a") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D20") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 105.41 175.26 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3a0b002f-29fe-41eb-b3e3-abe5754cd6c8") + (property "Reference" "R4" + (at 107.95 173.9899 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10K" + (at 107.95 176.5299 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 103.632 175.26 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 105.41 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 105.41 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1c0353c1-a22c-4fd1-b742-9f801245141e") + ) + (pin "1" + (uuid "27f9ffe4-16bd-4824-94b1-c7f76faf748f") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "R4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 182.88 95.25 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3f1bb15a-571b-407c-b5e7-9a49bf62af8b") + (property "Reference" "R3" + (at 185.42 93.9799 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10K" + (at 185.42 96.5199 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 181.102 95.25 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 182.88 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 182.88 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "280df181-a4d3-43c2-8b47-f672c8da80ec") + ) + (pin "1" + (uuid "a34b5eb0-4614-4b3b-9843-9cb239a09f6b") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "R3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:LED") + (at 184.15 110.49 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4018835f-bf8e-4325-8ada-f3de0b9bfff3") + (property "Reference" "LED1" + (at 184.15 107.188 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LED" + (at 182.5625 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 184.15 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 184.15 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Light emitting diode" + (at 184.15 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1511a6bc-26f7-47cb-83a5-8984a9eaaffd") + ) + (pin "2" + (uuid "7f27299b-c31d-472a-9d72-51c2a7e627bf") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "LED1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 233.68 120.65 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "44753848-a8cd-40b0-a9f7-8d5f04d1b99e") + (property "Reference" "C2" + (at 236.22 119.3862 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 236.22 121.9262 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 233.68 120.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 233.68 120.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 233.68 120.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "2c0ecba1-afef-47d7-9350-d25e7aedc46e") + ) + (pin "2" + (uuid "d96f85cb-e442-47df-9f67-0c5c05aa180d") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 265.43 76.2 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "481e19ed-f539-4794-92e7-4d8aaad5ed7c") + (property "Reference" "C12" + (at 267.97 74.9362 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 267.97 77.4762 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 265.43 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 265.43 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 265.43 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "28940ced-d981-464e-a083-c02bc9f77380") + ) + (pin "2" + (uuid "5a3b3ecf-c3f2-4729-ab50-f05b397ec28b") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3.3V") + (at 115.57 -41.91 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "50d25679-1065-4549-a091-6a0ee64f2f71") + (property "Reference" "#PWR06" + (at 115.57 -38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3.3V" + (at 115.57 -45.72 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 115.57 -41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 115.57 -41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3.3V\"" + (at 115.57 -41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "d20ad300-0eb4-4c6e-8ca2-f0d6099e8bdc") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "#PWR06") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "LED:WS2812B") + (at 43.18 95.25 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "549be960-fd49-4fc1-aad4-c1a8b4cb9eba") + (property "Reference" "LED3" + (at 54.61 89.7538 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "WS2812B" + (at 54.61 92.2938 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "LED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm" + (at 41.91 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf" + (at 40.64 85.725 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Description" "RGB LED with integrated controller" + (at 43.18 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a39880cc-f1a8-4829-a02b-d4a8807ad61d") + ) + (pin "4" + (uuid "a69ff28a-5055-498e-a543-09b88d78c264") + ) + (pin "2" + (uuid "5301592f-1baa-4921-965f-31ba8fc25433") + ) + (pin "3" + (uuid "56ab574d-0cf1-40d1-9b88-08377a2625af") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "LED3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Regulator_Linear:AP1117-33") + (at 224.79 111.76 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "583f27ea-0cb0-4ae0-a6d3-41e00d8ac2cb") + (property "Reference" "U6" + (at 224.79 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MI6118" + (at 224.79 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_SMD:SOT-223-3_TabPin2" + (at 224.79 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.diodes.com/datasheets/AP1117.pdf" + (at 227.33 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "1A Low Dropout regulator, positive, 3.3V fixed output, SOT-223" + (at 224.79 111.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1a61ff17-8c06-4a42-8999-6bcd2b9f15b9") + ) + (pin "1" + (uuid "9e7b7794-9afd-4ef6-952d-12bb3fd9e0f6") + ) + (pin "3" + (uuid "1fc923bf-d614-4065-bcac-c736524028bc") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "U6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 60.96 176.53 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "61d36d20-8bb5-42d6-9f25-db0fd0ce3872") + (property "Reference" "D25" + (at 60.96 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 60.96 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 60.96 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 60.96 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 60.96 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 60.96 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 60.96 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3c9fda32-bfca-46a0-a8a2-2e6d1550c358") + ) + (pin "2" + (uuid "c04d1894-0afc-4808-829f-b70420abb2e8") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D25") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 86.36 149.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "69d16dab-3953-4f6d-8f94-796c80763845") + (property "Reference" "D6" + (at 86.36 146.558 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 86.36 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 86.36 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 86.36 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 86.36 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 86.36 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 86.36 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "82dc5cf8-d6db-4663-939d-39112abb5cb2") + ) + (pin "2" + (uuid "13569e58-20cd-49fd-bdaa-98071d72f523") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 190.5 110.49 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "6aa1e88b-da20-4a96-98ca-25da60264f21") + (property "Reference" "R2" + (at 190.5 104.14 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "20K" + (at 190.5 106.68 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 190.5 112.268 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 190.5 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 190.5 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "7bf00624-d988-41e1-a29b-01c60e2d422e") + ) + (pin "1" + (uuid "2ae5e547-1840-4a7c-969a-7873f328b2fc") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "R2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 175.26 77.47 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "6ac2f941-2e7c-446a-96c1-7be172894e78") + (property "Reference" "C4" + (at 177.8 76.2062 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 177.8 78.7462 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 175.26 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 175.26 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 175.26 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c30f7afc-dfa0-4c48-b9bf-7f462b397798") + ) + (pin "2" + (uuid "d0a5b4cc-6036-4bb4-8dc2-c0909e45b4b2") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:Crystal") + (at 232.41 -13.97 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "72d2bf5c-ee8e-4d61-aa50-cf5a3a75d146") + (property "Reference" "X1" + (at 232.41 -21.59 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Crystal" + (at 232.41 -19.05 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 232.41 -13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 232.41 -13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Two pin crystal" + (at 232.41 -13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "7f2e8772-780a-4611-a9f5-991ab1018c76") + ) + (pin "1" + (uuid "f387dea4-f154-40b3-ad05-bf5200256b29") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "X1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial_Small") + (at 186.69 -20.32 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "7390cee5-e9ac-4a37-b0b9-793e35ab2ebc") + (property "Reference" "J1" + (at 186.1704 -26.67 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_Coaxial_Small" + (at 186.1704 -24.13 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 186.69 -20.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 186.69 -20.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "small coaxial connector (BNC, SMA, SMB, SMC, Cinch/RCA, LEMO, ...)" + (at 186.69 -20.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "7e976c64-14f8-47b8-a330-065f14eb8bc9") + ) + (pin "1" + (uuid "4d55aca9-ffa2-4e2a-9f76-72772bf0115c") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "J1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x08_Socket") + (at 113.03 -16.51 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "75008148-e12a-4575-b1b9-3b2dd81d710c") + (property "Reference" "FPC5" + (at 114.3 -16.5101 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Conn_01x08_Socket" + (at 114.3 -13.9701 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 113.03 -16.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 113.03 -16.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x08, script generated" + (at 113.03 -16.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "6" + (uuid "628a0c22-69a1-4f9a-80a6-20553173ccda") + ) + (pin "7" + (uuid "132898ef-a252-4c8a-b024-a6513a3c8141") + ) + (pin "8" + (uuid "3fa809b2-5712-421f-97a0-e79aaca248ad") + ) + (pin "5" + (uuid "57bb186d-0b86-45a8-8875-e698da2c426b") + ) + (pin "2" + (uuid "45cdc3e2-b93d-4541-bb12-7bb8567ca732") + ) + (pin "4" + (uuid "829eca29-41f9-4f07-b633-eb43b37a71d4") + ) + (pin "3" + (uuid "eedeb789-9b7f-4ec9-9957-eb9ac274735e") + ) + (pin "1" + (uuid "96fe09e3-35b2-4740-8f36-f1660406aed9") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "FPC5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 157.48 62.23 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "76cc00f8-3016-4b92-be19-061e082603fe") + (property "Reference" "C18" + (at 160.02 60.9662 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 160.02 63.5062 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 157.48 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 157.48 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 157.48 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b66c1914-5514-483b-a286-ece39950c0fe") + ) + (pin "2" + (uuid "baf9a546-ce7d-46f2-b407-383006ae3b88") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C18") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 247.65 139.7 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "77f7a908-23b6-4e2a-8d18-3f0c7144df0b") + (property "Reference" "D28" + (at 247.65 136.652 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 247.65 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 247.65 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 247.65 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 247.65 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 247.65 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 247.65 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "97a50ea1-9d9b-44e9-9e1f-357a90310155") + ) + (pin "2" + (uuid "89bd3833-73fb-4b90-9039-a8634eef9723") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D28") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 62.23 161.29 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "79332fa2-a24f-4166-879b-322ba445e282") + (property "Reference" "D24" + (at 62.23 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 62.23 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 62.23 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 62.23 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 62.23 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 62.23 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 62.23 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "815236be-ac4e-4b3e-9b10-1219729cd096") + ) + (pin "2" + (uuid "196059f9-6ae9-49e5-b245-d74821236c9a") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D24") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Diode:SD05_SOD323") + (at 254 147.32 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7ae86a5e-e405-43b6-8fd7-59fdf7ce306b") + (property "Reference" "D3" + (at 254.254 144.018 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SD05_SOD323" + (at 254 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Diode_SMD:D_0201_0603Metric" + (at 254 152.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.littelfuse.com/~/media/electronics/datasheets/tvs_diode_arrays/littelfuse_tvs_diode_array_sd_c_datasheet.pdf.pdf" + (at 254 147.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "5V, 450W Discrete Bidirectional TVS Diode, SOD-323" + (at 254 147.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1ba656fc-010c-43f0-bcd8-5092fc49336e") + ) + (pin "2" + (uuid "49173637-84be-45fd-a52f-f39d386a224f") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 300.99 63.5 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "7d5c510d-bbd0-4992-9150-30b6c7e96afb") + (property "Reference" "#PWR02" + (at 300.99 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 300.99 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 300.99 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 300.99 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 300.99 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "46649f7f-58dc-4ee0-bf91-bb7ce1302c85") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "#PWR02") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:Q_PNP_BCE") + (at 133.35 66.04 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "7e9c5297-d2a1-4ba0-9ae9-0fce7adfb548") + (property "Reference" "Q1" + (at 128.27 66.0399 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Q_PNP_BCE" + (at 128.27 64.7701 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 128.27 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 133.35 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "PNP transistor, base/collector/emitter" + (at 133.35 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "e27a5d59-1c1e-4e4e-bed2-34338e300d02") + ) + (pin "2" + (uuid "dbef5096-62df-4b61-8e69-3922ae90d690") + ) + (pin "1" + (uuid "3d003682-b308-4e27-91b3-0aa39f72b44a") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "Q1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 292.1 38.1 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "84a580fc-d746-4723-a76c-004b72e82b6f") + (property "Reference" "C15" + (at 294.64 36.8362 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 294.64 39.3762 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 292.1 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 292.1 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 292.1 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b1093ad2-4c1e-4089-b25c-30423c91a255") + ) + (pin "2" + (uuid "909d14c8-ee07-4798-9c77-20cb69b680ea") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 255.27 107.95 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "85111871-fef2-42e0-acad-b3b1f7b83b6e") + (property "Reference" "C3" + (at 257.81 106.6862 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "~" + (at 257.81 109.2262 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 255.27 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 255.27 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 255.27 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "979d85bd-4b4a-4716-8708-66497c8ae2d6") + ) + (pin "2" + (uuid "24ca8287-9dbf-4e0e-a393-7caf2150ceb9") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 193.04 -46.99 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "89ee4ae2-9a8c-4f4b-95f5-e78ff283e38d") + (property "Reference" "C19" + (at 195.58 -48.2538 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 195.58 -45.7138 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 193.04 -46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 193.04 -46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 193.04 -46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6e4f0a89-b3d3-4b33-8341-d17a3efefec8") + ) + (pin "2" + (uuid "d1cd8d4a-143f-4979-928b-0c8afc6b3e55") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C19") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 240.03 80.01 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "8a4f51c8-f2bc-433f-8d6a-cd7777ce9f25") + (property "Reference" "C13" + (at 242.57 78.7462 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 242.57 81.2862 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 240.03 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 240.03 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 240.03 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "856728b4-2ca6-498c-90fe-a84a6da84145") + ) + (pin "2" + (uuid "f11b01b3-18e1-4b59-bf93-c3eef149b760") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "LED:WS2812B") + (at 107.95 95.25 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "8a81e6d6-77a3-4c5d-90db-d38872df6070") + (property "Reference" "LED6" + (at 119.38 89.7538 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "WS2812B" + (at 119.38 92.2938 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "LED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm" + (at 106.68 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf" + (at 105.41 85.725 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Description" "RGB LED with integrated controller" + (at 107.95 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "84da17fd-dcd7-4904-aa1a-2dfa5129989f") + ) + (pin "4" + (uuid "f12d0fde-3230-4208-8741-0f0b597df9a3") + ) + (pin "2" + (uuid "4509c0da-d55d-4b6b-87cd-b5121259d2dc") + ) + (pin "3" + (uuid "72fc7f25-1102-4af5-b953-baef229604fd") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "LED6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "LED:WS2812B") + (at 21.59 95.25 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "9065df35-b4a6-44c9-86ed-c3c522f32ae9") + (property "Reference" "LED2" + (at 33.02 89.7538 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "WS2812B" + (at 33.02 92.2938 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "LED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm" + (at 20.32 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf" + (at 19.05 85.725 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Description" "RGB LED with integrated controller" + (at 21.59 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1aa96c76-22a4-476d-bfe0-540d21ad6c83") + ) + (pin "4" + (uuid "d3068f26-7daa-4973-a274-709c83bcb24d") + ) + (pin "2" + (uuid "0c285359-4e4c-49ba-9fd1-aede6d960937") + ) + (pin "3" + (uuid "f38e9c76-50b9-40fa-a342-08cfbbe3ecf8") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "LED2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 242.57 102.87 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9f1b39e6-6171-4fa4-bf93-5f56ba50228f") + (property "Reference" "D26" + (at 242.57 99.568 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 242.57 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 242.57 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 242.57 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 242.57 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 242.57 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 242.57 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "150927bb-2401-46c7-b036-48a83af9abf7") + ) + (pin "2" + (uuid "143a33c8-0680-4c90-9887-423795835569") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D26") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 226.06 -17.78 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a18c2e7c-dbf9-45dd-97f6-b0372afa5509") + (property "Reference" "C7" + (at 226.0663 -21.59 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "~" + (at 226.0663 -20.32 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 226.06 -17.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 226.06 -17.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 226.06 -17.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "65049e80-2760-4483-98ff-df965964c176") + ) + (pin "2" + (uuid "cd5b4c64-a1d7-4e7f-a452-bcac939eb5ef") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "MCU_Espressif:ESP32-PICO-D4") + (at 219.71 50.8 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a32ea385-1e3b-421e-8d99-341f8f6d352c") + (property "Reference" "U2" + (at 267.97 45.3038 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ESP32-PICO-D4" + (at 267.97 47.8438 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_DFN_QFN:QFN-48-1EP_7x7mm_P0.5mm_EP5.3x5.3mm" + (at 259.08 19.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf" + (at 219.71 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "RF Module, ESP32 SoC, Wi-Fi 802.11b/g/n, Bluetooth, BLE, 32-bit, 2.7-3.6V, external antenna, QFN-48" + (at 219.71 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "33" + (uuid "219ba493-4853-4e02-a529-12eb6152d1ce") + ) + (pin "4" + (uuid "3fa9479e-5cee-493f-b2ef-df6d2b931af2") + ) + (pin "17" + (uuid "fc43b702-a2ee-4b70-9d49-6a066a8c758c") + ) + (pin "40" + (uuid "ce385329-a01d-4d35-a660-3b911fd980c5") + ) + (pin "46" + (uuid "1762a1ec-6afb-40f1-ac82-77f406920812") + ) + (pin "9" + (uuid "942187bb-f6fe-4de4-9ed4-75e6b7293142") + ) + (pin "36" + (uuid "28a77d9e-de9d-44ce-aaff-cdc601ebe29a") + ) + (pin "23" + (uuid "3a42a48f-8b7c-44a6-be16-c4e4adf13a29") + ) + (pin "49" + (uuid "2ead7028-a310-480e-84f5-2676b818303f") + ) + (pin "1" + (uuid "b1106434-2002-499c-9bcf-92134172a282") + ) + (pin "12" + (uuid "61b5fc0d-6e13-48fa-bbec-a95cb35a436d") + ) + (pin "21" + (uuid "853f6c01-433e-4909-892e-2412fbb6052b") + ) + (pin "42" + (uuid "556c17ba-e306-4f5c-9576-74cef8bbf3a2") + ) + (pin "43" + (uuid "a56e445c-e419-41f3-9459-030266815269") + ) + (pin "38" + (uuid "1491ce1d-d405-40bf-b505-b1e0bd185784") + ) + (pin "16" + (uuid "4f6c7580-a47c-420f-ab36-a81f6933912c") + ) + (pin "29" + (uuid "e5b0f968-730f-4eb8-be89-426a913e32a1") + ) + (pin "47" + (uuid "3c94be81-757e-446b-b8c4-99bfa4f208ea") + ) + (pin "37" + (uuid "fdcdf9c7-0cd1-4379-8e7e-fe87f2b8349f") + ) + (pin "11" + (uuid "47b74885-508c-488b-bb9d-cf9d3529eb31") + ) + (pin "13" + (uuid "412c9506-3348-4805-8480-f25552cbd837") + ) + (pin "24" + (uuid "957ff183-8699-4742-8580-b9722d9fc9b8") + ) + (pin "10" + (uuid "386991db-bf7b-4fb4-8c3f-3d2c0190f4cf") + ) + (pin "26" + (uuid "0f1951ec-e8a7-45a8-b1b2-02a7e62eec2f") + ) + (pin "3" + (uuid "92e7c066-5210-4b2f-aeda-30fbf99733ec") + ) + (pin "32" + (uuid "7afd0d26-495b-4097-b3c1-45835f4efcf7") + ) + (pin "22" + (uuid "16877dd4-9166-4a65-9d82-0a0071a3a01c") + ) + (pin "5" + (uuid "deb0ac68-417f-47bb-aac3-40ab1d62a96f") + ) + (pin "39" + (uuid "32dc5105-d233-4da7-8ac4-974a0b2fbbcd") + ) + (pin "14" + (uuid "e4bf8420-8969-4f02-99da-cc27c9169c2a") + ) + (pin "20" + (uuid "9a91a62f-273c-4447-a810-c8e6bc008771") + ) + (pin "35" + (uuid "5bf4b8a0-ce8a-4343-821e-223042f432d2") + ) + (pin "41" + (uuid "a3094bf9-2243-4839-95da-5685c388f2d8") + ) + (pin "34" + (uuid "11122b9f-fb3f-475d-827a-2df776349ac1") + ) + (pin "28" + (uuid "1e2d7bed-9a87-4a7c-8e4a-bf2568dd07f1") + ) + (pin "6" + (uuid "d338d485-104c-4caa-84c9-71fb8b2af2d3") + ) + (pin "31" + (uuid "d9174fea-f7ed-4d30-a9fc-4acafae8e0d2") + ) + (pin "2" + (uuid "e7b5dbe8-3625-40be-b10a-1c2766cabe54") + ) + (pin "44" + (uuid "bea05aed-b972-4fae-bd06-ff957c9a67ce") + ) + (pin "15" + (uuid "9015729e-b0cd-45c0-a999-1f85cb8a014e") + ) + (pin "7" + (uuid "dc0b99e3-97c9-46d9-b341-b89c3d3216cb") + ) + (pin "8" + (uuid "546c53ef-064e-4f53-8f3c-85301d54eaba") + ) + (pin "18" + (uuid "6bbb8b6c-a3b6-4ec6-85d0-39e4628b242f") + ) + (pin "25" + (uuid "c35fc247-3598-4dc5-99fe-52b0bdf5eaf5") + ) + (pin "48" + (uuid "62b9f493-34e0-4475-988a-85d2d5da10e0") + ) + (pin "45" + (uuid "3de9aac9-11ed-4d41-89de-8819d05be6c2") + ) + (pin "19" + (uuid "52c07384-a8ba-447e-8822-b4f48954022c") + ) + (pin "27" + (uuid "a26b4090-eaf7-4496-bc64-ec4abebe5411") + ) + (pin "30" + (uuid "59ad5578-e56c-4359-b51e-147f29ab662b") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "U2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x08_Socket") + (at 62.23 -15.24 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b22e39e3-9c09-4575-ad4c-377bd591fc2a") + (property "Reference" "FPC1" + (at 63.5 -15.2401 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Conn_01x08_Socket" + (at 63.5 -12.7001 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 62.23 -15.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 62.23 -15.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x08, script generated" + (at 62.23 -15.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "6" + (uuid "1d4848b7-f1c5-4efa-b75e-a44f8235a8da") + ) + (pin "7" + (uuid "940d0b78-cb01-414b-be24-15bea78cf858") + ) + (pin "8" + (uuid "bd7c3db1-1e82-4bd3-8087-79012b3296d9") + ) + (pin "5" + (uuid "475e4ae3-3cc3-40f9-90ea-e1674b9b892e") + ) + (pin "2" + (uuid "f8f28e99-1857-4c29-9777-28568c011cb5") + ) + (pin "4" + (uuid "837a5107-cdd6-41ab-b27c-a504fd444c29") + ) + (pin "3" + (uuid "8370b2ad-c362-4e3c-99cf-b345a91f867f") + ) + (pin "1" + (uuid "d8164e88-9210-4b60-9d6e-b261250bfa51") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "FPC1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 62.23 149.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b334f217-567d-4204-9537-46dd4c193457") + (property "Reference" "D22" + (at 62.23 146.304 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 62.23 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 62.23 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 62.23 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 62.23 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 62.23 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 62.23 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3127a1d6-082a-4373-b73c-e96d2a37ea4a") + ) + (pin "2" + (uuid "3a73868f-b18d-488f-a1c7-f7509a26b3f3") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D22") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 238.76 -17.78 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b382b7a0-edc1-4246-963f-e1846ae144fd") + (property "Reference" "C6" + (at 238.7663 -22.86 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "~" + (at 238.7663 -20.32 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 238.76 -17.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 238.76 -17.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 238.76 -17.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5ff55d86-9b3b-4346-9362-bd1f7bfb43a4") + ) + (pin "2" + (uuid "f57f7a6f-8d45-4184-9489-cdd5e74c8552") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x08_Socket") + (at 95.25 -16.51 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b6e7082c-d27e-4630-bf10-0c7dc67d7a2e") + (property "Reference" "FPC6" + (at 96.52 -16.5101 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Conn_01x08_Socket" + (at 96.52 -13.9701 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 95.25 -16.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 95.25 -16.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x08, script generated" + (at 95.25 -16.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "6" + (uuid "629acad5-dd9a-46ab-9469-d1c1c135b404") + ) + (pin "7" + (uuid "d46fd03e-aee7-41c1-9dcc-c1f8e8cb4605") + ) + (pin "8" + (uuid "fe72ea97-6489-43af-ad8d-703832ec5806") + ) + (pin "5" + (uuid "61f1f070-8868-433c-b944-1cbb07ffab8b") + ) + (pin "2" + (uuid "f5cba52c-5194-4aa9-bd22-2dc1ecc006d2") + ) + (pin "4" + (uuid "b1468782-01af-4900-813d-e72163e47108") + ) + (pin "3" + (uuid "47cc65da-a3b3-487f-beff-2e0cb97fc953") + ) + (pin "1" + (uuid "9d8f62ff-c51d-4083-95c1-ca0005a50b0b") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "FPC6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 33.02 166.37 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "bd031f53-3466-4355-a4b5-af9c443d4748") + (property "Reference" "C10" + (at 35.56 165.1062 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 35.56 167.6462 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 33.02 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 33.02 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 33.02 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c9910dd9-e820-446a-9c31-6d667c6caa77") + ) + (pin "2" + (uuid "63f9cafa-d3fd-48d7-bd19-514153475ae6") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "LED:WS2812B") + (at 129.54 95.25 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "bf64c07b-1df2-4e76-b9c6-08424e7573ee") + (property "Reference" "LED7" + (at 140.97 89.7538 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "WS2812B" + (at 140.97 92.2938 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "LED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm" + (at 128.27 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf" + (at 127 85.725 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Description" "RGB LED with integrated controller" + (at 129.54 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "22c06f24-c80e-4055-a76e-67e80ac0ca21") + ) + (pin "4" + (uuid "f9b0044f-e007-4630-9a45-dfbf4cce771d") + ) + (pin "2" + (uuid "1d2387ff-1281-4a66-8daa-ae617d6616ba") + ) + (pin "3" + (uuid "3d72e0ec-2a9e-464d-bc3d-9d00674c65cb") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "LED7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 200.66 -30.48 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c1fc28a9-d2cd-4131-b986-5e432033bc03") + (property "Reference" "C14" + (at 203.2 -31.7438 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 203.2 -29.2038 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 200.66 -30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 200.66 -30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 200.66 -30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1031da00-a857-4666-88b5-22241adb032b") + ) + (pin "2" + (uuid "08291577-fcc1-4984-b700-12f1e75c0a20") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3.3V") + (at 146.05 46.99 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c736745a-3a89-42ad-9f74-9974c1e228f1") + (property "Reference" "#PWR03" + (at 146.05 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3.3V" + (at 146.05 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 146.05 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 146.05 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3.3V\"" + (at 146.05 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f7243ff1-a3e1-4d18-a99f-e4f9be7b777d") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "#PWR03") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Interface_USB:CH340N") + (at 267.97 114.3 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "cb7bf76b-a64d-4f33-90ca-abfcbcae6b2a") + (property "Reference" "U1" + (at 270.1641 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "CH340N" + (at 270.1641 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOP-8_3.9x4.9mm_P1.27mm" + (at 264.16 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://aitendo3.sakura.ne.jp/aitendo_data/product_img/ic/inteface/CH340N/ch340n.pdf" + (at 265.43 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "USB serial converter, 2Mbps, UART, SOP-8" + (at 267.97 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "4" + (uuid "7830a787-1796-4606-8369-4733d3870b32") + ) + (pin "8" + (uuid "135fc3d0-ccbd-4a2e-8106-9f4c0945bf52") + ) + (pin "1" + (uuid "834d0371-29f1-443e-a0c2-9a1df50dd14f") + ) + (pin "5" + (uuid "161b4186-3cab-42b3-87d2-850dade480c4") + ) + (pin "6" + (uuid "e6f1bf3b-5b1a-443e-b28a-9600560d7a33") + ) + (pin "3" + (uuid "b006c2fc-d566-48e5-90bf-cd25211ea7e4") + ) + (pin "7" + (uuid "a6222040-a19b-41eb-a26e-d85f95cfeaa2") + ) + (pin "2" + (uuid "433f577d-8771-4bbc-b02e-ad74994f933c") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "U1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 86.36 175.26 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "cd7a1f28-5442-474a-b9f1-246a6ba5b22e") + (property "Reference" "D9" + (at 86.36 172.212 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 86.36 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 86.36 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 86.36 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 86.36 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 86.36 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 86.36 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a71b4bfa-0420-4e57-9c12-afc8ed2d07a1") + ) + (pin "2" + (uuid "4d4fa39b-7c00-4b15-81cc-93400d05da06") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 85.09 158.75 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "cdbf555f-6336-40b1-ae41-a2339b1adf58") + (property "Reference" "D7" + (at 85.344 155.702 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 85.09 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 85.09 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 85.09 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 85.09 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 85.09 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 85.09 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "51ad0976-bed1-42f7-b773-1418fc1aaee4") + ) + (pin "2" + (uuid "a21c2867-5a41-4064-ac95-49e30a4394b8") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 60.96 189.23 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d2ea97c9-f6bb-410e-8375-8fd67574e3b9") + (property "Reference" "D27" + (at 61.214 185.674 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 60.96 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 60.96 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 60.96 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 60.96 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 60.96 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 60.96 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1bbc5364-5386-42a0-aa4e-c16cfd461996") + ) + (pin "2" + (uuid "34ad04db-3a38-4fb2-951c-cb658377a5b9") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D27") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 251.46 -15.24 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d455e241-eea4-46f7-97d6-de5ebf96ae97") + (property "Reference" "D19" + (at 255.016 -15.24 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 255.27 -15.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 251.46 -15.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 251.46 -15.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 251.46 -15.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 251.46 -15.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 251.46 -15.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "cfeb9bfb-eeab-4d45-933e-4c4b50350486") + ) + (pin "2" + (uuid "f0c12c61-97c9-4c72-bc8a-e4799ef30db7") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D19") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x08_Socket") + (at 80.01 -12.7 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d4635c9a-5615-499a-9556-2f889237f758") + (property "Reference" "FPC4" + (at 81.28 -12.7001 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Conn_01x08_Socket" + (at 81.28 -10.1601 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 80.01 -12.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 80.01 -12.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x08, script generated" + (at 80.01 -12.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "6" + (uuid "6a546696-9167-4720-aa3f-d8fd7c901c57") + ) + (pin "7" + (uuid "7ec9bb67-ff1f-4037-bdc0-b552c2c0ef39") + ) + (pin "8" + (uuid "ac75c34e-fa34-4196-a5c7-356e7ac1d843") + ) + (pin "5" + (uuid "a077afca-dd6f-4a8e-89c5-0dc88b7f7d8a") + ) + (pin "2" + (uuid "4e05a957-45ab-47df-bac5-e8f5521b5b8d") + ) + (pin "4" + (uuid "2b822c07-4a4e-4ff1-87bf-97b4815227fc") + ) + (pin "3" + (uuid "c34e5b8c-154e-407f-af04-5779c7f7b1bf") + ) + (pin "1" + (uuid "9b91673f-3a6c-444f-9dd6-8d4d2f127bce") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "FPC4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Timer_RTC:DS1302Z+") + (at 227.33 -40.64 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d6253fdc-6643-4576-be2d-54208c596266") + (property "Reference" "U4" + (at 241.3 -46.1362 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "DS1302Z+" + (at 241.3 -43.5962 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 240.03 -40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://datasheets.maximintegrated.com/en/ds/DS1302.pdf" + (at 227.33 -40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Trickle-Charge Timekeeping Chip, 2.0V to 5.5V VCC, 0°C to +70°C, SOIC-8" + (at 227.33 -40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "8" + (uuid "270842d7-cbf6-44c7-a9dc-b928c45ff409") + ) + (pin "4" + (uuid "46588bdc-c2c7-4b05-89b2-e057b98d84ce") + ) + (pin "3" + (uuid "cac8b360-4734-428e-8327-669b41b720af") + ) + (pin "1" + (uuid "10c82c28-0481-4a44-ad79-929e6f6aab7c") + ) + (pin "7" + (uuid "4ab3980b-fb25-4cdb-9a28-1af4276dde68") + ) + (pin "6" + (uuid "8853bd57-eb78-4864-9e9f-cd8ae9d8e502") + ) + (pin "5" + (uuid "f35e2ee7-dd2b-43cf-a8cb-88e2e8384dc2") + ) + (pin "2" + (uuid "2ea07a15-51fb-4c8d-8d61-95f135ce730a") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "U4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 68.58 -60.96 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "da271ab4-a51f-4894-932e-1d856e0e81d0") + (property "Reference" "#PWR05" + (at 68.58 -54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 68.58 -54.61 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 68.58 -60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 68.58 -60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 68.58 -60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7209e4b4-312b-46d6-85c3-4ce2e043709d") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "#PWR05") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 160.02 81.28 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "dcf48738-7b89-455e-bc6e-f351645d8701") + (property "Reference" "#PWR04" + (at 160.02 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 160.02 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 160.02 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 160.02 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 160.02 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "78366725-c62c-45e9-b024-9c0bafe2ac05") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "#PWR04") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 31.75 175.26 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "dfb03b55-e25a-4714-89c8-b47aedf1e1ea") + (property "Reference" "C11" + (at 34.29 173.9962 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Small" + (at 34.29 176.5362 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 31.75 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 31.75 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 31.75 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8c25c1d7-a196-42f4-ad46-7990b98f3355") + ) + (pin "2" + (uuid "c033a67c-f60e-49b1-8b52-15b1b268e8f1") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Switch:SW_Push") + (at 166.37 25.4 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e2537a97-cc28-48c8-848b-0b6e168d2fe4") + (property "Reference" "SW1" + (at 166.37 17.78 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Reset Switch" + (at 166.37 20.32 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 166.37 20.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 166.37 20.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Push button switch, generic, two pins" + (at 166.37 25.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "30dedac4-e13b-4a0b-8fe2-887a7e5f027f") + ) + (pin "1" + (uuid "efbc31f3-a2bc-42f7-acdb-011f4000bd96") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "SW1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x08_Socket") + (at 26.67 -13.97 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e856d43a-d502-48c7-8804-2e49c79231d5") + (property "Reference" "FPC3" + (at 27.94 -13.9701 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Conn_01x08_Socket" + (at 27.94 -11.4301 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 26.67 -13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 26.67 -13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x08, script generated" + (at 26.67 -13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "6" + (uuid "bff4a55f-14bf-43c9-b297-3dc350b13d47") + ) + (pin "7" + (uuid "fc463b25-c5e2-48a1-a25a-097e0c44bb6f") + ) + (pin "8" + (uuid "166b084e-a010-434a-be1a-28b9e3f7cc3e") + ) + (pin "5" + (uuid "a699996d-9df5-4f08-8035-edcf5f7d6eb6") + ) + (pin "2" + (uuid "facd2339-ac8a-43af-bf41-8984e8c4f423") + ) + (pin "4" + (uuid "81789639-6ef4-44e3-9a29-d84b278d599f") + ) + (pin "3" + (uuid "fdaf6c6a-9463-4b75-841d-e5bcf3251d0e") + ) + (pin "1" + (uuid "e0e890b5-7f5e-49f4-9fdb-15a96ca0201e") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "FPC3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 161.29 34.29 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "f483e060-9dd1-4b2f-9f73-5283be10bf0a") + (property "Reference" "R1" + (at 163.83 33.0199 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10K" + (at 163.83 35.5599 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "" + (at 163.068 34.29 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 161.29 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 161.29 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "88da1fa1-747f-4221-be1d-b6205a356812") + ) + (pin "1" + (uuid "c329e534-768a-40f2-b2cd-bfd3b476a60b") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "R1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Memory_Flash:AT25SF081-SSHD-X") + (at 208.28 87.63 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "f5e3804e-47ce-422a-ac6c-90d48d9c2ae5") + (property "Reference" "U5" + (at 208.28 97.79 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AT25SF081-SSHD-X" + (at 208.28 100.33 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 193.04 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.adestotech.com/wp-content/uploads/DS-AT25SF081_045.pdf" + (at 208.28 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "8-Mbit, 2.5V Minimum SPI Serial Flash Memory with Dual-I/O and Quad-I/O Support, SOIC-8" + (at 208.28 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "7" + (uuid "e3bce0f4-7d57-4808-ab5d-d804f4879046") + ) + (pin "1" + (uuid "c8815ff8-f2b4-4844-a74a-c59ff0c82376") + ) + (pin "5" + (uuid "884544dc-2776-4404-be1e-20440c2643a4") + ) + (pin "2" + (uuid "910bea05-f4ef-4c2f-ae6a-e434206a5216") + ) + (pin "3" + (uuid "e52f9677-a5e2-4e7f-bd76-2e598db82b1f") + ) + (pin "6" + (uuid "874e7065-7113-43aa-96fa-1b606859eef4") + ) + (pin "4" + (uuid "bfe91ef3-a211-4780-a45e-3eae85c46bb4") + ) + (pin "8" + (uuid "0d4e8c05-a9a0-4990-8d71-0cd835f017b7") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "U5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Diode:SD05_SOD323") + (at 245.11 153.67 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f993ac15-d444-41eb-b574-61438d5af47e") + (property "Reference" "D4" + (at 245.11 150.876 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SD05_SOD323" + (at 245.11 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Diode_SMD:D_0201_0603Metric" + (at 245.11 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.littelfuse.com/~/media/electronics/datasheets/tvs_diode_arrays/littelfuse_tvs_diode_array_sd_c_datasheet.pdf.pdf" + (at 245.11 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "5V, 450W Discrete Bidirectional TVS Diode, SOD-323" + (at 245.11 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "9e777062-4f22-48ff-96d5-5374ba7a443f") + ) + (pin "2" + (uuid "6ee2ee5e-6228-4ced-bf3d-18b963f724ce") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x08_Socket") + (at 43.18 -13.97 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "fa552ab9-d524-472a-80cd-ba2edfd1b029") + (property "Reference" "FPC2" + (at 44.45 -13.9701 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Conn_01x08_Socket" + (at 44.45 -11.4301 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Footprint" "" + (at 43.18 -13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 43.18 -13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x08, script generated" + (at 43.18 -13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "6" + (uuid "8476589e-c06b-4a7c-9a7e-eb43b3965a75") + ) + (pin "7" + (uuid "84c40aa1-2050-4f00-a35c-7da30ea5ef22") + ) + (pin "8" + (uuid "dff75469-f40a-44cc-8c6d-8b64ca856a0f") + ) + (pin "5" + (uuid "bb5b260a-f38e-4313-94f1-a3fb1973cb32") + ) + (pin "2" + (uuid "bd4394f4-e724-4ef4-a315-22e6f6cb6e4f") + ) + (pin "4" + (uuid "40853eb6-dc9b-4524-afec-680f218fe694") + ) + (pin "3" + (uuid "fbfe42ad-4ed2-47bb-91e8-303efa44a3b6") + ) + (pin "1" + (uuid "07fddb3a-f32e-43a8-af67-fa63aa1b6454") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "FPC2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Small") + (at 200.66 140.97 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fd2d4abc-8dd4-4501-8788-abe024663bc2") + (property "Reference" "C5" + (at 200.66 137.16 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "C_Small" + (at 200.6663 137.16 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 200.66 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 200.66 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor, small symbol" + (at 200.66 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3639effd-91d8-41ee-bef6-567874ca5cca") + ) + (pin "2" + (uuid "44e9d361-93ff-4dc4-9eb7-65743801cd88") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "C5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D") + (at 86.36 167.64 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fd8b5c41-27cf-40ef-9fa2-d5f9f0f36bef") + (property "Reference" "D8" + (at 86.36 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "~" + (at 86.36 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 86.36 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 86.36 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 86.36 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 86.36 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 86.36 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "95c4d613-90a3-438e-84ce-7c2d753ad3d9") + ) + (pin "2" + (uuid "9ef82283-b765-435c-b1e5-dd3619d730c0") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "D8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:Crystal") + (at 256.54 83.82 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "fe3fd924-f700-4b4e-8200-55f587564776") + (property "Reference" "X3" + (at 256.54 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Crystal" + (at 256.54 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 256.54 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 256.54 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Two pin crystal" + (at 256.54 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e6e60ee8-94f9-4208-8cd8-662f3eb688fe") + ) + (pin "2" + (uuid "ce7a782a-e1f4-4466-b01d-daf670b5e482") + ) + (instances + (project "Test1" + (path "/ea08b12c-2c1c-4ed5-90cf-379b326169cc" + (reference "X3") + (unit 1) + ) + ) + ) + ) + (sheet_instances + (path "/" + (page "1") + ) + ) +) diff --git a/Hardware NovelLife/NovelLife-SE-SPECTRUM-PCB-Back.jpg b/documentation/Hardware NovelLife SE/NovelLife-SE-SPECTRUM-PCB-Back.jpg similarity index 100% rename from Hardware NovelLife/NovelLife-SE-SPECTRUM-PCB-Back.jpg rename to documentation/Hardware NovelLife SE/NovelLife-SE-SPECTRUM-PCB-Back.jpg diff --git a/Hardware NovelLife/NovelLife-SE-SPECTRUM-PCB-Front.jpg b/documentation/Hardware NovelLife SE/NovelLife-SE-SPECTRUM-PCB-Front.jpg similarity index 100% rename from Hardware NovelLife/NovelLife-SE-SPECTRUM-PCB-Front.jpg rename to documentation/Hardware NovelLife SE/NovelLife-SE-SPECTRUM-PCB-Front.jpg diff --git a/Hardware NovelLife/NovelLife-SE-SPECTRUM-Top.jpg b/documentation/Hardware NovelLife SE/NovelLife-SE-SPECTRUM-Top.jpg similarity index 100% rename from Hardware NovelLife/NovelLife-SE-SPECTRUM-Top.jpg rename to documentation/Hardware NovelLife SE/NovelLife-SE-SPECTRUM-Top.jpg diff --git a/Hardware NovelLife/NovelLife_top.jpg b/documentation/Hardware NovelLife SE/NovelLife_top.jpg similarity index 100% rename from Hardware NovelLife/NovelLife_top.jpg rename to documentation/Hardware NovelLife SE/NovelLife_top.jpg diff --git a/Hardware NovelLife/Novellife_SE.jpg b/documentation/Hardware NovelLife SE/Novellife_SE.jpg similarity index 100% rename from Hardware NovelLife/Novellife_SE.jpg rename to documentation/Hardware NovelLife SE/Novellife_SE.jpg diff --git a/documentation/Hardware PunkCyber IPS/01 - PunkCyber - Box.jpg b/documentation/Hardware PunkCyber IPS/01 - PunkCyber - Box.jpg new file mode 100644 index 0000000..449c553 Binary files /dev/null and b/documentation/Hardware PunkCyber IPS/01 - PunkCyber - Box.jpg differ diff --git a/documentation/Hardware PunkCyber IPS/02 - PunkCyber - Box opened.jpg b/documentation/Hardware PunkCyber IPS/02 - PunkCyber - Box opened.jpg new file mode 100644 index 0000000..598a640 Binary files /dev/null and b/documentation/Hardware PunkCyber IPS/02 - PunkCyber - Box opened.jpg differ diff --git a/documentation/Hardware PunkCyber IPS/03 - PunkCyber - Box content.jpg b/documentation/Hardware PunkCyber IPS/03 - PunkCyber - Box content.jpg new file mode 100644 index 0000000..1d9e0f8 Binary files /dev/null and b/documentation/Hardware PunkCyber IPS/03 - PunkCyber - Box content.jpg differ diff --git a/documentation/Hardware PunkCyber IPS/04 - PunkCyber - Displays.jpg b/documentation/Hardware PunkCyber IPS/04 - PunkCyber - Displays.jpg new file mode 100644 index 0000000..f1be122 Binary files /dev/null and b/documentation/Hardware PunkCyber IPS/04 - PunkCyber - Displays.jpg differ diff --git a/documentation/Hardware PunkCyber IPS/05 - PunkCyber - Device top.jpg b/documentation/Hardware PunkCyber IPS/05 - PunkCyber - Device top.jpg new file mode 100644 index 0000000..67ef07b Binary files /dev/null and b/documentation/Hardware PunkCyber IPS/05 - PunkCyber - Device top.jpg differ diff --git a/documentation/Hardware PunkCyber IPS/06 - PunkCyber - Device bottom.jpg b/documentation/Hardware PunkCyber IPS/06 - PunkCyber - Device bottom.jpg new file mode 100644 index 0000000..7cf3151 Binary files /dev/null and b/documentation/Hardware PunkCyber IPS/06 - PunkCyber - Device bottom.jpg differ diff --git a/documentation/Hardware PunkCyber IPS/07 - PunkCyber - Sideparts and coverplates removed.jpg b/documentation/Hardware PunkCyber IPS/07 - PunkCyber - Sideparts and coverplates removed.jpg new file mode 100644 index 0000000..f4a9a21 Binary files /dev/null and b/documentation/Hardware PunkCyber IPS/07 - PunkCyber - Sideparts and coverplates removed.jpg differ diff --git a/documentation/Hardware PunkCyber IPS/08 - PunkCyber - Screws.jpg b/documentation/Hardware PunkCyber IPS/08 - PunkCyber - Screws.jpg new file mode 100644 index 0000000..d92165e Binary files /dev/null and b/documentation/Hardware PunkCyber IPS/08 - PunkCyber - Screws.jpg differ diff --git a/documentation/Hardware PunkCyber IPS/09 - PunkCyber - Clock front.jpg b/documentation/Hardware PunkCyber IPS/09 - PunkCyber - Clock front.jpg new file mode 100644 index 0000000..40357e8 Binary files /dev/null and b/documentation/Hardware PunkCyber IPS/09 - PunkCyber - Clock front.jpg differ diff --git a/documentation/Hardware PunkCyber IPS/10 - PunkCyber - Clock rear.jpg b/documentation/Hardware PunkCyber IPS/10 - PunkCyber - Clock rear.jpg new file mode 100644 index 0000000..f5e3a5a Binary files /dev/null and b/documentation/Hardware PunkCyber IPS/10 - PunkCyber - Clock rear.jpg differ diff --git a/documentation/Hardware PunkCyber IPS/11 - PunkCyber - PCB bottom.jpg b/documentation/Hardware PunkCyber IPS/11 - PunkCyber - PCB bottom.jpg new file mode 100644 index 0000000..187ae41 Binary files /dev/null and b/documentation/Hardware PunkCyber IPS/11 - PunkCyber - PCB bottom.jpg differ diff --git a/documentation/Hardware PunkCyber IPS/12 - PunkCyber - PCB top.jpg b/documentation/Hardware PunkCyber IPS/12 - PunkCyber - PCB top.jpg new file mode 100644 index 0000000..112159c Binary files /dev/null and b/documentation/Hardware PunkCyber IPS/12 - PunkCyber - PCB top.jpg differ diff --git a/documentation/Hardware PunkCyber IPS/Hardware modification - Missing CH340 chip.md b/documentation/Hardware PunkCyber IPS/Hardware modification - Missing CH340 chip.md new file mode 100644 index 0000000..8d46afc --- /dev/null +++ b/documentation/Hardware PunkCyber IPS/Hardware modification - Missing CH340 chip.md @@ -0,0 +1,3 @@ +#### PunkCyber IPS clock: No CH340 chip soldered on PCB of newer editions + +See the "Hardware modifications" section in the `README.md` in the root of this repo. diff --git a/Hardware PUNKCYBER IPS CLOCK (pcbway)/Numbers reversed (new - different hardware).url b/documentation/Hardware PunkCyber IPS/Issue 62 - Numbers reversed (new - different hardware).url similarity index 100% rename from Hardware PUNKCYBER IPS CLOCK (pcbway)/Numbers reversed (new - different hardware).url rename to documentation/Hardware PunkCyber IPS/Issue 62 - Numbers reversed (new - different hardware).url diff --git a/Hardware PUNKCYBER IPS CLOCK (pcbway)/still_from_the_video.PNG b/documentation/Hardware PunkCyber IPS/captured_frame_from_the_fake-ad-video.png similarity index 100% rename from Hardware PUNKCYBER IPS CLOCK (pcbway)/still_from_the_video.PNG rename to documentation/Hardware PunkCyber IPS/captured_frame_from_the_fake-ad-video.png diff --git a/Hardware PUNKCYBER IPS CLOCK (pcbway)/original firmware.url b/documentation/Hardware PunkCyber IPS/original firmware.url similarity index 100% rename from Hardware PUNKCYBER IPS CLOCK (pcbway)/original firmware.url rename to documentation/Hardware PunkCyber IPS/original firmware.url diff --git a/Hardware PUNKCYBER IPS CLOCK (pcbway)/pic_bottom.jpg b/documentation/Hardware PunkCyber IPS/pic_bottom.jpg similarity index 100% rename from Hardware PUNKCYBER IPS CLOCK (pcbway)/pic_bottom.jpg rename to documentation/Hardware PunkCyber IPS/pic_bottom.jpg diff --git a/Hardware PUNKCYBER IPS CLOCK (pcbway)/pic_top.jpg b/documentation/Hardware PunkCyber IPS/pic_top.jpg similarity index 100% rename from Hardware PUNKCYBER IPS CLOCK (pcbway)/pic_top.jpg rename to documentation/Hardware PunkCyber IPS/pic_top.jpg diff --git a/Hardware PUNKCYBER IPS CLOCK (pcbway)/seller RGB Glow Tube DIY Clock - PCBWay.url b/documentation/Hardware PunkCyber IPS/seller RGB Glow Tube DIY Clock - PCBWay.url similarity index 100% rename from Hardware PUNKCYBER IPS CLOCK (pcbway)/seller RGB Glow Tube DIY Clock - PCBWay.url rename to documentation/Hardware PunkCyber IPS/seller RGB Glow Tube DIY Clock - PCBWay.url diff --git a/Hardware SI HAI clock (chinese copy)/1 bottom mirror.jpg b/documentation/Hardware SI HAI/1 bottom mirror.jpg similarity index 100% rename from Hardware SI HAI clock (chinese copy)/1 bottom mirror.jpg rename to documentation/Hardware SI HAI/1 bottom mirror.jpg diff --git a/Hardware SI HAI clock (chinese copy)/1 bottom.jpg b/documentation/Hardware SI HAI/1 bottom.jpg similarity index 100% rename from Hardware SI HAI clock (chinese copy)/1 bottom.jpg rename to documentation/Hardware SI HAI/1 bottom.jpg diff --git a/Hardware SI HAI clock (chinese copy)/2 top.jpg b/documentation/Hardware SI HAI/2 top.jpg similarity index 100% rename from Hardware SI HAI clock (chinese copy)/2 top.jpg rename to documentation/Hardware SI HAI/2 top.jpg diff --git a/Hardware SI HAI clock (chinese copy)/3 top A.jpg b/documentation/Hardware SI HAI/3 top A.jpg similarity index 100% rename from Hardware SI HAI clock (chinese copy)/3 top A.jpg rename to documentation/Hardware SI HAI/3 top A.jpg diff --git a/Hardware SI HAI clock (chinese copy)/4 top B.jpg b/documentation/Hardware SI HAI/4 top B.jpg similarity index 100% rename from Hardware SI HAI clock (chinese copy)/4 top B.jpg rename to documentation/Hardware SI HAI/4 top B.jpg diff --git a/Hardware SI HAI clock (chinese copy)/5 top C.jpg b/documentation/Hardware SI HAI/5 top C.jpg similarity index 100% rename from Hardware SI HAI clock (chinese copy)/5 top C.jpg rename to documentation/Hardware SI HAI/5 top C.jpg diff --git a/Hardware SI HAI clock (chinese copy)/5158661573495959139.png b/documentation/Hardware SI HAI/5158661573495959139.png similarity index 100% rename from Hardware SI HAI clock (chinese copy)/5158661573495959139.png rename to documentation/Hardware SI HAI/5158661573495959139.png diff --git a/Hardware SI HAI clock (chinese copy)/6 bot.jpg b/documentation/Hardware SI HAI/6 bot.jpg similarity index 100% rename from Hardware SI HAI clock (chinese copy)/6 bot.jpg rename to documentation/Hardware SI HAI/6 bot.jpg diff --git a/Hardware SI HAI clock (chinese copy)/8754011573496799881.png b/documentation/Hardware SI HAI/8754011573496799881.png similarity index 100% rename from Hardware SI HAI clock (chinese copy)/8754011573496799881.png rename to documentation/Hardware SI HAI/8754011573496799881.png diff --git a/Hardware SI HAI clock (chinese copy)/DS1302.pdf b/documentation/Hardware SI HAI/DS1302.pdf similarity index 100% rename from Hardware SI HAI clock (chinese copy)/DS1302.pdf rename to documentation/Hardware SI HAI/DS1302.pdf diff --git a/Hardware SI HAI clock (chinese copy)/Display back.jpg b/documentation/Hardware SI HAI/Display back.jpg similarity index 100% rename from Hardware SI HAI clock (chinese copy)/Display back.jpg rename to documentation/Hardware SI HAI/Display back.jpg diff --git a/Hardware SI HAI clock (chinese copy)/Display back_edit.png b/documentation/Hardware SI HAI/Display back_edit.png similarity index 100% rename from Hardware SI HAI clock (chinese copy)/Display back_edit.png rename to documentation/Hardware SI HAI/Display back_edit.png diff --git a/Hardware SI HAI clock (chinese copy)/Display front.jpg b/documentation/Hardware SI HAI/Display front.jpg similarity index 100% rename from Hardware SI HAI clock (chinese copy)/Display front.jpg rename to documentation/Hardware SI HAI/Display front.jpg diff --git a/Hardware SI HAI clock (chinese copy)/ESP pins.svg b/documentation/Hardware SI HAI/ESP pins.svg similarity index 100% rename from Hardware SI HAI clock (chinese copy)/ESP pins.svg rename to documentation/Hardware SI HAI/ESP pins.svg diff --git a/Hardware SI HAI clock (chinese copy)/Testing.docx b/documentation/Hardware SI HAI/Testing.docx similarity index 100% rename from Hardware SI HAI clock (chinese copy)/Testing.docx rename to documentation/Hardware SI HAI/Testing.docx diff --git a/Hardware SI HAI clock (chinese copy)/Universal IPS Display Breakout Board - Hackaday.io.url b/documentation/Hardware SI HAI/Universal IPS Display Breakout Board - Hackaday.io.url similarity index 100% rename from Hardware SI HAI clock (chinese copy)/Universal IPS Display Breakout Board - Hackaday.io.url rename to documentation/Hardware SI HAI/Universal IPS Display Breakout Board - Hackaday.io.url diff --git a/Hardware SI HAI clock (chinese copy)/reverse board.txt b/documentation/Hardware SI HAI/reverse board.txt similarity index 100% rename from Hardware SI HAI clock (chinese copy)/reverse board.txt rename to documentation/Hardware SI HAI/reverse board.txt diff --git a/Hardware pinout.xlsx b/documentation/Hardware pinout.xlsx similarity index 100% rename from Hardware pinout.xlsx rename to documentation/Hardware pinout.xlsx diff --git a/Photos/Clock_Smartnest_IoT.jpg b/documentation/ImagesMD/Clock_Smartnest_IoT.jpg similarity index 100% rename from Photos/Clock_Smartnest_IoT.jpg rename to documentation/ImagesMD/Clock_Smartnest_IoT.jpg diff --git a/documentation/ImagesMD/EleksTube_Gen2_PCB.jpg b/documentation/ImagesMD/EleksTube_Gen2_PCB.jpg new file mode 100644 index 0000000..fd799d4 Binary files /dev/null and b/documentation/ImagesMD/EleksTube_Gen2_PCB.jpg differ diff --git a/Hardware modification/CH340C_mod.jpg b/documentation/ImagesMD/EleksTube_IPS_CH340C_mod.jpg similarity index 100% rename from Hardware modification/CH340C_mod.jpg rename to documentation/ImagesMD/EleksTube_IPS_CH340C_mod.jpg diff --git a/Photos/Clock1.jpg b/documentation/ImagesMD/EleksTube_IPS_Classic_Edition.jpg similarity index 100% rename from Photos/Clock1.jpg rename to documentation/ImagesMD/EleksTube_IPS_Classic_Edition.jpg diff --git a/Photos/EleksTube_original_PCB.jpg b/documentation/ImagesMD/EleksTube_original_PCB.jpg similarity index 100% rename from Photos/EleksTube_original_PCB.jpg rename to documentation/ImagesMD/EleksTube_original_PCB.jpg diff --git a/documentation/ImagesMD/IPSTUBE_H401_PCB.jpg b/documentation/ImagesMD/IPSTUBE_H401_PCB.jpg new file mode 100644 index 0000000..701447d Binary files /dev/null and b/documentation/ImagesMD/IPSTUBE_H401_PCB.jpg differ diff --git a/documentation/ImagesMD/IPSTUBE_H402_PCB.jpg b/documentation/ImagesMD/IPSTUBE_H402_PCB.jpg new file mode 100644 index 0000000..5e22ce3 Binary files /dev/null and b/documentation/ImagesMD/IPSTUBE_H402_PCB.jpg differ diff --git a/Photos/NovelLife_SE.jpg b/documentation/ImagesMD/NovelLife_SE.jpg similarity index 100% rename from Photos/NovelLife_SE.jpg rename to documentation/ImagesMD/NovelLife_SE.jpg diff --git a/documentation/ImagesMD/PlatformIOBuild.png b/documentation/ImagesMD/PlatformIOBuild.png new file mode 100644 index 0000000..7d4a481 Binary files /dev/null and b/documentation/ImagesMD/PlatformIOBuild.png differ diff --git a/documentation/ImagesMD/PlatformIOBuildFilesystem.png b/documentation/ImagesMD/PlatformIOBuildFilesystem.png new file mode 100644 index 0000000..dcaa935 Binary files /dev/null and b/documentation/ImagesMD/PlatformIOBuildFilesystem.png differ diff --git a/documentation/ImagesMD/PlatformIOBuildOutput.png b/documentation/ImagesMD/PlatformIOBuildOutput.png new file mode 100644 index 0000000..b60343e Binary files /dev/null and b/documentation/ImagesMD/PlatformIOBuildOutput.png differ diff --git a/documentation/ImagesMD/PlatformIOUploadOutput.png b/documentation/ImagesMD/PlatformIOUploadOutput.png new file mode 100644 index 0000000..44047e9 Binary files /dev/null and b/documentation/ImagesMD/PlatformIOUploadOutput.png differ diff --git a/documentation/ImagesMD/PunkCyber_IPS_clock_PCB.jpg b/documentation/ImagesMD/PunkCyber_IPS_clock_PCB.jpg new file mode 100644 index 0000000..954346c Binary files /dev/null and b/documentation/ImagesMD/PunkCyber_IPS_clock_PCB.jpg differ diff --git a/documentation/ImagesMD/PunkCyber_PCB_CH340_header.jpg b/documentation/ImagesMD/PunkCyber_PCB_CH340_header.jpg new file mode 100644 index 0000000..004f8c8 Binary files /dev/null and b/documentation/ImagesMD/PunkCyber_PCB_CH340_header.jpg differ diff --git a/documentation/ImagesMD/PunkCyber_connected_UART-USB_bridge_and_reset_button.jpg b/documentation/ImagesMD/PunkCyber_connected_UART-USB_bridge_and_reset_button.jpg new file mode 100644 index 0000000..5a394b7 Binary files /dev/null and b/documentation/ImagesMD/PunkCyber_connected_UART-USB_bridge_and_reset_button.jpg differ diff --git a/documentation/ImagesMD/PunkCyber_soldered_sockets.jpg b/documentation/ImagesMD/PunkCyber_soldered_sockets.jpg new file mode 100644 index 0000000..7044d12 Binary files /dev/null and b/documentation/ImagesMD/PunkCyber_soldered_sockets.jpg differ diff --git a/documentation/ImagesMD/PunkCyber_soldered_sockets_with_backplate.jpg b/documentation/ImagesMD/PunkCyber_soldered_sockets_with_backplate.jpg new file mode 100644 index 0000000..c571c0d Binary files /dev/null and b/documentation/ImagesMD/PunkCyber_soldered_sockets_with_backplate.jpg differ diff --git a/Photos/SI_HAI_ips_clock.jpg b/documentation/ImagesMD/SI_HAI_ips_clock.jpg similarity index 100% rename from Photos/SI_HAI_ips_clock.jpg rename to documentation/ImagesMD/SI_HAI_ips_clock.jpg diff --git a/documentation/ImagesMD/WindowsDeviceManagerCOMport.png b/documentation/ImagesMD/WindowsDeviceManagerCOMport.png new file mode 100644 index 0000000..f6c2515 Binary files /dev/null and b/documentation/ImagesMD/WindowsDeviceManagerCOMport.png differ diff --git "a/NTP time info/Adding Validity-Checks for incoming packets by Chritzel \302\267 Pull Request #28 \302\267 arduino-libraries-NTPClient.url" "b/documentation/NTP time info/Adding Validity-Checks for incoming packets by Chritzel \302\267 Pull Request #28 \302\267 arduino-libraries-NTPClient.url" similarity index 100% rename from "NTP time info/Adding Validity-Checks for incoming packets by Chritzel \302\267 Pull Request #28 \302\267 arduino-libraries-NTPClient.url" rename to "documentation/NTP time info/Adding Validity-Checks for incoming packets by Chritzel \302\267 Pull Request #28 \302\267 arduino-libraries-NTPClient.url" diff --git a/NTP time info/NTP Data description.txt b/documentation/NTP time info/NTP Data description.txt similarity index 100% rename from NTP time info/NTP Data description.txt rename to documentation/NTP time info/NTP Data description.txt diff --git a/NTP time info/ntp4.pdf b/documentation/NTP time info/ntp4.pdf similarity index 100% rename from NTP time info/ntp4.pdf rename to documentation/NTP time info/ntp4.pdf diff --git a/pre-built-firmware/README.md b/pre-built-firmware/README.md index 5040840..af047fc 100644 --- a/pre-built-firmware/README.md +++ b/pre-built-firmware/README.md @@ -1,33 +1,63 @@ # EleksTubeHAX - An aftermarket custom firmware for the desk clock -![EleksTube IPS clock](/Photos/Clock1.jpg) -Supported hardware models: -### "EleksTube IPS clock", "SI HAI IPS clock", "NovelLife SE clock", "PunkCyber clock", "RGB Glow Tube DIY clock" +## Pre-built firmware files -In this folder you can find pre-built firmware images that you can upload to your clock. +In this folder you can find pre-built firmware image files that you can directly upload to your clock. -Note that these firmwares may have limited functionality. +These firmwares may have limited functionality compared to a self-built firmware, because not all available features are enabled or can be pre-configured. -## Enabled functions: -- WPS connectivity (press WPS button on your router for WiFi setup). -- DEBUG_OUTPUT - it will produce diagnostic messages on the serial port. -- DCORE_DEBUG_LEVEL=5 - it will produce diagnostic messages from the operating system. -- Night time from 22h in the evening to 7h in the morning. -- No geolocation (time zone & DST must be set manually). -- No MQTT (without remote control). -- No thermometer. -- Image files are fixed and can't be changed without development tools. +These image files are fixed and can't be changed without development tools! -### Select appropriate .bin file that fits your hardware and upload it using the `_ESP32 write flash.cmd` file. -Available files: -- original Elekstube clock - `FW_Elekstube_HAX_1.0_original.bin` -- original Elekstube clock Gen2.1 (ESP32 Pico D4 Chip) - `FW_Elekstube_HAX_1.0_Gen2-1.bin` -- SI HAI copy of the clock - `FW_SI_HAI_CLOCK_HAX_1.0.bin` -- NovelLife SE version (non-SE not tested) - `FW_NovelLife_SE_HAX_1.0.bin` -- PunkCyber / RGB Glow tube / PCBway clock - `FW_PunkCyber_Glow_PCBway_HAX_1.0.bin` +## Pre-configured functionality -Make sure to edit it and write correct COM port and file name into it before running. +- WiFi connectivity via WPS (While clock is in boot phase, press WPS button on your router for WiFi setup). +- Night time dimming enabled - from 22:00h (10 pm) in the evening to 07:00h (7 am) in the morning. +- IP-based geolocation disabled - time zone & DST must be set manually via the clocks menu. +- MQTT disabled - no 'remote control'. +- External thermometer sensor disabled. +- DEBUG_OUTPUT enabled - This produces diagnostic messages from the firmware over the serial port. +- DCORE_DEBUG_LEVEL=5 - This produces diagnostic messages from the ESP32 operating system in case of an error over the serial port. -## Save your original firmware using the `_ESP32 save flash 4MB.cmd` before tinkering. +### Available image files -## There is no warranty of any type. +| clock model | firmware image file | +|--|--| +| EleksTube IPS - Orginal Version | `FW_Elekstube_HAX_1.0_original.bin` | +| EleksTube IPS - Gen2 models | `FW_Elekstube_HAX_1.0_Gen2-1.bin` | +| SI HAI IPS | `FW_SI_HAI_CLOCK_HAX_1.0.bin` | +| NovelLife SE version | `FW_NovelLife_SE_HAX_1.0.bin` | +| PunkCyber/RGB Glow Tube DIY | `FW_PunkCyber_Glow_PCBway_HAX_1.0.bin` | +| IPSTUBE - Model H401 | TBD | + +Note: All "Original" EleksTube clocks, sold after July 2022 are "Gen2" versions. See [Note on EleksTube website](https://elekstube.com/blogs/news/instructions-on-elekstube-clock-for-gen2-systems). But always check the PCB version of your clock! + +## Backup your original firmware + +**Always backup YOUR clocks firmware version as first step!** + +Note for original EleksTube clocks: Backup images from other users **DO NOT WORK** as the original EleksTube firmware is locked to the MAC address of the ESP32. + +For other clocks it MAY work, but don't assume it! + +Save your original firmware using the `_ESP32 save flash 4MB.cmd` (or 8MB version for the IPSTUBE) by changing the COM port to the number, your clock uses. + +Rename and store the `backup1.bin` on a save location. + +See also the section "Backup first" and following in the `README.MD` file in the root. + +## Write the EleksTubeHAX firmware file + +- Choose the right pre-built firmware file for your clock. +- Edit the file `_ESP32 write flash.cmd` with an editor. +- Write the correct COM port of your clock. +- Write the correct firmware file name for your clock. +- Run the CMD file. + +Note: Most clocks will go into to the "download mode" automatically when esptool is trying to write to it. +Some clocks needs a button pressed while the powering phase (plugging the USB cable) to enter this mode, like the IPSTUBE ones. + +## There is no warranty of any type + +Use at your own risk! + +If you mess-up your clock, it's only your fault! diff --git a/pre-built-firmware/_ESP32 save flash 8MB.cmd b/pre-built-firmware/_ESP32 save flash 8MB.cmd new file mode 100644 index 0000000..7eaeaf9 --- /dev/null +++ b/pre-built-firmware/_ESP32 save flash 8MB.cmd @@ -0,0 +1,2 @@ +esptool --port COM12 --baud 921600 read_flash 0x000000 0x800000 backup1.bin +pause