Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino Shield NCS314 NIXIE Röhren Uhr IN-14

Komponenten und Verbrauchsmaterialien

Shield Nixie Tubes IN-14 NCS314 Arduino für Nixie Tubes Clock etc .
Schild auf Nixie-Röhren IN-14
× 1
Shield Nixie Tubes Clock IN-12 NCS312 für xUSSR Nixie Tubes
× 1
Arduino UNO
Shield unterstützt Arduino UNO/Genuino oder Arduino MEGA
× 1
Arduino Mega 2560
Shield unterstützt Arduino UNO/Genuino oder Arduino MEGA
× 1
Netzteil 12V 1A
× 1
Acrylhülle für SHIELD NCS314
Das schöne Acrylglas-Modell ACNS314 ist vollständig kompatibel mit Nixie Arduino Shield NCS314 HW-Versionen von v1.X – 2 .X
× 1

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Übersicht

Nachdem wir zunächst Zugang zu einem schier unerschöpflichen Vorrat an erstklassigen sowjetischen Nixie-Röhren IN-12, IN-14 und IN-18 hatten, sollte eine einfache Präsentation der Nixie-Röhren als Shield für Arduino erfolgen. Arduino hatten wir damals schon, so dass das Gehäuse klein blieb (so dachten wir damals). Damals wussten wir noch nichts über den Umgang mit solchen Lampen.

Sehr schnell fanden wir im Internet ein Schema zur Stromversorgung solcher Röhren:

JA! Es scheint! Dass wir gerade gesehen haben, hat uns wie ein kleines Wunder fassungslos gemacht und wir haben gemerkt, dass wir auf dem richtigen Weg sind. Sofort begann die Fotosession:

Am nächsten Tag begann die Diskussion über das Konzept des zukünftigen Projekts:Um die Kosten zu vereinfachen und zu reduzieren, wurde beschlossen, das Schema mit einem dynamischen Anzeigeprinzip zu verwenden, aber später wurde beschlossen, es zugunsten des Schemas mit einem vollständig aufzugeben statischer Anzeigemodus. Bei IN-14 Nixie-Röhren ist der optische Unterschied zwar nicht wahrnehmbar, aber bei den IN-18-Lampen ist der Unterschied spürbar - im dynamischen Modus arbeiten sie nicht so hell, viele von ihnen erscheinen, sogenannter Blue-Spot-Effekt:

Dynamischer Anzeigemodus ist ein Modus, in dem nicht zu jeder Zeit alle Röhren beleuchtet sind und nur eine (zur Zeit) auch andere Arten sein können, wenn gleichzeitig beispielsweise nur zwei Lampen beleuchtet werden.

Bei der Diskussion über die Zukunft des Geräts, sobald beschlossen wurde, die Möglichkeit zu implementieren, Informationen über die vom Computer kommenden Röhren anzuzeigen, können Enthusiasten ihr eigenes Gerät erstellen, das auf den Lampen angezeigt wird, z ungelesene Nachrichten oder die Anzahl der Runden im Spiel, wie z. B. Fallout.

Dann begann die Auswahl der Hardware, die Kathoden (Zahlen) in den Röhren schalten konnte. Die Wahl lag auf der Hand - die Schieberegister mit SPI, um MCU-Pins zu sparen. Aber da die Versorgungsspannung der Röhren sehr hoch ist - bis zu 200 Volt, sind die Optionen nicht so groß:HV513, HV5812, HV5122. Und während wir das Gerät auf jedem dieser Chips bauten, blieben wir beim HV5812 (In der neuen Shields-Version NCS314 V2.X und NCS312 V1.X verwendet IC HV5122). Dieser Chip ist sehr praktisch, da Sie damit zwei Lampen gleichzeitig als 20-Bit-Register steuern können.

Um 6 Röhren zu steuern, benötigen wir drei solcher Schaltkreise, die in Reihe miteinander verbunden sind. Dies ermöglicht es, einmal Pakete über SPI zu senden und sich nicht um die Aktualisierung der Informationen auf Röhren zu kümmern, wie dies bei einem dynamischen Anzeigealgorithmus der Fall wäre. Das heißt, mit anderen Worten - solange wir die Informationen auf den Röhren nicht ändern müssen, kann die MCU mit anderen Aufgaben beschäftigt sein, sogar mit dem Schlafen!

Wir möchten über die Übertragung von Daten auf SPI sagen. Arudino kann nur 8 Bit gleichzeitig übertragen. Und wir brauchen 60, die nächste höhere ganze Zahl ist durch 8 teilbar ist 64, und müssen daher ein bisschen Magie anwenden - um eine große Variable vom Typ unsigned long long var64 Bits für jedes Register zu bilden und 8 mal 8 Bits jedes Mal durch . zu übergeben Verschieben aller Bits innerhalb der Variablen nach rechts:

 SPI.transfer(var64); SPI.transfer(var64>>48); SPI.transfer(var64>>40); SPI.transfer(var64>>32); SPI.transfer(var64>>24); SPI.transfer(var64>>16); SPI.transfer(var64>>8); SPI.transfer(iTmp);  

