Browse Source

Nixie Clock Start

master
GRMrGecko 10 years ago
commit
4592cc07b8
  1. 14
      Available pins.txt
  2. 191
      LaenPCBOrder.cam
  3. 69
      LaenPCBOrder.dru
  4. 3
      Licenses.txt
  5. 2602
      Modified Board/NixieClock.brd
  6. 4775
      Modified Board/NixieClock.sch
  7. 114
      Modified Board/Osh Park/NixieClock.boardoutline.ger
  8. 37
      Modified Board/Osh Park/NixieClock.boardoutline.gpi
  9. 9886
      Modified Board/Osh Park/NixieClock.bottomlayer.ger
  10. 49
      Modified Board/Osh Park/NixieClock.bottomlayer.gpi
  11. 99
      Modified Board/Osh Park/NixieClock.bottomsilkscreen.ger
  12. 37
      Modified Board/Osh Park/NixieClock.bottomsilkscreen.gpi
  13. 490
      Modified Board/Osh Park/NixieClock.bottomsoldermask.ger
  14. 46
      Modified Board/Osh Park/NixieClock.bottomsoldermask.gpi
  15. 45
      Modified Board/Osh Park/NixieClock.drills.dri
  16. 415
      Modified Board/Osh Park/NixieClock.drills.xln
  17. 10
      Modified Board/Osh Park/NixieClock.tcream.ger
  18. 36
      Modified Board/Osh Park/NixieClock.tcream.gpi
  19. 11662
      Modified Board/Osh Park/NixieClock.toplayer.ger
  20. 48
      Modified Board/Osh Park/NixieClock.toplayer.gpi
  21. 4853
      Modified Board/Osh Park/NixieClock.topsilkscreen.ger
  22. 49
      Modified Board/Osh Park/NixieClock.topsilkscreen.gpi
  23. 490
      Modified Board/Osh Park/NixieClock.topsoldermask.ger
  24. 46
      Modified Board/Osh Park/NixieClock.topsoldermask.gpi
  25. BIN
      Modified Board/bottom.png
  26. BIN
      Modified Board/top.png
  27. 3
      Notes.txt
  28. 2551
      Original Board/NixieClock.brd
  29. 4689
      Original Board/NixieClock.sch
  30. 16
      Readme.md
  31. 112
      Source Code/NixieClock/Examples/OneWire/DS18x20_Temperature/DS18x20_Temperature.pde
  32. 77
      Source Code/NixieClock/Examples/OneWire/DS2408_Switch/DS2408_Switch.pde
  33. 90
      Source Code/NixieClock/Examples/OneWire/DS250x_PROM/DS250x_PROM.pde
  34. 102
      Source Code/NixieClock/Examples/RTClib/datecalc/datecalc.ino
  35. 68
      Source Code/NixieClock/Examples/RTClib/ds1307/ds1307.ino
  36. 56
      Source Code/NixieClock/Examples/RTClib/ds1307SqwPin/ds1307SqwPin.ino
  37. 59
      Source Code/NixieClock/Examples/RTClib/ds1307nvram/ds1307nvram.ino
  38. 55
      Source Code/NixieClock/Examples/RTClib/softrtc/softrtc.ino
  39. 265
      Source Code/NixieClock/NixieClock.ino
  40. 73
      Source Code/NixieClock/Nixies.cpp
  41. 34
      Source Code/NixieClock/Nixies.h
  42. 557
      Source Code/NixieClock/OneWire.cpp
  43. 229
      Source Code/NixieClock/OneWire.h
  44. 334
      Source Code/NixieClock/RTClib.cpp
  45. 87
      Source Code/NixieClock/RTClib.h
  46. 85
      Source Code/NixieClock/Registers.cpp
  47. 32
      Source Code/NixieClock/Registers.h
  48. 1
      Source Code/NixieTest
  49. 1
      Source Code/SerialSetTime

14
Available pins.txt

@ -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

@ -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

@ -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

@ -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
File diff suppressed because it is too large
View File

4775
Modified Board/NixieClock.sch
File diff suppressed because it is too large
View File

114
Modified Board/Osh Park/NixieClock.boardoutline.ger

@ -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

@ -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
File diff suppressed because it is too large
View File

49
Modified Board/Osh Park/NixieClock.bottomlayer.gpi

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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
File diff suppressed because it is too large
View File

48
Modified Board/Osh Park/NixieClock.toplayer.gpi

@ -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
File diff suppressed because it is too large
View File

49
Modified Board/Osh Park/NixieClock.topsilkscreen.gpi

@ -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

@ -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

@ -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

After

Width: 1304  |  Height: 722  |  Size: 41 KiB

BIN
Modified Board/top.png

After

Width: 1304  |  Height: 722  |  Size: 53 KiB

3
Notes.txt

@ -0,0 +1,3 @@
1K for temp
10k under arduino
27k for nixies

2551
Original Board/NixieClock.brd
File diff suppressed because it is too large
View File

4689
Original Board/NixieClock.sch
File diff suppressed because it is too large
View File

16
Readme.md

@ -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

112
Source Code/NixieClock/Examples/OneWire/DS18x20_Temperature/DS18x20_Temperature.pde

@ -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");
}

77
Source Code/NixieClock/Examples/OneWire/DS2408_Switch/DS2408_Switch.pde

@ -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);
}

90
Source Code/NixieClock/Examples/OneWire/DS250x_PROM/DS250x_PROM.pde

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -0,0 +1 @@
Subproject commit 5f7222761025921dccc32170157707ac83fd4e4b

1
Source Code/SerialSetTime

@ -0,0 +1 @@
Subproject commit 03d9501c2976d636de583e4279f820b84f83ced9
Loading…
Cancel
Save