├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── bom ├── clock-face │ └── clock-face-bom.csv └── logic-board │ └── logic-board-bom.csv ├── nixie_clock_code ├── .vscode │ └── c_cpp_properties.json ├── CMakeLists.txt ├── Makefile ├── README.md └── main │ ├── CMakeLists.txt │ ├── Kconfig.projbuild │ ├── clock.c │ ├── clock.css │ ├── clock.html │ ├── clock.js │ ├── component.mk │ ├── compress.bat │ ├── display.c │ ├── ds3231.c │ ├── http_client.c │ ├── i2c.c │ ├── include │ ├── clock.h │ ├── display.h │ ├── ds3231.h │ ├── http_client.h │ ├── i2c.h │ ├── list.h │ ├── webapp.h │ └── ws2812.h │ ├── iro.js │ ├── iro.min.js │ ├── iro.min.js.gz │ ├── list.c │ ├── main.c │ ├── settings.png │ ├── timezones.json │ ├── webapp.c │ └── ws2812.c ├── pcb ├── README.md ├── clock-face │ ├── esp32-nixie-clock-face-bottom-render.png │ ├── esp32-nixie-clock-face-bottom-render.svg │ ├── esp32-nixie-clock-face-top-render.png │ ├── esp32-nixie-clock-face-top-render.svg │ └── gerber │ │ ├── Through.drl │ │ ├── top-clock-face.BoardOutline.gbr │ │ ├── top-clock-face.Bottom.gbr │ │ ├── top-clock-face.BottomAssy.gbr │ │ ├── top-clock-face.BottomDimension.gbr │ │ ├── top-clock-face.BottomMask.gbr │ │ ├── top-clock-face.BottomPaste.gbr │ │ ├── top-clock-face.BottomSilk.gbr │ │ ├── top-clock-face.Top.gbr │ │ ├── top-clock-face.TopAssy.gbr │ │ ├── top-clock-face.TopDimension.gbr │ │ ├── top-clock-face.TopMask.gbr │ │ ├── top-clock-face.TopPaste.gbr │ │ └── top-clock-face.TopSilk.gbr └── logic-board │ ├── esp32-nixie-clock-logic-board-bottom-render.png │ ├── esp32-nixie-clock-logic-board-top-render.png │ └── gerber │ ├── Through.drl │ ├── clock-logic-board.Board.gbr │ ├── clock-logic-board.BoardOutline.gbr │ ├── clock-logic-board.Bottom.gbr │ ├── clock-logic-board.BottomAssy.gbr │ ├── clock-logic-board.BottomDimension.gbr │ ├── clock-logic-board.BottomMask.gbr │ ├── clock-logic-board.BottomPaste.gbr │ ├── clock-logic-board.BottomSilk.gbr │ ├── clock-logic-board.Top.gbr │ ├── clock-logic-board.TopAssy.gbr │ ├── clock-logic-board.TopDimension.gbr │ ├── clock-logic-board.TopMask.gbr │ ├── clock-logic-board.TopPaste.gbr │ └── clock-logic-board.TopSilk.gbr ├── pictures ├── clock-face-assembled-1024.jpg ├── face-clock-wip.jpg ├── logic-board-assembled-1024.jpg ├── nixie-clock-coffee-table-1024.jpg ├── nixie-clock-front-1024.jpg ├── webapp-screenshot-1.png ├── webapp-screenshot-2.png ├── webapp-screenshot-3.png ├── webapp-screenshot-small-1.png ├── webapp-screenshot-small-2.png └── webapp-screenshot-small-3.png └── schematics ├── clock-face ├── clock-face-schematics-sheet-1.png ├── clock-face-schematics-sheet-2.png ├── clock-face-schematics-sheet-3.png ├── clock-face-schematics-sheet-4.png └── clock-face-schematics.pdf └── logic-board ├── Nixie-Clock-Logic-Board-revB.dch ├── logic-board-schematics-sheet-1.png ├── logic-board-schematics-sheet-2.png ├── logic-board-schematics-sheet-3.png ├── logic-board-schematics-sheet-4.png └── logic-board-schematics.pdf /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Object files 5 | *.o 6 | *.ko 7 | *.obj 8 | *.elf 9 | 10 | # Linker output 11 | *.ilk 12 | *.map 13 | *.exp 14 | 15 | # Precompiled Headers 16 | *.gch 17 | *.pch 18 | 19 | # Libraries 20 | *.lib 21 | *.a 22 | *.la 23 | *.lo 24 | 25 | # Shared objects (inc. Windows DLLs) 26 | *.dll 27 | *.so 28 | *.so.* 29 | *.dylib 30 | 31 | # Executables 32 | *.exe 33 | *.out 34 | *.app 35 | *.i*86 36 | *.x86_64 37 | *.hex 38 | 39 | # Debug files 40 | *.dSYM/ 41 | *.su 42 | *.idb 43 | *.pdb 44 | 45 | # Kernel Module Compile Results 46 | *.mod* 47 | *.cmd 48 | .tmp_versions/ 49 | modules.order 50 | Module.symvers 51 | Mkfile.old 52 | dkms.conf 53 | 54 | # Eclipse 55 | .metadata/ 56 | RemoteSystemsTempFiles/.project 57 | .settings/ 58 | nixie_clock_code/build/ 59 | nixie_clock_code/build/* 60 | nixie_clock_code/build/app_update/ 61 | nixie_clock_code/build/aws_iot/ 62 | *.a 63 | *.o 64 | *.d 65 | nixie_clock_code/.cproject 66 | nixie_clock_code/.project 67 | nixie_clock_code/sdkconfig* 68 | nixie_clock_code/main/build/ 69 | nixie_clock_code/main/build/* 70 | 71 | #doxygen 72 | Doxyfile 73 | nixie_clock_code/doc/ 74 | 75 | nixie_clock_code/.vscode/settings.json 76 | nixie_clock_code/components/update.sh 77 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "nixie_clock_code/components/esp32-wifi-manager"] 2 | path = nixie_clock_code/components/esp32-wifi-manager 3 | url = https://github.com/tonyp7/esp32-wifi-manager 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # esp32-nixie-clock 2 | 3 | A smart nixie clock capable of automatically setting time and adjusting for timezones / summer time transitions. 4 | 5 | ![Clock face](https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/master/pictures/nixie-clock-front-1024.jpg) 6 | 7 | # Features 8 | 9 | **Smart** 10 | 11 | - Time is set automatically through a web API 12 | - A webapp is provided to adjust wifi settings, timezone, backlights and display sleeping times 13 | 14 | The wifi settings are managed by [esp32-wifi-manager](https://github.com/tonyp7/esp32-wifi-manager). 15 | 16 |

17 | 18 | 19 | 20 |

