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

JX Wave Generator

Komponen dan persediaan

Arduino Nano R3
Saya belum mencobanya tetapi mungkin Anda dapat menggunakan model Arduino apa pun
× 1
Menampilkan SH1106 I2C Oled 128x64 piksel (4 pin)
× 1
Modul DDS AD9833
× 1
Rotary Encoder dengan Tombol Tekan
Dengan ini Anda memerlukan besi solder
× 1
Modul Rotary Encoder
Untuk pemasangan papan tempat memotong roti ini lebih baik
× 1
Modul Relai 5V (opsional)
Opsional, jika tidak perlu mengubah mode sambungan keluaran AC/DC. Untuk pemasangan papan tempat memotong roti ini lebih baik
× 1
Relay Reed 5V 500 Ohm
Ini akan menjadi yang terbaik untuk sinyal kecil tetapi membutuhkan besi solder.Dengan koil 500 Ohm dapat dihubungkan langsung ke pin digital Arduino (10 mA).
× 1
Kapasitor 10 F
× 1
Kapasitor 10 nF
Kapasitor poliester
× 1
Catu Daya Step-Down AC-DC 100-220V ke 5V modul
Opsional, untuk memberi daya pada sirkuit saat tidak terhubung melalui USB
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)
Tidaklah penting jika Anda ingin menguji proyek di papan tempat memotong roti

Aplikasi dan layanan online

image2cpp
Untuk mengonversi ikon khusus Anda ke format heksadesimal untuk PROGMEM

Tentang proyek ini

Untuk waktu yang lama saya telah menunda membeli osiloskop. Sekarang, setelah membelinya, saatnya juga memiliki generator sinyal murah untuk penggunaan hobi, penting untuk mendiagnosis sirkuit audio dan banyak lagi. Menggabungkan dua hasrat untuk elektronik dan komputasi, hal terbaik adalah melakukannya sendiri dengan Arduino.

FITUR

  • Frekuensi keluaran antara 1 Hz dan 999999 Hz
  • dua mode variasi frekuensi:logaritmik dan satu digit
  • tiga jenis gelombang, sinus, segitiga dan persegi
  • Kopling keluaran AC atau DC
  • kemampuan untuk menyapu terus menerus antara dua nilai frekuensi yang telah ditentukan
  • dikendalikan secara eksklusif oleh satu tombol
  • penghemat layar terintegrasi untuk mempertahankan masa pakai tampilan lama

CATATAN

REFERENSI CEPAT

PROTOTIPE

Saya menggunakan modul relai pra-rakitan yang memiliki kontak 10A, karena saat ini saya tidak memiliki relai buluh mikro, ini akan menjadi pilihan terbaik untuk menghindari dioda dan resistor transistor, ketika relai daya tidak diperlukan. PIN digital Arduino dapat mengirimkan arus maksimum 40 mA sehingga Anda tidak dapat menghubungkan relai elektromekanis dengan kumparan 120/150 ohm secara langsung.

SELALU SANGAT SANGAT HATI-HATI saat menggunakan tegangan listrik!

Risiko sengatan listrik dan/atau kerusakan pada kulit dan mata Anda.
Jaga hidup Anda, Anda hanya memiliki satu!

Kode

  • JX_Wave_Generator_8.7.7.ino
  • JXWG_Defs.h
  • JXWG_Graphics.h
