Arduino di dalam mobil. Membunyikan dasbor

Perangkat berbicara dirancang untuk mereka yang tidak memperhatikan bola lampu di dasbor, dan secara berkala menangkap diri dengan fakta bahwa mereka bepergian dengan rem tangan atau balok tinggi. Atau bahwa panah speedometer diam-diam merangkak ke depan ... Ya, saya melakukannya sendiri.

Itu diuji pada (ground on) Daewoo Nexia N150, tetapi harus bekerja pada mesin apa saja dengan speedometer elektronik (sensor kecepatan - 6 pulsa per meter, semacam standar). Foto agak berlumpur (amatir):

gambar

gambar

Fungsi:
1. Berbicara dalam suara (5 level volume) tentang berbagai acara (acara dijelaskan di bawah ini)

a) pria
b) perempuan

Suara-suara disintesis di komputer, direkam sebagai satu set file mp3 pada kartu micro SD. Ini berarti Anda dapat menukar atau membakarnya.

2. Pengaturan dibuat dengan remote control dari TV (atau yang lainnya dengan jumlah tombol yang cukup, saya sangat merekomendasikan remote control dengan tombol 0-9). Pengaturan diingat pada saat perubahan.

3. Jika terjadi kegagalan / kehilangan kendali jarak jauh, detektor dapat segera dialihkan ke mode "tidak ada suara" atau "tidak ada suara selain rem tangan". Untuk ini, inklusi tiga dimensi digunakan (idenya adalah menggunakan dimensi kedip sebagai sinyal kontrol untuk mengkonfigurasi penghapusan dari beberapa perangkat penyesuaian kecerahan DRL).

Peristiwa bersuara (dibisukan)
- Rem tangan (jika lampu rem parkir menyala saat mengemudi)
- Sinar tinggi menyala (flashing sinar tinggi diabaikan, memperingatkan sekali setelah dihidupkan, maka tidak mengingatkan sampai balok tinggi diaktifkan)
- Nyalakan lampu yang menyala (jika gerakan dimulai tanpa dimensi dihidupkan, DRL saya dan yang dekat tidak berfungsi jika dimensi tidak dihidupkan).
- Jaringan on-board tegangan (akurasi hingga sepersepuluh volt)
- Melebihi ambang batas kecepatan 40, 50, ... 120, 130 km / jam.
- Menurunkan ambang batas kecepatan 40, 50, ... 120, 130 km / jam.
- Ubah volume, alihkan suara, matikan / pada masing-masing peristiwa bersuara (menyalakan voltmeter menyebabkan suara berbunyi pada saat yang sama).

Video dengan demontrasi:



Koneksi ke mobil
1. Ke speedometer - tiga kabel sekaligus: bumi, +12 (dari sini kami membawa daya ke perangkat dan data untuk voltmeter), sinyal dari sensor kecepatan.

2. Untuk lampu - rem parkir, balok utama, pencahayaan instrumen (dimensi).

Koordinasi level dilakukan cukup sederhana - kesimpulan arduins ditarik oleh resistor internal ke "1", dan sinyal level 12V dari dashboard melewati dioda. Ketika panel masuk +12, dioda ditutup - pada arduino "log.1". Ketika sinyal dari panel bekerja - dioda terbuka, resistor pull-up internal diabaikan, pada output dari arduino "log.0".

Voltmeter hanyalah pembagi resistif terhadap input analog. Rasio ini sekitar 1:13, dari perhitungan bahwa dengan tegangan maksimum jaringan terpasang 16V (mode darurat), ADC akan mencapai batasnya dengan sinyal referensi 1,2V.

Komposisi perangkat
1. Arduino nano v3

Tautan ke Ali

2. Modul MP3 - DFplayer mini

Tautan ke Ali

Modul ini di sirkuit internet terhubung menggunakan sinyal tx / rx, saya menambahkan analisis sinyal sibuk untuk menangkap saat suara berakhir sehingga peringatan baru tidak mengganggu yang sekarang, tetapi masuk ke antrian.

3. amplifier PAM8403 (opsional)

Tautan ke Ali

