Arduino en el auto. Hacer sonar el tablero

El dispositivo de conversación está diseñado para aquellos que no notan las bombillas en el tablero de instrumentos, y periódicamente se atrapa con el hecho de que viajan con un freno de mano o una luz de carretera. O que la flecha del velocímetro se arrastró silenciosamente hacia adelante mucho ... Sí, lo hice por mí mismo.

Fue probado (en tierra) en el Daewoo Nexia N150, pero debería funcionar en cualquier máquina con un velocímetro electrónico (sensor de velocidad - 6 pulsos por metro, algo así como un estándar). Las fotos son un poco turbias (aficionadas):

imagen

imagen

Funcionalidad
1. Habla en voz (5 niveles de volumen) sobre varios eventos (los eventos se describen a continuación)

a) masculino
b) hembra

Las voces se sintetizan en una computadora, se graban como un conjunto de archivos mp3 en una tarjeta micro SD. Esto significa que puede intercambiarlos o quemarlos.

2. Los ajustes se realizan con el control remoto desde el televisor (o cualquier otro con una cantidad suficiente de botones, le recomiendo el control remoto con los botones 0-9). La configuración se recuerda en el momento del cambio.

3. En caso de falla / pérdida del control remoto, el detector puede cambiarse rápidamente a los modos "sin sonido" o "sin sonido, excepto el freno de mano". Para esto, se utiliza la inclusión triple de dimensiones (la idea es usar dimensiones parpadeantes como señal de control para configurar el borrado de algún dispositivo de ajuste de brillo DRL).

Eventos sonados (silenciados)
- Freno de mano (si la luz del freno de estacionamiento está encendida mientras conduce)
- La luz de carretera está encendida (se ignora la luz de carretera parpadeante, advierte una vez después de encenderla, luego no se recuerda hasta que se enciende la luz de carretera)
- Encienda las luces de marcha (si el movimiento se inicia sin las dimensiones activadas, mi DRL y el cercano no funcionan si las dimensiones no están activadas).
- Red de voltaje a bordo (precisión de la décima de voltio)
- Exceder el umbral de velocidad de 40, 50, ... 120, 130 km / h.
- Bajar el umbral de velocidad de 40, 50, ... 120, 130 km / h.
- Cambie el volumen, cambie la voz, apague / encienda cada uno de los eventos sonoros (encender el voltímetro hace que la voz suene al mismo tiempo).

Video con demostración:



Conexión a un carro
1. Al velocímetro: tres cables a la vez: tierra, +12 (desde aquí tomamos energía del dispositivo y los datos del voltímetro), una señal del sensor de velocidad.

2. A las bombillas: freno de estacionamiento, luz de carretera, iluminación del instrumento (dimensiones).

La coordinación de los niveles se realiza de manera bastante simple: las resistencias de los arduins son llevadas por la resistencia interna a "1", y las señales de nivel de 12V del tablero pasan a través de los diodos. Cuando el panel pasa a +12, el diodo está cerrado, en el arduino "log.1". Cuando la señal del panel se pone a tierra: el diodo está abierto, la resistencia de pull-up interna se ignora, a la salida del arduino "log.0".

Un voltímetro es simplemente un divisor resistivo a una entrada analógica. La relación es aproximadamente 1:13, a partir del cálculo de que a un voltaje máximo de la red a bordo de 16V (modo de emergencia), el ADC alcanzará su límite con una señal de referencia de 1.2V.

La composición del dispositivo
1. Arduino nano v3

Enlace a Ali

2. Módulo MP3 - DFplayer mini

Enlace a Ali

Este módulo en los circuitos de Internet está conectado mediante señales tx / rx. Agregué un análisis de señal de ocupado para detectar el momento en que termina el sonido para que una nueva alerta no interrumpa la actual, sino que entre en la cola.

3. Amplificador PAM8403 (opcional)

Enlace a Ali

4. Placa de desarrollo, 5 resistencias (2 en el ADC del voltímetro y 3 en los pines del reproductor DF), 4 diodos (que coinciden con + 12V), así como un par de condensadores y un microcircuito estabilizador de fuente de alimentación + 5V tipo LM7805 (tengo un convertidor DC / DC AMSR 7805, porque estaba en la reserva y no se calentó), zumbador piezoeléctrico (chirría cuando la cola del archivo MP3 está llena, más para la resolución de problemas), conectores para conectar un sensor IR (conector 2.5 en mi caso, pero esto no tiene principios) y altavoz ( Tomé RCA), bueno, y un conector para el tablero de instrumentos (tomé IDC10, con pestillos en mi papá, bastante liviano y de varios pines)

Firmware:
Desde el texto del firmware, puede ver fácilmente dónde se encuentran todas las señales analizadas, dónde escribir los códigos de su control remoto IR (puede obtenerlas utilizando el boceto de demostración IRRecvDump). Además, los momentos de respuesta de la voz en off de las velocidades están claramente explicados por las constantes (tenga en cuenta que las velocidades se expresan un poco antes de lo que realmente se logran, para tener tiempo de disminuir, sin exceder).

#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; } }} 


Opción de firmware de placa
Para la depuración, depuración y demostración, se utilizó otro arduino: arduino uno y un módulo de pantalla LCD y botones.

Ella sabe cómo emitir señales: dimensiones, haz principal, freno de mano y cambiar la velocidad de 0 a 150 aproximadamente. De las deficiencias: no hay supresión del rebote de contactos, pero este momento realmente no me molesta.

 #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/es401671/


All Articles