JX_Wave_Generator_8.7.7.inoC/C++
Versi 8.7.7. Revisi kecil pada 16/1/2021
/* Hak Cipta (c) 2020 Janux Izin dengan ini diberikan, gratis, kepada siapa pun yang memperoleh salinan perangkat lunak ini dan file dokumentasi terkait ("Perangkat Lunak"), untuk menangani dalam Perangkat Lunak tanpa batasan, termasuk namun tidak terbatas pada hak untuk menggunakan, menyalin, memodifikasi, menggabungkan, menerbitkan, mendistribusikan, mensublisensikan, dan/atau menjual salinan Perangkat Lunak, dan untuk mengizinkan orang yang diberikan Perangkat Lunak untuk melakukannya, tunduk pada dengan ketentuan berikut:Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus disertakan dalam semua salinan atau bagian substansial dari Perangkat Lunak. PERANGKAT LUNAK INI DISEDIAKAN "SEBAGAIMANA ADANYA", TANPA JAMINAN DALAM BENTUK APA PUN, TERSURAT MAUPUN TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN DIPERDAGANGKAN, KESESUAIAN UNTUK TUJUAN TERTENTU DAN TANPA PELANGGARAN. DALAM KEADAAN APA PUN PENULIS ATAU PEMEGANG HAK CIPTA TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN ATAU TANGGUNG JAWAB LAINNYA, BAIK DALAM TINDAKAN KONTRAK, KERUSAKAN ATAU LAINNYA, TIMBUL DARI, DARI ATAU SEHUBUNGAN DENGAN PERANGKAT LUNAK ATAU DALAM DEALING LAINNYA PERANGKAT LUNAK. Kode penyimpanan-pemuatan konfigurasi adalah pengembangan dari ide asli artikel "Cara Memuat dan Menyimpan Konfigurasi pada Arduino" oleh Ragnar Ranyen Homb di situs web Norwegian Creation.*/#include "JXWG_Defs.h"#include "JXWG_Graphics .h"void setup() { //jika Anda menggunakan encoder sederhana dan resistor pullup 3x10K, terapkan pengaturan ini di bawah pinMode(PinA, INPUT); pinMode(PinB, INPUT); pinMode(PinS, INPUT); //jika Anda menggunakan encoder sederhana tanpa resistor 3x10K gunakan baris pohon berikutnya //pinMode(PinA, INPUT_PULLUP); //pinMode(PinB, INPUT_PULLUP); //pinMode(PinS, INPUT_PULLUP); // KEBANYAKAN ENCODER DILAS PCB SUDAH MEMILIKI RESISTOR PULLUP PADA PIN A DAN B TAPI TIDAK PADA PIN SWITCH // kemudian gunakan pengaturan di bawah //pinMode(PinA, INPUT); //pinMode(PinB, INPUT); //pinMode(PinS, INPUT_PULLUP); digitalWrite(PinA, TINGGI); digitalWrite(PinB, TINGGI); digitalWrite(Pin, TINGGI); pinMode(PinCoupling, OUTPUT); //Coupling Mode Encoder.setDebounceDelay(5); display.begin(SH1106_SWITCHCAPVCC, 0x3C); //inisialisasi dengan I2C addr 0x3C (untuk 128x64) display.clearDisplay(); //display.setRotation(2); //batalkan komentar pada baris ini jika Anda ingin memasang tampilan terbalik Wire.begin(); // bergabung dengan bus i2c sebagai master TWBR =5; // freq=615kHz periode=1.625uS //Menetapkan peristiwa push switch encoder untuk menginterupsi 1 Pin 3 dari Arduino attachInterrupt(digitalPinToInterrupt(PinS), encoderSwitch, FALLING); DDS_Init(); //Inisialisasi modul DDS; setConfig(); //Muat konfigurasi dan setel nilai startup} //---> end setup()void loop() { JX_WaveGenerator_MAIN();}//------------------- -------------------------------------------------- -------------------------------------------------- ------------------// Fungsi UTAMA JX WaveGenerator//------------------------ -------------------------------------------------- -------------------------------------------------- ------------- batal JX_WaveGenerator_MAIN() { byte encoderSpin =Encoder.rotate(); //Arah rotasi encoder 1=CW, 2=CCW byte encoderLongPush =Encoder.pushLong(1000); //encoder long push event long lStep =0; // nilai langkah frekuensi saat ini wTime =600000; //10 menit jika (encoderPush) delay(250); if (encoderSpin) { cTime =milis(); } else { if (milis() - cTime> wTime) { ScreenSaver(); } } saklar (mode) { kasus LOGARITHMIC://0 //----------------------------------- -------------------------------------------------- ---------------------------------------------- // mode LOGARITHMIC :Frekuensi perubahan putaran encoder pada langkah logaritmik 1,10,100,1000,10000,100000 Hz //----------------------------- -------------------------------------------------- -------------------------------------------------- - if (encoderSpin) { if (lFreq>=1) { lStep =AutoStep(lFreq, encoderSpin); //Hitung langkah logaritmik } else if (_CouplingMode ==OFF) { //jika mode kopling disetel ke OFF resetCouplingMode(); //set mode kopling default ketika Frekuensi bukan 0 encoderSpin =0; //skip first spin } if (encoderSpin ==CW &&lFreq <=999999 - lStep) { //spin CW menaikkan frekuensi lFreq +=lStep; } if (encoderSpin ==CCW &&lFreq>=lStep + 1) { //spin CCW mengurangi frekuensi lFreq -=lStep; } DDS_FrequencySet(lFreq, Gelombang[_Jenis Gelombang]); //mengirim nilai frekuensi ke modul DDS displayFrequency(lFreq); //kirim frekuensi terformat untuk menampilkan lLastFreq =lFreq; //menyimpan frekuensi saat ini } //------------------------------------------ -------------------------------------------------- --------------------------------------- // workmode LOGARITHMIC:Encoder push switch ke mode OPTIONS //------------------------------------------------ -------------------------------------------------- --------------------------------- if (encoderPush) { encoderPush =false; //Hapus tanda push drawSymbol(1); //gambar simbol panah selectIcon(0, WHITE); //gambar batas di sekitar ikon pertama idx =0; id =0; //reset pointer var mode =OPTIONS; //masuk ke mode OPSI } istirahat; //end mode kasus LOGARITHMIC TUNGGAL://------------------------------------- -------------------------------------------------- ---------------------- // submode TUNGGAL:Rotasi encoder menggerakkan kursor ke kiri dan ke kanan //-------------- -------------------------------------------------- --------------------------------------------- jika (encoderSpin) { if (encoderSpin ==CW &&idx  0) idx--; //penunjuk penurunan berlawanan arah jarum jam //------------------------------------------------------ -------------------------------------------------- --------------- // ketika idx dari 0 hingga 5 pilih digit frekuensi //---------- -------------------------------------------------- ------------------------------------- if (idx>=0 &&idx =MAXDIGIT &&idx <=MAXDIGIT + 2) { //jika posisi saat ini melebihi angka hideCursor(MAXDIGIT - 1); //sembunyikan kursor pada digit terakhir drawSymbol(1); //draw dn arrow selectIcon(idx - MAXDIGIT, WHITE); //pilih ikon } } //------------------------------------------ -------------------------------------------------- --------------------------------------- // submode TUNGGAL:Peristiwa push encoder //- -------------------------------------------------- -------------------------------------------------- ------------------------------ if (encoderPush) { encoderPush =false; //------------------------------------------------ -------------------------------------------------- ----------- // jika satu digit dari 0 hingga 5 dipilih, masuk ke mode DIGITCHANGE //---------------------- -------------------------------------------------- ------------------------------------- if (idx <=MAXDIGIT - 1) { hideCursor(idx ); //penundaan kursor flash(250); //untuk pilihDigit(idx); //konfirmasi visual drawSymbol(2); //menggambar mode ikon belok =DIGITCHANGE; //ubah mode } //------------------------------------------- -------------------------------------------------- ---------------- // jika tidak ada ikon yang dipilih lalu buka OPSI //-------------------- -------------------------------------------------- ---------------------------------------else { if (idx>=MAXDIGIT &&idx <=MAXDIGIT + 2) { idy =idx - MAXDIGIT; pilihOpsi(idy); idy =opsi[idy]; } } } merusak; //akhiri mode SINGLEDIGIT kasus SWEEP://2 //------------------------------------- -------------------------------------------------- ------------------------- // workmode SWEEP:Rotasi encoder menggerakkan kursor ke kiri dan kanan untuk pemilihan opsi //-------- -------------------------------------------------- -------------------------------------------------- ---- if (encoderSpin) { if (encoderSpin ==CW &&idy <2) idy++; if (encoderSpin ==CCW &&idy> 0) idy--; pilihIkon(idy, PUTIH); } if (encoderPush) { //------------------------------------------ -------------------------------------------------- --------------------------------------- // workmode SWEEP:Encoder push masuk ke OPTIONS, PILIHAN SWEEP atau sapuan START/STOP //----------------------------------------- -------------------------------------------------- ---------------------------------------- encoderPush =false; sakelar (idy) { kasus 0:lFreq =atol(Freq); pilihOpsi(idy); idy =opsi[idy]; penundaan(100); if (_WorkMode !=2) displayFrequency(lLastFreq); Sapu Atur Ulang(); merusak; kasus 1:lFreq =atol(Freq); drawSimbol(9); drawSimbol(1); displaySweepIcons(); pilihIkon(0, PUTIH); id =0; displayFrequency(_Sweep(idy)); penundaan(100); Sapu Atur Ulang(); modus =OPTSWEEP; merusak; case 2://** sweepStatus:MASIH 0 (tidak pernah dimulai), 1 BREAK, 2 PAUSE ** if (sweepStatus ==MASIH || sweepStatus ==PAUSE) { drawSymbol(3); //gambar ikon jeda pilihIkon(2, PUTIH); //pilih ikon FrequencySweep(); //jalankan sapuan } else { //jika dijeda drawSymbol(4); //gambar ikon putar sweepStatus =PAUSE; } merusak; } } if (sweepStatus ==PAUSE) flashIcon(250); // berkedip jeda jeda teks; //end mode SWEEP case OPSI://3 jika (encoderLongPush) reset(); //------------------------------------------------ -------------------------------------------------- --------------------------------- // mode OPTIONS:Encoder spin pilih opsi untuk mengubah (mode kerja, tipe gelombang, mode kopling ) //------------------------------------------------ -------------------------------------------------- ---------------------------------- if (encoderSpin) { if (encoderSpin ==CW &&idy <2) keren++; if (encoderSpin ==CCW &&idy> 0) idy--; pilihIkon(idy, PUTIH); } //------------------------------------------------ -------------------------------------------------- ---------------------------------- // mode PILIHAN:Encoder push switch ke mode relatif //--- -------------------------------------------------- -------------------------------------------------- ---------------------------- if (encoderPush) { encoderPush =false; //pilihIkon(idy, HITAM); pilihOpsi(idy); hideCursor(0); idy =opsi[idy]; } merusak; //end mode OPTIONS case OPTMODE://4 //------------------------------------- -------------------------------------------------- -------------------------------------------- // mode OPTMODE:Encoder putar ikon mode pilih (logaritmik, satu digit, sapuan) //------------------------------------- -------------------------------------------------- -------------------------------------------- if (encoderSpin) { jika (encoderSpin ==CW &&idy <2) idy++; if (encoderSpin ==CCW &&idy> 0) idy--; pilihIkon(idy, PUTIH); } //------------------------------------------------ -------------------------------------------------- ---------------------------------- // mode OPTMODE:Encoder tekan pilih mode kerja untuk diatur (disimpan dalam opsi [ 0]) //---------------------------------------------- -------------------------------------------------- ------------------------------------ if (encoderPush) { encoderPush =false; byte pMode =_WorkMode; switch (idy) { kasus 0:hideCursor(0); drawSimbol(0); lFreq =lFreq Terakhir; displayFrequency(lFreq); _setWorkMode(LOGARITHMIC); merusak; kasus 1:drawSimbol (0); pilihDigit(0); lFreq =lFreq Terakhir; displayFrequency(lFreq); _setWorkMode(TUNGGAL); merusak; kasus 2:lLastFreq =lFreq; displayFrequency(_SweepMin); //siap untuk memulai _setWorkMode(SWEEP); merusak; } mode =_Mode Kerja; if (pMode !=_WorkMode) saveConfig(); if (_CouplingMode ==OFF) resetCouplingMode(); idx =0; drawAllIcons(); } merusak; //end mode OPTMODE kasus OPTWAVE://5 //------------------------------------- -------------------------------------------------- ------------------------- // mode OPTWAVE:Rotasi encoder menggerakkan kursor ke kiri dan kanan untuk pemilihan gelombang (sqr, sin, tri) //- -------------------------------------------------- -------------------------------------------------- ----------- if (encoderSpin) { if (encoderSpin ==CW &&idy <2) idy++; if (encoderSpin ==CCW &&idy> 0) idy--; pilihIkon(idy, PUTIH); } //------------------------------------------------ -------------------------------------------------- ------------------- // mode OPTWAVE:Encoder push mengatur tipe gelombang baru //------------------ -------------------------------------------------- ------------------------------------------------ jika ( encoderPush) { encoderPush =salah; if (_Jenis Gelombang !=idy) { _setWaveType(idy); simpanKonfig(); } Frekuensi Pembaruan(); //memperbarui tipe gelombang drawAllIcons(); idx =0; mode =_Mode Kerja; } merusak; //end mode OPTWAVE kasus OPTCOUP://6 //------------------------------------- -------------------------------------------------- ------------------------- // mode OPTCOUP:Rotasi encoder menggerakkan kursor ke kiri dan kanan untuk pemilihan mode kopling //------- -------------------------------------------------- -------------------------------------------------- ----- if (encoderSpin) { if (encoderSpin ==CW &&idy <2) idy++; if (encoderSpin ==CCW &&idy> 0) idy--; pilihIkon(idy, PUTIH); } //------------------------------------------------ -------------------------------------------------- ------------------- // mode OPTCOUP:Encoder push pilih mode kopling saat ini //------------------ -------------------------------------------------- ------------------------------------------------ jika ( encoderPush) { encoderPush =salah; setCouplingMode(idy); drawAllIcons(); idx =0; mode =_Mode Kerja; } merusak; //end mode kasus OPTCOUP OPTWEEP://7 //------------------------------------- -------------------------------------------------- ----------------------------- // mode OPTWEEP:Putar encoder pilih nilai sapuan untuk diedit //------- -------------------------------------------------- -------------------------------------------------- --------- if (encoderSpin) { if (encoderSpin ==CW &&idy <2) idy++; //menaikkan pointer searah jarum jam if (encoderSpin ==CCW &&idy> 0) idy--; //berlawanan arah jarum jam turunkan pointer selectIcon(idy, WHITE); //pilih ikon pertama displayFrequency(_Sweep(idy)); //menampilkan nilai sapuan saat ini } if (encoderPush) { encoderPush =false; //------------------------------------------------ -------------------------------------------------- ------------------ // mode OPTWEEP:Encoder push konfirmasi nilai sapuan untuk mengedit //------------------ -------------------------------------------------- ------------------------------------------------drawSimbol( 0); pilihDigit(0); pilihIkon(idy, PUTIH); idx =0; displayFrequency(_Sweep(idy)); modus =SWEEPEDIT; } merusak; //end mode OPTSWEEP kasus SWEEPEDIT://8 //------------------------------------- -------------------------------------------------- ----------------------- // mode SWEEPEDIT:Encoder spin pilih digit untuk diubah //-------------- -------------------------------------------------- ---------------------------------------------- jika (encoderSpin) { if (encoderSpin ==CW &&idx  0) idx--; //pengurangan pointer berlawanan arah jarum jam selectDigit(idx); } //------------------------------------------------ -------------------------------------------------- ------------- // mode SWEEPEDIT:Encoder longpush keluar dari edit dan kembali ke SWEEP //---------- -------------------------------------------------- --------------------------------------- if (encoderLongPush ==LONGPUSH) { encoderPush =false; drawAllIcons(); displayFrequency(_SweepMin); sembunyikan Kursor(idx); _setWorkMode(SWEEP); Sapu Atur Ulang(); mode =_Mode Kerja; penundaan (250); } if (encoderPush) { encoderPush =false; //------------------------------------------------ -------------------------------------------------- ----------- // mode SWEEPEDIT:Encoder push masuk ke mode DIGITCHANGE //--------------- -------------------------------------------------- ---------------------------------- hideCursor(idx); //penundaan kursor flash(250); //untuk pilihDigit(idx); //konfirmasi visual drawSymbol(2); //menggambar mode ikon belok =DIGITCHANGE; //ubah mode } break;//akhiri mode SWEEPEDIT case DIGITCHANGE://9 //-------------------- -------------------------------------------------- ------------------------- // mode DIGITCHANGE:Encoder longpush keluar dari DIGITCHANGE saat dalam mode SWEEP //--------- -------------------------------------------------- ---------------------------------------------- jika (encoderLongPush ==LONGPUSH &&_WorkMode ==SWEEP) { encoderPush =false; sembunyikan Kursor(idx); drawSimbol(1); modus =OPTSWEEP; penundaan (250); } //------------------------------------------------ -------------------------------------------------- -------- // mode DIGITCHANGE:Rotasi encoder mengubah nilai digit (0 -> 9 ->0 dan seterusnya) //------------------ -------------------------------------------------- ------------------------------------- if (encoderSpin) { //rotasi encoder if (encoderSpin ==CW) { //arah searah jarum jam Freq[idx]++; if (Frekuensi[idx]> '9') Frekuensi[idx] ='0'; } else { //berlawanan arah jarum jam Freq[idx]--; if (Frekuensi[idx] <'0') Frekuensi[idx] ='9'; } updateDigit(idx, Freq[idx]); //perbarui digit pada tampilan } //----------------------------------------- -------------------------------------------------- -------------- // mode DIGITCHANGE:Encoder mendorong kembali ke mode TUNGGAL atau SWEEPEDIT //--------------------- -------------------------------------------------- ---------------------------------- if (encoderPush) { //encoder push flag disetel oleh interupsi encoderPush =false; //reset flag event hideCursor(idx); //penundaan kursor flash(250); //untuk pilihDigit(idx); //konfirmasi visual drawSymbol(0); if (_WorkMode ==SWEEP) { long ltemp =_Sweep(idy); //simpan nilai _setSweep(idy, atol(Freq)); //mengubah nilai baru dari array menjadi long if (_SweepMax> 0 &&_SweepMax> _SweepMin &&_SweepStep>
 0) { //memeriksa kesesuaian nilai sapuan baru if (_Sweep(idy) !=ltemp) saveConfig(); //jika nilai telah berubah tulis nilai baru di EEPROM displayFrequency(_Sweep(idy)); modus =SWEEPEDIT; //ubah mode } else { _displayErrMsg; //menampilkan pesan kesalahan yang disimpan di flash mem delay(1000); _setSweep(idy, ltemp); //mengembalikan nilai yang disimpan displayFrequency(_Sweep(idy)); //menampilkan ulang nilai drawSymbol(2); //redraw turn icon } } else { //jika tidak dalam mode sapuan if (_CouplingMode ==OFF) { //jika mode kopling jika OFF lLastFreq =atol(Freq); //menyimpan frekuensi saat ini resetCouplingMode(); //set mode kopling default } UpdateFrequency(); //mengirim frekuensi ke mode Modul DDS =TUNGGAL; //ubah mode } } istirahat; //akhiri mode DIGITCHANGE default:istirahat; }}//--------------------------------------------- -------------------------------------------------- -----------------------------------// Push encoder event - Dipanggil oleh interupsi//---- -------------------------------------------------- -------------------------------------------------- ---------------------------void encoderSwitch(void) { encoderPush =true;}//---------- -------------------------------------------------- -------------------------------------------------- ---------------------// Fungsi utilitas//----------------------- -------------------------------------------------- -------------------------------------------------- --------// Menggambar antarmuka grafis//----------------------------------- -------------------------------------------------- ---------------------------void drawInterface() { display.clearDisplay(); tampilan.display(); penundaan (1000); display.drawRoundRect(0, 0, 128, 64, 3, WHITE); //draw external frame display.fillRect(1, 1, 126, 14, WHITE); //draw caption frame displayText(12, 4, strFromFlash(0), BLACK, WHITE, SMALL); //print caption title delay(1000); if (cTime ==1) { //only on power on displayText(XPOS - 6, YPOS + 10, strFromFlash(1), WHITE, BLACK, BIG); //show Welcom message delay(1000); display.fillRect(2, 16, display.width() - 3, 35, BLACK); //clear Welcome message cTime =0; } display.display(); displayText(XPOS + 84, YPOS + 4, strFromFlash(2), WHITE, BLACK, SMALL); //print "Hz" sprintf(Freq, "%06li", lFreq); //put frequency value into char array with template "000000" for (int i =MAXDIGIT - 1; i>=0; i--) { display.drawChar(XPOS + 2 + i * DELTAX, YPOS, Freq[i] , WHITE, BLACK, BIG); //Display with animation effect from right to left display.display(); }}//end drawInterface()//----------------------------------------------------------------------------------------------------------------// Print string in x,y pos with specified colors and size//----------------------------------------------------------------------------------------------------------------void displayText(byte x, byte y, const char *str, byte foreColor, byte backColor, byte textSize) { display.setTextSize(textSize); //textsize:SMALL or BIG global const display.setTextColor(foreColor, backColor); //colors WHITE or BLACK global const of the library display.setCursor(x, y); //set the cursor position display.print(str); //str is the pointer to the string of chars display.display(); //update display}//----------------------------------------------------------------------------------------------------------------// Copies element [i] of the string_table array from flash memory to the ram buffer and returns the pointer to the buffer//----------------------------------------------------------------------------------------------------------------char* strFromFlash(byte i) { strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); return (char*)buffer;}//----------------------------------------------------------------------------------------------------------------// Draw or clear a border around selected icon after clearing border of the previous one//----------------------------------------------------------------------------------------------------------------void selectIcon(byte icon, byte color) { static byte prevIcon; display.drawRect(XPOS - 10 + prevIcon * 32, YPOS + 19, 29, 20, BLACK); display.drawRect(XPOS - 10 + icon * 32, YPOS + 19, 29, 20, color); tampilan.display(); prevIcon =icon;}//----------------------------------------------------------------------------------------------------------------// Display all workmode icons//----------------------------------------------------------------------------------------------------------------void displayWorkModeIcons(void) { byte const *bitmap[3] ={imgLog, imgDigit, imgSweep}; _clearIconsArea; for (byte i =0; i <=2; i++) { display.drawBitmap(XPOS - 8 + i * 32, YPOS + 21, bitmap[i], 25, 16, WHITE); } display.display();}//----------------------------------------------------------------------------------------------------------------// Display all wavetype icons//----------------------------------------------------------------------------------------------------------------void displayWaveTypeIcons(void) { byte const *bitmap[3] ={imgSqr, imgSin, imgTri}; _clearIconsArea; for (byte i =0; i <=2; i++) { display.drawBitmap(XPOS - 8 + i * 32, YPOS + 21, bitmap[i], 25, 16, WHITE); } display.display();}//----------------------------------------------------------------------------------------------------------------// Display all coupling mode icons//----------------------------------------------------------------------------------------------------------------void displayCouplingModeIcons(void) { byte const *bitmap[3] ={imgCoAc, imgCoDc, imgCoOff}; _clearIconsArea; for (byte i =0; i <=2; i++) { display.drawBitmap(XPOS - 8 + i * 32, YPOS + 21, bitmap[i], 25, 16, WHITE); } display.display();}//----------------------------------------------------------------------------------------------------------------// Display all sweep icons//----------------------------------------------------------------------------------------------------------------void displaySweepIcons(void) { byte const *bitmap[3] ={imgSwMax, imgSwMin, imgSwStep}; _clearIconsArea; for (byte i =0; i <=2; i++) { display.drawBitmap(XPOS - 8 + i * 32, YPOS + 21, bitmap[i], 25, 16, WHITE); } display.display();}//----------------------------------------------------------------------------------------------------------------// Draw all icons//----------------------------------------------------------------------------------------------------------------void drawAllIcons(void) { _clearIconsArea; drawModeIcon(); if (_WorkMode ==SWEEP || _WorkMode ==SWEEPEDIT ) { display.drawBitmap(XPOS + 24, YPOS + 21, imgSwOpt, 25, 16, WHITE); display.drawBitmap(XPOS + 56, YPOS + 21, imgSwStart, 25, 16, WHITE); drawSymbol(1); idy =2; selectIcon(idy, WHITE); //ready to sweep drawSmallWaveIcon(); drawSmallCouplingIcon(); } else { drawWaveIcon(); drawCouplingIcon(); drawSymbol(0); if (_WorkMode ==SINGLEDIGIT) selectDigit(0); } display.display();}//----------------------------------------------------------------------------------------------------------------// Draws the icon based on the value of relative option//----------------------------------------------------------------------------------------------------------------void drawModeIcon(void) { byte x =XPOS - 8, y =YPOS + 21; byte const *bitmap[3] ={imgLog, imgDigit, imgSweep}; display.fillRect(x, y, 25, 16, BLACK); display.drawBitmap(x, y, bitmap[_WorkMode], 25, 16, WHITE); display.display();}void drawWaveIcon(void) { byte x =XPOS + 24, y =YPOS + 21; const byte *bitmap[3] ={imgSqr, imgSin, imgTri}; display.fillRect(x, y, 25, 16, BLACK); display.drawBitmap(x, y, bitmap[_WaveType], 25, 16, WHITE); tampilan.display(); drawSmallWaveIcon();}void drawCouplingIcon(void) { byte x =XPOS + 56, y =YPOS + 21; const byte *bitmap[3] ={imgCoAc, imgCoDc, imgCoOff}; display.fillRect(x, y, 25, 16, BLACK); display.drawBitmap(x, y, bitmap[_CouplingMode], 25, 16, WHITE); tampilan.display(); drawSmallCouplingIcon();}//----------------------------------------------------------------------------------------------------------------// Draws small wave icon based on the value of relative option//----------------------------------------------------------------------------------------------------------------void drawSmallWaveIcon(void) { byte x =114, y =41; const byte *bitmap[3] ={imgSqrSmall, imgSinSmall, imgTriSmall}; display.fillRect(x, y, 9, 8, BLACK); display.drawBitmap(x, y, bitmap[_WaveType], 9, 8, WHITE); display.display();}//----------------------------------------------------------------------------------------------------------------// Draws small coupling icon based on the value of relative option//----------------------------------------------------------------------------------------------------------------void drawSmallCouplingIcon(void) { byte x =114, y =50; const byte *bitmap[3] ={imgAcSmall, imgDcSmall, imgOffSmall}; display.fillRect(x, y, 9, 8, BLACK); display.drawBitmap(x, y, bitmap[_CouplingMode], 9, 8, WHITE); display.display();}//----------------------------------------------------------------------------------------------------------------// Show cursor at x position//----------------------------------------------------------------------------------------------------------------void showCursor(byte x) { display.drawChar(XPOS + 2 + x * DELTAX, YPOS + DELTAY, CURSOR, WHITE, WHITE, BIG); display.display();}//----------------------------------------------------------------------------------------------------------------// Hide cursor at x position//----------------------------------------------------------------------------------------------------------------void hideCursor(byte x) { display.drawChar(XPOS + 2 + x * DELTAX, YPOS + DELTAY, CURSOR, BLACK, BLACK, BIG); display.display();}//----------------------------------------------------------------------------------------------------------------// Show cursor at x position after hiding previous one//----------------------------------------------------------------------------------------------------------------void selectDigit(byte x) { static byte lastDigit; hideCursor(lastDigit); display.drawChar(XPOS + 2 + x * DELTAX, YPOS + DELTAY, CURSOR, WHITE, WHITE, BIG); tampilan.display(); lastDigit =x;}//----------------------------------------------------------------------------------------------------------------// Update single digit frequency to chr value//----------------------------------------------------------------------------------------------------------------void updateDigit(byte digit, char chr) { display.drawChar(XPOS + 2 + digit * DELTAX, YPOS, chr , WHITE, BLACK, BIG); display.display();}//----------------------------------------------------------------------------------------------------------------// Drwaw or clear some symbols/icons//----------------------------------------------------------------------------------------------------------------void drawSymbol(byte symbol) { switch (symbol) { case 0://Top arrow display.fillRect(2, 20, 25, 16, BLACK); display.fillRect(2, 43, 14, 16, BLACK); display.drawChar(XPOS - 20 , YPOS + 4, ARROW, WHITE, BLACK, SMALL); //draw top arrow top break; case 1://Bottom arrow display.fillRect(2, 20, 25, 16, BLACK); display.fillRect(2, 43, 14, 16, BLACK); display.drawChar(XPOS - 20 , YPOS + 25, ARROW, WHITE, BLACK, SMALL); //draw bottom arrow break; case 2://Turn icon display.fillRect(2, 20, 25, 16, BLACK); display.drawBitmap(XPOS - 21, YPOS + 1, imgTurn, 13, 13, WHITE); //draw turn icon break; case 3://Play icons display.fillRect(4, 23, 23, 11, BLACK); //clear pause icon display.drawBitmap(4, 23, imgSwRun, 23, 11, WHITE); //draw sweep icon display.fillRect(XPOS + 56, YPOS + 21, 25, 16, BLACK); //clear icon area display.drawBitmap(XPOS + 56, YPOS + 21, imgSwPause, 25, 16, WHITE); //drwaw sweep play symbol icon break; case 4://Pause icons display.fillRect(4, 23, 23, 11, BLACK); //clear sweep icon display.drawBitmap(4, 23, imgSwPsd, 23, 11, WHITE); //draw pause icon display.fillRect(XPOS + 56, YPOS + 21, 25, 16, BLACK); //clear icon area display.drawBitmap(XPOS + 56, YPOS + 21, imgSwStart, 25, 16, WHITE); //draw sweep pause symbol icon break; case 9://Simply clear symbol area display.fillRect(2, 20, 25, 16, BLACK); //clear top symbol area display.fillRect(2, 43, 14, 16, BLACK); //clear bottom symbol area break; default:break; } display.display();}//---------------------------------------------------------------------------------------------------------------// Set current frequency in DDS module, if frequency is 0 it will be set to 1//---------------------------------------------------------------------------------------------------------------void UpdateFrequency(void) { lFreq =atol(Freq); //convert char array to long if (lFreq <1) { //the frequency at zero makes no sense ++Freq[MAXDIGIT - 1]; //increase the right most digit lFreq =1; //set frequency to 1 } displayFrequency(lFreq); //update the display DDS_FrequencySet(lFreq, Wave[_WaveType]); //send the frequency value to DDS module lLastFreq =lFreq; //save current freq}//---------------------------------------------------------------------------------------------------------------// Display the frequency with the six-zero template//---------------------------------------------------------------------------------------------------------------void displayFrequency(long f) { sprintf(Freq, "%06li", f); //convert long to char with template '000000' displayText(XPOS + 2, YPOS, Freq , WHITE, BLACK, BIG); //print frequency on display display.display(); //refresh display}//---------------------------------------------------------------------------------------------------------------// Reset coupling mode to default//---------------------------------------------------------------------------------------------------------------void resetCouplingMode(void) { if (lFreq ==0 &&_CouplingMode ==OFF) { setCouplingMode(AC); drawCouplingIcon(); }}//---------------------------------------------------------------------------------------------------------------// Set a specific coupling mode//---------------------------------------------------------------------------------------------------------------void setCouplingMode(byte cMode) { byte pMode =_CouplingMode; switch (cMode) { case 0:if (lLastFreq> 0) lFreq =lLastFreq; digitalWrite(PinCoupling, LOW); _setCouplingMode(AC); merusak; case 1:if (lLastFreq> 0) lFreq =lLastFreq; digitalWrite(PinCoupling, HIGH); _setCouplingMode(DC); merusak; case 2:lLastFreq =lFreq; lFreq =0; digitalWrite(PinCoupling, LOW); _setCouplingMode(OFF); merusak; } DDS_FrequencySet(lFreq, Wave[_WaveType]); displayFrequency(lFreq); if (cMode !=pMode) saveConfig();}//---------------------------------------------------------------------------------------------------------------// Select options//---------------------------------------------------------------------------------------------------------------void selectOption(byte opt) { selectIcon(opt, BLACK); switch (opt) { case 0://workMode; displayWorkModeIcons(); selectIcon(_WorkMode, WHITE); mode =OPTMODE; merusak; case 1://waveType; displayWaveTypeIcons(); selectIcon(_WaveType, WHITE); mode =OPTWAVE; merusak; case 2://couplingMode; displayCouplingModeIcons(); selectIcon(_CouplingMode, WHITE); mode =OPTCOUP; merusak; }}//----------------------------------------------------------------------------------------------------------------// Calculate logarithmic steps of the frequency//----------------------------------------------------------------------------------------------------------------long AutoStep(long value, byte spin) { if (spin ==CW) { if (value>=100000) return 100000; if (value>=10000) return 10000; if (value>=1000) return 1000; if (value>=100) return 100; if (value>=10) return 10; if (value>=1) return 1; kembali 0; // Invalid value } else { if (value <=10) return 1; if (value <=100) return 10; if (value <=1000) return 100; if (value <=10000) return 1000; if (value <=100000) return 10000; if (value <=1000000) return 100000; kembali 0; // Invalid value }}//-------------------------------------------------------------------------------------------// Start Sweep or restart it from where it came from before the pause//-------------------------------------------------------------------------------------------void FrequencySweep() { do { if (sweepDnPausedVal ==0) { //if sweepDown has not been stopped if (sweepUpPausedVal> 0) { //and sweepUp has been stopped sweepUpPausedVal =SweepUp(sweepUpPausedVal); //continues from current value } else { sweepUpPausedVal =SweepUp(_SweepMin); //else start from min } } if (sweepStatus !=BREAK) { //if sweep has been stopped if (sweepDnPausedVal> 0) { //and sweepDn has been stopped sweepDnPausedVal =SweepDn(sweepDnPausedVal); //continues from current value } else { sweepDnPausedVal =SweepDn(_SweepMax); //else start from max } } } while (sweepStatus !=BREAK); //continues sweep until stopped}//-----------------------------------------------------------------------------------------// Sweep Up from sweepmin push encoder to pause//-----------------------------------------------------------------------------------------long SweepUp(long sweepmin) { long f; for (f =sweepmin; f <_SweepMax; f +=_SweepStep) { DDS_FrequencySet(f, Wave[_WaveType]); displayFrequency(f); if (encoderPush) { sweepStatus =BREAK; merusak; } } if (sweepStatus ==BREAK) return f; return 0;}//-----------------------------------------------------------------------------------------// Sweep down from sweepmax push encoder to pause//-----------------------------------------------------------------------------------------long SweepDn(long sweepmax) { long f; for (f =sweepmax; f> _SweepMin; f -=_SweepStep) { DDS_FrequencySet(f, Wave[_WaveType]); displayFrequency(f); if (encoderPush) { sweepStatus =BREAK; merusak; } } if (sweepStatus ==BREAK)return f; return 0;}//-----------------------------------------------------------------------------------------// Clear global sweep vars and restore display//-----------------------------------------------------------------------------------------void SweepReset(void) { sweepStatus =STILL; sweepUpPausedVal =0; sweepDnPausedVal =0; display.fillRect(4, 23, 23, 11, BLACK); //clear sweep text display.display();}//-----------------------------------------------------------------------------------------// Flash sweep pause icon//-----------------------------------------------------------------------------------------void flashIcon(int interval) { static long previousMillis; static boolean picShow; if (millis() - previousMillis>=interval) { previousMillis =millis(); picShow =!picShow; if (picShow) { display.drawBitmap(4, 23, imgSwPsd, 23, 11, WHITE); //drwaw sweep pause icon display.display(); } else { display.fillRect(4, 23, 23, 11, BLACK); //clear sweep pause icon display.display(); } }}//-----------------------------------------------------------------------------------------// Arduino software reset//-----------------------------------------------------------------------------------------void reset(void) { display.fillRect(1, 16, 125, 46, BLACK); tampilan.display(); displayText(30, 30, strFromFlash(4), WHITE, BLACK, BIG); char str[2]; for (byte i =3; i> 0; i--) { sprintf(str, "%d", i); displayText(95, 30, str, WHITE, BLACK, BIG);...This file has been truncated, please download it to see its full contents.
JXWG_Defs.hC/C++
Declarections section
// This file is an integral part of the JX_WaveGenerator.ino and must be// distributed together with the main file to allow it to function correctly.// The same license of the main file applies to this file.// Janux 01/04/2021 on Turin, Italy.#ifndef JXWG_Defs#define JXWG_Defs#include #include //Encoder library, see https://www.arduino.cc/reference/en/libraries/simplerotary/#include  // //adaptation of the library for SSD1306 to the SH1106 display, see https://github.com/wonho-maker/Adafruit_SH1106#include #define DEBUG 0#define OLED_RESET -1Adafruit_SH1106 display(OLED_RESET);#define PinA 5 //Encoder pin A#define PinB 4 //Encoder pin B #define PinS 3 //Encoder pin SwitchSimpleRotary Encoder(PinA, PinB, PinS);//list of loop mode#define LOGARITHMIC 0 //+workmode#define SINGLEDIGIT 1 //+workmode#define SWEEP 2 //+workmode#define OPTIONS 3 //-submode of LOGARITHMIC and SINGLEDIGIT#define OPTMODE 4 //-submode of OPTIONS#define OPTWAVE 5 //-submode of OPTIONS#define OPTCOUP 6 //-submode of OPTIONS#define OPTSWEEP 7 //-submode of SWEEP#define SWEEPEDIT 8 //-submode of OPTSWEEP#define DIGITCHANGE 9 //-submode of SINGLEDIGIT and SWEEPEDIT#define PinCoupling 7 //Coupling mode pin (relay pin)//constants #define XPOS 28#define YPOS 21#define DELTAX 12#define DELTAY 4#define SMALL 1#define BIG 2#define CW 1#define CCW 2#define PUSH 1#define LONGPUSH 1//Num Freq digit#define MAXDIGIT 6//Wave type#define SQUARE 0#define SINE 1#define TRIANGLE 2//Coupling mode#define AC 0#define DC 1#define OFF 2//Sweep status#define STILL 0#define BREAK 1#define PAUSE 2//Symbols chars#define CURSOR 0x5F#define ARROW 0x10//AD9833 module Pin connection#define DDS_FSY 9#define DDS_CLK 10#define DDS_DAT 11//AD9833 Wave Type const#define wSquare 0x28#define wSine 0x00#define wTriangle 0x02//-----------------------------------------------------------------------------// Variables declarections //-----------------------------------------------------------------------------//Strings constants placed in flash memory save ram spaceconst char str1[] PROGMEM ="JX WAVE GENERATOR"; // 18 byteconst char str2[] PROGMEM ="WELCOME"; // 8 byteconst char str3[] PROGMEM ="Hz"; // 3 byteconst char str4[] PROGMEM ="ERROR!"; // 7 byteconst char str5[] PROGMEM ="RESET"; // 6 byte //42 byte totalconst char* const string_table[] PROGMEM ={str1, str2, str3, str4, str5};char buffer[18]; //local buffer for string, make sure this is large enough for the largest string it must holdlong lFreq =1000; //main frequency variablelong lLastFreq =1000; //used to save the current freq value in some situationslong sweepUpPausedVal =0; //value of sweep when pusedlong sweepDnPausedVal =0; //value of sweep when pusedlong lSweep[3] ={20000, 0, 100}; //Sweep Hz default value MAX, MIN, STEP;byte sweepStatus =STILL; //current status of the sweep processconst byte Wave[] ={wSquare, wSine, wTriangle}; //array for WaveTypevolatile boolean encoderPush =false; //var used in the routine called by interruptchar Freq[MAXDIGIT + 1]; //array for display frequency in 6 digit template "000000"byte mode =0; //current loop modebyte idx =0; //pointer to digit index (0 to 5)byte idy =0; //same of idx in submodelong cTime =1; //screensaver counter//default startup preferencesbyte options[3] ={LOGARITHMIC, SINE, DC}; //mode, wavetype, couplingmode//define others macros#define _WorkMode options[0]#define _setWorkMode(x) options[0]=x#define _WaveType options[1]#define _setWaveType(x) options[1]=x#define _CouplingMode options[2]#define _setCouplingMode(x) options[2]=x#define _reservedbyte 0xFF#define _SweepMax lSweep[0]#define _SweepMin lSweep[1]#define _SweepStep lSweep[2]#define _Sweep(x) lSweep[x]#define _setSweep(x,f) lSweep[x]=f#define _setSweepMax(x) lSweep[0]=x#define _setSweepMin(x) lSweep[1]=x#define _setSweepStep(x) lSweep[2]=x//define short functions macros#define _clearIconsArea display.fillRect(XPOS - 11, YPOS + 18, 94, 24, BLACK)#define _displayErrMsg displayText(XPOS + 2, YPOS, strFromFlash(3), WHITE, BLACK, BIG);//define CONFIG consts &vars #define CONFIG_START 32 //EEPROM Memory start location#define CONFIG_VERSION "JXWG1" //Config version ID//define custom type structtypedef struct { char version[6]; byte workmode; byte wavetype; byte couplingmode; byte reservedbyte; long sweepmax; long sweepmin; long sweepstep;} config_type;//create new struct and load it with default valueconfig_type CONFIG ={ CONFIG_VERSION, _WorkMode, _WaveType, _CouplingMode, _reservedbyte, _SweepMax, _SweepMin, _SweepStep,};//define processor reset functionvoid(*ATmegaReset)(void) =0;#endif
JXWG_Graphics.hC/C++
Icon resource data file
// This file is an integral part of the JX_WaveGenerator.ino and must be// distributed together with the main file to allow it to function correctly.// The same license of the main file applies to this file.// Janux 01/04/2021 on Turin, Italy.#ifndef JXWG_Graphics#define JXWG_Graphics//----------------------------------------------------------------------------------------------// Plain b&w bitmaps PROGMEM icons data//----------------------------------------------------------------------------------------------const byte imgLog[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0x80, 0x88, 0x00, 0x40, 0x80, 0x9c, 0x00, 0x40, 0x80, 0x88, 0x00, 0x80, 0x80, 0x88, 0x00, 0x80, 0x80, 0x88, 0x01, 0x00, 0x80, 0x88, 0x02, 0x00, 0x80, 0x88, 0x0c, 0x00, 0x80, 0x88, 0x30, 0x00, 0x80, 0x89, 0xc0, 0x00, 0x80, 0x8e, 0x00, 0x10, 0x80, 0x9f, 0xff, 0xf8, 0x80, 0x88, 0x00, 0x10, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgDigit[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x9c, 0x47, 0x3e, 0x80, 0xa2, 0xc8, 0x82, 0x80, 0xa6, 0x40, 0x84, 0x80, 0xaa, 0x47, 0x0c, 0x80, 0xb2, 0x48, 0x02, 0x80, 0xa2, 0x48, 0x22, 0x80, 0x9c, 0xef, 0x9c, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x3e, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgSweep[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x8f, 0xcf, 0x38, 0x80, 0x88, 0x49, 0x28, 0x80, 0x88, 0x49, 0x28, 0x80, 0x88, 0x49, 0x28, 0x80, 0x88, 0x49, 0x28, 0x80, 0x88, 0x49, 0x28, 0x80, 0x88, 0x49, 0x28, 0x80, 0x88, 0x49, 0x28, 0x80, 0x88, 0x49, 0x28, 0x80, 0x88, 0x49, 0x28, 0x80, 0xb8, 0x79, 0xee, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgSqr[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x82, 0x08, 0x20, 0x80, 0x80, 0xff, 0x80, 0x80, 0x82, 0x88, 0xa0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x88, 0xa0, 0x80, 0x80, 0x80, 0x80, 0x80, 0xaa, 0xaa, 0xaa, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x88, 0xa0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x88, 0xa0, 0x80, 0xff, 0x80, 0xff, 0x80, 0x82, 0x08, 0x20, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgSin[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x82, 0x08, 0x20, 0x80, 0x80, 0x1c, 0x00, 0x80, 0x82, 0x2a, 0x20, 0x80, 0x80, 0x41, 0x00, 0x80, 0x82, 0x49, 0x20, 0x80, 0x80, 0x80, 0x80, 0x80, 0xaa, 0xaa, 0xaa, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc3, 0x08, 0x61, 0x80, 0xc1, 0x00, 0x41, 0x80, 0xa2, 0x08, 0x22, 0x80, 0x9c, 0x00, 0x1c, 0x80, 0x82, 0x08, 0x20, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgTri[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x82, 0x08, 0x20, 0x80, 0x82, 0x00, 0x20, 0x80, 0x87, 0x08, 0x70, 0x80, 0x85, 0x00, 0x50, 0x80, 0x8a, 0x88, 0xa8, 0x80, 0x88, 0x80, 0x88, 0x80, 0xba, 0xeb, 0xae, 0x80, 0x90, 0x41, 0x04, 0x80, 0xa2, 0x2a, 0x22, 0x80, 0xa0, 0x22, 0x02, 0x80, 0xc2, 0x1c, 0x21, 0x80, 0xc0, 0x14, 0x01, 0x80, 0x82, 0x08, 0x20, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgCoAc[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x9c, 0x70, 0x00, 0x80, 0xa2, 0x88, 0x00, 0x80, 0xa2, 0x80, 0xc0, 0x80, 0xa2, 0x81, 0x24, 0x80, 0xbe, 0x81, 0x24, 0x80, 0xa2, 0x88, 0x18, 0x80, 0xa2, 0x70, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgCoDc[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xbc, 0x70, 0x00, 0x80, 0xa2, 0x88, 0x00, 0x80, 0xa2, 0x81, 0x54, 0x80, 0xa2, 0x80, 0x00, 0x80, 0xa2, 0x81, 0xfc, 0x80, 0xa2, 0x88, 0x00, 0x80, 0xbc, 0x70, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgCoOff[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x9c, 0xf7, 0x80, 0x80, 0xa2, 0x84, 0x22, 0x80, 0xa2, 0x84, 0x14, 0x80, 0xa2, 0xe7, 0x08, 0x80, 0xa2, 0x84, 0x14, 0x80, 0xa2, 0x84, 0x22, 0x80, 0x9c, 0x84, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgSwMax[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x81, 0x00, 0x00, 0x80, 0x82, 0x00, 0x00, 0x80, 0x87, 0x01, 0x00, 0x80, 0x82, 0x03, 0x80, 0x80, 0x82, 0x07, 0xc0, 0x80, 0x82, 0x0f, 0xe0, 0x80, 0x82, 0x1f, 0xf0, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgSwMin[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x81, 0x00, 0x00, 0x80, 0x82, 0x00, 0x00, 0x80, 0x87, 0x1f, 0xf0, 0x80, 0x82, 0x0f, 0xe0, 0x80, 0x82, 0x07, 0xc0, 0x80, 0x82, 0x03, 0x80, 0x80, 0x82, 0x01, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgSwOpt[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x84, 0x08, 0x10, 0x80, 0x88, 0x1c, 0x38, 0x80, 0x9c, 0x3e, 0x10, 0x80, 0x88, 0x00, 0x00, 0x80, 0x88, 0x00, 0x00, 0x80, 0x88, 0x3e, 0x00, 0x80, 0x88, 0x1c, 0x38, 0x80, 0x88, 0x08, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgSwStep[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x84, 0x08, 0x04, 0x80, 0x88, 0x0c, 0x08, 0x80, 0x9c, 0x7e, 0x1c, 0x80, 0x88, 0x7f, 0x08, 0x80, 0x88, 0x7e, 0x08, 0x80, 0x88, 0x0c, 0x08, 0x80, 0x88, 0x08, 0x08, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgSwStart[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0xc0, 0x00, 0x80, 0x80, 0xf0, 0x00, 0x80, 0x80, 0xfc, 0x00, 0x80, 0x80, 0xff, 0x00, 0x80, 0x80, 0xff, 0xc0, 0x80, 0x80, 0xff, 0xc0, 0x80, 0x80, 0xff, 0x00, 0x80, 0x80, 0xfc, 0x00, 0x80, 0x80, 0xf0, 0x00, 0x80, 0x80, 0xc0, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgSwPause[] PROGMEM ={ 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x81, 0xe3, 0xc0, 0x80, 0x81, 0xe3, 0xc0, 0x80, 0x81, 0xe3, 0xc0, 0x80, 0x81, 0xe3, 0xc0, 0x80, 0x81, 0xe3, 0xc0, 0x80, 0x81, 0xe3, 0xc0, 0x80, 0x81, 0xe3, 0xc0, 0x80, 0x81, 0xe3, 0xc0, 0x80, 0x81, 0xe3, 0xc0, 0x80, 0x81, 0xe3, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80};const byte imgTurn[] PROGMEM ={ 0x0f, 0x80, 0x30, 0x60, 0x47, 0x10, 0x58, 0xd0, 0x90, 0x48, 0x80, 0xe8, 0x90, 0x48, 0xb8, 0x08, 0x90, 0x48, 0x58, 0xd0, 0x47, 0x10, 0x30, 0x60, 0x0f, 0x80};const byte imgSwRun[] PROGMEM ={ 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x9b, 0xa2, 0x22, 0x6b, 0xae, 0xec, 0x7b, 0xae, 0xec, 0x9a, 0xa6, 0x62, 0xea, 0xae, 0xee, 0x6a, 0xae, 0xee, 0x9c, 0x62, 0x2e, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00};const byte imgSwPsd[] PROGMEM ={ 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x1c, 0xdb, 0x30, 0x6b, 0x5a, 0xd6, 0x6b, 0x5a, 0xf6, 0x18, 0x5b, 0x32, 0x7b, 0x5b, 0xd6, 0x7b, 0x5a, 0xd6, 0x7b, 0x67, 0x30, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00};//Small icons ---------------------------------------------------------------------------------const byte imgSqrSmall[] PROGMEM ={ 0x00, 0x00, 0x3e, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0xe3, 0x80, 0x00, 0x00};const byte imgSinSmall[] PROGMEM ={ 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x84, 0x80, 0x84, 0x80, 0x03, 0x00, 0x00, 0x00};const byte imgTriSmall[] PROGMEM ={ 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x88, 0x80, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00};const byte imgAcSmall[] PROGMEM ={ 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x84, 0x80, 0x84, 0x80, 0x03, 0x00, 0x00, 0x00};const byte imgDcSmall[] PROGMEM ={ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00};const byte imgOffSmall[] PROGMEM ={ 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00};//Total program memory space used by icons data:1148 byte#endif

Skema

Display type updated

Proses manufaktur

  1. Mengambil Tetesan Air Dengan Arduino
  2. Arduino Spybot
  3. FlickMote
  4. TV Buatan Sendiri B-Gone
  5. Jam Master
  6. Temukan Saya
  7. Arduino Power
  8. Skateboard Realitas Virtual DIY
  9. Cara Menghubungkan Arduino Mega dengan Modul GPS NEO-6M
  10. Tech-TicTacToe