4. Papan pengembangan, 5 resistor (2 pada ADC voltmeter, dan 3 pada pin DFplayer), 4 dioda (cocok dengan + 12V), serta sepasang kapasitor dan chip stabilizer +5V catu daya seperti LM7805 (Saya memiliki konverter DC / DC AMSR 7805, karena berada dalam cadangan dan tidak memanas), piezo buzzer (mencicit ketika antrian file MP3 penuh, lebih untuk pemecahan masalah), konektor untuk menghubungkan sensor IR (jack 2.5 dalam kasus saya, tetapi ini tidak berprinsip) dan speaker ( Saya mengambil RCA), baik, dan konektor untuk dashboard (saya mengambil IDC10, dengan kait pada ayah saya - cukup ringan dan multi-pin)

Firmware:
Dari teks firmware Anda dapat dengan mudah melihat di mana semua sinyal yang dianalisis berada, di mana Anda harus menulis kode remote control IR Anda (Anda bisa mendapatkannya menggunakan sketsa demo IRRecvDump). Juga, saat-saat respons dari sulih suara kecepatan dengan jelas dijabarkan oleh konstanta (perhatikan bahwa kecepatan disuarakan agak lebih awal daripada yang sebenarnya dicapai - agar punya waktu untuk melambat, tidak melebihi).

