//http://playground.arduino.cc/Code/Keypad#define MAXmenu 4#define ledPin 13#define blPin 7//define cymbol pada tombol-tombol keypadschar keys[7][2] ={ {'L', 'P'}, //LED, POWER {'I', 'D'}, //INFO, DISPLAY {'1', '2 '}, //preset {'3', '4'}, //dari 1 {'5', '6'}, //ke 6 {'M', 'm'}, //M ODE, MEM {'<', '>'} //down, up};byte rowPins[7] ={11, 12, 10, 17, 9, 16, 8}; //sambungkan ke pinout baris dari colPins byte keypad[2] ={15, 14}; //sambungkan ke pinout kolom pada keypad//Keypad kpd =Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); Keypad keypad =Keypad( makeKeymap(keys), rowPins, colPins, 7, 2 ); boolean bass =0, dspl =0, memdisplay =0, mempress =0, adj =0;boolean ledPin_state, power_state;int menu;int volume, volumeOld =5;int frekuensi, frequencyOld;int txtl =0, temparray =0; int sample[5];unsigned int status[6];unsigned long timeprevious =0, timeprev =0;// EEPROM objectAT24CX mem;RTC_DS1307 rtc;//(clk, din, dc, ce, rst)LCD5110 lcd(6, 5, 4, 2, 3);// Buat instance radio RDA5807 chip radioRDA5807M;/// dapatkan parser RDSRDSParser rds;extern unsigned char SmallFont[];extern uint8_t signal5[];extern uint8_t signal4[];extern uint8_t signal3[];extern uint8_t signal2[];extern uint8_t signal1[];//--------------------------SETUP---- ------------------------------//pengaturan batal(){ analogReference(EKSTERNAL); Serial.begin(9600); Kawat.mulai(); // Inisialisasi Radio radio.init(); radio.debugEnable(); //inisialisasi Layar lcd.InitLCD(); lcd.clrScr(); //lcd.setContrast(45); //sesuaikan jika default tidak bagus lcd.setFont(SmallFont); lcd.enableSleep(); //mode siaga power_state =0; //jangan "menghidupkan" unit (mode siaga) saat catu daya terhubung //inisialisasi keypad keyboard.addStatedEventListener(keypadEvent); // Tambahkan event listener untuk keypad keypad ini.setHoldTime(1500); pinMode(ledPin, OUTPUT); // Menetapkan pin digital sebagai output. pinMode(blPin, OUTPUT); // Menetapkan pin digital sebagai output. digitalWrite(ledPin, RENDAH); // Matikan LED. digitalWrite(blPin, RENDAH); // Matikan BL (mode stand-by) ledPin_state =digitalRead(ledPin); // Simpan status LED awal. TINGGI saat LED menyala. //batalkan komentar jika rtc perlu disesuaikan /*if (! rtc.isrunning()) { Serial.println("RTC TIDAK berjalan!"); // baris berikut menetapkan RTC ke tanggal &waktu sketsa ini dikompilasi rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Baris ini menetapkan RTC dengan tanggal &waktu yang eksplisit, misalnya untuk menetapkan // 21 Januari 2014 pukul 3 pagi, Anda akan memanggil://rtc.adjust(DateTime(2018, 3, 13, 22, 33, 0) ); }*/ // membaca nilai frekuensi frekuensi terakhir =mem.readInt(201); volume =2; //tingkat volume pada menu mulai =1; //menampilkan mode VOLUMME di awal jika (volume <0) volume =0; jika (volume> 15) volume =15; jika (frekuensi <0) frekuensi =0; jika (frekuensi> 210) frekuensi =210; WriteReg(0x02, 0xC00d); // tulis 0xC00d ke Reg.2 ( soft reset, aktifkan,RDS, ) //bbz canal(frekuensi); // mengatur rantai informasi untuk data RDS. radio.attachReceiveRDS(RDS_process); rds.attachServicenNameCallback(NamaLayanan Tampilan); //rds.attachTimeCallback(Waktu Tampilan); // untuk penggunaan di masa mendatang. sangat tidak akurat ketika sinyal RDS lemah. rds.attachTextCallback(DisplayText);}//-------------akhir Setup-------------- -----------------------////------------------------ --LOOP----------------------------------------//void loop(){ if ( frekuensi !=frekuensiLama) { frekuensiLama =frekuensi; mem.writeInt(201, frekuensi); kanal (frekuensi); } if (volume !=volumeOld) { volumeOld =volume; WriteReg(5, 0x84D0 | volume); } //membaca tombol char keyboard =keypad.getKey(); //periksa radio data RDS.checkRDS(); // membaca pemeriksaan suhu setiap 0,6 detik sebanyak 5 kali dan menghitung rata-rata float rata-rata; unsigned long timenow =milis(); if ((unsigned long)(timenow - timeprevious)> 600) { timeprevious =timenow; sampel[temparray] =analogRead(A7); temporay++; } if (temparray ==5) { // menghitung rata-rata pembacaan rata-rata =0; for (int i =0; i <5; i++) { rata-rata +=sampel[i]; } printTemp(rata-rata); temporay =0; } // 4 detik timeout untuk tampilan MEM dan masukkan unsigned long dabar =millis(); if (mempress ==1) { timeprev =dabar; memdisplay =1; mempres =0; } if (memdisplay ==1) { if ((unsigned long)(dabar - timeprev) <4000) { memdisplay =1; } else { memdisplay =0; } } /*Instruksi penyesuaian waktu:1. Jalankan monitor serial 2. Atur 9600 boud 3. Tekan enter untuk mengaktifkan pembacaan serial 4. Tulis hXX, di mana XX adalah pembacaan jam saat ini pada beberapa server waktu dan tekan enter untuk menyesuaikan jam RTC. Serial monitor harus menulis "Jam XX" 5. Tulis mXX, di mana XX adalah menit saat ini yang dibaca di beberapa server waktu dan tekan enter untuk menyesuaikan menit RTC. Serial monitor harus menulis "Menit XX" 6. Tulis sXX, di mana XX adalah pembacaan detik saat ini pada beberapa server waktu dan tekan enter untuk menyesuaikan detik RTC. Monitor serial harus menulis "Detik XX" 7. Anda hanya dapat menyesuaikan jam. Yaitu. ketika waktu musim panas diubah. 8. Anda dapat menyesuaikan detik hanya jika Anda perlu mengoreksi waktu saja. 9. Jika RTC harus disesuaikan dari nol (tahun, bulan, hari, dll), hapus tanda komentar pada baris pernyataan penyesuaian RTC dan unggah sketsa. */ DateTime sekarang =rtc.now(); if (Serial.available()> 0) { char t =Serial.read(); switch (t) { case ('h'):{ unsigned int jam =Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), hours, now.minute(), now.second())); Serial.println(F("Jam")); Serial.println(jam); merusak; } case ('m'):{ unsigned int menit =Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), mins, now.second())); Serial.println(F("Menit")); Serial.println(mnt); merusak; } case ('s'):{ unsigned int sec =Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), sec)); Serial.println(F("Detik")); Serial.println(dtk); merusak; } } } //menampilkan berbagai informasi pada LCD printSignalStrength(); printLines(); printWaktu(); printFreq(); printStereo(); printMode(); printMenu(); tanggal cetak(); lcd.update();}//-------------Akhir Loop-------------- ----------------------//void printSignalStrength() //dari 0000 hingga 1111 (0-63){ unsigned int sig; status baca(); sig =status[1] / 1000; if ((sig>=0) &&(sig <=12)) { lcd.drawBitmap(1, 1, signal1, 17 , 6); } if ((sig>=13) &&(sig <=24)) { lcd.drawBitmap(1, 1, signal2, 17 , 6); } if ((sig>=25) &&(sig <=36)) { lcd.drawBitmap(1, 1, signal3, 17 , 6); } if ((sig>=37) &&(sig <=48)) { lcd.drawBitmap(1, 1, signal4, 17 , 6); } if (sig>=49) { lcd.drawBitmap(1, 1, signal5, 17 , 6); }}void printLines(){ lcd.drawLine(0, 9, 84, 9); lcd.drawLine(0, 39, 84, 39);}void printTemp(float average) //bisa dioptimalkan :){ average /=5; rata-rata =1023 / rata-rata - 1; rata-rata =51700 / rata-rata; mengapung steinhart; steinhart =rata-rata / 50000; // (R/Ro) steinhart =log(steinhart); // ln(R/Ro) steinhart /=3950; // 1/B * ln(R/Ro) steinhart +=1.0 / (25 + 273.15); // + (1/Ke) steinhart =1,0 / steinhart; // membalikkan steinhart -=273,15; // konversi celcius int tmp =bulat(steinhart); lcd.printNumI(tmp, 60, 1, 2); lcd.print(F("~C"), 72, 1;}/// Perbarui teks ServiceName pada layar LCD ketika dalam mode RDS.void DisplayServiceName(char *name){ lcd.print(name, 18, 22);}void DisplayText(char *text){ //scroll baris kedua RDS lcd.print(text, txtl, 30); txtl =txtl - 66; if (txtl ==-396) txtl =0;}void printTime(){ DateTime now =rtc.now(); lcd.printNumI(sekarang.jam(), 24, 1, 2, '0'); lcd.print(":", 36, 1); lcd.printNumI(now.minute(), 42, 1, 2, '0');}void printDate(){ if (dspl ==1) { //memeriksa apakah tombol tampilan ditekan ClearRDS(); DateTime sekarang =rtc.now(); lcd.printNumI(sekarang.tahun(), 12, 22, 4); lcd.print(".", 36, 22); lcd.printNumI(sekarang.bulan(), 42, 22, 2, '0'); lcd.print(".", 54, 22); lcd.printNumI(sekarang.hari(), 60, 22, 2, '0'); int dw =sekarang.dayOfTheWeek(); sakelar (dw) { kasus 0:lcd.print(F("Sekmadienis"), CENTER, 30); //minggu F() makro untuk menyimpan sdram break; kasus 1:lcd.print(F("Pirmadienis"), CENTER, 30); //senin dll... istirahat; kasus 2:lcd.print(F("Antradienis"), CENTER, 30); merusak; kasus 3:lcd.print(F("Treciadienis"), CENTER, 30); merusak; kasus 4:lcd.print(F("Ketvirtadienis"), CENTER, 30); merusak; kasus 5:lcd.print(F("Penktadienis"), CENTER, 30); merusak; kasus 6:lcd.print(F("Sestadienis"), CENTER, 30); merusak; } lcd.update(); penundaan (4000); //tidak optimal ClearRDS(); dspl =0; }}void printMode(){ lcd.print(F("MODE "), 0, 41);}void printMenu(){ if (menu ==1) { lcd.print(F("VOLUME "), 30, 41); if (volume <0) { lcd.print(F("XX"), 72, 41); } else lcd.printNumI(volume + 1, 72, 41, 2, '0'); } if (menu ==2) { lcd.print(F("AUTO-TUNE"), 30, 41); } if (menu ==3) { lcd.print(F("MAN.-TUNE"), 30, 41); } if (menu ==4) { lcd.print(F(" BASS "), 30, 41); if (bass ==0) { lcd.print(F("OFF"), 66, 41); } else lcd.print(F("ON"), 66, 41); }}void printFreq() //menampilkan frekuensi saat ini{ int frHundr, frDec; unsigned int fr; fr =870 + frekuensi; frHundr =fr / 10; frDec =fr % 10; lcd.printNumI(frHundr, 30, 12, 3); lcd.print(F("."), 48, 12); lcd.printNumI(frDec, 54, 12, 1); lcd.print(F("MHz"), 66, 12);}void printStereo(){ if (memdisplay ==1) { //jika tombol MEM ditekan lcd.print(F("MEM>"), 0 , 12); } //Deteksi stereo jika ((status[0] &0x0400) ==0) lcd.print(F("( )"), 0, 12); //berarti MONO else lcd.print (F("(ST)"), 0, 12); //berarti STEREO}pencarian kosong(byte direct) //pencarian otomatis{ byte i; //mencari ke atas atau ke bawah jika (!direc) WriteReg(0x02, 0xC30d); else WriteReg(0x02, 0xC10d); for (i =0; i <10; i++) { delay(200); status baca(); if (status[0] &0x4000) { frekuensi =status[0] &0x03ff; merusak; } }}kanal kosong( int kanal) //frekuensi langsung{ byte numberH, numberL; nomorH =kanal>> 2; numberL =((kanal &3) <<6 | 0x10); Wire.beginTransmission (0x11); Kawat.tulis (0x03); Wire.write(nomorH); // tulis frekuensi menjadi bit 15:6, setel bit tune Wire.write(numberL); Wire.endTransmission();}//RDA5807_adrs=0x10;// I2C-Address RDA Chip untuk Accessint Readstatus(){ Wire.requestFrom(0x10, 12); for (int i =0; i <6; i++) { status[i] =256 * Wire.read () + Wire.read(); } Wire.endTransmission();}//RDA5807_adrr=0x11;// I2C-Address RDA Chip untuk Accessvoid WriteReg(byte reg, unsigned int valor){ Wire.beginTransmission(0x11); Wire.write(reg); Wire.write(keberanian>> 8); Wire.write(keberanian &0xFF); Kawat.endTransmisi(); //delay(50);}void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) { rds.processData(block1, block2, block3, block4);}void ClearRDS(){ lcd.print(" ", 0, 22); lcd.print(" ", 0, 30);}// Merawat beberapa acara khusus.void keypadEvent(tombol KeypadEvent, KeyState kpadState ) { switch (kpadState) { /* Cara lain untuk mengatur waktu:1. Tekan dan tahan tombol D selama minimal 2 detik, saat Anda mendengar sinyal waktu berakhirnya jam, atau melihat detik terakhir jam pada beberapa jam yang akurat. 2. Lepaskan tombol D untuk mengatur jj.00.00. 3. Penyesuaian lagi, jika jam Anda terlambat dari 15 menjadi 1 menit, menit dan detik akan menjadi 00 dan jam akan bertambah 1. 4. Jika jam Anda terburu-buru dari 1 menjadi 15 menit, hanya menit dan detik yang akan menjadi 00 . */ case HOLD:if (key =='D' &&power_state ==1) { adj =1; } merusak; case RELEASED:if (key =='D' &&adj ==1) { DateTime now =rtc.now(); if (now.minute()>=45 &&now.minute() <=59) { rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour() + 1, 0, 0)); } if (now.minute()>=1 &&now.minute() <=15) { rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour( ), 0, 0)); } adj =0; } merusak; case DITEKAN:if (key =='M' &&power_state ==1) { memdisplay =0; menu++; if (menu> MAXmenu)menu =1; } if (kunci =='>' &&power_state ==1) { memdisplay =0; switch (menu) { case 1:if (volume <0) { if (bass ==0) { WriteReg(0x02, 0xD00D); volume =0; } if (bass ==1) { WriteReg(0x02, 0xC00D); volume =0; } } lain volume++; jika (volume> 15)volume =15; merusak; kasus 2:cari(0); HapusRDS(); merusak; kasus 3:frekuensi++; jika (frekuensi> 210)frekuensi =210; // batas frekuensi atas ClearRDS(); merusak; kasus 4:jika (bass ==0) { bass =1; WriteReg(0x02, 0xD00D); } merusak; } } if (kunci =='<' &&power_state ==1) { memdisplay =0; switch (menu) { kasus 1:volume--; if (volume <0) { WriteReg(0x02, 0x800D); //volume =0; } merusak; kasus 2:cari(1); HapusRDS(); merusak; kasus 3:frekuensi--; jika (frekuensi <0)frekuensi =0; HapusRDS(); merusak; kasus 4:jika (bass ==1) { bass =0; WriteReg(0x02, 0xC00D); } merusak; } } // Lampu LED hidup/mati if (key =='L' &&power_state ==1) { digitalWrite(ledPin, !digitalRead(ledPin)); ledPin_state =digitalRead(ledPin); // Ingat status LED, menyala atau tidak menyala. } // menyalakan atau mematikan "daya" (mode siaga) if (kunci =='P') { digitalWrite(blPin, !digitalRead(blPin)); power_state =digitalRead(blPin); if (power_state ==0) { lcd.enableSleep(); digitalWrite(ledPin, RENDAH); } else lcd.disableSleep(); volume =2; menu =1; } if (key =='1' &&power_state ==1) { switch (memdisplay) { case 0:frequency =mem.readInt(110); HapusRDS(); merusak; kasus 1:mem.writeInt(110, frekuensi); memdisplay =0; merusak; } } if (key =='2' &&power_state ==1) { switch (memdisplay) { case 0:frequency =mem.readInt(120); HapusRDS(); merusak; kasus 1:mem.writeInt(120, frekuensi); memdisplay =0; merusak; } } if (key =='3' &&power_state ==1) { switch (memdisplay) { case 0:frequency =mem.readInt(130); HapusRDS(); merusak; kasus 1:mem.writeInt(130, frekuensi); memdisplay =0; merusak; } } if (key =='4' &&power_state ==1) { switch (memdisplay) { case 0:frequency =mem.readInt(140); HapusRDS(); merusak; kasus 1:mem.writeInt(140, frekuensi); memdisplay =0; merusak; } } if (key =='5' &&power_state ==1) { switch (memdisplay) { case 0:frequency =mem.readInt(150); HapusRDS(); merusak; kasus 1:mem.writeInt(150, frekuensi); memdisplay =0; merusak; } } if (key =='6' &&power_state ==1) { switch (memdisplay) { case 0:frequency =mem.readInt(160); HapusRDS(); merusak; kasus 1:mem.writeInt(160, frekuensi); memdisplay =0; merusak; } } if (kunci =='m' &&power_state ==1) { mempress =1; } else { mempres =0; } if (key =='I' &&power_state ==1) { dspl =1; } merusak; }} Simbol kekuatan sinyalC/C++
#jika didefinisikan(__AVR__) #include #define imagedatatype const uint8_t#elif didefinisikan(__PIC32MX__) #define PROGMEM #define imagedatatype const unsigned char#elif didefinisikan(__arm__) #define PROGMEM #define PROGMEM # const unsigned char#endifimagedatatype signal5[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xFC, 0xC0, // 0x00FE (16) piksel , };imagedatatype signal4[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xFC, 0xC0, // 0x0010 (16) piksel0xC0, };imagedatatype signal3[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, // 0x0010 (16) piksel0xC0, };imagedatatype signal2[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, // 0x0010 (16) piksel0xC0, }; imagedatatype signal1[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, // 0x0010 (16) piksel0xC0, };
Skema