Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Arduino Shield NCS314 NIXIE buizenklok IN-14

Componenten en benodigdheden

Shield Nixie Tubes IN-14 NCS314 Arduino voor Nixie Tubes Clock etc .
Schild op Nixie Tubes IN-14
× 1
Shield Nixie Tubes Clock IN-12 NCS312 voor xUSSR Nixie Tubes
× 1
Arduino UNO
Shield ondersteunt Arduino UNO/Genuino of Arduino MEGA
× 1
Arduino Mega 2560
Shield ondersteunt Arduino UNO/Genuino of Arduino MEGA
× 1
Voeding 12V 1A
× 1
Acryl hoesje voor SHIELD NCS314
Mooi acrylaat model ACNS314 is volledig compatibel met Nixie Arduino Shield NCS314 HW-versies van v1.X – 2 .X
× 1

Apps en online services

Arduino IDE

Over dit project

Overzicht

Aanvankelijk, nadat we toegang hadden tot een bijna onuitputtelijke voorraad Sovjet Nixie-buizen IN-12, IN-14 en IN-18 van uitstekende kwaliteit, zou er een eenvoudige weergave van de Nixie-buizen als Shield voor Arduino worden gemaakt. Arduino hadden we destijds al, zodat de behuizing voor klein bleef (zo dachten we destijds). We wisten toen nog niet hoe we met dergelijke lampen moesten omgaan.

Al snel vonden we op het internet een schema om dergelijke buizen van stroom te voorzien:

JA! Het schijnt! Het feit dat we ons zojuist verbijsterden, is als een klein wonder, en we realiseerden ons dat we op de goede weg zijn. Onmiddellijk begon de fotosessie:

De volgende dag begon het concept van het toekomstige project te bespreken:om de kosten te vereenvoudigen en te verlagen, werd besloten om het schema te gebruiken met een dynamisch weergaveprincipe, maar later werd besloten het te verlaten ten gunste van het schema met een volledig statische weergavemodus. Hoewel voor IN-14 Nixie-buizen het visuele verschil niet merkbaar is, maar voor de IN-18-lampen is het verschil merkbaar - in de dynamische modus werken ze niet zo helder, veel ervan verschijnen, het zogenaamde blauwe vlekken-effect:

Dynamische weergavemodus is een modus waarin op elk moment niet alle buizen branden, en er slechts één (per keer), ook andere soorten kunnen zijn wanneer ze tegelijkertijd worden verlicht, bijvoorbeeld slechts twee lampen.

Bij het bespreken van de toekomst van het apparaat, zodra besloten is om de mogelijkheid te implementeren om informatie weer te geven over de buizen die van de computer komen, zullen enthousiastelingen hun eigen apparaat kunnen maken dat op de lampen wordt weergegeven, bijvoorbeeld het aantal ongelezen berichten of het aantal rondes in het spel, zoals Fallout.

Toen begon de selectie van hardware die schakelkathoden (nummers) in de buizen konden zijn. De keuze lag voor de hand - de schuifregisters met SPI om MCU-pinnen te sparen. Maar omdat de voedingsspanningsbuizen erg hoog zijn - tot 200 volt, zijn de opties niet zo veel:HV513, HV5812, HV5122. En terwijl we het apparaat op elk van deze chips bouwden, stopten we bij de HV5812 (in de nieuwe Shields-versie NCS314 V2.X en NCS312 V1.X gebruikten IC HV5122). Deze chip is erg handig omdat je hiermee twee lampen tegelijk kunt aansturen, als een 20 bit register.

Om 6 buizen aan te sturen, hebben we drie van dergelijke circuits nodig die in serie met elkaar zijn verbonden. Dit maakt het mogelijk om een ​​pakket via SPI te verzenden en niet om de informatie op buizen bij te werken, zoals het geval zou zijn met een dynamisch weergave-algoritme. Dat wil zeggen, met andere woorden - zolang we de informatie op de buizen niet hoeven te veranderen, kan MCU bezig zijn met andere taken, zelfs slapen!

We willen iets zeggen over de overdracht van gegevens op SPI. Arudino kan tegelijk verzenden, slechts 8 bits. En we hebben 60 nodig, het dichtstbijzijnde hogere gehele getal is deelbaar door 8 is 64, en daarom moeten we een beetje magie toepassen - om één grote variabele van het type unsigned long long var64 bits voor elk register te vormen en 8 keer 8 bits elke keer door te geven door alle bits binnen de variabele naar rechts verschuiven:

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

