Proses manufaktur
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
|
|
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
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!
/* 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 &&idx0) 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.
// 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
// 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
Proses manufaktur
Dalam tutorial Arduino ini kita akan belajar bagaimana menggunakan modul komunikasi serial nirkabel HC-12 yang mampu melakukan komunikasi nirkabel jarak jauh antara beberapa papan Arduino, dengan jarak hingga 1,8km. Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini untuk
Dalam Tutorial Bluetooth Arduino ini kita akan belajar bagaimana menggunakan modul HC-05 untuk mengendalikan Arduino melalui komunikasi Bluetooth. Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini untuk lebih jelasnya. Ringkasan Untuk tutorial kali ini saya membuat dua
Dalam Tutorial Arduino ini kita akan mempelajari cara kerja Sensor PIR dan cara menggunakannya dengan Arduino Board untuk mendeteksi gerakan. Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini. Cara Kerja Pertama mari kita jelaskan prinsip kerjanya. Modul ini sebenarnya
Modul Joystick Apakah Anda saat ini menangani proyek yang berkaitan dengan gerak dan robotika? Kemudian, ada kemungkinan Anda pernah mendengar tentang modul Arduino Joystick, tetapi Anda tidak tahu cara membuatnya. Atau mungkin Anda ingin mendapatkan informasi lebih lanjut tentang cara kerja mod