├── .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 | 
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 | 
49 |
50 | ### The clock face PCB
51 | 
52 |
53 | ### The logic board PCB
54 | 
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 |
19 |
20 |
Current Timezone is:
21 |
26 |
27 |
28 |
29 |
30 | Backlight Color
31 |
32 |
33 |
34 |
35 |
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 |
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 | 
4 |
5 | # logic-board
6 |
7 | 
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
--------------------------------------------------------------------------------