#include <Wire.h> //#include <LiquidCrystal_I2C.h> #include <IRremote.h> #include <EEPROM.h> #include <SoftwareSerial.h> #include <DFPlayer_Mini_Mp3.h> int RECV_PIN = 6; //  IR  IRrecv irrecv(RECV_PIN); decode_results results; byte cfg[16] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; byte mp3stek[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; byte mp3stekpos = 0; volatile byte busy = 1; //mp3 busy 0=play volatile byte softbusy = 0; volatile byte nomer_mp3 = 1; volatile unsigned long micros_sp = 0; volatile byte sz = 0; //  volatile unsigned int sp = 0; // volatile unsigned int sp20 = 0; //*10 volatile boolean st = false; // volatile byte ruka = 1; // volatile byte dsvet = 0; //. volatile byte gaba = 0; // volatile byte lastspeed = 0; //  volatile byte lastdsvet = 0; //   . volatile byte lastgaba = 0; //   DHO volatile byte lastgabaonoff = 0; //     volatile word gabaonofftimer = 0; //      volatile byte gabaonoffcounter = 0; //      volatile byte speed40 = 38; // 40 volatile byte speed60 = 58; // 60 volatile byte speed80 = 78; // 80 volatile byte speed110 = 108; // 110 volatile byte unspeed40 = 36; // no 40 volatile byte unspeed60 = 56; // no 60 volatile byte unspeed80 = 76; // no 80 volatile byte unspeed110 = 106; // no 110 volatile byte speed50 = 48; // 50 volatile byte unspeed50 = 46; // no 50 volatile byte speed70 = 68; // 70 volatile byte unspeed70 = 66; // no 70 volatile byte speed90 = 88; // 90 volatile byte unspeed90 = 86; // no 90 volatile byte speed100 = 98; // 100 volatile byte unspeed100 = 96; // no 100 volatile byte speed120 = 118; // 120 volatile byte unspeed120 = 116; // no 120 volatile byte speed130 = 128; // 130 volatile byte unspeed130 = 126; // no 130 volatile byte s40 = 0; volatile byte s50 = 0; volatile byte s60 = 0; volatile byte s70 = 0; volatile byte s80 = 0; volatile byte s90 = 0; volatile byte s100 = 0; volatile byte s110 = 0; volatile byte s120 = 0; volatile byte s130 = 0; //LiquidCrystal_I2C lcd(0x3F, 16, 2); float sensorValue = 0; //V float outputValue = 0; //V void setup() { Serial.begin(9600); Serial.println("start programm NEXIA 1.0"); //start IR reciver irrecv.enableIRIn(); // Start the receiver // initialize the LCD //lcd.begin(); // Turn on the blacklight and print a message. //lcd.backlight(); // lcd.print("Hello, world!"); //tone (17,3000); //    D3 pinMode(2, INPUT); //      speed digitalWrite(2, HIGH);//   pinMode(3, INPUT); //      digitalWrite(3, HIGH);//   pinMode(4, INPUT); //      digitalWrite(4, HIGH);//   pinMode(5, INPUT); //      digitalWrite(5, HIGH);//   // pinMode(13, OUTPUT); // lastgabaonoff = digitalRead(5); //gaba attachInterrupt(0,speedometr, RISING); cfg[0]=EEPROM.read(5); //0=all sound 1=no sound(ruka) 2=no sound all cfg[1]=EEPROM.read(6); //volume mp3 0..30 cfg[2]=EEPROM.read(7); //0 = dsvet sound? 1 = no dsvet sound cfg[3]=EEPROM.read(8); //0 = 40sound cfg[4]=EEPROM.read(9); //0 = 60sound cfg[5]=EEPROM.read(10);//0 = 80sound cfg[6]=EEPROM.read(11);//0 = 110 sound cfg[7]=EEPROM.read(12);//0 = Voltmetr sound cfg[8]=EEPROM.read(13);//0 = DHO sound cfg[9]=EEPROM.read(14);//0 = 50sound cfg[10]=EEPROM.read(15);//0 = 70sound cfg[11]=EEPROM.read(16);//0 = 90sound cfg[12]=EEPROM.read(17);//0 = 100sound cfg[13]=EEPROM.read(18);//0 = 120sound cfg[14]=EEPROM.read(19);//0 = 130sound cfg[15]=EEPROM.read(20);//0 = 0, 1=1 // 3 pinMode(7, INPUT); //busy mp3_set_serial (Serial); // mp3_set_volume (25); mp3setvol(); delay (100); add_mp3(32); //   //  analogReference (INTERNAL); // voltmeter(); if (cfg[7]==0){voltmetertest();} //  } void loop() { //   dsvet = digitalRead(3); //    : // if (dsvet==1) { lcd.setCursor(3, 0); lcd.print("DD ");} // else{lcd.setCursor(3, 0); lcd.print("_s ");}; ruka = digitalRead(4); //    : // if (ruka==1) { lcd.setCursor(0, 0); lcd.print("_r ");} // else{lcd.setCursor(0, 0); lcd.print("RR ");}; gaba = digitalRead(5); //    : // if (gaba==1) { lcd.setCursor(6, 0); lcd.print("GG");} // else{lcd.setCursor(6, 0); lcd.print("_g");}; //voltmetertest(); //  // digitalWrite(13, !digitalRead(2)); //  // lcd.setCursor(10, 0); // lcd.print(" "); // lcd.setCursor(10, 0); // lcd.print(sp); // lcd.setCursor(0, 1); // lcd.print(" "); // lcd.setCursor(0, 1); // lcd.print(sp20); if (sz != 0){sz--;}else{sp20=0;sp=0;}; delay(50); // sdisplay(); // gabamute(); //      if ((sp20>0)&(ruka==0)) {rukabeep();}//  else { // .        if (dsvet==1) { if ( lastdsvet<200){lastdsvet=lastdsvet+1;};} if (dsvet==1) { if ((lastdsvet>35)&(lastdsvet<38)){svetbeep();}; } if (dsvet==0) {lastdsvet=0;}; //  .  //   if ((gaba==0)&&(sp20>0)) { if ( lastgaba<150){lastgaba=lastgaba+1;};} if ((gaba==0)&&(sp20>0)) { if ((lastgaba>20)&(lastgaba<23)){DHO_beep();}; } if (gaba==1) {lastgaba=0;}; if (sp20==0) {lastgaba=0;}; //    40, 60, 80, 110 if ((lastspeed<speed40)&(sp>=speed40)) { if (s40<1) { svet1beep(); s40=1; }}; if ((lastspeed>=unspeed40)&(sp<unspeed40)) { if (s40>0) { nsvet1beep(); s40=0; }}; if ((lastspeed<speed50)&(sp>=speed50)) { if (s50<1) { svet50beep(); s50=1; }}; if ((lastspeed>=unspeed50)&(sp<unspeed50)) { if (s50>0) { nsvet50beep(); s50=0; }}; if ((lastspeed<speed60)&(sp>=speed60)) { if (s60<1) { svet2beep(); s60=1; }}; if ((lastspeed>=unspeed60)&(sp<unspeed60)) { if (s60>0) { nsvet2beep(); s60=0; }}; if ((lastspeed<speed70)&(sp>=speed70)) { if (s70<1) { svet70beep(); s70=1; }}; if ((lastspeed>=unspeed70)&(sp<unspeed70)) { if (s70>0) { nsvet70beep(); s70=0; }}; //.   66/    " 70" - .     . if ((lastspeed<speed80)&(sp>=speed80)) { if (s80<1) { svet3beep(); s80=1; }}; if ((lastspeed>=unspeed80)&(sp<unspeed80)) { if (s80>0) { nsvet3beep(); s80=0; }}; if ((lastspeed<speed90)&(sp>=speed90)) { if (s90<1) { svet90beep(); s90=1; }}; if ((lastspeed>=unspeed90)&(sp<unspeed90)) { if (s90>0) { nsvet90beep(); s90=0; }}; if ((lastspeed<speed100)&(sp>=speed100)) { if (s100<1) { svet100beep(); s100=1; }}; if ((lastspeed>=unspeed100)&(sp<unspeed100)) { if (s100>0) { nsvet100beep(); s100=0; }}; if ((lastspeed<speed110)&(sp>=speed110)) { if (s110<1) { svet4beep(); s110=1; }}; if ((lastspeed>=unspeed110)&(sp<unspeed110)) { if (s110>0) { nsvet4beep(); s110=0; }}; if ((lastspeed<speed120)&(sp>=speed120)) { if (s120<1) { svet120beep(); s120=1; }}; if ((lastspeed>=unspeed120)&(sp<unspeed120)) { if (s120>0) { nsvet120beep(); s120=0; }}; if ((lastspeed<speed130)&(sp>=speed130)) { if (s130<1) { svet130beep(); s130=1; }}; if ((lastspeed>=unspeed130)&(sp<unspeed130)) { if (s130>0) { nsvet130beep(); s130=0; }}; lastspeed=sp; delay(50); //    }//     // voltmeter(); //  3 if (mp3stekpos != 0) { busy = digitalRead(7); //    7: if (softbusy > 0) softbusy = softbusy-1;// , .. busy    if ((busy>0) && (softbusy ==0)) //   3 {mp3stekpos = mp3stekpos-1; nomer_mp3 = mp3stek[1]; if (cfg[15]==0) {mp3_play (mp3stek[1]);} else {mp3_play (mp3stek[1]+100);} //  softbusy = 25; delay(50); for (int i=1; i < 9; i++){mp3stek[i]=mp3stek[i+1]; } mp3stek[9]= 0; };} //   /**/ if (irrecv.decode(&results)) { Serial.println(results.value); // lcd.setCursor(6, 1); // lcd.print(results.value); //  //       0-2 if ((results.value==2255209021)|| (results.value==2255218711)) { cfg[0]=cfg[0]+1; if (cfg[0]>2) { cfg[0]=0; }; EEPROM.write(5,cfg[0]); if (cfg[0]==0) {add_mp3(5);}; //sound on if (cfg[0]==1) {add_mp3(3);}; //sound off krome ruka if (cfg[0]==2) {add_mp3(4);}; }//sound off all // V+ -   3 if ((results.value==2255188111)||(results.value==2155866645)) { cfg[1]=cfg[1]+1; if (cfg[1]>4) {cfg[1]=4;add_mp3(41);} if (cfg[1]==1) {add_mp3(38);} if (cfg[1]==2) {add_mp3(39);} if (cfg[1]==3) {add_mp3(40);} if (cfg[1]==4) {add_mp3(41);} mp3setvol(); EEPROM.write(6,cfg[1]); } // V- -   3 if ((results.value==2255210551)||(results.value==2155809015)) { if (cfg[1]<1) {add_mp3(37); } else {cfg[1]=cfg[1]-1;} if (cfg[1]==1) {add_mp3(38);} if (cfg[1]==2) {add_mp3(39);} if (cfg[1]==3) {add_mp3(40);} mp3setvol(); EEPROM.write(6,cfg[1]); } if (results.value==2255192191) // sourse -    +100 { if (cfg[15]==0){ cfg[15]=1;} else { cfg[15]=0;} add_mp3(42); EEPROM.write(20,cfg[15]); } if (results.value==2255222791) //  -  . { if (cfg[2]==0) { cfg[2]=1; add_mp3(18);} //no dsvet else { cfg[2]=0; add_mp3(19); }//dsvet on EEPROM.write(7,cfg[2]); } if (results.value==2255220751) // 4 -   40 { if (cfg[3]==0) { cfg[3]=1; add_mp3(36); }//40 off else { cfg[3]=0; add_mp3(35); }//40 on EEPROM.write(8,cfg[3]); } if (results.value==2255200351) // 5 -   50 { if (cfg[9]==0) { cfg[9]=1; add_mp3(65); } //50 off else { cfg[9]=0; add_mp3(66); }//50 on EEPROM.write(14,cfg[9]); } if (results.value==2255184031) // 6 -   60 { if (cfg[4]==0) { cfg[4]=1; add_mp3(12); }//60 off else { cfg[4]=0; add_mp3(13); }//60 on EEPROM.write(9,cfg[4]); } if (results.value==2255171791) // 7 -   70 { if (cfg[10]==0) {cfg[10]=1; add_mp3(45);} //70 off else { cfg[10]=0; add_mp3(46); }//70 on EEPROM.write(15,cfg[10]); } if (results.value==2255204431) // 8 -   80 { if (cfg[5]==0) { cfg[5]=1; add_mp3(14); }//80 off else { cfg[5]=0; add_mp3(15); }//80 on EEPROM.write(10,cfg[5]); } if (results.value==2255179951) // 9 -   90 { if (cfg[11]==0) {cfg[11]=1; add_mp3(49);} //90 off else { cfg[11]=0; add_mp3(50);} //90 on EEPROM.write(16,cfg[11]); } if (results.value==2255194231) // 0 -   100 { if (cfg[12]==0) {cfg[12]=1; add_mp3(53);} //100 off else { cfg[12]=0; add_mp3(54);} //100 on EEPROM.write(17,cfg[12]); } if (results.value==2255167711) // 1 -   110 { if (cfg[6]==0) { cfg[6]=1; add_mp3(16);} //110 off else { cfg[6]=0; add_mp3(17);} //110 on EEPROM.write(11,cfg[6]); } if (results.value==2255163631) // 2 -   120 { if (cfg[13]==0) { cfg[13]=1; add_mp3(57);} //120 off else { cfg[13]=0; add_mp3(58);} //120 on EEPROM.write(18,cfg[13]); } if (results.value==2255175871) // 3 -   130 { if (cfg[14]==0) { cfg[14]=1; add_mp3(61);} //130 off else { cfg[14]=0; add_mp3(62);} //130 on EEPROM.write(19,cfg[14]); } if ((results.value==2255206471)||(results.value==2155829925)) // ? -   { if (cfg[7]==0) { cfg[7]=1; add_mp3(27);} //no  else { cfg[7]=0; add_mp3(28); voltmetertest(); }// on EEPROM.write(12,cfg[7]); } if (results.value==2255190151) //  -  DHO { if (cfg[8]==0) { cfg[8]=1; add_mp3(31);} //no DHO else { cfg[8]=0; add_mp3(30);} //DHO on EEPROM.write(13,cfg[8]); } irrecv.resume(); // Receive the next value } } //      void sdisplay(){ if (ruka==1) { Serial.print("ruka=off ");} else{ Serial.print("RUKA=ON ");}; if (dsvet==1) { Serial.print("dsvet=off ");} else{ Serial.print("DSVET=ON ");}; if (gaba==1) { Serial.print("gaba=off ");} else{ Serial.print("GABA=ON ");}; Serial.println(" "); Serial.print(" speed="); Serial.println(sp); Serial.println("++++++++++++++++++ END ++++++"); } void speedometr(){ if (!st){micros_sp = micros();} else {sp20 = (12000000/(micros() - micros_sp));} sp=sp20/20; st = !st; sz=10;} void rukabeep() { if (cfg[2]!=2) {mp3_play (1);} delay(1000);} void svetbeep() { if ((cfg[2]==0)&&(cfg[0]==0)) {add_mp3(2);}} void DHO_beep() { if ((cfg[8]==0)&&(cfg[0]==0)) {add_mp3(29);}} void svet1beep() { if ((cfg[3]==0)&&(cfg[0]==0)) {add_mp3(33);}} //40 void nsvet1beep() { if ((cfg[3]==0)&&(cfg[0]==0)) {add_mp3(34);}} //n40 void svet50beep() { if ((cfg[9]==0)&&(cfg[0]==0)) {add_mp3(63);}} //50 void nsvet50beep() { if ((cfg[9]==0)&&(cfg[0]==0)) {add_mp3(64);}} //n50 void svet2beep() { if ((cfg[4]==0)&&(cfg[0]==0)) {add_mp3(6);}} //60 void nsvet2beep() { if ((cfg[4]==0)&&(cfg[0]==0)) {add_mp3(7);}} //n60 void svet70beep() { if ((cfg[10]==0)&&(cfg[0]==0)) {add_mp3(43);}} //70 void nsvet70beep() { if ((cfg[10]==0)&&(cfg[0]==0)) {add_mp3(44);}} //n70 void svet3beep() { if ((cfg[5]==0)&&(cfg[0]==0)) {add_mp3(8);}} //80 void nsvet3beep() { if ((cfg[5]==0)&&(cfg[0]==0)) {add_mp3(9);}} //n80 void svet90beep() { if ((cfg[11]==0)&&(cfg[0]==0)) {add_mp3(47);}} //90 void nsvet90beep() { if ((cfg[11]==0)&&(cfg[0]==0)) {add_mp3(48);}} //n90 void svet100beep() { if ((cfg[12]==0)&&(cfg[0]==0)) {add_mp3(51);}} //100 void nsvet100beep(){ if ((cfg[12]==0)&&(cfg[0]==0)) {add_mp3(52);}} //n100 void svet4beep() { if ((cfg[6]==0)&&(cfg[0]==0)) {add_mp3(10);}} //110 void nsvet4beep() { if ((cfg[6]==0)&&(cfg[0]==0)) {add_mp3(11);}} //n110 void svet120beep() { if ((cfg[13]==0)&&(cfg[0]==0)) {add_mp3(55);}} //120 void nsvet120beep(){ if ((cfg[13]==0)&&(cfg[0]==0)) {add_mp3(56);}} //n120 void svet130beep() { if ((cfg[14]==0)&&(cfg[0]==0)) {add_mp3(59);}} //130 void nsvet130beep(){ if ((cfg[14]==0)&&(cfg[0]==0)) {add_mp3(60);}} //n130 //void svet1unbeep(){ tone (17,1000); delay(200); noTone(17);} void add_mp3(byte nomermp3) { if ((mp3stekpos > 8)&&(cfg[0]<2))//     { if (cfg[0]==0) { tone (17,1000); delay(200); tone (17,1400); delay(200); noTone(17); }}//       else { mp3stekpos = mp3stekpos+1; mp3stek[mp3stekpos] = nomermp3; }} //    void mp3setvol() //    0-4  0-30 {if(cfg[1]==0){mp3_set_volume(10);}if(cfg[1]==1){mp3_set_volume(15);}if(cfg[1]==2){mp3_set_volume(20);}if(cfg[1]==3){mp3_set_volume(25);}if(cfg[1]>3){mp3_set_volume(30);}} void voltmetertest() { outputValue = 0; int u_x10 =0 ; int u_x1 =0 ; int u_x0 =0 ; for (int iii=0; iii <10 ; iii++) { outputValue =outputValue + float(analogRead(A0)); delay(100); }//   outputValue = outputValue/620;//     u_x10=round(outputValue*10); // 10 u_x1=floor(u_x10/10); //   add_mp3(70+u_x1); u_x0=u_x10-(10*u_x1); // = 10U-10U add_mp3(90+u_x0); } void gabamute() { if (lastgabaonoff==gaba) {//   gabaonofftimer=gabaonofftimer+1; if (gabaonofftimer>250 ) {//    -   gabaonofftimer=250; gabaonoffcounter=0; } } else {//  lastgabaonoff=gaba; if (gabaonoffcounter==0) {gabaonofftimer=0;} //  // Serial.println(gabaonofftimer); if (gabaonofftimer<25) {//   gabaonoffcounter=gabaonoffcounter+1; gabaonofftimer=0; if (gabaonoffcounter>5) {// -    gabaonoffcounter=0; cfg[0]=cfg[0]+1; if (cfg[0]>2) { cfg[0]=0; }; EEPROM.write(5,cfg[0]); if (cfg[0]==0) {add_mp3(5);}; //sound on if (cfg[0]==1) {add_mp3(3);}; //sound off krome ruka if (cfg[0]==2) {add_mp3(4);}; //sound off all } } else { gabaonoffcounter=0; gabaonofftimer=0; } }} 


