工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

ArduinoシールドNCS314ニキシー管時計IN-14

コンポーネントと消耗品

シールドニキシー管IN-14NCS314ニキシー管用Arduino時計など。
ニキシー管IN-14のシールド
× 1
シールドニキシー管時計IN-12NCS312 forxUSSRニキシー管
× 1
Arduino UNO
シールドはArduino UNO / GenuinoまたはArduinoMEGAをサポートします
× 1
Arduino Mega 2560
シールドはArduino UNO / GenuinoまたはArduinoMEGAをサポートします
× 1
電源装置12V1A
× 1
SHIELDNCS314のアクリルケース
BeautifulAcrylicСaseModelACNS314は、v1.X –2のNixieArduino Shield NCS314HWバージョンと完全に互換性があります。 .X
× 1

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて

概要

<図> <図> <図> <図>

当初、私たちが優れた品質のソビエトニキシー管IN-12、IN-14、およびIN-18のほぼ無尽蔵の供給にアクセスした後、Arduinoのシールドとしてニキシー管の簡単な展示を行う予定でした。当時のArduinoはすでに持っていたので、ケースは小さいままでした(当時私たちは考えていました)。当時、私たちはそのようなランプの扱い方について何も知りませんでした。

そのようなチューブに電力を供給するインターネットスキームをすぐに見つけました:

<図>

はい!輝いています!私たちが驚いたのを見たという事実は、小さな奇跡のようなものであり、私たちは正しい方向に進んでいることに気づきました。すぐに写真撮影を開始しました:

<図>

翌日、将来のプロジェクトのコンセプトについて話し合い始めました。コストを簡素化して削減するために、動的表示の原則を使用するスキームを使用することが決定されましたが、その後、完全にスキームを使用するためにそれを放棄することが決定されました静的表示モード。 IN-14ニキシー管の場合、視覚的な違いは目立ちませんが、IN-18ランプの場合、違いは目立ちます-ダイナミックモードでは、それらの多くはそれほど明るくはなく、いわゆるブルースポット効果が現れます:

<図>

動的表示モードは、毎回すべてのチューブが点灯するわけではなく、同時に点灯すると(一度に)1つだけが他の種になる可能性があるモードです。たとえば、2つのランプだけです。

コンピュータからのチューブに情報を表示する機能を実装することが決定された後、デバイスの将来について議論する際に、愛好家はランプに表示される独自のデバイスを作成することができます。未読メッセージまたはFalloutなどのゲーム内のラウンド数。

次に、チューブ内のカソード(番号)を切り替えることができるハードウェアの選択を開始しました。選択は明白でした-シフトレジスタはMCUピンを節約するためにSPIに登録します。しかし、供給電圧管は非常に高く、最大200ボルトであるため、オプションはそれほど多くありません:HV513、HV5812、HV5122。そして、これらの各チップでデバイスを構築している間、HV5812で停止しました(新しいShieldsバージョンではNCS314V2.XおよびNCS312V1.XはICHV5122を使用していました)。このチップは、2つのランプを20ビットレジスタとして同時に制御できるため、非常に便利です。

6本のチューブを制御するには、このような3つの回路を直列に接続する必要があります。これにより、SPIを介してパケットを一度送信でき、動的表示アルゴリズムの場合のように、チューブの情報を更新する必要がなくなります。つまり、言い換えると、チューブの情報を変更する必要がない限り、MCUは他のタスクで忙しく、睡眠さえもする可能性があります。

SPIでのデータ転送についてお話したいと思います。 Arudinoは一度に8ビットしか送信できません。そして、60が必要です。最も近い整数は8で割り切れる64であるため、ビットマジックを適用する必要があります。レジスタごとにunsigned long long var64ビット型の1つの大きな変数を形成し、毎回8 x8ビットを渡します。変数内のすべてのビットを右にシフトします:

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

設定され、達成された目標は次のとおりです。

