Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Arduino Shield NCS314 NIXIE Tubes Clock IN-14

Komponen dan persediaan

Perisai Tabung Nixie IN-14 NCS314 Arduino untuk Tabung Nixie Jam dll .
Perisai pada Tabung Nixie IN-14
× 1
Perisai Jam Tabung Nixie IN-12 NCS312 untuk Tabung Nixie xUSSR
× 1
Arduino UNO
Perisai mendukung Arduino UNO/Genuino atau Arduino MEGA
× 1
Arduino Mega 2560
Perisai mendukung Arduino UNO/Genuino atau Arduino MEGA
× 1
Power Supply 12V 1A
× 1
Kasus Akrilik untuk SHIELD NCS314
Akrilik Cantik ase Model ACNS314 sepenuhnya kompatibel dengan Nixie Arduino Shield NCS314 HW versi v1.X – 2 .X
× 1

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Ikhtisar

Awalnya, setelah kami memiliki akses ke pasokan tabung Nixie Soviet berkualitas tinggi yang hampir tidak ada habisnya IN-12, IN-14 dan IN-18, akan ada tampilan sederhana tabung Nixie sebagai Perisai untuk Arduino. Arduino waktu itu kami sudah punya, jadi casenya tetap kecil (begitu pikir kami saat itu). Saat itu kami tidak tahu apa-apa tentang cara menangani lampu seperti itu.

Sangat cepat kami menemukan skema internet untuk menyalakan tabung seperti itu:

YA! Itu bersinar! Fakta bahwa kami melihat hanya mengejutkan kami seperti keajaiban kecil, dan kami menyadari bahwa kami berada di jalur yang benar. Sesi foto segera dimulai:

Keesokan harinya, mulai membahas konsep proyek masa depan:untuk menyederhanakan dan mengurangi biaya, diputuskan untuk menggunakan skema dengan prinsip tampilan dinamis, tetapi kemudian diputuskan untuk meninggalkannya demi skema dengan sepenuhnya mode tampilan statis. Meskipun untuk tabung IN-14 Nixie perbedaan visual tidak terlihat, tetapi untuk lampu IN-18 perbedaan terlihat - dalam mode dinamis, mereka bekerja tidak begitu terang banyak dari mereka muncul, yang disebut, efek bintik-bintik biru:

Mode tampilan dinamis adalah mode di mana pada setiap saat tidak semua tabung menyala, dan hanya satu (pada satu waktu), mungkin juga spesies lain ketika diterangi secara bersamaan, misalnya hanya dua lampu.

Dalam membahas masa depan perangkat setelah diputuskan untuk menerapkan kemampuan menampilkan informasi pada tabung yang berasal dari komputer, ini akan memungkinkan para penggemar untuk membuat perangkat mereka sendiri yang akan ditampilkan pada lampu, misalnya, jumlah lampu. pesan yang belum dibaca atau jumlah putaran dalam game, seperti Fallout.

Kemudian dimulai pemilihan perangkat keras yang dapat berupa saklar katoda (angka) di dalam tabung. Pilihannya jelas - register geser dengan SPI untuk menyimpan pin MCU. Tetapi karena tabung tegangan suplai sangat tinggi - hingga 200 volt, pilihannya tidak begitu banyak:HV513, HV5812, HV5122. Dan sementara kami membangun perangkat pada masing-masing chip ini, kami berhenti di HV5812 (Dalam versi Shields baru NCS314 V2.X dan NCS312 V1.X menggunakan IC HV5122). Chip ini sangat nyaman karena memungkinkan Anda untuk mengontrol dua lampu secara bersamaan, sebagai register 20 bit.

Untuk mengontrol 6 tabung kita akan membutuhkan tiga sirkuit seperti itu yang terhubung satu sama lain secara seri. Ini memungkinkan sekali mengirim paket melalui SPI dan tidak peduli memperbarui informasi pada tabung, seperti halnya dengan algoritme tampilan dinamis. Artinya, dengan kata lain - selama kita tidak perlu mengubah informasi pada tabung MCU mungkin sibuk dengan tugas-tugas lain, bahkan tidur!

