Nixie Clock Start
This commit is contained in:
commit
4592cc07b8
14
Available pins.txt
Normal file
14
Available pins.txt
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
12
|
||||||
|
8
|
||||||
|
9
|
||||||
|
4
|
||||||
|
3
|
||||||
|
|
||||||
|
13 - May not be available due to LED
|
||||||
|
|
||||||
|
A4
|
||||||
|
A5
|
||||||
|
A0
|
||||||
|
A1
|
||||||
|
A2
|
||||||
|
A3
|
191
LaenPCBOrder.cam
Normal file
191
LaenPCBOrder.cam
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
[CAM Processor Job]
|
||||||
|
Description[en]="<b>Generates Extended Gerber Format</b><p>\nThis CAM job consists of five sections that generate data for a two layer board.<p><p>\nYou will get five gerber files that contain data for:<br>\ncomponent side *.cmp<br>\nsolder side *.sol<br>\nsilkscreen component side *.plc<br>\nsolder stop component side *.stc<br>\nsolder stop solder sid *.sts<br>"
|
||||||
|
Section=Sec_1
|
||||||
|
Section=Sec_2
|
||||||
|
Section=Sec_3
|
||||||
|
Section=Sec_4
|
||||||
|
Section=Sec_5
|
||||||
|
Section=Sec_6
|
||||||
|
Section=Sec_7
|
||||||
|
Section=Sec_8
|
||||||
|
Section=Sec_9
|
||||||
|
|
||||||
|
[Sec_1]
|
||||||
|
Name[C]="Cream"
|
||||||
|
Name[en]="Cream"
|
||||||
|
Prompt[C]=""
|
||||||
|
Prompt[en]=""
|
||||||
|
Device="GERBER_RS274X"
|
||||||
|
Wheel=".whl"
|
||||||
|
Rack=""
|
||||||
|
Scale=1
|
||||||
|
Output=".tcream.ger"
|
||||||
|
Flags="0 0 0 1 0 1 1"
|
||||||
|
Emulate="0 0 0"
|
||||||
|
Offset="0.0mil 0.0mil"
|
||||||
|
Sheet=1
|
||||||
|
Tolerance="0 0 0 0 0 0"
|
||||||
|
Pen="0.0mil 0"
|
||||||
|
Page="12000.0mil 8000.0mil"
|
||||||
|
Layers=" 31"
|
||||||
|
Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
|
||||||
|
|
||||||
|
[Sec_2]
|
||||||
|
Name[C]="Component side"
|
||||||
|
Name[en]="Top Layer"
|
||||||
|
Prompt[C]=""
|
||||||
|
Prompt[en]=""
|
||||||
|
Device="GERBER_RS274X"
|
||||||
|
Wheel=".whl"
|
||||||
|
Rack=""
|
||||||
|
Scale=1
|
||||||
|
Output=".toplayer.ger"
|
||||||
|
Flags="0 0 0 1 0 1 1"
|
||||||
|
Emulate="0 0 0"
|
||||||
|
Offset="0.0mil 0.0mil"
|
||||||
|
Sheet=1
|
||||||
|
Tolerance="0 0 0 0 0 0"
|
||||||
|
Pen="0.0mil 0"
|
||||||
|
Page="12000.0mil 8000.0mil"
|
||||||
|
Layers=" 1 17 18"
|
||||||
|
Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
|
||||||
|
|
||||||
|
[Sec_3]
|
||||||
|
Name[C]="Solder side"
|
||||||
|
Name[en]="Bottom Layer"
|
||||||
|
Prompt[C]=""
|
||||||
|
Prompt[en]=""
|
||||||
|
Device="GERBER_RS274X"
|
||||||
|
Wheel=".whl"
|
||||||
|
Rack=""
|
||||||
|
Scale=1
|
||||||
|
Output=".bottomlayer.ger"
|
||||||
|
Flags="0 0 0 1 0 1 1"
|
||||||
|
Emulate="0 0 0"
|
||||||
|
Offset="0.0mil 0.0mil"
|
||||||
|
Sheet=1
|
||||||
|
Tolerance="0 0 0 0 0 0"
|
||||||
|
Pen="0.0mil 0"
|
||||||
|
Page="12000.0mil 8000.0mil"
|
||||||
|
Layers=" 16 17 18"
|
||||||
|
Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
|
||||||
|
|
||||||
|
[Sec_4]
|
||||||
|
Name[C]="Silk screen CMP"
|
||||||
|
Name[en]="Top Silk Screen"
|
||||||
|
Prompt[C]=""
|
||||||
|
Prompt[en]=""
|
||||||
|
Device="GERBER_RS274X"
|
||||||
|
Wheel=".whl"
|
||||||
|
Rack=""
|
||||||
|
Scale=1
|
||||||
|
Output=".topsilkscreen.ger"
|
||||||
|
Flags="0 0 0 1 0 1 1"
|
||||||
|
Emulate="0 0 0"
|
||||||
|
Offset="0.0mil 0.0mil"
|
||||||
|
Sheet=1
|
||||||
|
Tolerance="0 0 0 0 0 0"
|
||||||
|
Pen="0.0mil 0"
|
||||||
|
Page="12000.0mil 8000.0mil"
|
||||||
|
Layers=" 20 21 25"
|
||||||
|
Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
|
||||||
|
|
||||||
|
[Sec_5]
|
||||||
|
Name[C]="Silk screen SOL"
|
||||||
|
Name[en]="Bottom Silk Screen"
|
||||||
|
Prompt[C]=""
|
||||||
|
Prompt[en]=""
|
||||||
|
Device="GERBER_RS274X"
|
||||||
|
Wheel=".whl"
|
||||||
|
Rack=""
|
||||||
|
Scale=1
|
||||||
|
Output=".bottomsilkscreen.ger"
|
||||||
|
Flags="0 0 0 1 0 1 1"
|
||||||
|
Emulate="0 0 0"
|
||||||
|
Offset="0.0mil 0.0mil"
|
||||||
|
Sheet=1
|
||||||
|
Tolerance="0 0 0 0 0 0"
|
||||||
|
Pen="0.0mil 0"
|
||||||
|
Page="12000.0mil 8000.0mil"
|
||||||
|
Layers=" 20 22 26"
|
||||||
|
Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
|
||||||
|
|
||||||
|
[Sec_6]
|
||||||
|
Name[C]="Solder stop mask CMP"
|
||||||
|
Name[en]="Top Solder Mask"
|
||||||
|
Prompt[C]=""
|
||||||
|
Prompt[en]=""
|
||||||
|
Device="GERBER_RS274X"
|
||||||
|
Wheel=".whl"
|
||||||
|
Rack=""
|
||||||
|
Scale=1
|
||||||
|
Output=".topsoldermask.ger"
|
||||||
|
Flags="0 0 0 1 0 1 1"
|
||||||
|
Emulate="0 0 0"
|
||||||
|
Offset="0.0mil 0.0mil"
|
||||||
|
Sheet=1
|
||||||
|
Tolerance="0 0 0 0 0 0"
|
||||||
|
Pen="0.0mil 0"
|
||||||
|
Page="12000.0mil 8000.0mil"
|
||||||
|
Layers=" 29"
|
||||||
|
Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
|
||||||
|
|
||||||
|
[Sec_7]
|
||||||
|
Name[C]="Solder stop mask SOL"
|
||||||
|
Name[en]="Bottom Solder Mask"
|
||||||
|
Prompt[C]=""
|
||||||
|
Prompt[en]=""
|
||||||
|
Device="GERBER_RS274X"
|
||||||
|
Wheel=".whl"
|
||||||
|
Rack=""
|
||||||
|
Scale=1
|
||||||
|
Output=".bottomsoldermask.ger"
|
||||||
|
Flags="0 0 0 1 0 1 1"
|
||||||
|
Emulate="0 0 0"
|
||||||
|
Offset="0.0mil 0.0mil"
|
||||||
|
Sheet=1
|
||||||
|
Tolerance="0 0 0 0 0 0"
|
||||||
|
Pen="0.0mil 0"
|
||||||
|
Page="12000.0mil 8000.0mil"
|
||||||
|
Layers=" 30"
|
||||||
|
Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
|
||||||
|
|
||||||
|
[Sec_8]
|
||||||
|
Name[C]="Board Outline"
|
||||||
|
Name[en]="Board Outline"
|
||||||
|
Prompt[C]=""
|
||||||
|
Prompt[en]=""
|
||||||
|
Device="GERBER_RS274X"
|
||||||
|
Wheel=".whl"
|
||||||
|
Rack=""
|
||||||
|
Scale=1
|
||||||
|
Output=".boardoutline.ger"
|
||||||
|
Flags="0 0 0 1 0 1 1"
|
||||||
|
Emulate="0 0 0"
|
||||||
|
Offset="0.0mil 0.0mil"
|
||||||
|
Sheet=1
|
||||||
|
Tolerance="0 0 0 0 0 0"
|
||||||
|
Pen="0.0mil 0"
|
||||||
|
Page="12000.0mil 8000.0mil"
|
||||||
|
Layers=" 20 46"
|
||||||
|
Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
|
||||||
|
|
||||||
|
[Sec_9]
|
||||||
|
Name[C]="Excellion Drill"
|
||||||
|
Name[en]="Excellion Drill"
|
||||||
|
Prompt[C]=""
|
||||||
|
Prompt[en]=""
|
||||||
|
Device="EXCELLON"
|
||||||
|
Wheel=".whl"
|
||||||
|
Rack=""
|
||||||
|
Scale=1
|
||||||
|
Output=".drills.xln"
|
||||||
|
Flags="0 0 0 1 0 1 1"
|
||||||
|
Emulate="0 0 0"
|
||||||
|
Offset="0.0mil 0.0mil"
|
||||||
|
Sheet=1
|
||||||
|
Tolerance="0 0 0 0 0 0"
|
||||||
|
Pen="0.0mil 0"
|
||||||
|
Page="12000.0mil 8000.0mil"
|
||||||
|
Layers=" 44 45"
|
||||||
|
Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
|
69
LaenPCBOrder.dru
Normal file
69
LaenPCBOrder.dru
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
description[de] = <b>EAGLE Design Rules</b>\n<p>\nDie Standard-Design-Rules sind so gewählt, dass sie für \ndie meisten Anwendungen passen. Sollte ihre Platine \nbesondere Anforderungen haben, treffen Sie die erforderlichen\nEinstellungen hier und speichern die Design Rules unter \neinem neuen Namen ab.
|
||||||
|
description[en] = <b>Laen's PCB Order Design Rules</b>\n<p>\nPlease make sure your boards conform to these design rules.
|
||||||
|
layerSetup = (1*16)
|
||||||
|
mtCopper = 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm 0.0356mm
|
||||||
|
mtIsolate = 1.5011mm 0.1499mm 0.2007mm 0.1499mm 0.2007mm 0.1499mm 0.2007mm 0.1499mm 0.2007mm 0.1499mm 0.2007mm 0.1499mm 0.2007mm 0.1499mm 0.2007mm
|
||||||
|
mdWireWire = 6mil
|
||||||
|
mdWirePad = 6mil
|
||||||
|
mdWireVia = 6mil
|
||||||
|
mdPadPad = 6mil
|
||||||
|
mdPadVia = 6mil
|
||||||
|
mdViaVia = 6mil
|
||||||
|
mdSmdPad = 6mil
|
||||||
|
mdSmdVia = 6mil
|
||||||
|
mdSmdSmd = 6mil
|
||||||
|
mdViaViaSameLayer = 8mil
|
||||||
|
mnLayersViaInSmd = 2
|
||||||
|
mdCopperDimension = 15mil
|
||||||
|
mdDrill = 6mil
|
||||||
|
mdSmdStop = 0mil
|
||||||
|
msWidth = 6mil
|
||||||
|
msDrill = 13mil
|
||||||
|
msMicroVia = 13mil
|
||||||
|
msBlindViaRatio = 0.500000
|
||||||
|
rvPadTop = 0.250000
|
||||||
|
rvPadInner = 0.250000
|
||||||
|
rvPadBottom = 0.250000
|
||||||
|
rvViaOuter = 0.250000
|
||||||
|
rvViaInner = 0.250000
|
||||||
|
rvMicroViaOuter = 0.250000
|
||||||
|
rvMicroViaInner = 0.250000
|
||||||
|
rlMinPadTop = 7mil
|
||||||
|
rlMaxPadTop = 20mil
|
||||||
|
rlMinPadInner = 7mil
|
||||||
|
rlMaxPadInner = 20mil
|
||||||
|
rlMinPadBottom = 7mil
|
||||||
|
rlMaxPadBottom = 20mil
|
||||||
|
rlMinViaOuter = 7mil
|
||||||
|
rlMaxViaOuter = 20mil
|
||||||
|
rlMinViaInner = 7mil
|
||||||
|
rlMaxViaInner = 20mil
|
||||||
|
rlMinMicroViaOuter = 4mil
|
||||||
|
rlMaxMicroViaOuter = 20mil
|
||||||
|
rlMinMicroViaInner = 4mil
|
||||||
|
rlMaxMicroViaInner = 20mil
|
||||||
|
psTop = -1
|
||||||
|
psBottom = -1
|
||||||
|
psFirst = -1
|
||||||
|
psElongationLong = 100
|
||||||
|
psElongationOffset = 100
|
||||||
|
mvStopFrame = 1.000000
|
||||||
|
mvCreamFrame = 0.000000
|
||||||
|
mlMinStopFrame = 3mil
|
||||||
|
mlMaxStopFrame = 3mil
|
||||||
|
mlMinCreamFrame = 0mil
|
||||||
|
mlMaxCreamFrame = 0mil
|
||||||
|
mlViaStopLimit = 0mil
|
||||||
|
srRoundness = 0.000000
|
||||||
|
srMinRoundness = 0mil
|
||||||
|
srMaxRoundness = 0mil
|
||||||
|
slThermalIsolate = 10mil
|
||||||
|
slThermalsForVias = 0
|
||||||
|
dpMaxLengthDifference = 10mm
|
||||||
|
dpGapFactor = 2.500000
|
||||||
|
checkGrid = 0
|
||||||
|
checkAngle = 0
|
||||||
|
checkFont = 1
|
||||||
|
checkRestrict = 1
|
||||||
|
useDiameter = 13
|
||||||
|
maxErrors = 50
|
3
Licenses.txt
Normal file
3
Licenses.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
All the code I wrote is public domain as mentioned in the headers.
|
||||||
|
|
||||||
|
Board design is under the creative commons license as per http://scott-bot.com/nixie-bot/
|
2602
Modified Board/NixieClock.brd
Normal file
2602
Modified Board/NixieClock.brd
Normal file
File diff suppressed because it is too large
Load Diff
4775
Modified Board/NixieClock.sch
Normal file
4775
Modified Board/NixieClock.sch
Normal file
File diff suppressed because it is too large
Load Diff
114
Modified Board/Osh Park/NixieClock.boardoutline.ger
Normal file
114
Modified Board/Osh Park/NixieClock.boardoutline.ger
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
G75*
|
||||||
|
%MOIN*%
|
||||||
|
%OFA0B0*%
|
||||||
|
%FSLAX24Y24*%
|
||||||
|
%IPPOS*%
|
||||||
|
%LPD*%
|
||||||
|
%AMOC8*
|
||||||
|
5,1,8,0,0,1.08239X$1,22.5*
|
||||||
|
%
|
||||||
|
%ADD10C,0.0000*%
|
||||||
|
D10*
|
||||||
|
X000180Y001872D02*
|
||||||
|
X000180Y035872D01*
|
||||||
|
X064680Y035872D01*
|
||||||
|
X064672Y001872D01*
|
||||||
|
X000180Y001872D01*
|
||||||
|
X007589Y003034D02*
|
||||||
|
X008771Y003034D01*
|
||||||
|
X008771Y003349D01*
|
||||||
|
X007589Y003349D01*
|
||||||
|
X007589Y003034D01*
|
||||||
|
X009912Y003782D02*
|
||||||
|
X010227Y003782D01*
|
||||||
|
X010227Y004963D01*
|
||||||
|
X009912Y004963D01*
|
||||||
|
X009912Y003782D01*
|
||||||
|
X008869Y005357D02*
|
||||||
|
X007491Y005357D01*
|
||||||
|
X007491Y005750D01*
|
||||||
|
X008869Y005750D01*
|
||||||
|
X008869Y005357D01*
|
||||||
|
X006030Y017772D02*
|
||||||
|
X006032Y017822D01*
|
||||||
|
X006038Y017872D01*
|
||||||
|
X006048Y017922D01*
|
||||||
|
X006061Y017970D01*
|
||||||
|
X006078Y018018D01*
|
||||||
|
X006099Y018064D01*
|
||||||
|
X006123Y018108D01*
|
||||||
|
X006151Y018150D01*
|
||||||
|
X006182Y018190D01*
|
||||||
|
X006216Y018227D01*
|
||||||
|
X006253Y018262D01*
|
||||||
|
X006292Y018293D01*
|
||||||
|
X006333Y018322D01*
|
||||||
|
X006377Y018347D01*
|
||||||
|
X006423Y018369D01*
|
||||||
|
X006470Y018387D01*
|
||||||
|
X006518Y018401D01*
|
||||||
|
X006567Y018412D01*
|
||||||
|
X006617Y018419D01*
|
||||||
|
X006667Y018422D01*
|
||||||
|
X006718Y018421D01*
|
||||||
|
X006768Y018416D01*
|
||||||
|
X006818Y018407D01*
|
||||||
|
X006866Y018395D01*
|
||||||
|
X006914Y018378D01*
|
||||||
|
X006960Y018358D01*
|
||||||
|
X007005Y018335D01*
|
||||||
|
X007048Y018308D01*
|
||||||
|
X007088Y018278D01*
|
||||||
|
X007126Y018245D01*
|
||||||
|
X007161Y018209D01*
|
||||||
|
X007194Y018170D01*
|
||||||
|
X007223Y018129D01*
|
||||||
|
X007249Y018086D01*
|
||||||
|
X007272Y018041D01*
|
||||||
|
X007291Y017994D01*
|
||||||
|
X007306Y017946D01*
|
||||||
|
X007318Y017897D01*
|
||||||
|
X007326Y017847D01*
|
||||||
|
X007330Y017797D01*
|
||||||
|
X007330Y017747D01*
|
||||||
|
X007326Y017697D01*
|
||||||
|
X007318Y017647D01*
|
||||||
|
X007306Y017598D01*
|
||||||
|
X007291Y017550D01*
|
||||||
|
X007272Y017503D01*
|
||||||
|
X007249Y017458D01*
|
||||||
|
X007223Y017415D01*
|
||||||
|
X007194Y017374D01*
|
||||||
|
X007161Y017335D01*
|
||||||
|
X007126Y017299D01*
|
||||||
|
X007088Y017266D01*
|
||||||
|
X007048Y017236D01*
|
||||||
|
X007005Y017209D01*
|
||||||
|
X006960Y017186D01*
|
||||||
|
X006914Y017166D01*
|
||||||
|
X006866Y017149D01*
|
||||||
|
X006818Y017137D01*
|
||||||
|
X006768Y017128D01*
|
||||||
|
X006718Y017123D01*
|
||||||
|
X006667Y017122D01*
|
||||||
|
X006617Y017125D01*
|
||||||
|
X006567Y017132D01*
|
||||||
|
X006518Y017143D01*
|
||||||
|
X006470Y017157D01*
|
||||||
|
X006423Y017175D01*
|
||||||
|
X006377Y017197D01*
|
||||||
|
X006333Y017222D01*
|
||||||
|
X006292Y017251D01*
|
||||||
|
X006253Y017282D01*
|
||||||
|
X006216Y017317D01*
|
||||||
|
X006182Y017354D01*
|
||||||
|
X006151Y017394D01*
|
||||||
|
X006123Y017436D01*
|
||||||
|
X006099Y017480D01*
|
||||||
|
X006078Y017526D01*
|
||||||
|
X006061Y017574D01*
|
||||||
|
X006048Y017622D01*
|
||||||
|
X006038Y017672D01*
|
||||||
|
X006032Y017722D01*
|
||||||
|
X006030Y017772D01*
|
||||||
|
M02*
|
37
Modified Board/Osh Park/NixieClock.boardoutline.gpi
Normal file
37
Modified Board/Osh Park/NixieClock.boardoutline.gpi
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
Generated by EAGLE CAM Processor 6.5.0
|
||||||
|
|
||||||
|
Photoplotter Info File: /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.boardoutline.gpi
|
||||||
|
|
||||||
|
Date : 8/19/14 10:43 AM
|
||||||
|
Plotfile : /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.boardoutline.ger
|
||||||
|
Apertures : generated:
|
||||||
|
Device : Gerber RS-274-X photoplotter, coordinate format 2.4 inch
|
||||||
|
|
||||||
|
Parameter settings:
|
||||||
|
|
||||||
|
Emulate Apertures : no
|
||||||
|
Tolerance Draw + : 0.00 %
|
||||||
|
Tolerance Draw - : 0.00 %
|
||||||
|
Tolerance Flash + : 0.00 %
|
||||||
|
Tolerance Flash - : 0.00 %
|
||||||
|
Rotate : no
|
||||||
|
Mirror : no
|
||||||
|
Optimize : yes
|
||||||
|
Auto fit : yes
|
||||||
|
OffsetX : 0inch
|
||||||
|
OffsetY : 0inch
|
||||||
|
|
||||||
|
Plotfile Info:
|
||||||
|
|
||||||
|
Coordinate Format : 2.4
|
||||||
|
Coordinate Units : Inch
|
||||||
|
Data Mode : Absolute
|
||||||
|
Zero Suppression : None
|
||||||
|
End Of Block : *
|
||||||
|
|
||||||
|
Apertures used:
|
||||||
|
|
||||||
|
Code Shape Size used
|
||||||
|
|
||||||
|
D10 draw 0.0000inch 17
|
||||||
|
|
9886
Modified Board/Osh Park/NixieClock.bottomlayer.ger
Normal file
9886
Modified Board/Osh Park/NixieClock.bottomlayer.ger
Normal file
File diff suppressed because it is too large
Load Diff
49
Modified Board/Osh Park/NixieClock.bottomlayer.gpi
Normal file
49
Modified Board/Osh Park/NixieClock.bottomlayer.gpi
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
Generated by EAGLE CAM Processor 6.5.0
|
||||||
|
|
||||||
|
Photoplotter Info File: /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.bottomlayer.gpi
|
||||||
|
|
||||||
|
Date : 8/19/14 10:43 AM
|
||||||
|
Plotfile : /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.bottomlayer.ger
|
||||||
|
Apertures : generated:
|
||||||
|
Device : Gerber RS-274-X photoplotter, coordinate format 2.4 inch
|
||||||
|
|
||||||
|
Parameter settings:
|
||||||
|
|
||||||
|
Emulate Apertures : no
|
||||||
|
Tolerance Draw + : 0.00 %
|
||||||
|
Tolerance Draw - : 0.00 %
|
||||||
|
Tolerance Flash + : 0.00 %
|
||||||
|
Tolerance Flash - : 0.00 %
|
||||||
|
Rotate : no
|
||||||
|
Mirror : no
|
||||||
|
Optimize : yes
|
||||||
|
Auto fit : yes
|
||||||
|
OffsetX : 0inch
|
||||||
|
OffsetY : 0inch
|
||||||
|
|
||||||
|
Plotfile Info:
|
||||||
|
|
||||||
|
Coordinate Format : 2.4
|
||||||
|
Coordinate Units : Inch
|
||||||
|
Data Mode : Absolute
|
||||||
|
Zero Suppression : None
|
||||||
|
End Of Block : *
|
||||||
|
|
||||||
|
Apertures used:
|
||||||
|
|
||||||
|
Code Shape Size used
|
||||||
|
|
||||||
|
D10 round 0.0740inch 66
|
||||||
|
D11 draw 0.0560inch 144
|
||||||
|
D12 draw 0.0640inch 6
|
||||||
|
D13 square 0.0650inch 2
|
||||||
|
D14 round 0.0650inch 2
|
||||||
|
D15 square 0.0740inch 1
|
||||||
|
D16 draw 0.0860inch 18
|
||||||
|
D17 round 0.0571inch 78
|
||||||
|
D18 round 0.2300inch 4
|
||||||
|
D19 draw 0.0120inch 150
|
||||||
|
D20 round 0.0400inch 83
|
||||||
|
D21 draw 0.0160inch 6496
|
||||||
|
D22 draw 0.0700inch 50
|
||||||
|
|
99
Modified Board/Osh Park/NixieClock.bottomsilkscreen.ger
Normal file
99
Modified Board/Osh Park/NixieClock.bottomsilkscreen.ger
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
G75*
|
||||||
|
%MOIN*%
|
||||||
|
%OFA0B0*%
|
||||||
|
%FSLAX24Y24*%
|
||||||
|
%IPPOS*%
|
||||||
|
%LPD*%
|
||||||
|
%AMOC8*
|
||||||
|
5,1,8,0,0,1.08239X$1,22.5*
|
||||||
|
%
|
||||||
|
%ADD10C,0.0000*%
|
||||||
|
D10*
|
||||||
|
X000180Y001872D02*
|
||||||
|
X000180Y035872D01*
|
||||||
|
X064680Y035872D01*
|
||||||
|
X064672Y001872D01*
|
||||||
|
X000180Y001872D01*
|
||||||
|
X006030Y017772D02*
|
||||||
|
X006032Y017822D01*
|
||||||
|
X006038Y017872D01*
|
||||||
|
X006048Y017922D01*
|
||||||
|
X006061Y017970D01*
|
||||||
|
X006078Y018018D01*
|
||||||
|
X006099Y018064D01*
|
||||||
|
X006123Y018108D01*
|
||||||
|
X006151Y018150D01*
|
||||||
|
X006182Y018190D01*
|
||||||
|
X006216Y018227D01*
|
||||||
|
X006253Y018262D01*
|
||||||
|
X006292Y018293D01*
|
||||||
|
X006333Y018322D01*
|
||||||
|
X006377Y018347D01*
|
||||||
|
X006423Y018369D01*
|
||||||
|
X006470Y018387D01*
|
||||||
|
X006518Y018401D01*
|
||||||
|
X006567Y018412D01*
|
||||||
|
X006617Y018419D01*
|
||||||
|
X006667Y018422D01*
|
||||||
|
X006718Y018421D01*
|
||||||
|
X006768Y018416D01*
|
||||||
|
X006818Y018407D01*
|
||||||
|
X006866Y018395D01*
|
||||||
|
X006914Y018378D01*
|
||||||
|
X006960Y018358D01*
|
||||||
|
X007005Y018335D01*
|
||||||
|
X007048Y018308D01*
|
||||||
|
X007088Y018278D01*
|
||||||
|
X007126Y018245D01*
|
||||||
|
X007161Y018209D01*
|
||||||
|
X007194Y018170D01*
|
||||||
|
X007223Y018129D01*
|
||||||
|
X007249Y018086D01*
|
||||||
|
X007272Y018041D01*
|
||||||
|
X007291Y017994D01*
|
||||||
|
X007306Y017946D01*
|
||||||
|
X007318Y017897D01*
|
||||||
|
X007326Y017847D01*
|
||||||
|
X007330Y017797D01*
|
||||||
|
X007330Y017747D01*
|
||||||
|
X007326Y017697D01*
|
||||||
|
X007318Y017647D01*
|
||||||
|
X007306Y017598D01*
|
||||||
|
X007291Y017550D01*
|
||||||
|
X007272Y017503D01*
|
||||||
|
X007249Y017458D01*
|
||||||
|
X007223Y017415D01*
|
||||||
|
X007194Y017374D01*
|
||||||
|
X007161Y017335D01*
|
||||||
|
X007126Y017299D01*
|
||||||
|
X007088Y017266D01*
|
||||||
|
X007048Y017236D01*
|
||||||
|
X007005Y017209D01*
|
||||||
|
X006960Y017186D01*
|
||||||
|
X006914Y017166D01*
|
||||||
|
X006866Y017149D01*
|
||||||
|
X006818Y017137D01*
|
||||||
|
X006768Y017128D01*
|
||||||
|
X006718Y017123D01*
|
||||||
|
X006667Y017122D01*
|
||||||
|
X006617Y017125D01*
|
||||||
|
X006567Y017132D01*
|
||||||
|
X006518Y017143D01*
|
||||||
|
X006470Y017157D01*
|
||||||
|
X006423Y017175D01*
|
||||||
|
X006377Y017197D01*
|
||||||
|
X006333Y017222D01*
|
||||||
|
X006292Y017251D01*
|
||||||
|
X006253Y017282D01*
|
||||||
|
X006216Y017317D01*
|
||||||
|
X006182Y017354D01*
|
||||||
|
X006151Y017394D01*
|
||||||
|
X006123Y017436D01*
|
||||||
|
X006099Y017480D01*
|
||||||
|
X006078Y017526D01*
|
||||||
|
X006061Y017574D01*
|
||||||
|
X006048Y017622D01*
|
||||||
|
X006038Y017672D01*
|
||||||
|
X006032Y017722D01*
|
||||||
|
X006030Y017772D01*
|
||||||
|
M02*
|
37
Modified Board/Osh Park/NixieClock.bottomsilkscreen.gpi
Normal file
37
Modified Board/Osh Park/NixieClock.bottomsilkscreen.gpi
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
Generated by EAGLE CAM Processor 6.5.0
|
||||||
|
|
||||||
|
Photoplotter Info File: /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.bottomsilkscreen.gpi
|
||||||
|
|
||||||
|
Date : 8/19/14 10:43 AM
|
||||||
|
Plotfile : /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.bottomsilkscreen.ger
|
||||||
|
Apertures : generated:
|
||||||
|
Device : Gerber RS-274-X photoplotter, coordinate format 2.4 inch
|
||||||
|
|
||||||
|
Parameter settings:
|
||||||
|
|
||||||
|
Emulate Apertures : no
|
||||||
|
Tolerance Draw + : 0.00 %
|
||||||
|
Tolerance Draw - : 0.00 %
|
||||||
|
Tolerance Flash + : 0.00 %
|
||||||
|
Tolerance Flash - : 0.00 %
|
||||||
|
Rotate : no
|
||||||
|
Mirror : no
|
||||||
|
Optimize : yes
|
||||||
|
Auto fit : yes
|
||||||
|
OffsetX : 0inch
|
||||||
|
OffsetY : 0inch
|
||||||
|
|
||||||
|
Plotfile Info:
|
||||||
|
|
||||||
|
Coordinate Format : 2.4
|
||||||
|
Coordinate Units : Inch
|
||||||
|
Data Mode : Absolute
|
||||||
|
Zero Suppression : None
|
||||||
|
End Of Block : *
|
||||||
|
|
||||||
|
Apertures used:
|
||||||
|
|
||||||
|
Code Shape Size used
|
||||||
|
|
||||||
|
D10 draw 0.0000inch 5
|
||||||
|
|
490
Modified Board/Osh Park/NixieClock.bottomsoldermask.ger
Normal file
490
Modified Board/Osh Park/NixieClock.bottomsoldermask.ger
Normal file
@ -0,0 +1,490 @@
|
|||||||
|
G75*
|
||||||
|
%MOIN*%
|
||||||
|
%OFA0B0*%
|
||||||
|
%FSLAX24Y24*%
|
||||||
|
%IPPOS*%
|
||||||
|
%LPD*%
|
||||||
|
%AMOC8*
|
||||||
|
5,1,8,0,0,1.08239X$1,22.5*
|
||||||
|
%
|
||||||
|
%ADD10C,0.0820*%
|
||||||
|
%ADD11C,0.0640*%
|
||||||
|
%ADD12C,0.0720*%
|
||||||
|
%ADD13C,0.1380*%
|
||||||
|
%ADD14R,0.0730X0.0730*%
|
||||||
|
%ADD15C,0.0730*%
|
||||||
|
%ADD16R,0.0820X0.0820*%
|
||||||
|
%ADD17C,0.0940*%
|
||||||
|
%ADD18C,0.0651*%
|
||||||
|
%ADD19C,0.2380*%
|
||||||
|
D10*
|
||||||
|
X014180Y006372D03*
|
||||||
|
X030180Y006372D03*
|
||||||
|
X036680Y009872D03*
|
||||||
|
X037680Y009872D03*
|
||||||
|
X038680Y009872D03*
|
||||||
|
X039680Y009872D03*
|
||||||
|
X040680Y009872D03*
|
||||||
|
X044680Y010372D03*
|
||||||
|
X044680Y008872D03*
|
||||||
|
X044180Y007372D03*
|
||||||
|
X045180Y007372D03*
|
||||||
|
X046180Y007372D03*
|
||||||
|
X047180Y007372D03*
|
||||||
|
X048180Y007372D03*
|
||||||
|
X049180Y007372D03*
|
||||||
|
X050180Y007372D03*
|
||||||
|
X051180Y007372D03*
|
||||||
|
X052180Y007372D03*
|
||||||
|
X053180Y007372D03*
|
||||||
|
X054180Y007372D03*
|
||||||
|
X055180Y007372D03*
|
||||||
|
X051680Y008622D03*
|
||||||
|
X050680Y008622D03*
|
||||||
|
X048680Y008872D03*
|
||||||
|
X048680Y010372D03*
|
||||||
|
X048180Y013372D03*
|
||||||
|
X049180Y013372D03*
|
||||||
|
X050180Y013372D03*
|
||||||
|
X051180Y013372D03*
|
||||||
|
X052180Y013372D03*
|
||||||
|
X053180Y013372D03*
|
||||||
|
X054180Y013372D03*
|
||||||
|
X055180Y013372D03*
|
||||||
|
X059180Y011372D03*
|
||||||
|
X059180Y010372D03*
|
||||||
|
X059180Y009372D03*
|
||||||
|
X061290Y009652D03*
|
||||||
|
X063070Y009652D03*
|
||||||
|
X063070Y011092D03*
|
||||||
|
X061290Y011092D03*
|
||||||
|
X061290Y013652D03*
|
||||||
|
X063070Y013652D03*
|
||||||
|
X063070Y007092D03*
|
||||||
|
X061290Y007092D03*
|
||||||
|
X047180Y013372D03*
|
||||||
|
X046180Y013372D03*
|
||||||
|
X045180Y013372D03*
|
||||||
|
X044180Y013372D03*
|
||||||
|
X040180Y012372D03*
|
||||||
|
X039180Y013872D03*
|
||||||
|
X038180Y013872D03*
|
||||||
|
X037180Y013872D03*
|
||||||
|
X036180Y012372D03*
|
||||||
|
X032680Y020872D03*
|
||||||
|
X032680Y024872D03*
|
||||||
|
X022180Y024872D03*
|
||||||
|
X022180Y020872D03*
|
||||||
|
X014180Y017372D03*
|
||||||
|
X011680Y020872D03*
|
||||||
|
X011680Y024872D03*
|
||||||
|
X043180Y024872D03*
|
||||||
|
X043180Y020872D03*
|
||||||
|
X053680Y020872D03*
|
||||||
|
X053680Y024872D03*
|
||||||
|
X063680Y024872D03*
|
||||||
|
X063680Y020872D03*
|
||||||
|
D11*
|
||||||
|
X062180Y022092D02*
|
||||||
|
X062180Y022652D01*
|
||||||
|
X061180Y022652D02*
|
||||||
|
X061180Y022092D01*
|
||||||
|
X060180Y022092D02*
|
||||||
|
X060180Y022652D01*
|
||||||
|
X059180Y022652D02*
|
||||||
|
X059180Y022092D01*
|
||||||
|
X058180Y022092D02*
|
||||||
|
X058180Y022652D01*
|
||||||
|
X057180Y022652D02*
|
||||||
|
X057180Y022092D01*
|
||||||
|
X056180Y022092D02*
|
||||||
|
X056180Y022652D01*
|
||||||
|
X055180Y022652D02*
|
||||||
|
X055180Y022092D01*
|
||||||
|
X051680Y022092D02*
|
||||||
|
X051680Y022652D01*
|
||||||
|
X050680Y022652D02*
|
||||||
|
X050680Y022092D01*
|
||||||
|
X049680Y022092D02*
|
||||||
|
X049680Y022652D01*
|
||||||
|
X048680Y022652D02*
|
||||||
|
X048680Y022092D01*
|
||||||
|
X047680Y022092D02*
|
||||||
|
X047680Y022652D01*
|
||||||
|
X046680Y022652D02*
|
||||||
|
X046680Y022092D01*
|
||||||
|
X045680Y022092D02*
|
||||||
|
X045680Y022652D01*
|
||||||
|
X044680Y022652D02*
|
||||||
|
X044680Y022092D01*
|
||||||
|
X041180Y022092D02*
|
||||||
|
X041180Y022652D01*
|
||||||
|
X040180Y022652D02*
|
||||||
|
X040180Y022092D01*
|
||||||
|
X039180Y022092D02*
|
||||||
|
X039180Y022652D01*
|
||||||
|
X038180Y022652D02*
|
||||||
|
X038180Y022092D01*
|
||||||
|
X037180Y022092D02*
|
||||||
|
X037180Y022652D01*
|
||||||
|
X036180Y022652D02*
|
||||||
|
X036180Y022092D01*
|
||||||
|
X035180Y022092D02*
|
||||||
|
X035180Y022652D01*
|
||||||
|
X034180Y022652D02*
|
||||||
|
X034180Y022092D01*
|
||||||
|
X030680Y022092D02*
|
||||||
|
X030680Y022652D01*
|
||||||
|
X029680Y022652D02*
|
||||||
|
X029680Y022092D01*
|
||||||
|
X028680Y022092D02*
|
||||||
|
X028680Y022652D01*
|
||||||
|
X027680Y022652D02*
|
||||||
|
X027680Y022092D01*
|
||||||
|
X026680Y022092D02*
|
||||||
|
X026680Y022652D01*
|
||||||
|
X025680Y022652D02*
|
||||||
|
X025680Y022092D01*
|
||||||
|
X024680Y022092D02*
|
||||||
|
X024680Y022652D01*
|
||||||
|
X023680Y022652D02*
|
||||||
|
X023680Y022092D01*
|
||||||
|
X020180Y022092D02*
|
||||||
|
X020180Y022652D01*
|
||||||
|
X019180Y022652D02*
|
||||||
|
X019180Y022092D01*
|
||||||
|
X018180Y022092D02*
|
||||||
|
X018180Y022652D01*
|
||||||
|
X017180Y022652D02*
|
||||||
|
X017180Y022092D01*
|
||||||
|
X016180Y022092D02*
|
||||||
|
X016180Y022652D01*
|
||||||
|
X015180Y022652D02*
|
||||||
|
X015180Y022092D01*
|
||||||
|
X014180Y022092D02*
|
||||||
|
X014180Y022652D01*
|
||||||
|
X013180Y022652D02*
|
||||||
|
X013180Y022092D01*
|
||||||
|
X009680Y022092D02*
|
||||||
|
X009680Y022652D01*
|
||||||
|
X008680Y022652D02*
|
||||||
|
X008680Y022092D01*
|
||||||
|
X007680Y022092D02*
|
||||||
|
X007680Y022652D01*
|
||||||
|
X006680Y022652D02*
|
||||||
|
X006680Y022092D01*
|
||||||
|
X005680Y022092D02*
|
||||||
|
X005680Y022652D01*
|
||||||
|
X004680Y022652D02*
|
||||||
|
X004680Y022092D01*
|
||||||
|
X003680Y022092D02*
|
||||||
|
X003680Y022652D01*
|
||||||
|
X002680Y022652D02*
|
||||||
|
X002680Y022092D01*
|
||||||
|
X002680Y025092D02*
|
||||||
|
X002680Y025652D01*
|
||||||
|
X003680Y025652D02*
|
||||||
|
X003680Y025092D01*
|
||||||
|
X004680Y025092D02*
|
||||||
|
X004680Y025652D01*
|
||||||
|
X005680Y025652D02*
|
||||||
|
X005680Y025092D01*
|
||||||
|
X006680Y025092D02*
|
||||||
|
X006680Y025652D01*
|
||||||
|
X007680Y025652D02*
|
||||||
|
X007680Y025092D01*
|
||||||
|
X008680Y025092D02*
|
||||||
|
X008680Y025652D01*
|
||||||
|
X009680Y025652D02*
|
||||||
|
X009680Y025092D01*
|
||||||
|
X013180Y025092D02*
|
||||||
|
X013180Y025652D01*
|
||||||
|
X014180Y025652D02*
|
||||||
|
X014180Y025092D01*
|
||||||
|
X015180Y025092D02*
|
||||||
|
X015180Y025652D01*
|
||||||
|
X016180Y025652D02*
|
||||||
|
X016180Y025092D01*
|
||||||
|
X017180Y025092D02*
|
||||||
|
X017180Y025652D01*
|
||||||
|
X018180Y025652D02*
|
||||||
|
X018180Y025092D01*
|
||||||
|
X019180Y025092D02*
|
||||||
|
X019180Y025652D01*
|
||||||
|
X020180Y025652D02*
|
||||||
|
X020180Y025092D01*
|
||||||
|
X023680Y025092D02*
|
||||||
|
X023680Y025652D01*
|
||||||
|
X024680Y025652D02*
|
||||||
|
X024680Y025092D01*
|
||||||
|
X025680Y025092D02*
|
||||||
|
X025680Y025652D01*
|
||||||
|
X026680Y025652D02*
|
||||||
|
X026680Y025092D01*
|
||||||
|
X027680Y025092D02*
|
||||||
|
X027680Y025652D01*
|
||||||
|
X028680Y025652D02*
|
||||||
|
X028680Y025092D01*
|
||||||
|
X029680Y025092D02*
|
||||||
|
X029680Y025652D01*
|
||||||
|
X030680Y025652D02*
|
||||||
|
X030680Y025092D01*
|
||||||
|
X034180Y025092D02*
|
||||||
|
X034180Y025652D01*
|
||||||
|
X035180Y025652D02*
|
||||||
|
X035180Y025092D01*
|
||||||
|
X036180Y025092D02*
|
||||||
|
X036180Y025652D01*
|
||||||
|
X037180Y025652D02*
|
||||||
|
X037180Y025092D01*
|
||||||
|
X038180Y025092D02*
|
||||||
|
X038180Y025652D01*
|
||||||
|
X039180Y025652D02*
|
||||||
|
X039180Y025092D01*
|
||||||
|
X040180Y025092D02*
|
||||||
|
X040180Y025652D01*
|
||||||
|
X041180Y025652D02*
|
||||||
|
X041180Y025092D01*
|
||||||
|
X044680Y025092D02*
|
||||||
|
X044680Y025652D01*
|
||||||
|
X045680Y025652D02*
|
||||||
|
X045680Y025092D01*
|
||||||
|
X046680Y025092D02*
|
||||||
|
X046680Y025652D01*
|
||||||
|
X047680Y025652D02*
|
||||||
|
X047680Y025092D01*
|
||||||
|
X048680Y025092D02*
|
||||||
|
X048680Y025652D01*
|
||||||
|
X049680Y025652D02*
|
||||||
|
X049680Y025092D01*
|
||||||
|
X050680Y025092D02*
|
||||||
|
X050680Y025652D01*
|
||||||
|
X051680Y025652D02*
|
||||||
|
X051680Y025092D01*
|
||||||
|
X055180Y025092D02*
|
||||||
|
X055180Y025652D01*
|
||||||
|
X056180Y025652D02*
|
||||||
|
X056180Y025092D01*
|
||||||
|
X057180Y025092D02*
|
||||||
|
X057180Y025652D01*
|
||||||
|
X058180Y025652D02*
|
||||||
|
X058180Y025092D01*
|
||||||
|
X059180Y025092D02*
|
||||||
|
X059180Y025652D01*
|
||||||
|
X060180Y025652D02*
|
||||||
|
X060180Y025092D01*
|
||||||
|
X061180Y025092D02*
|
||||||
|
X061180Y025652D01*
|
||||||
|
X062180Y025652D02*
|
||||||
|
X062180Y025092D01*
|
||||||
|
X062180Y019152D02*
|
||||||
|
X062180Y018592D01*
|
||||||
|
X061180Y018592D02*
|
||||||
|
X061180Y019152D01*
|
||||||
|
X060180Y019152D02*
|
||||||
|
X060180Y018592D01*
|
||||||
|
X059180Y018592D02*
|
||||||
|
X059180Y019152D01*
|
||||||
|
X058180Y019152D02*
|
||||||
|
X058180Y018592D01*
|
||||||
|
X057180Y018592D02*
|
||||||
|
X057180Y019152D01*
|
||||||
|
X056180Y019152D02*
|
||||||
|
X056180Y018592D01*
|
||||||
|
X055180Y018592D02*
|
||||||
|
X055180Y019152D01*
|
||||||
|
X051680Y019152D02*
|
||||||
|
X051680Y018592D01*
|
||||||
|
X050680Y018592D02*
|
||||||
|
X050680Y019152D01*
|
||||||
|
X049680Y019152D02*
|
||||||
|
X049680Y018592D01*
|
||||||
|
X048680Y018592D02*
|
||||||
|
X048680Y019152D01*
|
||||||
|
X047680Y019152D02*
|
||||||
|
X047680Y018592D01*
|
||||||
|
X046680Y018592D02*
|
||||||
|
X046680Y019152D01*
|
||||||
|
X045680Y019152D02*
|
||||||
|
X045680Y018592D01*
|
||||||
|
X044680Y018592D02*
|
||||||
|
X044680Y019152D01*
|
||||||
|
X041180Y019152D02*
|
||||||
|
X041180Y018592D01*
|
||||||
|
X040180Y018592D02*
|
||||||
|
X040180Y019152D01*
|
||||||
|
X039180Y019152D02*
|
||||||
|
X039180Y018592D01*
|
||||||
|
X038180Y018592D02*
|
||||||
|
X038180Y019152D01*
|
||||||
|
X037180Y019152D02*
|
||||||
|
X037180Y018592D01*
|
||||||
|
X036180Y018592D02*
|
||||||
|
X036180Y019152D01*
|
||||||
|
X035180Y019152D02*
|
||||||
|
X035180Y018592D01*
|
||||||
|
X034180Y018592D02*
|
||||||
|
X034180Y019152D01*
|
||||||
|
X034180Y016152D02*
|
||||||
|
X034180Y015592D01*
|
||||||
|
X035180Y015592D02*
|
||||||
|
X035180Y016152D01*
|
||||||
|
X036180Y016152D02*
|
||||||
|
X036180Y015592D01*
|
||||||
|
X037180Y015592D02*
|
||||||
|
X037180Y016152D01*
|
||||||
|
X038180Y016152D02*
|
||||||
|
X038180Y015592D01*
|
||||||
|
X039180Y015592D02*
|
||||||
|
X039180Y016152D01*
|
||||||
|
X040180Y016152D02*
|
||||||
|
X040180Y015592D01*
|
||||||
|
X041180Y015592D02*
|
||||||
|
X041180Y016152D01*
|
||||||
|
X044680Y016152D02*
|
||||||
|
X044680Y015592D01*
|
||||||
|
X045680Y015592D02*
|
||||||
|
X045680Y016152D01*
|
||||||
|
X046680Y016152D02*
|
||||||
|
X046680Y015592D01*
|
||||||
|
X047680Y015592D02*
|
||||||
|
X047680Y016152D01*
|
||||||
|
X048680Y016152D02*
|
||||||
|
X048680Y015592D01*
|
||||||
|
X049680Y015592D02*
|
||||||
|
X049680Y016152D01*
|
||||||
|
X050680Y016152D02*
|
||||||
|
X050680Y015592D01*
|
||||||
|
X051680Y015592D02*
|
||||||
|
X051680Y016152D01*
|
||||||
|
X055180Y016152D02*
|
||||||
|
X055180Y015592D01*
|
||||||
|
X056180Y015592D02*
|
||||||
|
X056180Y016152D01*
|
||||||
|
X057180Y016152D02*
|
||||||
|
X057180Y015592D01*
|
||||||
|
X058180Y015592D02*
|
||||||
|
X058180Y016152D01*
|
||||||
|
X059180Y016152D02*
|
||||||
|
X059180Y015592D01*
|
||||||
|
X060180Y015592D02*
|
||||||
|
X060180Y016152D01*
|
||||||
|
X061180Y016152D02*
|
||||||
|
X061180Y015592D01*
|
||||||
|
X062180Y015592D02*
|
||||||
|
X062180Y016152D01*
|
||||||
|
D12*
|
||||||
|
X046680Y003692D02*
|
||||||
|
X046680Y003052D01*
|
||||||
|
X045680Y003052D02*
|
||||||
|
X045680Y003692D01*
|
||||||
|
X044680Y003692D02*
|
||||||
|
X044680Y003052D01*
|
||||||
|
X007680Y011552D02*
|
||||||
|
X007680Y012192D01*
|
||||||
|
X006680Y012192D02*
|
||||||
|
X006680Y011552D01*
|
||||||
|
X005680Y011552D02*
|
||||||
|
X005680Y012192D01*
|
||||||
|
D13*
|
||||||
|
X006680Y017772D03*
|
||||||
|
D14*
|
||||||
|
X004680Y008872D03*
|
||||||
|
X008680Y008872D03*
|
||||||
|
D15*
|
||||||
|
X007680Y008872D03*
|
||||||
|
X005680Y008872D03*
|
||||||
|
D16*
|
||||||
|
X030180Y017372D03*
|
||||||
|
D17*
|
||||||
|
X008610Y005553D02*
|
||||||
|
X007750Y005553D01*
|
||||||
|
X010070Y004802D02*
|
||||||
|
X010070Y003942D01*
|
||||||
|
X008610Y003191D02*
|
||||||
|
X007750Y003191D01*
|
||||||
|
D18*
|
||||||
|
X007180Y028684D03*
|
||||||
|
X008197Y028935D03*
|
||||||
|
X008980Y029629D03*
|
||||||
|
X009352Y030608D03*
|
||||||
|
X009225Y031648D03*
|
||||||
|
X008631Y032509D03*
|
||||||
|
X007704Y032996D03*
|
||||||
|
X006656Y032996D03*
|
||||||
|
X005729Y032509D03*
|
||||||
|
X005135Y031648D03*
|
||||||
|
X005008Y030608D03*
|
||||||
|
X005380Y029629D03*
|
||||||
|
X006163Y028935D03*
|
||||||
|
X014508Y030608D03*
|
||||||
|
X014880Y029629D03*
|
||||||
|
X015663Y028935D03*
|
||||||
|
X016680Y028684D03*
|
||||||
|
X017697Y028935D03*
|
||||||
|
X018480Y029629D03*
|
||||||
|
X018852Y030608D03*
|
||||||
|
X018725Y031648D03*
|
||||||
|
X018131Y032509D03*
|
||||||
|
X017204Y032996D03*
|
||||||
|
X016156Y032996D03*
|
||||||
|
X015229Y032509D03*
|
||||||
|
X014635Y031648D03*
|
||||||
|
X025508Y030608D03*
|
||||||
|
X025880Y029629D03*
|
||||||
|
X026663Y028935D03*
|
||||||
|
X027680Y028684D03*
|
||||||
|
X028697Y028935D03*
|
||||||
|
X029480Y029629D03*
|
||||||
|
X029852Y030608D03*
|
||||||
|
X029725Y031648D03*
|
||||||
|
X029131Y032509D03*
|
||||||
|
X028204Y032996D03*
|
||||||
|
X027156Y032996D03*
|
||||||
|
X026229Y032509D03*
|
||||||
|
X025635Y031648D03*
|
||||||
|
X035008Y030608D03*
|
||||||
|
X035380Y029629D03*
|
||||||
|
X036163Y028935D03*
|
||||||
|
X037180Y028684D03*
|
||||||
|
X038197Y028935D03*
|
||||||
|
X038980Y029629D03*
|
||||||
|
X039352Y030608D03*
|
||||||
|
X039225Y031648D03*
|
||||||
|
X038631Y032509D03*
|
||||||
|
X037704Y032996D03*
|
||||||
|
X036656Y032996D03*
|
||||||
|
X035729Y032509D03*
|
||||||
|
X035135Y031648D03*
|
||||||
|
X046008Y030608D03*
|
||||||
|
X046380Y029629D03*
|
||||||
|
X047163Y028935D03*
|
||||||
|
X048180Y028684D03*
|
||||||
|
X049197Y028935D03*
|
||||||
|
X049980Y029629D03*
|
||||||
|
X050352Y030608D03*
|
||||||
|
X050225Y031648D03*
|
||||||
|
X049631Y032509D03*
|
||||||
|
X048704Y032996D03*
|
||||||
|
X047656Y032996D03*
|
||||||
|
X046729Y032509D03*
|
||||||
|
X046135Y031648D03*
|
||||||
|
X055508Y030608D03*
|
||||||
|
X055880Y029629D03*
|
||||||
|
X056663Y028935D03*
|
||||||
|
X057680Y028684D03*
|
||||||
|
X058697Y028935D03*
|
||||||
|
X059480Y029629D03*
|
||||||
|
X059852Y030608D03*
|
||||||
|
X059725Y031648D03*
|
||||||
|
X059131Y032509D03*
|
||||||
|
X058204Y032996D03*
|
||||||
|
X057156Y032996D03*
|
||||||
|
X056229Y032509D03*
|
||||||
|
X055635Y031648D03*
|
||||||
|
D19*
|
||||||
|
X002180Y003872D03*
|
||||||
|
X002180Y033872D03*
|
||||||
|
X062680Y033872D03*
|
||||||
|
X062680Y003872D03*
|
||||||
|
M02*
|
46
Modified Board/Osh Park/NixieClock.bottomsoldermask.gpi
Normal file
46
Modified Board/Osh Park/NixieClock.bottomsoldermask.gpi
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
Generated by EAGLE CAM Processor 6.5.0
|
||||||
|
|
||||||
|
Photoplotter Info File: /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.bottomsoldermask.gpi
|
||||||
|
|
||||||
|
Date : 8/19/14 10:43 AM
|
||||||
|
Plotfile : /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.bottomsoldermask.ger
|
||||||
|
Apertures : generated:
|
||||||
|
Device : Gerber RS-274-X photoplotter, coordinate format 2.4 inch
|
||||||
|
|
||||||
|
Parameter settings:
|
||||||
|
|
||||||
|
Emulate Apertures : no
|
||||||
|
Tolerance Draw + : 0.00 %
|
||||||
|
Tolerance Draw - : 0.00 %
|
||||||
|
Tolerance Flash + : 0.00 %
|
||||||
|
Tolerance Flash - : 0.00 %
|
||||||
|
Rotate : no
|
||||||
|
Mirror : no
|
||||||
|
Optimize : yes
|
||||||
|
Auto fit : yes
|
||||||
|
OffsetX : 0inch
|
||||||
|
OffsetY : 0inch
|
||||||
|
|
||||||
|
Plotfile Info:
|
||||||
|
|
||||||
|
Coordinate Format : 2.4
|
||||||
|
Coordinate Units : Inch
|
||||||
|
Data Mode : Absolute
|
||||||
|
Zero Suppression : None
|
||||||
|
End Of Block : *
|
||||||
|
|
||||||
|
Apertures used:
|
||||||
|
|
||||||
|
Code Shape Size used
|
||||||
|
|
||||||
|
D10 round 0.0820inch 66
|
||||||
|
D11 draw 0.0640inch 144
|
||||||
|
D12 draw 0.0720inch 6
|
||||||
|
D13 round 0.1380inch 1
|
||||||
|
D14 square 0.0730inch 2
|
||||||
|
D15 round 0.0730inch 2
|
||||||
|
D16 square 0.0820inch 1
|
||||||
|
D17 draw 0.0940inch 3
|
||||||
|
D18 round 0.0651inch 78
|
||||||
|
D19 round 0.2380inch 4
|
||||||
|
|
45
Modified Board/Osh Park/NixieClock.drills.dri
Normal file
45
Modified Board/Osh Park/NixieClock.drills.dri
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
Generated by EAGLE CAM Processor 6.5.0
|
||||||
|
|
||||||
|
Drill Station Info File: /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.drills.dri
|
||||||
|
|
||||||
|
Date : 8/19/14 10:43 AM
|
||||||
|
Drills : generated
|
||||||
|
Device : Excellon drill station
|
||||||
|
|
||||||
|
Parameter settings:
|
||||||
|
|
||||||
|
Tolerance Drill + : 0.00 %
|
||||||
|
Tolerance Drill - : 0.00 %
|
||||||
|
Rotate : no
|
||||||
|
Mirror : no
|
||||||
|
Optimize : yes
|
||||||
|
Auto fit : yes
|
||||||
|
OffsetX : 0inch
|
||||||
|
OffsetY : 0inch
|
||||||
|
Layers : Drills Holes
|
||||||
|
|
||||||
|
Drill File Info:
|
||||||
|
|
||||||
|
Data Mode : Absolute
|
||||||
|
Units : 1/10000 Inch
|
||||||
|
|
||||||
|
Drills used:
|
||||||
|
|
||||||
|
Code Size used
|
||||||
|
|
||||||
|
T01 0.0200inch 83
|
||||||
|
T02 0.0276inch 4
|
||||||
|
T03 0.0315inch 2
|
||||||
|
T04 0.0320inch 144
|
||||||
|
T05 0.0331inch 78
|
||||||
|
T06 0.0354inch 18
|
||||||
|
T07 0.0394inch 1
|
||||||
|
T08 0.0400inch 55
|
||||||
|
T09 0.1300inch 1
|
||||||
|
T10 0.1417inch 4
|
||||||
|
|
||||||
|
Total number of drills: 390
|
||||||
|
|
||||||
|
Plotfiles:
|
||||||
|
|
||||||
|
/Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.drills.xln
|
415
Modified Board/Osh Park/NixieClock.drills.xln
Normal file
415
Modified Board/Osh Park/NixieClock.drills.xln
Normal file
@ -0,0 +1,415 @@
|
|||||||
|
%
|
||||||
|
M48
|
||||||
|
M72
|
||||||
|
T01C0.0200
|
||||||
|
T02C0.0276
|
||||||
|
T03C0.0315
|
||||||
|
T04C0.0320
|
||||||
|
T05C0.0331
|
||||||
|
T06C0.0354
|
||||||
|
T07C0.0394
|
||||||
|
T08C0.0400
|
||||||
|
T09C0.1300
|
||||||
|
T10C0.1417
|
||||||
|
%
|
||||||
|
T01
|
||||||
|
X15480Y15072
|
||||||
|
X14080Y15872
|
||||||
|
X17880Y19672
|
||||||
|
X21780Y18772
|
||||||
|
X23580Y17972
|
||||||
|
X27980Y20072
|
||||||
|
X31580Y17472
|
||||||
|
X33880Y17872
|
||||||
|
X34580Y17872
|
||||||
|
X34280Y17072
|
||||||
|
X34880Y17072
|
||||||
|
X38380Y17072
|
||||||
|
X35680Y19572
|
||||||
|
X40680Y20072
|
||||||
|
X41880Y20072
|
||||||
|
X44580Y17972
|
||||||
|
X47680Y17672
|
||||||
|
X50780Y17772
|
||||||
|
X49780Y20072
|
||||||
|
X46580Y20072
|
||||||
|
X42780Y22772
|
||||||
|
X40580Y23672
|
||||||
|
X36880Y23672
|
||||||
|
X40380Y26572
|
||||||
|
X37980Y28172
|
||||||
|
X41780Y28672
|
||||||
|
X44680Y28672
|
||||||
|
X47180Y27072
|
||||||
|
X45180Y26172
|
||||||
|
X45880Y23672
|
||||||
|
X51180Y26172
|
||||||
|
X52280Y28172
|
||||||
|
X52780Y28472
|
||||||
|
X51780Y31172
|
||||||
|
X60880Y31072
|
||||||
|
X62780Y28572
|
||||||
|
X56680Y24672
|
||||||
|
X52780Y22372
|
||||||
|
X51680Y23672
|
||||||
|
X62880Y21972
|
||||||
|
X52580Y15072
|
||||||
|
X50680Y13872
|
||||||
|
X49180Y14672
|
||||||
|
X47280Y14272
|
||||||
|
X47180Y15172
|
||||||
|
X38080Y12172
|
||||||
|
X35680Y12872
|
||||||
|
X34080Y13372
|
||||||
|
X34680Y14272
|
||||||
|
X32480Y14672
|
||||||
|
X23080Y21772
|
||||||
|
X23980Y24472
|
||||||
|
X19680Y26572
|
||||||
|
X20780Y28172
|
||||||
|
X24480Y30272
|
||||||
|
X24480Y30972
|
||||||
|
X25380Y33172
|
||||||
|
X34280Y29572
|
||||||
|
X31680Y28172
|
||||||
|
X30180Y26572
|
||||||
|
X25680Y27472
|
||||||
|
X17480Y23672
|
||||||
|
X10430Y26572
|
||||||
|
X8680Y28472
|
||||||
|
X9880Y29672
|
||||||
|
X12080Y30272
|
||||||
|
X13180Y29672
|
||||||
|
X13680Y29172
|
||||||
|
X10880Y31672
|
||||||
|
X8730Y33172
|
||||||
|
X4880Y33072
|
||||||
|
X3680Y29272
|
||||||
|
X4230Y26322
|
||||||
|
X10130Y23722
|
||||||
|
X7280Y20772
|
||||||
|
X7280Y19772
|
||||||
|
X13980Y32772
|
||||||
|
X14480Y33272
|
||||||
|
X36680Y34572
|
||||||
|
X37020Y34112
|
||||||
|
X38080Y33672
|
||||||
|
X40820Y31592
|
||||||
|
X42280Y30772
|
||||||
|
T02
|
||||||
|
X8680Y8872
|
||||||
|
X7680Y8872
|
||||||
|
X5680Y8872
|
||||||
|
X4680Y8872
|
||||||
|
T03
|
||||||
|
X10070Y4372
|
||||||
|
X8180Y3191
|
||||||
|
T04
|
||||||
|
X34180Y15872
|
||||||
|
X35180Y15872
|
||||||
|
X36180Y15872
|
||||||
|
X37180Y15872
|
||||||
|
X38180Y15872
|
||||||
|
X39180Y15872
|
||||||
|
X40180Y15872
|
||||||
|
X41180Y15872
|
||||||
|
X44680Y15872
|
||||||
|
X45680Y15872
|
||||||
|
X46680Y15872
|
||||||
|
X47680Y15872
|
||||||
|
X48680Y15872
|
||||||
|
X49680Y15872
|
||||||
|
X50680Y15872
|
||||||
|
X51680Y15872
|
||||||
|
X55180Y15872
|
||||||
|
X56180Y15872
|
||||||
|
X57180Y15872
|
||||||
|
X58180Y15872
|
||||||
|
X59180Y15872
|
||||||
|
X60180Y15872
|
||||||
|
X61180Y15872
|
||||||
|
X62180Y15872
|
||||||
|
X62180Y18872
|
||||||
|
X61180Y18872
|
||||||
|
X60180Y18872
|
||||||
|
X59180Y18872
|
||||||
|
X58180Y18872
|
||||||
|
X57180Y18872
|
||||||
|
X56180Y18872
|
||||||
|
X55180Y18872
|
||||||
|
X51680Y18872
|
||||||
|
X50680Y18872
|
||||||
|
X49680Y18872
|
||||||
|
X48680Y18872
|
||||||
|
X47680Y18872
|
||||||
|
X46680Y18872
|
||||||
|
X45680Y18872
|
||||||
|
X44680Y18872
|
||||||
|
X41180Y18872
|
||||||
|
X40180Y18872
|
||||||
|
X39180Y18872
|
||||||
|
X38180Y18872
|
||||||
|
X37180Y18872
|
||||||
|
X36180Y18872
|
||||||
|
X35180Y18872
|
||||||
|
X34180Y18872
|
||||||
|
X34180Y22372
|
||||||
|
X35180Y22372
|
||||||
|
X36180Y22372
|
||||||
|
X37180Y22372
|
||||||
|
X38180Y22372
|
||||||
|
X39180Y22372
|
||||||
|
X40180Y22372
|
||||||
|
X41180Y22372
|
||||||
|
X44680Y22372
|
||||||
|
X45680Y22372
|
||||||
|
X46680Y22372
|
||||||
|
X47680Y22372
|
||||||
|
X48680Y22372
|
||||||
|
X49680Y22372
|
||||||
|
X50680Y22372
|
||||||
|
X51680Y22372
|
||||||
|
X55180Y22372
|
||||||
|
X56180Y22372
|
||||||
|
X57180Y22372
|
||||||
|
X58180Y22372
|
||||||
|
X59180Y22372
|
||||||
|
X60180Y22372
|
||||||
|
X61180Y22372
|
||||||
|
X62180Y22372
|
||||||
|
X62180Y25372
|
||||||
|
X61180Y25372
|
||||||
|
X60180Y25372
|
||||||
|
X59180Y25372
|
||||||
|
X58180Y25372
|
||||||
|
X57180Y25372
|
||||||
|
X56180Y25372
|
||||||
|
X55180Y25372
|
||||||
|
X51680Y25372
|
||||||
|
X50680Y25372
|
||||||
|
X49680Y25372
|
||||||
|
X48680Y25372
|
||||||
|
X47680Y25372
|
||||||
|
X46680Y25372
|
||||||
|
X45680Y25372
|
||||||
|
X44680Y25372
|
||||||
|
X41180Y25372
|
||||||
|
X40180Y25372
|
||||||
|
X39180Y25372
|
||||||
|
X38180Y25372
|
||||||
|
X37180Y25372
|
||||||
|
X36180Y25372
|
||||||
|
X35180Y25372
|
||||||
|
X34180Y25372
|
||||||
|
X30680Y25372
|
||||||
|
X29680Y25372
|
||||||
|
X28680Y25372
|
||||||
|
X27680Y25372
|
||||||
|
X26680Y25372
|
||||||
|
X25680Y25372
|
||||||
|
X24680Y25372
|
||||||
|
X23680Y25372
|
||||||
|
X20180Y25372
|
||||||
|
X19180Y25372
|
||||||
|
X18180Y25372
|
||||||
|
X17180Y25372
|
||||||
|
X16180Y25372
|
||||||
|
X15180Y25372
|
||||||
|
X14180Y25372
|
||||||
|
X13180Y25372
|
||||||
|
X9680Y25372
|
||||||
|
X8680Y25372
|
||||||
|
X7680Y25372
|
||||||
|
X6680Y25372
|
||||||
|
X5680Y25372
|
||||||
|
X4680Y25372
|
||||||
|
X3680Y25372
|
||||||
|
X2680Y25372
|
||||||
|
X2680Y22372
|
||||||
|
X3680Y22372
|
||||||
|
X4680Y22372
|
||||||
|
X5680Y22372
|
||||||
|
X6680Y22372
|
||||||
|
X7680Y22372
|
||||||
|
X8680Y22372
|
||||||
|
X9680Y22372
|
||||||
|
X13180Y22372
|
||||||
|
X14180Y22372
|
||||||
|
X15180Y22372
|
||||||
|
X16180Y22372
|
||||||
|
X17180Y22372
|
||||||
|
X18180Y22372
|
||||||
|
X19180Y22372
|
||||||
|
X20180Y22372
|
||||||
|
X23680Y22372
|
||||||
|
X24680Y22372
|
||||||
|
X25680Y22372
|
||||||
|
X26680Y22372
|
||||||
|
X27680Y22372
|
||||||
|
X28680Y22372
|
||||||
|
X29680Y22372
|
||||||
|
X30680Y22372
|
||||||
|
T05
|
||||||
|
X27680Y28684
|
||||||
|
X26663Y28935
|
||||||
|
X25880Y29629
|
||||||
|
X25508Y30608
|
||||||
|
X25635Y31648
|
||||||
|
X26229Y32509
|
||||||
|
X27156Y32996
|
||||||
|
X28204Y32996
|
||||||
|
X29131Y32509
|
||||||
|
X29725Y31648
|
||||||
|
X29852Y30608
|
||||||
|
X29480Y29629
|
||||||
|
X28697Y28935
|
||||||
|
X35008Y30608
|
||||||
|
X35380Y29629
|
||||||
|
X36163Y28935
|
||||||
|
X37180Y28684
|
||||||
|
X38197Y28935
|
||||||
|
X38980Y29629
|
||||||
|
X39352Y30608
|
||||||
|
X39225Y31648
|
||||||
|
X38631Y32509
|
||||||
|
X37704Y32996
|
||||||
|
X36656Y32996
|
||||||
|
X35729Y32509
|
||||||
|
X35135Y31648
|
||||||
|
X46008Y30608
|
||||||
|
X46380Y29629
|
||||||
|
X47163Y28935
|
||||||
|
X48180Y28684
|
||||||
|
X49197Y28935
|
||||||
|
X49980Y29629
|
||||||
|
X50352Y30608
|
||||||
|
X50225Y31648
|
||||||
|
X49631Y32509
|
||||||
|
X48704Y32996
|
||||||
|
X47656Y32996
|
||||||
|
X46729Y32509
|
||||||
|
X46135Y31648
|
||||||
|
X55508Y30608
|
||||||
|
X55880Y29629
|
||||||
|
X56663Y28935
|
||||||
|
X57680Y28684
|
||||||
|
X58697Y28935
|
||||||
|
X59480Y29629
|
||||||
|
X59852Y30608
|
||||||
|
X59725Y31648
|
||||||
|
X59131Y32509
|
||||||
|
X58204Y32996
|
||||||
|
X57156Y32996
|
||||||
|
X56229Y32509
|
||||||
|
X55635Y31648
|
||||||
|
X18852Y30608
|
||||||
|
X18480Y29629
|
||||||
|
X17697Y28935
|
||||||
|
X16680Y28684
|
||||||
|
X15663Y28935
|
||||||
|
X14880Y29629
|
||||||
|
X14508Y30608
|
||||||
|
X14635Y31648
|
||||||
|
X15229Y32509
|
||||||
|
X16156Y32996
|
||||||
|
X17204Y32996
|
||||||
|
X18131Y32509
|
||||||
|
X18725Y31648
|
||||||
|
X9352Y30608
|
||||||
|
X8980Y29629
|
||||||
|
X8197Y28935
|
||||||
|
X7180Y28684
|
||||||
|
X6163Y28935
|
||||||
|
X5380Y29629
|
||||||
|
X5008Y30608
|
||||||
|
X5135Y31648
|
||||||
|
X5729Y32509
|
||||||
|
X6656Y32996
|
||||||
|
X7704Y32996
|
||||||
|
X8631Y32509
|
||||||
|
X9225Y31648
|
||||||
|
T06
|
||||||
|
X11680Y24872
|
||||||
|
X11680Y20872
|
||||||
|
X22180Y20872
|
||||||
|
X22180Y24872
|
||||||
|
X32680Y24872
|
||||||
|
X32680Y20872
|
||||||
|
X43180Y20872
|
||||||
|
X43180Y24872
|
||||||
|
X53680Y24872
|
||||||
|
X53680Y20872
|
||||||
|
X63680Y20872
|
||||||
|
X63680Y24872
|
||||||
|
X40180Y12372
|
||||||
|
X36180Y12372
|
||||||
|
X44680Y10372
|
||||||
|
X44680Y8872
|
||||||
|
X48680Y8872
|
||||||
|
X48680Y10372
|
||||||
|
T07
|
||||||
|
X8180Y5553
|
||||||
|
T08
|
||||||
|
X14180Y6372
|
||||||
|
X7680Y11872
|
||||||
|
X6680Y11872
|
||||||
|
X5680Y11872
|
||||||
|
X14180Y17372
|
||||||
|
X30180Y17372
|
||||||
|
X37180Y13872
|
||||||
|
X38180Y13872
|
||||||
|
X39180Y13872
|
||||||
|
X44180Y13372
|
||||||
|
X45180Y13372
|
||||||
|
X46180Y13372
|
||||||
|
X47180Y13372
|
||||||
|
X48180Y13372
|
||||||
|
X49180Y13372
|
||||||
|
X50180Y13372
|
||||||
|
X51180Y13372
|
||||||
|
X52180Y13372
|
||||||
|
X53180Y13372
|
||||||
|
X54180Y13372
|
||||||
|
X55180Y13372
|
||||||
|
X59180Y11372
|
||||||
|
X59180Y10372
|
||||||
|
X59180Y9372
|
||||||
|
X61290Y9652
|
||||||
|
X63070Y9652
|
||||||
|
X63070Y11092
|
||||||
|
X61290Y11092
|
||||||
|
X61290Y13652
|
||||||
|
X63070Y13652
|
||||||
|
X55180Y7372
|
||||||
|
X54180Y7372
|
||||||
|
X53180Y7372
|
||||||
|
X52180Y7372
|
||||||
|
X51180Y7372
|
||||||
|
X50180Y7372
|
||||||
|
X49180Y7372
|
||||||
|
X48180Y7372
|
||||||
|
X47180Y7372
|
||||||
|
X46180Y7372
|
||||||
|
X45180Y7372
|
||||||
|
X44180Y7372
|
||||||
|
X40680Y9872
|
||||||
|
X39680Y9872
|
||||||
|
X38680Y9872
|
||||||
|
X37680Y9872
|
||||||
|
X36680Y9872
|
||||||
|
X30180Y6372
|
||||||
|
X44680Y3372
|
||||||
|
X45680Y3372
|
||||||
|
X46680Y3372
|
||||||
|
X50680Y8622
|
||||||
|
X51680Y8622
|
||||||
|
X61290Y7092
|
||||||
|
X63070Y7092
|
||||||
|
T09
|
||||||
|
X6680Y17772
|
||||||
|
T10
|
||||||
|
X2180Y3872
|
||||||
|
X2180Y33872
|
||||||
|
X62680Y33872
|
||||||
|
X62680Y3872
|
||||||
|
M30
|
10
Modified Board/Osh Park/NixieClock.tcream.ger
Normal file
10
Modified Board/Osh Park/NixieClock.tcream.ger
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
G75*
|
||||||
|
%MOIN*%
|
||||||
|
%OFA0B0*%
|
||||||
|
%FSLAX24Y24*%
|
||||||
|
%IPPOS*%
|
||||||
|
%LPD*%
|
||||||
|
%AMOC8*
|
||||||
|
5,1,8,0,0,1.08239X$1,22.5*
|
||||||
|
%
|
||||||
|
M02*
|
36
Modified Board/Osh Park/NixieClock.tcream.gpi
Normal file
36
Modified Board/Osh Park/NixieClock.tcream.gpi
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
Generated by EAGLE CAM Processor 6.5.0
|
||||||
|
|
||||||
|
Photoplotter Info File: /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.tcream.gpi
|
||||||
|
|
||||||
|
Date : 8/19/14 10:43 AM
|
||||||
|
Plotfile : /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.tcream.ger
|
||||||
|
Apertures : generated:
|
||||||
|
Device : Gerber RS-274-X photoplotter, coordinate format 2.4 inch
|
||||||
|
|
||||||
|
Parameter settings:
|
||||||
|
|
||||||
|
Emulate Apertures : no
|
||||||
|
Tolerance Draw + : 0.00 %
|
||||||
|
Tolerance Draw - : 0.00 %
|
||||||
|
Tolerance Flash + : 0.00 %
|
||||||
|
Tolerance Flash - : 0.00 %
|
||||||
|
Rotate : no
|
||||||
|
Mirror : no
|
||||||
|
Optimize : yes
|
||||||
|
Auto fit : yes
|
||||||
|
OffsetX : 0inch
|
||||||
|
OffsetY : 0inch
|
||||||
|
|
||||||
|
Plotfile Info:
|
||||||
|
|
||||||
|
Coordinate Format : 2.4
|
||||||
|
Coordinate Units : Inch
|
||||||
|
Data Mode : Absolute
|
||||||
|
Zero Suppression : None
|
||||||
|
End Of Block : *
|
||||||
|
|
||||||
|
Apertures used:
|
||||||
|
|
||||||
|
Code Shape Size used
|
||||||
|
|
||||||
|
|
11662
Modified Board/Osh Park/NixieClock.toplayer.ger
Normal file
11662
Modified Board/Osh Park/NixieClock.toplayer.ger
Normal file
File diff suppressed because it is too large
Load Diff
48
Modified Board/Osh Park/NixieClock.toplayer.gpi
Normal file
48
Modified Board/Osh Park/NixieClock.toplayer.gpi
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
Generated by EAGLE CAM Processor 6.5.0
|
||||||
|
|
||||||
|
Photoplotter Info File: /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.toplayer.gpi
|
||||||
|
|
||||||
|
Date : 8/19/14 10:43 AM
|
||||||
|
Plotfile : /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.toplayer.ger
|
||||||
|
Apertures : generated:
|
||||||
|
Device : Gerber RS-274-X photoplotter, coordinate format 2.4 inch
|
||||||
|
|
||||||
|
Parameter settings:
|
||||||
|
|
||||||
|
Emulate Apertures : no
|
||||||
|
Tolerance Draw + : 0.00 %
|
||||||
|
Tolerance Draw - : 0.00 %
|
||||||
|
Tolerance Flash + : 0.00 %
|
||||||
|
Tolerance Flash - : 0.00 %
|
||||||
|
Rotate : no
|
||||||
|
Mirror : no
|
||||||
|
Optimize : yes
|
||||||
|
Auto fit : yes
|
||||||
|
OffsetX : 0inch
|
||||||
|
OffsetY : 0inch
|
||||||
|
|
||||||
|
Plotfile Info:
|
||||||
|
|
||||||
|
Coordinate Format : 2.4
|
||||||
|
Coordinate Units : Inch
|
||||||
|
Data Mode : Absolute
|
||||||
|
Zero Suppression : None
|
||||||
|
End Of Block : *
|
||||||
|
|
||||||
|
Apertures used:
|
||||||
|
|
||||||
|
Code Shape Size used
|
||||||
|
|
||||||
|
D10 round 0.0740inch 66
|
||||||
|
D11 draw 0.0560inch 144
|
||||||
|
D12 draw 0.0640inch 6
|
||||||
|
D13 square 0.0650inch 2
|
||||||
|
D14 round 0.0650inch 2
|
||||||
|
D15 square 0.0740inch 1
|
||||||
|
D16 draw 0.0860inch 29
|
||||||
|
D17 round 0.0571inch 78
|
||||||
|
D18 round 0.2300inch 4
|
||||||
|
D19 draw 0.0120inch 212
|
||||||
|
D20 round 0.0400inch 83
|
||||||
|
D21 draw 0.0160inch 7480
|
||||||
|
|
4853
Modified Board/Osh Park/NixieClock.topsilkscreen.ger
Normal file
4853
Modified Board/Osh Park/NixieClock.topsilkscreen.ger
Normal file
File diff suppressed because it is too large
Load Diff
49
Modified Board/Osh Park/NixieClock.topsilkscreen.gpi
Normal file
49
Modified Board/Osh Park/NixieClock.topsilkscreen.gpi
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
Generated by EAGLE CAM Processor 6.5.0
|
||||||
|
|
||||||
|
Photoplotter Info File: /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.topsilkscreen.gpi
|
||||||
|
|
||||||
|
Date : 8/19/14 10:43 AM
|
||||||
|
Plotfile : /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.topsilkscreen.ger
|
||||||
|
Apertures : generated:
|
||||||
|
Device : Gerber RS-274-X photoplotter, coordinate format 2.4 inch
|
||||||
|
|
||||||
|
Parameter settings:
|
||||||
|
|
||||||
|
Emulate Apertures : no
|
||||||
|
Tolerance Draw + : 0.00 %
|
||||||
|
Tolerance Draw - : 0.00 %
|
||||||
|
Tolerance Flash + : 0.00 %
|
||||||
|
Tolerance Flash - : 0.00 %
|
||||||
|
Rotate : no
|
||||||
|
Mirror : no
|
||||||
|
Optimize : yes
|
||||||
|
Auto fit : yes
|
||||||
|
OffsetX : 0inch
|
||||||
|
OffsetY : 0inch
|
||||||
|
|
||||||
|
Plotfile Info:
|
||||||
|
|
||||||
|
Coordinate Format : 2.4
|
||||||
|
Coordinate Units : Inch
|
||||||
|
Data Mode : Absolute
|
||||||
|
Zero Suppression : None
|
||||||
|
End Of Block : *
|
||||||
|
|
||||||
|
Apertures used:
|
||||||
|
|
||||||
|
Code Shape Size used
|
||||||
|
|
||||||
|
D10 draw 0.0000inch 5
|
||||||
|
D11 draw 0.0030inch 44
|
||||||
|
D12 draw 0.0040inch 299
|
||||||
|
D13 draw 0.0080inch 110
|
||||||
|
D14 draw 0.0050inch 497
|
||||||
|
D15 draw 0.0060inch 73
|
||||||
|
D16 draw 0.0120inch 18
|
||||||
|
D17 draw 0.0020inch 4
|
||||||
|
D18 draw 0.0070inch 43
|
||||||
|
D19 rectangle 0.0500inch x 0.0350inch 3
|
||||||
|
D20 draw 0.0010inch 23
|
||||||
|
D21 draw 0.0039inch 33
|
||||||
|
D22 draw 0.0100inch 12
|
||||||
|
|
490
Modified Board/Osh Park/NixieClock.topsoldermask.ger
Normal file
490
Modified Board/Osh Park/NixieClock.topsoldermask.ger
Normal file
@ -0,0 +1,490 @@
|
|||||||
|
G75*
|
||||||
|
%MOIN*%
|
||||||
|
%OFA0B0*%
|
||||||
|
%FSLAX24Y24*%
|
||||||
|
%IPPOS*%
|
||||||
|
%LPD*%
|
||||||
|
%AMOC8*
|
||||||
|
5,1,8,0,0,1.08239X$1,22.5*
|
||||||
|
%
|
||||||
|
%ADD10C,0.0820*%
|
||||||
|
%ADD11C,0.0640*%
|
||||||
|
%ADD12C,0.0720*%
|
||||||
|
%ADD13C,0.1380*%
|
||||||
|
%ADD14R,0.0730X0.0730*%
|
||||||
|
%ADD15C,0.0730*%
|
||||||
|
%ADD16R,0.0820X0.0820*%
|
||||||
|
%ADD17C,0.0940*%
|
||||||
|
%ADD18C,0.0651*%
|
||||||
|
%ADD19C,0.2380*%
|
||||||
|
D10*
|
||||||
|
X014180Y006372D03*
|
||||||
|
X030180Y006372D03*
|
||||||
|
X036680Y009872D03*
|
||||||
|
X037680Y009872D03*
|
||||||
|
X038680Y009872D03*
|
||||||
|
X039680Y009872D03*
|
||||||
|
X040680Y009872D03*
|
||||||
|
X044680Y010372D03*
|
||||||
|
X044680Y008872D03*
|
||||||
|
X044180Y007372D03*
|
||||||
|
X045180Y007372D03*
|
||||||
|
X046180Y007372D03*
|
||||||
|
X047180Y007372D03*
|
||||||
|
X048180Y007372D03*
|
||||||
|
X049180Y007372D03*
|
||||||
|
X050180Y007372D03*
|
||||||
|
X051180Y007372D03*
|
||||||
|
X052180Y007372D03*
|
||||||
|
X053180Y007372D03*
|
||||||
|
X054180Y007372D03*
|
||||||
|
X055180Y007372D03*
|
||||||
|
X051680Y008622D03*
|
||||||
|
X050680Y008622D03*
|
||||||
|
X048680Y008872D03*
|
||||||
|
X048680Y010372D03*
|
||||||
|
X048180Y013372D03*
|
||||||
|
X049180Y013372D03*
|
||||||
|
X050180Y013372D03*
|
||||||
|
X051180Y013372D03*
|
||||||
|
X052180Y013372D03*
|
||||||
|
X053180Y013372D03*
|
||||||
|
X054180Y013372D03*
|
||||||
|
X055180Y013372D03*
|
||||||
|
X059180Y011372D03*
|
||||||
|
X059180Y010372D03*
|
||||||
|
X059180Y009372D03*
|
||||||
|
X061290Y009652D03*
|
||||||
|
X063070Y009652D03*
|
||||||
|
X063070Y011092D03*
|
||||||
|
X061290Y011092D03*
|
||||||
|
X061290Y013652D03*
|
||||||
|
X063070Y013652D03*
|
||||||
|
X063070Y007092D03*
|
||||||
|
X061290Y007092D03*
|
||||||
|
X047180Y013372D03*
|
||||||
|
X046180Y013372D03*
|
||||||
|
X045180Y013372D03*
|
||||||
|
X044180Y013372D03*
|
||||||
|
X040180Y012372D03*
|
||||||
|
X039180Y013872D03*
|
||||||
|
X038180Y013872D03*
|
||||||
|
X037180Y013872D03*
|
||||||
|
X036180Y012372D03*
|
||||||
|
X032680Y020872D03*
|
||||||
|
X032680Y024872D03*
|
||||||
|
X022180Y024872D03*
|
||||||
|
X022180Y020872D03*
|
||||||
|
X014180Y017372D03*
|
||||||
|
X011680Y020872D03*
|
||||||
|
X011680Y024872D03*
|
||||||
|
X043180Y024872D03*
|
||||||
|
X043180Y020872D03*
|
||||||
|
X053680Y020872D03*
|
||||||
|
X053680Y024872D03*
|
||||||
|
X063680Y024872D03*
|
||||||
|
X063680Y020872D03*
|
||||||
|
D11*
|
||||||
|
X062180Y022092D02*
|
||||||
|
X062180Y022652D01*
|
||||||
|
X061180Y022652D02*
|
||||||
|
X061180Y022092D01*
|
||||||
|
X060180Y022092D02*
|
||||||
|
X060180Y022652D01*
|
||||||
|
X059180Y022652D02*
|
||||||
|
X059180Y022092D01*
|
||||||
|
X058180Y022092D02*
|
||||||
|
X058180Y022652D01*
|
||||||
|
X057180Y022652D02*
|
||||||
|
X057180Y022092D01*
|
||||||
|
X056180Y022092D02*
|
||||||
|
X056180Y022652D01*
|
||||||
|
X055180Y022652D02*
|
||||||
|
X055180Y022092D01*
|
||||||
|
X051680Y022092D02*
|
||||||
|
X051680Y022652D01*
|
||||||
|
X050680Y022652D02*
|
||||||
|
X050680Y022092D01*
|
||||||
|
X049680Y022092D02*
|
||||||
|
X049680Y022652D01*
|
||||||
|
X048680Y022652D02*
|
||||||
|
X048680Y022092D01*
|
||||||
|
X047680Y022092D02*
|
||||||
|
X047680Y022652D01*
|
||||||
|
X046680Y022652D02*
|
||||||
|
X046680Y022092D01*
|
||||||
|
X045680Y022092D02*
|
||||||
|
X045680Y022652D01*
|
||||||
|
X044680Y022652D02*
|
||||||
|
X044680Y022092D01*
|
||||||
|
X041180Y022092D02*
|
||||||
|
X041180Y022652D01*
|
||||||
|
X040180Y022652D02*
|
||||||
|
X040180Y022092D01*
|
||||||
|
X039180Y022092D02*
|
||||||
|
X039180Y022652D01*
|
||||||
|
X038180Y022652D02*
|
||||||
|
X038180Y022092D01*
|
||||||
|
X037180Y022092D02*
|
||||||
|
X037180Y022652D01*
|
||||||
|
X036180Y022652D02*
|
||||||
|
X036180Y022092D01*
|
||||||
|
X035180Y022092D02*
|
||||||
|
X035180Y022652D01*
|
||||||
|
X034180Y022652D02*
|
||||||
|
X034180Y022092D01*
|
||||||
|
X030680Y022092D02*
|
||||||
|
X030680Y022652D01*
|
||||||
|
X029680Y022652D02*
|
||||||
|
X029680Y022092D01*
|
||||||
|
X028680Y022092D02*
|
||||||
|
X028680Y022652D01*
|
||||||
|
X027680Y022652D02*
|
||||||
|
X027680Y022092D01*
|
||||||
|
X026680Y022092D02*
|
||||||
|
X026680Y022652D01*
|
||||||
|
X025680Y022652D02*
|
||||||
|
X025680Y022092D01*
|
||||||
|
X024680Y022092D02*
|
||||||
|
X024680Y022652D01*
|
||||||
|
X023680Y022652D02*
|
||||||
|
X023680Y022092D01*
|
||||||
|
X020180Y022092D02*
|
||||||
|
X020180Y022652D01*
|
||||||
|
X019180Y022652D02*
|
||||||
|
X019180Y022092D01*
|
||||||
|
X018180Y022092D02*
|
||||||
|
X018180Y022652D01*
|
||||||
|
X017180Y022652D02*
|
||||||
|
X017180Y022092D01*
|
||||||
|
X016180Y022092D02*
|
||||||
|
X016180Y022652D01*
|
||||||
|
X015180Y022652D02*
|
||||||
|
X015180Y022092D01*
|
||||||
|
X014180Y022092D02*
|
||||||
|
X014180Y022652D01*
|
||||||
|
X013180Y022652D02*
|
||||||
|
X013180Y022092D01*
|
||||||
|
X009680Y022092D02*
|
||||||
|
X009680Y022652D01*
|
||||||
|
X008680Y022652D02*
|
||||||
|
X008680Y022092D01*
|
||||||
|
X007680Y022092D02*
|
||||||
|
X007680Y022652D01*
|
||||||
|
X006680Y022652D02*
|
||||||
|
X006680Y022092D01*
|
||||||
|
X005680Y022092D02*
|
||||||
|
X005680Y022652D01*
|
||||||
|
X004680Y022652D02*
|
||||||
|
X004680Y022092D01*
|
||||||
|
X003680Y022092D02*
|
||||||
|
X003680Y022652D01*
|
||||||
|
X002680Y022652D02*
|
||||||
|
X002680Y022092D01*
|
||||||
|
X002680Y025092D02*
|
||||||
|
X002680Y025652D01*
|
||||||
|
X003680Y025652D02*
|
||||||
|
X003680Y025092D01*
|
||||||
|
X004680Y025092D02*
|
||||||
|
X004680Y025652D01*
|
||||||
|
X005680Y025652D02*
|
||||||
|
X005680Y025092D01*
|
||||||
|
X006680Y025092D02*
|
||||||
|
X006680Y025652D01*
|
||||||
|
X007680Y025652D02*
|
||||||
|
X007680Y025092D01*
|
||||||
|
X008680Y025092D02*
|
||||||
|
X008680Y025652D01*
|
||||||
|
X009680Y025652D02*
|
||||||
|
X009680Y025092D01*
|
||||||
|
X013180Y025092D02*
|
||||||
|
X013180Y025652D01*
|
||||||
|
X014180Y025652D02*
|
||||||
|
X014180Y025092D01*
|
||||||
|
X015180Y025092D02*
|
||||||
|
X015180Y025652D01*
|
||||||
|
X016180Y025652D02*
|
||||||
|
X016180Y025092D01*
|
||||||
|
X017180Y025092D02*
|
||||||
|
X017180Y025652D01*
|
||||||
|
X018180Y025652D02*
|
||||||
|
X018180Y025092D01*
|
||||||
|
X019180Y025092D02*
|
||||||
|
X019180Y025652D01*
|
||||||
|
X020180Y025652D02*
|
||||||
|
X020180Y025092D01*
|
||||||
|
X023680Y025092D02*
|
||||||
|
X023680Y025652D01*
|
||||||
|
X024680Y025652D02*
|
||||||
|
X024680Y025092D01*
|
||||||
|
X025680Y025092D02*
|
||||||
|
X025680Y025652D01*
|
||||||
|
X026680Y025652D02*
|
||||||
|
X026680Y025092D01*
|
||||||
|
X027680Y025092D02*
|
||||||
|
X027680Y025652D01*
|
||||||
|
X028680Y025652D02*
|
||||||
|
X028680Y025092D01*
|
||||||
|
X029680Y025092D02*
|
||||||
|
X029680Y025652D01*
|
||||||
|
X030680Y025652D02*
|
||||||
|
X030680Y025092D01*
|
||||||
|
X034180Y025092D02*
|
||||||
|
X034180Y025652D01*
|
||||||
|
X035180Y025652D02*
|
||||||
|
X035180Y025092D01*
|
||||||
|
X036180Y025092D02*
|
||||||
|
X036180Y025652D01*
|
||||||
|
X037180Y025652D02*
|
||||||
|
X037180Y025092D01*
|
||||||
|
X038180Y025092D02*
|
||||||
|
X038180Y025652D01*
|
||||||
|
X039180Y025652D02*
|
||||||
|
X039180Y025092D01*
|
||||||
|
X040180Y025092D02*
|
||||||
|
X040180Y025652D01*
|
||||||
|
X041180Y025652D02*
|
||||||
|
X041180Y025092D01*
|
||||||
|
X044680Y025092D02*
|
||||||
|
X044680Y025652D01*
|
||||||
|
X045680Y025652D02*
|
||||||
|
X045680Y025092D01*
|
||||||
|
X046680Y025092D02*
|
||||||
|
X046680Y025652D01*
|
||||||
|
X047680Y025652D02*
|
||||||
|
X047680Y025092D01*
|
||||||
|
X048680Y025092D02*
|
||||||
|
X048680Y025652D01*
|
||||||
|
X049680Y025652D02*
|
||||||
|
X049680Y025092D01*
|
||||||
|
X050680Y025092D02*
|
||||||
|
X050680Y025652D01*
|
||||||
|
X051680Y025652D02*
|
||||||
|
X051680Y025092D01*
|
||||||
|
X055180Y025092D02*
|
||||||
|
X055180Y025652D01*
|
||||||
|
X056180Y025652D02*
|
||||||
|
X056180Y025092D01*
|
||||||
|
X057180Y025092D02*
|
||||||
|
X057180Y025652D01*
|
||||||
|
X058180Y025652D02*
|
||||||
|
X058180Y025092D01*
|
||||||
|
X059180Y025092D02*
|
||||||
|
X059180Y025652D01*
|
||||||
|
X060180Y025652D02*
|
||||||
|
X060180Y025092D01*
|
||||||
|
X061180Y025092D02*
|
||||||
|
X061180Y025652D01*
|
||||||
|
X062180Y025652D02*
|
||||||
|
X062180Y025092D01*
|
||||||
|
X062180Y019152D02*
|
||||||
|
X062180Y018592D01*
|
||||||
|
X061180Y018592D02*
|
||||||
|
X061180Y019152D01*
|
||||||
|
X060180Y019152D02*
|
||||||
|
X060180Y018592D01*
|
||||||
|
X059180Y018592D02*
|
||||||
|
X059180Y019152D01*
|
||||||
|
X058180Y019152D02*
|
||||||
|
X058180Y018592D01*
|
||||||
|
X057180Y018592D02*
|
||||||
|
X057180Y019152D01*
|
||||||
|
X056180Y019152D02*
|
||||||
|
X056180Y018592D01*
|
||||||
|
X055180Y018592D02*
|
||||||
|
X055180Y019152D01*
|
||||||
|
X051680Y019152D02*
|
||||||
|
X051680Y018592D01*
|
||||||
|
X050680Y018592D02*
|
||||||
|
X050680Y019152D01*
|
||||||
|
X049680Y019152D02*
|
||||||
|
X049680Y018592D01*
|
||||||
|
X048680Y018592D02*
|
||||||
|
X048680Y019152D01*
|
||||||
|
X047680Y019152D02*
|
||||||
|
X047680Y018592D01*
|
||||||
|
X046680Y018592D02*
|
||||||
|
X046680Y019152D01*
|
||||||
|
X045680Y019152D02*
|
||||||
|
X045680Y018592D01*
|
||||||
|
X044680Y018592D02*
|
||||||
|
X044680Y019152D01*
|
||||||
|
X041180Y019152D02*
|
||||||
|
X041180Y018592D01*
|
||||||
|
X040180Y018592D02*
|
||||||
|
X040180Y019152D01*
|
||||||
|
X039180Y019152D02*
|
||||||
|
X039180Y018592D01*
|
||||||
|
X038180Y018592D02*
|
||||||
|
X038180Y019152D01*
|
||||||
|
X037180Y019152D02*
|
||||||
|
X037180Y018592D01*
|
||||||
|
X036180Y018592D02*
|
||||||
|
X036180Y019152D01*
|
||||||
|
X035180Y019152D02*
|
||||||
|
X035180Y018592D01*
|
||||||
|
X034180Y018592D02*
|
||||||
|
X034180Y019152D01*
|
||||||
|
X034180Y016152D02*
|
||||||
|
X034180Y015592D01*
|
||||||
|
X035180Y015592D02*
|
||||||
|
X035180Y016152D01*
|
||||||
|
X036180Y016152D02*
|
||||||
|
X036180Y015592D01*
|
||||||
|
X037180Y015592D02*
|
||||||
|
X037180Y016152D01*
|
||||||
|
X038180Y016152D02*
|
||||||
|
X038180Y015592D01*
|
||||||
|
X039180Y015592D02*
|
||||||
|
X039180Y016152D01*
|
||||||
|
X040180Y016152D02*
|
||||||
|
X040180Y015592D01*
|
||||||
|
X041180Y015592D02*
|
||||||
|
X041180Y016152D01*
|
||||||
|
X044680Y016152D02*
|
||||||
|
X044680Y015592D01*
|
||||||
|
X045680Y015592D02*
|
||||||
|
X045680Y016152D01*
|
||||||
|
X046680Y016152D02*
|
||||||
|
X046680Y015592D01*
|
||||||
|
X047680Y015592D02*
|
||||||
|
X047680Y016152D01*
|
||||||
|
X048680Y016152D02*
|
||||||
|
X048680Y015592D01*
|
||||||
|
X049680Y015592D02*
|
||||||
|
X049680Y016152D01*
|
||||||
|
X050680Y016152D02*
|
||||||
|
X050680Y015592D01*
|
||||||
|
X051680Y015592D02*
|
||||||
|
X051680Y016152D01*
|
||||||
|
X055180Y016152D02*
|
||||||
|
X055180Y015592D01*
|
||||||
|
X056180Y015592D02*
|
||||||
|
X056180Y016152D01*
|
||||||
|
X057180Y016152D02*
|
||||||
|
X057180Y015592D01*
|
||||||
|
X058180Y015592D02*
|
||||||
|
X058180Y016152D01*
|
||||||
|
X059180Y016152D02*
|
||||||
|
X059180Y015592D01*
|
||||||
|
X060180Y015592D02*
|
||||||
|
X060180Y016152D01*
|
||||||
|
X061180Y016152D02*
|
||||||
|
X061180Y015592D01*
|
||||||
|
X062180Y015592D02*
|
||||||
|
X062180Y016152D01*
|
||||||
|
D12*
|
||||||
|
X046680Y003692D02*
|
||||||
|
X046680Y003052D01*
|
||||||
|
X045680Y003052D02*
|
||||||
|
X045680Y003692D01*
|
||||||
|
X044680Y003692D02*
|
||||||
|
X044680Y003052D01*
|
||||||
|
X007680Y011552D02*
|
||||||
|
X007680Y012192D01*
|
||||||
|
X006680Y012192D02*
|
||||||
|
X006680Y011552D01*
|
||||||
|
X005680Y011552D02*
|
||||||
|
X005680Y012192D01*
|
||||||
|
D13*
|
||||||
|
X006680Y017772D03*
|
||||||
|
D14*
|
||||||
|
X004680Y008872D03*
|
||||||
|
X008680Y008872D03*
|
||||||
|
D15*
|
||||||
|
X007680Y008872D03*
|
||||||
|
X005680Y008872D03*
|
||||||
|
D16*
|
||||||
|
X030180Y017372D03*
|
||||||
|
D17*
|
||||||
|
X008610Y005553D02*
|
||||||
|
X007750Y005553D01*
|
||||||
|
X010070Y004802D02*
|
||||||
|
X010070Y003942D01*
|
||||||
|
X008610Y003191D02*
|
||||||
|
X007750Y003191D01*
|
||||||
|
D18*
|
||||||
|
X007180Y028684D03*
|
||||||
|
X008197Y028935D03*
|
||||||
|
X008980Y029629D03*
|
||||||
|
X009352Y030608D03*
|
||||||
|
X009225Y031648D03*
|
||||||
|
X008631Y032509D03*
|
||||||
|
X007704Y032996D03*
|
||||||
|
X006656Y032996D03*
|
||||||
|
X005729Y032509D03*
|
||||||
|
X005135Y031648D03*
|
||||||
|
X005008Y030608D03*
|
||||||
|
X005380Y029629D03*
|
||||||
|
X006163Y028935D03*
|
||||||
|
X014508Y030608D03*
|
||||||
|
X014880Y029629D03*
|
||||||
|
X015663Y028935D03*
|
||||||
|
X016680Y028684D03*
|
||||||
|
X017697Y028935D03*
|
||||||
|
X018480Y029629D03*
|
||||||
|
X018852Y030608D03*
|
||||||
|
X018725Y031648D03*
|
||||||
|
X018131Y032509D03*
|
||||||
|
X017204Y032996D03*
|
||||||
|
X016156Y032996D03*
|
||||||
|
X015229Y032509D03*
|
||||||
|
X014635Y031648D03*
|
||||||
|
X025508Y030608D03*
|
||||||
|
X025880Y029629D03*
|
||||||
|
X026663Y028935D03*
|
||||||
|
X027680Y028684D03*
|
||||||
|
X028697Y028935D03*
|
||||||
|
X029480Y029629D03*
|
||||||
|
X029852Y030608D03*
|
||||||
|
X029725Y031648D03*
|
||||||
|
X029131Y032509D03*
|
||||||
|
X028204Y032996D03*
|
||||||
|
X027156Y032996D03*
|
||||||
|
X026229Y032509D03*
|
||||||
|
X025635Y031648D03*
|
||||||
|
X035008Y030608D03*
|
||||||
|
X035380Y029629D03*
|
||||||
|
X036163Y028935D03*
|
||||||
|
X037180Y028684D03*
|
||||||
|
X038197Y028935D03*
|
||||||
|
X038980Y029629D03*
|
||||||
|
X039352Y030608D03*
|
||||||
|
X039225Y031648D03*
|
||||||
|
X038631Y032509D03*
|
||||||
|
X037704Y032996D03*
|
||||||
|
X036656Y032996D03*
|
||||||
|
X035729Y032509D03*
|
||||||
|
X035135Y031648D03*
|
||||||
|
X046008Y030608D03*
|
||||||
|
X046380Y029629D03*
|
||||||
|
X047163Y028935D03*
|
||||||
|
X048180Y028684D03*
|
||||||
|
X049197Y028935D03*
|
||||||
|
X049980Y029629D03*
|
||||||
|
X050352Y030608D03*
|
||||||
|
X050225Y031648D03*
|
||||||
|
X049631Y032509D03*
|
||||||
|
X048704Y032996D03*
|
||||||
|
X047656Y032996D03*
|
||||||
|
X046729Y032509D03*
|
||||||
|
X046135Y031648D03*
|
||||||
|
X055508Y030608D03*
|
||||||
|
X055880Y029629D03*
|
||||||
|
X056663Y028935D03*
|
||||||
|
X057680Y028684D03*
|
||||||
|
X058697Y028935D03*
|
||||||
|
X059480Y029629D03*
|
||||||
|
X059852Y030608D03*
|
||||||
|
X059725Y031648D03*
|
||||||
|
X059131Y032509D03*
|
||||||
|
X058204Y032996D03*
|
||||||
|
X057156Y032996D03*
|
||||||
|
X056229Y032509D03*
|
||||||
|
X055635Y031648D03*
|
||||||
|
D19*
|
||||||
|
X002180Y003872D03*
|
||||||
|
X002180Y033872D03*
|
||||||
|
X062680Y033872D03*
|
||||||
|
X062680Y003872D03*
|
||||||
|
M02*
|
46
Modified Board/Osh Park/NixieClock.topsoldermask.gpi
Normal file
46
Modified Board/Osh Park/NixieClock.topsoldermask.gpi
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
Generated by EAGLE CAM Processor 6.5.0
|
||||||
|
|
||||||
|
Photoplotter Info File: /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.topsoldermask.gpi
|
||||||
|
|
||||||
|
Date : 8/19/14 10:43 AM
|
||||||
|
Plotfile : /Users/grmrgecko/Desktop/NixieClock/Modified Board/NixieClock.topsoldermask.ger
|
||||||
|
Apertures : generated:
|
||||||
|
Device : Gerber RS-274-X photoplotter, coordinate format 2.4 inch
|
||||||
|
|
||||||
|
Parameter settings:
|
||||||
|
|
||||||
|
Emulate Apertures : no
|
||||||
|
Tolerance Draw + : 0.00 %
|
||||||
|
Tolerance Draw - : 0.00 %
|
||||||
|
Tolerance Flash + : 0.00 %
|
||||||
|
Tolerance Flash - : 0.00 %
|
||||||
|
Rotate : no
|
||||||
|
Mirror : no
|
||||||
|
Optimize : yes
|
||||||
|
Auto fit : yes
|
||||||
|
OffsetX : 0inch
|
||||||
|
OffsetY : 0inch
|
||||||
|
|
||||||
|
Plotfile Info:
|
||||||
|
|
||||||
|
Coordinate Format : 2.4
|
||||||
|
Coordinate Units : Inch
|
||||||
|
Data Mode : Absolute
|
||||||
|
Zero Suppression : None
|
||||||
|
End Of Block : *
|
||||||
|
|
||||||
|
Apertures used:
|
||||||
|
|
||||||
|
Code Shape Size used
|
||||||
|
|
||||||
|
D10 round 0.0820inch 66
|
||||||
|
D11 draw 0.0640inch 144
|
||||||
|
D12 draw 0.0720inch 6
|
||||||
|
D13 round 0.1380inch 1
|
||||||
|
D14 square 0.0730inch 2
|
||||||
|
D15 round 0.0730inch 2
|
||||||
|
D16 square 0.0820inch 1
|
||||||
|
D17 draw 0.0940inch 3
|
||||||
|
D18 round 0.0651inch 78
|
||||||
|
D19 round 0.2380inch 4
|
||||||
|
|
BIN
Modified Board/bottom.png
Normal file
BIN
Modified Board/bottom.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 41 KiB |
BIN
Modified Board/top.png
Normal file
BIN
Modified Board/top.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 53 KiB |
2551
Original Board/NixieClock.brd
Normal file
2551
Original Board/NixieClock.brd
Normal file
File diff suppressed because it is too large
Load Diff
4689
Original Board/NixieClock.sch
Normal file
4689
Original Board/NixieClock.sch
Normal file
File diff suppressed because it is too large
Load Diff
16
Readme.md
Normal file
16
Readme.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#Nixie Tube Clock - Arduino Controlled Clock
|
||||||
|
|
||||||
|
I don't have any fun names to put on this project, I haven't thought of one... If you have one, email me.
|
||||||
|
|
||||||
|
All details has not been written out, but you can piece together things by going to my blog at http://mrgecko.org and viewing images and docs here.
|
||||||
|
|
||||||
|
You would want to use Modified Board to print as I include the needed gerber files and also it has pin outs for power which is useful for adding the bluetooth board.
|
||||||
|
|
||||||
|
Many of the parts used is available at https://www.sparkfun.com/wish_lists/83348 I recommend buying the needed resistors from some place where you can order them individually.
|
||||||
|
|
||||||
|
To get nixie tubes, I recommend you go on ebay and search for "Nixie Tube IN 14" without quotes.
|
||||||
|
|
||||||
|
Power Supply can be ordered from http://www.allspectrum.com/store/nixie-power-supply-high-voltage-switch-mode-dc-dc-converter-kit-95-190vdc-25ma-180vdc-p-521.html
|
||||||
|
The tube ICs can be purchased from http://www.allspectrum.com/store/74141-nixie-tube-driver-ic-russian-p-211.html, you will need 6.
|
||||||
|
|
||||||
|
Extended documents available at http://l.bitcasa.com/I-Jobs88
|
@ -0,0 +1,112 @@
|
|||||||
|
#include <OneWire.h>
|
||||||
|
|
||||||
|
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
|
||||||
|
//
|
||||||
|
// http://www.pjrc.com/teensy/td_libs_OneWire.html
|
||||||
|
//
|
||||||
|
// The DallasTemperature library can do all this work for you!
|
||||||
|
// http://milesburton.com/Dallas_Temperature_Control_Library
|
||||||
|
|
||||||
|
OneWire ds(10); // on pin 10 (a 4.7K resistor is necessary)
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
Serial.begin(9600);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void) {
|
||||||
|
byte i;
|
||||||
|
byte present = 0;
|
||||||
|
byte type_s;
|
||||||
|
byte data[12];
|
||||||
|
byte addr[8];
|
||||||
|
float celsius, fahrenheit;
|
||||||
|
|
||||||
|
if ( !ds.search(addr)) {
|
||||||
|
Serial.println("No more addresses.");
|
||||||
|
Serial.println();
|
||||||
|
ds.reset_search();
|
||||||
|
delay(250);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.print("ROM =");
|
||||||
|
for( i = 0; i < 8; i++) {
|
||||||
|
Serial.write(' ');
|
||||||
|
Serial.print(addr[i], HEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OneWire::crc8(addr, 7) != addr[7]) {
|
||||||
|
Serial.println("CRC is not valid!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
// the first ROM byte indicates which chip
|
||||||
|
switch (addr[0]) {
|
||||||
|
case 0x10:
|
||||||
|
Serial.println(" Chip = DS18S20"); // or old DS1820
|
||||||
|
type_s = 1;
|
||||||
|
break;
|
||||||
|
case 0x28:
|
||||||
|
Serial.println(" Chip = DS18B20");
|
||||||
|
type_s = 0;
|
||||||
|
break;
|
||||||
|
case 0x22:
|
||||||
|
Serial.println(" Chip = DS1822");
|
||||||
|
type_s = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Serial.println("Device is not a DS18x20 family device.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ds.reset();
|
||||||
|
ds.select(addr);
|
||||||
|
ds.write(0x44, 1); // start conversion, with parasite power on at the end
|
||||||
|
|
||||||
|
delay(1000); // maybe 750ms is enough, maybe not
|
||||||
|
// we might do a ds.depower() here, but the reset will take care of it.
|
||||||
|
|
||||||
|
present = ds.reset();
|
||||||
|
ds.select(addr);
|
||||||
|
ds.write(0xBE); // Read Scratchpad
|
||||||
|
|
||||||
|
Serial.print(" Data = ");
|
||||||
|
Serial.print(present, HEX);
|
||||||
|
Serial.print(" ");
|
||||||
|
for ( i = 0; i < 9; i++) { // we need 9 bytes
|
||||||
|
data[i] = ds.read();
|
||||||
|
Serial.print(data[i], HEX);
|
||||||
|
Serial.print(" ");
|
||||||
|
}
|
||||||
|
Serial.print(" CRC=");
|
||||||
|
Serial.print(OneWire::crc8(data, 8), HEX);
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
// Convert the data to actual temperature
|
||||||
|
// because the result is a 16 bit signed integer, it should
|
||||||
|
// be stored to an "int16_t" type, which is always 16 bits
|
||||||
|
// even when compiled on a 32 bit processor.
|
||||||
|
int16_t raw = (data[1] << 8) | data[0];
|
||||||
|
if (type_s) {
|
||||||
|
raw = raw << 3; // 9 bit resolution default
|
||||||
|
if (data[7] == 0x10) {
|
||||||
|
// "count remain" gives full 12 bit resolution
|
||||||
|
raw = (raw & 0xFFF0) + 12 - data[6];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
byte cfg = (data[4] & 0x60);
|
||||||
|
// at lower res, the low bits are undefined, so let's zero them
|
||||||
|
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
|
||||||
|
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
|
||||||
|
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
|
||||||
|
//// default is 12 bit resolution, 750 ms conversion time
|
||||||
|
}
|
||||||
|
celsius = (float)raw / 16.0;
|
||||||
|
fahrenheit = celsius * 1.8 + 32.0;
|
||||||
|
Serial.print(" Temperature = ");
|
||||||
|
Serial.print(celsius);
|
||||||
|
Serial.print(" Celsius, ");
|
||||||
|
Serial.print(fahrenheit);
|
||||||
|
Serial.println(" Fahrenheit");
|
||||||
|
}
|
@ -0,0 +1,77 @@
|
|||||||
|
#include <OneWire.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DS2408 8-Channel Addressable Switch
|
||||||
|
*
|
||||||
|
* Writte by Glenn Trewitt, glenn at trewitt dot org
|
||||||
|
*
|
||||||
|
* Some notes about the DS2408:
|
||||||
|
* - Unlike most input/output ports, the DS2408 doesn't have mode bits to
|
||||||
|
* set whether the pins are input or output. If you issue a read command,
|
||||||
|
* they're inputs. If you write to them, they're outputs.
|
||||||
|
* - For reading from a switch, you should use 10K pull-up resisters.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void PrintBytes(uint8_t* addr, uint8_t count, bool newline=0) {
|
||||||
|
for (uint8_t i = 0; i < count; i++) {
|
||||||
|
Serial.print(addr[i]>>4, HEX);
|
||||||
|
Serial.print(addr[i]&0x0f, HEX);
|
||||||
|
}
|
||||||
|
if (newline)
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReadAndReport(OneWire* net, uint8_t* addr) {
|
||||||
|
Serial.print(" Reading DS2408 ");
|
||||||
|
PrintBytes(addr, 8);
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
uint8_t buf[13]; // Put everything in the buffer so we can compute CRC easily.
|
||||||
|
buf[0] = 0xF0; // Read PIO Registers
|
||||||
|
buf[1] = 0x88; // LSB address
|
||||||
|
buf[2] = 0x00; // MSB address
|
||||||
|
net->write_bytes(buf, 3);
|
||||||
|
net->read_bytes(buf+3, 10); // 3 cmd bytes, 6 data bytes, 2 0xFF, 2 CRC16
|
||||||
|
net->reset();
|
||||||
|
|
||||||
|
if (!OneWire::check_crc16(buf, 11, &buf[11])) {
|
||||||
|
Serial.print("CRC failure in DS2408 at ");
|
||||||
|
PrintBytes(addr, 8, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Serial.print(" DS2408 data = ");
|
||||||
|
// First 3 bytes contain command, register address.
|
||||||
|
Serial.println(buf[3], BIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
OneWire net(10); // on pin 10
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
Serial.begin(9600);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void) {
|
||||||
|
byte i;
|
||||||
|
byte present = 0;
|
||||||
|
byte addr[8];
|
||||||
|
|
||||||
|
if (!net.search(addr)) {
|
||||||
|
Serial.print("No more addresses.\n");
|
||||||
|
net.reset_search();
|
||||||
|
delay(1000);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OneWire::crc8(addr, 7) != addr[7]) {
|
||||||
|
Serial.print("CRC is not valid!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addr[0] != 0x29) {
|
||||||
|
PrintBytes(addr, 8);
|
||||||
|
Serial.print(" is not a DS2408.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReadAndReport(&net, addr);
|
||||||
|
}
|
@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
DS250x add-only programmable memory reader w/SKIP ROM.
|
||||||
|
|
||||||
|
The DS250x is a 512/1024bit add-only PROM(you can add data but cannot change the old one) that's used mainly for device identification purposes
|
||||||
|
like serial number, mfgr data, unique identifiers, etc. It uses the Maxim 1-wire bus.
|
||||||
|
|
||||||
|
This sketch will use the SKIP ROM function that skips the 1-Wire search phase since we only have one device connected in the bus on digital pin 6.
|
||||||
|
If more than one device is connected to the bus, it will fail.
|
||||||
|
Sketch will not verify if device connected is from the DS250x family since the skip rom function effectively skips the family-id byte readout.
|
||||||
|
thus it is possible to run this sketch with any Maxim OneWire device in which case the command CRC will most likely fail.
|
||||||
|
Sketch will only read the first page of memory(32bits) starting from the lower address(0000h), if more than 1 device is present, then use the sketch with search functions.
|
||||||
|
Remember to put a 4.7K pullup resistor between pin 6 and +Vcc
|
||||||
|
|
||||||
|
To change the range or ammount of data to read, simply change the data array size, LSB/MSB addresses and for loop iterations
|
||||||
|
|
||||||
|
This example code is in the public domain and is provided AS-IS.
|
||||||
|
|
||||||
|
Built with Arduino 0022 and PJRC OneWire 2.0 library http://www.pjrc.com/teensy/td_libs_OneWire.html
|
||||||
|
|
||||||
|
created by Guillermo Lovato <glovato@gmail.com>
|
||||||
|
march/2011
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <OneWire.h>
|
||||||
|
OneWire ds(6); // OneWire bus on digital pin 6
|
||||||
|
void setup() {
|
||||||
|
Serial.begin (9600);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
byte i; // This is for the for loops
|
||||||
|
boolean present; // device present var
|
||||||
|
byte data[32]; // container for the data from device
|
||||||
|
byte leemem[3] = { // array with the commands to initiate a read, DS250x devices expect 3 bytes to start a read: command,LSB&MSB adresses
|
||||||
|
0xF0 , 0x00 , 0x00 }; // 0xF0 is the Read Data command, followed by 00h 00h as starting address(the beginning, 0000h)
|
||||||
|
byte ccrc; // Variable to store the command CRC
|
||||||
|
byte ccrc_calc;
|
||||||
|
|
||||||
|
present = ds.reset(); // OneWire bus reset, always needed to start operation on the bus, returns a 1/TRUE if there's a device present.
|
||||||
|
ds.skip(); // Skip ROM search
|
||||||
|
|
||||||
|
if (present == TRUE){ // We only try to read the data if there's a device present
|
||||||
|
Serial.println("DS250x device present");
|
||||||
|
ds.write(leemem[0],1); // Read data command, leave ghost power on
|
||||||
|
ds.write(leemem[1],1); // LSB starting address, leave ghost power on
|
||||||
|
ds.write(leemem[2],1); // MSB starting address, leave ghost power on
|
||||||
|
|
||||||
|
ccrc = ds.read(); // DS250x generates a CRC for the command we sent, we assign a read slot and store it's value
|
||||||
|
ccrc_calc = OneWire::crc8(leemem, 3); // We calculate the CRC of the commands we sent using the library function and store it
|
||||||
|
|
||||||
|
if ( ccrc_calc != ccrc) { // Then we compare it to the value the ds250x calculated, if it fails, we print debug messages and abort
|
||||||
|
Serial.println("Invalid command CRC!");
|
||||||
|
Serial.print("Calculated CRC:");
|
||||||
|
Serial.println(ccrc_calc,HEX); // HEX makes it easier to observe and compare
|
||||||
|
Serial.print("DS250x readback CRC:");
|
||||||
|
Serial.println(ccrc,HEX);
|
||||||
|
return; // Since CRC failed, we abort the rest of the loop and start over
|
||||||
|
}
|
||||||
|
Serial.println("Data is: "); // For the printout of the data
|
||||||
|
for ( i = 0; i < 32; i++) { // Now it's time to read the PROM data itself, each page is 32 bytes so we need 32 read commands
|
||||||
|
data[i] = ds.read(); // we store each read byte to a different position in the data array
|
||||||
|
Serial.print(data[i]); // printout in ASCII
|
||||||
|
Serial.print(" "); // blank space
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
delay(5000); // Delay so we don't saturate the serial output
|
||||||
|
}
|
||||||
|
else { // Nothing is connected in the bus
|
||||||
|
Serial.println("Nothing connected");
|
||||||
|
delay(3000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
102
Source Code/NixieClock/Examples/RTClib/datecalc/datecalc.ino
Executable file
102
Source Code/NixieClock/Examples/RTClib/datecalc/datecalc.ino
Executable file
@ -0,0 +1,102 @@
|
|||||||
|
// Simple date conversions and calculations
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include "RTClib.h"
|
||||||
|
|
||||||
|
void showDate(const char* txt, const DateTime& dt) {
|
||||||
|
Serial.print(txt);
|
||||||
|
Serial.print(' ');
|
||||||
|
Serial.print(dt.year(), DEC);
|
||||||
|
Serial.print('/');
|
||||||
|
Serial.print(dt.month(), DEC);
|
||||||
|
Serial.print('/');
|
||||||
|
Serial.print(dt.day(), DEC);
|
||||||
|
Serial.print(' ');
|
||||||
|
Serial.print(dt.hour(), DEC);
|
||||||
|
Serial.print(':');
|
||||||
|
Serial.print(dt.minute(), DEC);
|
||||||
|
Serial.print(':');
|
||||||
|
Serial.print(dt.second(), DEC);
|
||||||
|
|
||||||
|
Serial.print(" = ");
|
||||||
|
Serial.print(dt.unixtime());
|
||||||
|
Serial.print("s / ");
|
||||||
|
Serial.print(dt.unixtime() / 86400L);
|
||||||
|
Serial.print("d since 1970");
|
||||||
|
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void showTimeSpan(const char* txt, const TimeSpan& ts) {
|
||||||
|
Serial.print(txt);
|
||||||
|
Serial.print(" ");
|
||||||
|
Serial.print(ts.days(), DEC);
|
||||||
|
Serial.print(" days ");
|
||||||
|
Serial.print(ts.hours(), DEC);
|
||||||
|
Serial.print(" hours ");
|
||||||
|
Serial.print(ts.minutes(), DEC);
|
||||||
|
Serial.print(" minutes ");
|
||||||
|
Serial.print(ts.seconds(), DEC);
|
||||||
|
Serial.print(" seconds (");
|
||||||
|
Serial.print(ts.totalseconds(), DEC);
|
||||||
|
Serial.print(" total seconds)");
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup () {
|
||||||
|
Serial.begin(57600);
|
||||||
|
|
||||||
|
DateTime dt0 (0, 1, 1, 0, 0, 0);
|
||||||
|
showDate("dt0", dt0);
|
||||||
|
|
||||||
|
DateTime dt1 (1, 1, 1, 0, 0, 0);
|
||||||
|
showDate("dt1", dt1);
|
||||||
|
|
||||||
|
DateTime dt2 (2009, 1, 1, 0, 0, 0);
|
||||||
|
showDate("dt2", dt2);
|
||||||
|
|
||||||
|
DateTime dt3 (2009, 1, 2, 0, 0, 0);
|
||||||
|
showDate("dt3", dt3);
|
||||||
|
|
||||||
|
DateTime dt4 (2009, 1, 27, 0, 0, 0);
|
||||||
|
showDate("dt4", dt4);
|
||||||
|
|
||||||
|
DateTime dt5 (2009, 2, 27, 0, 0, 0);
|
||||||
|
showDate("dt5", dt5);
|
||||||
|
|
||||||
|
DateTime dt6 (2009, 12, 27, 0, 0, 0);
|
||||||
|
showDate("dt6", dt6);
|
||||||
|
|
||||||
|
DateTime dt7 (dt6.unixtime() + 3600); // One hour later.
|
||||||
|
showDate("dt7", dt7);
|
||||||
|
|
||||||
|
DateTime dt75 = dt6 + TimeSpan(0, 1, 0, 0); // One hour later with TimeSpan addition.
|
||||||
|
showDate("dt7.5", dt75);
|
||||||
|
|
||||||
|
DateTime dt8 (dt6.unixtime() + 86400L); // One day later.
|
||||||
|
showDate("dt8", dt8);
|
||||||
|
|
||||||
|
DateTime dt85 = dt6 + TimeSpan(1, 0, 0, 0); // One day later with TimeSpan addition.
|
||||||
|
showDate("dt8.5", dt85);
|
||||||
|
|
||||||
|
DateTime dt9 (dt6.unixtime() + 7 * 86400L); // One week later.
|
||||||
|
showDate("dt9", dt9);
|
||||||
|
|
||||||
|
DateTime dt95 = dt6 + TimeSpan(7, 0, 0, 0); // One week later with TimeSpan addition.
|
||||||
|
showDate("dt9.5", dt95);
|
||||||
|
|
||||||
|
DateTime dt10 = dt6 + TimeSpan(0, 0, 42, 42); // Fourty two minutes and fourty two seconds later.
|
||||||
|
showDate("dt10", dt10);
|
||||||
|
|
||||||
|
DateTime dt11 = dt6 - TimeSpan(7, 0, 0, 0); // One week ago.
|
||||||
|
showDate("dt11", dt11);
|
||||||
|
|
||||||
|
TimeSpan ts1 = dt6 - dt5;
|
||||||
|
showTimeSpan("dt6-dt5", ts1);
|
||||||
|
|
||||||
|
TimeSpan ts2 = dt10 - dt6;
|
||||||
|
showTimeSpan("dt10-dt6", ts2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop () {
|
||||||
|
}
|
68
Source Code/NixieClock/Examples/RTClib/ds1307/ds1307.ino
Executable file
68
Source Code/NixieClock/Examples/RTClib/ds1307/ds1307.ino
Executable file
@ -0,0 +1,68 @@
|
|||||||
|
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include "RTClib.h"
|
||||||
|
|
||||||
|
RTC_DS1307 rtc;
|
||||||
|
|
||||||
|
void setup () {
|
||||||
|
Serial.begin(57600);
|
||||||
|
#ifdef AVR
|
||||||
|
Wire.begin();
|
||||||
|
#else
|
||||||
|
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
|
||||||
|
#endif
|
||||||
|
rtc.begin();
|
||||||
|
|
||||||
|
if (! rtc.isrunning()) {
|
||||||
|
Serial.println("RTC is NOT running!");
|
||||||
|
// following line sets the RTC to the date & time this sketch was compiled
|
||||||
|
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
|
||||||
|
// This line sets the RTC with an explicit date & time, for example to set
|
||||||
|
// January 21, 2014 at 3am you would call:
|
||||||
|
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop () {
|
||||||
|
DateTime now = rtc.now();
|
||||||
|
|
||||||
|
Serial.print(now.year(), DEC);
|
||||||
|
Serial.print('/');
|
||||||
|
Serial.print(now.month(), DEC);
|
||||||
|
Serial.print('/');
|
||||||
|
Serial.print(now.day(), DEC);
|
||||||
|
Serial.print(' ');
|
||||||
|
Serial.print(now.hour(), DEC);
|
||||||
|
Serial.print(':');
|
||||||
|
Serial.print(now.minute(), DEC);
|
||||||
|
Serial.print(':');
|
||||||
|
Serial.print(now.second(), DEC);
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
Serial.print(" since midnight 1/1/1970 = ");
|
||||||
|
Serial.print(now.unixtime());
|
||||||
|
Serial.print("s = ");
|
||||||
|
Serial.print(now.unixtime() / 86400L);
|
||||||
|
Serial.println("d");
|
||||||
|
|
||||||
|
// calculate a date which is 7 days and 30 seconds into the future
|
||||||
|
DateTime future (now.unixtime() + 7 * 86400L + 30);
|
||||||
|
|
||||||
|
Serial.print(" now + 7d + 30s: ");
|
||||||
|
Serial.print(future.year(), DEC);
|
||||||
|
Serial.print('/');
|
||||||
|
Serial.print(future.month(), DEC);
|
||||||
|
Serial.print('/');
|
||||||
|
Serial.print(future.day(), DEC);
|
||||||
|
Serial.print(' ');
|
||||||
|
Serial.print(future.hour(), DEC);
|
||||||
|
Serial.print(':');
|
||||||
|
Serial.print(future.minute(), DEC);
|
||||||
|
Serial.print(':');
|
||||||
|
Serial.print(future.second(), DEC);
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
Serial.println();
|
||||||
|
delay(3000);
|
||||||
|
}
|
56
Source Code/NixieClock/Examples/RTClib/ds1307SqwPin/ds1307SqwPin.ino
Executable file
56
Source Code/NixieClock/Examples/RTClib/ds1307SqwPin/ds1307SqwPin.ino
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
// SQW/OUT pin mode using a DS1307 RTC connected via I2C.
|
||||||
|
//
|
||||||
|
// According to the data sheet (http://datasheets.maxim-ic.com/en/ds/DS1307.pdf), the
|
||||||
|
// DS1307's SQW/OUT pin can be set to low, high, 1Hz, 4.096kHz, 8.192kHz, or 32.768kHz.
|
||||||
|
//
|
||||||
|
// This sketch reads the state of the pin, then iterates through the possible values at
|
||||||
|
// 5 second intervals.
|
||||||
|
//
|
||||||
|
|
||||||
|
// NOTE:
|
||||||
|
// You must connect a pull up resistor (~10kohm) from the SQW pin up to VCC. Without
|
||||||
|
// this pull up the wave output will not work!
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include "RTClib.h"
|
||||||
|
|
||||||
|
RTC_DS1307 rtc;
|
||||||
|
|
||||||
|
int mode_index = 0;
|
||||||
|
|
||||||
|
Ds1307SqwPinMode modes[] = {OFF, ON, SquareWave1HZ, SquareWave4kHz, SquareWave8kHz, SquareWave32kHz};
|
||||||
|
|
||||||
|
|
||||||
|
void print_mode() {
|
||||||
|
Ds1307SqwPinMode mode = rtc.readSqwPinMode();
|
||||||
|
|
||||||
|
Serial.print("Sqw Pin Mode: ");
|
||||||
|
switch(mode) {
|
||||||
|
case OFF: Serial.println("OFF"); break;
|
||||||
|
case ON: Serial.println("ON"); break;
|
||||||
|
case SquareWave1HZ: Serial.println("1Hz"); break;
|
||||||
|
case SquareWave4kHz: Serial.println("4.096kHz"); break;
|
||||||
|
case SquareWave8kHz: Serial.println("8.192kHz"); break;
|
||||||
|
case SquareWave32kHz: Serial.println("32.768kHz"); break;
|
||||||
|
default: Serial.println("UNKNOWN"); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup () {
|
||||||
|
Serial.begin(57600);
|
||||||
|
Wire.begin();
|
||||||
|
rtc.begin();
|
||||||
|
|
||||||
|
print_mode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop () {
|
||||||
|
rtc.writeSqwPinMode(modes[mode_index++]);
|
||||||
|
print_mode();
|
||||||
|
|
||||||
|
if (mode_index > 5) {
|
||||||
|
mode_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
delay(5000);
|
||||||
|
}
|
59
Source Code/NixieClock/Examples/RTClib/ds1307nvram/ds1307nvram.ino
Executable file
59
Source Code/NixieClock/Examples/RTClib/ds1307nvram/ds1307nvram.ino
Executable file
@ -0,0 +1,59 @@
|
|||||||
|
// Example of using the non-volatile RAM storage on the DS1307.
|
||||||
|
// You can write up to 56 bytes from address 0 to 55.
|
||||||
|
// Data will be persisted as long as the DS1307 has battery power.
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include "RTClib.h"
|
||||||
|
|
||||||
|
RTC_DS1307 rtc;
|
||||||
|
|
||||||
|
void printnvram(uint8_t address) {
|
||||||
|
Serial.print("Address 0x");
|
||||||
|
Serial.print(address, HEX);
|
||||||
|
Serial.print(" = 0x");
|
||||||
|
Serial.println(rtc.readnvram(address), HEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup () {
|
||||||
|
Serial.begin(57600);
|
||||||
|
#ifdef AVR
|
||||||
|
Wire.begin();
|
||||||
|
#else
|
||||||
|
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
|
||||||
|
#endif
|
||||||
|
rtc.begin();
|
||||||
|
|
||||||
|
// Print old RAM contents on startup.
|
||||||
|
Serial.println("Current NVRAM values:");
|
||||||
|
for (int i = 0; i < 6; ++i) {
|
||||||
|
printnvram(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write some bytes to non-volatile RAM storage.
|
||||||
|
// NOTE: You can only read and write from addresses 0 to 55 (i.e. 56 byte values).
|
||||||
|
Serial.println("Writing NVRAM values.");
|
||||||
|
// Example writing one byte at a time:
|
||||||
|
rtc.writenvram(0, 0xFE);
|
||||||
|
rtc.writenvram(1, 0xED);
|
||||||
|
// Example writing multiple bytes:
|
||||||
|
uint8_t writeData[4] = { 0xBE, 0xEF, 0x01, 0x02 };
|
||||||
|
rtc.writenvram(2, writeData, 4);
|
||||||
|
|
||||||
|
// Read bytes from non-volatile RAM storage.
|
||||||
|
Serial.println("Reading NVRAM values:");
|
||||||
|
// Example reading one byte at a time.
|
||||||
|
Serial.println(rtc.readnvram(0), HEX);
|
||||||
|
Serial.println(rtc.readnvram(1), HEX);
|
||||||
|
// Example reading multiple bytes:
|
||||||
|
uint8_t readData[4] = {0};
|
||||||
|
rtc.readnvram(readData, 4, 2);
|
||||||
|
Serial.println(readData[0], HEX);
|
||||||
|
Serial.println(readData[1], HEX);
|
||||||
|
Serial.println(readData[2], HEX);
|
||||||
|
Serial.println(readData[3], HEX);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop () {
|
||||||
|
// Do nothing in the loop.
|
||||||
|
}
|
55
Source Code/NixieClock/Examples/RTClib/softrtc/softrtc.ino
Executable file
55
Source Code/NixieClock/Examples/RTClib/softrtc/softrtc.ino
Executable file
@ -0,0 +1,55 @@
|
|||||||
|
// Date and time functions using just software, based on millis() & timer
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include "RTClib.h"
|
||||||
|
|
||||||
|
RTC_Millis rtc;
|
||||||
|
|
||||||
|
void setup () {
|
||||||
|
Serial.begin(57600);
|
||||||
|
// following line sets the RTC to the date & time this sketch was compiled
|
||||||
|
rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
|
||||||
|
// This line sets the RTC with an explicit date & time, for example to set
|
||||||
|
// January 21, 2014 at 3am you would call:
|
||||||
|
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop () {
|
||||||
|
DateTime now = rtc.now();
|
||||||
|
|
||||||
|
Serial.print(now.year(), DEC);
|
||||||
|
Serial.print('/');
|
||||||
|
Serial.print(now.month(), DEC);
|
||||||
|
Serial.print('/');
|
||||||
|
Serial.print(now.day(), DEC);
|
||||||
|
Serial.print(' ');
|
||||||
|
Serial.print(now.hour(), DEC);
|
||||||
|
Serial.print(':');
|
||||||
|
Serial.print(now.minute(), DEC);
|
||||||
|
Serial.print(':');
|
||||||
|
Serial.print(now.second(), DEC);
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
Serial.print(" seconds since 1970: ");
|
||||||
|
Serial.println(now.unixtime());
|
||||||
|
|
||||||
|
// calculate a date which is 7 days and 30 seconds into the future
|
||||||
|
DateTime future (now.unixtime() + 7 * 86400L + 30);
|
||||||
|
|
||||||
|
Serial.print(" now + 7d + 30s: ");
|
||||||
|
Serial.print(future.year(), DEC);
|
||||||
|
Serial.print('/');
|
||||||
|
Serial.print(future.month(), DEC);
|
||||||
|
Serial.print('/');
|
||||||
|
Serial.print(future.day(), DEC);
|
||||||
|
Serial.print(' ');
|
||||||
|
Serial.print(future.hour(), DEC);
|
||||||
|
Serial.print(':');
|
||||||
|
Serial.print(future.minute(), DEC);
|
||||||
|
Serial.print(':');
|
||||||
|
Serial.print(future.second(), DEC);
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
Serial.println();
|
||||||
|
delay(3000);
|
||||||
|
}
|
265
Source Code/NixieClock/NixieClock.ino
Normal file
265
Source Code/NixieClock/NixieClock.ino
Normal file
@ -0,0 +1,265 @@
|
|||||||
|
//
|
||||||
|
// Nixie Clock.ino
|
||||||
|
//
|
||||||
|
// Created by Mr. Gecko's Media (James Coleman) on 7/23/14.
|
||||||
|
// No Copyright Claimed. Public Domain.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include "RTClib.h"
|
||||||
|
#include "OneWire.h"
|
||||||
|
|
||||||
|
#include "Nixies.h"
|
||||||
|
#include "Registers.h"
|
||||||
|
|
||||||
|
const unsigned int button1Pin = 10;
|
||||||
|
const unsigned int button2Pin = 11;
|
||||||
|
unsigned int button1State = 0;
|
||||||
|
unsigned int button2State = 0;
|
||||||
|
|
||||||
|
OneWire ds(2); // Temperature Sensor on pin 2
|
||||||
|
RTC_DS1307 RTC;
|
||||||
|
|
||||||
|
unsigned int serialPin = 5;
|
||||||
|
unsigned int serialClockPin = 7;
|
||||||
|
unsigned int registerClockPin = 6;
|
||||||
|
|
||||||
|
Nixies nixies;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
Wire.begin();
|
||||||
|
|
||||||
|
RTC.begin();
|
||||||
|
if (!RTC.isrunning()) {
|
||||||
|
Serial.println("RTC needs to be set");
|
||||||
|
RTC.adjust(DateTime(__DATE__, __TIME__));
|
||||||
|
}
|
||||||
|
|
||||||
|
pinMode(button1Pin, INPUT);
|
||||||
|
pinMode(button2Pin, INPUT);
|
||||||
|
|
||||||
|
nixies.initialize(serialPin, serialClockPin, registerClockPin, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
void parseSerialData(char *data) {
|
||||||
|
char *originalData = data;
|
||||||
|
char *array[10];
|
||||||
|
int arrayCount = 0;
|
||||||
|
|
||||||
|
char *parse = strtok(data, ",");
|
||||||
|
while (parse!=NULL) {
|
||||||
|
array[arrayCount] = parse;
|
||||||
|
arrayCount++;
|
||||||
|
if (arrayCount>=9)
|
||||||
|
return;
|
||||||
|
parse = strtok(NULL, ",");
|
||||||
|
}
|
||||||
|
array[arrayCount] = NULL;
|
||||||
|
|
||||||
|
if (arrayCount==0)
|
||||||
|
return;
|
||||||
|
if (strcmp(array[0],"pi")==0) {//Ping
|
||||||
|
Serial.println(originalData);
|
||||||
|
} else if (strcmp(array[0],"st")==0 && arrayCount==8) {// Set Time
|
||||||
|
delay(atoi(array[7]));
|
||||||
|
RTC.adjust(DateTime(atoi(array[1])/*Year*/, atoi(array[2])/*Month*/, atoi(array[3])/*Day*/, atoi(array[4])/*Hour*/, atoi(array[5])/*Minute*/, atoi(array[6])/*Second*/));
|
||||||
|
} else if (strcmp(array[0],"dp")==0 && arrayCount==3) { // Display for MS.
|
||||||
|
char *display = array[1];
|
||||||
|
int length = strlen(display);
|
||||||
|
if (length>6)
|
||||||
|
return;
|
||||||
|
for (int i=0; i<6; i++) {
|
||||||
|
int value;
|
||||||
|
if (i<length) {
|
||||||
|
char digit = display[i];
|
||||||
|
if (digit==' ') {
|
||||||
|
value = 10;
|
||||||
|
} else {
|
||||||
|
value = atoi(&digit);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
value = 10;
|
||||||
|
}
|
||||||
|
nixies.setNixie(5-i, value);
|
||||||
|
}
|
||||||
|
nixies.update();
|
||||||
|
delay(atoi(array[2]));
|
||||||
|
} else if (strcmp(array[0],"test")==0) { // Run tests
|
||||||
|
testTubes();
|
||||||
|
} else if (strcmp(array[0],"temp")==0) { // Display Temperature
|
||||||
|
displayTemperature();
|
||||||
|
} else if (strcmp(array[0],"readtemp")==0) { // Display Temperature
|
||||||
|
float temperature = getTemperatureFahrenheit();
|
||||||
|
Serial.println(temperature);
|
||||||
|
} else if (strcmp(array[0],"readtempc")==0) { // Display Temperature
|
||||||
|
float temperature = getTemperature();
|
||||||
|
Serial.println(temperature);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void processSerialData() {
|
||||||
|
unsigned long startRead = millis();
|
||||||
|
char *bytesRead = (char *)malloc(50);
|
||||||
|
int bytesLength = 0;
|
||||||
|
bool goodRead = true;
|
||||||
|
while (1) {
|
||||||
|
if (Serial.available()) {
|
||||||
|
char byteRead = Serial.read();
|
||||||
|
// If we receive a end line, we received the response.
|
||||||
|
if (byteRead=='\r')
|
||||||
|
continue;
|
||||||
|
if (byteRead=='\n')
|
||||||
|
break;
|
||||||
|
bytesRead[bytesLength] = byteRead;
|
||||||
|
bytesLength++;
|
||||||
|
// We don't want a buffer overrun. The responses from the bluetooth board is usually 3 characters long.
|
||||||
|
if (bytesLength>=49) {
|
||||||
|
goodRead = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Insure there isn't a error in reading and this doesn't continue reading infinite.
|
||||||
|
if ((millis()-startRead)>=1000) {
|
||||||
|
goodRead = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bytesRead[bytesLength] = '\0';
|
||||||
|
if (goodRead) {
|
||||||
|
parseSerialData(bytesRead);
|
||||||
|
}
|
||||||
|
free(bytesRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayTemperature() {
|
||||||
|
int temperature = getTemperatureFahrenheit();
|
||||||
|
|
||||||
|
nixies.setNixie(5, temperature/10);
|
||||||
|
nixies.setNixie(4, temperature%10);
|
||||||
|
nixies.setNixie(3, 10);
|
||||||
|
nixies.setNixie(2, 10);
|
||||||
|
nixies.setNixie(1, 10);
|
||||||
|
nixies.setNixie(0, 10);
|
||||||
|
nixies.update();
|
||||||
|
delay(2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testTubes() {
|
||||||
|
// Test every digit
|
||||||
|
for (int i=0; i<30; i++) {
|
||||||
|
nixies.setNixie(0, i%10);
|
||||||
|
nixies.setNixie(1, (i+1)%10);
|
||||||
|
nixies.setNixie(2, (i+2)%10);
|
||||||
|
nixies.setNixie(3, (i+3)%10);
|
||||||
|
nixies.setNixie(4, (i+4)%10);
|
||||||
|
nixies.setNixie(5, (i+5)%10);
|
||||||
|
nixies.update();
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
// Test setting to blank
|
||||||
|
nixies.setNixie(0, 10);
|
||||||
|
nixies.setNixie(1, 10);
|
||||||
|
nixies.setNixie(2, 10);
|
||||||
|
nixies.setNixie(3, 10);
|
||||||
|
nixies.setNixie(4, 10);
|
||||||
|
nixies.setNixie(5, 10);
|
||||||
|
nixies.update();
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayTime() {
|
||||||
|
DateTime now = RTC.now();
|
||||||
|
int hour = now.hour();
|
||||||
|
if (hour>12)
|
||||||
|
hour -= 12;
|
||||||
|
if (hour==0)
|
||||||
|
hour = 12;
|
||||||
|
int minute = now.minute();
|
||||||
|
int second = now.second();
|
||||||
|
|
||||||
|
nixies.setNixie(5, hour/10);
|
||||||
|
nixies.setNixie(4, hour%10);
|
||||||
|
nixies.setNixie(3, minute/10);
|
||||||
|
nixies.setNixie(2, minute%10);
|
||||||
|
nixies.setNixie(1, second/10);
|
||||||
|
nixies.setNixie(0, second%10);
|
||||||
|
nixies.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (Serial.available()) {
|
||||||
|
processSerialData();
|
||||||
|
}
|
||||||
|
|
||||||
|
int state1 = digitalRead(button1Pin);
|
||||||
|
if (state1!=button1State && state1==HIGH) {
|
||||||
|
//displayTemperature();
|
||||||
|
Serial.println("b1"); // Send button press to serial.
|
||||||
|
button1State = state1;
|
||||||
|
} else if (state1!=button1State && state1==LOW) {
|
||||||
|
button1State = state1;
|
||||||
|
}
|
||||||
|
int state2 = digitalRead(button2Pin);
|
||||||
|
if (state2!=button2State && state2==HIGH) {
|
||||||
|
testTubes();
|
||||||
|
Serial.println("b2"); // Send button press to serial.
|
||||||
|
button2State = state2;
|
||||||
|
} else if (state2!=button2State && state2==LOW) {
|
||||||
|
button2State = state2;
|
||||||
|
}
|
||||||
|
|
||||||
|
displayTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Code for this function from http://bildr.org/2011/07/ds18b20-arduino/
|
||||||
|
// Copyright (c) 2010 bildr community
|
||||||
|
float getTemperature() {
|
||||||
|
//returns the temperature from one DS18S20 in DEG Celsius
|
||||||
|
byte data[12];
|
||||||
|
byte addr[8];
|
||||||
|
|
||||||
|
if (!ds.search(addr)) {
|
||||||
|
//no more sensors on chain, reset search
|
||||||
|
ds.reset_search();
|
||||||
|
return -1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OneWire::crc8(addr, 7)!=addr[7]) {
|
||||||
|
Serial.println("CRC is not valid!");
|
||||||
|
return -1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addr[0]!=0x10 && addr[0]!=0x28) {
|
||||||
|
Serial.print("Device is not recognized");
|
||||||
|
return -1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
ds.reset();
|
||||||
|
ds.select(addr);
|
||||||
|
ds.write(0x44,1); // start conversion, with parasite power on at the end
|
||||||
|
|
||||||
|
byte present = ds.reset();
|
||||||
|
ds.select(addr);
|
||||||
|
ds.write(0xBE); // Read Scratchpad
|
||||||
|
|
||||||
|
|
||||||
|
for (int i=0; i<9; i++) { // we need 9 bytes
|
||||||
|
data[i] = ds.read();
|
||||||
|
}
|
||||||
|
|
||||||
|
ds.reset_search();
|
||||||
|
|
||||||
|
byte MSB = data[1];
|
||||||
|
byte LSB = data[0];
|
||||||
|
|
||||||
|
float tempRead = ((MSB << 8) | LSB); //using two's compliment
|
||||||
|
float TemperatureSum = tempRead / 16;
|
||||||
|
|
||||||
|
return TemperatureSum;
|
||||||
|
}
|
||||||
|
|
||||||
|
float getTemperatureFahrenheit() {
|
||||||
|
float temperature = getTemperature();
|
||||||
|
return (temperature*(9.0/5.0))+32;
|
||||||
|
}
|
73
Source Code/NixieClock/Nixies.cpp
Normal file
73
Source Code/NixieClock/Nixies.cpp
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
//
|
||||||
|
// nixies.cpp
|
||||||
|
//
|
||||||
|
// Created by Mr. Gecko's Media (James Coleman) on 7/23/14.
|
||||||
|
// No Copyright Claimed. Public Domain.
|
||||||
|
//
|
||||||
|
|
||||||
|
#if (ARDUINO >= 100)
|
||||||
|
#include "Arduino.h"
|
||||||
|
#else
|
||||||
|
#include "WProgram.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "Nixies.h"
|
||||||
|
|
||||||
|
Nixies::Nixies() {
|
||||||
|
nixieCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Nixies::initialize(unsigned int theSerialPin, unsigned int theSerialClockPin, unsigned int theRegisterClockPin, unsigned int theNixieCount) {
|
||||||
|
if (theNixieCount>50)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
unsigned int registerCount = (theNixieCount/2)+(theNixieCount%2);
|
||||||
|
if (!nixieRegisters.initialize(theSerialPin, theSerialClockPin, theRegisterClockPin, registerCount))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
nixieCount = theNixieCount;
|
||||||
|
|
||||||
|
setAllNixies(0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Nixies::setNixie(unsigned int nixieNumber, unsigned int value) {
|
||||||
|
if (nixieNumber>=nixieCount)
|
||||||
|
return false;
|
||||||
|
if (value>10)
|
||||||
|
value = 10;
|
||||||
|
|
||||||
|
nixieValues[nixieNumber] = value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Nixies::setAllNixies(unsigned int value) {
|
||||||
|
if (nixieCount==0)
|
||||||
|
return;
|
||||||
|
if (value>10)
|
||||||
|
value = 10;
|
||||||
|
for (int nixieNumber=0; nixieNumber<nixieCount; nixieNumber++) {
|
||||||
|
setNixie(nixieNumber, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const byte pinValues[11] = {0x0, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0xA};
|
||||||
|
void Nixies::setPinsWithValue(int startingPin, int value) {
|
||||||
|
if (value>10)
|
||||||
|
value = 10;
|
||||||
|
byte values = pinValues[value];
|
||||||
|
for (int pinOffset=0; pinOffset<4; pinOffset++) {
|
||||||
|
bool pinValue = values & (1 << pinOffset);
|
||||||
|
nixieRegisters.setPin(startingPin+pinOffset, pinValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Nixies::update() {
|
||||||
|
if (nixieCount==0)
|
||||||
|
return;
|
||||||
|
for (int nixieNumber=0; nixieNumber<nixieCount; nixieNumber++) {
|
||||||
|
unsigned int nixieValue = nixieValues[nixieNumber];
|
||||||
|
setPinsWithValue(nixieNumber*4, nixieValue);
|
||||||
|
}
|
||||||
|
nixieRegisters.update();
|
||||||
|
}
|
34
Source Code/NixieClock/Nixies.h
Normal file
34
Source Code/NixieClock/Nixies.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
//
|
||||||
|
// Nixies.h
|
||||||
|
//
|
||||||
|
// Created by Mr. Gecko's Media (James Coleman) on 7/23/14.
|
||||||
|
// No Copyright Claimed. Public Domain.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef Nixies_h
|
||||||
|
#define Nixies_h
|
||||||
|
|
||||||
|
#if (ARDUINO >= 100)
|
||||||
|
#include "Arduino.h"
|
||||||
|
#else
|
||||||
|
#include "WProgram.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "Registers.h"
|
||||||
|
|
||||||
|
class Nixies {
|
||||||
|
public:
|
||||||
|
Nixies();
|
||||||
|
bool initialize(unsigned int theSerialPin, unsigned int theSerialClockPin, unsigned int theRegisterClockPin, unsigned int theNixieCount);
|
||||||
|
bool setNixie(unsigned int nixieNumber, unsigned int value); // 10 = off
|
||||||
|
void setAllNixies(unsigned int value);
|
||||||
|
void update();
|
||||||
|
private:
|
||||||
|
Registers nixieRegisters;
|
||||||
|
unsigned int nixieCount; // Number of nixies
|
||||||
|
unsigned int nixieValues[50];
|
||||||
|
|
||||||
|
void setPinsWithValue(int startingPin, int value);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
557
Source Code/NixieClock/OneWire.cpp
Normal file
557
Source Code/NixieClock/OneWire.cpp
Normal file
@ -0,0 +1,557 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2007, Jim Studt (original old version - many contributors since)
|
||||||
|
|
||||||
|
The latest version of this library may be found at:
|
||||||
|
http://www.pjrc.com/teensy/td_libs_OneWire.html
|
||||||
|
|
||||||
|
OneWire has been maintained by Paul Stoffregen (paul@pjrc.com) since
|
||||||
|
January 2010. At the time, it was in need of many bug fixes, but had
|
||||||
|
been abandoned the original author (Jim Studt). None of the known
|
||||||
|
contributors were interested in maintaining OneWire. Paul typically
|
||||||
|
works on OneWire every 6 to 12 months. Patches usually wait that
|
||||||
|
long. If anyone is interested in more actively maintaining OneWire,
|
||||||
|
please contact Paul.
|
||||||
|
|
||||||
|
Version 2.2:
|
||||||
|
Teensy 3.0 compatibility, Paul Stoffregen, paul@pjrc.com
|
||||||
|
Arduino Due compatibility, http://arduino.cc/forum/index.php?topic=141030
|
||||||
|
Fix DS18B20 example negative temperature
|
||||||
|
Fix DS18B20 example's low res modes, Ken Butcher
|
||||||
|
Improve reset timing, Mark Tillotson
|
||||||
|
Add const qualifiers, Bertrik Sikken
|
||||||
|
Add initial value input to crc16, Bertrik Sikken
|
||||||
|
Add target_search() function, Scott Roberts
|
||||||
|
|
||||||
|
Version 2.1:
|
||||||
|
Arduino 1.0 compatibility, Paul Stoffregen
|
||||||
|
Improve temperature example, Paul Stoffregen
|
||||||
|
DS250x_PROM example, Guillermo Lovato
|
||||||
|
PIC32 (chipKit) compatibility, Jason Dangel, dangel.jason AT gmail.com
|
||||||
|
Improvements from Glenn Trewitt:
|
||||||
|
- crc16() now works
|
||||||
|
- check_crc16() does all of calculation/checking work.
|
||||||
|
- Added read_bytes() and write_bytes(), to reduce tedious loops.
|
||||||
|
- Added ds2408 example.
|
||||||
|
Delete very old, out-of-date readme file (info is here)
|
||||||
|
|
||||||
|
Version 2.0: Modifications by Paul Stoffregen, January 2010:
|
||||||
|
http://www.pjrc.com/teensy/td_libs_OneWire.html
|
||||||
|
Search fix from Robin James
|
||||||
|
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1238032295/27#27
|
||||||
|
Use direct optimized I/O in all cases
|
||||||
|
Disable interrupts during timing critical sections
|
||||||
|
(this solves many random communication errors)
|
||||||
|
Disable interrupts during read-modify-write I/O
|
||||||
|
Reduce RAM consumption by eliminating unnecessary
|
||||||
|
variables and trimming many to 8 bits
|
||||||
|
Optimize both crc8 - table version moved to flash
|
||||||
|
|
||||||
|
Modified to work with larger numbers of devices - avoids loop.
|
||||||
|
Tested in Arduino 11 alpha with 12 sensors.
|
||||||
|
26 Sept 2008 -- Robin James
|
||||||
|
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1238032295/27#27
|
||||||
|
|
||||||
|
Updated to work with arduino-0008 and to include skip() as of
|
||||||
|
2007/07/06. --RJL20
|
||||||
|
|
||||||
|
Modified to calculate the 8-bit CRC directly, avoiding the need for
|
||||||
|
the 256-byte lookup table to be loaded in RAM. Tested in arduino-0010
|
||||||
|
-- Tom Pollard, Jan 23, 2008
|
||||||
|
|
||||||
|
Jim Studt's original library was modified by Josh Larios.
|
||||||
|
|
||||||
|
Tom Pollard, pollard@alum.mit.edu, contributed around May 20, 2008
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
Much of the code was inspired by Derek Yerger's code, though I don't
|
||||||
|
think much of that remains. In any event that was..
|
||||||
|
(copyleft) 2006 by Derek Yerger - Free to distribute freely.
|
||||||
|
|
||||||
|
The CRC code was excerpted and inspired by the Dallas Semiconductor
|
||||||
|
sample code bearing this copyright.
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// Copyright (C) 2000 Dallas Semiconductor Corporation, All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
// copy of this software and associated documentation files (the "Software"),
|
||||||
|
// to deal in the Software without restriction, including without limitation
|
||||||
|
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
// and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
// Software is furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included
|
||||||
|
// in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
// IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES
|
||||||
|
// OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
// OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
//
|
||||||
|
// Except as contained in this notice, the name of Dallas Semiconductor
|
||||||
|
// shall not be used except as stated in the Dallas Semiconductor
|
||||||
|
// Branding Policy.
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "OneWire.h"
|
||||||
|
|
||||||
|
|
||||||
|
OneWire::OneWire(uint8_t pin)
|
||||||
|
{
|
||||||
|
pinMode(pin, INPUT);
|
||||||
|
bitmask = PIN_TO_BITMASK(pin);
|
||||||
|
baseReg = PIN_TO_BASEREG(pin);
|
||||||
|
#if ONEWIRE_SEARCH
|
||||||
|
reset_search();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Perform the onewire reset function. We will wait up to 250uS for
|
||||||
|
// the bus to come high, if it doesn't then it is broken or shorted
|
||||||
|
// and we return a 0;
|
||||||
|
//
|
||||||
|
// Returns 1 if a device asserted a presence pulse, 0 otherwise.
|
||||||
|
//
|
||||||
|
uint8_t OneWire::reset(void)
|
||||||
|
{
|
||||||
|
IO_REG_TYPE mask = bitmask;
|
||||||
|
volatile IO_REG_TYPE *reg IO_REG_ASM = baseReg;
|
||||||
|
uint8_t r;
|
||||||
|
uint8_t retries = 125;
|
||||||
|
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_MODE_INPUT(reg, mask);
|
||||||
|
interrupts();
|
||||||
|
// wait until the wire is high... just in case
|
||||||
|
do {
|
||||||
|
if (--retries == 0) return 0;
|
||||||
|
delayMicroseconds(2);
|
||||||
|
} while ( !DIRECT_READ(reg, mask));
|
||||||
|
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_WRITE_LOW(reg, mask);
|
||||||
|
DIRECT_MODE_OUTPUT(reg, mask); // drive output low
|
||||||
|
interrupts();
|
||||||
|
delayMicroseconds(480);
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_MODE_INPUT(reg, mask); // allow it to float
|
||||||
|
delayMicroseconds(70);
|
||||||
|
r = !DIRECT_READ(reg, mask);
|
||||||
|
interrupts();
|
||||||
|
delayMicroseconds(410);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Write a bit. Port and bit is used to cut lookup time and provide
|
||||||
|
// more certain timing.
|
||||||
|
//
|
||||||
|
void OneWire::write_bit(uint8_t v)
|
||||||
|
{
|
||||||
|
IO_REG_TYPE mask=bitmask;
|
||||||
|
volatile IO_REG_TYPE *reg IO_REG_ASM = baseReg;
|
||||||
|
|
||||||
|
if (v & 1) {
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_WRITE_LOW(reg, mask);
|
||||||
|
DIRECT_MODE_OUTPUT(reg, mask); // drive output low
|
||||||
|
delayMicroseconds(10);
|
||||||
|
DIRECT_WRITE_HIGH(reg, mask); // drive output high
|
||||||
|
interrupts();
|
||||||
|
delayMicroseconds(55);
|
||||||
|
} else {
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_WRITE_LOW(reg, mask);
|
||||||
|
DIRECT_MODE_OUTPUT(reg, mask); // drive output low
|
||||||
|
delayMicroseconds(65);
|
||||||
|
DIRECT_WRITE_HIGH(reg, mask); // drive output high
|
||||||
|
interrupts();
|
||||||
|
delayMicroseconds(5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Read a bit. Port and bit is used to cut lookup time and provide
|
||||||
|
// more certain timing.
|
||||||
|
//
|
||||||
|
uint8_t OneWire::read_bit(void)
|
||||||
|
{
|
||||||
|
IO_REG_TYPE mask=bitmask;
|
||||||
|
volatile IO_REG_TYPE *reg IO_REG_ASM = baseReg;
|
||||||
|
uint8_t r;
|
||||||
|
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_MODE_OUTPUT(reg, mask);
|
||||||
|
DIRECT_WRITE_LOW(reg, mask);
|
||||||
|
delayMicroseconds(3);
|
||||||
|
DIRECT_MODE_INPUT(reg, mask); // let pin float, pull up will raise
|
||||||
|
delayMicroseconds(10);
|
||||||
|
r = DIRECT_READ(reg, mask);
|
||||||
|
interrupts();
|
||||||
|
delayMicroseconds(53);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Write a byte. The writing code uses the active drivers to raise the
|
||||||
|
// pin high, if you need power after the write (e.g. DS18S20 in
|
||||||
|
// parasite power mode) then set 'power' to 1, otherwise the pin will
|
||||||
|
// go tri-state at the end of the write to avoid heating in a short or
|
||||||
|
// other mishap.
|
||||||
|
//
|
||||||
|
void OneWire::write(uint8_t v, uint8_t power /* = 0 */) {
|
||||||
|
uint8_t bitMask;
|
||||||
|
|
||||||
|
for (bitMask = 0x01; bitMask; bitMask <<= 1) {
|
||||||
|
OneWire::write_bit( (bitMask & v)?1:0);
|
||||||
|
}
|
||||||
|
if ( !power) {
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_MODE_INPUT(baseReg, bitmask);
|
||||||
|
DIRECT_WRITE_LOW(baseReg, bitmask);
|
||||||
|
interrupts();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OneWire::write_bytes(const uint8_t *buf, uint16_t count, bool power /* = 0 */) {
|
||||||
|
for (uint16_t i = 0 ; i < count ; i++)
|
||||||
|
write(buf[i]);
|
||||||
|
if (!power) {
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_MODE_INPUT(baseReg, bitmask);
|
||||||
|
DIRECT_WRITE_LOW(baseReg, bitmask);
|
||||||
|
interrupts();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Read a byte
|
||||||
|
//
|
||||||
|
uint8_t OneWire::read() {
|
||||||
|
uint8_t bitMask;
|
||||||
|
uint8_t r = 0;
|
||||||
|
|
||||||
|
for (bitMask = 0x01; bitMask; bitMask <<= 1) {
|
||||||
|
if ( OneWire::read_bit()) r |= bitMask;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OneWire::read_bytes(uint8_t *buf, uint16_t count) {
|
||||||
|
for (uint16_t i = 0 ; i < count ; i++)
|
||||||
|
buf[i] = read();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Do a ROM select
|
||||||
|
//
|
||||||
|
void OneWire::select(const uint8_t rom[8])
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
write(0x55); // Choose ROM
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++) write(rom[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Do a ROM skip
|
||||||
|
//
|
||||||
|
void OneWire::skip()
|
||||||
|
{
|
||||||
|
write(0xCC); // Skip ROM
|
||||||
|
}
|
||||||
|
|
||||||
|
void OneWire::depower()
|
||||||
|
{
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_MODE_INPUT(baseReg, bitmask);
|
||||||
|
interrupts();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if ONEWIRE_SEARCH
|
||||||
|
|
||||||
|
//
|
||||||
|
// You need to use this function to start a search again from the beginning.
|
||||||
|
// You do not need to do it for the first search, though you could.
|
||||||
|
//
|
||||||
|
void OneWire::reset_search()
|
||||||
|
{
|
||||||
|
// reset the search state
|
||||||
|
LastDiscrepancy = 0;
|
||||||
|
LastDeviceFlag = FALSE;
|
||||||
|
LastFamilyDiscrepancy = 0;
|
||||||
|
for(int i = 7; ; i--) {
|
||||||
|
ROM_NO[i] = 0;
|
||||||
|
if ( i == 0) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup the search to find the device type 'family_code' on the next call
|
||||||
|
// to search(*newAddr) if it is present.
|
||||||
|
//
|
||||||
|
void OneWire::target_search(uint8_t family_code)
|
||||||
|
{
|
||||||
|
// set the search state to find SearchFamily type devices
|
||||||
|
ROM_NO[0] = family_code;
|
||||||
|
for (uint8_t i = 1; i < 8; i++)
|
||||||
|
ROM_NO[i] = 0;
|
||||||
|
LastDiscrepancy = 64;
|
||||||
|
LastFamilyDiscrepancy = 0;
|
||||||
|
LastDeviceFlag = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Perform a search. If this function returns a '1' then it has
|
||||||
|
// enumerated the next device and you may retrieve the ROM from the
|
||||||
|
// OneWire::address variable. If there are no devices, no further
|
||||||
|
// devices, or something horrible happens in the middle of the
|
||||||
|
// enumeration then a 0 is returned. If a new device is found then
|
||||||
|
// its address is copied to newAddr. Use OneWire::reset_search() to
|
||||||
|
// start over.
|
||||||
|
//
|
||||||
|
// --- Replaced by the one from the Dallas Semiconductor web site ---
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing
|
||||||
|
// search state.
|
||||||
|
// Return TRUE : device found, ROM number in ROM_NO buffer
|
||||||
|
// FALSE : device not found, end of search
|
||||||
|
//
|
||||||
|
uint8_t OneWire::search(uint8_t *newAddr)
|
||||||
|
{
|
||||||
|
uint8_t id_bit_number;
|
||||||
|
uint8_t last_zero, rom_byte_number, search_result;
|
||||||
|
uint8_t id_bit, cmp_id_bit;
|
||||||
|
|
||||||
|
unsigned char rom_byte_mask, search_direction;
|
||||||
|
|
||||||
|
// initialize for search
|
||||||
|
id_bit_number = 1;
|
||||||
|
last_zero = 0;
|
||||||
|
rom_byte_number = 0;
|
||||||
|
rom_byte_mask = 1;
|
||||||
|
search_result = 0;
|
||||||
|
|
||||||
|
// if the last call was not the last one
|
||||||
|
if (!LastDeviceFlag)
|
||||||
|
{
|
||||||
|
// 1-Wire reset
|
||||||
|
if (!reset())
|
||||||
|
{
|
||||||
|
// reset the search
|
||||||
|
LastDiscrepancy = 0;
|
||||||
|
LastDeviceFlag = FALSE;
|
||||||
|
LastFamilyDiscrepancy = 0;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// issue the search command
|
||||||
|
write(0xF0);
|
||||||
|
|
||||||
|
// loop to do the search
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// read a bit and its complement
|
||||||
|
id_bit = read_bit();
|
||||||
|
cmp_id_bit = read_bit();
|
||||||
|
|
||||||
|
// check for no devices on 1-wire
|
||||||
|
if ((id_bit == 1) && (cmp_id_bit == 1))
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// all devices coupled have 0 or 1
|
||||||
|
if (id_bit != cmp_id_bit)
|
||||||
|
search_direction = id_bit; // bit write value for search
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if this discrepancy if before the Last Discrepancy
|
||||||
|
// on a previous next then pick the same as last time
|
||||||
|
if (id_bit_number < LastDiscrepancy)
|
||||||
|
search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0);
|
||||||
|
else
|
||||||
|
// if equal to last pick 1, if not then pick 0
|
||||||
|
search_direction = (id_bit_number == LastDiscrepancy);
|
||||||
|
|
||||||
|
// if 0 was picked then record its position in LastZero
|
||||||
|
if (search_direction == 0)
|
||||||
|
{
|
||||||
|
last_zero = id_bit_number;
|
||||||
|
|
||||||
|
// check for Last discrepancy in family
|
||||||
|
if (last_zero < 9)
|
||||||
|
LastFamilyDiscrepancy = last_zero;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set or clear the bit in the ROM byte rom_byte_number
|
||||||
|
// with mask rom_byte_mask
|
||||||
|
if (search_direction == 1)
|
||||||
|
ROM_NO[rom_byte_number] |= rom_byte_mask;
|
||||||
|
else
|
||||||
|
ROM_NO[rom_byte_number] &= ~rom_byte_mask;
|
||||||
|
|
||||||
|
// serial number search direction write bit
|
||||||
|
write_bit(search_direction);
|
||||||
|
|
||||||
|
// increment the byte counter id_bit_number
|
||||||
|
// and shift the mask rom_byte_mask
|
||||||
|
id_bit_number++;
|
||||||
|
rom_byte_mask <<= 1;
|
||||||
|
|
||||||
|
// if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
|
||||||
|
if (rom_byte_mask == 0)
|
||||||
|
{
|
||||||
|
rom_byte_number++;
|
||||||
|
rom_byte_mask = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(rom_byte_number < 8); // loop until through all ROM bytes 0-7
|
||||||
|
|
||||||
|
// if the search was successful then
|
||||||
|
if (!(id_bit_number < 65))
|
||||||
|
{
|
||||||
|
// search successful so set LastDiscrepancy,LastDeviceFlag,search_result
|
||||||
|
LastDiscrepancy = last_zero;
|
||||||
|
|
||||||
|
// check for last device
|
||||||
|
if (LastDiscrepancy == 0)
|
||||||
|
LastDeviceFlag = TRUE;
|
||||||
|
|
||||||
|
search_result = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if no device found then reset counters so next 'search' will be like a first
|
||||||
|
if (!search_result || !ROM_NO[0])
|
||||||
|
{
|
||||||
|
LastDiscrepancy = 0;
|
||||||
|
LastDeviceFlag = FALSE;
|
||||||
|
LastFamilyDiscrepancy = 0;
|
||||||
|
search_result = FALSE;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 8; i++) newAddr[i] = ROM_NO[i];
|
||||||
|
return search_result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ONEWIRE_CRC
|
||||||
|
// The 1-Wire CRC scheme is described in Maxim Application Note 27:
|
||||||
|
// "Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products"
|
||||||
|
//
|
||||||
|
|
||||||
|
#if ONEWIRE_CRC8_TABLE
|
||||||
|
// This table comes from Dallas sample code where it is freely reusable,
|
||||||
|
// though Copyright (C) 2000 Dallas Semiconductor Corporation
|
||||||
|
static const uint8_t PROGMEM dscrc_table[] = {
|
||||||
|
0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
|
||||||
|
157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
|
||||||
|
35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
|
||||||
|
190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
|
||||||
|
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
|
||||||
|
219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
|
||||||
|
101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
|
||||||
|
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
|
||||||
|
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
|
||||||
|
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
|
||||||
|
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
|
||||||
|
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
|
||||||
|
202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
|
||||||
|
87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
|
||||||
|
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
|
||||||
|
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Compute a Dallas Semiconductor 8 bit CRC. These show up in the ROM
|
||||||
|
// and the registers. (note: this might better be done without to
|
||||||
|
// table, it would probably be smaller and certainly fast enough
|
||||||
|
// compared to all those delayMicrosecond() calls. But I got
|
||||||
|
// confused, so I use this table from the examples.)
|
||||||
|
//
|
||||||
|
uint8_t OneWire::crc8(const uint8_t *addr, uint8_t len)
|
||||||
|
{
|
||||||
|
uint8_t crc = 0;
|
||||||
|
|
||||||
|
while (len--) {
|
||||||
|
crc = pgm_read_byte(dscrc_table + (crc ^ *addr++));
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
//
|
||||||
|
// Compute a Dallas Semiconductor 8 bit CRC directly.
|
||||||
|
// this is much slower, but much smaller, than the lookup table.
|
||||||
|
//
|
||||||
|
uint8_t OneWire::crc8(const uint8_t *addr, uint8_t len)
|
||||||
|
{
|
||||||
|
uint8_t crc = 0;
|
||||||
|
|
||||||
|
while (len--) {
|
||||||
|
uint8_t inbyte = *addr++;
|
||||||
|
for (uint8_t i = 8; i; i--) {
|
||||||
|
uint8_t mix = (crc ^ inbyte) & 0x01;
|
||||||
|
crc >>= 1;
|
||||||
|
if (mix) crc ^= 0x8C;
|
||||||
|
inbyte >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ONEWIRE_CRC16
|
||||||
|
bool OneWire::check_crc16(const uint8_t* input, uint16_t len, const uint8_t* inverted_crc, uint16_t crc)
|
||||||
|
{
|
||||||
|
crc = ~crc16(input, len, crc);
|
||||||
|
return (crc & 0xFF) == inverted_crc[0] && (crc >> 8) == inverted_crc[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t OneWire::crc16(const uint8_t* input, uint16_t len, uint16_t crc)
|
||||||
|
{
|
||||||
|
static const uint8_t oddparity[16] =
|
||||||
|
{ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 };
|
||||||
|
|
||||||
|
for (uint16_t i = 0 ; i < len ; i++) {
|
||||||
|
// Even though we're just copying a byte from the input,
|
||||||
|
// we'll be doing 16-bit computation with it.
|
||||||
|
uint16_t cdata = input[i];
|
||||||
|
cdata = (cdata ^ crc) & 0xff;
|
||||||
|
crc >>= 8;
|
||||||
|
|
||||||
|
if (oddparity[cdata & 0x0F] ^ oddparity[cdata >> 4])
|
||||||
|
crc ^= 0xC001;
|
||||||
|
|
||||||
|
cdata <<= 6;
|
||||||
|
crc ^= cdata;
|
||||||
|
cdata <<= 1;
|
||||||
|
crc ^= cdata;
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
229
Source Code/NixieClock/OneWire.h
Normal file
229
Source Code/NixieClock/OneWire.h
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
#ifndef OneWire_h
|
||||||
|
#define OneWire_h
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#if ARDUINO >= 100
|
||||||
|
#include "Arduino.h" // for delayMicroseconds, digitalPinToBitMask, etc
|
||||||
|
#else
|
||||||
|
#include "WProgram.h" // for delayMicroseconds
|
||||||
|
#include "pins_arduino.h" // for digitalPinToBitMask, etc
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// You can exclude certain features from OneWire. In theory, this
|
||||||
|
// might save some space. In practice, the compiler automatically
|
||||||
|
// removes unused code (technically, the linker, using -fdata-sections
|
||||||
|
// and -ffunction-sections when compiling, and Wl,--gc-sections
|
||||||
|
// when linking), so most of these will not result in any code size
|
||||||
|
// reduction. Well, unless you try to use the missing features
|
||||||
|
// and redesign your program to not need them! ONEWIRE_CRC8_TABLE
|
||||||
|
// is the exception, because it selects a fast but large algorithm
|
||||||
|
// or a small but slow algorithm.
|
||||||
|
|
||||||
|
// you can exclude onewire_search by defining that to 0
|
||||||
|
#ifndef ONEWIRE_SEARCH
|
||||||
|
#define ONEWIRE_SEARCH 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// You can exclude CRC checks altogether by defining this to 0
|
||||||
|
#ifndef ONEWIRE_CRC
|
||||||
|
#define ONEWIRE_CRC 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Select the table-lookup method of computing the 8-bit CRC
|
||||||
|
// by setting this to 1. The lookup table enlarges code size by
|
||||||
|
// about 250 bytes. It does NOT consume RAM (but did in very
|
||||||
|
// old versions of OneWire). If you disable this, a slower
|
||||||
|
// but very compact algorithm is used.
|
||||||
|
#ifndef ONEWIRE_CRC8_TABLE
|
||||||
|
#define ONEWIRE_CRC8_TABLE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// You can allow 16-bit CRC checks by defining this to 1
|
||||||
|
// (Note that ONEWIRE_CRC must also be 1.)
|
||||||
|
#ifndef ONEWIRE_CRC16
|
||||||
|
#define ONEWIRE_CRC16 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FALSE 0
|
||||||
|
#define TRUE 1
|
||||||
|
|
||||||
|
// Platform specific I/O definitions
|
||||||
|
|
||||||
|
#if defined(__AVR__)
|
||||||
|
#define PIN_TO_BASEREG(pin) (portInputRegister(digitalPinToPort(pin)))
|
||||||
|
#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin))
|
||||||
|
#define IO_REG_TYPE uint8_t
|
||||||
|
#define IO_REG_ASM asm("r30")
|
||||||
|
#define DIRECT_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0)
|
||||||
|
#define DIRECT_MODE_INPUT(base, mask) ((*((base)+1)) &= ~(mask))
|
||||||
|
#define DIRECT_MODE_OUTPUT(base, mask) ((*((base)+1)) |= (mask))
|
||||||
|
#define DIRECT_WRITE_LOW(base, mask) ((*((base)+2)) &= ~(mask))
|
||||||
|
#define DIRECT_WRITE_HIGH(base, mask) ((*((base)+2)) |= (mask))
|
||||||
|
|
||||||
|
#elif defined(__MK20DX128__)
|
||||||
|
#define PIN_TO_BASEREG(pin) (portOutputRegister(pin))
|
||||||
|
#define PIN_TO_BITMASK(pin) (1)
|
||||||
|
#define IO_REG_TYPE uint8_t
|
||||||
|
#define IO_REG_ASM
|
||||||
|
#define DIRECT_READ(base, mask) (*((base)+512))
|
||||||
|
#define DIRECT_MODE_INPUT(base, mask) (*((base)+640) = 0)
|
||||||
|
#define DIRECT_MODE_OUTPUT(base, mask) (*((base)+640) = 1)
|
||||||
|
#define DIRECT_WRITE_LOW(base, mask) (*((base)+256) = 1)
|
||||||
|
#define DIRECT_WRITE_HIGH(base, mask) (*((base)+128) = 1)
|
||||||
|
|
||||||
|
#elif defined(__SAM3X8E__)
|
||||||
|
// Arduino 1.5.1 may have a bug in delayMicroseconds() on Arduino Due.
|
||||||
|
// http://arduino.cc/forum/index.php/topic,141030.msg1076268.html#msg1076268
|
||||||
|
// If you have trouble with OneWire on Arduino Due, please check the
|
||||||
|
// status of delayMicroseconds() before reporting a bug in OneWire!
|
||||||
|
#define PIN_TO_BASEREG(pin) (&(digitalPinToPort(pin)->PIO_PER))
|
||||||
|
#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin))
|
||||||
|
#define IO_REG_TYPE uint32_t
|
||||||
|
#define IO_REG_ASM
|
||||||
|
#define DIRECT_READ(base, mask) (((*((base)+15)) & (mask)) ? 1 : 0)
|
||||||
|
#define DIRECT_MODE_INPUT(base, mask) ((*((base)+5)) = (mask))
|
||||||
|
#define DIRECT_MODE_OUTPUT(base, mask) ((*((base)+4)) = (mask))
|
||||||
|
#define DIRECT_WRITE_LOW(base, mask) ((*((base)+13)) = (mask))
|
||||||
|
#define DIRECT_WRITE_HIGH(base, mask) ((*((base)+12)) = (mask))
|
||||||
|
#ifndef PROGMEM
|
||||||
|
#define PROGMEM
|
||||||
|
#endif
|
||||||
|
#ifndef pgm_read_byte
|
||||||
|
#define pgm_read_byte(addr) (*(const uint8_t *)(addr))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(__PIC32MX__)
|
||||||
|
#define PIN_TO_BASEREG(pin) (portModeRegister(digitalPinToPort(pin)))
|
||||||
|
#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin))
|
||||||
|
#define IO_REG_TYPE uint32_t
|
||||||
|
#define IO_REG_ASM
|
||||||
|
#define DIRECT_READ(base, mask) (((*(base+4)) & (mask)) ? 1 : 0) //PORTX + 0x10
|
||||||
|
#define DIRECT_MODE_INPUT(base, mask) ((*(base+2)) = (mask)) //TRISXSET + 0x08
|
||||||
|
#define DIRECT_MODE_OUTPUT(base, mask) ((*(base+1)) = (mask)) //TRISXCLR + 0x04
|
||||||
|
#define DIRECT_WRITE_LOW(base, mask) ((*(base+8+1)) = (mask)) //LATXCLR + 0x24
|
||||||
|
#define DIRECT_WRITE_HIGH(base, mask) ((*(base+8+2)) = (mask)) //LATXSET + 0x28
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error "Please define I/O register types here"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
class OneWire
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
IO_REG_TYPE bitmask;
|
||||||
|
volatile IO_REG_TYPE *baseReg;
|
||||||
|
|
||||||
|
#if ONEWIRE_SEARCH
|
||||||
|
// global search state
|
||||||
|
unsigned char ROM_NO[8];
|
||||||
|
uint8_t LastDiscrepancy;
|
||||||
|
uint8_t LastFamilyDiscrepancy;
|
||||||
|
uint8_t LastDeviceFlag;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
public:
|
||||||
|
OneWire( uint8_t pin);
|
||||||
|
|
||||||
|
// Perform a 1-Wire reset cycle. Returns 1 if a device responds
|
||||||
|
// with a presence pulse. Returns 0 if there is no device or the
|
||||||
|
// bus is shorted or otherwise held low for more than 250uS
|
||||||
|
uint8_t reset(void);
|
||||||
|
|
||||||
|
// Issue a 1-Wire rom select command, you do the reset first.
|
||||||
|
void select(const uint8_t rom[8]);
|
||||||
|
|
||||||
|
// Issue a 1-Wire rom skip command, to address all on bus.
|
||||||
|
void skip(void);
|
||||||
|
|
||||||
|
// Write a byte. If 'power' is one then the wire is held high at
|
||||||
|
// the end for parasitically powered devices. You are responsible
|
||||||
|
// for eventually depowering it by calling depower() or doing
|
||||||
|
// another read or write.
|
||||||
|
void write(uint8_t v, uint8_t power = 0);
|
||||||
|
|
||||||
|
void write_bytes(const uint8_t *buf, uint16_t count, bool power = 0);
|
||||||
|
|
||||||
|
// Read a byte.
|
||||||
|
uint8_t read(void);
|
||||||
|
|
||||||
|
void read_bytes(uint8_t *buf, uint16_t count);
|
||||||
|
|
||||||
|
// Write a bit. The bus is always left powered at the end, see
|
||||||
|
// note in write() about that.
|
||||||
|
void write_bit(uint8_t v);
|
||||||
|
|
||||||
|
// Read a bit.
|
||||||
|
uint8_t read_bit(void);
|
||||||
|
|
||||||
|
// Stop forcing power onto the bus. You only need to do this if
|
||||||
|
// you used the 'power' flag to write() or used a write_bit() call
|
||||||
|
// and aren't about to do another read or write. You would rather
|
||||||
|
// not leave this powered if you don't have to, just in case
|
||||||
|
// someone shorts your bus.
|
||||||
|
void depower(void);
|
||||||
|
|
||||||
|
#if ONEWIRE_SEARCH
|
||||||
|
// Clear the search state so that if will start from the beginning again.
|
||||||
|
void reset_search();
|
||||||
|
|
||||||
|
// Setup the search to find the device type 'family_code' on the next call
|
||||||
|
// to search(*newAddr) if it is present.
|
||||||
|
void target_search(uint8_t family_code);
|
||||||
|
|
||||||
|
// Look for the next device. Returns 1 if a new address has been
|
||||||
|
// returned. A zero might mean that the bus is shorted, there are
|
||||||
|
// no devices, or you have already retrieved all of them. It
|
||||||
|
// might be a good idea to check the CRC to make sure you didn't
|
||||||
|
// get garbage. The order is deterministic. You will always get
|
||||||
|
// the same devices in the same order.
|
||||||
|
uint8_t search(uint8_t *newAddr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ONEWIRE_CRC
|
||||||
|
// Compute a Dallas Semiconductor 8 bit CRC, these are used in the
|
||||||
|
// ROM and scratchpad registers.
|
||||||
|
static uint8_t crc8(const uint8_t *addr, uint8_t len);
|
||||||
|
|
||||||
|
#if ONEWIRE_CRC16
|
||||||
|
// Compute the 1-Wire CRC16 and compare it against the received CRC.
|
||||||
|
// Example usage (reading a DS2408):
|
||||||
|
// // Put everything in a buffer so we can compute the CRC easily.
|
||||||
|
// uint8_t buf[13];
|
||||||
|
// buf[0] = 0xF0; // Read PIO Registers
|
||||||
|
// buf[1] = 0x88; // LSB address
|
||||||
|
// buf[2] = 0x00; // MSB address
|
||||||
|
// WriteBytes(net, buf, 3); // Write 3 cmd bytes
|
||||||
|
// ReadBytes(net, buf+3, 10); // Read 6 data bytes, 2 0xFF, 2 CRC16
|
||||||
|
// if (!CheckCRC16(buf, 11, &buf[11])) {
|
||||||
|
// // Handle error.
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @param input - Array of bytes to checksum.
|
||||||
|
// @param len - How many bytes to use.
|
||||||
|
// @param inverted_crc - The two CRC16 bytes in the received data.
|
||||||
|
// This should just point into the received data,
|
||||||
|
// *not* at a 16-bit integer.
|
||||||
|
// @param crc - The crc starting value (optional)
|
||||||
|
// @return True, iff the CRC matches.
|
||||||
|
static bool check_crc16(const uint8_t* input, uint16_t len, const uint8_t* inverted_crc, uint16_t crc = 0);
|
||||||
|
|
||||||
|
// Compute a Dallas Semiconductor 16 bit CRC. This is required to check
|
||||||
|
// the integrity of data received from many 1-Wire devices. Note that the
|
||||||
|
// CRC computed here is *not* what you'll get from the 1-Wire network,
|
||||||
|
// for two reasons:
|
||||||
|
// 1) The CRC is transmitted bitwise inverted.
|
||||||
|
// 2) Depending on the endian-ness of your processor, the binary
|
||||||
|
// representation of the two-byte return value may have a different
|
||||||
|
// byte order than the two bytes you get from 1-Wire.
|
||||||
|
// @param input - Array of bytes to checksum.
|
||||||
|
// @param len - How many bytes to use.
|
||||||
|
// @param crc - The crc starting value (optional)
|
||||||
|
// @return The CRC16, as defined by Dallas Semiconductor.
|
||||||
|
static uint16_t crc16(const uint8_t* input, uint16_t len, uint16_t crc = 0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
334
Source Code/NixieClock/RTClib.cpp
Executable file
334
Source Code/NixieClock/RTClib.cpp
Executable file
@ -0,0 +1,334 @@
|
|||||||
|
// Code by JeeLabs http://news.jeelabs.org/code/
|
||||||
|
// Released to the public domain! Enjoy!
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include "RTClib.h"
|
||||||
|
#ifdef __AVR__
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#define WIRE Wire
|
||||||
|
#else
|
||||||
|
#define PROGMEM
|
||||||
|
#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
|
||||||
|
#define WIRE Wire1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DS1307_ADDRESS 0x68
|
||||||
|
#define DS1307_CONTROL 0x07
|
||||||
|
#define DS1307_NVRAM 0x08
|
||||||
|
#define SECONDS_PER_DAY 86400L
|
||||||
|
|
||||||
|
#define SECONDS_FROM_1970_TO_2000 946684800
|
||||||
|
|
||||||
|
#if (ARDUINO >= 100)
|
||||||
|
#include <Arduino.h> // capital A so it is error prone on case-sensitive filesystems
|
||||||
|
// Macro to deal with the difference in I2C write functions from old and new Arduino versions.
|
||||||
|
#define _I2C_WRITE write
|
||||||
|
#define _I2C_READ read
|
||||||
|
#else
|
||||||
|
#include <WProgram.h>
|
||||||
|
#define _I2C_WRITE send
|
||||||
|
#define _I2C_READ receive
|
||||||
|
#endif
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// utility code, some of this could be exposed in the DateTime API if needed
|
||||||
|
|
||||||
|
const uint8_t daysInMonth [] PROGMEM = { 31,28,31,30,31,30,31,31,30,31,30,31 };
|
||||||
|
|
||||||
|
// number of days since 2000/01/01, valid for 2001..2099
|
||||||
|
static uint16_t date2days(uint16_t y, uint8_t m, uint8_t d) {
|
||||||
|
if (y >= 2000)
|
||||||
|
y -= 2000;
|
||||||
|
uint16_t days = d;
|
||||||
|
for (uint8_t i = 1; i < m; ++i)
|
||||||
|
days += pgm_read_byte(daysInMonth + i - 1);
|
||||||
|
if (m > 2 && y % 4 == 0)
|
||||||
|
++days;
|
||||||
|
return days + 365 * y + (y + 3) / 4 - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static long time2long(uint16_t days, uint8_t h, uint8_t m, uint8_t s) {
|
||||||
|
return ((days * 24L + h) * 60 + m) * 60 + s;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// DateTime implementation - ignores time zones and DST changes
|
||||||
|
// NOTE: also ignores leap seconds, see http://en.wikipedia.org/wiki/Leap_second
|
||||||
|
|
||||||
|
DateTime::DateTime (uint32_t t) {
|
||||||
|
t -= SECONDS_FROM_1970_TO_2000; // bring to 2000 timestamp from 1970
|
||||||
|
|
||||||
|
ss = t % 60;
|
||||||
|
t /= 60;
|
||||||
|
mm = t % 60;
|
||||||
|
t /= 60;
|
||||||
|
hh = t % 24;
|
||||||
|
uint16_t days = t / 24;
|
||||||
|
uint8_t leap;
|
||||||
|
for (yOff = 0; ; ++yOff) {
|
||||||
|
leap = yOff % 4 == 0;
|
||||||
|
if (days < 365 + leap)
|
||||||
|
break;
|
||||||
|
days -= 365 + leap;
|
||||||
|
}
|
||||||
|
for (m = 1; ; ++m) {
|
||||||
|
uint8_t daysPerMonth = pgm_read_byte(daysInMonth + m - 1);
|
||||||
|
if (leap && m == 2)
|
||||||
|
++daysPerMonth;
|
||||||
|
if (days < daysPerMonth)
|
||||||
|
break;
|
||||||
|
days -= daysPerMonth;
|
||||||
|
}
|
||||||
|
d = days + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DateTime::DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) {
|
||||||
|
if (year >= 2000)
|
||||||
|
year -= 2000;
|
||||||
|
yOff = year;
|
||||||
|
m = month;
|
||||||
|
d = day;
|
||||||
|
hh = hour;
|
||||||
|
mm = min;
|
||||||
|
ss = sec;
|
||||||
|
}
|
||||||
|
|
||||||
|
DateTime::DateTime (const DateTime& copy):
|
||||||
|
yOff(copy.yOff),
|
||||||
|
m(copy.m),
|
||||||
|
d(copy.d),
|
||||||
|
hh(copy.hh),
|
||||||
|
mm(copy.mm),
|
||||||
|
ss(copy.ss)
|
||||||
|
{}
|
||||||
|
|
||||||
|
static uint8_t conv2d(const char* p) {
|
||||||
|
uint8_t v = 0;
|
||||||
|
if ('0' <= *p && *p <= '9')
|
||||||
|
v = *p - '0';
|
||||||
|
return 10 * v + *++p - '0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// A convenient constructor for using "the compiler's time":
|
||||||
|
// DateTime now (__DATE__, __TIME__);
|
||||||
|
// NOTE: using F() would further reduce the RAM footprint, see below.
|
||||||
|
DateTime::DateTime (const char* date, const char* time) {
|
||||||
|
// sample input: date = "Dec 26 2009", time = "12:34:56"
|
||||||
|
yOff = conv2d(date + 9);
|
||||||
|
// Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
|
||||||
|
switch (date[0]) {
|
||||||
|
case 'J': m = date[1] == 'a' ? 1 : m = date[2] == 'n' ? 6 : 7; break;
|
||||||
|
case 'F': m = 2; break;
|
||||||
|
case 'A': m = date[2] == 'r' ? 4 : 8; break;
|
||||||
|
case 'M': m = date[2] == 'r' ? 3 : 5; break;
|
||||||
|
case 'S': m = 9; break;
|
||||||
|
case 'O': m = 10; break;
|
||||||
|
case 'N': m = 11; break;
|
||||||
|
case 'D': m = 12; break;
|
||||||
|
}
|
||||||
|
d = conv2d(date + 4);
|
||||||
|
hh = conv2d(time);
|
||||||
|
mm = conv2d(time + 3);
|
||||||
|
ss = conv2d(time + 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
// A convenient constructor for using "the compiler's time":
|
||||||
|
// This version will save RAM by using PROGMEM to store it by using the F macro.
|
||||||
|
// DateTime now (F(__DATE__), F(__TIME__));
|
||||||
|
DateTime::DateTime (const __FlashStringHelper* date, const __FlashStringHelper* time) {
|
||||||
|
// sample input: date = "Dec 26 2009", time = "12:34:56"
|
||||||
|
char buff[11];
|
||||||
|
memcpy_P(buff, date, 11);
|
||||||
|
yOff = conv2d(buff + 9);
|
||||||
|
// Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
|
||||||
|
switch (buff[0]) {
|
||||||
|
case 'J': m = buff[1] == 'a' ? 1 : m = buff[2] == 'n' ? 6 : 7; break;
|
||||||
|
case 'F': m = 2; break;
|
||||||
|
case 'A': m = buff[2] == 'r' ? 4 : 8; break;
|
||||||
|
case 'M': m = buff[2] == 'r' ? 3 : 5; break;
|
||||||
|
case 'S': m = 9; break;
|
||||||
|
case 'O': m = 10; break;
|
||||||
|
case 'N': m = 11; break;
|
||||||
|
case 'D': m = 12; break;
|
||||||
|
}
|
||||||
|
d = conv2d(buff + 4);
|
||||||
|
memcpy_P(buff, time, 8);
|
||||||
|
hh = conv2d(buff);
|
||||||
|
mm = conv2d(buff + 3);
|
||||||
|
ss = conv2d(buff + 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t DateTime::dayOfWeek() const {
|
||||||
|
uint16_t day = date2days(yOff, m, d);
|
||||||
|
return (day + 6) % 7; // Jan 1, 2000 is a Saturday, i.e. returns 6
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t DateTime::unixtime(void) const {
|
||||||
|
uint32_t t;
|
||||||
|
uint16_t days = date2days(yOff, m, d);
|
||||||
|
t = time2long(days, hh, mm, ss);
|
||||||
|
t += SECONDS_FROM_1970_TO_2000; // seconds from 1970 to 2000
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
long DateTime::secondstime(void) const {
|
||||||
|
long t;
|
||||||
|
uint16_t days = date2days(yOff, m, d);
|
||||||
|
t = time2long(days, hh, mm, ss);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
DateTime DateTime::operator+(const TimeSpan& span) {
|
||||||
|
return DateTime(unixtime()+span.totalseconds());
|
||||||
|
}
|
||||||
|
|
||||||
|
DateTime DateTime::operator-(const TimeSpan& span) {
|
||||||
|
return DateTime(unixtime()-span.totalseconds());
|
||||||
|
}
|
||||||
|
|
||||||
|
TimeSpan DateTime::operator-(const DateTime& right) {
|
||||||
|
return TimeSpan(unixtime()-right.unixtime());
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// TimeSpan implementation
|
||||||
|
|
||||||
|
TimeSpan::TimeSpan (int32_t seconds):
|
||||||
|
_seconds(seconds)
|
||||||
|
{}
|
||||||
|
|
||||||
|
TimeSpan::TimeSpan (int16_t days, int8_t hours, int8_t minutes, int8_t seconds):
|
||||||
|
_seconds(days*86400L + hours*3600 + minutes*60 + seconds)
|
||||||
|
{}
|
||||||
|
|
||||||
|
TimeSpan::TimeSpan (const TimeSpan& copy):
|
||||||
|
_seconds(copy._seconds)
|
||||||
|
{}
|
||||||
|
|
||||||
|
TimeSpan TimeSpan::operator+(const TimeSpan& right) {
|
||||||
|
return TimeSpan(_seconds+right._seconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
TimeSpan TimeSpan::operator-(const TimeSpan& right) {
|
||||||
|
return TimeSpan(_seconds-right._seconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// RTC_DS1307 implementation
|
||||||
|
|
||||||
|
static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); }
|
||||||
|
static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); }
|
||||||
|
|
||||||
|
uint8_t RTC_DS1307::begin(void) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t RTC_DS1307::isrunning(void) {
|
||||||
|
WIRE.beginTransmission(DS1307_ADDRESS);
|
||||||
|
WIRE._I2C_WRITE(0);
|
||||||
|
WIRE.endTransmission();
|
||||||
|
|
||||||
|
WIRE.requestFrom(DS1307_ADDRESS, 1);
|
||||||
|
uint8_t ss = WIRE._I2C_READ();
|
||||||
|
return !(ss>>7);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RTC_DS1307::adjust(const DateTime& dt) {
|
||||||
|
WIRE.beginTransmission(DS1307_ADDRESS);
|
||||||
|
WIRE._I2C_WRITE(0);
|
||||||
|
WIRE._I2C_WRITE(bin2bcd(dt.second()));
|
||||||
|
WIRE._I2C_WRITE(bin2bcd(dt.minute()));
|
||||||
|
WIRE._I2C_WRITE(bin2bcd(dt.hour()));
|
||||||
|
WIRE._I2C_WRITE(bin2bcd(0));
|
||||||
|
WIRE._I2C_WRITE(bin2bcd(dt.day()));
|
||||||
|
WIRE._I2C_WRITE(bin2bcd(dt.month()));
|
||||||
|
WIRE._I2C_WRITE(bin2bcd(dt.year() - 2000));
|
||||||
|
WIRE._I2C_WRITE(0);
|
||||||
|
WIRE.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
DateTime RTC_DS1307::now() {
|
||||||
|
WIRE.beginTransmission(DS1307_ADDRESS);
|
||||||
|
WIRE._I2C_WRITE(0);
|
||||||
|
WIRE.endTransmission();
|
||||||
|
|
||||||
|
WIRE.requestFrom(DS1307_ADDRESS, 7);
|
||||||
|
uint8_t ss = bcd2bin(WIRE._I2C_READ() & 0x7F);
|
||||||
|
uint8_t mm = bcd2bin(WIRE._I2C_READ());
|
||||||
|
uint8_t hh = bcd2bin(WIRE._I2C_READ());
|
||||||
|
WIRE._I2C_READ();
|
||||||
|
uint8_t d = bcd2bin(WIRE._I2C_READ());
|
||||||
|
uint8_t m = bcd2bin(WIRE._I2C_READ());
|
||||||
|
uint16_t y = bcd2bin(WIRE._I2C_READ()) + 2000;
|
||||||
|
|
||||||
|
return DateTime (y, m, d, hh, mm, ss);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ds1307SqwPinMode RTC_DS1307::readSqwPinMode() {
|
||||||
|
int mode;
|
||||||
|
|
||||||
|
WIRE.beginTransmission(DS1307_ADDRESS);
|
||||||
|
WIRE._I2C_WRITE(DS1307_CONTROL);
|
||||||
|
WIRE.endTransmission();
|
||||||
|
|
||||||
|
WIRE.requestFrom((uint8_t)DS1307_ADDRESS, (uint8_t)1);
|
||||||
|
mode = WIRE._I2C_READ();
|
||||||
|
|
||||||
|
mode &= 0x93;
|
||||||
|
return static_cast<Ds1307SqwPinMode>(mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RTC_DS1307::writeSqwPinMode(Ds1307SqwPinMode mode) {
|
||||||
|
WIRE.beginTransmission(DS1307_ADDRESS);
|
||||||
|
WIRE._I2C_WRITE(DS1307_CONTROL);
|
||||||
|
WIRE._I2C_WRITE(mode);
|
||||||
|
WIRE.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RTC_DS1307::readnvram(uint8_t* buf, uint8_t size, uint8_t address) {
|
||||||
|
int addrByte = DS1307_NVRAM + address;
|
||||||
|
WIRE.beginTransmission(DS1307_ADDRESS);
|
||||||
|
WIRE._I2C_WRITE(addrByte);
|
||||||
|
WIRE.endTransmission();
|
||||||
|
|
||||||
|
WIRE.requestFrom((uint8_t) DS1307_ADDRESS, size);
|
||||||
|
for (uint8_t pos = 0; pos < size; ++pos) {
|
||||||
|
buf[pos] = WIRE._I2C_READ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RTC_DS1307::writenvram(uint8_t address, uint8_t* buf, uint8_t size) {
|
||||||
|
int addrByte = DS1307_NVRAM + address;
|
||||||
|
WIRE.beginTransmission(DS1307_ADDRESS);
|
||||||
|
WIRE._I2C_WRITE(addrByte);
|
||||||
|
for (uint8_t pos = 0; pos < size; ++pos) {
|
||||||
|
WIRE._I2C_WRITE(buf[pos]);
|
||||||
|
}
|
||||||
|
WIRE.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t RTC_DS1307::readnvram(uint8_t address) {
|
||||||
|
uint8_t data;
|
||||||
|
readnvram(&data, 1, address);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RTC_DS1307::writenvram(uint8_t address, uint8_t data) {
|
||||||
|
writenvram(address, &data, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// RTC_Millis implementation
|
||||||
|
|
||||||
|
long RTC_Millis::offset = 0;
|
||||||
|
|
||||||
|
void RTC_Millis::adjust(const DateTime& dt) {
|
||||||
|
offset = dt.unixtime() - millis() / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
DateTime RTC_Millis::now() {
|
||||||
|
return (uint32_t)(offset + millis() / 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
87
Source Code/NixieClock/RTClib.h
Executable file
87
Source Code/NixieClock/RTClib.h
Executable file
@ -0,0 +1,87 @@
|
|||||||
|
// Code by JeeLabs http://news.jeelabs.org/code/
|
||||||
|
// Released to the public domain! Enjoy!
|
||||||
|
|
||||||
|
#ifndef _RTCLIB_H_
|
||||||
|
#define _RTCLIB_H_
|
||||||
|
|
||||||
|
class TimeSpan;
|
||||||
|
|
||||||
|
// Simple general-purpose date/time class (no TZ / DST / leap second handling!)
|
||||||
|
class DateTime {
|
||||||
|
public:
|
||||||
|
DateTime (uint32_t t =0);
|
||||||
|
DateTime (uint16_t year, uint8_t month, uint8_t day,
|
||||||
|
uint8_t hour =0, uint8_t min =0, uint8_t sec =0);
|
||||||
|
DateTime (const DateTime& copy);
|
||||||
|
DateTime (const char* date, const char* time);
|
||||||
|
DateTime (const __FlashStringHelper* date, const __FlashStringHelper* time);
|
||||||
|
uint16_t year() const { return 2000 + yOff; }
|
||||||
|
uint8_t month() const { return m; }
|
||||||
|
uint8_t day() const { return d; }
|
||||||
|
uint8_t hour() const { return hh; }
|
||||||
|
uint8_t minute() const { return mm; }
|
||||||
|
uint8_t second() const { return ss; }
|
||||||
|
uint8_t dayOfWeek() const;
|
||||||
|
|
||||||
|
// 32-bit times as seconds since 1/1/2000
|
||||||
|
long secondstime() const;
|
||||||
|
// 32-bit times as seconds since 1/1/1970
|
||||||
|
uint32_t unixtime(void) const;
|
||||||
|
|
||||||
|
DateTime operator+(const TimeSpan& span);
|
||||||
|
DateTime operator-(const TimeSpan& span);
|
||||||
|
TimeSpan operator-(const DateTime& right);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
uint8_t yOff, m, d, hh, mm, ss;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Timespan which can represent changes in time with seconds accuracy.
|
||||||
|
class TimeSpan {
|
||||||
|
public:
|
||||||
|
TimeSpan (int32_t seconds = 0);
|
||||||
|
TimeSpan (int16_t days, int8_t hours, int8_t minutes, int8_t seconds);
|
||||||
|
TimeSpan (const TimeSpan& copy);
|
||||||
|
int16_t days() const { return _seconds / 86400L; }
|
||||||
|
int8_t hours() const { return _seconds / 3600 % 24; }
|
||||||
|
int8_t minutes() const { return _seconds / 60 % 60; }
|
||||||
|
int8_t seconds() const { return _seconds % 60; }
|
||||||
|
int32_t totalseconds() const { return _seconds; }
|
||||||
|
|
||||||
|
TimeSpan operator+(const TimeSpan& right);
|
||||||
|
TimeSpan operator-(const TimeSpan& right);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int32_t _seconds;
|
||||||
|
};
|
||||||
|
|
||||||
|
// RTC based on the DS1307 chip connected via I2C and the Wire library
|
||||||
|
enum Ds1307SqwPinMode { OFF = 0x00, ON = 0x80, SquareWave1HZ = 0x10, SquareWave4kHz = 0x11, SquareWave8kHz = 0x12, SquareWave32kHz = 0x13 };
|
||||||
|
|
||||||
|
class RTC_DS1307 {
|
||||||
|
public:
|
||||||
|
static uint8_t begin(void);
|
||||||
|
static void adjust(const DateTime& dt);
|
||||||
|
uint8_t isrunning(void);
|
||||||
|
static DateTime now();
|
||||||
|
static Ds1307SqwPinMode readSqwPinMode();
|
||||||
|
static void writeSqwPinMode(Ds1307SqwPinMode mode);
|
||||||
|
uint8_t readnvram(uint8_t address);
|
||||||
|
void readnvram(uint8_t* buf, uint8_t size, uint8_t address);
|
||||||
|
void writenvram(uint8_t address, uint8_t data);
|
||||||
|
void writenvram(uint8_t address, uint8_t* buf, uint8_t size);
|
||||||
|
};
|
||||||
|
|
||||||
|
// RTC using the internal millis() clock, has to be initialized before use
|
||||||
|
// NOTE: this clock won't be correct once the millis() timer rolls over (>49d?)
|
||||||
|
class RTC_Millis {
|
||||||
|
public:
|
||||||
|
static void begin(const DateTime& dt) { adjust(dt); }
|
||||||
|
static void adjust(const DateTime& dt);
|
||||||
|
static DateTime now();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static long offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _RTCLIB_H_
|
85
Source Code/NixieClock/Registers.cpp
Normal file
85
Source Code/NixieClock/Registers.cpp
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
//
|
||||||
|
// Registers.cpp
|
||||||
|
//
|
||||||
|
// Created by Mr. Gecko's Media (James Coleman) on 7/23/14.
|
||||||
|
// No Copyright Claimed. Public Domain.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "Registers.h"
|
||||||
|
|
||||||
|
#if (ARDUINO >= 100)
|
||||||
|
#include "Arduino.h"
|
||||||
|
#else
|
||||||
|
#include "WProgram.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Registers::Registers() {
|
||||||
|
serialPin = 0;
|
||||||
|
serialClockPin = 0;
|
||||||
|
registerClockPin = 0;
|
||||||
|
|
||||||
|
registerCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Registers::initialize(unsigned int theSerialPin, unsigned int theSerialClockPin, unsigned int theRegisterClockPin, unsigned int theRegisterCount) {
|
||||||
|
if (theRegisterCount>25)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
serialPin = theSerialPin;
|
||||||
|
serialClockPin = theSerialClockPin;
|
||||||
|
registerClockPin = theRegisterClockPin;
|
||||||
|
|
||||||
|
pinMode(serialPin, OUTPUT);
|
||||||
|
pinMode(serialClockPin, OUTPUT);
|
||||||
|
pinMode(registerClockPin, OUTPUT);
|
||||||
|
|
||||||
|
registerCount = theRegisterCount;
|
||||||
|
|
||||||
|
setAllPins(LOW);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Registers::setPin(unsigned int pin, bool value) {
|
||||||
|
unsigned int registerNumber = pin/8;
|
||||||
|
unsigned int pinNumber = pin%8;
|
||||||
|
if (registerNumber>=registerCount)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
byte registerValue = registerValues[registerNumber];
|
||||||
|
registerValue &= ~(1 << pinNumber); // Sets pin to LOW
|
||||||
|
registerValue |= (value << pinNumber); // Sets pin to value
|
||||||
|
registerValues[registerNumber] = registerValue;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Registers::setAllPins(bool value) {
|
||||||
|
if (registerCount==0)
|
||||||
|
return;
|
||||||
|
for (int i=0; i<(registerCount*8); i++) {
|
||||||
|
setPin(i, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Registers::update() {
|
||||||
|
if (registerCount==0)
|
||||||
|
return;
|
||||||
|
// Prepare for updating
|
||||||
|
digitalWrite(registerClockPin, LOW);
|
||||||
|
digitalWrite(serialPin, LOW);
|
||||||
|
digitalWrite(serialClockPin, LOW);
|
||||||
|
|
||||||
|
for (int registerNumber = registerCount-1; registerNumber>=0; registerNumber--) {
|
||||||
|
byte registerValue = registerValues[registerNumber];
|
||||||
|
for (int pinNumber = 7; pinNumber>=0; pinNumber--) {
|
||||||
|
digitalWrite(serialClockPin, LOW); // Tell register that a value is getting ready to be written
|
||||||
|
|
||||||
|
bool value = registerValue & (1 << pinNumber); // Grab value for pin
|
||||||
|
digitalWrite(serialPin, value); // Write value
|
||||||
|
|
||||||
|
digitalWrite(serialClockPin, HIGH); // Tell register to capture new value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
digitalWrite(serialClockPin, LOW); // Close out register
|
||||||
|
digitalWrite(registerClockPin, HIGH); // Make new values live
|
||||||
|
}
|
32
Source Code/NixieClock/Registers.h
Normal file
32
Source Code/NixieClock/Registers.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
//
|
||||||
|
// Registers.h
|
||||||
|
//
|
||||||
|
// Created by Mr. Gecko's Media (James Coleman) on 7/23/14.
|
||||||
|
// No Copyright Claimed. Public Domain.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef Registers_h
|
||||||
|
#define Registers_h
|
||||||
|
|
||||||
|
#if (ARDUINO >= 100)
|
||||||
|
#include "Arduino.h"
|
||||||
|
#else
|
||||||
|
#include "WProgram.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class Registers {
|
||||||
|
public:
|
||||||
|
Registers();
|
||||||
|
bool initialize(unsigned int theSerialPin, unsigned int theSerialClockPin, unsigned int theRegisterClockPin, unsigned int theRegisterCount);
|
||||||
|
bool setPin(unsigned int pin, bool value);
|
||||||
|
void setAllPins(bool value);
|
||||||
|
void update();
|
||||||
|
private:
|
||||||
|
unsigned int serialPin; // Also known as SER, or data pin
|
||||||
|
unsigned int serialClockPin; // Also known as SRCLK or shift pin
|
||||||
|
unsigned int registerClockPin; // Also known as RCLK, latch, or load pin
|
||||||
|
unsigned int registerCount; // Number of registers in chian
|
||||||
|
byte registerValues[25]; // 8-bit values for each register
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
1
Source Code/NixieTest
Submodule
1
Source Code/NixieTest
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 5f7222761025921dccc32170157707ac83fd4e4b
|
1
Source Code/SerialSetTime
Submodule
1
Source Code/SerialSetTime
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 03d9501c2976d636de583e4279f820b84f83ced9
|
Loading…
Reference in New Issue
Block a user