21 | 22 | **A modern dispay driver** 23 | 24 | - SPI based driver 25 | - No multiplexing of nixies 26 | - No relying on old nixie drivers 27 | 28 | Each pin is fully driven by its individual 300V NPN transistor. 29 | 30 | **A robust high voltage converter** 31 | 32 | - A modern flyback converter with top of the line controller 33 | - No 555, no old 34063 trickery 34 | 35 | The nixie clock is powered by a LT3757 controller and a big 1:10 transformer. The design can be found [here](https://github.com/tonyp7/170v-nixie-power-supply). The last thing you need is for your clock to catch fire! 36 | 37 | # Repository structure 38 | 39 | - bom: Bill of Materials for the PCBs 40 | - nixie_clock_code: An esp-idf project to compile and flash on an ESP32 41 | - pcb: PCB source files and renders for the clock 42 | - pictures: A placeholder for the pictures you are seeing in this readme file 43 | - schematics: Electronics schematics for the clock 44 | 45 | # Photos 46 | 47 | ### Clock in its environment 48 | ![Nixie Clock](https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/master/pictures/nixie-clock-coffee-table-1024.jpg) 49 | 50 | ### The clock face PCB 51 | ![Clock face PCB](https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/master/pictures/clock-face-assembled-1024.jpg) 52 | 53 | ### The logic board PCB 54 | ![Logic board PCB PCB](https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/master/pictures/logic-board-assembled-1024.jpg) 55 | 56 | -------------------------------------------------------------------------------- /bom/clock-face/clock-face-bom.csv: -------------------------------------------------------------------------------- 1 | RefDes,Description,Package,Quantity,Manufacturer,Manufacturer Part Number 2 | "C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14",100nF 0603 50V X7R,0603,12,Yageo,CC0603KRX7R9BB104 3 | "N1, N2, N3, N4",??C-1 Nixie Tube,THT,4,Reflector (Sovtek),INS-1 4 | "NX1, NX2, NX3, NX4, NX5, NX6",??-12A Nixie Tube,THT,6,Reflector (Sovtek),IN-12A 5 | "Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15, Q16, Q17, Q18, Q19, Q20, Q21, Q22, Q23, Q24, Q25, Q26, Q27, Q28, Q29, Q30, Q31, Q32, Q33, Q34, Q35, Q36, Q37, Q38, Q39, Q40, Q41, Q42, Q43, Q44, Q45, Q46, Q47, Q48, Q49, Q50, Q51, Q52, Q53, Q54, Q55, Q56, Q57, Q58, Q59, Q60, Q61, Q62, Q63, Q64",Bipolar (BJT) Transistor NPN 300V 500mA 50MHz 240mW Surface Mount SOT-23-3,SOT-23-3,64,ON Semiconductor,MMBTA42 6 | "R1, R2, R3, R4, R5, R6",20k 1206 1/4W 1%,1206,6,Yageo,RC1206FR-0720KL 7 | "R7, R8, R9, R10",100k 1206 1/4W 1%,1206,2,Yageo,RC1206FR-07100KL 8 | "R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31, R32, R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43, R44, R45, R46, R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R59, R60, R61, R62, R63, R64, R65, R66, R67, R68, R69, R70, R71, R72, R73, R74",20K 0603 1%,0603,64,Yageo,RC0603FR-0720KL 9 | "U1, U2, U3, U4, U5, U6, U7, U8, U9, U10, U11, U12",SNx4HC595 8-Bit Shift Registers,SOIC-16,12,Texas Instruments,SN74HC595D 10 | -------------------------------------------------------------------------------- /bom/logic-board/logic-board-bom.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/bom/logic-board/logic-board-bom.csv -------------------------------------------------------------------------------- /nixie_clock_code/.vscode/c_cpp_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "Linux", 5 | "cStandard": "c11", 6 | "cppStandard": "c++17", 7 | "includePath": [ 8 | "${config:idf.espIdfPath}/components/**", 9 | "${config:idf.espIdfPathWin}/components/**", 10 | "${workspaceFolder}/**", 11 | "${workspaceFolder}/main/include/**" 12 | ], 13 | "browse": { 14 | "path": [ 15 | "${config:idf.espIdfPath}/components", 16 | "${config:idf.espIdfPathWin}/components", 17 | "${workspaceFolder}" 18 | ], 19 | "limitSymbolsToIncludedHeaders": false 20 | }, 21 | "compileCommands": "${workspaceFolder}/build/compile_commands.json" 22 | } 23 | ], 24 | "version": 4 25 | } -------------------------------------------------------------------------------- /nixie_clock_code/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # The following lines of boilerplate have to be in your project's 2 | # CMakeLists in this exact order for cmake to work correctly 3 | cmake_minimum_required(VERSION 3.5) 4 | 5 | include($ENV{IDF_PATH}/tools/cmake/project.cmake) 6 | set(EXTRA_COMPONENT_DIRS components/) 7 | project(nixieclock) -------------------------------------------------------------------------------- /nixie_clock_code/Makefile: -------------------------------------------------------------------------------- 1 | # 2 | # This is a project Makefile. It is assumed the directory this Makefile resides in is a 3 | # project subdirectory. 4 | # 5 | 6 | PROJECT_NAME := nixie_clock_code 7 | 8 | include $(IDF_PATH)/make/project.mk 9 | 10 | -------------------------------------------------------------------------------- /nixie_clock_code/README.md: -------------------------------------------------------------------------------- 1 | # Firmware for the esp32 2 | 3 | This folder contains an esp-idf project for the esp32 powering the clock. 4 | 5 | esp-idf 4.2+ is required to compile this code. 6 | -------------------------------------------------------------------------------- /nixie_clock_code/main/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | idf_component_register( 2 | SRCS "list.c" "webapp.c" "main.c" "ws2812.c" "i2c.c" "display.c" "clock.c" "ds3231.c" "http_client.c" "webapp.c" "list.c" 3 | INCLUDE_DIRS "" "include" 4 | EMBED_FILES clock.js iro.js clock.css clock.html timezones.json 5 | ) 6 | -------------------------------------------------------------------------------- /nixie_clock_code/main/Kconfig.projbuild: -------------------------------------------------------------------------------- 1 | menu "Clock Configuration" 2 | 3 | config CLOCK_TASK_PRIORITY 4 | int "RTOS Task Priority for the clock" 5 | default 10 6 | help 7 | Defines the task priority of the clock (main task). This should be the highest priority task unless very specific reason 8 | 9 | endmenu 10 | 11 | menu "Wifi Manager Configuration" 12 | 13 | config WIFI_MANAGER_TASK_PRIORITY 14 | int "RTOS Task Priority for the wifi_manager" 15 | default 5 16 | help 17 | Tasks spawn by the manager will have a priority of WIFI_MANAGER_TASK_PRIORITY-1. For this particular reason, minimum recommended task priority is 2. 18 | 19 | config WIFI_MANAGER_MAX_RETRY 20 | int "Max Retry on failed connection" 21 | default 2 22 | help 23 | Defines when a connection is lost/attempt to connect is made, how many retries should be made before giving up. 24 | 25 | config DEFAULT_AP_SSID 26 | string "Access Point SSID" 27 | default "esp32" 28 | help 29 | SSID (network name) the the esp32 will broadcast. 30 | 31 | config DEFAULT_AP_PASSWORD 32 | string "Access Point Password" 33 | default "esp32pwd" 34 | help 35 | Password used for the Access Point. Leave empty and set AUTH MODE to WIFI_AUTH_OPEN for no password. 36 | 37 | config DEFAULT_AP_CHANNEL 38 | int "Access Point WiFi Channel" 39 | default 1 40 | help 41 | Be careful you might not see the access point if you use a channel not allowed in your country. 42 | 43 | config DEFAULT_AP_IP 44 | string "Access Point IP Address" 45 | default "10.10.0.1" 46 | help 47 | This is used for the redirection to the captive portal. It is recommended to leave unchanged. 48 | 49 | config DEFAULT_AP_GATEWAY 50 | string "Access Point IP Gateway" 51 | default "10.10.0.1" 52 | help 53 | This is used for the redirection to the captive portal. It is recommended to leave unchanged. 54 | 55 | config DEFAULT_AP_NETMASK 56 | string "Access Point Netmask" 57 | default "255.255.255.0" 58 | help 59 | This is used for the redirection to the captive portal. It is recommended to leave unchanged. 60 | 61 | config DEFAULT_AP_MAX_CONNECTIONS 62 | int "Access Point Max Connections" 63 | default 4 64 | help 65 | Max is 4. 66 | 67 | config DEFAULT_AP_BEACON_INTERVAL 68 | int "Access Point Beacon Interval (ms)" 69 | default 100 70 | help 71 | 100ms is the recommended default. 72 | 73 | endmenu 74 | -------------------------------------------------------------------------------- /nixie_clock_code/main/clock.css: -------------------------------------------------------------------------------- 1 | #color-picker-container{ 2 | margin:0 auto; 3 | width:300px; 4 | display:flex; 5 | justify-content:center; 6 | align-items:center; 7 | padding-top:10px; 8 | padding-bottom:10px; 9 | } 10 | 11 | #color-picker, #sleepmode{ 12 | margin-top:30px; 13 | } 14 | 15 | select { 16 | font: 1.1em tahoma, arial, sans-serif; 17 | } 18 | 19 | #timezone-select{ 20 | border:none; 21 | width:300px; 22 | } 23 | 24 | body { 25 | background-color: #eee; 26 | border: 0; 27 | margin: 0; 28 | font: 1.1em tahoma, arial, sans-serif; 29 | } 30 | a { 31 | color: darkblue; 32 | transition: color .2s ease-out; 33 | text-decoration: none 34 | } 35 | a:hover { 36 | color: red; 37 | } 38 | input { 39 | display: none; 40 | font: 1.1em tahoma, arial, sans-serif; 41 | } 42 | input:focus, 43 | select:focus, 44 | textarea:focus, 45 | button:focus { 46 | outline: none; 47 | } 48 | input[type="button"] { 49 | width: 100px; 50 | padding: 5px; 51 | text-align: center; 52 | display: block; 53 | } 54 | 55 | input[type="time"]{ 56 | display: inline; 57 | } 58 | 59 | input[type="checkbox"]{ 60 | display: inline; 61 | } 62 | 63 | p { 64 | padding: 10px; 65 | } 66 | 67 | .diag-box { 68 | position: absolute; 69 | top: 0; 70 | left: 0; 71 | bottom: 0; 72 | right: 0; 73 | height: 100%; 74 | width: 100%; 75 | display: none; 76 | } 77 | .diag-box-win { 78 | position: absolute; 79 | left: 5%; 80 | width: 90%; 81 | text-align: center; 82 | border: 2px outset #888; 83 | background-color: #fff; 84 | border-radius: 10px; 85 | top: 20%; 86 | } 87 | .blur { 88 | -webkit-filter: blur(2px); 89 | -moz-filter: blur(2px); 90 | -ms-filter: blur(2px); 91 | -o-filter: blur(2px); 92 | filter: blur(2px); 93 | } 94 | .ape { 95 | margin-left: 20px; 96 | padding: 10px 0px 10px 10px; 97 | } 98 | .ape:hover { 99 | cursor: pointer; 100 | } 101 | .brdb { 102 | border-bottom: 1px solid #888; 103 | } 104 | header { 105 | background-color: #fff; 106 | border-top: 2px outset #888; 107 | border-bottom: 1px solid #888; 108 | } 109 | section { 110 | background-color: #fff; 111 | border-bottom: 1px solid #888; 112 | border-top: 1px solid #888; 113 | } 114 | h1 { 115 | display: block; 116 | text-align: center; 117 | margin: 0; 118 | padding: 15px; 119 | font-size: 1.4em 120 | } 121 | h2 { 122 | margin: 0; 123 | margin-top: 20px; 124 | padding: 10px; 125 | text-transform: uppercase; 126 | color: #888; 127 | font-size: 1.0em 128 | } 129 | h3 { 130 | margin: 0; 131 | text-align: center; 132 | padding: 20px 0px 20px 0px; 133 | } 134 | .gr { 135 | color: green; 136 | } 137 | .rd { 138 | color: red; 139 | } 140 | 141 | .buttons { 142 | padding: 15px; 143 | display:flex; 144 | justify-content:space-evenly; 145 | } 146 | 147 | .ctr { 148 | margin: 0 auto; 149 | } 150 | .tctr { 151 | text-align: center; 152 | } 153 | 154 | .fr { 155 | float: right; 156 | margin-right: 20px; 157 | } 158 | 159 | #diag-sleepmode { 160 | display: none; 161 | } 162 | 163 | -------------------------------------------------------------------------------- /nixie_clock_code/main/clock.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Nixie Clock 11 | 12 | 13 |
14 |
15 |
16 |
17 |

Timezone

18 |
19 |
20 |

Current Timezone is:

21 |
22 |
23 | 24 |
25 |
26 |
27 |
28 |
29 |
30 |

Backlight Color

31 |
32 |
33 |
34 |
35 |
36 |

Sleep Mode

37 |
38 | 39 |
40 |

Enable sleep mode

41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | Add Sleep Mode 52 |
53 |
54 |
55 | 56 |
57 |
58 |
59 |
60 |

61 | 62 |

63 |

64 | From: 65 | To: 66 |

67 |
68 | 69 | 70 | 71 |
72 |
73 |
74 |
75 | 76 | 77 | -------------------------------------------------------------------------------- /nixie_clock_code/main/clock.js: -------------------------------------------------------------------------------- 1 | var colorPicker = null; 2 | var sleepMode = null; 3 | var selectedItem = -1; 4 | 5 | const gel = (e) => document.getElementById(e); 6 | const zeroPad = (num, places) => String(num).padStart(places, '0'); 7 | const week = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"]; 8 | const MAX_SLEEPMODES = 4; 9 | 10 | 11 | function truncate (num, places) { 12 | return Math.trunc(num * Math.pow(10, places)) / Math.pow(10, places); 13 | } 14 | 15 | function docReady(fn) { 16 | // see if DOM is already available 17 | if ( 18 | document.readyState === "complete" || 19 | document.readyState === "interactive" 20 | ) { 21 | // call on next available tick 22 | setTimeout(fn, 1); 23 | } 24 | else { 25 | document.addEventListener("DOMContentLoaded", fn); 26 | } 27 | } 28 | 29 | 30 | 31 | function buildDayHTML(day){ 32 | 33 | let ret = ""; 34 | let bit = 0x01; 35 | for (let i = 0; i < 7; i++) { 36 | 37 | if( (day & bit) > 0){ 38 | ret += "" + week[i] + ""; 39 | } 40 | else{ 41 | ret += "" + week[i] + ""; 42 | } 43 | 44 | if(i!=6) ret += " "; 45 | 46 | bit <<= 1; 47 | } 48 | 49 | return ret; 50 | } 51 | 52 | 53 | function timeFromStr(str){ 54 | 55 | var a = str.split(":"); 56 | var hours = parseInt(a[0], 10); 57 | var minutes = parseInt(a[1], 10); 58 | 59 | return Math.round( hours * 3600 + minutes * 60 ); 60 | } 61 | 62 | function buildTime(t){ 63 | 64 | let hours = truncate(t / 3600, 0); 65 | let minutes = Math.round((t % 3600) / 60); 66 | 67 | return zeroPad(hours.toString(), 2) + ":" + zeroPad(minutes.toString(), 2); 68 | } 69 | 70 | 71 | function colorChangeCallback(color) { 72 | 73 | console.log(color.rgb); 74 | 75 | try{ 76 | res = fetch("backlights/", { 77 | method: "POST", 78 | headers: { 79 | "Content-Type": "application/json", 80 | }, 81 | body: JSON.stringify(color.rgb), 82 | }); 83 | } 84 | catch (e) { 85 | console.info("error in colorChangeCallback"); 86 | } 87 | 88 | } 89 | 90 | async function getTimezones(){ 91 | 92 | try{ 93 | 94 | let restz = await fetch("timezone/"); 95 | let timezone = await restz.text(); 96 | 97 | let res = await fetch("timezones.json"); 98 | let timezones = await res.json(); 99 | 100 | let sel = gel("timezone-select"); 101 | sel.innerHTML = ""; 102 | 103 | timezones.forEach(function(entry) { 104 | let opt = document.createElement('option'); 105 | opt.value = entry; 106 | opt.selected = entry == timezone; 107 | opt.innerHTML = entry; 108 | sel.appendChild(opt); 109 | }); 110 | 111 | 112 | } 113 | catch (e){ 114 | console.info("error" + e); 115 | } 116 | 117 | } 118 | 119 | async function getSleepMode(url = "sleepmode/") { 120 | try { 121 | 122 | 123 | var res; 124 | 125 | if(sleepMode == null){ 126 | res = await fetch(url); 127 | } 128 | else{ 129 | res = await fetch(url, { 130 | method: "POST", 131 | headers: { 132 | "Content-Type": "application/json", 133 | }, 134 | body: JSON.stringify(sleepMode), 135 | }); 136 | } 137 | var mode = await res.json(); 138 | 139 | //create list of sleep modes 140 | 141 | let chkbx = gel("sleepmode-enable"); 142 | chkbx.checked = mode.enabled; 143 | if(mode.enabled){ 144 | 145 | let activeSM = 0; 146 | for (let i = 0; i < mode.data.length; i++) { 147 | let sleepItem = mode.data[i]; 148 | let domSleepItem = gel("sm" + i.toString()); 149 | 150 | if(sleepItem.enabled){ 151 | activeSM++; 152 | domSleepItem.style.display = 'block'; 153 | 154 | let d = buildDayHTML(sleepItem.days); 155 | let from = buildTime(sleepItem.from); 156 | let to = buildTime(sleepItem.to); 157 | 158 | domSleepItem.innerHTML = d + ", " + from + " to " + to + ""; 159 | } 160 | else{ 161 | domSleepItem.style.display = 'none'; 162 | } 163 | } 164 | 165 | //hide or show new button 166 | let newSM = gel("sm" + MAX_SLEEPMODES.toString()); 167 | if(activeSM == MAX_SLEEPMODES){ 168 | newSM.style.display = 'none'; 169 | } 170 | else{ 171 | newSM.style.display = 'block'; 172 | } 173 | 174 | //show the sleepmodes 175 | gel("sleepmodes").style.display = 'block'; 176 | } 177 | else{ 178 | //hide the whole thing 179 | gel("sleepmodes").style.display = 'none'; 180 | } 181 | 182 | 183 | 184 | sleepMode = mode; 185 | 186 | } 187 | catch (e) { 188 | console.info("cannot access sleepmode"); 189 | } 190 | } 191 | 192 | 193 | async function sleepModeDel(){ 194 | 195 | if(selectedItem >= 0){ 196 | 197 | 198 | let data = sleepMode.data[selectedItem]; 199 | 200 | data.enabled = false; 201 | data.days = 0; 202 | data.from = 0; 203 | data.to = 0; 204 | 205 | sleepMode.data.splice(selectedItem, 1); 206 | sleepMode.data.push(data); 207 | 208 | await getSleepMode(); 209 | } 210 | gel("diag-sleepmode").style.display = "none"; 211 | gel("clock-wrap").classList.remove("blur"); 212 | 213 | 214 | } 215 | 216 | async function changeTimezone(){ 217 | 218 | let sel = gel("timezone-select"); 219 | let data = { "timezone": sel.value}; 220 | 221 | console.log(data); 222 | 223 | try{ 224 | let res = await fetch("timezone/", { 225 | method: "POST", 226 | headers: { 227 | "Content-Type": "application/json", 228 | }, 229 | body: JSON.stringify(data), 230 | }); 231 | } 232 | catch (e) { 233 | console.info("error in changeTimezone"); 234 | } 235 | 236 | } 237 | 238 | async function sleepModeOk(){ 239 | 240 | if(selectedItem >= 0){ 241 | 242 | let data = sleepMode.data[selectedItem]; 243 | 244 | //build days bitfield based on checkboxes 245 | let days = 0; 246 | let bit = 0x01; 247 | for (let i = 0; i < 7; i++) { 248 | let chkbx = gel(week[i]); 249 | if(chkbx.checked){ 250 | days |= bit; 251 | } 252 | bit <<= 1; 253 | } 254 | 255 | //convert time strings to seconds 256 | let tf = gel("time-from"); 257 | let tt = gel("time-to"); 258 | let from = timeFromStr(tf.value); 259 | let to = timeFromStr(tt.value); 260 | 261 | data.enabled = (days != 0) && ( from != to); 262 | 263 | if(data.enabled){ 264 | data.days = days; 265 | data.from = from; 266 | data.to = to; 267 | } 268 | else{ 269 | //invalid entry 270 | data.days = 0; 271 | data.from = 0; 272 | data.to = 0; 273 | } 274 | 275 | await getSleepMode(); 276 | 277 | } 278 | gel("diag-sleepmode").style.display = "none"; 279 | gel("clock-wrap").classList.remove("blur"); 280 | } 281 | 282 | function changeSleepMode(e){ 283 | 284 | //fill in data 285 | let id = parseInt(e.currentTarget.id.charAt(2)); 286 | let sleepItem = null; 287 | if(id == MAX_SLEEPMODES){ 288 | 289 | //new sleepmode: -- find the first empty one 290 | for(let i=0;i 0 324 | bit <<= 1; 325 | } 326 | 327 | //build times 328 | let tf = gel("time-from"); 329 | let tt = gel("time-to"); 330 | tf.value = buildTime(sleepItem.from); 331 | tt.value = buildTime(sleepItem.to); 332 | 333 | gel("diag-sleepmode").style.display = "block"; 334 | gel("clock-wrap").classList.add("blur"); 335 | } 336 | } 337 | 338 | docReady(async function () { 339 | console.log("ready!"); 340 | 341 | await getSleepMode(); 342 | await getTimezones(); 343 | 344 | var colorPicker = new iro.ColorPicker('#color-picker-container'); 345 | colorPicker.on("color:change", colorChangeCallback); 346 | 347 | for(let i=0; i < MAX_SLEEPMODES+1; i++){ 348 | gel("sm" + i.toString()).addEventListener( 349 | "click", 350 | (e) => { 351 | changeSleepMode(e); 352 | }, 353 | false 354 | ); 355 | } 356 | 357 | 358 | 359 | gel("sleepmode-enable").addEventListener( 360 | "click", 361 | async (e) => { 362 | 363 | let chkd = gel("sleepmode-enable").checked; 364 | 365 | if(sleepMode != null){ 366 | 367 | if(chkd != sleepMode.enabled){ 368 | sleepMode.enabled = chkd; 369 | await getSleepMode(); 370 | } 371 | } 372 | }, 373 | false 374 | ); 375 | 376 | 377 | gel("timezone-select").addEventListener('change', async (event) => { 378 | await changeTimezone(); 379 | }); 380 | 381 | gel("cancel-sleepmode").addEventListener( 382 | "click", 383 | (e) => { 384 | gel("diag-sleepmode").style.display = "none"; 385 | gel("clock-wrap").classList.remove("blur"); 386 | }, 387 | false 388 | ); 389 | 390 | gel("del-sleepmode").addEventListener( 391 | "click", 392 | (e) => { 393 | sleepModeDel(); 394 | }, 395 | false 396 | ); 397 | 398 | gel("ok-sleepmode").addEventListener( 399 | "click", 400 | (e) => { 401 | sleepModeOk(); 402 | }, 403 | false 404 | ); 405 | }); 406 | 407 | 408 | 409 | -------------------------------------------------------------------------------- /nixie_clock_code/main/component.mk: -------------------------------------------------------------------------------- 1 | # 2 | # "main" pseudo-component makefile. 3 | # 4 | # (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) 5 | 6 | COMPONENT_EMBED_FILES := style.css jquery.gz code.js index.html clock.js iro.js clock.css -------------------------------------------------------------------------------- /nixie_clock_code/main/compress.bat: -------------------------------------------------------------------------------- 1 | gzip index.html style.css jquery.js --best --keep --force 2 | pause -------------------------------------------------------------------------------- /nixie_clock_code/main/display.c: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2020 Tony Pottier 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | @file display.c 23 | @author Tony Pottier 24 | 25 | Contains functions to control the nixie clock display over SPI 26 | 27 | */ 28 | 29 | #include 30 | #include 31 | #include 32 | 33 | #include 34 | #include 35 | #include 36 | #include 37 | #include 38 | 39 | #include "display.h" 40 | 41 | 42 | static uint16_t *display_vram; 43 | static spi_device_handle_t spi; 44 | static spi_transaction_t t; 45 | static display_config_t display_config; 46 | 47 | 48 | 49 | static void IRAM_ATTR gpio_usb_power_isr_handler(void* arg){ 50 | 51 | /* disable display when USB is on as a measure of security for the whole board. USB powering HV power supply after going through a tiny diode = bad idea */ 52 | gpio_set_level(DISPLAY_OE_GPIO, 1); 53 | return; 54 | } 55 | 56 | 57 | void display_turn_on(){ 58 | /* turn on does not do anything if USB power is connected */ 59 | if(gpio_get_level(DEBUG_USB_POWER_ON_GPIO) == 0){ 60 | gpio_set_level(DISPLAY_HVEN_GPIO, 1); 61 | gpio_set_level(DISPLAY_OE_GPIO, 0); 62 | } 63 | } 64 | 65 | void display_turn_off(){ 66 | gpio_set_level(DISPLAY_OE_GPIO, 1); 67 | gpio_set_level(DISPLAY_HVEN_GPIO, 0); 68 | } 69 | 70 | 71 | esp_err_t display_register_usb_power_interrupt(){ 72 | 73 | /* setup DEBUG_USB_POWER_ON_GPIO as INTERRUPT on RISING EGDE */ 74 | gpio_config_t io_conf; 75 | io_conf.intr_type = GPIO_PIN_INTR_POSEDGE; 76 | /* GPIO 4 bit mask */ 77 | io_conf.pin_bit_mask = (1ULL << DEBUG_USB_POWER_ON_GPIO); 78 | /* Input */ 79 | io_conf.mode = GPIO_MODE_INPUT; 80 | /* Disable pu/pd as this is tied to a voltage divider from 5V rail */ 81 | io_conf.pull_up_en = GPIO_PULLUP_DISABLE; 82 | io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; 83 | gpio_config(&io_conf); 84 | 85 | /* install ISR service */ 86 | gpio_install_isr_service(ESP_INTR_FLAG_LEVEL1); 87 | return gpio_isr_handler_add(DEBUG_USB_POWER_ON_GPIO, gpio_usb_power_isr_handler, (void*)DEBUG_USB_POWER_ON_GPIO); 88 | } 89 | 90 | 91 | 92 | esp_err_t display_init(){ 93 | 94 | esp_err_t ret; 95 | 96 | display_vram = (uint16_t*)malloc(sizeof(uint16_t) * DISPLAY_DIGIT_COUNT); 97 | memset(display_vram, 0x00, sizeof(uint16_t) * DISPLAY_DIGIT_COUNT); 98 | 99 | memset(&display_config, 0x00, sizeof(display_config_t)); 100 | 101 | /* setup all GPIOs */ 102 | gpio_set_direction(DISPLAY_SPI_CS_GPIO, GPIO_MODE_OUTPUT); 103 | gpio_set_direction(DISPLAY_OE_GPIO, GPIO_MODE_OUTPUT); 104 | gpio_set_direction(DISPLAY_HVEN_GPIO, GPIO_MODE_OUTPUT); 105 | gpio_set_direction(DEBUG_USB_POWER_ON_GPIO, GPIO_MODE_INPUT); 106 | 107 | /* by default display is off but HV power supply is enabled, idling */ 108 | gpio_set_level(DISPLAY_OE_GPIO, 1); /* output enable is reversed logic. This effectively has no effect since the pin is physically pulled-up to 3v3 */ 109 | gpio_set_level(DISPLAY_HVEN_GPIO, 1); 110 | 111 | /* register interrupt on USB power */ 112 | //ret = display_register_usb_power_interrupt(); 113 | //if(ret != ESP_OK) return ret; 114 | 115 | spi_bus_config_t buscfg={ 116 | .miso_io_num=-1, /* -1 == not used */ 117 | .mosi_io_num=DISPLAY_SPI_MOSI_GPIO, 118 | .sclk_io_num=DISPLAY_SPI_SCLK_GPIO, 119 | .quadwp_io_num=-1, 120 | .quadhd_io_num=-1 121 | }; 122 | spi_device_interface_config_t devcfg={ 123 | .clock_speed_hz=100000, /* clock at 100Khz => about 1000 frames per seconds! */ 124 | .mode=0, /* SPI mode 0 */ 125 | .spics_io_num=DISPLAY_SPI_CS_GPIO, /* CS pin CS GPIO pin for this device, or -1 if not used. */ 126 | .queue_size=4 /* Queue size is not really relevant for the nixie display so its kept low */ 127 | //.pre_cb=ili_spi_pre_transfer_callback, //Specify pre-transfer callback to handle D/C line 128 | }; 129 | 130 | 131 | /* Initialize the SPI bus */ 132 | ret = spi_bus_initialize(HSPI_HOST, &buscfg, 1); 133 | if(ret!=ESP_OK) return ret; 134 | 135 | /* Attach the display to the SPI bus */ 136 | ret=spi_bus_add_device(HSPI_HOST, &devcfg, &spi); 137 | if(ret!=ESP_OK) return ret; 138 | 139 | /* prepare transaction */ 140 | memset(&t, 0x00, sizeof(t)); 141 | t.length = DISPLAY_DIGIT_COUNT * 16; /* 6 digits, 16 bits per digits */ 142 | t.tx_buffer = display_vram; 143 | t.user = NULL; 144 | 145 | return ret; 146 | } 147 | 148 | 149 | 150 | uint16_t* display_get_vram(){ 151 | return display_vram; 152 | } 153 | 154 | void display_set_config(display_config_t* config){ 155 | display_config = *config; 156 | } 157 | 158 | esp_err_t display_write_vram(){ 159 | esp_err_t ret; 160 | 161 | 162 | /* due to esp32 endianess, we need to swipe bytes. The hardware assumes big endian but the esp is little endian. */ 163 | for(int i=0;i<6;i++){ 164 | display_vram[i] = __bswap_16(display_vram[i]); 165 | } 166 | 167 | 168 | /* safe guard. Enable display only if USB is disconnected */ 169 | if(gpio_get_level(DEBUG_USB_POWER_ON_GPIO) == 0){ 170 | gpio_set_level(DISPLAY_OE_GPIO, 0); 171 | } 172 | 173 | gpio_set_level(DISPLAY_SPI_CS_GPIO, 0); 174 | ret=spi_device_transmit(spi, &t); 175 | gpio_set_level(DISPLAY_SPI_CS_GPIO, 1); 176 | 177 | return ret; 178 | } 179 | 180 | esp_err_t display_write_time(struct tm *time){ 181 | 182 | if(time){ 183 | 184 | /* seconds */ 185 | display_vram[0] = (uint16_t) (1 << (time->tm_sec % 10)); 186 | display_vram[1] = (uint16_t) (1 << (time->tm_sec / 10)); 187 | 188 | /* minutes */ 189 | display_vram[2] = (uint16_t) (1 << (time->tm_min % 10)); 190 | display_vram[3] = (uint16_t) (1 << (time->tm_min / 10)); 191 | 192 | /* hours */ 193 | int hours = time->tm_hour; 194 | if(display_config.twelve_hours_format){ 195 | 196 | if(hours > 12){ 197 | hours -= 12; 198 | } 199 | else if(hours == 0){ /* in the complete BS that is the 12 hours format, midnight is 12 */ 200 | hours = 12; 201 | } 202 | 203 | } 204 | display_vram[4] = (uint16_t) (1 << (hours % 10)); 205 | 206 | 207 | int hours_tens = hours / 10; 208 | if(hours_tens == 0 && display_config.leading_zero == DISPLAY_LEADING_ZERO_HIDE){ 209 | display_vram[5] = (uint16_t) 0; 210 | } 211 | else{ 212 | display_vram[5] = (uint16_t) (1 << hours_tens); 213 | } 214 | 215 | 216 | 217 | if(time->tm_sec % 2 == 0){ 218 | display_vram[2] |= DISPLAY_TOP_DOT_MASK; 219 | display_vram[2] |= DISPLAY_BOTTOM_DOT_MASK; 220 | display_vram[4] |= DISPLAY_TOP_DOT_MASK; 221 | display_vram[4] |= DISPLAY_BOTTOM_DOT_MASK; 222 | } 223 | 224 | 225 | return display_write_vram(); 226 | } 227 | else{ 228 | 229 | display_vram[0] = (uint16_t) (1 << 0); 230 | display_vram[1] = (uint16_t) (1 << 0); 231 | display_vram[2] = (uint16_t) (1 << 0); 232 | display_vram[3] = (uint16_t) (1 << 0); 233 | display_vram[4] = (uint16_t) (1 << 0); 234 | display_vram[5] = (uint16_t) (1 << 0); 235 | 236 | return display_write_vram(); 237 | } 238 | 239 | 240 | } 241 | -------------------------------------------------------------------------------- /nixie_clock_code/main/ds3231.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/nixie_clock_code/main/ds3231.c -------------------------------------------------------------------------------- /nixie_clock_code/main/http_client.c: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2019 Tony Pottier 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | @file http_client.c 23 | @author Tony Pottier 24 | 25 | Contains wrappers around the esp http client for the mclk.org time API. 26 | 27 | */ 28 | 29 | #include 30 | #include 31 | #include 32 | #include "freertos/FreeRTOS.h" 33 | #include "freertos/task.h" 34 | #include "freertos/queue.h" 35 | #include "freertos/semphr.h" 36 | #include "esp_log.h" 37 | #include "esp_system.h" 38 | #include "esp_http_client.h" 39 | #include "cJSON.h" 40 | 41 | #include "clock.h" 42 | #include "http_client.h" 43 | 44 | 45 | 46 | static const char TAG[] = "HTTP_CLIENT"; 47 | static const char *HTTP_CLIENT_TIME_API_URL = "https://api.mclk.org/time"; 48 | static const char *HTTP_CLIENT_TRANSITIONS_API_URL = "https://api.mclk.org/transitions"; 49 | 50 | 51 | 52 | static QueueHandle_t http_client_queue = NULL; 53 | 54 | /* used to keep track of request bodies that eventually need to be freed */ 55 | static char *http_client_body_str = NULL; 56 | 57 | /* used to keep track of response */ 58 | static char *http_client_response_str = NULL; 59 | 60 | static esp_http_client_handle_t http_client_handle = NULL; 61 | 62 | 63 | 64 | 65 | void http_client_process_data(esp_http_client_event_t *evt){ 66 | if(evt->user_data == (void*)HTTP_CLIENT_TIME_API_URL){ 67 | 68 | /* process json answer */ 69 | if(http_client_response_str){ 70 | cJSON *json = cJSON_Parse(http_client_response_str); 71 | clock_notify_time_api_response(json); 72 | } 73 | 74 | } 75 | else if(evt->user_data == (void*)HTTP_CLIENT_TRANSITIONS_API_URL){ 76 | 77 | /* process json answer */ 78 | if(http_client_response_str){ 79 | cJSON *json = cJSON_Parse(http_client_response_str); 80 | clock_notify_transitions_api_response(json); 81 | } 82 | } 83 | } 84 | 85 | 86 | 87 | 88 | void http_client_cleanup(esp_http_client_handle_t client){ 89 | 90 | if(http_client_body_str){ 91 | free(http_client_body_str); 92 | http_client_body_str = NULL; 93 | } 94 | 95 | if(http_client_response_str){ 96 | free(http_client_response_str); 97 | http_client_response_str = NULL; 98 | } 99 | 100 | esp_http_client_cleanup(client); 101 | } 102 | 103 | static esp_err_t _http_event_handler(esp_http_client_event_t *evt){ 104 | 105 | 106 | switch(evt->event_id) { 107 | case HTTP_EVENT_ERROR: 108 | ESP_LOGI(TAG, "HTTP_EVENT_ERROR"); 109 | break; 110 | case HTTP_EVENT_ON_CONNECTED: 111 | ESP_LOGI(TAG, "HTTP_EVENT_ON_CONNECTED"); 112 | break; 113 | case HTTP_EVENT_HEADER_SENT: 114 | ESP_LOGI(TAG, "HTTP_EVENT_HEADER_SENT"); 115 | break; 116 | case HTTP_EVENT_ON_HEADER: 117 | ESP_LOGD(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value); 118 | break; 119 | case HTTP_EVENT_ON_DATA: 120 | ESP_LOGI(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len); 121 | if(evt->data_len > 0){ 122 | if(http_client_response_str == NULL){ 123 | /* allocate memory */ 124 | int sz = esp_http_client_get_content_length(evt->client) + 1; 125 | http_client_response_str = (char*)malloc(sizeof(char) * sz); 126 | memset(http_client_response_str, '\0', sz); 127 | } 128 | /* copy data over */ 129 | char* tmp = (char*)malloc(sizeof(char) * (evt->data_len + 1)); 130 | memset(tmp, '\0', evt->data_len + 1); 131 | memcpy(tmp, evt->data, evt->data_len); 132 | strcat(http_client_response_str, tmp); 133 | free(tmp); 134 | } 135 | break; 136 | case HTTP_EVENT_ON_FINISH: 137 | ESP_LOGI(TAG, "HTTP_EVENT_ON_FINISH"); 138 | http_client_process_data(evt); 139 | break; 140 | case HTTP_EVENT_DISCONNECTED: 141 | ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED"); 142 | break; 143 | } 144 | 145 | return ESP_OK; 146 | } 147 | 148 | 149 | static void http_client_api_time_process(char *timezone){ 150 | 151 | esp_err_t err; 152 | ESP_LOGI(TAG, "tz: %s", timezone); 153 | 154 | esp_http_client_config_t config = { 155 | .url = HTTP_CLIENT_TIME_API_URL, 156 | .event_handler = _http_event_handler, 157 | .is_async = true, 158 | .timeout_ms = 10000, 159 | .user_data = (void*)HTTP_CLIENT_TIME_API_URL 160 | }; 161 | http_client_handle = esp_http_client_init(&config); 162 | 163 | 164 | if(timezone != NULL){ 165 | cJSON *body = NULL; 166 | cJSON *tz = NULL; 167 | char* body_str = NULL; 168 | 169 | /* generate the request body */ 170 | body = cJSON_CreateObject(); 171 | tz = cJSON_CreateString(timezone); 172 | cJSON_AddItemToObject(body, "timezone", tz); 173 | body_str = cJSON_Print(body); 174 | cJSON_Delete(body); 175 | 176 | /* save pointer for later cleanup */ 177 | http_client_body_str = body_str; 178 | 179 | /* set body */ 180 | esp_http_client_set_post_field(http_client_handle, body_str, strlen(body_str)); 181 | } 182 | 183 | 184 | for(;;) { 185 | err = esp_http_client_perform(http_client_handle); 186 | if (err != ESP_ERR_HTTP_EAGAIN) { 187 | break; 188 | } 189 | vTaskDelay( pdMS_TO_TICKS(10) ); /* avoid watchdog trigger */ 190 | } 191 | if (err == ESP_OK) { 192 | ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %d", 193 | esp_http_client_get_status_code(http_client_handle), 194 | esp_http_client_get_content_length(http_client_handle)); 195 | } 196 | else { 197 | ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); 198 | } 199 | 200 | http_client_cleanup(http_client_handle); 201 | 202 | } 203 | 204 | 205 | static void http_client_api_transitions_process(void *pvParameter){ 206 | timezone_t timezone = clock_get_config_timezone(); 207 | time_t now = clock_get_current_time_utc(); 208 | 209 | esp_http_client_config_t config = { 210 | .url = HTTP_CLIENT_TRANSITIONS_API_URL, 211 | .event_handler = _http_event_handler, 212 | .is_async = true, 213 | .timeout_ms = 10000, 214 | .user_data = (void*)HTTP_CLIENT_TRANSITIONS_API_URL 215 | }; 216 | http_client_handle = esp_http_client_init(&config); 217 | 218 | 219 | if(timezone.name != NULL){ 220 | cJSON *body = NULL; 221 | cJSON *tz = NULL; 222 | cJSON *from = NULL; 223 | cJSON *to = NULL; 224 | esp_err_t err; 225 | 226 | char* body_str = NULL; 227 | 228 | /* generate the request body */ 229 | body = cJSON_CreateObject(); 230 | 231 | /* timezone */ 232 | tz = cJSON_CreateString(timezone.name); 233 | cJSON_AddItemToObject(body, "timezone", tz); 234 | 235 | /* from */ 236 | time_t from_time = now - (60*60*24) ; /* -1 day back to avoid some weird edge cases by getting transitions strictly on now timestamp */ 237 | from = cJSON_CreateNumber(from_time); 238 | cJSON_AddItemToObject(body, "from", from); 239 | 240 | /* to */ 241 | time_t to_time = now + 60*60*24*365; /* +1 year */ 242 | to = cJSON_CreateNumber(to_time); 243 | cJSON_AddItemToObject(body, "to", to); 244 | 245 | 246 | /* transform to json string then clean up cJSON object */ 247 | body_str = cJSON_Print(body); 248 | cJSON_Delete(body); 249 | 250 | /* save pointer for later cleanup */ 251 | http_client_body_str = body_str; 252 | 253 | /* set body */ 254 | esp_http_client_set_post_field(http_client_handle, body_str, strlen(body_str)); 255 | 256 | for(;;) { 257 | err = esp_http_client_perform(http_client_handle); 258 | if (err != ESP_ERR_HTTP_EAGAIN) { 259 | break; 260 | } 261 | vTaskDelay( pdMS_TO_TICKS(10) ); /* avoid watchdog trigger */ 262 | } 263 | if (err == ESP_OK) { 264 | ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %d", 265 | esp_http_client_get_status_code(http_client_handle), 266 | esp_http_client_get_content_length(http_client_handle)); 267 | } 268 | else { 269 | ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); 270 | } 271 | 272 | http_client_cleanup(http_client_handle); 273 | } 274 | } 275 | 276 | 277 | /** 278 | * @brief freeRTOS task that processes URL requests. 279 | * 280 | * Because this is processed in a queue, it ensures only one call at a time can be made 281 | */ 282 | static void http_client_task(void *pvParameter){ 283 | 284 | clock_queue_message_t msg; 285 | 286 | for(;;) { 287 | if(xQueueReceive(http_client_queue, &msg, portMAX_DELAY)) { 288 | 289 | switch(msg.message){ 290 | 291 | case CLOCK_MESSAGE_REQUEST_TIME_API:{ 292 | char* tz = (char*)msg.param; 293 | http_client_api_time_process( tz ); 294 | if(tz != NULL){ 295 | free(tz); 296 | } 297 | } 298 | break; 299 | 300 | case CLOCK_MESSAGE_REQUEST_TRANSITIONS_API_CALL: 301 | http_client_api_transitions_process( NULL ); 302 | break; 303 | 304 | default: 305 | break; 306 | } 307 | } 308 | } 309 | } 310 | 311 | 312 | esp_err_t http_client_init(){ 313 | http_client_queue = xQueueCreate(10, sizeof(clock_queue_message_t)); 314 | xTaskCreatePinnedToCore(&http_client_task, "http_client_task", 16384, NULL, CLOCK_TASK_PRIORITY-1, NULL, 1); 315 | return ESP_OK; 316 | } 317 | 318 | 319 | void http_client_get_transitions(timezone_t timezone, time_t now){ 320 | clock_queue_message_t msg; 321 | msg.message = CLOCK_MESSAGE_REQUEST_TRANSITIONS_API_CALL; 322 | msg.param = NULL; 323 | xQueueSend(http_client_queue, &msg, portMAX_DELAY); 324 | } 325 | 326 | 327 | void http_client_get_api_time(char* timezone){ 328 | clock_queue_message_t msg; 329 | size_t sz = strlen(timezone) + 1; 330 | char* param = malloc(sizeof(char) * sz); 331 | memset(param, 0x00, sz); 332 | strcpy(param, timezone); 333 | msg.message = CLOCK_MESSAGE_REQUEST_TIME_API; 334 | msg.param = (void*)param; 335 | xQueueSend(http_client_queue, &msg, portMAX_DELAY); 336 | } 337 | 338 | -------------------------------------------------------------------------------- /nixie_clock_code/main/i2c.c: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2020 Tony Pottier 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | @file i2c.c 23 | @author Tony Pottier 24 | 25 | Contains helper functions to communicate over the I2C bus 26 | 27 | */ 28 | 29 | #include "freertos/FreeRTOS.h" 30 | #include "freertos/task.h" 31 | #include "driver/i2c.h" 32 | 33 | 34 | #include "i2c.h" 35 | 36 | 37 | esp_err_t i2c_master_init(){ 38 | esp_err_t ret; 39 | int i2c_master_port = I2C_MASTER_NUM; 40 | i2c_config_t conf; 41 | conf.mode = I2C_MODE_MASTER; 42 | conf.sda_io_num = I2C_MASTER_SDA_IO; 43 | conf.sda_pullup_en = GPIO_PULLUP_DISABLE; 44 | conf.scl_io_num = I2C_MASTER_SCL_IO; 45 | conf.scl_pullup_en = GPIO_PULLUP_DISABLE; 46 | conf.master.clk_speed = I2C_MASTER_FREQ_HZ; 47 | ret = i2c_param_config(i2c_master_port, &conf); 48 | if(ret == ESP_OK){ 49 | return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0); 50 | } 51 | return ret; 52 | 53 | } 54 | 55 | 56 | esp_err_t i2c_write_bytes(const uint8_t slave_address, const uint8_t register_address, uint8_t *data, size_t data_len){ 57 | esp_err_t ret; 58 | i2c_cmd_handle_t cmd = i2c_cmd_link_create(); 59 | i2c_master_start(cmd); 60 | i2c_master_write_byte(cmd, slave_address << 1 | WRITE_BIT, ACK_CHECK_EN); 61 | i2c_master_write_byte(cmd, register_address, ACK_CHECK_EN); 62 | 63 | for(int i=0; i /* for int32_t, etc. */ 44 | #include /* for time_t */ 45 | #include /* for bool */ 46 | #include /* for esp_err_t */ 47 | #include "freertos/FreeRTOS.h" /* TickType_t */ 48 | #include "cJSON.h" /* for cJSON */ 49 | #include "display.h" /* display_config_t */ 50 | 51 | #ifdef __cplusplus 52 | extern "C" { 53 | #endif 54 | 55 | /** @brief Defines the task priority of the clock (main task). 56 | * This should be the highest priority task unless very specific reason. Default: 10. 57 | */ 58 | #define CLOCK_TASK_PRIORITY CONFIG_CLOCK_TASK_PRIORITY 59 | 60 | 61 | /** 62 | * @brief Store the timezone in its readable way, such as "America/New_York" 63 | * At the time of writing this there are three 30 char long zones; which are: 64 | * America/Argentina/Buenos_Aires 65 | * America/Argentina/Rio_Gallegos 66 | * America/North_Dakota/New_Salem 67 | * 40 is rounded up to the nearest 10, to include the \0. 68 | */ 69 | #define CLOCK_MAX_TZ_STRING_LENGTH 40 70 | 71 | 72 | /** in seconds, the maximum drift allowed before we force a refresh of the time */ 73 | #define CLOCK_MAX_ACCEPTABLE_TIME_DRIFT 60.0 74 | 75 | /** number of transitions that will be stored in advance. Most timezones have 0 or 2 (summer time) so the default of 3 is plenty. */ 76 | #define CLOCK_MAX_TRANSITIONS 3 77 | 78 | /** maximum numbers of sleepmodes a user can set */ 79 | #define CLOCK_MAX_SLEEPMODES 4 80 | 81 | typedef enum clock_message_t{ 82 | CLOCK_MESSAGE_NONE = 0, 83 | CLOCK_MESSAGE_TICK = 1, 84 | CLOCK_MESSAGE_STA_GOT_IP = 2, 85 | CLOCK_MESSAGE_STA_DISCONNECTED = 3, 86 | CLOCK_MESSAGE_RECEIVE_TIME_API = 4, 87 | CLOCK_MESSAGE_RECEIVE_TRANSITIONS_API = 5, 88 | CLOCK_MESSAGE_REQUEST_TRANSITIONS_API_CALL = 6, 89 | CLOCK_MESSAGE_REQUEST_TIME_API = 7, 90 | CLOCK_MESSAGE_SLEEPMODE_CONFIG = 8, 91 | CLOCK_MESSAGE_TIMEZONE = 9, 92 | CLOCK_MESSAGE_SLEEP_EVENT = 10, 93 | CLOCK_MESSAGE_BACKLIGHTS_CONFIG = 11, 94 | CLOCK_MESSAGE_MAX = 0x7fffffff 95 | }clock_message_t; 96 | 97 | /** @brief type that is processed by the clock queue */ 98 | typedef struct clock_queue_message_t{ 99 | clock_message_t message; 100 | void *param; 101 | }clock_queue_message_t; 102 | 103 | typedef struct timezone_t{ 104 | int32_t offset; 105 | char name[CLOCK_MAX_TZ_STRING_LENGTH]; 106 | }timezone_t; 107 | 108 | typedef struct transition_t{ 109 | int32_t offset; 110 | time_t timestamp; 111 | }transition_t; 112 | 113 | /** 114 | * @brief defines a structure holding sleepmode information: which days to apply, and from what time to what time 115 | */ 116 | typedef struct sleepmode_t{ 117 | bool enabled; 118 | uint8_t days; 119 | time_t from; 120 | time_t to; 121 | }sleepmode_t; 122 | 123 | 124 | typedef struct sleepmodes_t{ 125 | bool enable_sleepmode; 126 | sleepmode_t sleepmode[CLOCK_MAX_SLEEPMODES]; 127 | }sleepmodes_t; 128 | 129 | typedef enum sleep_action_t{ 130 | SLEEP_ACTION_UNKNOWN = 0, 131 | SLEEP_ACTION_WAKE = 1, 132 | SLEEP_ACTION_SLEEP = 2, 133 | SLEEP_ACTION_MAX = 0x7fffffff 134 | }sleep_action_t; 135 | 136 | typedef struct sleep_event_t{ 137 | time_t timestamp; 138 | sleep_action_t action; 139 | }sleep_event_t; 140 | 141 | 142 | /** 143 | * @brief defines a structure holding the gloabl configuration of the clock */ 144 | typedef struct clock_config_t{ 145 | timezone_t timezone; 146 | sleepmodes_t sleepmodes; 147 | display_config_t display; 148 | }clock_config_t; 149 | 150 | 151 | #define GPIO_INPUT_IO_4 4 152 | 153 | 154 | void clock_notify_new_timezone(char* timezone); 155 | void clock_notify_new_sleepmodes(sleepmodes_t sleepmodes); 156 | void clock_notify_sta_got_ip(void* pvArgument); 157 | void clock_notify_sta_disconnected(); 158 | void clock_notify_new_backlight_color(rgb_t rgb); 159 | void clock_notify_time_api_response(cJSON *json); 160 | void clock_notify_transitions_api_response(cJSON *json); 161 | void clock_tick(); 162 | void clock_task(void *pvParameter); 163 | esp_err_t clock_register_sqw_interrupt(); 164 | 165 | time_t clock_get_current_time_utc(); 166 | 167 | 168 | 169 | /** 170 | * @brief saves the current configuration to NVS memory 171 | */ 172 | esp_err_t clock_save_config(clock_config_t *conf); 173 | 174 | 175 | /** 176 | * @brief retrieves the entire clock configuration 177 | */ 178 | clock_config_t clock_get_config(); 179 | 180 | /** 181 | * @brief retrieves only the timezone_t component of the clock configuration 182 | * This function is helpful if only a portion of the config is needed and dumping 183 | * the entire configuration on the stack would be wasteful. 184 | * @see clock_get_config 185 | */ 186 | timezone_t clock_get_config_timezone(); 187 | 188 | /** 189 | * @brief retrieves only the display_config_t component of the clock configuration 190 | * This function is helpful if only a portion of the config is needed and dumping 191 | * the entire configuration on the stack would be wasteful. 192 | * @see clock_get_config 193 | */ 194 | display_config_t clock_get_config_display(); 195 | 196 | 197 | 198 | /** 199 | * @brief Retrieves the configuration from NVS memory 200 | */ 201 | esp_err_t clock_get_nvs_config(clock_config_t *conf); 202 | 203 | /** 204 | * Mutex lock to avoid resource sharing issues when accessing the NVS 205 | */ 206 | bool clock_nvs_lock(TickType_t xTicksToWait); 207 | 208 | /** 209 | * @see clock_nvs_lock 210 | */ 211 | void clock_nvs_unlock(); 212 | 213 | 214 | esp_err_t clock_save_timezone(timezone_t *tz); 215 | 216 | 217 | //void clock_save_timezone_task(void *pvParameter); 218 | 219 | void clock_change_timezone(timezone_t tz); 220 | esp_err_t clock_get_nvs_timezone(timezone_t *tz); 221 | 222 | bool clock_realign(time_t new_t); 223 | 224 | 225 | #ifdef __cplusplus 226 | } 227 | #endif 228 | 229 | #endif /* MAIN_CLOCK_H_ */ 230 | -------------------------------------------------------------------------------- /nixie_clock_code/main/include/display.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2020 Tony Pottier 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | @file display.h 23 | @author Tony Pottier 24 | 25 | Contains functions to control the nixie clock display over SPI 26 | 27 | */ 28 | 29 | 30 | #ifndef MAIN_DISPLAY_H_ 31 | #define MAIN_DISPLAY_H_ 32 | 33 | #include 34 | #include 35 | #include "ws2812.h" 36 | 37 | #ifdef __cplusplus 38 | extern "C" { 39 | #endif 40 | 41 | #define DISPLAY_SPI_CS_GPIO 15 42 | #define DISPLAY_SPI_MOSI_GPIO 13 43 | #define DISPLAY_SPI_SCLK_GPIO 14 44 | #define DISPLAY_OE_GPIO 27 45 | #define DISPLAY_HVEN_GPIO 26 46 | #define DEBUG_USB_POWER_ON_GPIO 17 47 | 48 | #define DISPLAY_DIGIT_COUNT 6 49 | 50 | #define DISPLAY_TOP_DOT_MASK (uint16_t)(1<<10) 51 | #define DISPLAY_BOTTOM_DOT_MASK (uint16_t)(1<<11) 52 | 53 | 54 | 55 | typedef enum display_leading_zero_t{ 56 | DISPLAY_LEADING_ZERO_HIDE = 0, 57 | DISPLAY_LEADING_ZERO_SHOW = 1 58 | }display_leading_zero_t; 59 | 60 | typedef enum display_dot_mode_t{ 61 | DISPLAY_DOT_MODE_BLINK_ON_EVEN_SECONDS = 0, 62 | DISPLAY_DOT_MODE_BLINK_ON_ODDS_SECONDS = 1, 63 | DISPLAY_DOT_MODE_BLINK_LEFT_RIGHT = 2, 64 | DISPLAY_DOT_MODE_BLINK_WHEEL_CW = 3, 65 | DISPLAY_DOT_MODE_PM_INDICATOR = 4, 66 | DISPLAY_DOT_MODE_PM_INDICATOR_BLINK = 5, 67 | DISPLAY_DOT_MODE_OFF = 0x7fffffff 68 | }display_dot_mode_t; 69 | 70 | typedef struct display_config_t{ 71 | display_dot_mode_t dot_mode; 72 | display_leading_zero_t leading_zero; 73 | bool twelve_hours_format; 74 | float led_brightness; 75 | rgb_t led_color; 76 | }display_config_t; 77 | 78 | esp_err_t display_init(); 79 | esp_err_t display_write_time(struct tm *time); 80 | uint16_t* display_get_vram(); 81 | esp_err_t display_write_vram(); 82 | esp_err_t display_register_usb_power_interrupt(); 83 | 84 | /** 85 | * @brief set the clock display configuration that will be used while displaying the time 86 | * @see display_write_time 87 | */ 88 | void display_set_config(display_config_t* config); 89 | 90 | void display_turn_on(); 91 | void display_turn_off(); 92 | 93 | 94 | #ifdef __cplusplus 95 | } 96 | #endif 97 | 98 | #endif /* MAIN_DISPLAY_H_ */ 99 | -------------------------------------------------------------------------------- /nixie_clock_code/main/include/ds3231.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2019 Tony Pottier 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | @file ds3231.h 23 | @author Tony Pottier 24 | @brief Defines all functions necessary to query a DS3231 IC 25 | 26 | @see https://idyl.io 27 | @see https://github.com/tonyp7/esp32-nixie-clock 28 | 29 | */ 30 | 31 | #ifndef MAIN_DS3231_H_ 32 | #define MAIN_DS3231_H_ 33 | 34 | #include 35 | #include 36 | #include 37 | 38 | #ifdef __cplusplus 39 | extern "C" { 40 | #endif 41 | 42 | #define DS3231_ADDR 0x68 43 | 44 | 45 | #define DS3231_SECONDS_REGISTER 0x00 46 | #define DS3231_MINUTES_REGISTER 0x01 47 | #define DS3231_HOURS_REGISTER 0x02 48 | #define DS3231_DAY_REGISTER 0x03 49 | #define DS3231_DATE_REGISTER 0x04 50 | #define DS3231_MONTH_REGISTER 0x05 51 | #define DS3231_YEAR_REGISTER 0x06 52 | #define DS3231_TIME_REGISTERS_COUNT 7 /* 7 registers from 0x00 to 0x06 */ 53 | 54 | #define DS3231_CONTROL_REGISTER 0x0E 55 | #define DS3231_CONTROL_STATUS_REGISTER 0x0F 56 | #define DS3231_AGING_OFFSET_REGISTER 0x10 57 | #define DS3231_TEMP_MSB_REGISTER 0x11 58 | #define DS3231_TEMP_LSB_REGISTER 0x12 59 | 60 | 61 | 62 | void ds3231_task(void *pvParameter); 63 | 64 | esp_err_t ds3231_enable_square_wave(); 65 | 66 | float ds3231_get_temperature(); 67 | void ds3231_i2c_init(); 68 | int ds3231_gettimeofday(); 69 | void ds3231_set_datetime(time_t datetime); 70 | 71 | esp_err_t ds3231_get_time(struct tm *timeinfo); 72 | esp_err_t ds3231_set_time(const struct tm *timeinfo); 73 | uint8_t ds3231_bcd2dec (uint8_t val); 74 | uint8_t ds3231_dec2bcd (uint8_t val); 75 | 76 | 77 | #ifdef __cplusplus 78 | } 79 | #endif 80 | 81 | 82 | #endif /* MAIN_DS3231_H_ */ 83 | -------------------------------------------------------------------------------- /nixie_clock_code/main/include/http_client.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2019 Tony Pottier 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | @file http_client.h 23 | @author Tony Pottier 24 | 25 | Contains wrappers around the esp http client for the mclk.org time API. 26 | 27 | */ 28 | 29 | 30 | #ifndef MAIN_INCLUDE_HTTP_CLIENT_H_ 31 | #define MAIN_INCLUDE_HTTP_CLIENT_H_ 32 | 33 | #include /* esp_http_client_handle_t */ 34 | #include "time.h" /* time_t */ 35 | #include "clock.h" /* timezone_t */ 36 | 37 | #ifdef __cplusplus 38 | extern "C" { 39 | #endif 40 | 41 | #define HTTP_CLIENT_MAX_REQUEST_SIZE 256 42 | 43 | esp_err_t http_client_init(); 44 | void http_client_cleanup(esp_http_client_handle_t client); 45 | void http_client_get_api_time(char* timezone); 46 | void http_client_get_transitions(timezone_t timezone, time_t now); 47 | void http_rest(); 48 | //void http_client_task(void *pvParameter); 49 | 50 | 51 | #ifdef __cplusplus 52 | } 53 | #endif 54 | 55 | 56 | #endif /* MAIN_INCLUDE_HTTP_CLIENT_H_ */ 57 | -------------------------------------------------------------------------------- /nixie_clock_code/main/include/i2c.h: -------------------------------------------------------------------------------- 1 | /** 2 | Copyright (c) 2020 Tony Pottier 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | @file i2c.h 23 | @author Tony Pottier 24 | 25 | Contains helper functions to communicate over the I2C bus 26 | 27 | */ 28 | 29 | #ifndef MAIN_I2C_H_ 30 | #define MAIN_I2C_H_ 31 | 32 | #include 33 | #include 34 | 35 | #ifdef __cplusplus 36 | extern "C" { 37 | #endif 38 | 39 | 40 | #define I2C_MASTER_SCL_IO 22 /*!< gpio number for I2C master clock */ 41 | #define I2C_MASTER_SDA_IO 21 /*!< gpio number for I2C master data */ 42 | #define I2C_MASTER_NUM I2C_NUM_0 /*!< I2C port number for master dev */ 43 | #define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master do not need buffer */ 44 | #define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master do not need buffer */ 45 | #define I2C_MASTER_FREQ_HZ 400000 /*!< I2C master clock frequency */ 46 | 47 | 48 | 49 | #define WRITE_BIT I2C_MASTER_WRITE /*!< I2C master write */ 50 | #define READ_BIT I2C_MASTER_READ /*!< I2C master read */ 51 | #define ACK_CHECK_EN 0x1 /*!< I2C master will check ack from slave*/ 52 | #define ACK_CHECK_DIS 0x0 /*!< I2C master will not check ack from slave */ 53 | #define ACK_VAL 0x0 /*!< I2C ack value */ 54 | #define NACK_VAL 0x1 /*!< I2C nack value */ 55 | 56 | 57 | 58 | 59 | esp_err_t i2c_master_init(); 60 | 61 | 62 | 63 | 64 | /** 65 | * @brief I2C helper function to write a single byte to a register 66 | * 67 | */ 68 | esp_err_t i2c_write_byte(const uint8_t slave_address, const uint8_t register_address, const uint8_t value); 69 | 70 | /** 71 | * @brief I2C helper function to read a single byte from a register 72 | * 73 | */ 74 | esp_err_t i2c_read_byte(const uint8_t slave_address, const uint8_t register_address, uint8_t *value); 75 | 76 | 77 | /** 78 | * @brief I2C helper function to read bytes starting from specified register 79 | * @warning: it is the caller responsability to ensure data buffer is big enough to store data_len bytes. 80 | */ 81 | esp_err_t i2c_read_bytes(const uint8_t slave_address, const uint8_t register_address, uint8_t *data, size_t data_len); 82 | 83 | 84 | esp_err_t i2c_write_bytes(const uint8_t slave_address, const uint8_t register_address, uint8_t *data, size_t data_len); 85 | 86 | #ifdef __cplusplus 87 | } 88 | #endif 89 | 90 | #endif /* MAIN_I2C_H_ */ 91 | -------------------------------------------------------------------------------- /nixie_clock_code/main/include/list.h: -------------------------------------------------------------------------------- 1 | /** 2 | Copyright (c) 2020 Tony Pottier 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | @file list.h 23 | @author Tony Pottier 24 | @brief Simple C linked list 25 | 26 | @see https://idyl.io 27 | @see https://github.com/tonyp7/esp32-nixie-clock 28 | 29 | */ 30 | 31 | #ifndef MAIN_LIST_H_ 32 | #define MAIN_LIST_H_ 33 | 34 | #include "clock.h" /* for sleep_event_t */ 35 | 36 | #ifdef __cplusplus 37 | extern "C" { 38 | #endif 39 | 40 | #define LIST_DATA_TYPE sleep_event_t 41 | 42 | struct node_t { 43 | LIST_DATA_TYPE data; 44 | struct node_t* next; 45 | }; 46 | typedef struct node_t node_t; 47 | 48 | typedef struct list_t { 49 | unsigned int count; 50 | node_t* first; 51 | node_t* last; 52 | }list_t; 53 | 54 | 55 | /** 56 | * @brief generate a list object 57 | */ 58 | list_t* list_create(); 59 | 60 | /** 61 | * @brief frees all memory allocated to the list and its elements 62 | */ 63 | void list_free(list_t* list); 64 | 65 | /** 66 | * @brief clear and frees all elements of a list, without destroying the list itself 67 | */ 68 | void list_clear(list_t* list); 69 | 70 | 71 | /** 72 | * @brief add data to the (end) tail of the list 73 | */ 74 | void list_push(list_t* list, LIST_DATA_TYPE data); 75 | 76 | 77 | /** 78 | * @brief add data in the list as per the comparison function provided 79 | */ 80 | void list_add_ordered(list_t* list, LIST_DATA_TYPE data, int (*comp)(LIST_DATA_TYPE*, LIST_DATA_TYPE*)); 81 | 82 | 83 | /** 84 | * @brief Remove an item from the beginning of the list 85 | */ 86 | int list_shift(list_t* list, LIST_DATA_TYPE * data); 87 | 88 | 89 | /** 90 | * @brief Remove an item at the end of the list 91 | */ 92 | int list_pop(list_t* list, LIST_DATA_TYPE * data); 93 | 94 | 95 | /** 96 | * @brief Get the first element of the list 97 | */ 98 | int list_peek(list_t* list, LIST_DATA_TYPE * data); 99 | 100 | 101 | #ifdef __cplusplus 102 | } 103 | #endif 104 | 105 | #endif -------------------------------------------------------------------------------- /nixie_clock_code/main/include/webapp.h: -------------------------------------------------------------------------------- 1 | /** 2 | Copyright (c) 2020 Tony Pottier 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | @file webapp.h 23 | @author Tony Pottier 24 | 25 | Contains page logic handling web app functionalities 26 | 27 | */ 28 | 29 | #ifndef CLOCK_WEBAPP_H_ 30 | #define CLOCK_WEBAPP_H_ 31 | 32 | #include 33 | 34 | #ifdef __cplusplus 35 | extern "C" { 36 | #endif 37 | 38 | esp_err_t webapp_register_handlers(); 39 | 40 | #ifdef __cplusplus 41 | } 42 | #endif 43 | 44 | #endif -------------------------------------------------------------------------------- /nixie_clock_code/main/include/ws2812.h: -------------------------------------------------------------------------------- 1 | /** 2 | Copyright (c) 2020 Tony Pottier 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | @file ws2812.h 23 | @author Tony Pottier 24 | @brief Provides a WS2812 "neopixel" software driver 25 | 26 | @see https://idyl.io 27 | @see https://github.com/tonyp7/esp32-nixie-clock 28 | 29 | This is based of FozzTexx's public domain code on WS2812 30 | @see https://github.com/FozzTexx/ws2812-demo 31 | 32 | */ 33 | 34 | #ifndef MAIN_WS2812_H_ 35 | #define MAIN_WS2812_H_ 36 | 37 | #include 38 | #include 39 | 40 | 41 | #ifdef __cplusplus 42 | extern "C" { 43 | #endif 44 | 45 | #define WS2818_DATA_GPIO 23 46 | #define WS2812_STRIP_SIZE 6 47 | 48 | 49 | /** 50 | * structure holding a RGB 24 bit colors information in a 32 bit int 51 | */ 52 | typedef union { 53 | struct __attribute__ ((packed)) { 54 | uint8_t r, g, b; 55 | }; 56 | uint32_t num; 57 | } rgb_t; 58 | 59 | 60 | /** 61 | * @brief defines the type of message to be sent to the queue. 62 | * The WS2812 queue can only process color information for simplicity 63 | */ 64 | typedef struct ws2812_message_t { 65 | rgb_t rgb; 66 | } ws2812_message_t; 67 | 68 | esp_err_t ws2812_init(); 69 | 70 | 71 | 72 | /** 73 | * @brief Helper to generate a rgb_t based on r, g, b parameters 74 | */ 75 | inline rgb_t ws2812_create_rgb(uint8_t r, uint8_t g, uint8_t b){ 76 | rgb_t v; 77 | 78 | v.r = r; 79 | v.g = g; 80 | v.b = b; 81 | return v; 82 | } 83 | 84 | /** 85 | * @brief Sends the message to the ws2812 queue to process a color change 86 | * @return ESP_OK if success, ESP_FAIL if the queue was full or any other error 87 | */ 88 | esp_err_t ws2812_set_backlight_color(rgb_t c); 89 | 90 | /** 91 | * @brief helper for ws2812_set_backlight_color 92 | * @see ws2812_set_backlight_color 93 | */ 94 | inline esp_err_t ws2812_set_backlight_color_rgb(uint8_t r, uint8_t g, uint8_t b){ 95 | return ws2812_set_backlight_color(ws2812_create_rgb(r, g, b)); 96 | } 97 | 98 | 99 | void ws2812_set_colors(unsigned int length, rgb_t *array); 100 | 101 | 102 | #ifdef __cplusplus 103 | } 104 | #endif 105 | 106 | #endif /* MAIN_WS2812_H_ */ 107 | -------------------------------------------------------------------------------- /nixie_clock_code/main/iro.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * iro.js v4.4.0 3 | * 2016-2019 James Daniel 4 | * Licensed under MPL 2.0 5 | * github.com/jaames/iro.js 6 | */ 7 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.iro=e()}(this,function(){"use strict";var c=function(){},i={},h=[],u=[];function p(t,e){var o,n,r,i,s=arguments,a=u;for(i=arguments.length;2 32 | #include "list.h" 33 | 34 | list_t* list_create() 35 | { 36 | 37 | list_t* list = malloc(sizeof(list_t)); 38 | 39 | list->first = NULL; 40 | list->last = NULL; 41 | list->count = 0; 42 | 43 | return list; 44 | } 45 | 46 | 47 | void list_free(list_t* list) 48 | { 49 | 50 | node_t* next; 51 | node_t* curr = list->first; 52 | 53 | while (curr != NULL) { 54 | next = curr->next; 55 | free(curr); 56 | curr = next; 57 | } 58 | 59 | free(list); 60 | } 61 | 62 | void list_clear(list_t* list) 63 | { 64 | node_t* next; 65 | node_t* curr = list->first; 66 | 67 | while (curr != NULL) { 68 | next = curr->next; 69 | free(curr); 70 | curr = next; 71 | } 72 | 73 | list->count = 0; 74 | list->first = NULL; 75 | list->last = NULL; 76 | } 77 | 78 | 79 | 80 | void list_push(list_t* list, LIST_DATA_TYPE data) 81 | { 82 | node_t* node = malloc(sizeof(node_t)); 83 | node->data = data; 84 | node->next = NULL; /* sent to the end so there is no next */ 85 | 86 | if ( list->last != NULL) { 87 | node_t* last = list->last; 88 | last->next = node; 89 | list->last = node; 90 | } 91 | else { 92 | 93 | list->first = node; 94 | list->last = node; 95 | } 96 | 97 | list->count++; 98 | } 99 | 100 | 101 | 102 | void list_add_ordered(list_t* list, LIST_DATA_TYPE data, int (*comp)(LIST_DATA_TYPE*, LIST_DATA_TYPE*)) 103 | { 104 | 105 | if (list->count == 0) return list_push(list, data); 106 | 107 | node_t* current = list->first; 108 | node_t* previous = NULL; 109 | 110 | /* create the node to add to the list */ 111 | node_t* node = malloc(sizeof(node_t)); 112 | node->data = data; 113 | 114 | 115 | /* find spot in list to add the new element */ 116 | while (current != NULL && comp( &(current->data), &data) < 0) { 117 | previous = current; 118 | current = current->next; 119 | } 120 | node->next = current; 121 | 122 | if (previous == NULL) { 123 | /* added at the beginning of the list */ 124 | list->first = node; 125 | 126 | /* in case this was the first element to be added */ 127 | if (list->last == NULL) { 128 | list->last = node; 129 | } 130 | } 131 | else { 132 | 133 | /* the end of the list is the newly inserted node ? */ 134 | if (list->last == previous) { 135 | list->last = node; 136 | } 137 | previous->next = node; 138 | } 139 | 140 | 141 | list->count++; 142 | 143 | } 144 | 145 | 146 | int list_shift(list_t* list, LIST_DATA_TYPE * data) 147 | { 148 | if (list->first) { 149 | node_t* first = list->first; 150 | LIST_DATA_TYPE shift_data = first->data; 151 | 152 | if (list->last == list->first) { /*edge case where list contains one element */ 153 | list->first = NULL; 154 | list->last = NULL; 155 | } 156 | else { 157 | list->first = first->next; 158 | } 159 | 160 | free(first); 161 | list->count--; 162 | 163 | /* NULL can be passed as data. In that case value isn't sent back to caller */ 164 | if(data){ 165 | *data = shift_data; 166 | } 167 | 168 | return 0; 169 | } 170 | else { 171 | return -1; 172 | } 173 | } 174 | 175 | 176 | int list_peek(list_t* list, LIST_DATA_TYPE * data) 177 | { 178 | if (list->first) { 179 | *data = list->first->data; 180 | return 0; 181 | } 182 | else{ 183 | return -1; 184 | } 185 | } 186 | 187 | int list_pop(list_t* list, LIST_DATA_TYPE * data) 188 | { 189 | if (list->last) { 190 | 191 | node_t* last = list->last; 192 | LIST_DATA_TYPE pop_data = last->data; 193 | 194 | if (list->last == list->first) { /*edge case where list contains one element */ 195 | list->first = NULL; 196 | list->last = NULL; 197 | } 198 | else { 199 | node_t* current = list->first; 200 | while (current != NULL && current->next != list->last) { 201 | current = current->next; 202 | } 203 | current->next = NULL; 204 | list->last = current; 205 | } 206 | 207 | free(last); 208 | list->count--; 209 | 210 | *data = pop_data; 211 | return 0; 212 | 213 | } 214 | else { 215 | return -1; 216 | } 217 | } -------------------------------------------------------------------------------- /nixie_clock_code/main/main.c: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2017-2019 Tony Pottier 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | @file main.c 23 | @author Tony Pottier 24 | @brief Entry point for the ESP32 application. 25 | @see https://idyl.io 26 | @see https://github.com/tonyp7/esp32-wifi-manager 27 | */ 28 | 29 | 30 | 31 | #include 32 | #include 33 | #include "freertos/FreeRTOS.h" 34 | #include "driver/gpio.h" 35 | #include "driver/spi_master.h" 36 | #include "freertos/task.h" 37 | #include "esp_system.h" 38 | #include "esp_spi_flash.h" 39 | #include "esp_wifi.h" 40 | #include "esp_system.h" 41 | #include "nvs_flash.h" 42 | #include "esp_log.h" 43 | #include "freertos/event_groups.h" 44 | #include "mdns.h" 45 | #include "lwip/api.h" 46 | #include "lwip/err.h" 47 | #include "lwip/netdb.h" 48 | #include "cJSON.h" 49 | 50 | 51 | #include "wifi_manager.h" 52 | 53 | #include "clock.h" 54 | #include "i2c.h" 55 | #include "ds3231.h" 56 | #include "display.h" 57 | #include "ws2812.h" 58 | #include "webapp.h" 59 | 60 | 61 | 62 | /* @brief tag used for ESP serial console messages */ 63 | static const char TAG[] = "main"; 64 | 65 | /** 66 | * @brief RTOS task that periodically prints the heap memory available. 67 | * @note Pure debug information, should not be ever started on production code 68 | */ 69 | void monitoring_task(void *pvParameter) 70 | { 71 | for(;;){ 72 | ESP_LOGI(TAG, "free heap: %d",esp_get_free_heap_size()); 73 | vTaskDelay( pdMS_TO_TICKS(20000) ); 74 | } 75 | } 76 | 77 | 78 | void app_main() 79 | { 80 | 81 | 82 | /* GPIO/RMT init for the WS2812 driver */ 83 | ESP_ERROR_CHECK(ws2812_init()); 84 | 85 | /* GPIO init for SPI transactions & GPIOs used to control the display */ 86 | ESP_ERROR_CHECK(display_init()); 87 | 88 | /* start the wifi manager */ 89 | wifi_manager_start(); 90 | webapp_register_handlers(); 91 | 92 | /* register cb for internet connectivity */ 93 | wifi_manager_set_callback(WM_EVENT_STA_GOT_IP, &clock_notify_sta_got_ip); 94 | 95 | /* clock task */ 96 | xTaskCreatePinnedToCore(&clock_task, "clock_task", 16384, NULL, CLOCK_TASK_PRIORITY, NULL, 1); 97 | 98 | //xTaskCreatePinnedToCore(&monitoring_task, "monitoring_task", 2048, NULL, 1, NULL, 1); 99 | } 100 | -------------------------------------------------------------------------------- /nixie_clock_code/main/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/nixie_clock_code/main/settings.png -------------------------------------------------------------------------------- /nixie_clock_code/main/timezones.json: -------------------------------------------------------------------------------- 1 | [ 2 | "Africa\/Abidjan", 3 | "Africa\/Accra", 4 | "Africa\/Addis_Ababa", 5 | "Africa\/Algiers", 6 | "Africa\/Asmara", 7 | "Africa\/Bamako", 8 | "Africa\/Bangui", 9 | "Africa\/Banjul", 10 | "Africa\/Bissau", 11 | "Africa\/Blantyre", 12 | "Africa\/Brazzaville", 13 | "Africa\/Bujumbura", 14 | "Africa\/Cairo", 15 | "Africa\/Casablanca", 16 | "Africa\/Ceuta", 17 | "Africa\/Conakry", 18 | "Africa\/Dakar", 19 | "Africa\/Dar_es_Salaam", 20 | "Africa\/Djibouti", 21 | "Africa\/Douala", 22 | "Africa\/El_Aaiun", 23 | "Africa\/Freetown", 24 | "Africa\/Gaborone", 25 | "Africa\/Harare", 26 | "Africa\/Johannesburg", 27 | "Africa\/Juba", 28 | "Africa\/Kampala", 29 | "Africa\/Khartoum", 30 | "Africa\/Kigali", 31 | "Africa\/Kinshasa", 32 | "Africa\/Lagos", 33 | "Africa\/Libreville", 34 | "Africa\/Lome", 35 | "Africa\/Luanda", 36 | "Africa\/Lubumbashi", 37 | "Africa\/Lusaka", 38 | "Africa\/Malabo", 39 | "Africa\/Maputo", 40 | "Africa\/Maseru", 41 | "Africa\/Mbabane", 42 | "Africa\/Mogadishu", 43 | "Africa\/Monrovia", 44 | "Africa\/Nairobi", 45 | "Africa\/Ndjamena", 46 | "Africa\/Niamey", 47 | "Africa\/Nouakchott", 48 | "Africa\/Ouagadougou", 49 | "Africa\/Porto-Novo", 50 | "Africa\/Sao_Tome", 51 | "Africa\/Tripoli", 52 | "Africa\/Tunis", 53 | "Africa\/Windhoek", 54 | "America\/Adak", 55 | "America\/Anchorage", 56 | "America\/Anguilla", 57 | "America\/Antigua", 58 | "America\/Araguaina", 59 | "America\/Argentina\/Buenos_Aires", 60 | "America\/Argentina\/Catamarca", 61 | "America\/Argentina\/Cordoba", 62 | "America\/Argentina\/Jujuy", 63 | "America\/Argentina\/La_Rioja", 64 | "America\/Argentina\/Mendoza", 65 | "America\/Argentina\/Rio_Gallegos", 66 | "America\/Argentina\/Salta", 67 | "America\/Argentina\/San_Juan", 68 | "America\/Argentina\/San_Luis", 69 | "America\/Argentina\/Tucuman", 70 | "America\/Argentina\/Ushuaia", 71 | "America\/Aruba", 72 | "America\/Asuncion", 73 | "America\/Atikokan", 74 | "America\/Bahia", 75 | "America\/Bahia_Banderas", 76 | "America\/Barbados", 77 | "America\/Belem", 78 | "America\/Belize", 79 | "America\/Blanc-Sablon", 80 | "America\/Boa_Vista", 81 | "America\/Bogota", 82 | "America\/Boise", 83 | "America\/Cambridge_Bay", 84 | "America\/Campo_Grande", 85 | "America\/Cancun", 86 | "America\/Caracas", 87 | "America\/Cayenne", 88 | "America\/Cayman", 89 | "America\/Chicago", 90 | "America\/Chihuahua", 91 | "America\/Costa_Rica", 92 | "America\/Creston", 93 | "America\/Cuiaba", 94 | "America\/Curacao", 95 | "America\/Danmarkshavn", 96 | "America\/Dawson", 97 | "America\/Dawson_Creek", 98 | "America\/Denver", 99 | "America\/Detroit", 100 | "America\/Dominica", 101 | "America\/Edmonton", 102 | "America\/Eirunepe", 103 | "America\/El_Salvador", 104 | "America\/Fort_Nelson", 105 | "America\/Fortaleza", 106 | "America\/Glace_Bay", 107 | "America\/Goose_Bay", 108 | "America\/Grand_Turk", 109 | "America\/Grenada", 110 | "America\/Guadeloupe", 111 | "America\/Guatemala", 112 | "America\/Guayaquil", 113 | "America\/Guyana", 114 | "America\/Halifax", 115 | "America\/Havana", 116 | "America\/Hermosillo", 117 | "America\/Indiana\/Indianapolis", 118 | "America\/Indiana\/Knox", 119 | "America\/Indiana\/Marengo", 120 | "America\/Indiana\/Petersburg", 121 | "America\/Indiana\/Tell_City", 122 | "America\/Indiana\/Vevay", 123 | "America\/Indiana\/Vincennes", 124 | "America\/Indiana\/Winamac", 125 | "America\/Inuvik", 126 | "America\/Iqaluit", 127 | "America\/Jamaica", 128 | "America\/Juneau", 129 | "America\/Kentucky\/Louisville", 130 | "America\/Kentucky\/Monticello", 131 | "America\/Kralendijk", 132 | "America\/La_Paz", 133 | "America\/Lima", 134 | "America\/Los_Angeles", 135 | "America\/Lower_Princes", 136 | "America\/Maceio", 137 | "America\/Managua", 138 | "America\/Manaus", 139 | "America\/Marigot", 140 | "America\/Martinique", 141 | "America\/Matamoros", 142 | "America\/Mazatlan", 143 | "America\/Menominee", 144 | "America\/Merida", 145 | "America\/Metlakatla", 146 | "America\/Mexico_City", 147 | "America\/Miquelon", 148 | "America\/Moncton", 149 | "America\/Monterrey", 150 | "America\/Montevideo", 151 | "America\/Montserrat", 152 | "America\/Nassau", 153 | "America\/New_York", 154 | "America\/Nipigon", 155 | "America\/Nome", 156 | "America\/Noronha", 157 | "America\/North_Dakota\/Beulah", 158 | "America\/North_Dakota\/Center", 159 | "America\/North_Dakota\/New_Salem", 160 | "America\/Nuuk", 161 | "America\/Ojinaga", 162 | "America\/Panama", 163 | "America\/Pangnirtung", 164 | "America\/Paramaribo", 165 | "America\/Phoenix", 166 | "America\/Port-au-Prince", 167 | "America\/Port_of_Spain", 168 | "America\/Porto_Velho", 169 | "America\/Puerto_Rico", 170 | "America\/Punta_Arenas", 171 | "America\/Rainy_River", 172 | "America\/Rankin_Inlet", 173 | "America\/Recife", 174 | "America\/Regina", 175 | "America\/Resolute", 176 | "America\/Rio_Branco", 177 | "America\/Santarem", 178 | "America\/Santiago", 179 | "America\/Santo_Domingo", 180 | "America\/Sao_Paulo", 181 | "America\/Scoresbysund", 182 | "America\/Sitka", 183 | "America\/St_Barthelemy", 184 | "America\/St_Johns", 185 | "America\/St_Kitts", 186 | "America\/St_Lucia", 187 | "America\/St_Thomas", 188 | "America\/St_Vincent", 189 | "America\/Swift_Current", 190 | "America\/Tegucigalpa", 191 | "America\/Thule", 192 | "America\/Thunder_Bay", 193 | "America\/Tijuana", 194 | "America\/Toronto", 195 | "America\/Tortola", 196 | "America\/Vancouver", 197 | "America\/Whitehorse", 198 | "America\/Winnipeg", 199 | "America\/Yakutat", 200 | "America\/Yellowknife", 201 | "Antarctica\/Casey", 202 | "Antarctica\/Davis", 203 | "Antarctica\/DumontDUrville", 204 | "Antarctica\/Macquarie", 205 | "Antarctica\/Mawson", 206 | "Antarctica\/McMurdo", 207 | "Antarctica\/Palmer", 208 | "Antarctica\/Rothera", 209 | "Antarctica\/Syowa", 210 | "Antarctica\/Troll", 211 | "Antarctica\/Vostok", 212 | "Arctic\/Longyearbyen", 213 | "Asia\/Aden", 214 | "Asia\/Almaty", 215 | "Asia\/Amman", 216 | "Asia\/Anadyr", 217 | "Asia\/Aqtau", 218 | "Asia\/Aqtobe", 219 | "Asia\/Ashgabat", 220 | "Asia\/Atyrau", 221 | "Asia\/Baghdad", 222 | "Asia\/Bahrain", 223 | "Asia\/Baku", 224 | "Asia\/Bangkok", 225 | "Asia\/Barnaul", 226 | "Asia\/Beirut", 227 | "Asia\/Bishkek", 228 | "Asia\/Brunei", 229 | "Asia\/Chita", 230 | "Asia\/Choibalsan", 231 | "Asia\/Colombo", 232 | "Asia\/Damascus", 233 | "Asia\/Dhaka", 234 | "Asia\/Dili", 235 | "Asia\/Dubai", 236 | "Asia\/Dushanbe", 237 | "Asia\/Famagusta", 238 | "Asia\/Gaza", 239 | "Asia\/Hebron", 240 | "Asia\/Ho_Chi_Minh", 241 | "Asia\/Hong_Kong", 242 | "Asia\/Hovd", 243 | "Asia\/Irkutsk", 244 | "Asia\/Jakarta", 245 | "Asia\/Jayapura", 246 | "Asia\/Jerusalem", 247 | "Asia\/Kabul", 248 | "Asia\/Kamchatka", 249 | "Asia\/Karachi", 250 | "Asia\/Kathmandu", 251 | "Asia\/Khandyga", 252 | "Asia\/Kolkata", 253 | "Asia\/Krasnoyarsk", 254 | "Asia\/Kuala_Lumpur", 255 | "Asia\/Kuching", 256 | "Asia\/Kuwait", 257 | "Asia\/Macau", 258 | "Asia\/Magadan", 259 | "Asia\/Makassar", 260 | "Asia\/Manila", 261 | "Asia\/Muscat", 262 | "Asia\/Nicosia", 263 | "Asia\/Novokuznetsk", 264 | "Asia\/Novosibirsk", 265 | "Asia\/Omsk", 266 | "Asia\/Oral", 267 | "Asia\/Phnom_Penh", 268 | "Asia\/Pontianak", 269 | "Asia\/Pyongyang", 270 | "Asia\/Qatar", 271 | "Asia\/Qostanay", 272 | "Asia\/Qyzylorda", 273 | "Asia\/Riyadh", 274 | "Asia\/Sakhalin", 275 | "Asia\/Samarkand", 276 | "Asia\/Seoul", 277 | "Asia\/Shanghai", 278 | "Asia\/Singapore", 279 | "Asia\/Srednekolymsk", 280 | "Asia\/Taipei", 281 | "Asia\/Tashkent", 282 | "Asia\/Tbilisi", 283 | "Asia\/Tehran", 284 | "Asia\/Thimphu", 285 | "Asia\/Tokyo", 286 | "Asia\/Tomsk", 287 | "Asia\/Ulaanbaatar", 288 | "Asia\/Urumqi", 289 | "Asia\/Ust-Nera", 290 | "Asia\/Vientiane", 291 | "Asia\/Vladivostok", 292 | "Asia\/Yakutsk", 293 | "Asia\/Yangon", 294 | "Asia\/Yekaterinburg", 295 | "Asia\/Yerevan", 296 | "Atlantic\/Azores", 297 | "Atlantic\/Bermuda", 298 | "Atlantic\/Canary", 299 | "Atlantic\/Cape_Verde", 300 | "Atlantic\/Faroe", 301 | "Atlantic\/Madeira", 302 | "Atlantic\/Reykjavik", 303 | "Atlantic\/South_Georgia", 304 | "Atlantic\/St_Helena", 305 | "Atlantic\/Stanley", 306 | "Australia\/Adelaide", 307 | "Australia\/Brisbane", 308 | "Australia\/Broken_Hill", 309 | "Australia\/Currie", 310 | "Australia\/Darwin", 311 | "Australia\/Eucla", 312 | "Australia\/Hobart", 313 | "Australia\/Lindeman", 314 | "Australia\/Lord_Howe", 315 | "Australia\/Melbourne", 316 | "Australia\/Perth", 317 | "Australia\/Sydney", 318 | "Europe\/Amsterdam", 319 | "Europe\/Andorra", 320 | "Europe\/Astrakhan", 321 | "Europe\/Athens", 322 | "Europe\/Belgrade", 323 | "Europe\/Berlin", 324 | "Europe\/Bratislava", 325 | "Europe\/Brussels", 326 | "Europe\/Bucharest", 327 | "Europe\/Budapest", 328 | "Europe\/Busingen", 329 | "Europe\/Chisinau", 330 | "Europe\/Copenhagen", 331 | "Europe\/Dublin", 332 | "Europe\/Gibraltar", 333 | "Europe\/Guernsey", 334 | "Europe\/Helsinki", 335 | "Europe\/Isle_of_Man", 336 | "Europe\/Istanbul", 337 | "Europe\/Jersey", 338 | "Europe\/Kaliningrad", 339 | "Europe\/Kiev", 340 | "Europe\/Kirov", 341 | "Europe\/Lisbon", 342 | "Europe\/Ljubljana", 343 | "Europe\/London", 344 | "Europe\/Luxembourg", 345 | "Europe\/Madrid", 346 | "Europe\/Malta", 347 | "Europe\/Mariehamn", 348 | "Europe\/Minsk", 349 | "Europe\/Monaco", 350 | "Europe\/Moscow", 351 | "Europe\/Oslo", 352 | "Europe\/Paris", 353 | "Europe\/Podgorica", 354 | "Europe\/Prague", 355 | "Europe\/Riga", 356 | "Europe\/Rome", 357 | "Europe\/Samara", 358 | "Europe\/San_Marino", 359 | "Europe\/Sarajevo", 360 | "Europe\/Saratov", 361 | "Europe\/Simferopol", 362 | "Europe\/Skopje", 363 | "Europe\/Sofia", 364 | "Europe\/Stockholm", 365 | "Europe\/Tallinn", 366 | "Europe\/Tirane", 367 | "Europe\/Ulyanovsk", 368 | "Europe\/Uzhgorod", 369 | "Europe\/Vaduz", 370 | "Europe\/Vatican", 371 | "Europe\/Vienna", 372 | "Europe\/Vilnius", 373 | "Europe\/Volgograd", 374 | "Europe\/Warsaw", 375 | "Europe\/Zagreb", 376 | "Europe\/Zaporozhye", 377 | "Europe\/Zurich", 378 | "Indian\/Antananarivo", 379 | "Indian\/Chagos", 380 | "Indian\/Christmas", 381 | "Indian\/Cocos", 382 | "Indian\/Comoro", 383 | "Indian\/Kerguelen", 384 | "Indian\/Mahe", 385 | "Indian\/Maldives", 386 | "Indian\/Mauritius", 387 | "Indian\/Mayotte", 388 | "Indian\/Reunion", 389 | "Pacific\/Apia", 390 | "Pacific\/Auckland", 391 | "Pacific\/Bougainville", 392 | "Pacific\/Chatham", 393 | "Pacific\/Chuuk", 394 | "Pacific\/Easter", 395 | "Pacific\/Efate", 396 | "Pacific\/Enderbury", 397 | "Pacific\/Fakaofo", 398 | "Pacific\/Fiji", 399 | "Pacific\/Funafuti", 400 | "Pacific\/Galapagos", 401 | "Pacific\/Gambier", 402 | "Pacific\/Guadalcanal", 403 | "Pacific\/Guam", 404 | "Pacific\/Honolulu", 405 | "Pacific\/Kiritimati", 406 | "Pacific\/Kosrae", 407 | "Pacific\/Kwajalein", 408 | "Pacific\/Majuro", 409 | "Pacific\/Marquesas", 410 | "Pacific\/Midway", 411 | "Pacific\/Nauru", 412 | "Pacific\/Niue", 413 | "Pacific\/Norfolk", 414 | "Pacific\/Noumea", 415 | "Pacific\/Pago_Pago", 416 | "Pacific\/Palau", 417 | "Pacific\/Pitcairn", 418 | "Pacific\/Pohnpei", 419 | "Pacific\/Port_Moresby", 420 | "Pacific\/Rarotonga", 421 | "Pacific\/Saipan", 422 | "Pacific\/Tahiti", 423 | "Pacific\/Tarawa", 424 | "Pacific\/Tongatapu", 425 | "Pacific\/Wake", 426 | "Pacific\/Wallis", 427 | "UTC" 428 | ] -------------------------------------------------------------------------------- /nixie_clock_code/main/ws2812.c: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2019 Tony Pottier 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | @file ws2812.c 23 | @author Tony Pottier 24 | @brief Provides a WS2812 "neopixel" software driver 25 | 26 | @see https://idyl.io 27 | @see https://github.com/tonyp7/esp32-nixie-clock 28 | 29 | This is based of FozzTexx's public domain code on WS2812 30 | @see https://github.com/FozzTexx/ws2812-demo 31 | 32 | */ 33 | 34 | #include 35 | #include 36 | #include 37 | #include 38 | #include 39 | #include 40 | #include 41 | #include 42 | #include 43 | #include 44 | #include 45 | #include 46 | #include 47 | #include 48 | #include "esp_log.h" 49 | 50 | 51 | #include "ws2812.h" 52 | 53 | #define ETS_RMT_CTRL_INUM 18 54 | #define ESP_RMT_CTRL_DISABLE ESP_RMT_CTRL_DIABLE /* Typo in esp_intr.h */ 55 | 56 | #define DIVIDER 4 /* Above 4, timings start to deviate*/ 57 | #define DURATION 12.5 /* minimum time of a single RMT duration 58 | in nanoseconds based on clock */ 59 | 60 | #define PULSE_T0H ( 350 / (DURATION * DIVIDER)); 61 | #define PULSE_T1H ( 900 / (DURATION * DIVIDER)); 62 | #define PULSE_T0L ( 900 / (DURATION * DIVIDER)); 63 | #define PULSE_T1L ( 350 / (DURATION * DIVIDER)); 64 | #define PULSE_TRS (50000 / (DURATION * DIVIDER)); 65 | 66 | #define MAX_PULSES 32 67 | 68 | #define WS2812_RMT_CHANNEL 0 69 | 70 | #define WS2812_QUEUE_SIZE 3 71 | 72 | typedef union { 73 | struct { 74 | uint32_t duration0:15; 75 | uint32_t level0:1; 76 | uint32_t duration1:15; 77 | uint32_t level1:1; 78 | }; 79 | uint32_t val; 80 | } rmt_pulse_pair_t; 81 | 82 | static uint8_t *ws2812_buffer = NULL; 83 | static unsigned int ws2812_pos, ws2812_len, ws2812_half; 84 | static xSemaphoreHandle ws2812_sem = NULL; 85 | static intr_handle_t rmt_intr_handle = NULL; 86 | static rmt_pulse_pair_t ws2812_bits[2]; 87 | static SemaphoreHandle_t ws2812_mutex = NULL; 88 | 89 | static const char TAG[] = "ws2812"; 90 | 91 | QueueHandle_t ws2812_queue = NULL; 92 | 93 | /* the actual array holding the values of each backlight pixel */ 94 | static rgb_t *ws2812_pixels = NULL; 95 | 96 | float clamp(float d, float min, float max) { 97 | const float t = d < min ? min : d; 98 | return t > max ? max : t; 99 | } 100 | 101 | /** 102 | * @brief RTOS task processing backlight color changes 103 | */ 104 | static void ws2812_task(void *pvParameters) 105 | { 106 | ws2812_message_t msg; 107 | const uint8_t pixel_count = WS2812_STRIP_SIZE; 108 | rgb_t *pixels = malloc(sizeof(rgb_t) * pixel_count); 109 | 110 | 111 | for(;;) { 112 | if(xQueueReceive(ws2812_queue, &msg, portMAX_DELAY)) { 113 | 114 | ESP_LOGI(TAG, "Received R:%d G:%d B:%d", msg.rgb.r, msg.rgb.g, msg.rgb.b); 115 | 116 | for (uint8_t i = 0; i < pixel_count; i++) { 117 | pixels[i] = msg.rgb; 118 | } 119 | 120 | ws2812_set_colors(pixel_count, pixels); 121 | } 122 | } 123 | 124 | } 125 | 126 | 127 | 128 | float impulse( float k, float x ){ 129 | float h = k*x; 130 | return h*expf(1.0f-h); 131 | } 132 | 133 | /** 134 | * @brief exponential step interp. Typical k: 10.0f. Typical n: 1.0f 135 | */ 136 | float exp_step(float x, float k, float n){ 137 | return expf( -k * powf(x, n) ); 138 | } 139 | 140 | 141 | 142 | esp_err_t ws2812_set_backlight_color(rgb_t c){ 143 | 144 | ws2812_message_t msg; 145 | msg.rgb = c; 146 | 147 | BaseType_t ret = xQueueSend( ws2812_queue, &msg, pdMS_TO_TICKS(1000) ); 148 | 149 | if(ret == pdTRUE){ 150 | return ESP_OK; 151 | } 152 | else{ 153 | return ESP_FAIL; /* ret could be errQUEUE_FULL */ 154 | } 155 | 156 | } 157 | 158 | 159 | /** 160 | * @brief smoothstep performs smooth Hermite interpolation between 0 and 1 when edge0 < x < edge1. 161 | * This is useful in cases where a threshold function with a smooth transition is desired. 162 | */ 163 | float smoothstep(const float edge0, const float edge1, const float x){ 164 | const float t = clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f); 165 | return t * t * (3.0f - 2.0f * t); 166 | } 167 | 168 | 169 | /** 170 | * @brief initialize the RMT channel to be suitable to control a WS2812 LED 171 | */ 172 | void ws2812_init_rmt_channel(int rmt_channel) 173 | { 174 | RMT.apb_conf.fifo_mask = 1; /* enable memory access, instead of FIFO mode. */ 175 | RMT.apb_conf.mem_tx_wrap_en = 1; /* wrap around when hitting end of buffer */ 176 | RMT.conf_ch[rmt_channel].conf0.div_cnt = DIVIDER; 177 | RMT.conf_ch[rmt_channel].conf0.mem_size = 1; 178 | RMT.conf_ch[rmt_channel].conf0.carrier_en = 0; 179 | RMT.conf_ch[rmt_channel].conf0.carrier_out_lv = 1; 180 | RMT.conf_ch[rmt_channel].conf0.mem_pd = 0; 181 | 182 | RMT.conf_ch[rmt_channel].conf1.rx_en = 0; 183 | RMT.conf_ch[rmt_channel].conf1.mem_owner = 0; 184 | RMT.conf_ch[rmt_channel].conf1.tx_conti_mode = 0; /* loop back mode */ 185 | RMT.conf_ch[rmt_channel].conf1.ref_always_on = 1; /* use APB 80Mhz clock */ 186 | RMT.conf_ch[rmt_channel].conf1.idle_out_en = 1; 187 | RMT.conf_ch[rmt_channel].conf1.idle_out_lv = 0; 188 | 189 | return; 190 | } 191 | 192 | void ws2812_copy() 193 | { 194 | unsigned int i, j, offset, len, bit; 195 | 196 | 197 | offset = ws2812_half * MAX_PULSES; 198 | ws2812_half = !ws2812_half; 199 | 200 | len = ws2812_len - ws2812_pos; 201 | if (len > (MAX_PULSES / 8)) 202 | len = (MAX_PULSES / 8); 203 | 204 | if (!len) { 205 | for (i = 0; i < MAX_PULSES; i++) 206 | RMTMEM.chan[WS2812_RMT_CHANNEL].data32[i + offset].val = 0; 207 | return; 208 | } 209 | 210 | for (i = 0; i < len; i++) { 211 | bit = ws2812_buffer[i + ws2812_pos]; 212 | for (j = 0; j < 8; j++, bit <<= 1) { 213 | RMTMEM.chan[WS2812_RMT_CHANNEL].data32[j + i * 8 + offset].val = 214 | ws2812_bits[(bit >> 7) & 0x01].val; 215 | } 216 | if (i + ws2812_pos == ws2812_len - 1) 217 | RMTMEM.chan[WS2812_RMT_CHANNEL].data32[7 + i * 8 + offset].duration1 = PULSE_TRS; 218 | } 219 | 220 | for (i *= 8; i < MAX_PULSES; i++) 221 | RMTMEM.chan[WS2812_RMT_CHANNEL].data32[i + offset].val = 0; 222 | 223 | ws2812_pos += len; 224 | return; 225 | } 226 | 227 | void ws2812_handle_interrupt(void *arg){ 228 | BaseType_t task_awoken = 0; 229 | 230 | if (RMT.int_st.ch0_tx_thr_event) { 231 | ws2812_copy(); 232 | RMT.int_clr.ch0_tx_thr_event = 1; 233 | } 234 | else if (RMT.int_st.ch0_tx_end && ws2812_sem) { 235 | xSemaphoreGiveFromISR(ws2812_sem, &task_awoken); 236 | RMT.int_clr.ch0_tx_end = 1; 237 | } 238 | 239 | return; 240 | } 241 | 242 | esp_err_t ws2812_init(){ 243 | 244 | esp_err_t ret; 245 | 246 | /* mutex for the pixels memory */ 247 | ws2812_mutex = xSemaphoreCreateMutex(); 248 | 249 | DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_RMT_CLK_EN); 250 | DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_RMT_RST); 251 | 252 | ret = rmt_set_pin((rmt_channel_t)WS2812_RMT_CHANNEL, RMT_MODE_TX, (gpio_num_t)WS2818_DATA_GPIO); 253 | if(ret != ESP_OK) return ret; 254 | 255 | ws2812_init_rmt_channel(WS2812_RMT_CHANNEL); 256 | 257 | RMT.tx_lim_ch[WS2812_RMT_CHANNEL].limit = MAX_PULSES; 258 | RMT.int_ena.ch0_tx_thr_event = 1; 259 | RMT.int_ena.ch0_tx_end = 1; 260 | 261 | ws2812_bits[0].level0 = 1; 262 | ws2812_bits[0].level1 = 0; 263 | ws2812_bits[0].duration0 = PULSE_T0H; 264 | ws2812_bits[0].duration1 = PULSE_T0L; 265 | ws2812_bits[1].level0 = 1; 266 | ws2812_bits[1].level1 = 0; 267 | ws2812_bits[1].duration0 = PULSE_T1H; 268 | ws2812_bits[1].duration1 = PULSE_T1L; 269 | 270 | /* allocate memory for the pixels */ 271 | ws2812_pixels = (rgb_t*)malloc(sizeof(rgb_t) * WS2812_STRIP_SIZE); 272 | 273 | 274 | ret = esp_intr_alloc(ETS_RMT_INTR_SOURCE, 0, ws2812_handle_interrupt, NULL, &rmt_intr_handle); 275 | 276 | /* create the queue */ 277 | ws2812_queue = xQueueCreate(WS2812_QUEUE_SIZE, sizeof(ws2812_message_t)); 278 | if(ws2812_queue == NULL){ 279 | return ESP_ERR_NO_MEM; 280 | } 281 | 282 | if(ret == ESP_OK){ 283 | /* spawn the task that will handle the LED backlights */ 284 | xTaskCreatePinnedToCore(ws2812_task, "ws2812_task", 4096, NULL, 10, NULL, 0); 285 | } 286 | 287 | return ret; 288 | 289 | } 290 | 291 | void ws2812_set_colors(unsigned int length, rgb_t *array){ 292 | unsigned int i; 293 | 294 | 295 | ws2812_len = (length * 3) * sizeof(uint8_t); 296 | ws2812_buffer = malloc(ws2812_len); 297 | 298 | for (i = 0; i < length; i++) { 299 | ws2812_buffer[i * 3 + 0] = array[i].g; 300 | ws2812_buffer[i * 3 + 1] = array[i].r; 301 | ws2812_buffer[i * 3 + 2] = array[i].b; 302 | } 303 | 304 | ws2812_pos = 0; 305 | ws2812_half = 0; 306 | 307 | ws2812_copy(); 308 | 309 | if (ws2812_pos < ws2812_len) 310 | ws2812_copy(); 311 | 312 | ws2812_sem = xSemaphoreCreateBinary(); 313 | 314 | RMT.conf_ch[WS2812_RMT_CHANNEL].conf1.mem_rd_rst = 1; 315 | RMT.conf_ch[WS2812_RMT_CHANNEL].conf1.tx_start = 1; 316 | 317 | 318 | 319 | xSemaphoreTake(ws2812_sem, portMAX_DELAY); 320 | vSemaphoreDelete(ws2812_sem); 321 | ws2812_sem = NULL; 322 | 323 | free(ws2812_buffer); 324 | 325 | return; 326 | } 327 | -------------------------------------------------------------------------------- /pcb/README.md: -------------------------------------------------------------------------------- 1 | # clock-face 2 | 3 | ![Clock face assembled](https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/master/pictures/clock-face-assembled-1024.jpg) 4 | 5 | # logic-board 6 | 7 | ![Logic board assembled](https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/master/pictures/logic-board-assembled-1024.jpg) 8 | 9 | 10 | -------------------------------------------------------------------------------- /pcb/clock-face/esp32-nixie-clock-face-bottom-render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pcb/clock-face/esp32-nixie-clock-face-bottom-render.png -------------------------------------------------------------------------------- /pcb/clock-face/esp32-nixie-clock-face-top-render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pcb/clock-face/esp32-nixie-clock-face-top-render.png -------------------------------------------------------------------------------- /pcb/clock-face/gerber/Through.drl: -------------------------------------------------------------------------------- 1 | M48 2 | INCH 3 | T01C0.0157 4 | T02C0.0315 5 | T03C0.034 6 | T04C0.1102 7 | % 8 | T01 9 | X+004550Y+018838 10 | X+005200Y+019192 11 | X+005850Y+018838 12 | X+005850Y+018050 13 | X+005200Y+017657 14 | X+004550Y+018050 15 | X+008546Y+018058 16 | X+010279Y+018428 17 | X+012680Y+018058 18 | X+014649Y+015932 19 | X+015200Y+016420 20 | X+016145Y+016420 21 | X+017106Y+014515 22 | X+017106Y+012743 23 | X+016145Y+012838 24 | X+015200Y+012326 25 | X+014649Y+012468 26 | X+014649Y+014200 27 | X+012326Y+012995 28 | X+012326Y+012523 29 | X+011539Y+011854 30 | X+010515Y+011854 31 | X+009846Y+011066 32 | X+010476Y+010554 33 | X+010869Y+010554 34 | X+011086Y+009102 35 | X+011224Y+008609 36 | X+012050Y+008609 37 | X+012405Y+008940 38 | X+012759Y+008649 39 | X+013350Y+009515 40 | X+012365Y+011027 41 | X+010082Y+009161 42 | X+009806Y+009476 43 | X+010121Y+008688 44 | X+008625Y+008609 45 | X+008113Y+008609 46 | X+007877Y+009554 47 | X+007129Y+008609 48 | X+005850Y+008877 49 | X+005200Y+009231 50 | X+004550Y+008877 51 | X+004550Y+008090 52 | X+005200Y+007696 53 | X+005850Y+008090 54 | X+007129Y+006956 55 | X+006854Y+006641 56 | X+007444Y+007271 57 | X+008665Y+006562 58 | X+009137Y+006720 59 | X+009649Y+006720 60 | X+010003Y+006917 61 | X+010633Y+005239 62 | X+009609Y+004846 63 | X+007641Y+005239 64 | X+006224Y+005909 65 | X+007326Y+010972 66 | X+007326Y+012743 67 | X+007326Y+014515 68 | X+009570Y+013665 69 | X+009491Y+012050 70 | X+011617Y+014964 71 | X+017106Y+010972 72 | X+017657Y+009554 73 | X+017893Y+008609 74 | X+018405Y+008609 75 | X+019586Y+009476 76 | X+019861Y+009161 77 | X+019901Y+008688 78 | X+020865Y+009102 79 | X+021003Y+008609 80 | X+021830Y+008609 81 | X+022184Y+008940 82 | X+022539Y+008649 83 | X+023507Y+008665 84 | X+023980Y+008625 85 | X+024531Y+009019 86 | X+024924Y+008665 87 | X+024901Y+007759 88 | X+024940Y+006814 89 | X+024389Y+006696 90 | X+023995Y+007310 91 | X+023523Y+007192 92 | X+023169Y+006972 93 | X+023011Y+006602 94 | X+022499Y+006483 95 | X+022184Y+007310 96 | X+021751Y+007310 97 | X+019783Y+006917 98 | X+019428Y+006720 99 | X+018917Y+006720 100 | X+018444Y+006562 101 | X+017224Y+007271 102 | X+016909Y+006956 103 | X+016633Y+006641 104 | X+015161Y+006814 105 | X+014609Y+006696 106 | X+014216Y+007310 107 | X+013743Y+007192 108 | X+013389Y+006972 109 | X+013231Y+006602 110 | X+012720Y+006483 111 | X+012405Y+007310 112 | X+011972Y+007310 113 | X+011854Y+004846 114 | X+013743Y+004846 115 | X+014728Y+005239 116 | X+015121Y+007759 117 | X+016909Y+008609 118 | X+017420Y+005239 119 | X+019389Y+004846 120 | X+020413Y+005239 121 | X+021633Y+004846 122 | X+023523Y+004846 123 | X+024507Y+005239 124 | X+023129Y+009515 125 | X+022145Y+011027 126 | X+021318Y+011854 127 | X+020294Y+011854 128 | X+019625Y+011066 129 | X+020255Y+010554 130 | X+020649Y+010554 131 | X+019271Y+012050 132 | X+019350Y+013665 133 | X+021397Y+014964 134 | X+022106Y+012995 135 | X+022106Y+012523 136 | X+024428Y+012468 137 | X+024980Y+012326 138 | X+024428Y+014200 139 | X+024428Y+015932 140 | X+024924Y+018074 141 | X+025948Y+018113 142 | X+028192Y+017326 143 | X+027602Y+014491 144 | X+027602Y+013783 145 | X+026224Y+014137 146 | X+027680Y+010003 147 | X+030625Y+008609 148 | X+031609Y+008609 149 | X+032121Y+008609 150 | X+031373Y+009554 151 | X+030822Y+010972 152 | X+030822Y+012743 153 | X+030822Y+014515 154 | X+033066Y+013665 155 | X+032987Y+012050 156 | X+034011Y+011854 157 | X+035035Y+011854 158 | X+035822Y+012523 159 | X+035822Y+012995 160 | X+035861Y+011027 161 | X+034365Y+010554 162 | X+033972Y+010554 163 | X+033342Y+011066 164 | X+033302Y+009476 165 | X+033578Y+009161 166 | X+033617Y+008688 167 | X+034582Y+009102 168 | X+034720Y+008609 169 | X+035546Y+008609 170 | X+035901Y+008940 171 | X+036255Y+008649 172 | X+036846Y+009515 173 | X+037239Y+007192 174 | X+036885Y+006972 175 | X+036728Y+006602 176 | X+036216Y+006483 177 | X+035901Y+007310 178 | X+035468Y+007310 179 | X+033499Y+006917 180 | X+033145Y+006720 181 | X+032633Y+006720 182 | X+032161Y+006562 183 | X+030940Y+007271 184 | X+030625Y+006956 185 | X+030350Y+006641 186 | X+031137Y+005239 187 | X+033106Y+004846 188 | X+034129Y+005239 189 | X+035350Y+004846 190 | X+037239Y+004846 191 | X+038224Y+005239 192 | X+038106Y+006696 193 | X+038657Y+006814 194 | X+038617Y+007759 195 | X+037712Y+007310 196 | X+040129Y+006641 197 | X+040405Y+006956 198 | X+040720Y+007271 199 | X+040405Y+008609 200 | X+041389Y+008609 201 | X+041901Y+008609 202 | X+041153Y+009554 203 | X+040602Y+010972 204 | X+040602Y+012743 205 | X+039641Y+012838 206 | X+038696Y+012326 207 | X+038145Y+012468 208 | X+038145Y+014200 209 | X+038145Y+015932 210 | X+038696Y+016420 211 | X+039641Y+016420 212 | X+040602Y+014515 213 | X+042846Y+013665 214 | X+042767Y+012050 215 | X+043791Y+011854 216 | X+044814Y+011854 217 | X+045602Y+012523 218 | X+045602Y+012995 219 | X+045641Y+011027 220 | X+044145Y+010554 221 | X+043751Y+010554 222 | X+043121Y+011066 223 | X+043082Y+009476 224 | X+043357Y+009161 225 | X+043397Y+008688 226 | X+044361Y+009102 227 | X+044499Y+008609 228 | X+045326Y+008609 229 | X+045680Y+008940 230 | X+046035Y+008649 231 | X+047003Y+008665 232 | X+047476Y+008625 233 | X+048027Y+009019 234 | X+048420Y+008665 235 | X+048397Y+007759 236 | X+048436Y+006814 237 | X+047885Y+006696 238 | X+047491Y+007310 239 | X+047019Y+007192 240 | X+046665Y+006972 241 | X+046507Y+006602 242 | X+045995Y+006483 243 | X+045680Y+007310 244 | X+045247Y+007310 245 | X+043279Y+006917 246 | X+042924Y+006720 247 | X+042413Y+006720 248 | X+041940Y+006562 249 | X+040917Y+005239 250 | X+042885Y+004846 251 | X+043909Y+005239 252 | X+045129Y+004846 253 | X+047019Y+004846 254 | X+048003Y+005239 255 | X+046625Y+009515 256 | X+047924Y+012468 257 | X+048476Y+012326 258 | X+047924Y+014200 259 | X+047924Y+015932 260 | X+048428Y+018074 261 | X+049452Y+018113 262 | X+051688Y+017326 263 | X+051098Y+014491 264 | X+051098Y+013783 265 | X+049720Y+014137 266 | X+051176Y+010003 267 | X+054121Y+008609 268 | X+055106Y+008609 269 | X+055617Y+008609 270 | X+054869Y+009554 271 | X+054318Y+010972 272 | X+054318Y+012743 273 | X+054318Y+014515 274 | X+056562Y+013665 275 | X+056483Y+012050 276 | X+057507Y+011854 277 | X+058531Y+011854 278 | X+059318Y+012523 279 | X+059318Y+012995 280 | X+059357Y+011027 281 | X+057861Y+010554 282 | X+057468Y+010554 283 | X+056838Y+011066 284 | X+056798Y+009476 285 | X+057074Y+009161 286 | X+057113Y+008688 287 | X+058078Y+009102 288 | X+058216Y+008609 289 | X+059043Y+008609 290 | X+059397Y+008940 291 | X+059751Y+008649 292 | X+060342Y+009515 293 | X+060735Y+007192 294 | X+060381Y+006972 295 | X+060224Y+006602 296 | X+059712Y+006483 297 | X+059397Y+007310 298 | X+058964Y+007310 299 | X+056995Y+006917 300 | X+056641Y+006720 301 | X+056129Y+006720 302 | X+055657Y+006562 303 | X+054436Y+007271 304 | X+054121Y+006956 305 | X+053846Y+006641 306 | X+054633Y+005239 307 | X+056602Y+004846 308 | X+057625Y+005239 309 | X+058846Y+004846 310 | X+060735Y+004846 311 | X+061720Y+005239 312 | X+061602Y+006696 313 | X+062153Y+006814 314 | X+062113Y+007759 315 | X+061208Y+007310 316 | X+063625Y+006641 317 | X+063901Y+006956 318 | X+064216Y+007271 319 | X+063901Y+008609 320 | X+064885Y+008609 321 | X+065397Y+008609 322 | X+064649Y+009554 323 | X+064098Y+010972 324 | X+064098Y+012743 325 | X+063137Y+012838 326 | X+062192Y+012326 327 | X+061641Y+012468 328 | X+061641Y+014200 329 | X+061641Y+015932 330 | X+062192Y+016420 331 | X+063137Y+016420 332 | X+064098Y+014515 333 | X+066342Y+013665 334 | X+066263Y+012050 335 | X+067287Y+011854 336 | X+068310Y+011854 337 | X+069098Y+012523 338 | X+069098Y+012995 339 | X+069137Y+011027 340 | X+067641Y+010554 341 | X+067247Y+010554 342 | X+066617Y+011066 343 | X+066578Y+009476 344 | X+066854Y+009161 345 | X+066893Y+008688 346 | X+067857Y+009102 347 | X+067995Y+008609 348 | X+068822Y+008609 349 | X+069176Y+008940 350 | X+069531Y+008649 351 | X+070121Y+009515 352 | X+070515Y+007192 353 | X+070161Y+006972 354 | X+070003Y+006602 355 | X+069491Y+006483 356 | X+069176Y+007310 357 | X+068743Y+007310 358 | X+066775Y+006917 359 | X+066420Y+006720 360 | X+065909Y+006720 361 | X+065436Y+006562 362 | X+064413Y+005239 363 | X+066381Y+004846 364 | X+067405Y+005239 365 | X+068625Y+004846 366 | X+070515Y+004846 367 | X+071499Y+005239 368 | X+072602Y+005239 369 | X+071932Y+006814 370 | X+071381Y+006696 371 | X+070987Y+007310 372 | X+071893Y+007759 373 | X+072897Y+008090 374 | X+073546Y+007696 375 | X+074196Y+008090 376 | X+074196Y+008877 377 | X+073546Y+009231 378 | X+072897Y+008877 379 | X+071972Y+012326 380 | X+071420Y+012468 381 | X+071420Y+014200 382 | X+071420Y+015932 383 | X+071854Y+016145 384 | X+072917Y+015318 385 | X+073011Y+013271 386 | X+073546Y+017657 387 | X+072897Y+018050 388 | X+072897Y+018838 389 | X+073546Y+019192 390 | X+074196Y+018838 391 | X+074196Y+018050 392 | X+069452Y+018058 393 | X+067050Y+018428 394 | X+065318Y+018058 395 | X+068389Y+014964 396 | X+059672Y+018058 397 | X+057271Y+018428 398 | X+055539Y+018058 399 | X+058609Y+014964 400 | X+045956Y+018058 401 | X+043554Y+018428 402 | X+041822Y+018058 403 | X+044893Y+014964 404 | X+036176Y+018058 405 | X+033775Y+018428 406 | X+032043Y+018058 407 | X+035113Y+014964 408 | X+022460Y+018058 409 | X+020058Y+018428 410 | X+018326Y+018058 411 | T02 412 | X+026641Y+015420 413 | X+028609Y+015420 414 | X+032220Y+015224 415 | X+032909Y+016602 416 | X+034483Y+016995 417 | X+036058Y+016602 418 | X+036747Y+015224 419 | X+036747Y+013452 420 | X+036747Y+011680 421 | X+036058Y+010302 422 | X+034483Y+009909 423 | X+032909Y+010302 424 | X+032220Y+011680 425 | X+032220Y+013452 426 | X+028609Y+011483 427 | X+026641Y+011483 428 | X+023031Y+011680 429 | X+022342Y+010302 430 | X+020767Y+009909 431 | X+019192Y+010302 432 | X+018503Y+011680 433 | X+018503Y+013452 434 | X+018503Y+015224 435 | X+019192Y+016602 436 | X+020767Y+016995 437 | X+022342Y+016602 438 | X+023031Y+015224 439 | X+023031Y+013452 440 | X+013251Y+013452 441 | X+013251Y+015224 442 | X+012562Y+016602 443 | X+010987Y+016995 444 | X+009413Y+016602 445 | X+008724Y+015224 446 | X+008724Y+013452 447 | X+008724Y+011680 448 | X+009413Y+010302 449 | X+010987Y+009909 450 | X+012562Y+010302 451 | X+013251Y+011680 452 | X+041999Y+011680 453 | X+042688Y+010302 454 | X+044263Y+009909 455 | X+045838Y+010302 456 | X+046527Y+011680 457 | X+046527Y+013452 458 | X+046527Y+015224 459 | X+045838Y+016602 460 | X+044263Y+016995 461 | X+042688Y+016602 462 | X+041999Y+015224 463 | X+041999Y+013452 464 | X+050137Y+011483 465 | X+052106Y+011483 466 | X+055716Y+011680 467 | X+056405Y+010302 468 | X+057980Y+009909 469 | X+059554Y+010302 470 | X+060243Y+011680 471 | X+060243Y+013452 472 | X+060243Y+015224 473 | X+059554Y+016602 474 | X+057980Y+016995 475 | X+056405Y+016602 476 | X+055716Y+015224 477 | X+055716Y+013452 478 | X+052106Y+015420 479 | X+050137Y+015420 480 | X+065495Y+015224 481 | X+066184Y+016602 482 | X+067759Y+016995 483 | X+069334Y+016602 484 | X+070023Y+015224 485 | X+070023Y+013452 486 | X+070023Y+011680 487 | X+069334Y+010302 488 | X+067759Y+009909 489 | X+066184Y+010302 490 | X+065495Y+011680 491 | X+065495Y+013452 492 | T03 493 | X+004728Y+015314 494 | X+004728Y+016314 495 | X+004728Y+014314 496 | X+004728Y+013314 497 | X+004728Y+012314 498 | X+004728Y+011314 499 | X+004728Y+010314 500 | X+004728Y+006846 501 | X+004728Y+005846 502 | X+004728Y+004846 503 | X+027125Y+008665 504 | X+028125Y+008665 505 | X+050621Y+008665 506 | X+051621Y+008665 507 | X+074019Y+010314 508 | X+074019Y+011314 509 | X+074019Y+012314 510 | X+074019Y+013314 511 | X+074019Y+014314 512 | X+074019Y+015314 513 | X+074019Y+016314 514 | X+074019Y+006850 515 | X+074019Y+005846 516 | X+074019Y+004846 517 | T04 518 | X+005200Y+018428 519 | X+005200Y+008468 520 | X+073546Y+008468 521 | X+073546Y+018428 522 | T00 523 | M30 524 | -------------------------------------------------------------------------------- /pcb/clock-face/gerber/top-clock-face.BoardOutline.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Top-Clock-IN12c.BoardOutline.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Profile* 5 | G04 #@! TF.Part,Single* 6 | %ADD11C,0.005512*% 7 | %FSLAX26Y26*% 8 | G04* 9 | G70* 10 | G90* 11 | G75* 12 | G01* 13 | G04 BoardOutline* 14 | %LPD*% 15 | X520000Y394016D2* 16 | D11* 17 | X7354646D1* 18 | G03X7480630Y520000I-1J125985D01* 19 | G01* 20 | Y1842835D1* 21 | G03X7354646Y1968819I-125985J-1D01* 22 | G01* 23 | X520000D1* 24 | G03X394016Y1842835I1J-125985D01* 25 | G01* 26 | Y520000D1* 27 | G03X520000Y394016I125985J1D01* 28 | G01* 29 | M02* 30 | -------------------------------------------------------------------------------- /pcb/clock-face/gerber/top-clock-face.BottomAssy.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Top-Clock-IN12c.BottomAssy.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Drawing,Bot* 5 | G04 #@! TF.Part,Single* 6 | %FSLAX26Y26*% 7 | G04* 8 | G70* 9 | G90* 10 | G75* 11 | G01* 12 | G04 BotAssy* 13 | %LPD*% 14 | M02* 15 | -------------------------------------------------------------------------------- /pcb/clock-face/gerber/top-clock-face.BottomDimension.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Top-Clock-IN12c.BottomDimension.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Drawing,Bot* 5 | G04 #@! TF.Part,Single* 6 | %ADD13C,0.001378*% 7 | %ADD63C,0.006176*% 8 | %FSLAX26Y26*% 9 | G04* 10 | G70* 11 | G90* 12 | G75* 13 | G01* 14 | G04 BotDimension* 15 | %LPD*% 16 | X520000Y1968819D2* 17 | D13* 18 | X197165D1* 19 | X472756Y1630236D2* 20 | X197165D1* 21 | X216850Y1799528D2* 22 | Y1929449D1* 23 | G36* 24 | Y1968819D2* 25 | X224724Y1929449D1* 26 | X208976D1* 27 | X216850Y1968819D1* 28 | G37* 29 | Y1799528D2* 30 | D13* 31 | Y1669606D1* 32 | G36* 33 | Y1630236D2* 34 | X208976Y1669606D1* 35 | X224724D1* 36 | X216850Y1630236D1* 37 | G37* 38 | X520000Y394016D2* 39 | D13* 40 | X220787D1* 41 | X472756Y484567D2* 42 | X220787D1* 43 | X240472D2* 44 | Y394016D1* 45 | Y543622D2* 46 | Y523937D1* 47 | G36* 48 | Y484567D2* 49 | X232598Y523937D1* 50 | X248346D1* 51 | X240472Y484567D1* 52 | G37* 53 | Y334961D2* 54 | D13* 55 | Y354646D1* 56 | G36* 57 | Y394016D2* 58 | X248346Y354646D1* 59 | X232598D1* 60 | X240472Y394016D1* 61 | G37* 62 | Y606076D2* 63 | D13* 64 | Y484567D1* 65 | X472756Y1031417D2* 66 | X-86299D1* 67 | X472756Y684567D2* 68 | X-86299D1* 69 | X-66614Y857992D2* 70 | Y992047D1* 71 | G36* 72 | Y1031417D2* 73 | X-58740Y992047D1* 74 | X-74488D1* 75 | X-66614Y1031417D1* 76 | G37* 77 | Y857992D2* 78 | D13* 79 | Y723937D1* 80 | G36* 81 | Y684567D2* 82 | X-74488Y723937D1* 83 | X-58740D1* 84 | X-66614Y684567D1* 85 | G37* 86 | X164492Y1833139D2* 87 | D63* 88 | X166393Y1838843D1* 89 | X170196Y1840789D1* 90 | X174042D1* 91 | X177845Y1838843D1* 92 | X179790Y1835041D1* 93 | X181692Y1827391D1* 94 | X183593Y1821643D1* 95 | X187440Y1817841D1* 96 | X191242Y1815940D1* 97 | X196990D1* 98 | X200793Y1817841D1* 99 | X202738Y1819742D1* 100 | X204640Y1825490D1* 101 | Y1833139D1* 102 | X202738Y1838843D1* 103 | X200793Y1840789D1* 104 | X196990Y1842690D1* 105 | X191242D1* 106 | X187440Y1840789D1* 107 | X183593Y1836942D1* 108 | X181692Y1831238D1* 109 | X179790Y1823589D1* 110 | X177845Y1819742D1* 111 | X174042Y1817841D1* 112 | X170196D1* 113 | X166393Y1819742D1* 114 | X164492Y1825490D1* 115 | Y1833139D1* 116 | X200793Y1801687D2* 117 | X202738Y1803588D1* 118 | X204640Y1801687D1* 119 | X202738Y1799741D1* 120 | X200793Y1801687D1* 121 | X170196Y1764442D2* 122 | X166393Y1766343D1* 123 | X164492Y1772091D1* 124 | Y1775894D1* 125 | X166393Y1781642D1* 126 | X172141Y1785489D1* 127 | X181692Y1787390D1* 128 | X191242D1* 129 | X198892Y1785489D1* 130 | X202738Y1781642D1* 131 | X204640Y1775894D1* 132 | Y1773993D1* 133 | X202738Y1768289D1* 134 | X198892Y1764442D1* 135 | X193144Y1762541D1* 136 | X191242D1* 137 | X185494Y1764442D1* 138 | X181692Y1768289D1* 139 | X179790Y1773993D1* 140 | Y1775894D1* 141 | X181692Y1781642D1* 142 | X185494Y1785489D1* 143 | X191242Y1787390D1* 144 | X197664Y613394D2* 145 | X195763D1* 146 | X191916Y611493D1* 147 | X190015Y609591D1* 148 | X188114Y605745D1* 149 | Y598095D1* 150 | X190015Y594293D1* 151 | X191916Y592392D1* 152 | X195763Y590446D1* 153 | X199566D1* 154 | X203413Y592392D1* 155 | X209116Y596194D1* 156 | X228262Y615339D1* 157 | Y588545D1* 158 | X224415Y574292D2* 159 | X226360Y576193D1* 160 | X228262Y574292D1* 161 | X226360Y572347D1* 162 | X224415Y574292D1* 163 | X188114Y556148D2* 164 | Y535146D1* 165 | X203413Y546598D1* 166 | Y540850D1* 167 | X205314Y537047D1* 168 | X207215Y535146D1* 169 | X212963Y533201D1* 170 | X216766D1* 171 | X222514Y535146D1* 172 | X226360Y538949D1* 173 | X228262Y544697D1* 174 | Y550445D1* 175 | X226360Y556148D1* 176 | X224415Y558050D1* 177 | X220612Y559995D1* 178 | X-118973Y903528D2* 179 | X-117071Y909232D1* 180 | X-113269Y911177D1* 181 | X-109422D1* 182 | X-105620Y909232D1* 183 | X-103674Y905429D1* 184 | X-101773Y897780D1* 185 | X-99872Y892032D1* 186 | X-96025Y888229D1* 187 | X-92222Y886328D1* 188 | X-86474D1* 189 | X-82672Y888229D1* 190 | X-80726Y890130D1* 191 | X-78825Y895878D1* 192 | Y903528D1* 193 | X-80726Y909232D1* 194 | X-82672Y911177D1* 195 | X-86474Y913078D1* 196 | X-92222D1* 197 | X-96025Y911177D1* 198 | X-99872Y907330D1* 199 | X-101773Y901626D1* 200 | X-103674Y893977D1* 201 | X-105620Y890130D1* 202 | X-109422Y888229D1* 203 | X-113269D1* 204 | X-117071Y890130D1* 205 | X-118973Y895878D1* 206 | Y903528D1* 207 | X-82672Y872075D2* 208 | X-80726Y873976D1* 209 | X-78825Y872075D1* 210 | X-80726Y870130D1* 211 | X-82672Y872075D1* 212 | X-118973Y848228D2* 213 | X-117071Y853932D1* 214 | X-113269Y855877D1* 215 | X-109422D1* 216 | X-105620Y853932D1* 217 | X-103674Y850129D1* 218 | X-101773Y842480D1* 219 | X-99872Y836732D1* 220 | X-96025Y832929D1* 221 | X-92222Y831028D1* 222 | X-86474D1* 223 | X-82672Y832929D1* 224 | X-80726Y834830D1* 225 | X-78825Y840578D1* 226 | Y848228D1* 227 | X-80726Y853932D1* 228 | X-82672Y855877D1* 229 | X-86474Y857778D1* 230 | X-92222D1* 231 | X-96025Y855877D1* 232 | X-99872Y852030D1* 233 | X-101773Y846326D1* 234 | X-103674Y838677D1* 235 | X-105620Y834830D1* 236 | X-109422Y832929D1* 237 | X-113269D1* 238 | X-117071Y834830D1* 239 | X-118973Y840578D1* 240 | Y848228D1* 241 | X-111323Y818676D2* 242 | X-113269Y814830D1* 243 | X-118973Y809082D1* 244 | X-78825D1* 245 | M02* 246 | -------------------------------------------------------------------------------- /pcb/clock-face/gerber/top-clock-face.BottomMask.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Top-Clock-IN12c.BottomMask.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Soldermask,Bot* 5 | G04 #@! TF.Part,Single* 6 | %ADD46R,0.033622X0.04937*% 7 | %ADD48R,0.04937X0.033622*% 8 | %ADD50C,0.204882*% 9 | %ADD52C,0.071024*% 10 | %ADD54O,0.068031X0.078031*% 11 | %ADD56O,0.078031X0.068031*% 12 | %FSLAX26Y26*% 13 | G04* 14 | G70* 15 | G90* 16 | G75* 17 | G01* 18 | G04 BotMask* 19 | %LPD*% 20 | D56* 21 | X472756Y1531417D3* 22 | Y1631417D3* 23 | Y1331417D3* 24 | Y1431417D3* 25 | Y1131417D3* 26 | Y1031417D3* 27 | Y1231417D3* 28 | Y684567D3* 29 | Y484567D3* 30 | Y584567D3* 31 | D54* 32 | X2812520Y866457D3* 33 | X2712520D3* 34 | X5162126D3* 35 | X5062126D3* 36 | D56* 37 | X7401890Y1531417D3* 38 | Y1631417D3* 39 | Y1331417D3* 40 | Y1431417D3* 41 | Y1131417D3* 42 | Y1031417D3* 43 | Y1231417D3* 44 | Y684961D3* 45 | Y484567D3* 46 | Y584567D3* 47 | D52* 48 | X2664094Y1542047D3* 49 | X2860945D3* 50 | X2664094Y1148346D3* 51 | X2860945D3* 52 | X5013701Y1542047D3* 53 | X5210551D3* 54 | X5013701Y1148346D3* 55 | X5210551D3* 56 | X1098740Y1699528D3* 57 | X1325118Y1345197D3* 58 | Y1522362D3* 59 | X1098740Y990866D3* 60 | X1325118Y1168031D3* 61 | X1256220Y1030236D3* 62 | Y1660157D3* 63 | X941260D3* 64 | X872362Y1522362D3* 65 | Y1345197D3* 66 | Y1168031D3* 67 | X941260Y1030236D3* 68 | X2076693Y1699528D3* 69 | X2303071Y1345197D3* 70 | Y1522362D3* 71 | X2076693Y990866D3* 72 | X2303071Y1168031D3* 73 | X2234173Y1030236D3* 74 | Y1660157D3* 75 | X1919213D3* 76 | X1850315Y1522362D3* 77 | Y1345197D3* 78 | Y1168031D3* 79 | X1919213Y1030236D3* 80 | X3448346Y1699528D3* 81 | X3674724Y1345197D3* 82 | Y1522362D3* 83 | X3448346Y990866D3* 84 | X3674724Y1168031D3* 85 | X3605827Y1030236D3* 86 | Y1660157D3* 87 | X3290866D3* 88 | X3221969Y1522362D3* 89 | Y1345197D3* 90 | Y1168031D3* 91 | X3290866Y1030236D3* 92 | X4426299Y1699528D3* 93 | X4652677Y1345197D3* 94 | Y1522362D3* 95 | X4426299Y990866D3* 96 | X4652677Y1168031D3* 97 | X4583780Y1030236D3* 98 | Y1660157D3* 99 | X4268819D3* 100 | X4199921Y1522362D3* 101 | Y1345197D3* 102 | Y1168031D3* 103 | X4268819Y1030236D3* 104 | X5797953Y1699528D3* 105 | X6024331Y1345197D3* 106 | Y1522362D3* 107 | X5797953Y990866D3* 108 | X6024331Y1168031D3* 109 | X5955433Y1030236D3* 110 | Y1660157D3* 111 | X5640472D3* 112 | X5571575Y1522362D3* 113 | Y1345197D3* 114 | Y1168031D3* 115 | X5640472Y1030236D3* 116 | X6775906Y1699528D3* 117 | X7002283Y1345197D3* 118 | Y1522362D3* 119 | X6775906Y990866D3* 120 | X7002283Y1168031D3* 121 | X6933386Y1030236D3* 122 | Y1660157D3* 123 | X6618425D3* 124 | X6549528Y1522362D3* 125 | Y1345197D3* 126 | Y1168031D3* 127 | X6618425Y1030236D3* 128 | D50* 129 | X520000Y1842835D3* 130 | Y846772D3* 131 | X7354646Y1842835D3* 132 | Y846772D3* 133 | D48* 134 | X7151672Y1557795D3* 135 | Y1482992D3* 136 | X7061121Y1520394D3* 137 | X7151672Y1384567D3* 138 | Y1309764D3* 139 | X7061121Y1347165D3* 140 | X7151672Y1211339D3* 141 | Y1136535D3* 142 | X7061121Y1173937D3* 143 | D46* 144 | X6945197Y1764270D3* 145 | X7020000D3* 146 | X6982598Y1673719D3* 147 | X6740472Y1846948D3* 148 | X6815276D3* 149 | X6777874Y1756396D3* 150 | X6527874Y1764270D3* 151 | X6602677D3* 152 | X6565276Y1673719D3* 153 | D48* 154 | X6471005Y990866D3* 155 | Y1065669D3* 156 | X6561556Y1028268D3* 157 | X6400139Y1486929D3* 158 | Y1561732D3* 159 | X6490690Y1524331D3* 160 | X6400139Y1309764D3* 161 | Y1384567D3* 162 | X6490690Y1347165D3* 163 | X6400139Y1132598D3* 164 | Y1207402D3* 165 | X6490690Y1170000D3* 166 | X6173719Y1557795D3* 167 | Y1482992D3* 168 | X6083168Y1520394D3* 169 | X6173719Y1384567D3* 170 | Y1309764D3* 171 | X6083168Y1347165D3* 172 | X6173719Y1211339D3* 173 | Y1136535D3* 174 | X6083168Y1173937D3* 175 | D46* 176 | X5967244Y1764270D3* 177 | X6042047D3* 178 | X6004646Y1673719D3* 179 | X5762520Y1846948D3* 180 | X5837323D3* 181 | X5799921Y1756396D3* 182 | X5549921Y1764270D3* 183 | X5624724D3* 184 | X5587323Y1673719D3* 185 | D48* 186 | X5493052Y990866D3* 187 | Y1065669D3* 188 | X5583604Y1028268D3* 189 | X5422186Y1486929D3* 190 | Y1561732D3* 191 | X5512738Y1524331D3* 192 | X5422186Y1309764D3* 193 | Y1384567D3* 194 | X5512738Y1347165D3* 195 | X5422186Y1132598D3* 196 | Y1207402D3* 197 | X5512738Y1170000D3* 198 | D46* 199 | X5173543Y1685354D3* 200 | X5248346D3* 201 | X5210945Y1594803D3* 202 | D48* 203 | X5108189Y1051496D3* 204 | Y1126299D3* 205 | X5198740Y1088898D3* 206 | X4802066Y1557795D3* 207 | Y1482992D3* 208 | X4711514Y1520394D3* 209 | X4802066Y1384567D3* 210 | Y1309764D3* 211 | X4711514Y1347165D3* 212 | X4802066Y1211339D3* 213 | Y1136535D3* 214 | X4711514Y1173937D3* 215 | D46* 216 | X4595591Y1764270D3* 217 | X4670394D3* 218 | X4632992Y1673719D3* 219 | X4390866Y1846948D3* 220 | X4465669D3* 221 | X4428268Y1756396D3* 222 | X4178268Y1764270D3* 223 | X4253071D3* 224 | X4215669Y1673719D3* 225 | D48* 226 | X4121399Y990866D3* 227 | Y1065669D3* 228 | X4211950Y1028268D3* 229 | X4050533Y1486929D3* 230 | Y1561732D3* 231 | X4141084Y1524331D3* 232 | X4050533Y1309764D3* 233 | Y1384567D3* 234 | X4141084Y1347165D3* 235 | X4050533Y1132598D3* 236 | Y1207402D3* 237 | X4141084Y1170000D3* 238 | X3824113Y1557795D3* 239 | Y1482992D3* 240 | X3733562Y1520394D3* 241 | X3824113Y1384567D3* 242 | Y1309764D3* 243 | X3733562Y1347165D3* 244 | X3824113Y1211339D3* 245 | Y1136535D3* 246 | X3733562Y1173937D3* 247 | D46* 248 | X3617638Y1764270D3* 249 | X3692441D3* 250 | X3655039Y1673719D3* 251 | X3412913Y1846948D3* 252 | X3487717D3* 253 | X3450315Y1756396D3* 254 | X3200315Y1764270D3* 255 | X3275118D3* 256 | X3237717Y1673719D3* 257 | D48* 258 | X3143446Y990866D3* 259 | Y1065669D3* 260 | X3233997Y1028268D3* 261 | X3072580Y1486929D3* 262 | Y1561732D3* 263 | X3163131Y1524331D3* 264 | X3072580Y1309764D3* 265 | Y1384567D3* 266 | X3163131Y1347165D3* 267 | X3072580Y1132598D3* 268 | Y1207402D3* 269 | X3163131Y1170000D3* 270 | D46* 271 | X2823150Y1689291D3* 272 | X2897953D3* 273 | X2860551Y1598740D3* 274 | D48* 275 | X2758583Y1051496D3* 276 | Y1126299D3* 277 | X2849134Y1088898D3* 278 | X2452459Y1557795D3* 279 | Y1482992D3* 280 | X2361908Y1520394D3* 281 | X2452459Y1384567D3* 282 | Y1309764D3* 283 | X2361908Y1347165D3* 284 | X2452459Y1211339D3* 285 | Y1136535D3* 286 | X2361908Y1173937D3* 287 | D46* 288 | X2245984Y1764270D3* 289 | X2320787D3* 290 | X2283386Y1673719D3* 291 | X2041260Y1846948D3* 292 | X2116063D3* 293 | X2078661Y1756396D3* 294 | X1828661Y1764270D3* 295 | X1903465D3* 296 | X1866063Y1673719D3* 297 | D48* 298 | X1771793Y990866D3* 299 | Y1065669D3* 300 | X1862344Y1028268D3* 301 | X1700927Y1486929D3* 302 | Y1561732D3* 303 | X1791478Y1524331D3* 304 | X1700927Y1309764D3* 305 | Y1384567D3* 306 | X1791478Y1347165D3* 307 | X1700927Y1132598D3* 308 | Y1207402D3* 309 | X1791478Y1170000D3* 310 | X1474507Y1557795D3* 311 | Y1482992D3* 312 | X1383955Y1520394D3* 313 | X1474507Y1384567D3* 314 | Y1309764D3* 315 | X1383955Y1347165D3* 316 | X1474507Y1211339D3* 317 | Y1136535D3* 318 | X1383955Y1173937D3* 319 | D46* 320 | X1268031Y1764270D3* 321 | X1342835D3* 322 | X1305433Y1673719D3* 323 | X1063307Y1846948D3* 324 | X1138110D3* 325 | X1100709Y1756396D3* 326 | X850709Y1764270D3* 327 | X925512D3* 328 | X888110Y1673719D3* 329 | D48* 330 | X793840Y990866D3* 331 | Y1065669D3* 332 | X884391Y1028268D3* 333 | X722974Y1486929D3* 334 | Y1561732D3* 335 | X813525Y1524331D3* 336 | X722974Y1309764D3* 337 | Y1384567D3* 338 | X813525Y1347165D3* 339 | X722974Y1132598D3* 340 | Y1207402D3* 341 | X813525Y1170000D3* 342 | M02* 343 | -------------------------------------------------------------------------------- /pcb/clock-face/gerber/top-clock-face.BottomPaste.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Top-Clock-IN12c.BottomPaste.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Paste,Bot* 5 | G04 #@! TF.Part,Single* 6 | %ADD47R,0.017559X0.033307*% 7 | %ADD49R,0.033307X0.017559*% 8 | %ADD51C,0.188819*% 9 | %ADD53C,0.054961*% 10 | %ADD55O,0.051969X0.061969*% 11 | %ADD57O,0.061969X0.051969*% 12 | %FSLAX26Y26*% 13 | G04* 14 | G70* 15 | G90* 16 | G75* 17 | G01* 18 | G04 BotPaste* 19 | %LPD*% 20 | D57* 21 | X472756Y1531417D3* 22 | Y1631417D3* 23 | Y1331417D3* 24 | Y1431417D3* 25 | Y1131417D3* 26 | Y1031417D3* 27 | Y1231417D3* 28 | Y684567D3* 29 | Y484567D3* 30 | Y584567D3* 31 | D55* 32 | X2812520Y866457D3* 33 | X2712520D3* 34 | X5162126D3* 35 | X5062126D3* 36 | D57* 37 | X7401890Y1531417D3* 38 | Y1631417D3* 39 | Y1331417D3* 40 | Y1431417D3* 41 | Y1131417D3* 42 | Y1031417D3* 43 | Y1231417D3* 44 | Y684961D3* 45 | Y484567D3* 46 | Y584567D3* 47 | D53* 48 | X2664094Y1542047D3* 49 | X2860945D3* 50 | X2664094Y1148346D3* 51 | X2860945D3* 52 | X5013701Y1542047D3* 53 | X5210551D3* 54 | X5013701Y1148346D3* 55 | X5210551D3* 56 | X1098740Y1699528D3* 57 | X1325118Y1345197D3* 58 | Y1522362D3* 59 | X1098740Y990866D3* 60 | X1325118Y1168031D3* 61 | X1256220Y1030236D3* 62 | Y1660157D3* 63 | X941260D3* 64 | X872362Y1522362D3* 65 | Y1345197D3* 66 | Y1168031D3* 67 | X941260Y1030236D3* 68 | X2076693Y1699528D3* 69 | X2303071Y1345197D3* 70 | Y1522362D3* 71 | X2076693Y990866D3* 72 | X2303071Y1168031D3* 73 | X2234173Y1030236D3* 74 | Y1660157D3* 75 | X1919213D3* 76 | X1850315Y1522362D3* 77 | Y1345197D3* 78 | Y1168031D3* 79 | X1919213Y1030236D3* 80 | X3448346Y1699528D3* 81 | X3674724Y1345197D3* 82 | Y1522362D3* 83 | X3448346Y990866D3* 84 | X3674724Y1168031D3* 85 | X3605827Y1030236D3* 86 | Y1660157D3* 87 | X3290866D3* 88 | X3221969Y1522362D3* 89 | Y1345197D3* 90 | Y1168031D3* 91 | X3290866Y1030236D3* 92 | X4426299Y1699528D3* 93 | X4652677Y1345197D3* 94 | Y1522362D3* 95 | X4426299Y990866D3* 96 | X4652677Y1168031D3* 97 | X4583780Y1030236D3* 98 | Y1660157D3* 99 | X4268819D3* 100 | X4199921Y1522362D3* 101 | Y1345197D3* 102 | Y1168031D3* 103 | X4268819Y1030236D3* 104 | X5797953Y1699528D3* 105 | X6024331Y1345197D3* 106 | Y1522362D3* 107 | X5797953Y990866D3* 108 | X6024331Y1168031D3* 109 | X5955433Y1030236D3* 110 | Y1660157D3* 111 | X5640472D3* 112 | X5571575Y1522362D3* 113 | Y1345197D3* 114 | Y1168031D3* 115 | X5640472Y1030236D3* 116 | X6775906Y1699528D3* 117 | X7002283Y1345197D3* 118 | Y1522362D3* 119 | X6775906Y990866D3* 120 | X7002283Y1168031D3* 121 | X6933386Y1030236D3* 122 | Y1660157D3* 123 | X6618425D3* 124 | X6549528Y1522362D3* 125 | Y1345197D3* 126 | Y1168031D3* 127 | X6618425Y1030236D3* 128 | D51* 129 | X520000Y1842835D3* 130 | Y846772D3* 131 | X7354646Y1842835D3* 132 | Y846772D3* 133 | D49* 134 | X7151672Y1557795D3* 135 | Y1482992D3* 136 | X7061121Y1520394D3* 137 | X7151672Y1384567D3* 138 | Y1309764D3* 139 | X7061121Y1347165D3* 140 | X7151672Y1211339D3* 141 | Y1136535D3* 142 | X7061121Y1173937D3* 143 | D47* 144 | X6945197Y1764270D3* 145 | X7020000D3* 146 | X6982598Y1673719D3* 147 | X6740472Y1846948D3* 148 | X6815276D3* 149 | X6777874Y1756396D3* 150 | X6527874Y1764270D3* 151 | X6602677D3* 152 | X6565276Y1673719D3* 153 | D49* 154 | X6471005Y990866D3* 155 | Y1065669D3* 156 | X6561556Y1028268D3* 157 | X6400139Y1486929D3* 158 | Y1561732D3* 159 | X6490690Y1524331D3* 160 | X6400139Y1309764D3* 161 | Y1384567D3* 162 | X6490690Y1347165D3* 163 | X6400139Y1132598D3* 164 | Y1207402D3* 165 | X6490690Y1170000D3* 166 | X6173719Y1557795D3* 167 | Y1482992D3* 168 | X6083168Y1520394D3* 169 | X6173719Y1384567D3* 170 | Y1309764D3* 171 | X6083168Y1347165D3* 172 | X6173719Y1211339D3* 173 | Y1136535D3* 174 | X6083168Y1173937D3* 175 | D47* 176 | X5967244Y1764270D3* 177 | X6042047D3* 178 | X6004646Y1673719D3* 179 | X5762520Y1846948D3* 180 | X5837323D3* 181 | X5799921Y1756396D3* 182 | X5549921Y1764270D3* 183 | X5624724D3* 184 | X5587323Y1673719D3* 185 | D49* 186 | X5493052Y990866D3* 187 | Y1065669D3* 188 | X5583604Y1028268D3* 189 | X5422186Y1486929D3* 190 | Y1561732D3* 191 | X5512738Y1524331D3* 192 | X5422186Y1309764D3* 193 | Y1384567D3* 194 | X5512738Y1347165D3* 195 | X5422186Y1132598D3* 196 | Y1207402D3* 197 | X5512738Y1170000D3* 198 | D47* 199 | X5173543Y1685354D3* 200 | X5248346D3* 201 | X5210945Y1594803D3* 202 | D49* 203 | X5108189Y1051496D3* 204 | Y1126299D3* 205 | X5198740Y1088898D3* 206 | X4802066Y1557795D3* 207 | Y1482992D3* 208 | X4711514Y1520394D3* 209 | X4802066Y1384567D3* 210 | Y1309764D3* 211 | X4711514Y1347165D3* 212 | X4802066Y1211339D3* 213 | Y1136535D3* 214 | X4711514Y1173937D3* 215 | D47* 216 | X4595591Y1764270D3* 217 | X4670394D3* 218 | X4632992Y1673719D3* 219 | X4390866Y1846948D3* 220 | X4465669D3* 221 | X4428268Y1756396D3* 222 | X4178268Y1764270D3* 223 | X4253071D3* 224 | X4215669Y1673719D3* 225 | D49* 226 | X4121399Y990866D3* 227 | Y1065669D3* 228 | X4211950Y1028268D3* 229 | X4050533Y1486929D3* 230 | Y1561732D3* 231 | X4141084Y1524331D3* 232 | X4050533Y1309764D3* 233 | Y1384567D3* 234 | X4141084Y1347165D3* 235 | X4050533Y1132598D3* 236 | Y1207402D3* 237 | X4141084Y1170000D3* 238 | X3824113Y1557795D3* 239 | Y1482992D3* 240 | X3733562Y1520394D3* 241 | X3824113Y1384567D3* 242 | Y1309764D3* 243 | X3733562Y1347165D3* 244 | X3824113Y1211339D3* 245 | Y1136535D3* 246 | X3733562Y1173937D3* 247 | D47* 248 | X3617638Y1764270D3* 249 | X3692441D3* 250 | X3655039Y1673719D3* 251 | X3412913Y1846948D3* 252 | X3487717D3* 253 | X3450315Y1756396D3* 254 | X3200315Y1764270D3* 255 | X3275118D3* 256 | X3237717Y1673719D3* 257 | D49* 258 | X3143446Y990866D3* 259 | Y1065669D3* 260 | X3233997Y1028268D3* 261 | X3072580Y1486929D3* 262 | Y1561732D3* 263 | X3163131Y1524331D3* 264 | X3072580Y1309764D3* 265 | Y1384567D3* 266 | X3163131Y1347165D3* 267 | X3072580Y1132598D3* 268 | Y1207402D3* 269 | X3163131Y1170000D3* 270 | D47* 271 | X2823150Y1689291D3* 272 | X2897953D3* 273 | X2860551Y1598740D3* 274 | D49* 275 | X2758583Y1051496D3* 276 | Y1126299D3* 277 | X2849134Y1088898D3* 278 | X2452459Y1557795D3* 279 | Y1482992D3* 280 | X2361908Y1520394D3* 281 | X2452459Y1384567D3* 282 | Y1309764D3* 283 | X2361908Y1347165D3* 284 | X2452459Y1211339D3* 285 | Y1136535D3* 286 | X2361908Y1173937D3* 287 | D47* 288 | X2245984Y1764270D3* 289 | X2320787D3* 290 | X2283386Y1673719D3* 291 | X2041260Y1846948D3* 292 | X2116063D3* 293 | X2078661Y1756396D3* 294 | X1828661Y1764270D3* 295 | X1903465D3* 296 | X1866063Y1673719D3* 297 | D49* 298 | X1771793Y990866D3* 299 | Y1065669D3* 300 | X1862344Y1028268D3* 301 | X1700927Y1486929D3* 302 | Y1561732D3* 303 | X1791478Y1524331D3* 304 | X1700927Y1309764D3* 305 | Y1384567D3* 306 | X1791478Y1347165D3* 307 | X1700927Y1132598D3* 308 | Y1207402D3* 309 | X1791478Y1170000D3* 310 | X1474507Y1557795D3* 311 | Y1482992D3* 312 | X1383955Y1520394D3* 313 | X1474507Y1384567D3* 314 | Y1309764D3* 315 | X1383955Y1347165D3* 316 | X1474507Y1211339D3* 317 | Y1136535D3* 318 | X1383955Y1173937D3* 319 | D47* 320 | X1268031Y1764270D3* 321 | X1342835D3* 322 | X1305433Y1673719D3* 323 | X1063307Y1846948D3* 324 | X1138110D3* 325 | X1100709Y1756396D3* 326 | X850709Y1764270D3* 327 | X925512D3* 328 | X888110Y1673719D3* 329 | D49* 330 | X793840Y990866D3* 331 | Y1065669D3* 332 | X884391Y1028268D3* 333 | X722974Y1486929D3* 334 | Y1561732D3* 335 | X813525Y1524331D3* 336 | X722974Y1309764D3* 337 | Y1384567D3* 338 | X813525Y1347165D3* 339 | X722974Y1132598D3* 340 | Y1207402D3* 341 | X813525Y1170000D3* 342 | M02* 343 | -------------------------------------------------------------------------------- /pcb/clock-face/gerber/top-clock-face.TopAssy.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Top-Clock-IN12c.TopAssy.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Drawing,Top* 5 | G04 #@! TF.Part,Single* 6 | %FSLAX26Y26*% 7 | G04* 8 | G70* 9 | G90* 10 | G75* 11 | G01* 12 | G04 TopAssy* 13 | %LPD*% 14 | M02* 15 | -------------------------------------------------------------------------------- /pcb/clock-face/gerber/top-clock-face.TopMask.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Top-Clock-IN12c.TopMask.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Soldermask,Top* 5 | G04 #@! TF.Part,Single* 6 | %ADD40R,0.031654X0.086772*% 7 | %ADD42R,0.071024X0.055276*% 8 | %ADD44R,0.055276X0.071024*% 9 | %ADD50C,0.204882*% 10 | %ADD52C,0.071024*% 11 | %ADD54O,0.068031X0.078031*% 12 | %ADD56O,0.078031X0.068031*% 13 | %ADD58R,0.043465X0.067087*% 14 | %ADD60R,0.039528X0.039528*% 15 | %FSLAX26Y26*% 16 | G04* 17 | G70* 18 | G90* 19 | G75* 20 | G01* 21 | G04 TopMask* 22 | %LPD*% 23 | D60* 24 | X957008Y1268031D3* 25 | Y1327087D3* 26 | X1000315Y484567D3* 27 | X1059370D3* 28 | X1413701D3* 29 | X1472756D3* 30 | X1934961Y1268031D3* 31 | Y1327087D3* 32 | X1978268Y484567D3* 33 | X2037323D3* 34 | X2391654D3* 35 | X2450709D3* 36 | X3306614Y1268031D3* 37 | Y1327087D3* 38 | X3349921Y484567D3* 39 | X3408976D3* 40 | X3763307D3* 41 | X3822362D3* 42 | X4284567Y1268031D3* 43 | Y1327087D3* 44 | X4327874Y484567D3* 45 | X4386929D3* 46 | X4741260D3* 47 | X4800315D3* 48 | X5656220Y1268031D3* 49 | Y1327087D3* 50 | X5699528Y484567D3* 51 | X5758583D3* 52 | X6112913D3* 53 | X6171969D3* 54 | X6634173Y1268031D3* 55 | Y1327087D3* 56 | X6677480Y484567D3* 57 | X6736535D3* 58 | X7090866D3* 59 | X7149921D3* 60 | D58* 61 | X1031811Y1248346D3* 62 | X1161732D3* 63 | Y1441260D3* 64 | X1031811D3* 65 | X2009764Y1248346D3* 66 | X2139685D3* 67 | Y1441260D3* 68 | X2009764D3* 69 | X3381417Y1248346D3* 70 | X3511339D3* 71 | Y1441260D3* 72 | X3381417D3* 73 | X4359370Y1248346D3* 74 | X4489291D3* 75 | Y1441260D3* 76 | X4359370D3* 77 | X5731024Y1248346D3* 78 | X5860945D3* 79 | Y1441260D3* 80 | X5731024D3* 81 | X6708976Y1248346D3* 82 | X6838898D3* 83 | Y1441260D3* 84 | X6708976D3* 85 | D56* 86 | X472756Y1531417D3* 87 | Y1631417D3* 88 | Y1331417D3* 89 | Y1431417D3* 90 | Y1131417D3* 91 | Y1031417D3* 92 | Y1231417D3* 93 | Y684567D3* 94 | Y484567D3* 95 | Y584567D3* 96 | D54* 97 | X2812520Y866457D3* 98 | X2712520D3* 99 | X5162126D3* 100 | X5062126D3* 101 | D56* 102 | X7401890Y1531417D3* 103 | Y1631417D3* 104 | Y1331417D3* 105 | Y1431417D3* 106 | Y1131417D3* 107 | Y1031417D3* 108 | Y1231417D3* 109 | Y684961D3* 110 | Y484567D3* 111 | Y584567D3* 112 | D52* 113 | X2664094Y1542047D3* 114 | X2860945D3* 115 | X2664094Y1148346D3* 116 | X2860945D3* 117 | X5013701Y1542047D3* 118 | X5210551D3* 119 | X5013701Y1148346D3* 120 | X5210551D3* 121 | X1098740Y1699528D3* 122 | X1325118Y1345197D3* 123 | Y1522362D3* 124 | X1098740Y990866D3* 125 | X1325118Y1168031D3* 126 | X1256220Y1030236D3* 127 | Y1660157D3* 128 | X941260D3* 129 | X872362Y1522362D3* 130 | Y1345197D3* 131 | Y1168031D3* 132 | X941260Y1030236D3* 133 | X2076693Y1699528D3* 134 | X2303071Y1345197D3* 135 | Y1522362D3* 136 | X2076693Y990866D3* 137 | X2303071Y1168031D3* 138 | X2234173Y1030236D3* 139 | Y1660157D3* 140 | X1919213D3* 141 | X1850315Y1522362D3* 142 | Y1345197D3* 143 | Y1168031D3* 144 | X1919213Y1030236D3* 145 | X3448346Y1699528D3* 146 | X3674724Y1345197D3* 147 | Y1522362D3* 148 | X3448346Y990866D3* 149 | X3674724Y1168031D3* 150 | X3605827Y1030236D3* 151 | Y1660157D3* 152 | X3290866D3* 153 | X3221969Y1522362D3* 154 | Y1345197D3* 155 | Y1168031D3* 156 | X3290866Y1030236D3* 157 | X4426299Y1699528D3* 158 | X4652677Y1345197D3* 159 | Y1522362D3* 160 | X4426299Y990866D3* 161 | X4652677Y1168031D3* 162 | X4583780Y1030236D3* 163 | Y1660157D3* 164 | X4268819D3* 165 | X4199921Y1522362D3* 166 | Y1345197D3* 167 | Y1168031D3* 168 | X4268819Y1030236D3* 169 | X5797953Y1699528D3* 170 | X6024331Y1345197D3* 171 | Y1522362D3* 172 | X5797953Y990866D3* 173 | X6024331Y1168031D3* 174 | X5955433Y1030236D3* 175 | Y1660157D3* 176 | X5640472D3* 177 | X5571575Y1522362D3* 178 | Y1345197D3* 179 | Y1168031D3* 180 | X5640472Y1030236D3* 181 | X6775906Y1699528D3* 182 | X7002283Y1345197D3* 183 | Y1522362D3* 184 | X6775906Y990866D3* 185 | X7002283Y1168031D3* 186 | X6933386Y1030236D3* 187 | Y1660157D3* 188 | X6618425D3* 189 | X6549528Y1522362D3* 190 | Y1345197D3* 191 | Y1168031D3* 192 | X6618425Y1030236D3* 193 | D50* 194 | X520000Y1842835D3* 195 | Y846772D3* 196 | X7354646Y1842835D3* 197 | Y846772D3* 198 | D60* 199 | X807402Y1490866D3* 200 | X748346D3* 201 | X807402Y1313701D3* 202 | X748346D3* 203 | X807402Y1136535D3* 204 | X748346D3* 205 | X850709Y994803D3* 206 | X791654D3* 207 | X917638Y1762520D3* 208 | X858583D3* 209 | X1122362Y1845197D3* 210 | X1063307D3* 211 | X1331024Y1762520D3* 212 | X1271969D3* 213 | D44* 214 | X1331024Y1030236D3* 215 | X1441260D3* 216 | D60* 217 | X1394016Y1553858D3* 218 | X1453071D3* 219 | X1394016Y1380630D3* 220 | X1453071D3* 221 | X1394016Y1207402D3* 222 | X1453071D3* 223 | X1785354Y1490866D3* 224 | X1726299D3* 225 | X1785354Y1313701D3* 226 | X1726299D3* 227 | X1785354Y1136535D3* 228 | X1726299D3* 229 | X1828661Y994803D3* 230 | X1769606D3* 231 | X1895591Y1762520D3* 232 | X1836535D3* 233 | X2100315Y1845197D3* 234 | X2041260D3* 235 | X2308976Y1762520D3* 236 | X2249921D3* 237 | D44* 238 | X2308976Y1030236D3* 239 | X2419213D3* 240 | D60* 241 | X2371969Y1553858D3* 242 | X2431024D3* 243 | X2371969Y1380630D3* 244 | X2431024D3* 245 | X2371969Y1207402D3* 246 | X2431024D3* 247 | D42* 248 | X2660157Y1614488D3* 249 | Y1724724D3* 250 | Y1220787D3* 251 | Y1331024D3* 252 | D60* 253 | X2766457Y1039685D3* 254 | X2707402D3* 255 | X2819213Y1689291D3* 256 | Y1630236D3* 257 | X3157008Y1490866D3* 258 | X3097953D3* 259 | X3157008Y1313701D3* 260 | X3097953D3* 261 | X3157008Y1136535D3* 262 | X3097953D3* 263 | X3200315Y994803D3* 264 | X3141260D3* 265 | X3267244Y1762520D3* 266 | X3208189D3* 267 | X3471969Y1845197D3* 268 | X3412913D3* 269 | X3680630Y1762520D3* 270 | X3621575D3* 271 | D44* 272 | X3680630Y1030236D3* 273 | X3790866D3* 274 | D60* 275 | X3743622Y1553858D3* 276 | X3802677D3* 277 | X3743622Y1380630D3* 278 | X3802677D3* 279 | X3743622Y1207402D3* 280 | X3802677D3* 281 | X4134961Y1490866D3* 282 | X4075906D3* 283 | X4134961Y1313701D3* 284 | X4075906D3* 285 | X4134961Y1136535D3* 286 | X4075906D3* 287 | X4178268Y994803D3* 288 | X4119213D3* 289 | X4245197Y1762520D3* 290 | X4186142D3* 291 | X4449921Y1845197D3* 292 | X4390866D3* 293 | X4658583Y1762520D3* 294 | X4599528D3* 295 | D44* 296 | X4658583Y1030236D3* 297 | X4768819D3* 298 | D60* 299 | X4721575Y1553858D3* 300 | X4780630D3* 301 | X4721575Y1380630D3* 302 | X4780630D3* 303 | X4721575Y1207402D3* 304 | X4780630D3* 305 | D42* 306 | X5009764Y1614488D3* 307 | Y1724724D3* 308 | Y1220787D3* 309 | Y1331024D3* 310 | D60* 311 | X5116063Y1039685D3* 312 | X5057008D3* 313 | X5168819Y1689291D3* 314 | Y1630236D3* 315 | X5506614Y1490866D3* 316 | X5447559D3* 317 | X5506614Y1313701D3* 318 | X5447559D3* 319 | X5506614Y1136535D3* 320 | X5447559D3* 321 | X5549921Y994803D3* 322 | X5490866D3* 323 | X5616850Y1762520D3* 324 | X5557795D3* 325 | X5821575Y1845197D3* 326 | X5762520D3* 327 | X6030236Y1762520D3* 328 | X5971181D3* 329 | D44* 330 | X6030236Y1030236D3* 331 | X6140472D3* 332 | D60* 333 | X6093228Y1553858D3* 334 | X6152283D3* 335 | X6093228Y1380630D3* 336 | X6152283D3* 337 | X6093228Y1207402D3* 338 | X6152283D3* 339 | X6484567Y1490866D3* 340 | X6425512D3* 341 | X6484567Y1313701D3* 342 | X6425512D3* 343 | X6484567Y1136535D3* 344 | X6425512D3* 345 | X6527874Y994803D3* 346 | X6468819D3* 347 | X6594803Y1762520D3* 348 | X6535748D3* 349 | X6799528Y1845197D3* 350 | X6740472D3* 351 | X7008189Y1762520D3* 352 | X6949134D3* 353 | D44* 354 | X7008189Y1030236D3* 355 | X7118425D3* 356 | D60* 357 | X7071181Y1553858D3* 358 | X7130236D3* 359 | X7071181Y1380630D3* 360 | X7130236D3* 361 | X7071181Y1207402D3* 362 | X7130236D3* 363 | D40* 364 | X1063307Y797953D3* 365 | X1013307D3* 366 | X963307D3* 367 | X913307D3* 368 | X863307D3* 369 | X813307D3* 370 | X763307D3* 371 | X713307D3* 372 | Y585354D3* 373 | X763307D3* 374 | X813307D3* 375 | X863307D3* 376 | X913307D3* 377 | X963307D3* 378 | X1013307D3* 379 | X1063307D3* 380 | X1472756Y797953D3* 381 | X1422756D3* 382 | X1372756D3* 383 | X1322756D3* 384 | X1272756D3* 385 | X1222756D3* 386 | X1172756D3* 387 | X1122756D3* 388 | Y585354D3* 389 | X1172756D3* 390 | X1222756D3* 391 | X1272756D3* 392 | X1322756D3* 393 | X1372756D3* 394 | X1422756D3* 395 | X1472756D3* 396 | X2041260Y797953D3* 397 | X1991260D3* 398 | X1941260D3* 399 | X1891260D3* 400 | X1841260D3* 401 | X1791260D3* 402 | X1741260D3* 403 | X1691260D3* 404 | Y585354D3* 405 | X1741260D3* 406 | X1791260D3* 407 | X1841260D3* 408 | X1891260D3* 409 | X1941260D3* 410 | X1991260D3* 411 | X2041260D3* 412 | X2450709Y797953D3* 413 | X2400709D3* 414 | X2350709D3* 415 | X2300709D3* 416 | X2250709D3* 417 | X2200709D3* 418 | X2150709D3* 419 | X2100709D3* 420 | Y585354D3* 421 | X2150709D3* 422 | X2200709D3* 423 | X2250709D3* 424 | X2300709D3* 425 | X2350709D3* 426 | X2400709D3* 427 | X2450709D3* 428 | X3412913Y797953D3* 429 | X3362913D3* 430 | X3312913D3* 431 | X3262913D3* 432 | X3212913D3* 433 | X3162913D3* 434 | X3112913D3* 435 | X3062913D3* 436 | Y585354D3* 437 | X3112913D3* 438 | X3162913D3* 439 | X3212913D3* 440 | X3262913D3* 441 | X3312913D3* 442 | X3362913D3* 443 | X3412913D3* 444 | X3822362Y797953D3* 445 | X3772362D3* 446 | X3722362D3* 447 | X3672362D3* 448 | X3622362D3* 449 | X3572362D3* 450 | X3522362D3* 451 | X3472362D3* 452 | Y585354D3* 453 | X3522362D3* 454 | X3572362D3* 455 | X3622362D3* 456 | X3672362D3* 457 | X3722362D3* 458 | X3772362D3* 459 | X3822362D3* 460 | X4390866Y797953D3* 461 | X4340866D3* 462 | X4290866D3* 463 | X4240866D3* 464 | X4190866D3* 465 | X4140866D3* 466 | X4090866D3* 467 | X4040866D3* 468 | Y585354D3* 469 | X4090866D3* 470 | X4140866D3* 471 | X4190866D3* 472 | X4240866D3* 473 | X4290866D3* 474 | X4340866D3* 475 | X4390866D3* 476 | X4800315Y797953D3* 477 | X4750315D3* 478 | X4700315D3* 479 | X4650315D3* 480 | X4600315D3* 481 | X4550315D3* 482 | X4500315D3* 483 | X4450315D3* 484 | Y585354D3* 485 | X4500315D3* 486 | X4550315D3* 487 | X4600315D3* 488 | X4650315D3* 489 | X4700315D3* 490 | X4750315D3* 491 | X4800315D3* 492 | X5762520Y797953D3* 493 | X5712520D3* 494 | X5662520D3* 495 | X5612520D3* 496 | X5562520D3* 497 | X5512520D3* 498 | X5462520D3* 499 | X5412520D3* 500 | Y585354D3* 501 | X5462520D3* 502 | X5512520D3* 503 | X5562520D3* 504 | X5612520D3* 505 | X5662520D3* 506 | X5712520D3* 507 | X5762520D3* 508 | X6171969Y797953D3* 509 | X6121969D3* 510 | X6071969D3* 511 | X6021969D3* 512 | X5971969D3* 513 | X5921969D3* 514 | X5871969D3* 515 | X5821969D3* 516 | Y585354D3* 517 | X5871969D3* 518 | X5921969D3* 519 | X5971969D3* 520 | X6021969D3* 521 | X6071969D3* 522 | X6121969D3* 523 | X6171969D3* 524 | X6740472Y797953D3* 525 | X6690472D3* 526 | X6640472D3* 527 | X6590472D3* 528 | X6540472D3* 529 | X6490472D3* 530 | X6440472D3* 531 | X6390472D3* 532 | Y585354D3* 533 | X6440472D3* 534 | X6490472D3* 535 | X6540472D3* 536 | X6590472D3* 537 | X6640472D3* 538 | X6690472D3* 539 | X6740472D3* 540 | X7149921Y797953D3* 541 | X7099921D3* 542 | X7049921D3* 543 | X6999921D3* 544 | X6949921D3* 545 | X6899921D3* 546 | X6849921D3* 547 | X6799921D3* 548 | Y585354D3* 549 | X6849921D3* 550 | X6899921D3* 551 | X6949921D3* 552 | X6999921D3* 553 | X7049921D3* 554 | X7099921D3* 555 | X7149921D3* 556 | M02* 557 | -------------------------------------------------------------------------------- /pcb/clock-face/gerber/top-clock-face.TopPaste.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Top-Clock-IN12c.TopPaste.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Paste,Top* 5 | G04 #@! TF.Part,Single* 6 | %ADD41R,0.015591X0.070709*% 7 | %ADD43R,0.054961X0.039213*% 8 | %ADD45R,0.039213X0.054961*% 9 | %ADD51C,0.188819*% 10 | %ADD53C,0.054961*% 11 | %ADD55O,0.051969X0.061969*% 12 | %ADD57O,0.061969X0.051969*% 13 | %ADD59R,0.027402X0.051024*% 14 | %ADD61R,0.023465X0.023465*% 15 | %FSLAX26Y26*% 16 | G04* 17 | G70* 18 | G90* 19 | G75* 20 | G01* 21 | G04 TopPaste* 22 | %LPD*% 23 | D61* 24 | X957008Y1268031D3* 25 | Y1327087D3* 26 | X1000315Y484567D3* 27 | X1059370D3* 28 | X1413701D3* 29 | X1472756D3* 30 | X1934961Y1268031D3* 31 | Y1327087D3* 32 | X1978268Y484567D3* 33 | X2037323D3* 34 | X2391654D3* 35 | X2450709D3* 36 | X3306614Y1268031D3* 37 | Y1327087D3* 38 | X3349921Y484567D3* 39 | X3408976D3* 40 | X3763307D3* 41 | X3822362D3* 42 | X4284567Y1268031D3* 43 | Y1327087D3* 44 | X4327874Y484567D3* 45 | X4386929D3* 46 | X4741260D3* 47 | X4800315D3* 48 | X5656220Y1268031D3* 49 | Y1327087D3* 50 | X5699528Y484567D3* 51 | X5758583D3* 52 | X6112913D3* 53 | X6171969D3* 54 | X6634173Y1268031D3* 55 | Y1327087D3* 56 | X6677480Y484567D3* 57 | X6736535D3* 58 | X7090866D3* 59 | X7149921D3* 60 | D59* 61 | X1031811Y1248346D3* 62 | X1161732D3* 63 | Y1441260D3* 64 | X1031811D3* 65 | X2009764Y1248346D3* 66 | X2139685D3* 67 | Y1441260D3* 68 | X2009764D3* 69 | X3381417Y1248346D3* 70 | X3511339D3* 71 | Y1441260D3* 72 | X3381417D3* 73 | X4359370Y1248346D3* 74 | X4489291D3* 75 | Y1441260D3* 76 | X4359370D3* 77 | X5731024Y1248346D3* 78 | X5860945D3* 79 | Y1441260D3* 80 | X5731024D3* 81 | X6708976Y1248346D3* 82 | X6838898D3* 83 | Y1441260D3* 84 | X6708976D3* 85 | D57* 86 | X472756Y1531417D3* 87 | Y1631417D3* 88 | Y1331417D3* 89 | Y1431417D3* 90 | Y1131417D3* 91 | Y1031417D3* 92 | Y1231417D3* 93 | Y684567D3* 94 | Y484567D3* 95 | Y584567D3* 96 | D55* 97 | X2812520Y866457D3* 98 | X2712520D3* 99 | X5162126D3* 100 | X5062126D3* 101 | D57* 102 | X7401890Y1531417D3* 103 | Y1631417D3* 104 | Y1331417D3* 105 | Y1431417D3* 106 | Y1131417D3* 107 | Y1031417D3* 108 | Y1231417D3* 109 | Y684961D3* 110 | Y484567D3* 111 | Y584567D3* 112 | D53* 113 | X2664094Y1542047D3* 114 | X2860945D3* 115 | X2664094Y1148346D3* 116 | X2860945D3* 117 | X5013701Y1542047D3* 118 | X5210551D3* 119 | X5013701Y1148346D3* 120 | X5210551D3* 121 | X1098740Y1699528D3* 122 | X1325118Y1345197D3* 123 | Y1522362D3* 124 | X1098740Y990866D3* 125 | X1325118Y1168031D3* 126 | X1256220Y1030236D3* 127 | Y1660157D3* 128 | X941260D3* 129 | X872362Y1522362D3* 130 | Y1345197D3* 131 | Y1168031D3* 132 | X941260Y1030236D3* 133 | X2076693Y1699528D3* 134 | X2303071Y1345197D3* 135 | Y1522362D3* 136 | X2076693Y990866D3* 137 | X2303071Y1168031D3* 138 | X2234173Y1030236D3* 139 | Y1660157D3* 140 | X1919213D3* 141 | X1850315Y1522362D3* 142 | Y1345197D3* 143 | Y1168031D3* 144 | X1919213Y1030236D3* 145 | X3448346Y1699528D3* 146 | X3674724Y1345197D3* 147 | Y1522362D3* 148 | X3448346Y990866D3* 149 | X3674724Y1168031D3* 150 | X3605827Y1030236D3* 151 | Y1660157D3* 152 | X3290866D3* 153 | X3221969Y1522362D3* 154 | Y1345197D3* 155 | Y1168031D3* 156 | X3290866Y1030236D3* 157 | X4426299Y1699528D3* 158 | X4652677Y1345197D3* 159 | Y1522362D3* 160 | X4426299Y990866D3* 161 | X4652677Y1168031D3* 162 | X4583780Y1030236D3* 163 | Y1660157D3* 164 | X4268819D3* 165 | X4199921Y1522362D3* 166 | Y1345197D3* 167 | Y1168031D3* 168 | X4268819Y1030236D3* 169 | X5797953Y1699528D3* 170 | X6024331Y1345197D3* 171 | Y1522362D3* 172 | X5797953Y990866D3* 173 | X6024331Y1168031D3* 174 | X5955433Y1030236D3* 175 | Y1660157D3* 176 | X5640472D3* 177 | X5571575Y1522362D3* 178 | Y1345197D3* 179 | Y1168031D3* 180 | X5640472Y1030236D3* 181 | X6775906Y1699528D3* 182 | X7002283Y1345197D3* 183 | Y1522362D3* 184 | X6775906Y990866D3* 185 | X7002283Y1168031D3* 186 | X6933386Y1030236D3* 187 | Y1660157D3* 188 | X6618425D3* 189 | X6549528Y1522362D3* 190 | Y1345197D3* 191 | Y1168031D3* 192 | X6618425Y1030236D3* 193 | D51* 194 | X520000Y1842835D3* 195 | Y846772D3* 196 | X7354646Y1842835D3* 197 | Y846772D3* 198 | D61* 199 | X807402Y1490866D3* 200 | X748346D3* 201 | X807402Y1313701D3* 202 | X748346D3* 203 | X807402Y1136535D3* 204 | X748346D3* 205 | X850709Y994803D3* 206 | X791654D3* 207 | X917638Y1762520D3* 208 | X858583D3* 209 | X1122362Y1845197D3* 210 | X1063307D3* 211 | X1331024Y1762520D3* 212 | X1271969D3* 213 | D45* 214 | X1331024Y1030236D3* 215 | X1441260D3* 216 | D61* 217 | X1394016Y1553858D3* 218 | X1453071D3* 219 | X1394016Y1380630D3* 220 | X1453071D3* 221 | X1394016Y1207402D3* 222 | X1453071D3* 223 | X1785354Y1490866D3* 224 | X1726299D3* 225 | X1785354Y1313701D3* 226 | X1726299D3* 227 | X1785354Y1136535D3* 228 | X1726299D3* 229 | X1828661Y994803D3* 230 | X1769606D3* 231 | X1895591Y1762520D3* 232 | X1836535D3* 233 | X2100315Y1845197D3* 234 | X2041260D3* 235 | X2308976Y1762520D3* 236 | X2249921D3* 237 | D45* 238 | X2308976Y1030236D3* 239 | X2419213D3* 240 | D61* 241 | X2371969Y1553858D3* 242 | X2431024D3* 243 | X2371969Y1380630D3* 244 | X2431024D3* 245 | X2371969Y1207402D3* 246 | X2431024D3* 247 | D43* 248 | X2660157Y1614488D3* 249 | Y1724724D3* 250 | Y1220787D3* 251 | Y1331024D3* 252 | D61* 253 | X2766457Y1039685D3* 254 | X2707402D3* 255 | X2819213Y1689291D3* 256 | Y1630236D3* 257 | X3157008Y1490866D3* 258 | X3097953D3* 259 | X3157008Y1313701D3* 260 | X3097953D3* 261 | X3157008Y1136535D3* 262 | X3097953D3* 263 | X3200315Y994803D3* 264 | X3141260D3* 265 | X3267244Y1762520D3* 266 | X3208189D3* 267 | X3471969Y1845197D3* 268 | X3412913D3* 269 | X3680630Y1762520D3* 270 | X3621575D3* 271 | D45* 272 | X3680630Y1030236D3* 273 | X3790866D3* 274 | D61* 275 | X3743622Y1553858D3* 276 | X3802677D3* 277 | X3743622Y1380630D3* 278 | X3802677D3* 279 | X3743622Y1207402D3* 280 | X3802677D3* 281 | X4134961Y1490866D3* 282 | X4075906D3* 283 | X4134961Y1313701D3* 284 | X4075906D3* 285 | X4134961Y1136535D3* 286 | X4075906D3* 287 | X4178268Y994803D3* 288 | X4119213D3* 289 | X4245197Y1762520D3* 290 | X4186142D3* 291 | X4449921Y1845197D3* 292 | X4390866D3* 293 | X4658583Y1762520D3* 294 | X4599528D3* 295 | D45* 296 | X4658583Y1030236D3* 297 | X4768819D3* 298 | D61* 299 | X4721575Y1553858D3* 300 | X4780630D3* 301 | X4721575Y1380630D3* 302 | X4780630D3* 303 | X4721575Y1207402D3* 304 | X4780630D3* 305 | D43* 306 | X5009764Y1614488D3* 307 | Y1724724D3* 308 | Y1220787D3* 309 | Y1331024D3* 310 | D61* 311 | X5116063Y1039685D3* 312 | X5057008D3* 313 | X5168819Y1689291D3* 314 | Y1630236D3* 315 | X5506614Y1490866D3* 316 | X5447559D3* 317 | X5506614Y1313701D3* 318 | X5447559D3* 319 | X5506614Y1136535D3* 320 | X5447559D3* 321 | X5549921Y994803D3* 322 | X5490866D3* 323 | X5616850Y1762520D3* 324 | X5557795D3* 325 | X5821575Y1845197D3* 326 | X5762520D3* 327 | X6030236Y1762520D3* 328 | X5971181D3* 329 | D45* 330 | X6030236Y1030236D3* 331 | X6140472D3* 332 | D61* 333 | X6093228Y1553858D3* 334 | X6152283D3* 335 | X6093228Y1380630D3* 336 | X6152283D3* 337 | X6093228Y1207402D3* 338 | X6152283D3* 339 | X6484567Y1490866D3* 340 | X6425512D3* 341 | X6484567Y1313701D3* 342 | X6425512D3* 343 | X6484567Y1136535D3* 344 | X6425512D3* 345 | X6527874Y994803D3* 346 | X6468819D3* 347 | X6594803Y1762520D3* 348 | X6535748D3* 349 | X6799528Y1845197D3* 350 | X6740472D3* 351 | X7008189Y1762520D3* 352 | X6949134D3* 353 | D45* 354 | X7008189Y1030236D3* 355 | X7118425D3* 356 | D61* 357 | X7071181Y1553858D3* 358 | X7130236D3* 359 | X7071181Y1380630D3* 360 | X7130236D3* 361 | X7071181Y1207402D3* 362 | X7130236D3* 363 | D41* 364 | X1063307Y797953D3* 365 | X1013307D3* 366 | X963307D3* 367 | X913307D3* 368 | X863307D3* 369 | X813307D3* 370 | X763307D3* 371 | X713307D3* 372 | Y585354D3* 373 | X763307D3* 374 | X813307D3* 375 | X863307D3* 376 | X913307D3* 377 | X963307D3* 378 | X1013307D3* 379 | X1063307D3* 380 | X1472756Y797953D3* 381 | X1422756D3* 382 | X1372756D3* 383 | X1322756D3* 384 | X1272756D3* 385 | X1222756D3* 386 | X1172756D3* 387 | X1122756D3* 388 | Y585354D3* 389 | X1172756D3* 390 | X1222756D3* 391 | X1272756D3* 392 | X1322756D3* 393 | X1372756D3* 394 | X1422756D3* 395 | X1472756D3* 396 | X2041260Y797953D3* 397 | X1991260D3* 398 | X1941260D3* 399 | X1891260D3* 400 | X1841260D3* 401 | X1791260D3* 402 | X1741260D3* 403 | X1691260D3* 404 | Y585354D3* 405 | X1741260D3* 406 | X1791260D3* 407 | X1841260D3* 408 | X1891260D3* 409 | X1941260D3* 410 | X1991260D3* 411 | X2041260D3* 412 | X2450709Y797953D3* 413 | X2400709D3* 414 | X2350709D3* 415 | X2300709D3* 416 | X2250709D3* 417 | X2200709D3* 418 | X2150709D3* 419 | X2100709D3* 420 | Y585354D3* 421 | X2150709D3* 422 | X2200709D3* 423 | X2250709D3* 424 | X2300709D3* 425 | X2350709D3* 426 | X2400709D3* 427 | X2450709D3* 428 | X3412913Y797953D3* 429 | X3362913D3* 430 | X3312913D3* 431 | X3262913D3* 432 | X3212913D3* 433 | X3162913D3* 434 | X3112913D3* 435 | X3062913D3* 436 | Y585354D3* 437 | X3112913D3* 438 | X3162913D3* 439 | X3212913D3* 440 | X3262913D3* 441 | X3312913D3* 442 | X3362913D3* 443 | X3412913D3* 444 | X3822362Y797953D3* 445 | X3772362D3* 446 | X3722362D3* 447 | X3672362D3* 448 | X3622362D3* 449 | X3572362D3* 450 | X3522362D3* 451 | X3472362D3* 452 | Y585354D3* 453 | X3522362D3* 454 | X3572362D3* 455 | X3622362D3* 456 | X3672362D3* 457 | X3722362D3* 458 | X3772362D3* 459 | X3822362D3* 460 | X4390866Y797953D3* 461 | X4340866D3* 462 | X4290866D3* 463 | X4240866D3* 464 | X4190866D3* 465 | X4140866D3* 466 | X4090866D3* 467 | X4040866D3* 468 | Y585354D3* 469 | X4090866D3* 470 | X4140866D3* 471 | X4190866D3* 472 | X4240866D3* 473 | X4290866D3* 474 | X4340866D3* 475 | X4390866D3* 476 | X4800315Y797953D3* 477 | X4750315D3* 478 | X4700315D3* 479 | X4650315D3* 480 | X4600315D3* 481 | X4550315D3* 482 | X4500315D3* 483 | X4450315D3* 484 | Y585354D3* 485 | X4500315D3* 486 | X4550315D3* 487 | X4600315D3* 488 | X4650315D3* 489 | X4700315D3* 490 | X4750315D3* 491 | X4800315D3* 492 | X5762520Y797953D3* 493 | X5712520D3* 494 | X5662520D3* 495 | X5612520D3* 496 | X5562520D3* 497 | X5512520D3* 498 | X5462520D3* 499 | X5412520D3* 500 | Y585354D3* 501 | X5462520D3* 502 | X5512520D3* 503 | X5562520D3* 504 | X5612520D3* 505 | X5662520D3* 506 | X5712520D3* 507 | X5762520D3* 508 | X6171969Y797953D3* 509 | X6121969D3* 510 | X6071969D3* 511 | X6021969D3* 512 | X5971969D3* 513 | X5921969D3* 514 | X5871969D3* 515 | X5821969D3* 516 | Y585354D3* 517 | X5871969D3* 518 | X5921969D3* 519 | X5971969D3* 520 | X6021969D3* 521 | X6071969D3* 522 | X6121969D3* 523 | X6171969D3* 524 | X6740472Y797953D3* 525 | X6690472D3* 526 | X6640472D3* 527 | X6590472D3* 528 | X6540472D3* 529 | X6490472D3* 530 | X6440472D3* 531 | X6390472D3* 532 | Y585354D3* 533 | X6440472D3* 534 | X6490472D3* 535 | X6540472D3* 536 | X6590472D3* 537 | X6640472D3* 538 | X6690472D3* 539 | X6740472D3* 540 | X7149921Y797953D3* 541 | X7099921D3* 542 | X7049921D3* 543 | X6999921D3* 544 | X6949921D3* 545 | X6899921D3* 546 | X6849921D3* 547 | X6799921D3* 548 | Y585354D3* 549 | X6849921D3* 550 | X6899921D3* 551 | X6949921D3* 552 | X6999921D3* 553 | X7049921D3* 554 | X7099921D3* 555 | X7149921D3* 556 | M02* 557 | -------------------------------------------------------------------------------- /pcb/logic-board/esp32-nixie-clock-logic-board-bottom-render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pcb/logic-board/esp32-nixie-clock-logic-board-bottom-render.png -------------------------------------------------------------------------------- /pcb/logic-board/esp32-nixie-clock-logic-board-top-render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pcb/logic-board/esp32-nixie-clock-logic-board-top-render.png -------------------------------------------------------------------------------- /pcb/logic-board/gerber/Through.drl: -------------------------------------------------------------------------------- 1 | M48 2 | INCH 3 | T01C0.0118 4 | T02C0.0157 5 | T03C0.0197 6 | T04C0.033 7 | T05C0.034 8 | T06C0.0461 9 | T07C0.0591 10 | T08C0.0984 11 | T09C0.1102 12 | % 13 | T01 14 | X+060948Y+007050 15 | X+060948Y+006775 16 | X+060948Y+006499 17 | X+061263Y+006499 18 | X+061263Y+006775 19 | X+061263Y+007050 20 | T02 21 | X+004550Y+018838 22 | X+005200Y+019192 23 | X+005850Y+018838 24 | X+005850Y+018050 25 | X+005200Y+017657 26 | X+004550Y+018050 27 | X+008901Y+011145 28 | X+010318Y+010554 29 | X+011106Y+011184 30 | X+011106Y+012011 31 | X+010869Y+012720 32 | X+013704Y+012523 33 | X+014098Y+012090 34 | X+014491Y+012090 35 | X+014885Y+012090 36 | X+015279Y+012090 37 | X+013822Y+011539 38 | X+013822Y+011027 39 | X+014019Y+009334 40 | X+015436Y+009334 41 | X+015751Y+009806 42 | X+015751Y+010279 43 | X+017838Y+010239 44 | X+017917Y+008428 45 | X+018271Y+005791 46 | X+022523Y+008035 47 | X+025161Y+007720 48 | X+026420Y+007680 49 | X+026617Y+008035 50 | X+026342Y+008861 51 | X+026342Y+010161 52 | X+026302Y+011381 53 | X+026578Y+012247 54 | X+027247Y+012050 55 | X+028468Y+011420 56 | X+030594Y+012090 57 | X+030830Y+011499 58 | X+031893Y+011460 59 | X+031381Y+012680 60 | X+030869Y+013113 61 | X+031578Y+013468 62 | X+032247Y+012759 63 | X+033980Y+012680 64 | X+034846Y+012759 65 | X+036499Y+013428 66 | X+036617Y+013035 67 | X+033980Y+010200 68 | X+031381Y+010161 69 | X+031499Y+008231 70 | X+031499Y+007720 71 | X+031499Y+007247 72 | X+031499Y+006735 73 | X+031499Y+006224 74 | X+030869Y+004964 75 | X+029176Y+004964 76 | X+029649Y+007680 77 | X+029413Y+008035 78 | X+030476Y+007995 79 | X+030791Y+007680 80 | X+036460Y+007720 81 | X+036460Y+007247 82 | X+036460Y+006735 83 | X+036460Y+008231 84 | X+036775Y+005239 85 | X+038428Y+005318 86 | X+042326Y+006814 87 | X+042326Y+007208 88 | X+044570Y+009413 89 | X+045515Y+011145 90 | X+045200Y+011499 91 | X+044885Y+011854 92 | X+045672Y+012169 93 | X+047287Y+009964 94 | X+047247Y+008822 95 | X+047720Y+008822 96 | X+047917Y+007050 97 | X+047917Y+006617 98 | X+047523Y+006617 99 | X+047129Y+006617 100 | X+048271Y+011066 101 | X+049058Y+011420 102 | X+048901Y+011854 103 | X+049294Y+012208 104 | X+052562Y+011696 105 | X+054452Y+011696 106 | X+058192Y+010948 107 | X+058940Y+011460 108 | X+059334Y+011460 109 | X+059728Y+011460 110 | X+060121Y+011460 111 | X+060515Y+011460 112 | X+060909Y+011460 113 | X+061302Y+011460 114 | X+061696Y+011460 115 | X+062090Y+011460 116 | X+061932Y+009176 117 | X+061972Y+007483 118 | X+062287Y+005318 119 | X+062287Y+004924 120 | X+062287Y+004531 121 | X+060239Y+006066 122 | X+059176Y+007208 123 | X+057483Y+007326 124 | X+057483Y+006932 125 | X+057483Y+006539 126 | X+057483Y+006145 127 | X+057483Y+007720 128 | X+057483Y+008113 129 | X+057483Y+008507 130 | X+060082Y+016893 131 | X+060476Y+016893 132 | X+060869Y+016893 133 | X+061263Y+016893 134 | X+061657Y+016893 135 | X+062050Y+016893 136 | X+062444Y+016893 137 | X+062838Y+016893 138 | X+072897Y+018050 139 | X+073546Y+017657 140 | X+074196Y+018050 141 | X+074196Y+018838 142 | X+073546Y+019192 143 | X+072897Y+018838 144 | X+073546Y+009231 145 | X+072897Y+008877 146 | X+072897Y+008090 147 | X+073546Y+007696 148 | X+074196Y+008090 149 | X+074196Y+008877 150 | X+025751Y+012287 151 | X+025082Y+011381 152 | X+023507Y+013783 153 | X+021735Y+012798 154 | X+017602Y+013783 155 | X+007483Y+008743 156 | X+007483Y+007917 157 | X+005850Y+008090 158 | X+005200Y+007696 159 | X+004550Y+008090 160 | X+004550Y+008877 161 | X+005200Y+009231 162 | X+005850Y+008877 163 | T03 164 | X+039098Y+004413 165 | X+040003Y+004924 166 | X+040554Y+005909 167 | X+042129Y+005909 168 | X+043704Y+005909 169 | X+045672Y+006106 170 | X+046066Y+004728 171 | X+047641Y+004728 172 | X+049216Y+004728 173 | X+045672Y+008861 174 | X+045003Y+009806 175 | X+045003Y+010239 176 | X+045003Y+010672 177 | X+043153Y+008586 178 | X+041578Y+008586 179 | X+040003Y+008586 180 | X+039098Y+007956 181 | X+039098Y+010672 182 | X+037641Y+012326 183 | X+029767Y+004413 184 | X+027050Y+004924 185 | X+021657Y+009452 186 | X+021657Y+011027 187 | X+020082Y+009452 188 | X+018507Y+009452 189 | X+017405Y+006342 190 | X+014216Y+004924 191 | X+013113Y+004924 192 | X+013665Y+007562 193 | X+012405Y+009255 194 | X+012405Y+010515 195 | X+010830Y+009255 196 | X+009885Y+010161 197 | X+009255Y+009255 198 | X+009885Y+007602 199 | X+007090Y+015161 200 | X+007090Y+016735 201 | X+007090Y+018310 202 | X+016066Y+013271 203 | X+056696Y+012602 204 | X+056696Y+014176 205 | X+056696Y+015751 206 | X+056696Y+017326 207 | X+056696Y+018901 208 | X+059058Y+014964 209 | X+060633Y+014964 210 | X+062208Y+014964 211 | X+062208Y+013389 212 | X+060633Y+013389 213 | X+059058Y+013389 214 | X+056696Y+011027 215 | X+057090Y+004728 216 | X+058665Y+004728 217 | X+060239Y+004728 218 | X+063704Y+007562 219 | X+063704Y+007995 220 | X+063704Y+008428 221 | X+063704Y+008861 222 | X+064176Y+009058 223 | X+064609Y+009058 224 | T04 225 | X+038283Y+013389 226 | X+039283Y+013389 227 | X+040283Y+013389 228 | X+041283Y+013389 229 | X+042283Y+013389 230 | X+037283Y+013389 231 | T05 232 | X+043283Y+013377 233 | X+044283Y+013377 234 | X+045283Y+013389 235 | X+046283Y+013389 236 | X+047283Y+013389 237 | X+048283Y+013389 238 | X+049283Y+013389 239 | X+050283Y+013389 240 | X+051283Y+013389 241 | X+051621Y+008665 242 | X+050621Y+008665 243 | X+028125Y+008665 244 | X+027125Y+008665 245 | X+004728Y+010314 246 | X+004728Y+011314 247 | X+004728Y+012314 248 | X+004728Y+013314 249 | X+004728Y+014314 250 | X+004728Y+015314 251 | X+004728Y+016314 252 | X+004728Y+006846 253 | X+004728Y+005846 254 | X+004728Y+004846 255 | X+074019Y+004846 256 | X+074019Y+005846 257 | X+074019Y+006850 258 | X+074019Y+010314 259 | X+074019Y+011314 260 | X+074019Y+012314 261 | X+074019Y+013314 262 | X+074019Y+014314 263 | X+074019Y+015314 264 | X+074019Y+016314 265 | T06 266 | X+037976Y+008704 267 | T07 268 | X+030102Y+008704 269 | T08 270 | X+020003Y+010830 271 | T09 272 | X+005200Y+018428 273 | X+005200Y+008468 274 | X+073546Y+008468 275 | X+073546Y+018428 276 | T00 277 | M30 278 | -------------------------------------------------------------------------------- /pcb/logic-board/gerber/clock-logic-board.Board.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Bottom-Clock-IN12e.Board.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Drawing,Board polygon* 5 | G04 #@! TF.Part,Single* 6 | %FSLAX26Y26*% 7 | G04* 8 | G70* 9 | G90* 10 | G75* 11 | G01* 12 | G04 BoardPoly* 13 | %LPD*% 14 | G36* 15 | X520000Y394016D2* 16 | X5039685D1* 17 | Y748346D1* 18 | X5512126D1* 19 | Y394016D1* 20 | X7354646D1* 21 | G03X7480630Y520000I-1J125985D01* 22 | G01* 23 | Y1842835D1* 24 | G03X7354646Y1968819I-125985J-1D01* 25 | G01* 26 | X5551496D1* 27 | Y1417638D1* 28 | X787717D1* 29 | Y1968819D1* 30 | X520000D1* 31 | G03X394016Y1842835I1J-125985D01* 32 | G01* 33 | Y520000D1* 34 | G03X520000Y394016I125985J1D01* 35 | G01* 36 | G37* 37 | M02* 38 | -------------------------------------------------------------------------------- /pcb/logic-board/gerber/clock-logic-board.BoardOutline.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Bottom-Clock-IN12e.BoardOutline.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Profile* 5 | G04 #@! TF.Part,Single* 6 | %ADD11C,0.005512*% 7 | %FSLAX26Y26*% 8 | G04* 9 | G70* 10 | G90* 11 | G75* 12 | G01* 13 | G04 BoardOutline* 14 | %LPD*% 15 | X520000Y394016D2* 16 | D11* 17 | X5039685D1* 18 | Y748346D1* 19 | X5512126D1* 20 | Y394016D1* 21 | X7354646D1* 22 | G03X7480630Y520000I-1J125985D01* 23 | G01* 24 | Y1842835D1* 25 | G03X7354646Y1968819I-125985J-1D01* 26 | G01* 27 | X5551496D1* 28 | Y1417638D1* 29 | X787717D1* 30 | Y1968819D1* 31 | X520000D1* 32 | G03X394016Y1842835I1J-125985D01* 33 | G01* 34 | Y520000D1* 35 | G03X520000Y394016I125985J1D01* 36 | G01* 37 | M02* 38 | -------------------------------------------------------------------------------- /pcb/logic-board/gerber/clock-logic-board.BottomAssy.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Bottom-Clock-IN12e.BottomAssy.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Drawing,Bot* 5 | G04 #@! TF.Part,Single* 6 | %FSLAX26Y26*% 7 | G04* 8 | G70* 9 | G90* 10 | G75* 11 | G01* 12 | G04 BotAssy* 13 | %LPD*% 14 | M02* 15 | -------------------------------------------------------------------------------- /pcb/logic-board/gerber/clock-logic-board.BottomDimension.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Bottom-Clock-IN12e.BottomDimension.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Drawing,Bot* 5 | G04 #@! TF.Part,Single* 6 | %FSLAX26Y26*% 7 | G04* 8 | G70* 9 | G90* 10 | G75* 11 | G01* 12 | G04 BotDimension* 13 | %LPD*% 14 | M02* 15 | -------------------------------------------------------------------------------- /pcb/logic-board/gerber/clock-logic-board.BottomMask.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Bottom-Clock-IN12e.BottomMask.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Soldermask,Bot* 5 | G04 #@! TF.Part,Single* 6 | %ADD109C,0.145827*% 7 | %ADD111C,0.204882*% 8 | %ADD119C,0.082835*% 9 | %ADD121R,0.094646X0.094646*% 10 | %ADD123O,0.078031X0.068031*% 11 | %ADD125O,0.068031X0.078031*% 12 | %ADD127R,0.068031X0.073031*% 13 | %ADD129O,0.068031X0.078031*% 14 | %FSLAX26Y26*% 15 | G04* 16 | G70* 17 | G90* 18 | G75* 19 | G01* 20 | G04 BotMask* 21 | %LPD*% 22 | D129* 23 | X3828268Y1338898D3* 24 | X4228268D3* 25 | X4128268D3* 26 | X4028268D3* 27 | X3928268D3* 28 | D127* 29 | X3728268D3* 30 | D125* 31 | X4328268Y1337717D3* 32 | X4428268D3* 33 | X4828268Y1338898D3* 34 | X4728268D3* 35 | D123* 36 | X472756Y1531417D3* 37 | Y1631417D3* 38 | Y1331417D3* 39 | Y1431417D3* 40 | Y1131417D3* 41 | Y1031417D3* 42 | Y1231417D3* 43 | Y684567D3* 44 | Y484567D3* 45 | Y584567D3* 46 | D125* 47 | X2812520Y866457D3* 48 | X2712520D3* 49 | X5162126D3* 50 | X5062126D3* 51 | D123* 52 | X7401890Y1531417D3* 53 | Y1631417D3* 54 | Y1331417D3* 55 | Y1431417D3* 56 | Y1131417D3* 57 | Y1031417D3* 58 | Y1231417D3* 59 | Y684961D3* 60 | Y484567D3* 61 | Y584567D3* 62 | D121* 63 | X3010157Y870394D3* 64 | D119* 65 | X3797559D3* 66 | D125* 67 | X5028268Y1338898D3* 68 | X5128268D3* 69 | X4928268D3* 70 | D111* 71 | X520000Y1842835D3* 72 | Y846772D3* 73 | X7354646Y1842835D3* 74 | Y846772D3* 75 | D109* 76 | X2000315Y1082992D3* 77 | D125* 78 | X4528268Y1338898D3* 79 | X4628268D3* 80 | M02* 81 | -------------------------------------------------------------------------------- /pcb/logic-board/gerber/clock-logic-board.BottomPaste.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Bottom-Clock-IN12e.BottomPaste.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Paste,Bot* 5 | G04 #@! TF.Part,Single* 6 | %ADD110C,0.129764*% 7 | %ADD112C,0.188819*% 8 | %ADD120C,0.066772*% 9 | %ADD122R,0.078583X0.078583*% 10 | %ADD124O,0.061969X0.051969*% 11 | %ADD126O,0.051969X0.061969*% 12 | %ADD128R,0.051969X0.056969*% 13 | %ADD130O,0.051969X0.061969*% 14 | %FSLAX26Y26*% 15 | G04* 16 | G70* 17 | G90* 18 | G75* 19 | G01* 20 | G04 BotPaste* 21 | %LPD*% 22 | D130* 23 | X3828268Y1338898D3* 24 | X4228268D3* 25 | X4128268D3* 26 | X4028268D3* 27 | X3928268D3* 28 | D128* 29 | X3728268D3* 30 | D126* 31 | X4328268Y1337717D3* 32 | X4428268D3* 33 | X4828268Y1338898D3* 34 | X4728268D3* 35 | D124* 36 | X472756Y1531417D3* 37 | Y1631417D3* 38 | Y1331417D3* 39 | Y1431417D3* 40 | Y1131417D3* 41 | Y1031417D3* 42 | Y1231417D3* 43 | Y684567D3* 44 | Y484567D3* 45 | Y584567D3* 46 | D126* 47 | X2812520Y866457D3* 48 | X2712520D3* 49 | X5162126D3* 50 | X5062126D3* 51 | D124* 52 | X7401890Y1531417D3* 53 | Y1631417D3* 54 | Y1331417D3* 55 | Y1431417D3* 56 | Y1131417D3* 57 | Y1031417D3* 58 | Y1231417D3* 59 | Y684961D3* 60 | Y484567D3* 61 | Y584567D3* 62 | D122* 63 | X3010157Y870394D3* 64 | D120* 65 | X3797559D3* 66 | D126* 67 | X5028268Y1338898D3* 68 | X5128268D3* 69 | X4928268D3* 70 | D112* 71 | X520000Y1842835D3* 72 | Y846772D3* 73 | X7354646Y1842835D3* 74 | Y846772D3* 75 | D110* 76 | X2000315Y1082992D3* 77 | D126* 78 | X4528268Y1338898D3* 79 | X4628268D3* 80 | M02* 81 | -------------------------------------------------------------------------------- /pcb/logic-board/gerber/clock-logic-board.TopAssy.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Bottom-Clock-IN12e.TopAssy.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Drawing,Top* 5 | G04 #@! TF.Part,Single* 6 | %ADD10C,0.009843*% 7 | %FSLAX26Y26*% 8 | G04* 9 | G70* 10 | G90* 11 | G75* 12 | G01* 13 | G04 TopAssy* 14 | %LPD*% 15 | X1699959Y1670016D2* 16 | D10* 17 | X2408545D1* 18 | Y666050D1* 19 | X1699959D1* 20 | Y1670016D1* 21 | X3547544Y443425D2* 22 | X3248361D1* 23 | Y852874D1* 24 | X3547544D1* 25 | Y443425D1* 26 | M02* 27 | -------------------------------------------------------------------------------- /pcb/logic-board/gerber/clock-logic-board.TopDimension.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Bottom-Clock-IN12e.TopDimension.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Drawing,Top* 5 | G04 #@! TF.Part,Single* 6 | %ADD13C,0.001378*% 7 | %ADD152C,0.006176*% 8 | %FSLAX26Y26*% 9 | G04* 10 | G70* 11 | G90* 12 | G75* 13 | G01* 14 | G04 TopDimension* 15 | %LPD*% 16 | X7401890Y684961D2* 17 | D13* 18 | X7567244D1* 19 | X7401890Y584567D2* 20 | X7567244D1* 21 | X7547559Y634764D2* 22 | Y645591D1* 23 | G36* 24 | Y684961D2* 25 | X7555433Y645591D1* 26 | X7539685D1* 27 | X7547559Y684961D1* 28 | G37* 29 | Y634764D2* 30 | D13* 31 | Y623937D1* 32 | G36* 33 | Y584567D2* 34 | X7539685Y623937D1* 35 | X7555433D1* 36 | X7547559Y584567D1* 37 | G37* 38 | Y423912D2* 39 | D13* 40 | Y684961D1* 41 | X5039685Y748346D2* 42 | Y2445197D1* 43 | X394016Y1842835D2* 44 | Y2445197D1* 45 | X2716850Y2425512D2* 46 | X5000315D1* 47 | G36* 48 | X5039685D2* 49 | X5000315Y2417638D1* 50 | Y2433386D1* 51 | X5039685Y2425512D1* 52 | G37* 53 | X2716850D2* 54 | D13* 55 | X433386D1* 56 | G36* 57 | X394016D2* 58 | X433386Y2433386D1* 59 | Y2417638D1* 60 | X394016Y2425512D1* 61 | G37* 62 | X5039685Y394016D2* 63 | D13* 64 | Y138110D1* 65 | X5512126Y394016D2* 66 | Y138110D1* 67 | X5275906Y157795D2* 68 | X5079055D1* 69 | G36* 70 | X5039685D2* 71 | X5079055Y165669D1* 72 | Y149921D1* 73 | X5039685Y157795D1* 74 | G37* 75 | X5275906D2* 76 | D13* 77 | X5472756D1* 78 | G36* 79 | X5512126D2* 80 | X5472756Y149921D1* 81 | Y165669D1* 82 | X5512126Y157795D1* 83 | G37* 84 | X2712520Y866457D2* 85 | D13* 86 | Y216850D1* 87 | X394016Y512126D2* 88 | Y216850D1* 89 | X1553268Y236535D2* 90 | X2673150D1* 91 | G36* 92 | X2712520D2* 93 | X2673150Y228661D1* 94 | Y244409D1* 95 | X2712520Y236535D1* 96 | G37* 97 | X1553268D2* 98 | D13* 99 | X433386D1* 100 | G36* 101 | X394016D2* 102 | X433386Y244409D1* 103 | Y228661D1* 104 | X394016Y236535D1* 105 | G37* 106 | X5062126Y866457D2* 107 | D13* 108 | Y-137480D1* 109 | X7480630Y275906D2* 110 | Y-137480D1* 111 | X6271378Y-117795D2* 112 | X5101496D1* 113 | G36* 114 | X5062126D2* 115 | X5101496Y-109921D1* 116 | Y-125669D1* 117 | X5062126Y-117795D1* 118 | G37* 119 | X6271378D2* 120 | D13* 121 | X7441260D1* 122 | G36* 123 | X7480630D2* 124 | X7441260Y-125669D1* 125 | Y-109921D1* 126 | X7480630Y-117795D1* 127 | G37* 128 | X7590367Y533988D2* 129 | D152* 130 | X7592268D1* 131 | X7596115Y532087D1* 132 | X7598016Y530185D1* 133 | X7599918Y526339D1* 134 | Y518689D1* 135 | X7598016Y514887D1* 136 | X7596115Y512985D1* 137 | X7592268Y511040D1* 138 | X7588466D1* 139 | X7584619Y512985D1* 140 | X7578915Y516788D1* 141 | X7559770Y535933D1* 142 | Y509139D1* 143 | X7563617Y494886D2* 144 | X7561671Y496787D1* 145 | X7559770Y494886D1* 146 | X7561671Y492940D1* 147 | X7563617Y494886D1* 148 | X7599918Y457641D2* 149 | Y476742D1* 150 | X7582718Y478644D1* 151 | X7584619Y476742D1* 152 | X7586564Y470994D1* 153 | Y465290D1* 154 | X7584619Y459542D1* 155 | X7580816Y455696D1* 156 | X7575068Y453794D1* 157 | X7571266D1* 158 | X7565518Y455696D1* 159 | X7561671Y459542D1* 160 | X7559770Y465290D1* 161 | Y470994D1* 162 | X7561671Y476742D1* 163 | X7563617Y478644D1* 164 | X7567419Y480589D1* 165 | X7599918Y418495D2* 166 | Y437596D1* 167 | X7582718Y439498D1* 168 | X7584619Y437596D1* 169 | X7586564Y431848D1* 170 | Y426144D1* 171 | X7584619Y420396D1* 172 | X7580816Y416550D1* 173 | X7575068Y414648D1* 174 | X7571266D1* 175 | X7565518Y416550D1* 176 | X7561671Y420396D1* 177 | X7559770Y426144D1* 178 | Y431848D1* 179 | X7561671Y437596D1* 180 | X7563617Y439498D1* 181 | X7567419Y441443D1* 182 | X2684617Y2470221D2* 183 | X2688464Y2472167D1* 184 | X2694212Y2477870D1* 185 | Y2437723D1* 186 | X2706563Y2470221D2* 187 | X2710410Y2472167D1* 188 | X2716158Y2477870D1* 189 | Y2437723D1* 190 | X2738060Y2477870D2* 191 | X2732356Y2475969D1* 192 | X2730410Y2472167D1* 193 | Y2468320D1* 194 | X2732356Y2464517D1* 195 | X2736159Y2462572D1* 196 | X2743808Y2460670D1* 197 | X2749556Y2458769D1* 198 | X2753358Y2454922D1* 199 | X2755260Y2451120D1* 200 | Y2445372D1* 201 | X2753358Y2441569D1* 202 | X2751457Y2439624D1* 203 | X2745709Y2437723D1* 204 | X2738060D1* 205 | X2732356Y2439624D1* 206 | X2730410Y2441569D1* 207 | X2728509Y2445372D1* 208 | Y2451120D1* 209 | X2730410Y2454922D1* 210 | X2734257Y2458769D1* 211 | X2739961Y2460670D1* 212 | X2747610Y2462572D1* 213 | X2751457Y2464517D1* 214 | X2753358Y2468320D1* 215 | Y2472167D1* 216 | X2751457Y2475969D1* 217 | X2745709Y2477870D1* 218 | X2738060D1* 219 | X5254623Y202505D2* 220 | X5258470Y204450D1* 221 | X5264218Y210154D1* 222 | Y170006D1* 223 | X5278515Y200603D2* 224 | Y202505D1* 225 | X5280416Y206351D1* 226 | X5282317Y208253D1* 227 | X5286164Y210154D1* 228 | X5293813D1* 229 | X5297616Y208253D1* 230 | X5299517Y206351D1* 231 | X5301463Y202505D1* 232 | Y198702D1* 233 | X5299517Y194855D1* 234 | X5295714Y189151D1* 235 | X5276569Y170006D1* 236 | X5303364D1* 237 | X1500083Y288894D2* 238 | X1480982D1* 239 | X1479080Y271694D1* 240 | X1480982Y273595D1* 241 | X1486730Y275541D1* 242 | X1492434D1* 243 | X1498182Y273595D1* 244 | X1502028Y269793D1* 245 | X1503930Y264045D1* 246 | Y260242D1* 247 | X1502028Y254494D1* 248 | X1498182Y250647D1* 249 | X1492434Y248746D1* 250 | X1486730D1* 251 | X1480982Y250647D1* 252 | X1479080Y252593D1* 253 | X1477135Y256395D1* 254 | X1525832Y288894D2* 255 | X1520128Y286993D1* 256 | X1518182Y283190D1* 257 | Y279343D1* 258 | X1520128Y275541D1* 259 | X1523930Y273595D1* 260 | X1531580Y271694D1* 261 | X1537328Y269793D1* 262 | X1541130Y265946D1* 263 | X1543031Y262144D1* 264 | Y256395D1* 265 | X1541130Y252593D1* 266 | X1539229Y250647D1* 267 | X1533481Y248746D1* 268 | X1525832D1* 269 | X1520128Y250647D1* 270 | X1518182Y252593D1* 271 | X1516281Y256395D1* 272 | Y262144D1* 273 | X1518182Y265946D1* 274 | X1522029Y269793D1* 275 | X1527733Y271694D1* 276 | X1535382Y273595D1* 277 | X1539229Y275541D1* 278 | X1541130Y279343D1* 279 | Y283190D1* 280 | X1539229Y286993D1* 281 | X1533481Y288894D1* 282 | X1525832D1* 283 | X1557284Y252593D2* 284 | X1555383Y250647D1* 285 | X1557284Y248746D1* 286 | X1559230Y250647D1* 287 | X1557284Y252593D1* 288 | X1581132Y288894D2* 289 | X1575428Y286993D1* 290 | X1573482Y283190D1* 291 | Y279343D1* 292 | X1575428Y275541D1* 293 | X1579230Y273595D1* 294 | X1586880Y271694D1* 295 | X1592628Y269793D1* 296 | X1596430Y265946D1* 297 | X1598331Y262144D1* 298 | Y256395D1* 299 | X1596430Y252593D1* 300 | X1594529Y250647D1* 301 | X1588781Y248746D1* 302 | X1581132D1* 303 | X1575428Y250647D1* 304 | X1573482Y252593D1* 305 | X1571581Y256395D1* 306 | Y262144D1* 307 | X1573482Y265946D1* 308 | X1577329Y269793D1* 309 | X1583033Y271694D1* 310 | X1590682Y273595D1* 311 | X1594529Y275541D1* 312 | X1596430Y279343D1* 313 | Y283190D1* 314 | X1594529Y286993D1* 315 | X1588781Y288894D1* 316 | X1581132D1* 317 | X1635576Y275541D2* 318 | X1633631Y269793D1* 319 | X1629828Y265946D1* 320 | X1624080Y264045D1* 321 | X1622179D1* 322 | X1616431Y265946D1* 323 | X1612628Y269793D1* 324 | X1610683Y275541D1* 325 | Y277442D1* 326 | X1612628Y283190D1* 327 | X1616431Y286993D1* 328 | X1622179Y288894D1* 329 | X1624080D1* 330 | X1629828Y286993D1* 331 | X1633631Y283190D1* 332 | X1635576Y275541D1* 333 | Y265946D1* 334 | X1633631Y256395D1* 335 | X1629828Y250647D1* 336 | X1624080Y248746D1* 337 | X1620278D1* 338 | X1614530Y250647D1* 339 | X1612628Y254494D1* 340 | X6225820Y-71141D2* 341 | X6223919Y-67338D1* 342 | X6218171Y-65437D1* 343 | X6214368D1* 344 | X6208620Y-67338D1* 345 | X6204774Y-73086D1* 346 | X6202872Y-82637D1* 347 | Y-92187D1* 348 | X6204774Y-99836D1* 349 | X6208620Y-103683D1* 350 | X6214368Y-105585D1* 351 | X6216270D1* 352 | X6221973Y-103683D1* 353 | X6225820Y-99836D1* 354 | X6227722Y-94088D1* 355 | Y-92187D1* 356 | X6225820Y-86439D1* 357 | X6221973Y-82637D1* 358 | X6216270Y-80735D1* 359 | X6214368D1* 360 | X6208620Y-82637D1* 361 | X6204774Y-86439D1* 362 | X6202872Y-92187D1* 363 | X6240073Y-73086D2* 364 | X6243920Y-71141D1* 365 | X6249668Y-65437D1* 366 | Y-105585D1* 367 | X6263920Y-101738D2* 368 | X6262019Y-103683D1* 369 | X6263920Y-105585D1* 370 | X6265866Y-103683D1* 371 | X6263920Y-101738D1* 372 | X6297363Y-105585D2* 373 | Y-65437D1* 374 | X6278217Y-92187D1* 375 | X6306913D1* 376 | X6323111Y-65437D2* 377 | X6344114D1* 378 | X6332662Y-80735D1* 379 | X6338410D1* 380 | X6342213Y-82637D1* 381 | X6344114Y-84538D1* 382 | X6346059Y-90286D1* 383 | Y-94088D1* 384 | X6344114Y-99836D1* 385 | X6340311Y-103683D1* 386 | X6334563Y-105585D1* 387 | X6328815D1* 388 | X6323111Y-103683D1* 389 | X6321210Y-101738D1* 390 | X6319265Y-97935D1* 391 | M02* 392 | -------------------------------------------------------------------------------- /pcb/logic-board/gerber/clock-logic-board.TopMask.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Bottom-Clock-IN12e.TopMask.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Soldermask,Top* 5 | G04 #@! TF.Part,Single* 6 | %ADD81R,0.067087X0.086772*% 7 | %ADD83R,0.06315X0.019843*% 8 | %ADD85R,0.037559X0.02378*% 9 | %ADD87R,0.092677X0.135984*% 10 | %ADD89R,0.092677X0.045433*% 11 | %ADD91R,0.086772X0.031654*% 12 | %ADD93R,0.204882X0.204882*% 13 | %ADD95R,0.039528X0.086772*% 14 | %ADD97R,0.086772X0.039528*% 15 | %ADD99R,0.047402X0.074961*% 16 | %ADD101R,0.071024X0.071024*% 17 | %ADD103R,0.051339X0.071024*% 18 | %ADD105R,0.055276X0.071024*% 19 | %ADD107R,0.04937X0.033622*% 20 | %ADD109C,0.145827*% 21 | %ADD111C,0.204882*% 22 | %ADD113R,0.26X0.236378*% 23 | %ADD115R,0.094646X0.055276*% 24 | %ADD117R,0.078898X0.145827*% 25 | %ADD119C,0.082835*% 26 | %ADD121R,0.094646X0.094646*% 27 | %ADD123O,0.078031X0.068031*% 28 | %ADD125O,0.068031X0.078031*% 29 | %ADD127R,0.068031X0.073031*% 30 | %ADD129O,0.068031X0.078031*% 31 | %ADD131R,0.078898X0.10252*% 32 | %ADD133R,0.055276X0.047402*% 33 | %ADD135R,0.047402X0.057244*% 34 | %ADD137R,0.145827X0.055276*% 35 | %ADD139R,0.047402X0.051339*% 36 | %ADD141R,0.051339X0.047402*% 37 | %ADD143R,0.071024X0.055276*% 38 | %ADD145R,0.051339X0.059213*% 39 | %ADD147R,0.039528X0.039528*% 40 | %ADD149R,0.059213X0.051339*% 41 | %FSLAX26Y26*% 42 | G04* 43 | G70* 44 | G90* 45 | G75* 46 | G01* 47 | G04 TopMask* 48 | %LPD*% 49 | D149* 50 | X1421575Y1256220D3* 51 | Y1331024D3* 52 | X1492441Y1256220D3* 53 | Y1331024D3* 54 | D147* 55 | X1555433Y1268031D3* 56 | Y1327087D3* 57 | X3803465Y523937D3* 58 | X3744409D3* 59 | X1421575Y1102677D3* 60 | X1480630D3* 61 | X1441260Y933386D3* 62 | Y874331D3* 63 | X3488504Y1362520D3* 64 | X3547559D3* 65 | X3228661D3* 66 | X3287717D3* 67 | D145* 68 | X4551496Y988504D3* 69 | X4626299D3* 70 | D149* 71 | X4291654Y712913D3* 72 | Y787717D3* 73 | D147* 74 | X1071181Y1059370D3* 75 | Y1118425D3* 76 | D145* 77 | X4551496Y1059370D3* 78 | X4626299D3* 79 | D147* 80 | X929449Y1118425D3* 81 | Y1177480D3* 82 | D143* 83 | X5909764Y1098740D3* 84 | Y988504D3* 85 | X6004252Y1098740D3* 86 | Y988504D3* 87 | X6098740Y1098740D3* 88 | Y988504D3* 89 | X6193228Y1098740D3* 90 | Y988504D3* 91 | D141* 92 | X5795591Y673543D3* 93 | X5862520D3* 94 | X5795591Y838898D3* 95 | X5862520D3* 96 | X5795591Y783780D3* 97 | X5862520D3* 98 | D139* 99 | X6271969Y539685D3* 100 | Y606614D3* 101 | D147* 102 | X6358583Y708976D3* 103 | X6299528D3* 104 | D137* 105 | X6063307Y1736535D3* 106 | Y1909764D3* 107 | X6236535Y1736535D3* 108 | Y1909764D3* 109 | D135* 110 | X5256220Y1342835D3* 111 | X5334961D3* 112 | X5445197D3* 113 | X5523937D3* 114 | D133* 115 | X7102677Y1240472D3* 116 | Y1374331D3* 117 | D131* 118 | Y1075118D3* 119 | Y917643D3* 120 | X6429449Y1894016D3* 121 | Y1736541D3* 122 | D129* 123 | X3828268Y1338898D3* 124 | X4228268D3* 125 | X4128268D3* 126 | X4028268D3* 127 | X3928268D3* 128 | D127* 129 | X3728268D3* 130 | D125* 131 | X4328268Y1337717D3* 132 | X4428268D3* 133 | X4828268Y1338898D3* 134 | X4728268D3* 135 | D123* 136 | X472756Y1531417D3* 137 | Y1631417D3* 138 | Y1331417D3* 139 | Y1431417D3* 140 | Y1131417D3* 141 | Y1031417D3* 142 | Y1231417D3* 143 | Y684567D3* 144 | Y484567D3* 145 | Y584567D3* 146 | D125* 147 | X2812520Y866457D3* 148 | X2712520D3* 149 | X5162126D3* 150 | X5062126D3* 151 | D123* 152 | X7401890Y1531417D3* 153 | Y1631417D3* 154 | Y1331417D3* 155 | Y1431417D3* 156 | Y1131417D3* 157 | Y1031417D3* 158 | Y1231417D3* 159 | Y684961D3* 160 | Y484567D3* 161 | Y584567D3* 162 | D121* 163 | X3010157Y870394D3* 164 | D119* 165 | X3797559D3* 166 | D125* 167 | X5028268Y1338898D3* 168 | X5128268D3* 169 | X4928268D3* 170 | D117* 171 | X6433386Y811339D3* 172 | X6531811D3* 173 | X6630236D3* 174 | X6728661D3* 175 | X6827087D3* 176 | X6925512D3* 177 | Y1610551D3* 178 | X6827087D3* 179 | X6728661D3* 180 | X6630236D3* 181 | X6527874D3* 182 | X6429449D3* 183 | D115* 184 | X6480630Y657795D3* 185 | D113* 186 | X6728661Y567244D3* 187 | D115* 188 | X6480630Y476693D3* 189 | D111* 190 | X520000Y1842835D3* 191 | Y846772D3* 192 | X7354646Y1842835D3* 193 | Y846772D3* 194 | D109* 195 | X2000315Y1082992D3* 196 | D107* 197 | X2905827Y1094803D3* 198 | Y1020000D3* 199 | X2996378Y1057402D3* 200 | X2909764Y1283780D3* 201 | Y1208976D3* 202 | X3000315Y1246378D3* 203 | D147* 204 | X3803465Y626299D3* 205 | X3744409D3* 206 | X2976693Y551496D3* 207 | X3035748D3* 208 | X2976693Y500315D3* 209 | X3035748D3* 210 | X3803465Y575118D3* 211 | X3744409D3* 212 | X3803465Y472756D3* 213 | X3744409D3* 214 | X1421575Y1153858D3* 215 | X1480630D3* 216 | X1504252Y933386D3* 217 | Y874331D3* 218 | X2823150Y1094803D3* 219 | X2764094D3* 220 | X2823150Y1283780D3* 221 | X2764094D3* 222 | X5256220Y1268031D3* 223 | Y1208976D3* 224 | X5445197Y1268031D3* 225 | Y1208976D3* 226 | X1086929Y1311339D3* 227 | X1027874D3* 228 | X4827087Y1205039D3* 229 | Y1145984D3* 230 | D141* 231 | X5795591Y618425D3* 232 | X5862520D3* 233 | X6126299Y870394D3* 234 | X6193228D3* 235 | D139* 236 | X5933386Y775906D3* 237 | Y842835D3* 238 | X6390079Y606614D3* 239 | Y539685D3* 240 | D105* 241 | X6275906Y468819D3* 242 | X6386142D3* 243 | X5819213Y1894016D3* 244 | X5929449D3* 245 | D139* 246 | X5819213Y1728661D3* 247 | Y1795591D3* 248 | D141* 249 | X5795591Y728661D3* 250 | X5862520D3* 251 | D103* 252 | X5819213Y1488504D3* 253 | D101* 254 | X5773937Y1602677D3* 255 | D103* 256 | X5728661Y1488504D3* 257 | D99* 258 | X3441260Y1271969D3* 259 | Y1023937D3* 260 | X3590866D3* 261 | Y1271969D3* 262 | X3181417D3* 263 | Y1023937D3* 264 | X3331024D3* 265 | Y1271969D3* 266 | D125* 267 | X4528268Y1338898D3* 268 | X4628268D3* 269 | D97* 270 | X1715669Y1378268D3* 271 | Y1328268D3* 272 | Y1278268D3* 273 | Y1228268D3* 274 | Y1178268D3* 275 | Y1128268D3* 276 | Y1078268D3* 277 | Y1028268D3* 278 | Y978268D3* 279 | Y928268D3* 280 | Y878268D3* 281 | Y828268D3* 282 | Y778268D3* 283 | Y728268D3* 284 | D95* 285 | X1829449Y683780D3* 286 | X1879449D3* 287 | X1929449D3* 288 | X1979449D3* 289 | X2029449D3* 290 | X2079449D3* 291 | X2129449D3* 292 | X2179449D3* 293 | X2229449D3* 294 | X2279449D3* 295 | D97* 296 | X2392835Y728268D3* 297 | Y778268D3* 298 | Y828268D3* 299 | Y878268D3* 300 | Y928268D3* 301 | Y978268D3* 302 | Y1028268D3* 303 | Y1078268D3* 304 | Y1128268D3* 305 | Y1178268D3* 306 | Y1228268D3* 307 | Y1278268D3* 308 | Y1328268D3* 309 | Y1378268D3* 310 | D93* 311 | X2010945Y1081417D3* 312 | D91* 313 | X3582992Y473150D3* 314 | Y523150D3* 315 | Y573150D3* 316 | Y623150D3* 317 | Y673150D3* 318 | Y723150D3* 319 | Y773150D3* 320 | Y823150D3* 321 | X3212913D3* 322 | Y773150D3* 323 | Y723150D3* 324 | Y673150D3* 325 | Y623150D3* 326 | Y573150D3* 327 | Y523150D3* 328 | Y473150D3* 329 | D89* 330 | X4638110Y705039D3* 331 | Y795591D3* 332 | Y886142D3* 333 | D87* 334 | X4409764Y795591D3* 335 | D85* 336 | X1071181Y1181417D3* 337 | Y1207008D3* 338 | Y1232598D3* 339 | X988504Y1181417D3* 340 | Y1232598D3* 341 | Y1207008D3* 342 | D83* 343 | X6023937Y716850D3* 344 | Y697165D3* 345 | Y677480D3* 346 | Y657795D3* 347 | Y638110D3* 348 | X6197165D3* 349 | Y657795D3* 350 | Y677480D3* 351 | Y697165D3* 352 | Y716850D3* 353 | D81* 354 | X6110551Y677480D3* 355 | M02* 356 | -------------------------------------------------------------------------------- /pcb/logic-board/gerber/clock-logic-board.TopPaste.gbr: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.1.0.1* 2 | G04 Bottom-Clock-IN12e.TopPaste.gbr* 3 | %MOIN*% 4 | G04 #@! TF.FileFunction,Paste,Top* 5 | G04 #@! TF.Part,Single* 6 | %ADD82R,0.051024X0.070709*% 7 | %ADD84R,0.047087X0.00378*% 8 | %ADD86R,0.021496X0.007717*% 9 | %ADD88R,0.076614X0.119921*% 10 | %ADD90R,0.076614X0.02937*% 11 | %ADD92R,0.070709X0.015591*% 12 | %ADD94R,0.188819X0.188819*% 13 | %ADD96R,0.023465X0.070709*% 14 | %ADD98R,0.070709X0.023465*% 15 | %ADD100R,0.031339X0.058898*% 16 | %ADD102R,0.054961X0.054961*% 17 | %ADD104R,0.035276X0.054961*% 18 | %ADD106R,0.039213X0.054961*% 19 | %ADD108R,0.033307X0.017559*% 20 | %ADD110C,0.129764*% 21 | %ADD112C,0.188819*% 22 | %ADD114R,0.243937X0.220315*% 23 | %ADD116R,0.078583X0.039213*% 24 | %ADD118R,0.062835X0.129764*% 25 | %ADD120C,0.066772*% 26 | %ADD122R,0.078583X0.078583*% 27 | %ADD124O,0.061969X0.051969*% 28 | %ADD126O,0.051969X0.061969*% 29 | %ADD128R,0.051969X0.056969*% 30 | %ADD130O,0.051969X0.061969*% 31 | %ADD132R,0.062835X0.086457*% 32 | %ADD134R,0.039213X0.031339*% 33 | %ADD136R,0.031339X0.041181*% 34 | %ADD138R,0.129764X0.039213*% 35 | %ADD140R,0.031339X0.035276*% 36 | %ADD142R,0.035276X0.031339*% 37 | %ADD144R,0.054961X0.039213*% 38 | %ADD146R,0.035276X0.04315*% 39 | %ADD148R,0.023465X0.023465*% 40 | %ADD150R,0.04315X0.035276*% 41 | %FSLAX26Y26*% 42 | G04* 43 | G70* 44 | G90* 45 | G75* 46 | G01* 47 | G04 TopPaste* 48 | %LPD*% 49 | D150* 50 | X1421575Y1256220D3* 51 | Y1331024D3* 52 | X1492441Y1256220D3* 53 | Y1331024D3* 54 | D148* 55 | X1555433Y1268031D3* 56 | Y1327087D3* 57 | X3803465Y523937D3* 58 | X3744409D3* 59 | X1421575Y1102677D3* 60 | X1480630D3* 61 | X1441260Y933386D3* 62 | Y874331D3* 63 | X3488504Y1362520D3* 64 | X3547559D3* 65 | X3228661D3* 66 | X3287717D3* 67 | D146* 68 | X4551496Y988504D3* 69 | X4626299D3* 70 | D150* 71 | X4291654Y712913D3* 72 | Y787717D3* 73 | D148* 74 | X1071181Y1059370D3* 75 | Y1118425D3* 76 | D146* 77 | X4551496Y1059370D3* 78 | X4626299D3* 79 | D148* 80 | X929449Y1118425D3* 81 | Y1177480D3* 82 | D144* 83 | X5909764Y1098740D3* 84 | Y988504D3* 85 | X6004252Y1098740D3* 86 | Y988504D3* 87 | X6098740Y1098740D3* 88 | Y988504D3* 89 | X6193228Y1098740D3* 90 | Y988504D3* 91 | D142* 92 | X5795591Y673543D3* 93 | X5862520D3* 94 | X5795591Y838898D3* 95 | X5862520D3* 96 | X5795591Y783780D3* 97 | X5862520D3* 98 | D140* 99 | X6271969Y539685D3* 100 | Y606614D3* 101 | D148* 102 | X6358583Y708976D3* 103 | X6299528D3* 104 | D138* 105 | X6063307Y1736535D3* 106 | Y1909764D3* 107 | X6236535Y1736535D3* 108 | Y1909764D3* 109 | D136* 110 | X5256220Y1342835D3* 111 | X5334961D3* 112 | X5445197D3* 113 | X5523937D3* 114 | D134* 115 | X7102677Y1240472D3* 116 | Y1374331D3* 117 | D132* 118 | Y1075118D3* 119 | Y917643D3* 120 | X6429449Y1894016D3* 121 | Y1736541D3* 122 | D130* 123 | X3828268Y1338898D3* 124 | X4228268D3* 125 | X4128268D3* 126 | X4028268D3* 127 | X3928268D3* 128 | D128* 129 | X3728268D3* 130 | D126* 131 | X4328268Y1337717D3* 132 | X4428268D3* 133 | X4828268Y1338898D3* 134 | X4728268D3* 135 | D124* 136 | X472756Y1531417D3* 137 | Y1631417D3* 138 | Y1331417D3* 139 | Y1431417D3* 140 | Y1131417D3* 141 | Y1031417D3* 142 | Y1231417D3* 143 | Y684567D3* 144 | Y484567D3* 145 | Y584567D3* 146 | D126* 147 | X2812520Y866457D3* 148 | X2712520D3* 149 | X5162126D3* 150 | X5062126D3* 151 | D124* 152 | X7401890Y1531417D3* 153 | Y1631417D3* 154 | Y1331417D3* 155 | Y1431417D3* 156 | Y1131417D3* 157 | Y1031417D3* 158 | Y1231417D3* 159 | Y684961D3* 160 | Y484567D3* 161 | Y584567D3* 162 | D122* 163 | X3010157Y870394D3* 164 | D120* 165 | X3797559D3* 166 | D126* 167 | X5028268Y1338898D3* 168 | X5128268D3* 169 | X4928268D3* 170 | D118* 171 | X6433386Y811339D3* 172 | X6531811D3* 173 | X6630236D3* 174 | X6728661D3* 175 | X6827087D3* 176 | X6925512D3* 177 | Y1610551D3* 178 | X6827087D3* 179 | X6728661D3* 180 | X6630236D3* 181 | X6527874D3* 182 | X6429449D3* 183 | D116* 184 | X6480630Y657795D3* 185 | D114* 186 | X6728661Y567244D3* 187 | D116* 188 | X6480630Y476693D3* 189 | D112* 190 | X520000Y1842835D3* 191 | Y846772D3* 192 | X7354646Y1842835D3* 193 | Y846772D3* 194 | D110* 195 | X2000315Y1082992D3* 196 | D108* 197 | X2905827Y1094803D3* 198 | Y1020000D3* 199 | X2996378Y1057402D3* 200 | X2909764Y1283780D3* 201 | Y1208976D3* 202 | X3000315Y1246378D3* 203 | D148* 204 | X3803465Y626299D3* 205 | X3744409D3* 206 | X2976693Y551496D3* 207 | X3035748D3* 208 | X2976693Y500315D3* 209 | X3035748D3* 210 | X3803465Y575118D3* 211 | X3744409D3* 212 | X3803465Y472756D3* 213 | X3744409D3* 214 | X1421575Y1153858D3* 215 | X1480630D3* 216 | X1504252Y933386D3* 217 | Y874331D3* 218 | X2823150Y1094803D3* 219 | X2764094D3* 220 | X2823150Y1283780D3* 221 | X2764094D3* 222 | X5256220Y1268031D3* 223 | Y1208976D3* 224 | X5445197Y1268031D3* 225 | Y1208976D3* 226 | X1086929Y1311339D3* 227 | X1027874D3* 228 | X4827087Y1205039D3* 229 | Y1145984D3* 230 | D142* 231 | X5795591Y618425D3* 232 | X5862520D3* 233 | X6126299Y870394D3* 234 | X6193228D3* 235 | D140* 236 | X5933386Y775906D3* 237 | Y842835D3* 238 | X6390079Y606614D3* 239 | Y539685D3* 240 | D106* 241 | X6275906Y468819D3* 242 | X6386142D3* 243 | X5819213Y1894016D3* 244 | X5929449D3* 245 | D140* 246 | X5819213Y1728661D3* 247 | Y1795591D3* 248 | D142* 249 | X5795591Y728661D3* 250 | X5862520D3* 251 | D104* 252 | X5819213Y1488504D3* 253 | D102* 254 | X5773937Y1602677D3* 255 | D104* 256 | X5728661Y1488504D3* 257 | D100* 258 | X3441260Y1271969D3* 259 | Y1023937D3* 260 | X3590866D3* 261 | Y1271969D3* 262 | X3181417D3* 263 | Y1023937D3* 264 | X3331024D3* 265 | Y1271969D3* 266 | D126* 267 | X4528268Y1338898D3* 268 | X4628268D3* 269 | D98* 270 | X1715669Y1378268D3* 271 | Y1328268D3* 272 | Y1278268D3* 273 | Y1228268D3* 274 | Y1178268D3* 275 | Y1128268D3* 276 | Y1078268D3* 277 | Y1028268D3* 278 | Y978268D3* 279 | Y928268D3* 280 | Y878268D3* 281 | Y828268D3* 282 | Y778268D3* 283 | Y728268D3* 284 | D96* 285 | X1829449Y683780D3* 286 | X1879449D3* 287 | X1929449D3* 288 | X1979449D3* 289 | X2029449D3* 290 | X2079449D3* 291 | X2129449D3* 292 | X2179449D3* 293 | X2229449D3* 294 | X2279449D3* 295 | D98* 296 | X2392835Y728268D3* 297 | Y778268D3* 298 | Y828268D3* 299 | Y878268D3* 300 | Y928268D3* 301 | Y978268D3* 302 | Y1028268D3* 303 | Y1078268D3* 304 | Y1128268D3* 305 | Y1178268D3* 306 | Y1228268D3* 307 | Y1278268D3* 308 | Y1328268D3* 309 | Y1378268D3* 310 | D94* 311 | X2010945Y1081417D3* 312 | D92* 313 | X3582992Y473150D3* 314 | Y523150D3* 315 | Y573150D3* 316 | Y623150D3* 317 | Y673150D3* 318 | Y723150D3* 319 | Y773150D3* 320 | Y823150D3* 321 | X3212913D3* 322 | Y773150D3* 323 | Y723150D3* 324 | Y673150D3* 325 | Y623150D3* 326 | Y573150D3* 327 | Y523150D3* 328 | Y473150D3* 329 | D90* 330 | X4638110Y705039D3* 331 | Y795591D3* 332 | Y886142D3* 333 | D88* 334 | X4409764Y795591D3* 335 | D86* 336 | X1071181Y1181417D3* 337 | Y1207008D3* 338 | Y1232598D3* 339 | X988504Y1181417D3* 340 | Y1232598D3* 341 | Y1207008D3* 342 | D84* 343 | X6023937Y716850D3* 344 | Y697165D3* 345 | Y677480D3* 346 | Y657795D3* 347 | Y638110D3* 348 | X6197165D3* 349 | Y657795D3* 350 | Y677480D3* 351 | Y697165D3* 352 | Y716850D3* 353 | D82* 354 | X6110551Y677480D3* 355 | M02* 356 | -------------------------------------------------------------------------------- /pictures/clock-face-assembled-1024.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pictures/clock-face-assembled-1024.jpg -------------------------------------------------------------------------------- /pictures/face-clock-wip.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pictures/face-clock-wip.jpg -------------------------------------------------------------------------------- /pictures/logic-board-assembled-1024.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pictures/logic-board-assembled-1024.jpg -------------------------------------------------------------------------------- /pictures/nixie-clock-coffee-table-1024.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pictures/nixie-clock-coffee-table-1024.jpg -------------------------------------------------------------------------------- /pictures/nixie-clock-front-1024.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pictures/nixie-clock-front-1024.jpg -------------------------------------------------------------------------------- /pictures/webapp-screenshot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pictures/webapp-screenshot-1.png -------------------------------------------------------------------------------- /pictures/webapp-screenshot-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pictures/webapp-screenshot-2.png -------------------------------------------------------------------------------- /pictures/webapp-screenshot-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pictures/webapp-screenshot-3.png -------------------------------------------------------------------------------- /pictures/webapp-screenshot-small-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pictures/webapp-screenshot-small-1.png -------------------------------------------------------------------------------- /pictures/webapp-screenshot-small-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pictures/webapp-screenshot-small-2.png -------------------------------------------------------------------------------- /pictures/webapp-screenshot-small-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/pictures/webapp-screenshot-small-3.png -------------------------------------------------------------------------------- /schematics/clock-face/clock-face-schematics-sheet-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/schematics/clock-face/clock-face-schematics-sheet-1.png -------------------------------------------------------------------------------- /schematics/clock-face/clock-face-schematics-sheet-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/schematics/clock-face/clock-face-schematics-sheet-2.png -------------------------------------------------------------------------------- /schematics/clock-face/clock-face-schematics-sheet-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/schematics/clock-face/clock-face-schematics-sheet-3.png -------------------------------------------------------------------------------- /schematics/clock-face/clock-face-schematics-sheet-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/schematics/clock-face/clock-face-schematics-sheet-4.png -------------------------------------------------------------------------------- /schematics/clock-face/clock-face-schematics.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/schematics/clock-face/clock-face-schematics.pdf -------------------------------------------------------------------------------- /schematics/logic-board/Nixie-Clock-Logic-Board-revB.dch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/schematics/logic-board/Nixie-Clock-Logic-Board-revB.dch -------------------------------------------------------------------------------- /schematics/logic-board/logic-board-schematics-sheet-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/schematics/logic-board/logic-board-schematics-sheet-1.png -------------------------------------------------------------------------------- /schematics/logic-board/logic-board-schematics-sheet-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/schematics/logic-board/logic-board-schematics-sheet-2.png -------------------------------------------------------------------------------- /schematics/logic-board/logic-board-schematics-sheet-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/schematics/logic-board/logic-board-schematics-sheet-3.png -------------------------------------------------------------------------------- /schematics/logic-board/logic-board-schematics-sheet-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/schematics/logic-board/logic-board-schematics-sheet-4.png -------------------------------------------------------------------------------- /schematics/logic-board/logic-board-schematics.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tonyp7/esp32-nixie-clock/7e670292a4909e7651a57cdcddf3f031d3a4b3fa/schematics/logic-board/logic-board-schematics.pdf --------------------------------------------------------------------------------