Firmware papan opsi
Untuk debugging, debugging dan demonstrasi, arduino lain digunakan - arduino uno dan modul dan tombol LCD-display.

Dia tahu bagaimana memberikan sinyal - dimensi, sinar utama, rem tangan, dan mengubah kecepatan dari 0 hingga 150 kira-kira. Dari kekurangan - tidak ada penindasan terhadap bouncing kontak, tetapi saat ini tidak benar-benar mengganggu saya.

 #include <Wire.h> //    #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); const int rukaPin = 2; //  =  const int dsvetPin = 1; //  = . const int speedPin = 0; //  =   const int gabaPin = 11; // 6 =  int rukaState = 0; //    int dsvetState = 0; //    int speedState = 0; //    int gabaState = 0; //    int speedkm = 0; // / int lowdelay = 250; //     //   int button; const int BUTTON_NONE = 0; const int BUTTON_RIGHT = 1; const int BUTTON_UP = 2; const int BUTTON_DOWN = 3; const int BUTTON_LEFT = 4; const int BUTTON_SELECT = 5; int getPressedButton() { int buttonValue = analogRead(0); //     (A0) if (buttonValue < 60) { return BUTTON_RIGHT; } else if (buttonValue < 200) { return BUTTON_UP; } else if (buttonValue < 400){ return BUTTON_DOWN; } else if (buttonValue < 600){ return BUTTON_LEFT; } else if (buttonValue < 800){ return BUTTON_SELECT; } return BUTTON_NONE; } void setup() { pinMode(rukaPin, OUTPUT); //     pinMode(dsvetPin, OUTPUT); //     pinMode(speedPin, OUTPUT); //     pinMode(gabaPin, OUTPUT); //     lcd.begin(16, 2); lcd.print("starting..."); delay (500); lcd.clear(); lcd.setCursor(12, 0); if(gabaState == 1){lcd.print("G_ON");}else{lcd.print("GOFF");} digitalWrite(gabaPin,gabaState); lcd.setCursor(6, 0); if(dsvetState == 1){lcd.print("D__ON");}else{lcd.print("D_OFF");} digitalWrite(dsvetPin,dsvetState); lcd.setCursor(0, 0); if(rukaState == 0){lcd.print("R__ON");}else{lcd.print("R_OFF");} digitalWrite(rukaPin,rukaState); } void loop() { delay(50); if ((speedState<=36)&(speedState>0)) { lowdelay=500/speedState; digitalWrite(speedPin,1); delay(lowdelay); digitalWrite(speedPin,0); delay(lowdelay); lcd.setCursor(12, 1); lcd.print(lowdelay); lcd.print(" "); } button = getPressedButton(); switch (button) { case BUTTON_RIGHT: //       lcd.setCursor(12, 0); if (gabaState == 0) { gabaState = 1; lcd.print("G_ON "); } else { gabaState = 0; lcd.print("GOFF "); } digitalWrite(gabaPin,gabaState); break; case BUTTON_LEFT: lcd.setCursor(6, 0); if (dsvetState == 0) { dsvetState = 1; lcd.print("D__ON "); } else { dsvetState = 0; lcd.print("D_OFF "); } digitalWrite(dsvetPin,dsvetState); break; case BUTTON_UP: if (speedState<5){speedState=speedState+1;} else {if (speedState<250){speedState=speedState+5;};} lcd.setCursor(0, 1); lcd.print(speedState); speedkm=speedState*0.6; lcd.print(" "); lcd.print(speedkm); lcd.print("km/h "); if (speedState>35){ tone(speedPin,speedState);} else { noTone(speedPin); }; break; case BUTTON_DOWN: if ((speedState<10)&(speedState>0)){speedState=speedState-1;} else { if ((speedState<255)&(speedState>0)){speedState=speedState-5;} } ; lcd.setCursor(0, 1); lcd.print(speedState); speedkm=speedState*0.6; lcd.print(" "); lcd.print(speedkm); lcd.print("km/h "); // if (speedState==0){noTone(speedPin);} else {tone(speedPin,speedState);}; if (speedState>35){ tone(speedPin,speedState);} else { noTone(speedPin); }; break; case BUTTON_SELECT: // lcd.setCursor(0, 0); // lcd.print(" "); lcd.setCursor(0, 0); if (rukaState == 0) { rukaState = 1; lcd.print("R_OFF "); } else { rukaState = 0; lcd.print("R__ON "); } digitalWrite(rukaPin,rukaState); break; } } 

Source: https://habr.com/ru/post/id401671/


All Articles