Kami ingin mengatakan tentang transfer data pada SPI. Arudino dapat mengirimkan pada satu waktu, hanya 8 bit. Dan kita membutuhkan 60, bilangan bulat terdekat yang lebih tinggi habis dibagi 8 adalah 64, dan karena itu harus menerapkan sedikit keajaiban - untuk membentuk satu variabel besar jenis unsigned long long var64 bits untuk setiap register dan melewati 8 kali 8 bit setiap kali by menggeser semua bit di dalam variabel ke kanan:

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

Tujuan-tujuan yang telah ditetapkan dan dicapai itu diimplementasikan:

  • Tampilan statis berdasarkan register geser.
  • Mesin Slot (Ani keracunan)
  • Menyediakan fungsi standar untuk jam, jam, tanggal, waktu, jam alarm.
  • RTC (Real Time Clock) dengan baterai CR1220. (Versi baru papan V1.2-2.X menggunakan chip waktu presisi tinggi RTC DS3231).
  • Pengukuran suhu DS18B20 [Celcius atau Fahrenheit].
  • Kontrol melalui port IR TSOP4836 (Hanya bekerja Mega). Diperiksa dengan Remote control Sony RM-X151, Tetapi dimungkinkan dan remote lainnya dengan frekuensi 36kHz.
  • Sinkronisasi Waktu dengan GPS eksternal (Bekerja hanya Mega)
  • Menu mudah.
  • Manajemen usus besar yang terpisah (titik bawah dan atas)
  • Warna lampu latar RGB dengan transfusi halus
  • Nada dering RTTTL untuk alarm (Bahasa Transfer Nada Dering)
  • Mesin slot (untuk mencegah indikator keracunan)
  • Pada tes mandiri. (Cek semua angka di setiap display dari 0 sampai 9, untuk cek semua LED, serial switch warna biru, merah, hijau, sound check (nada dering diputar)

Tugas-tugas yang tidak dapat direalisasikan sepenuhnya.

  • Sensor cahaya

Kode

  • File tanpa judul
File tanpa judulC/C++
const String FirmwareVersion="010000";//Format _X.XX__ //NIXIE CLOCK SHIELD NCS314 oleh GRA &AFCH ([email protected])//25.05.2016 #include #include #include #include #include #include const byte LEpin=7; //pin Latch Data yang diaktifkan diterima saat HI levelconst byte DHVpin=5; // mati/hidup MAX1771 Driver Tegangan Tinggi(DHV) 110-220V const byte RedLedPin=9; //output MCU WDM untuk LED merah 9-gconst byte GreenLedPin=6; //output MCU WDM untuk LED hijau 6-bconst byte BlueLedPin=3; //keluaran MCU WDM untuk LED biru 3-byte byte pinSet=A0; byte konstan pinUp=A2; byte konstan pinDown=A1; byte konstan pinBuzzer=2; byte konstan pinUpperDots=12; //nilai TINGGI menyalakan titikkonst byte pinLowerDots=8; //nilai TINGGI menyalakan titik-titikkonst kata fpsLimit=16666; // 1/60*1.000.000 //batas kecepatan refresh maksimum pada 60 fpsString stringToDisplay="000000";// Isi string ini akan ditampilkan pada tabung (panjang harus 6 karakter)int menuPosition=0; // 0 - waktu // 1 - tanggal // 2 - alarm // 3 - 12/24 jam mode byte blinkMask=B00000000; //bit mask untuk digit kedipan (1 - kedipan, 0 - cahaya konstan)//------------------------------ -1----------2----------3---------4--------5------ ----6---------7---------8---------9-----//byte lowBytesArray[]={B11111110,B11111101 ,B11111011,B11110111,B11101111,B11011111,B10111111,B01111111,B111111111,B111111111};//byte highBytesArray[]={B111111111,B111111111,B111111111,B111111111,B111111111,B111111111,B11111111,B11110,11,B111t111t11111;byte B00000000; //bit mask untuk memisahkan titik //B00000000 - matikan titik atas dan bawah //B1100000 - matikan semua titik#define DS1307_ADDRESS 0x68byte nol =0x00; // solusi untuk masalah #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// nama:Waktu, Tanggal, Alarm, 12/24 jam, menit, detik, hari, bulan, tahun, jam, menit, alarm kedua01 format_jam // 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 nilai[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#tentukan DateDayIndex 7#define TanggalIndeks TanggalBulan 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 lama memasukiEditModeTime;bool RGBLedsOn=true;byte RGBLEDsEEPROMAddress=0; byte HourFormatEEPROMAddress=1;byte AlarmTimeEEPROMAddress=2;//3,4,5byte AlarmArmedEEPROMAddress=6; //buttons pins deklarasiClickButton 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="Kami InginAnda: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_C6, NOTE_C6, NOTE_CS , 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,/]=1 -1,0,0,//2 0,1,0,//3 0,0,-1,//4 1,0,0,//5 0,-1,0}; //array dengan aturan RGB (0 - lakukan apa-apa, -1 - kurangi, +1 - incresevoid setRTCDateTime(byte h, byte m, byte s, byte d, byte mon, byte y, byte w=1);int functionDownButton=0;int functionUpButton=0;/****************************************** ************************************************** ***********Program Init************************************* ************************************************** ****************/void setup() { digitalWrite(DHVpin, LOW); // mati MAX1771 Driver Tegangan Tinggi(DHV) 110-220V Wire.begin(); // setRTCDateTime(23,40,00,25,7,15,1); Serial.begin(115200); Serial.println(""); if (EEPROM.read(HourFormatEEPROMAddress)!=12) nilai[hModeValueIndex]=24; nilai else[hModeValueIndex]=12; if (EEPROM.read(RGBLEDsEEPROMAddress)!=0) RGBLedsOn=true; else RGBLedsOn=false; if (EEPROM.read(AlarmTimeEEPROMAddress)==255) value[AlarmHourIndex]=0; else nilai[AlarmHourIndex]=EEPROM.read(AlarmTimeEEPROMAddress); jika (EEPROM.read(AlarmTimeEEPROMAddress+1)==255) nilai[AlarmMinuteIndex]=0; e nilai lse[AlarmMinuteIndex]=EEPROM.read(AlarmTimeEEPROMAddress+1); if (EEPROM.read(AlarmTimeEEPROMAddress+2)==255) nilai[AlarmSecondIndex]=0; nilai lain[AlarmSecondIndex]=EEPROM.read(AlarmTimeEEPROMAddress+2); if (EEPROM.read(AlarmArmedEEPROMAaddress)==255) nilai[Alarm01]=0; nilai lain[Alarm01]=EEPROM.read(AlarmArmedEEPROMAddress); tone1.begin(pinBuzzer); lagu=parseLagu(lagu); pinMode(LEpin, OUTPUT); pinMode(DHVpin, OUTPUT); pinMode(RedLedPin, OUTPUT); pinMode(GreenLedPin, OUTPUT); pinMode(BlueLedPin, OUTPUT); // setup SPI SPI.begin(); // SPI.setDataMode (SPI_MODE3); // Mode 3 SPI SPI.setClockDivider(SPI_CLOCK_DIV128); // SCK =16MHz/128=125kHz //pin tombol inits pinMode(pinSet, INPUT_PULLUP); pinMode(pinUp, INPUT_PULLUP); pinMode(pinDown, INPUT_PULLUP); ////////////////////////////pinMode(pinBuzzer, OUTPUT); //buttons objek init setButton.debounceTime =20; // Debounce timer di ms setButton.multiclickTime =30; // Batas waktu untuk multi klik setButton.longClickTime =2000; // waktu sampai "klik ditahan" mendaftar upButton.debounceTime =20; // Debounce timer di ms upButton.multiclickTime =30; // Batas waktu untuk multi klik upButton.longClickTime =2000; // waktu sampai "klik ditahan" mendaftar downButton.debounceTime =20; // Debounce timer di ms downButton.multiclickTime =30; // Batas waktu untuk multi klik downButton.longClickTime =2000; // waktu sampai "klik ditahan" mendaftar // digitalWrite(DHVpin, HIGH); // pada MAX1771 Driver Tegangan Tinggi(DHV) 110-220V //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! //doTest(); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! getRTCTime(); setTime(RTC_hours, RTC_minutes, RTC_seconds, RTC_day, RTC_month, RTC_year); digitalWrite(DHVpin, RENDAH); // matikan 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); // pada MAX1771 Driver Hight Voltage(DHV) 110-220V //p=song;}void rotateLeft(uint8_t &bits){ uint8_t high_bit =bits &(1 <<7) ? 1:0; bit =(bit <<1) | high_bit;}int rotator=0; //indeks dalam array dengan "aturan" RGB (bertambah satu pada setiap 255 siklus)int cycle=0; //siklus counterint RedLight=255;int GreenLight=0;int BlueLight=0;unsigned long prevTime=0; // waktu tabung lase dinyalakan lama prevTime4FireWorks=0; //waktu RGB terakhir diubah//int minuteL=0; //������� ����� �����/****************************** ************************************************** *******************************Program UTAMA****************** ************************************************** ********************************************/void loop() { p=musik(p); if ((millis()-prevTime4FireWorks)>5) { rotateFireWorks(); //ubah warna (dengan 1 langkah) prevTime4FireWorks=millis(); } melakukan Indikasi(); setButton.Update(); upButton.Update(); downButton.Update(); if (editMode==false) { blinkMask=B00000000; } else if ((millis()-enteringEditModeTime)>60000) { editMode=false; menuPosition=firstChild[menuPosition]; blinkMask=blinkPattern[menuPosition]; } if (setButton.clicks>0) //klik pendek { p=0; //matikan musik ))) tone1.play(1000.100); memasukiEditModeTime=milis(); menuPosition=menuPosition+1; if (menuPosition==hModeIndex+1) menuPosition=TimeIndex; Serial.print(F("menuPosition=")); Serial.println(menuPosition); Serial.print(F("nilai=")); Serial.println(nilai[menuPosition]); blinkMask=blinkPattern[menuPosition]; if ((parent[menuPosition-1]!=0) dan (lastChild[parent[menuPosition-1]-1]==(menuPosition-1))) { if ((parent[menuPosition-1]-1==1 ) &&(!isValidDate())) { menuPosition=DateDayIndex; kembali; } editMode=salah; menuPosition=parent[menuPosition-1]-1; if (menuPosition==TimeIndex) setTime(nilai[TimeHoursIndex], nilai[TimeMintuesIndex], nilai[TimeSecondsIndex], hari(), bulan(), tahun()); if (menuPosition==DateIndex) setTime(hour(), minute(), second(),value[DateDayIndex], value[DateMonthIndex], 2000+value[DateYearIndex]); if (menuPosition==AlarmIndex) {EEPROM.write(AlarmTimeEEPROMAddress,nilai[AlarmHourIndex]); EEPROM.write(AlarmTimeEEPROMAddress+1,nilai[AlarmMinuteIndex]); EEPROM.write(AlarmTimeEEPROMAaddress+2,nilai[AlarmSecondIndex]); EEPROM.write(AlarmArmedEEPROMAaddress, nilai[Alarm01]);}; if (menuPosition==hModeIndex) EEPROM.write(HourFormatEEPROMAddress, value[hModeValueIndex]); digitalWrite(DHVpin, RENDAH); // matikan MAX1771 Driver Tegangan Tinggi(DHV) 110-220V setRTCDateTime(jam(),menit(),detik(),hari(),bulan(),tahun()%1000,1); digitalWrite(DHVpin, TINGGI); // pada MAX1771 Driver Hight Voltage(DHV) 110-220V } value[menuPosition]=extractDigits(blinkMask); } if (setButton.clicks<0) //klik lama { tone1.play(1000.100); if (!editMode) { memasukiEditModeTime=milis(); if (menuPosition==TimeIndex) stringToDisplay=PreZero(hour())+PreZero(minute())+PreZero(second()); //format 24 jam diaktifkan sementara saat pengaturan } menuPosition=firstChild[menuPosition]; if (menuPosition==AlarmHourIndex) {nilai[Alarm01]=1; /*digitalWrite(pinUpperDots, HIGH);*/dotPattern=B10000000;} editMode=!editMode; blinkMask=blinkPattern[menuPosition]; nilai[menuPosition]=extractDigits(blinkMask); } if (upButton.clicks !=0) functionUpButton =upButton.clicks; if (upButton.clicks>0) { p=0; //matikan musik ))) tone1.play(1000.100); nilai pertambahan(); } if (functionUpButton ==-1 &&upButton.depressed ==true) { BlinkUp=false; if (editMode==true) { if ( (millis() - upTime)> settingDelay) { upTime =millis();// + settingDelay; nilai pertambahan(); } } } else BlinkUp=true; if (downButton.clicks !=0) functionDownButton =downButton.clicks; if (downButton.clicks>0) { p=0; //matikan musik ))) 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=benar; if (!editMode) { if (upButton.clicks<0) { tone1.play(1000.100); RGBLedsOn=benar; EEPROM.write(RGBLEDsEEPROMAaddress,1); Serial.println("RGB=on"); } if (downButton.clicks<0) { tone1.play(1000.100); RGBLedsOn=salah; EEPROM.write(RGBLEDsEEPROMAaddress,0); Serial.println("RGB=mati"); } } static bool updateDateTime=false; switch (menuPosition) { case TimeIndex://mode waktu stringToDisplay=updateDisplayString(); doDotBlink(); periksaWaktuAlarm(); merusak; case DateIndex://mode tanggal stringToDisplay=PreZero(day())+PreZero(month())+PreZero(year()%1000); dotPattern=B01000000;//nyalakan titik bawah /*digitalWrite(pinUpperDots, LOW); digitalWrite(pinLowerDots, HIGH);*/ checkAlarmTime(); merusak; case AlarmIndex://mode alarm stringToDisplay=PreZero(nilai[AlarmHourIndex])+PreZero(nilai[AlarmMinuteIndex])+PreZero(nilai[AlarmSecondIndex]); if (nilai[Alarm01]==1) /*digitalWrite(pinUpperDots, HIGH);*/ dotPattern=B10000000; //nyalakan titik atas else { /*digitalWrite(pinUpperDots, LOW); digitalWrite(pinLowerDots, RENDAH);*/ dotPattern=B00000000; //matikan titik atas } checkAlarmTime(); merusak; case hModeIndex://12/24 jam mode stringToDisplay="00"+String(value[hModeValueIndex])+"00"; dotPattern=B00000000;//matikan semua titik /*digitalWrite(pinUpperDots, LOW); digitalWrite(pinLowerDots, RENDAH);*/ checkAlarmTime(); merusak; }}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); kembali; } RedLight=RedLight+firefork[rotator*3]; GreenLight=Lampu Hijau+garpu api[rotator*3+1]; BlueLight=BlueLight+firefork[rotator*3+2]; analogWrite(RedLedPin,RedLight ); analogWrite(GreenLedPin,GreenLight); analogWrite(BlueLedPin,BlueLight); siklus=siklus+1; if (siklus==255) { rotator=rotator+1; siklus=0; } if (rotator>5) rotator=0;}void doIndication(){ //static byte b=B00000001; static unsigned long lastTimeInterval1Started; jika ((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, RENDAH); // latching data }byte CheckButtonsState(){ static boolean keysWasChecked; startBuzzTime panjang yang tidak ditandatangani statis; static unsigned long lastTimeButtonsPressed; if ((digitalRead(pinSet)==0)||(digitalRead(pinUp)==0)||(digitalRead(pinDown)==0)) { if (buttonsWasChecked==false) startBuzzTime=millis(); buttonWasChecked=benar; } else keysWasChecked=false; if (milis()-startBuzzTime<30) { digitalWrite(pinBuzzer, TINGGI); } else { digitalWrite(pinBuzzer, RENDAH); }}String updateDisplayString(){ static unsigned long lastTimeStringWasUpdated; if ((millis()-lastTimeStringWasUpdated)>1000) { //Serial.println("doDotBlink"); //doDotBlink(); lastTimeStringWasUpdated=milis(); if (nilai[hModeValueIndex]==24) mengembalikan PreZero(hour())+PreZero(minute())+PreZero(second()); lain kembalikan PreZero(hourFormat12())+PreZero(minute())+PreZero(second()); } return stringToDisplay;}void doTest(){ Serial.print(F("Versi firmware:")); Serial.println(FirmwareVersion.substring(1,2)+"."+FirmwareVersion.substring(2,4)); Serial.println(F("Mulai Tes")); int adc=analogRead(A3); float Uinput=4.6*(5.0*adc)/1024.0+0.7; Serial.print(F("U input=")); Serial.print(Uinput); p=lagu; parseLagu(p); analogWrite(RedLedPin,255); penundaan (1000); analogWrite(RedLedPin,0); analogWrite(GreenLedPin,255); penundaan (1000); analogWrite(GreenLedPin,0); analogWrite(BlueLedPin,255); penundaan (1000); //sementara(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 penundaan=500; tes bool=1; byte strIndeks=0; unsigned long startOfTest=millis(); for (int i=0; i<12; i++) { if ((millis()-startOfTest)>dlay) { startOfTest=millis(); strIndeks=strIndeks+1; if (strIndeks==10) tunda=3000; if (strIndex==12) tes=0; switch (strIndex) { /* kasus 10:SPI.transfer((b|B01000000)&B11111100); merusak; kasus 11:SPI.transfer((b|B01000000)&B11001110); merusak; */ //default:SPI.transfer(b|B11000000); default:stringToDisplay=testStringArray[strIndex]; } } delayMicroseconds(2000); }; Serial.println(F("Hentikan Tes")); }void doDotBlink(){ static unsigned long lastTimeBlink=millis(); bool statis dotState=0; if ((millis()-lastTimeBlink)>1000) { lastTimeBlink=millis(); dotState=!dotState; if (dotState) { dotPattern=B11000000; /*digitalWrite(pinUpperDots, TINGGI); digitalWrite(pinLowerDots, HIGH);*/ } else { dotPattern=B00000000; /*digitalWrite(pinUpperDots, RENDAH); digitalWrite(pinLowerDots, LOW);*/ } }}batalkan setRTCDateTime(byte h, byte m, byte s, byte d, byte mon, byte y, byte w){ Wire.beginTransmission(DS1307_ADDRESS); Kawat.tulis(nol); //hentikan Kawat Oscillator.tulis(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)); Kawat.tulis(nol); //start Wire.endTransmission();}byte decToBcd(byte val){// Mengonversi angka desimal normal menjadi pengembalian desimal berkode biner ( (val/10*16) + (val%10) );}byte bcdToDec(byte val ) {// Konversi desimal berkode biner ke angka desimal normal return ( (val/16*10) + (val%16) );}void getRTCTime(){ Wire.beginTransmission(DS1307_ADDRESS); Kawat.tulis(nol); Kawat.endTransmisi(); Wire.requestFrom(DS1307_ADDRESS, 7); RTC_detik =bcdToDec(Wire.read()); RTC_menit =bcdToDec(Wire.read()); RTC_jam =bcdToDec(Wire.read() &0b111111); //waktu 24 jam RTC_day_of_week =bcdToDec(Wire.read()); //0-6 -> minggu - Sabtu RTC_day =bcdToDec(Wire.read()); RTC_bulan =bcdToDec(Wire.read()); RTC_year =bcdToDec(Wire.read());}word doEditBlink(int pos){ if (!BlinkUp) mengembalikan 0; jika (!BlinkDown) mengembalikan 0; int lowBit=blinkMask>>pos; lowBit=rendahBit&B00000001; static unsigned long lastTimeEditBlink=millis(); static bool blinkState=false; topeng kata=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); lain digitalWrite(pinLowerDots, RENDAH); if (((blinkPattern[menuPosition]>>7)&1==1) &&blinkState==true) digitalWrite(pinUpperDots, HIGH); lain digitalWrite(pinUpperDots, RENDAH); */ jika (keadaan berkedip) tmp=0; lain tmp=blinkMask; } if (((dotPattern&~tmp)>>6)&1==1) digitalWrite(pinLowerDots, HIGH); lain digitalWrite(pinLowerDots, RENDAH); if (((dotPattern&~tmp)>>7)&1==1) digitalWrite(pinUpperDots, TINGGI); lain digitalWrite(pinUpperDots, RENDAH); if ((blinkState==true) &&(lowBit==1)) mask=0xFFFF;//mask=B11111111; return mask;}int extractDigits(byte b){ String tmp="1"; /*Serial.print("pola kedip ="); 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; merusak; case 'd':note =3; merusak; case 'e':note =5; merusak; case 'f':note =6; merusak; case 'g':note =8; merusak; case 'a':note =10; merusak; case 'b':note =12; merusak; 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/

Skema


Proses manufaktur

  1. Arduino pov vision clock
  2. Pengontrol DMX yang Dioperasikan Web
  3. Jam Kata Sederhana (Arduino)
  4. Jam Arduino dengan waktu sholat Islam
  5. Arduino Spybot
  6. Jam Master
  7. Membuat Jam Nixie Dengan Arduino dalam Kotak Kayu MDF
  8. Jam Array 7-Segmen
  9. BLUE_P:Perisai Pemrograman Arduino Nirkabel
  10. Jam Alarm Sederhana dengan DS1302 RTC