<図>
  • シフトレジスタに基づく静的表示。
  • スロットマシン(アニ中毒)
  • 時計、時計、日付、時刻、目覚まし時計の標準機能を提供します。
  • バッテリーCR1220を備えたRTC(リアルタイムクロック)。 (V1.2-2.Xボードの新しいバージョンは、高精度タイムチップRTC DS3231を使用します)。
  • 温度測定DS18B20 [摂氏または華氏]。
  • IRポートTSOP4836を介した制御(メガのみで動作)。リモコンSonyRM-X151で確認しましたが、36kHzの周波数で他のリモコンも可能です。
  • 外部GPSとの時刻同期(メガのみ動作)
  • 簡単なメニュー。
  • 結腸の個別の管理(下部と上部のポイント)
  • スムーズな輸血を伴うRGBバックライトカラー
  • アラームのRTTTL着信音(着信音転送言語)
  • スロットマシン(中毒インジケーターを防ぐため)
  • セルフテストについて。 (0から9までの各ディスプレイのすべての数字をチェックして、すべてのLEDをチェックします。シリアルスイッチの色は青、赤、緑、サウンドチェック(着信音の再生)です。

完全に実現できなかったタスク。

  • 光センサー

<図>

<図>

<図>

<図>

<図>

<図>

<図>

コード

  • 無題のファイル
無題のファイル C / C ++
 const String FirmwareVersion ="010000"; // Format _X.XX__ // NIXIE CLOCK SHIELD NCS314 by GRA&AFCH([email protected])// 25.05.2016 #include  #include  #include  #include  #include  #include  const byte LEpin =7; // HI levelconst byte DHVpin =5の間に受け入れられるピンラッチ有効データ。 //オフ/オンMAX1771ドライバー高電圧(DHV)110-220VconstバイトRedLedPin =9; //赤色LEDのMCUWDM出力9-gconstバイトGreenLedPin =6; //緑色LEDのMCUWDM出力6-bconstバイトBlueLedPin =3; //青色LEDのMCUWDM出力3-rconstbyte pinSet =A0; const byte pinUp =A2; const byte pinDown =A1; const byte pinBuzzer =2; const byte pinUpperDots =12; // HIGH値はdotsconstバイトを点灯しますpinLowerDots =8; // HIGH値はdotsconstワードを点灯しますfpsLimit =16666; // 1/60 * 1.000.000 // 60fpsの最大リフレッシュレートを制限StringStringToDisplay ="000000"; //この文字列の内容はチューブに表示されます(6文字の長さである必要があります)int menuPosition =0; // 0-時間// 1-日付// 2-アラーム// 3-12 / 24時間モードバイトblinkMask =B00000000; //点滅桁のビットマスク(1-点滅、0-常時点灯)// ------------------------- 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、B11111111、B11111111、B11111111、B111 B00000000; //ドットを分離するためのビットマスク// B00000000-上下のドットをオフにします// B1100000-すべてのドットをオフにします#defineDS1307_ADDRESS 0x68byte zero =0x00; //問題#527の回避策int 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 //名前:時刻、日付、アラーム、12/24時間、分、秒、日、月、年、時、分、秒alarm01 hour_format // 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1int parent [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 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};バイトblinkPattern [15] ={B00000000、B00000000、B00000000、B00000000、B00000011、B00001100、B00110000、B00000011、 B00001100、B00110000、B00000011、B00001100、B00110000、B11000000、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 settingsDelay =150; bool BlinkUp =false; bool BlinkDown =false; unsigned long enterEditModeTime =0; bool RGBLedsOn =true; byte RGBLEDsEEPROMAddress =0;バイトHourFormatEEPROMAddress =1;バイトAlarmTimeEEPROMAddress =2; // 3,4,5バイトAlarmArmedEEPROMAddress =6; //ボタンピン宣言ClickButtonsetButton(pinSet、LOW、CLICKBTN_PULLUP); ClickButton upButton(pinUp、LOW、CLICKBTN_PULLUP); ClickButton downButton(pinDown、LOW、CLICKBTN_PULLUP); //////////////// ///トーン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_G5、NOTE_GS5、NOTE_A5、NOTE_AS5、NOTE_B5、NOTE_ 、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 [] / {0 1 -1,0,0、// 2 0,1,0、// 3 0,0、-1、// 4 1,0,0、// 5 0、-1,0}; // RGBルールを使用した配列(0-何もしない、-1-減少、+ 1-増加するsetRTCDateTime(byte h、byte m、byte s、byte d、byte mon、byte y、byte w =1); int functionDownButton =0; int functionUpButton =0; / ****************************************** ************************************************** *********** Init Programm ************************************* ************************************************** **************** / void setup(){digitalWrite(DHVpin、LOW); //オフMAX1771ドライバー高電圧(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)val ue [AlarmMinuteIndex] =0; else 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(pinBuzzer); song =parseSong(song); pinMode(LEpin、OUTPUT); pinMode(DHVpin、OUTPUT); pinMode(RedLedPin、OUTPUT); pinMode(GreenLedPin、OUTPUT); pinMode(BlueLedPin、OUTPUT); // SPIセットアップSPI.begin(); // SPI.setDataMode(SPI_MODE3); //モード3SPI SPI.setClockDivider(SPI_CLOCK_DIV128); // SCK =16MHz / 128 =125kHz //ボタンピンinitspinMode(pinSet、INPUT_PULLUP); pinMode(pinUp、INPUT_PULLUP); pinMode(pinDown、INPUT_PULLUP); //////////////////////////// pinMode(pinBuzzer、OUTPUT); //ボタンオブジェクトinitssetButton.debounceTime =20; //ミリ秒単位のデバウンスタイマーsetButton.multiclickTime =30; //マルチクリックの制限時間setButton.longClickTime =2000; //「押し下げられたクリック」が登録されるまでの時間upButton.debounceTime =20; //ミリ秒単位のデバウンスタイマーupButton.multiclickTime =30; //マルチクリックの制限時間upButton.longClickTime =2000; //「押し下げられたクリック」が登録されるまでの時間downButton.debounceTime =20; //ミリ秒単位のデバウンスタイマーdownButton.multiclickTime =30; //マルチクリックの制限時間downButton.longClickTime =2000; //「押し下げられたクリック」レジスタまでの時間// digitalWrite(DHVpin、HIGH); // MAX1771ドライバの高電圧(DHV)110-220V // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! // doTest(); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! getRTCTime(); setTime(RTC_hours、RTC_minutes、RTC_seconds、RTC_day、RTC_month、RTC_year); digitalWrite(DHVpin、LOW); //オフMAX1771ドライバー高電圧(DHV)110-220V setRTCDateTime(RTC_hours、RTC_minutes、RTC_seconds、RTC_day、RTC_month、RTC_year、1); //�������������������������������������RTC�������������� ������������������digitalWrite(DHVpin、HIGH); // MAX1771ドライバーの高電圧(DHV)110-220V // p =songs;} void rotateLeft(uint8_t&bits){uint8_t high_bit =bits&(1 <<7)? 1:0;ビット=(ビット<<1)| high_bit;} int rotator =0; // RGB「ルール」を使用した配列のインデックス(255サイクルごとに1ずつ増加)int cycle =0; // counterint RedLight =255; int GreenLight =0; int BlueLight =0; unsigned long prevTime =0;を循環します//レーザーチューブの時間はlitunsignedlong prevTime4FireWorks =0; //最後に変更されたRGBの時刻// intminuteL =0; //��������������������/ ****************************** ************************************************** *******************************メインプログラム***************** ************************************************** ******************************************** / void loop(){ p =playmusic(p); if((millis()-prevTime4FireWorks)> 5){rotateFireWorks(); //色を(1ステップずつ)変更しますprevTime4FireWorks =millis(); } doIndication(); setButton.Update(); upButton.Update(); downButton.Update(); if(editMode ==false){blinkMask =B00000000; } else if((millis()-enteringEditModeTime)> 60000){editMode =false; menuPosition =firstChild [menuPosition]; flashMask =blinkPattern [menuPosition]; } if(setButton.clicks> 0)//ショートクリック{p =0; //音楽をシャットオフ)))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(value [menuPosition]); flashMask =blinkPattern [menuPosition]; if((parent [menuPosition-1]!=0)and(lastChild [parent [menuPosition-1] -1] ==(menuPosition-1))){if((parent [menuPosition-1] -1 ==1 )&&(!isValidDate())){menuPosition =DateDayIndex;戻る; } 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(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、LOW); //オフMAX1771ドライバー高電圧(DHV)110-220V setRTCDateTime(hour()、minute()、second()、day()、month()、year()%1000,1); digitalWrite(DHVpin、HIGH); // MAX1771ドライバの高電圧(DHV)110-220V} value [menuPosition] =extractDigits(blinkMask); } if(setButton.clicks <0)//ロングクリック{tone1.play(1000,100); if(!editMode){enteringEditModeTime =millis(); if(menuPosition ==TimeIndex)stringToDisplay =PreZero(hour())+ PreZero(minute())+ PreZero(second()); //設定中に一時的に有効な24時間形式} menuPosition =firstChild [menuPosition]; if(menuPosition ==AlarmHourIndex){value [Alarm01] =1; / * digitalWrite(pinUpperDots、HIGH); * / dotPattern =B10000000;} editMode =!editMode; flashMask =blinkPattern [menuPosition]; value [menuPosition] =extractDigits(blinkMask); } if(upButton.clicks!=0)functionUpButton =upButton.clicks; if(upButton.clicks> 0){p =0; //音楽をシャットオフ)))tone1.play(1000,100);増分値(); } if(functionUpButton ==-1 &&upButton.depressed ==true){BlinkUp =false; if(editMode ==true){if((millis()-upTime)> settingsDelay){upTime =millis(); // + settingsDelay;増分値(); }}} else BlinkUp =true; if(downButton.clicks!=0)functionDownButton =downButton.clicks; if(downButton.clicks> 0){p =0; //音楽をシャットオフ)))tone1.play(1000,100); dicrementValue(); } if(functionDownButton ==-1 &&downButton.depressed ==true){BlinkDown =false; if(editMode ==true){if((millis()-downTime)> settingsDelay){downTime =millis(); // + settingsDelay; dicrementValue(); }}} else BlinkDown =true; if(!editMode){if(upButton.clicks <0){tone1.play(1000,100); RGBLedsOn =true; EEPROM.write(RGBLEDsEEPROMAddress、1); Serial.println( "RGB =on"); } if(downButton.clicks <0){tone1.play(1000,100); RGBLedsOn =false; EEPROM.write(RGBLEDsEEPROMAddress、0); Serial.println( "RGB =off"); }} static bool updateDateTime =false; switch(menuPosition){case TimeIndex://時間モードstringToDisplay =updateDisplayString(); doDotBlink(); checkAlarmTime();壊す; case DateIndex://日付モードstringToDisplay =PreZero(day())+ PreZero(month())+ PreZero(year()%1000); dotPattern =B01000000; //下のドットをオンにする/ * digitalWrite(pinUpperDots、LOW); digitalWrite(pinLowerDots、HIGH); * / checkAlarmTime();壊す; case AlarmIndex://アラームモードstringToDisplay =PreZero(value [AlarmHourIndex])+ PreZero(value [AlarmMinuteIndex])+ PreZero(value [AlarmSecondIndex]); if(value [Alarm01] ==1)/ * digitalWrite(pinUpperDots、HIGH); * / dotPattern =B10000000; //上のドットをオンにしますelse {/ * digitalWrite(pinUpperDots、LOW); digitalWrite(pinLowerDots、LOW); * / dotPattern =B00000000; //上部のドットをオフにします} checkAlarmTime();壊す;ケースhModeIndex:// 12/24時間モードstringToDisplay ="00" + String(value [hModeValueIndex])+ "00"; dotPattern =B00000000; //すべてのドットをオフにします/ * digitalWrite(pinUpperDots、LOW); digitalWrite(pinLowerDots、LOW); * / checkAlarmTime();壊す; }} String PreZero(int digit){if(digit <10)return String( "0")+ String(digit); else return String(digit);} void rotateFireWorks(){if(!RGBLedsOn){analogWrite(RedLedPin、0); analogWrite(GreenLedPin、0); analogWrite(BlueLedPin、0);戻る; } 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); cycle =cycle + 1; if(cycle ==255){rotator =rotator + 1;サイクル=0; } if(rotator> 5)rotator =0;} void doIndication(){//静的バイトb =B00000001; static 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); //データをラッチします} byte CheckButtonsState(){static boolean buttonWasChecked; static unsigned long startBuzzTime; static unsigned long lastTimeButtonsPressed; if((digitalRead(pinSet)==0)||(digitalRead(pinUp)==0)||(digitalRead(pinDown)==0)){if(buttonsWasChecked ==false)startBuzzTime =millis(); buttonWasChecked =true; } else buttonWasChecked =false; if(millis()-startBuzzTime <30){digitalWrite(pinBuzzer、HIGH); } else {digitalWrite(pinBuzzer、LOW); }} String updateDisplayString(){static unsigned long lastTimeStringWasUpdated; if((millis()-lastTimeStringWasUpdated)> 1000){// Serial.println( "doDotBlink"); // doDotBlink(); lastTimeStringWasUpdated =millis(); if(value [hModeValueIndex] ==24)return PreZero(hour())+ PreZero(minute())+ PreZero(second());それ以外の場合は、PreZero(hourFormat12())+ PreZero(minute())+ PreZero(second());を返します。 } return stringToDisplay;} void doTest(){Serial.print(F( "ファームウェアバージョン:")); Serial.println(FirmwareVersion.substring(1,2)+ "。" + FirmwareVersion.substring(2,4)); Serial.println(F( "テストの開始")); int adc =analogRead(A3); float Uinput =4.6 *(5.0 * adc)/1024.0+0.7; Serial.print(F( "U input =")); Serial.print(Uinput); p =歌; parseSong(p); analogWrite(RedLedPin、255); delay(1000); analogWrite(RedLedPin、0); analogWrite(GreenLedPin、255); delay(1000); analogWrite(GreenLedPin、0); analogWrite(BlueLedPin、255); delay(1000); // while(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] =FirmwareVersion; int dlay =500; bool test =1;バイト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){/ *ケース10:SPI.transfer((b | B01000000)&B11111100);壊す;ケース11:SPI.transfer((b | B01000000)&B11001110);壊す; * / //デフォルト:SPI.transfer(b | B11000000);デフォルト:stringToDisplay =testStringArray [strIndex]; }} delayMicroseconds(2000); }; Serial.println(F( "テストの停止")); } void doDotBlink(){static 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(ゼロ); //オシレーターを停止します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(ゼロ); // start Wire.endTransmission();} byte decToBcd(byte val){//通常の10進数を2進化10進数に変換return((val / 10 * 16)+(val%10));} byte bcdToDec(byte val ){// 2進化10進数を通常の10進数に変換return((val / 16 * 10)+(val%16));} void getRTCTime(){Wire.beginTransmission(DS1307_ADDRESS); Wire.write(ゼロ); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS、7); RTC_seconds =bcdToDec(Wire.read()); RTC_minutes =bcdToDec(Wire.read()); RTC_hours =bcdToDec(Wire.read()&0b111111); // 24時間制RTC_day_of_week =bcdToDec(Wire.read()); // 0-6->日曜日-土曜日RTC_day =bcdToDec(Wire.read()); RTC_month =bcdToDec(Wire.read()); RTC_year =bcdToDec(Wire.read());} word doEditBlink(int pos){if(!BlinkUp)return 0; if(!BlinkDown)return 0; int lowBit =blinkMask>> pos; lowBit =lowBit&B00000001; static unsigned long lastTimeEditBlink =millis(); static bool flashState =false;ワードマスク=0; static int tmp =0; // blinkMask; if((millis()-lastTimeEditBlink)> 300){lastTimeEditBlink =millis(); flashState =!blinkState; /*Serial.print("blinkpattern="); Serial.println(blinkPattern [menuPosition]); if(((blinkPattern [menuPosition]>> 8)&1 ==1)&&flashState ==true)digitalWrite(pinLowerDots、HIGH); else digitalWrite(pinLowerDots、LOW); if(((blinkPattern [menuPosition]>> 7)&1 ==1)&&flashState ==true)digitalWrite(pinUpperDots、HIGH); else digitalWrite(pinUpperDots、LOW); * / if(blinkState)tmp =0;それ以外の場合、tmp =blinkMask; } if(((dotPattern&〜tmp)>> 6)&1 ==1)digitalWrite(pinLowerDots、HIGH); else digitalWrite(pinLowerDots、LOW); if(((dotPattern&〜tmp)>> 7)&1 ==1)digitalWrite(pinUpperDots、HIGH); else digitalWrite(pinUpperDots、LOW); if((blinkState ==true)&&(lowBit ==1))mask =0xFFFF; // mask =B11111111; return mask;} int extractDigits(byte b){String tmp ="1"; /*Serial.print("blink pattern ="); 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])はfalseを返します。それ以外の場合はtrueを返します。 } byte default_dur =4; byte default_oct =6; int bpm =63; int num; longwholenote; longduration; byte note; byte scale; char * parseSong(char * p){//ここでエラーチェックは絶対にありません//形式:d =N、o =N、b =NNN://開始を検索(名前をスキップなど)while(* p!=':')p ++; //名前p ++を無視します; // ':'をスキップします//デフォルトの期間を取得しますif(* p =='d'){p ++; p ++; // "d =" num =0;をスキップしますwhile(isdigit(* p)){num =(num * 10)+(* p ++-'0'); } if(num> 0)default_dur =num; p ++; //カンマをスキップ} //デフォルトのオクターブを取得if(* p =='o'){p ++; p ++; // "o =" num =* p ++-'0';をスキップしますif(num> =3 &&num <=7)default_oct =num; p ++; //カンマをスキップ} // BPMを取得if(* p =='b'){p ++; p ++; // "b =" num =0;をスキップしますwhile(isdigit(* p)){num =(num * 10)+(* p ++-'0'); } bpm =num; p ++; //コロンをスキップ} // BPMは通常、1分あたりの四分音符の数を表します全音符=(60 * 1000L / bpm)* 4; //これは全音符の時間(ミリ秒単位)return p;} //ノートループを開始しますstaticunsigned long lastTimeNotePlaying =0; char * playmusic(char * p){if(* p ==0){return p; } if(millis()-lastTimeNotePlaying> duration)lastTimeNotePlaying =millis();それ以外の場合はpを返します。 //最初に、利用可能な場合はノートの長さを取得しますnum =0; while(isdigit(* p)){num =(num * 10)+(* p ++-'0'); } if(num)duration =Wholesalenote / num;それ以外の場合、期間=ホールノート/ default_dur; //後、点線の音符であるかどうかを確認する必要があります//ここで音符を取得しますnote =0; switch(* p){case'c ':note =1;壊す;ケース 'd':注=3;壊す;ケース 'e':注=5;壊す;ケース 'f':注=6;壊す;ケース 'g':注=8;壊す;ケース 'a':注=10;壊す;ケース 'b':注=12;壊す;ケース 'p':デフォルト:note =0; } p ++; //ここで、オプションの '#'シャープを取得if(* p =='#'){note ++; p ++; } //ここで、オプションの '。'を取得します点線の音符if(* p =='。'){期間+ =期間/ 2; p ++; } //ここで、scaleを取得しますif(isdigit(* p)){scale =* p-'0 '; p ++; } else {scale =default_oct; }スケール+ =OCTAVE_OFFSET; if(* p =='、')p ++; //次の音符のカンマをスキップします(または最後にある場合があります)//音符を再生しますif(note){tone1.play(notes [(scale-4)* 12 + note]、duration); if(millis()-lastTimeNotePlaying> duration)lastTimeNotePlaying =millis();それ以外の場合はpを返します。 tone1.stop(); } else {return p; } Serial.println(F( "Incorrect Song Format!")); 0を返します。 //エラー} void incrementalValue(){enteringEditModeTime =millis(); if(editMode ==true){if(menuPosition!=hModeValueIndex)// 12/24時間モードのメニュー位置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; //すべてのドットをオンにする/ * else digitalWrite(pinUpperDots、LOW); * / dotPattern =B00000000; //すべてのドットをオフにします} 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( "ウェイクアップ、ネオ!")); p =歌; }} 
ProgNIXIEクロックチューブシールドNCS314
https://github.com/afch/NixeTubesShieldNCS314/

回路図


製造プロセス

  1. Arduinoハメ撮りビジョンクロック
  2. Web操作のDMXコントローラー
  3. Simple Word Clock(Arduino)
  4. イスラムの祈りの時間とArduino時計
  5. Arduino Spybot
  6. マスタークロック
  7. MDFウッドケースのArduinoでニキシー時計を作る
  8. 7セグメントアレイクロック
  9. BLUE_P:ワイヤレスArduinoプログラミングシールド
  10. ArduinoNano用TFTシールド-開始
  11. DS1302RTCを備えたシンプルな目覚まし時計