Die gesetzten und erreichten Ziele wurden umgesetzt:

  • Statische Anzeige basierend auf Schieberegistern.
  • Spielautomat (Ani-Vergiftung)
  • Stellen Sie die Standardfunktionen für die Uhr, die Uhr, das Datum, die Uhrzeit und den Wecker bereit.
  • RTC (Real Time Clock) mit Batterie CR1220. (Die neue Version des V1.2-2.X-Boards verwendet einen hochpräzisen Zeitchip RTC DS3231).
  • Temperaturmessung DS18B20 [Celsius oder Fahrenheit].
  • Steuerung über den IR-Port TSOP4836 (Work only Mega). Geprüft mit Fernbedienung Sony RM-X151, aber es ist möglich und andere Fernbedienung mit einer Frequenz von 36 kHz.
  • Zeitsynchronisation mit externem GPS (Work only Mega)
  • Einfaches Menü.
  • Getrenntes Management des Dickdarms (der untere und obere Punkt)
  • RGB-Hintergrundbeleuchtungsfarben mit einer reibungslosen Übertragung
  • RTTTL-Klingelton für den Alarm (Ring Tone Transfer Language)
  • Spielautomat (um Vergiftungsindikatoren zu verhindern)
  • Im Selbsttest. (Überprüfen Sie alle Zahlen in jedem Display von 0 bis 9, um alle LEDs zu überprüfen, ein serieller Schalter Farben blau, rot, grün, Soundcheck (Klingeltöne abspielen)

Diese Aufgaben, die nicht vollständig realisiert werden konnten.

  • Lichtsensor

Code

  • Unbenannte Datei
Unbenannte DateiC/C++
const String FirmwareVersion="010000";//Format _X.XX__ //NIXIE CLOCK SHIELD NCS314 von GRA &AFCH ([email protected])//25.05.2016 #include #include #include #include #include #include const byte LEpin=7; // Pin Latch Enabled Daten akzeptiert während HI levelconst Byte DHVpin =5; // aus/ein MAX1771 Driver Hight Voltage (DHV) 110-220V const byte RedLedPin=9; // MCU WDM-Ausgang für rote LEDs 9-gconst Byte GreenLedPin =6; // MCU WDM-Ausgang für grüne LEDs 6-bconst-Byte BlueLedPin =3; // MCU WDM-Ausgang für blaue LEDs 3-rconst Byte PinSet=A0;const Byte PinUp=A2;const Byte PinDown=A1;const Byte PinBuzzer=2;const Byte PinUpperDots=12; // Hoher Wert leuchtet ein Dotsconst-Byte PinLowerDots =8; // HIGH value light a dotsconst word fpsLimit =16666; // 1/60*1.000.000 //maximale Aktualisierungsrate auf 60 fps begrenzenString stringToDisplay="000000";// Inhalt dieses Strings wird auf Röhren angezeigt (muss 6 Zeichen lang sein)int menuPosition=0; // 0 - Uhrzeit // 1 - Datum // 2 - Alarm // 3 - 12/24 Stunden Modusbyte blinkMask=B00000000; //Bitmaske für blinkende Ziffern (1 - Blinken, 0 - Dauerlicht) //-------------------------0-------- --1----------2----------3----------4------5----- ---6---------7---------8---------9-----//byte lowBytesArray[]={B11111110,B11111101 ,B11111011,B11110111,B11101111,B11011111,B10111111,B01111111,B11111111,B11111111};//byte highBytesArray[]={B11111111,B11111111,B11111111,B11111111,B11111111,B111111,B11111111,11111111,B111111111}Ptn=1111111} B00000000; //Bitmaske zum Trennen von Punkten //B00000000 - Auf- und Ab-Punkte ausschalten //B1100000 - Alle Punkte ausschalten#define DS1307_ADDRESS 0x68byte zero =0x00; //Problemumgehung für Problem #527int RTC_hours, RTC_minutes, RTC_seconds, RTC_day, RTC_month, RTC_year, RTC_day_of_week;//-- ----------0--------1--- -----2----------3--------4--------5---------6--------7 ------8--------9---------10---------11------12--------- 13------14// Namen:Uhrzeit, Datum, Alarm, 12/24 Stunden, Minuten, Sekunden, Tag, Monat, Jahr, Stunde, Minute, Sekunde Alarm01 Stundenformat // 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1int Elternteil[15]={ 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4};int erstes Kind[15] ={4, 7, 10, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};int lastChild[15]={ 6, 9, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};int value[15]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24};int maxValue[15]={ 0, 0, 0, 0, 23, 59, 59, 31, 12, 99, 23, 59, 59, 1, 24};int minValue[ 15]={ 0, 0, 0, 12, 00, 00, 00, 1, 1, 00, 00, 00, 00, 0, 12};byte blinkPattern[15]={ B00000000, B00000000, B00000000, B00000000, B00000011, B00001100, B00110000, B00000011, B00001100, B00110000, B00000011, B00001100, B00110000, B110000 00, B00001100};#define TimeIndex 0 #define DateIndex 1 #define AlarmIndex 2 #define hModeIndex 3 #define TimeHoursIndex 4 #define TimeMintuesIndex 5#define TimeSecondsIndex 6#define DateDayIndex 7#define DateMonthIndex 8#define DateYearIndex 9 #define AlarmHourIndex 10# define AlarmMinuteIndex 11#define AlarmSecondIndex 12#define Alarm01 13#define hModeValueIndex 14bool editMode=false;long downTime=0;long upTime=0;const long settingDelay=150;bool BlinkUp=false;bool BlinkDown=false;unsigned long enterEditModeTime=0;bool RGBLedsOn=true;Byte RGBLEDsEEPROMAdresse=0; Byte HourFormatEEPROMAddress=1;Byte AlarmTimeEEPROMAddress=2;//3,4,5byte AlarmArmedEEPROMAddress=6; // Buttons Pins DeklarationenClickButton setButton(pinSet, LOW, CLICKBTN_PULLUP);ClickButton upButton(pinUp, LOW, CLICKBTN_PULLUP);ClickButton downButton(pinDown, LOW, CLICKBTN_PULLUP);//////////////// ///Tone Tone1;#define isdigit(n) (n>='0' &&n <='9')//char *song ="MissionImp:d=16,o=6,b=95:32d, 32d#,32d,32d#,32d,32d#,32d,32d#,32d,32d,32d#,32e,32f,32f#,32g,g,8p,g,8p,a#,p,c7,p, g,8p,g,8p,f,p,f#,p,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,a#, g,2d,32p,a#,g,2c#,32p,a#,g,2c,a#5,8c,2p,32p,a#5,g5,2f#,32p,a#5,g5,2f, 32p,a#5,g5,2e,d#,8d";char *song ="PinkPanther:d=4,o=5,b=160:8d#,8e,2p,8f#,8g,2p,8d# ,8e,16p,8f#,8g,16p,8c6,8b,16p,8d#,8e,16p,8b,2a#,2p,16a,16g,16e,16d,2e"; //char *song=" VanessaMae:d=4,o=6,b=70:32c7,32b,16c7,32g,32p,32g,32p,32d#,32p,32d#,32p,32c,32p,32c,32p,32c7,32b, 16c7,32g#,32p,32g#,32p,32f,32p,16f,32c,32p,32c,32p,32c7,32b,16c7,32g,32p,32g,32p,32d#,32p,32d#,32p, 32c,32p,32c,32p,32g,32f,32d#,32d,32c,32d,32d#,32c,32d#,32f,16g,8p,16d7,32c7,32d7,32a#,32d7,32a,32d7, 32g,32d7,32d7,32p,32d7,3 2p,32d7,32p,16d7,32c7,32d7,32a#,32d7,32a,32d7,32g,32d7,32d7,32p,32d7,32p,32d7,32p,32g,32f,32d#,32d,32c,32d, 32d#,32c,32d#,32f,16c";//char *song="DasBoot:d=4,o=5,b=100:d#.4,8d4,8c4,8d4,8d#4,8g4, a#.4,8a4,8g4,8a4,8a#4,8d,2f.,p,f.4,8e4,8d4,8e4,8f4,8a4,c.,8b4,8a4,8b4,8c,8e,2g. ,2p";//char *song="Scatman:d=4,o=5,b=200:8b,16b,32p,8b,16b,32p,8b,2d6,16p,16c#.6,16p. ,8d6,16p,16c#6,8b,16p,8f#,2p.,16c#6,8p,16d.6,16p.,16c#6,16b,8p,8f#,2p,32p,2d6,16p ,16c#6,8p,16d.6,16p.,16c#6,16a.,16p.,8e,2p.,16c#6,8p,16d.6,16p.,16c#6,16b,8p, 8b,16b,32p,8b,16b,32p,8b,2d6,16p,16c#.6,16p.,8d6,16p,16c#6,8b,16p,8f#,2p.,16c#6,8p, 16d.6,16p.,16c#6,16b,8p,8f#,2p,32p,2d6,16p,16c#6,8p,16d.6,16p.,16c#6,16a.,16p.,8e ,2p.,16c#6,8p,16d.6,16p.,16c#6,16a,8p,8e,2p,32p,16f#.6,16p.,16b.,16p.";//char * song="Popcorn:d=4,o=5,b=160:8c6,8a#,8c6,8g,8d#,8g,c,8c6,8a#,8c6,8g,8d#,8g,c,8c6 ,8d6,8d#6,16c6,8d#6,16c6,8d#6,8d6,16a#,8d6,16a#,8d6,8c6,8a#,8g,8a#,c6";//char *song="WeWishYou:d=4,o=5,b=200:d,g,8g,8a,8g,8f#,e,e,e,a,8a,8b,8a,8g,f#,d,d, b,8b,8c6,8b ,8a,g,e,d,e,a,f#,2g,d,g,8g,8a,8g,8f#,e,e,e,a,8a,8b,8a,8g,f#,d, d,b,8b,8c6,8b,8a,g,e,d,e,a,f#,1g,d,g,g,g,2f#,f#,g,f#,e,2d,a,b ,8a,8a,8g,8g,d6,d,d,e,a,f#,2g";#define OCTAVE_OFFSET 0char *p;int notes[] ={ 0,NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4 , ANMERKUNG_FS4, ANMERKUNG_G4, ANMERKUNG_GS4, ANMERKUNG_A4, ANMERKUNG_AS4, ANMERKUNG_B4, ANMERKUNG_C5, ANMERKUNG_CS5, ANMERKUNG_D5, ANMERKUNG_DS5, ANMERKUNG_E5, ANMERKUNG_F5, ANMERKUNG_FS5, ANMERK_G5, ANMERKUNG_GS5, ANMERKUNG_A5, ANMERKUNG_AS5, ANMERKUNG_B5,_CS_C , NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7};int fireforks1,[/]={0,0,1,[]={ 1 -1,0,0,//2 0,1,0,//3 0,0,-1,//4 1,0,0,//5 0,-1,0}; //Array mit RGB-Regeln (0 - nichts tun, -1 - verringern, +1 - erhöhen) setRTCDateTime(Byte h, Byte m, Byte s, Byte d, Byte mon, Byte y, Byte w=1);int functionDownButton=0;int FunktionUpButton=0;/******************************************** ************************************************* **********Init-Programm**************************************** ************************************************* ****************/void setup () { DigitalWrite (DHVpin, LOW); // aus MAX1771 Driver Hight Voltage (DHV) 110-220V Wire.begin (); // setRTCDateTime(23,40,00,25,7,15,1); Serial.begin(115200); Serial.println(""); if (EEPROM.read(HourFormatEEPROMAddress)!=12) value[hModeValueIndex]=24; else value[hModeValueIndex]=12; if (EEPROM.read(RGBLEDsEEPROMAddress)!=0) RGBLedsOn=true; else RGBLedsOn=false; if (EEPROM.read(AlarmTimeEEPROMAddress)==255) value[AlarmHourIndex]=0; else value[AlarmHourIndex]=EEPROM.read(AlarmTimeEEPROMAddress); if (EEPROM.read(AlarmTimeEEPROMAddress+1)==255) value[AlarmMinuteIndex]=0; e lse value[AlarmMinuteIndex]=EEPROM.read(AlarmTimeEEPROMaddress+1); if (EEPROM.read(AlarmTimeEEPROMaddress+2)==255) value[AlarmSecondIndex]=0; else value[AlarmSecondIndex]=EEPROM.read(AlarmTimeEEPROMaddress+2); if (EEPROM.read(AlarmArmedEEPROMaddress)==255) value[Alarm01]=0; else value[Alarm01]=EEPROM.read(AlarmArmedEEPROMaddress); Tone1.Begin (PinSummer); song=parseSong (Lied); pinMode (LEpin, AUSGANG); pinMode (DHVpin, AUSGANG); pinMode (RedLedPin, AUSGANG); pinMode (GreenLedPin, AUSGANG); pinMode (BlueLedPin, AUSGANG); // SPI-Setup SPI.begin(); // SPI.setDataMode (SPI_MODE3); // Modus 3 SPI SPI.setClockDivider(SPI_CLOCK_DIV128); // SCK =16MHz/128 =125kHz // Tastenstifte inits pinMode (pinSet, INPUT_PULLUP); pinMode (pinUp, INPUT_PULLUP); pinMode (pinDown, INPUT_PULLUP); //////////////////////////// PinMode (pinBuzzer, OUTPUT); // Schaltflächenobjekte inits setButton.debounceTime =20; // Entprell-Timer in ms setButton.multiclickTime =30; // Zeitlimit für Mehrfachklicks setButton.longClickTime =2000; // Zeit bis zum "gedrückt gehaltenen Klicks" register upButton.debounceTime =20; // Entprell-Timer in ms upButton.multiclickTime =30; // Zeitlimit für Mehrfachklicks upButton.longClickTime =2000; // Zeit bis "gedrückte Klicks" registrieren downButton.debounceTime =20; // Entprell-Timer in ms downButton.multiclickTime =30; // Zeitlimit für Mehrfachklicks downButton.longClickTime =2000; // Zeit bis "gedrückt gehaltene Klicks" registrieren // digitalWrite (DHVpin, HIGH); // auf MAX1771 Treiber-Höhenspannung (DHV) 110-220V //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!! //doTest(); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! getRTCTime(); setTime (RTC_hours, RTC_minutes, RTC_seconds, RTC_day, RTC_month, RTC_year); digitalWrite (DHVpin, LOW); // aus MAX1771 Driver Hight Voltage (DHV) 110-220V setRTCDateTime (RTC_hours,RTC_minutes,RTC_seconds,RTC_day,RTC_month,RTC_year,1); //���������� ������ ��� ��������� ����� � RTC ����� �������� � ����� ���������� digitalWrite(DHVpin, HIGH); // am MAX1771 Treiber Hight Voltage (DHV) 110-220V //p=song;}void rotateLeft(uint8_t &bits){ uint8_t high_bit =bits &(1 <<7) ? 1 :0; Bits =(Bits <<1) | high_bit;}int rotator=0; // Index im Array mit RGB-"Regeln" (jeweils 255 Zyklen um eins erhöhen)int cycle=0; //Zyklen counterint RedLight=255;int GreenLight=0;int BlueLight=0;unsigned long prevTime=0; // Zeit der Laserröhre war litunsigned long prevTime4FireWorks=0; //Zeit der letzten RGB-Änderung //int MinuteL=0; //������� ����� �����/******************************** ************************************************* ***************************** HAUPTprogramm******************** ************************************************* ******************************************/void loop () { p=playmusic(p); if ((millis()-prevTime4FireWorks)>5) { rotateFireWorks(); // Farbe ändern (um 1 Schritt) prevTime4FireWorks=millis(); } doIndication(); setButton.Update(); upButton.Update(); downButton.Update(); if (editMode==false) { blinkMask=B00000000; aufrechtzuerhalten. Sonst if ((millis()-enteringEditModeTime)>60000) { editMode=false; menuPosition=firstChild[menuPosition]; blinkMask=blinkPattern[menuPosition]; } if (setButton.clicks>0) //kurzer Klick {p=0; // Musik ausschalten))) Tone1.play (1000,100); enterEditModeTime=millis(); menuPosition=menuPosition+1; if (menuPosition==hModeIndex+1) menuPosition=TimeIndex; Serial.print (F("menuPosition=")); Serial.println (menuPosition); Serial.print (F("value=")); Serial.println (Wert [MenüPosition]); blinkMask=blinkPattern[menuPosition]; if ((parent[menuPosition-1]!=0) and (lastChild[parent[menuPosition-1]-1]==(menuPosition-1))) { if ((parent[menuPosition-1]-1==1 ) &&(!isValidDate())) { menuPosition=DateDayIndex; Rückkehr; } editMode=false; menuPosition=parent[menuPosition-1]-1; if (menuPosition==TimeIndex) setTime(value[TimeHoursIndex], value[TimeMintuesIndex], value[TimeSecondsIndex], day(), month(), year()); if (menuPosition==DateIndex) setTime(hour(), minute(), second(),value[DateDayIndex], value[DateMonthIndex], 2000+value[DateYearIndex]); if (menuPosition==AlarmIndex) {EEPROM.write(AlarmTimeEEPROMAddress,value[AlarmHourIndex]); EEPROM.write(AlarmTimeEEPROMAdresse+1,Wert[AlarmMinuteIndex]); EEPROM.write(AlarmTimeEEPROMAdresse+2,Wert[AlarmSecondIndex]); EEPROM.write(AlarmArmedEEPROMAdresse, Wert[Alarm01]);}; if (menuPosition==hModeIndex) EEPROM.write(HourFormatEEPROMAddress, value[hModeValueIndex]); digitalWrite (DHVpin, LOW); // aus MAX1771 Driver Hight Voltage (DHV) 110-220V setRTCDateTime(hour(),minute(),second(),day(),month(),year()%1000,1); digitalWrite (DHVpin, HIGH); // auf MAX1771 Driver Hight Voltage (DHV) 110-220V} value[menuPosition]=extractDigits(blinkMask); } if (setButton.clicks<0) // langer Klick {tone1.play(1000,100); if (!editMode) { enterEditModeTime=millis(); if (menuPosition==TimeIndex) stringToDisplay=PreZero(hour())+PreZero(minute())+PreZero(second()); //temporär aktiviertes 24-Stunden-Format während der Einstellungen} menuPosition=firstChild[menuPosition]; if (menuPosition==AlarmHourIndex) {value[Alarm01]=1; /*digitalWrite(pinUpperDots, HIGH);*/dotPattern=B10000000;} editMode=!editMode; blinkMask=blinkPattern[menuPosition]; value[menuPosition]=extractDigits(blinkMask); } if (upButton.clicks !=0) functionUpButton =upButton.clicks; if (upButton.clicks>0) { p=0; // Musik ausschalten))) Tone1.play (1000,100); InkrementWert(); } if (functionUpButton ==-1 &&upButton.depressed ==true) { BlinkUp=false; if (editMode==true) { if ( (millis() - upTime)> settingDelay) { upTime =millis(); // + SettingDelay; InkrementWert(); } } } else BlinkUp=true; if (downButton.clicks !=0) functionDownButton =downButton.clicks; if (downButton.clicks>0) { p=0; // Musik ausschalten))) Tone1.play (1000,100); dicrementValue(); } if (functionDownButton ==-1 &&downButton.depressed ==true) { BlinkDown=false; if (editMode==true) { if ( (millis() - downTime)> settingDelay) { downTime =millis(); // + settingDelay; dicrementValue(); } } } else BlinkDown=true; if (!editMode) { if (upButton.clicks<0) {tone1.play(1000,100); RGBLedsOn=true; EEPROM.write(RGBLEDsEEPROMAdresse,1); Serial.println("RGB=on"); } if (downButton.clicks<0) {tone1.play(1000,100); RGBLedsOn=false; EEPROM.write(RGBLEDsEEPROMAdresse,0); Serial.println ("RGB =aus"); } } static bool updateDateTime=false; switch (menuPosition) { case TimeIndex://Zeitmodus stringToDisplay=updateDisplayString(); doDotBlink(); checkAlarmTime(); brechen; case DateIndex://Datumsmodus stringToDisplay=PreZero(day())+PreZero(month())+PreZero(year()%1000); dotPattern =B01000000; // untere Punkte einschalten / * digitalWrite (pinUpperDots, LOW); digitalWrite(pinLowerDots, HIGH);*/ checkAlarmTime(); brechen; case AlarmIndex://Alarmmodus stringToDisplay=PreZero(value[AlarmHourIndex])+PreZero(value[AlarmMinuteIndex])+PreZero(value[AlarmSecondIndex]); if (value[Alarm01]==1) /*digitalWrite(pinUpperDots, HIGH);*/ dotPattern=B10000000; // obere Punkte einschalten else {/* digitalWrite (pinUpperDots, LOW); digitalWrite (pinLowerDots, LOW);*/ dotPattern=B00000000; // obere Punkte ausschalten} checkAlarmTime(); brechen; case hModeIndex://12/24 Stunden Modus stringToDisplay="00"+String(value[hModeValueIndex])+"00"; dotPattern =B00000000; // alle Punkte ausschalten / * digitalWrite (pinUpperDots, LOW); digitalWrite(pinLowerDots, LOW);*/ checkAlarmTime(); brechen; }}String PreZero(int digit){ if (digit<10) return String("0")+String(digit); else return String(Ziffer);}void rotateFireWorks(){ if (!RGBLedsOn) { analogWrite(RedLedPin,0); analogWrite(GreenLedPin,0); analogWrite(BlueLedPin,0); Rückkehr; } RedLight=RedLight+fireforks[Rotator*3]; GreenLight=GreenLight+fireforks[Rotator*3+1]; BlueLight=BlueLight+fireforks[Rotator*3+2]; analogWrite (RedLedPin,RedLight); analogWrite (GreenLedPin,GreenLight); analogWrite (BlueLedPin, BlueLight); Zyklus=Zyklus+1; wenn (Zyklus ==255) { Rotator =Rotator + 1; Zyklus=0; } if (rotator>5) rotator=0;}void doIndication(){//statisches Byte b=B00000001; statisch unsigned long lastTimeInterval1Started; if ((micros()-lastTimeInterval1Started)>2; Var64|=tmpVar64; Var64=(Var64>>4); unsigned int iTmp=0; iTmp=Var64>>56; SPI.transfer(iTmp); iTmp=Var64>>48; SPI.transfer(iTmp); iTmp=Var64>>40; SPI.transfer(iTmp); iTmp=Var64>>32; SPI.transfer(iTmp); iTmp=Var64>>24; SPI.transfer(iTmp); iTmp=Var64>>16; SPI.transfer(iTmp); iTmp=Var64>>8; SPI.transfer(iTmp); iTmp=Var64; SPI.transfer(iTmp); digitalWrite (LEpin, LOW); // Daten speichern }byte CheckButtonsState(){ static boolean buttonsWasChecked; statisch unsigned long startBuzzTime; statisch unsigned long lastTimeButtonsPressed; if ((digitalRead(pinSet)==0)||(digitalRead(pinUp)==0)||(digitalRead(pinDown)==0)) { if (buttonsWasChecked==false) startBuzzTime=millis(); buttonsWasChecked=true; } else buttonsWasChecked=false; if (millis()-startBuzzTime<30) { digitalWrite (pinBuzzer, HIGH); aufrechtzuerhalten. Sonst { DigitalWrite (pinBuzzer, LOW); }}String updateDisplayString(){ statisch unsigned long lastTimeStringWasUpdated; if ((millis()-lastTimeStringWasUpdated)>1000) {//Serial.println("doDotBlink"); //DoDotBlink(); lastTimeStringWasUpdated=millis(); if (value[hModeValueIndex]==24) return PreZero(hour())+PreZero(minute())+PreZero(second()); else return PreZero(hourFormat12())+PreZero(minute())+PreZero(second()); } StringToDisplay zurückgeben;}void doTest () { Serial.print (F ( "Firmware-Version:")); Serial.println (FirmwareVersion.substring(1,2)+"."+FirmwareVersion.substring(2,4)); Serial.println (F ("Test starten")); int adc=analogRead(A3); float Uinput=4,6*(5,0*adc)/1024,0+0,7; Serial.print (F("U input=")); Serial.print (Uinput); p =Lied; parseSong(p); analogWrite (RedLedPin, 255); Verzögerung (1000); analogWrite(RedLedPin,0); analogWrite (GreenLedPin,255); Verzögerung (1000); analogWrite(GreenLedPin,0); analogWrite (BlueLedPin,255); Verzögerung (1000); //während(1); String testStringArray[12]={"000000","111111","222222","333333","444444","555555","666666","777777","888888","999999","", ""}; if (Uinput<10) testStringArray[10]="000"+String(int(Uinput*100)); else testStringArray[10]="00"+String(int(Uinput*100)); testStringArray[11]=Firmware-Version; int dlay=500; bool test=1; Byte-StrIndex=0; unsigned long startOfTest=millis(); for (int i=0; i<12; i++) { if ((millis()-startOfTest)>dlay) { startOfTest=millis(); strIndex=strIndex+1; if (strIndex==10) dlay=3000; if (strIndex==12) test=0; Schalter (strIndex) { /* Fall 10:SPI.transfer((b|B010000000)&B11111100); brechen; Fall 11:SPI.transfer((b|B01000000)&B11001110); brechen; */ //Standard:SPI.transfer(b|B11000000); Standard:stringToDisplay=testStringArray[strIndex]; } } VerzögerungMikrosekunden (2000); }; Serial.println (F ("Stop Test")); }void doDotBlink(){ statisch unsigned long lastTimeBlink=millis(); static bool dotState=0; if ((millis()-lastTimeBlink)>1000) { lastTimeBlink=millis(); dotState=!dotState; if (dotState) { dotPattern=B11000000; /*digitalWrite(pinUpperDots, HIGH); digitalWrite (pinLowerDots, HIGH); */} else { dotPattern=B00000000; /*digitalWrite(pinUpperDots, LOW); digitalWrite (pinLowerDots, LOW); */ } }}void setRTCDateTime (Byte h, Byte m, Byte s, Byte d, Byte Mon, Byte y, Byte w) {Wire.beginTransmission (DS1307_ADDRESS); Wire.write (null); // Oszillator stoppen Wire.write (decToBcd (s)); Wire.write(decToBcd(m)); Wire.write (decToBcd (h)); Wire.write (decToBcd (w)); Wire.write (decToBcd (d)); Wire.write (decToBcd (mon)); Wire.write(decToBcd(y)); Wire.write (null); //starte Wire.endTransmission();}byte decToBcd(byte val){// Konvertieren Sie normale Dezimalzahlen in binär codierte Dezimalzahlen ((val/10*16) + (val%10));}byte bcdToDec(byte val ) {// Binärkodierte Dezimalzahlen in normale Dezimalzahlen umwandeln return ( (val/16*10) + (val%16) );}void getRTCTime(){ Wire.beginTransmission(DS1307_ADDRESS); Wire.write (null); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS, 7); RTC_seconds =bcdToDec(Wire.read()); RTC_minutes =bcdToDec(Wire.read()); RTC_hours =bcdToDec(Wire.read() &0b111111); // 24 Stunden Zeit RTC_day_of_week =bcdToDec(Wire.read()); //0-6 -> Sonntag - Samstag RTC_day =bcdToDec(Wire.read()); RTC_Monat =bcdToDec(Wire.read()); RTC_year =bcdToDec(Wire.read());}Wort doEditBlink(int pos){ if (!BlinkUp) return 0; if (!BlinkDown) return 0; int lowBit=blinkMask>>pos; lowBit=lowBit&B00000001; statisch unsigned long lastTimeEditBlink=millis(); static bool blinkState=false; Wortmaske=0; static int tmp=0; //blinkMask; if ((millis()-lastTimeEditBlink)>300) { lastTimeEditBlink=millis(); blinkState=!blinkState; /*Serial.print("blinkpattern="); Serial.println (blinkPattern[menuPosition]); if (((blinkPattern[menuPosition]>>8)&1==1) &&blinkState==true) digitalWrite(pinLowerDots, HIGH); sonst digitalWrite (pinLowerDots, LOW); if (((blinkPattern[menuPosition]>>7)&1==1) &&blinkState==true) digitalWrite(pinUpperDots, HIGH); sonst digitalWrite (pinUpperDots, LOW); */ if (blinkState) tmp=0; sonst tmp=blinkMask; } if (((dotPattern&~tmp)>>6)&1==1) digitalWrite(pinLowerDots, HIGH); sonst digitalWrite (pinLowerDots, LOW); if (((dotPattern&~tmp)>>7)&1==1) digitalWrite(pinUpperDots, HIGH); sonst digitalWrite (pinUpperDots, LOW); if ((blinkState==true) &&(lowBit==1)) mask=0xFFFF;//mask=B11111111; Maske zurückgeben;}int ExtractDigits(byte b){ String tmp="1"; /*Serial.print("Blinkmuster="); Serial.println(b); Serial.print("stringToDisplay="); Serial.println (stringToDisplay);*/ if (b==B00000011) {tmp=stringToDisplay.substring (0,2); /*Serial.print("stringToDisplay1="); Serial.println (stringToDisplay);*/} if (b==B00001100) {tmp=stringToDisplay.substring (2,4); /*Serial.print("stringToDisplay2="); Serial.println (stringToDisplay);*/} if (b==B00110000) {tmp=stringToDisplay.substring (4); /*Serial.print("stringToDisplay3="); Serial.println(stringToDisplay);*/ } /*Serial.print("stringToDisplay4="); Serial.println(stringToDisplay);*/ return tmp.toInt();}void injectDigits(byte b, int value){ if (b==B00000011) stringToDisplay=PreZero(value)+stringToDisplay.substring(2); if (b==B00001100) stringToDisplay=stringToDisplay.substring(0,2)+PreZero(value)+stringToDisplay.substring(4); if (b==B00110000) stringToDisplay=stringToDisplay.substring(0,4)+PreZero(value);}bool isValidDate(){ int days[12]={31,28,31,30,31,30,31,31,30,31,30,31}; if (value[DateYearIndex]%4==0) days[1]=29; if (value[DateDayIndex]>days[value[DateMonthIndex]-1]) return false; else return true; }byte default_dur =4;byte default_oct =6;int bpm =63;int num;long wholenote;long duration;byte note;byte scale;char* parseSong(char *p){ // Absolutely no error checking in here // format:d=N,o=N,b=NNN:// find the start (skip name, etc) while(*p !=':') p++; // ignore name p++; // skip ':' // get default duration if(*p =='d') { p++; p++; // skip "d=" num =0; while(isdigit(*p)) { num =(num * 10) + (*p++ - '0'); } if(num> 0) default_dur =num; p++; // skip comma } // get default octave if(*p =='o') { p++; p++; // skip "o=" num =*p++ - '0'; if(num>=3 &&num <=7) default_oct =num; p++; // skip comma } // get BPM if(*p =='b') { p++; p++; // skip "b=" num =0; while(isdigit(*p)) { num =(num * 10) + (*p++ - '0'); } bpm =num; p++; // skip colon } // BPM usually expresses the number of quarter notes per minute wholenote =(60 * 1000L / bpm) * 4; // this is the time for whole note (in milliseconds) return p;} // now begin note loop static unsigned long lastTimeNotePlaying=0; char* playmusic(char *p) { if(*p==0) { return p; } if (millis()-lastTimeNotePlaying>duration) lastTimeNotePlaying=millis(); else return p; // first, get note duration, if available num =0; while(isdigit(*p)) { num =(num * 10) + (*p++ - '0'); } if(num) duration =wholenote / num; else duration =wholenote / default_dur; // we will need to check if we are a dotted note after // now get the note note =0; switch(*p) { case 'c':note =1; brechen; case 'd':note =3; brechen; case 'e':note =5; brechen; case 'f':note =6; brechen; case 'g':note =8; brechen; case 'a':note =10; brechen; case 'b':note =12; brechen; case 'p':default:note =0; } p++; // now, get optional '#' sharp if(*p =='#') { note++; p++; } // now, get optional '.' dotted note if(*p =='.') { duration +=duration/2; p++; } // now, get scale if(isdigit(*p)) { scale =*p - '0'; p++; } else { scale =default_oct; } scale +=OCTAVE_OFFSET; if(*p ==',') p++; // skip comma for next note (or we may be at the end) // now play the note if(note) { tone1.play(notes[(scale - 4) * 12 + note], duration); if (millis()-lastTimeNotePlaying>duration) lastTimeNotePlaying=millis(); else return p; tone1.stop(); } else { return p; } Serial.println(F("Incorrect Song Format!")); 0 zurückgeben; //error } void incrementValue() { enteringEditModeTime=millis(); if (editMode==true) { if(menuPosition!=hModeValueIndex) // 12/24 hour mode menu position value[menuPosition]=value[menuPosition]+1; else value[menuPosition]=value[menuPosition]+12; if (value[menuPosition]>maxValue[menuPosition]) value[menuPosition]=minValue[menuPosition]; if (menuPosition==Alarm01) { if (value[menuPosition]==1) /*digitalWrite(pinUpperDots, HIGH);*/dotPattern=B10000000;//turn on all dots /*else digitalWrite(pinUpperDots, LOW); */ dotPattern=B00000000; //turn off all dots } injectDigits(blinkMask, value[menuPosition]); } } void dicrementValue(){ enteringEditModeTime=millis(); if (editMode==true) { if (menuPosition!=hModeValueIndex) value[menuPosition]=value[menuPosition]-1; else value[menuPosition]=value[menuPosition]-12; if (value[menuPosition]1000)) Alarm1SecondBlock=false; if (Alarm1SecondBlock==true) return; if ((hour()==value[AlarmHourIndex]) &&(minute()==value[AlarmMinuteIndex]) &&(second()==value[AlarmSecondIndex])) { lastTimeAlarmTriggired=millis(); Alarm1SecondBlock=true; Serial.println(F("Wake up, Neo!")); p=song; }}
Prog NIXIE Clock Tubes Shield NCS314
https://github.com/afch/NixeTubesShieldNCS314/

Schaltpläne


Herstellungsprozess

  1. Arduino-Pov-Vision-Uhr
  2. Webbetriebener DMX-Controller
  3. Einfache Wordclock (Arduino)
  4. Arduino-Uhr mit islamischen Gebetszeiten
  5. Arduino Spybot
  6. Hauptuhr
  7. Nixie-Uhr mit Arduino im MDF-Holzgehäuse herstellen
  8. 7-Segment-Array-Uhr
  9. BLUE_P:Drahtloses Arduino-Programmierschild
  10. Einfacher Wecker mit DS1302 RTC