Die doelstellingen die werden gesteld en bereikt, werden geïmplementeerd:

  • Statische weergave op basis van schuifregisters.
  • Slote Machine (Ani-vergiftiging)
  • Geef de standaardfuncties voor de klok, de klok, datum, tijd, wekker.
  • RTC (Real Time Clock) met batterij CR1220. (De nieuwe versie van het V1.2-2.X-bord gebruikt een tijdchip RTC DS3231 met hoge precisie).
  • Temperatuurmeting DS18B20 [Celsius of Fahrenheit].
  • Bediening via de IR-poort TSOP4836 (werk alleen Mega). Gecontroleerd met Afstandsbediening Sony RM-X151, Maar het is mogelijk en andere afstandsbediening met een frequentie van 36kHz.
  • Tijdsynchronisatie met externe GPS (werk alleen Mega)
  • Eenvoudig menu.
  • Aparte behandeling van de dikke darm (het onderste en bovenste punt)
  • RGB-achtergrondverlichtingskleuren met een vloeiende transfusie
  • RTTTL-beltoon voor het alarm (Ring Tone Transfer Language)
  • Slotmachine (om vergiftigingsindicatoren te voorkomen)
  • Bij zelftest. (Controleer alle nummers in elk scherm van 0 tot 9, om alle LED's te controleren, een seriële schakelaar kleuren blauw, rood, groen, soundcheck (beltonen spelen)

Die taken die niet volledig konden worden gerealiseerd.

  • Lichtsensor

Code

  • Naamloos bestand
Naamloos bestandC/C++
const String FirmwareVersion="010000";//Format _X.XX__ //NIXIE CLOCK SHIELD NCS314 door GRA &AFCH ([email protected])//25.05.2016 #include #include #include #include #include #include const byte LEpin=7; //pin Latch Ingeschakelde gegevens geaccepteerd terwijl HI levelconst byte DHVpin =5; // uit/aan MAX1771 Driver Hight Voltage (DHV) 110-220V const byte RedLedPin=9; //MCU WDM-uitgang voor rode LED's 9 gconst byte GreenLedPin=6; //MCU WDM-uitgang voor groene LED's 6-bconst byte BlueLedPin=3; //MCU WDM-uitgang voor blauwe LED's 3-rconst byte pinSet=A0;const byte pinUp=A2;const byte pinDown=A1;const byte pinBuzzer=2;const byte pinUpperDots=12; // HOGE waarde licht een dotsconst byte pinLowerDots=8; // HOGE waarde licht een dotsconst woord fpsLimit =16666; // 1/60*1.000.000 // beperk maximale verversingssnelheid op 60 fpsString stringToDisplay="000000";// Inhoud van deze string wordt weergegeven op buizen (moet 6 tekens lang zijn)int menuPosition=0; // 0 - tijd // 1 - datum // 2 - alarm // 3 - 12/24 uur modus byte blinkMask=B00000000; //bit masker voor knipperende cijfers (1 - knipperen, 0 - constant licht)//-------------------------0----- ------------2----------3---------4--------5------ ---6---------7---------8---------9-----//byte lowBytesArray[]={B11111110,B11111101 ,B11111011,B11110111,B11101111,B110111111,B10111111,B01111111,B11111111,B11111111};//byte highBytesArray[]={B11111111,B111111111,B11111111,B11111111,B11111111,B11111111,B11111111,B111111111,11111111111 B00000000; //bit mask voor het scheiden van punten //B00000000 - schakel punten omhoog en omlaag uit //B1100000 - schakel alle punten uit #define DS1307_ADDRESS 0x68byte nul =0x00; // tijdelijke oplossing voor probleem #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:tijd, datum, alarm, 12/24 uur, minuten, seconden, dag, maand, jaar, uur, minuut, tweede alarm01 hour_format // 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1int ouder[15]={ 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4};int firstChild[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 waarde[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 10#defineYearIndex 9 #define definieer 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 RGBLEDsEEPROMAddress=0; byte HourFormatEEPROMAddress=1;byte AlarmTimeEEPROMAddress=2;//3,4,5byte AlarmArmedEEPROMAddress=6; //knoppen pinnen verklaringenClickButton 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 , NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,NOTE_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 fireforks,]=1 -1,0,0,//2 0,1,0,//3 0,0,-1,//4 1,0,0,//5 0,-1,0}; // array met RGB-regels (0 - niets doen, -1 - verlagen, +1 - incresevoid setRTCDateTime (byte h, byte m, byte s, byte d, byte mon, byte y, byte w =1);int functionDownButton=0;int functionUpButton=0;/********************************************* ********************************************** ***********Init Programma**************************************** ********************************************** ****************/void setup() {digitalWrite(DHVpin, LOW); // off 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) waarde [AlarmSecondIndex]=0; else value[AlarmSecondIndex]=EEPROM.read(AlarmTimeEEPROMAddress+2); if (EEPROM.read(AlarmArmedEEPROMAddress)==255) waarde [Alarm01]=0; else value[Alarm01]=EEPROM.read(AlarmArmedEEPROMAddress); tone1.begin(pinBuzzer); song=parseSong(lied); pinMode (LEpin, UITGANG); pinMode (DHVpin, UITGANG); pinMode (RedLedPin, UITGANG); pinMode (GreenLedPin, UITGANG); pinMode (BlueLedPin, UITGANG); // SPI-setup SPI.begin(); // SPI.setDataMode (SPI_MODE3); // Modus 3 SPI SPI.setClockDivider (SPI_CLOCK_DIV128); // SCK =16 MHz/128 =125 kHz // knoppen pinnen in pinMode (pinSet, INPUT_PULLUP); pinMode (pinUp, INPUT_PULLUP); pinMode (pinDown, INPUT_PULLUP); //////////////////////////// pinMode (pinBuzzer, OUTPUT); //knoppen objecten inits setButton.debounceTime =20; // Debounce-timer in ms setButton.multiclickTime =30; // Tijdslimiet voor meerdere klikken setButton.longClickTime =2000; // tijd tot "vastgehouden klikken" registreren upButton.debounceTime =20; // Debounce-timer in ms upButton.multiclickTime =30; // Tijdslimiet voor meerdere klikken upButton.longClickTime =2000; // tijd tot "vastgehouden klikken" registreer downButton.debounceTime =20; // Debounce-timer in ms downButton.multiclickTime =30; // Tijdslimiet voor meerdere klikken downButton.longClickTime =2000; // tijd tot "vastgehouden klikken" registreren // digitalWrite(DHVpin, HIGH); // op MAX1771 Driver Hight Voltage (DHV) 110-220V //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! //doTest(); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! getRTCTime(); setTime (RTC_uren, RTC_minuten, RTC_seconden, RTC_dag, RTC_maand, RTC_jaar); digitalWrite(DHVpin, LAAG); // off MAX1771 Driver Hight Voltage (DHV) 110-220V setRTCDateTime(RTC_hours,RTC_minutes,RTC_seconds,RTC_day,RTC_month,RTC_year,1); //���������� ������ ��� �������� ����� � RTC ����� �������� � ����� ���������� digitalWrite(DHVpin, HOOG); // op MAX1771 Driver Hight Voltage (DHV) 110-220V //p=song;}void roterendeLeft(uint8_t &bits){ uint8_t high_bit =bits &(1 <<7) ? 1 :0; bits =(bits <<1) | high_bit;}int rotator=0; //index in array met RGB "regels" (verhoog met één op elke 255 cycli) int cycle=0; //cycles counterint RedLight=255;int GreenLight=0;int BlueLight=0;unsigned long prevTime=0; // tijd van laserbuis was onondertekend lang prevTime4FireWorks=0; // tijd van laatste RGB gewijzigd//int minuutL=0; //������� ����� �����/****************************** ********************************************** ****************************** HOOFD Programma******************** ********************************************** *****************************************/void loop() { p=speelmuziek(p); if ((millis()-prevTime4FireWorks)>5) {rotateFireWorks(); // kleur veranderen (met 1 stap) prevTime4FireWorks=millis(); } doIndicatie(); setButton.Update(); upButton.Update(); downButton.Update(); if (editMode==false) { blinkMask=B00000000; } else if ((millis()-enteringEditModeTime)>60000) { editMode=false; menuPosition=firstChild[menuPosition]; blinkMask=blinkPattern[menuPositie]; } if (setButton.clicks>0) //korte klik { p=0; // muziek uitschakelen ))) tone1.play (1000,100); enterEditModeTime=millis(); menuPositie=menuPositie+1; if (menuPosition==hModeIndex+1) menuPosition=TimeIndex; Serial.print(F("menuPosition=")); Serial.println(menuPositie); Serial.print(F("value=")); Serial.println(waarde[menuPositie]); blinkMask=blinkPattern[menuPositie]; if ((parent[menuPosition-1]!=0) and (lastChild[parent[menuPosition-1]-1]==(menuPosition-1))) { if ((parent[menuPosition-1]-1==1 ) &&(!isValidDate())) { menuPosition=DateDayIndex; opbrengst; } editMode=false; menuPosition=ouder[menuPosition-1]-1; if (menuPosition==TimeIndex) setTime(value[TimeHoursIndex], value[TimeMintuesIndex], value[TimeSecondsIndex], dag(), maand(), jaar()); if (menuPosition==DateIndex) setTime(hour(), minute(), second(),value[DateDayIndex], value[DateMonthIndex], 2000+value[DateYearIndex]); if (menuPosition==AlarmIndex) {EEPROM.write(AlarmTimeEEPROMAddress,value[AlarmHourIndex]); EEPROM.write(AlarmTimeEEPROMAddress+1,value[AlarmMinuteIndex]); EEPROM.write(AlarmTimeEEPROMAddress+2,value[AlarmSecondIndex]); EEPROM.write(AlarmArmedEEPROMAddress, value[Alarm01]);}; if (menuPosition==hModeIndex) EEPROM.write(HourFormatEEPROMAddress, value[hModeValueIndex]); digitalWrite(DHVpin, LAAG); // off MAX1771 Driver Hight Voltage (DHV) 110-220V setRTCDateTime(hour(),minute(),second(),day(),month(),year()%1000,1); digitalWrite(DHVpin, HOOG); // op MAX1771 Driver Hight Voltage (DHV) 110-220V } value [menuPosition] =extractDigits (blinkMask); } if (setButton.clicks<0) //lange klik { tone1.play(1000,100); if (!editMode) { enterEditModeTime=millis(); if (menuPosition==TimeIndex) stringToDisplay=PreZero(hour())+PreZero(minute())+PreZero(second()); //tijdelijk ingeschakeld 24-uurs formaat terwijl instellingen} menuPosition=firstChild[menuPosition]; if (menuPosition==AlarmHourIndex) {value[Alarm01]=1; /*digitalWrite(pinUpperDots, HIGH);*/dotPattern=B10000000;} editMode=!editMode; blinkMask=blinkPattern[menuPositie]; value[menuPosition]=extractDigits(blinkMask); } if (upButton.clicks!=0) functionUpButton =upButton.clicks; if (upButton.clicks>0) { p=0; // muziek uitschakelen ))) tone1.play (1000,100); incrementValue(); } if (functionUpButton ==-1 &&upButton.depressed ==true) { BlinkUp=false; if (editMode==true) {if ((millis() - upTime)> settingDelay) { upTime =millis();// + settingDelay; incrementValue(); } } } anders BlinkUp=true; if (downButton.clicks !=0) functionDownButton =downButton.clicks; if (downButton.clicks>0) { p=0; // muziek uitschakelen ))) 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); RGBLedsAan=waar; EEPROM.write(RGBLEDsEEPROMAddress,1); Serial.println("RGB=aan"); } if (downButton.clicks<0) { tone1.play(1000.100); RGBLedsAan=false; EEPROM.write(RGBLEDsEEPROMAddress,0); Serial.println("RGB=uit"); } } statische bool updateDateTime=false; switch (menuPosition) {case TimeIndex:// tijdmodus stringToDisplay=updateDisplayString(); doDotBlink(); checkAlarmTime(); pauze; case DateIndex:// datummodus stringToDisplay=PreZero(day())+PreZero(month())+PreZero(year()%1000); dotPattern=B01000000;//schakel onderste stippen in /*digitalWrite(pinUpperDots, LOW); digitalWrite(pinLowerDots, HIGH);*/ checkAlarmTime(); pauze; case AlarmIndex:// alarmmodus stringToDisplay=PreZero(value[AlarmHourIndex])+PreZero(value[AlarmMinuteIndex])+PreZero(value[AlarmSecondIndex]); if (value[Alarm01]==1) /*digitalWrite(pinUpperDots, HIGH);*/ dotPattern=B10000000; // schakel de bovenste punten anders in { /*digitalWrite(pinUpperDots, LOW); digitalWrite(pinLowerDots, LOW);*/ dotPattern=B00000000; // schakel de bovenste punten uit} checkAlarmTime (); pauze; case hModeIndex://12/24 uur modus stringToDisplay="00"+String(value[hModeValueIndex])+"00"; dotPattern=B00000000;//schakel alle punten uit /*digitalWrite(pinUpperDots, LOW); digitalWrite(pinLowerDots, LOW);*/ checkAlarmTime(); pauze; }}String PreZero(int digit){ if (digit<10) return String("0")+String(digit); else return String (cijfer);} ongeldig roterenFireWorks () {if (! RGBLedsOn) {analogeWrite (RedLedPin, 0); analoogWrite(GreenLedPin,0); analoogWrite(BlueLedPin,0); opbrengst; } RedLight=RedLight+vuurvorken[rotator*3]; GreenLight=GreenLight+vuurvorken[rotator*3+1]; BlueLight=BlueLight+vuurvorken[rotator*3+2]; analogWrite(RedLedPin,RedLight); analogWrite(GreenLedPin,GreenLight); analogWrite (BlueLedPin, BlueLight); cyclus=cyclus+1; if (cyclus==255) { rotator=rotator+1; cyclus=0; } if (rotator>5) rotator=0;}void doIndication(){ //static byte b=B00000001; statisch niet-ondertekend lang lastTimeInterval1Started; if ((micros()-lastTimeInterval1Started)>2; Var64|=tmpVar64; Var64=(Var64>>4); niet-ondertekend int iTmp=0; iTmp=Var64>>56; SPI.overdracht(iTmp); iTmp=Var64>>48; SPI.overdracht(iTmp); iTmp=Var64>>40; SPI.overdracht(iTmp); iTmp=Var64>>32; SPI.overdracht(iTmp); iTmp=Var64>>24; SPI.overdracht(iTmp); iTmp=Var64>>16; SPI.overdracht(iTmp); iTmp=Var64>>8; SPI.overdracht(iTmp); iTmp=Var64; SPI.overdracht(iTmp); digitalWrite(LEpin, LAAG); // gegevens vergrendelen }byte CheckButtonsState(){ statische boolean buttonsWasChecked; statische niet-ondertekende lange startBuzzTime; statisch niet-ondertekend lang lastTimeButtonsPressed; if ((digitalRead(pinSet)==0)||(digitalRead(pinUp)==0)||(digitalRead(pinDown)==0)) { if (buttonsWasChecked==false) startBuzzTime=millis(); buttonsWasChecked=waar; } else buttonsWasChecked=false; if (millis()-startBuzzTime<30) { digitalWrite(pinBuzzer, HIGH); } else { digitalWrite (pinBuzzer, LAAG); }}String updateDisplayString(){ static unsigned long lastTimeStringWasUpdated; if ((millis()-lastTimeStringWasUpdated)>1000) { //Serial.println("doDotBlink"); //doDotBlink(); lastTimeStringWasUpdated=millis(); if (value[hModeValueIndex]==24) retourneer PreZero(hour())+PreZero(minute())+PreZero(second()); anders retourneer PreZero(hourFormat12())+PreZero(minute())+PreZero(second()); } return stringToDisplay;}void doTest(){ Serial.print(F("Firmwareversie:")); Serial.println(FirmwareVersion.substring(1,2)+"."+FirmwareVersion.substring(2,4)); Serial.println(F("Start Test")); int adc=analogRead(A3); float Uinput=4.6*(5.0*adc)/1024.0+0.7; Serial.print(F("U invoer=")); Serial.print (Uinput); p=lied; ontledenSong(p); analoogWrite(RedLedPin,255); vertraging (1000); analoogWrite(RedLedPin,0); analoogWrite(GreenLedPin,255); vertraging (1000); analoogWrite(GreenLedPin,0); analoogWrite(BlueLedPin,255); vertraging (1000); //terwijl(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]=FirmwareVersie; 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; switch (strIndex) {/* geval 10:SPI.transfer((b|B01000000)&B11111100); pauze; geval 11:SPI.transfer((b|B01000000)&B11001110); pauze; */ //standaard:SPI.transfer(b|B11000000); standaard:stringToDisplay=testStringArray[strIndex]; } } vertraging Microseconden (2000); }; Serial.println(F("Stop Test")); }void doDotBlink(){ static unsigned long lastTimeBlink=millis(); statische bool dotState=0; if ((millis()-lastTimeBlink)>1000) { lastTimeBlink=millis(); dotState=!dotState; if (dotState) { dotPattern=B11000000; /*digitalWrite(pinUpperDots, HOOG); digitalWrite(pinLowerDots, HIGH);*/ } else { dotPattern=B00000000; /*digitalWrite(pinUpperDots, LAAG); 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 (nul); //stop Oscillator Wire.write (decToBcd(s)); Wire.write(decToBcd(m)); Wire.write(decToBcd(h)); Wire.write(decToBcd(w)); Wire.write(decToBcd(d)); Wire.write(decToBcd(ma)); Wire.write(decToBcd(y)); Wire.write (nul); //start Wire.endTransmission();}byte decToBcd(byte val){// Converteer normale decimale getallen naar binair gecodeerde decimale return ((val/10*16) + (val%10));}byte bcdToDec(byte val ) {// Converteer binair gecodeerde decimalen naar normale decimale getallen return ((val/16*10) + (val%16));}void getRTCTime(){ Wire.beginTransmission(DS1307_ADDRESS); Wire.write (nul); Wire.endTransmission(); Wire.requestFrom (DS1307_ADDRESS, 7); RTC_seconds =bcdToDec(Wire.read()); RTC_minuten =bcdToDec(Wire.read()); RTC_hours =bcdToDec(Wire.read() &0b111111); //24 uur tijd RTC_day_of_week =bcdToDec(Wire.read()); //0-6 -> zondag - zaterdag RTC_day =bcdToDec(Wire.read()); RTC_maand =bcdToDec(Wire.read()); RTC_year =bcdToDec(Wire.read());}word doEditBlink(int pos){ if (!BlinkUp) return 0; if (!BlinkDown) retourneert 0; int lowBit=blinkMask>>pos; lowBit=lowBit&B00000001; statisch niet-ondertekend lang lastTimeEditBlink=millis(); statische bool blinkState=false; woordmasker=0; statische int tmp=0;//blinkMask; if ((millis()-lastTimeEditBlink)>300) { lastTimeEditBlink=millis(); blinkState=!blinkState; /*Serial.print("blinkpattern="); Serial.println(blinkPattern[menuPositie]); if (((blinkPattern[menuPosition]>>8)&1==1) &&blinkState==true) digitalWrite(pinLowerDots, HIGH); anders digitalWrite (pinLowerDots, LAAG); if (((blinkPattern[menuPosition]>>7)&1==1) &&blinkState==true) digitalWrite(pinUpperDots, HIGH); anders digitalWrite (pinUpperDots, LAAG); */ if (blinkState) tmp=0; anders tmp=blinkMask; } if (((dotPattern&~tmp)>>6)&1==1) digitalWrite(pinLowerDots, HIGH); anders digitalWrite (pinLowerDots, LAAG); if (((dotPattern&~tmp)>>7)&1==1) digitalWrite(pinUpperDots, HIGH); anders digitalWrite (pinUpperDots, LAAG); if ((blinkState==true) &&(lowBit==1)) mask=0xFFFF;//mask=B11111111; return mask;}int extractDigits(byte b){ String tmp="1"; /*Serial.print("knipperpatroon="); Serieel.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; pauze; case 'd':note =3; pauze; case 'e':note =5; pauze; case 'f':note =6; pauze; case 'g':note =8; pauze; case 'a':note =10; pauze; case 'b':note =12; pauze; 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!")); return 0; //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/

Schema's


Productieproces

  1. Arduino pov vision-klok
  2. Web-gestuurde DMX-controller
  3. Eenvoudige Word Clock (Arduino)
  4. Arduino klok met islamitische gebedstijden
  5. Arduino Spybot
  6. Hoofdklok
  7. Maak een Nixie-klok met Arduino in een houten behuizing van MDF
  8. 7-segment arrayklok
  9. BLUE_P:Wireless Arduino Programming Shield
  10. TFT Shield voor Arduino Nano - Start
  11. Eenvoudige wekker met DS1302 RTC