Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Radio FM de cabina de ducha basada en Arduino

Componentes y suministros

Arduino Nano R3
× 1
Módulo de radio FM RDA Microelectronics RDA5807
× 1
Versión NXP NOKIA 5110 LCD 3V-5V
× 1
Pequeño módulo RTC (DS1307 + 24c32 EEPROM)
× 1
PAM8403 - Amplificador de clase D 2X3W
× 1
Módulo convertidor reductor DC-DC LM2596 de Texas Instruments
× 1
Batería recargable LIR2032 de 3,6 V
× 1
Resistencia de 100 ohmios
× 1
Resistencia 1k ohm
× 1
Resistencia de 10k ohmios
× 6
Resistencia 100k ohm
× 1
Infineon IRLZ44 power Mosfet
× 1
Altavoces PEIYING PY1010C 60W 4Ohm.
× 1
Se ha encontrado una fuente de alimentación de 12 V 3 A en un desecho.
× 1
Condensadores de 2200 uF 25V
× 2
Condensador 100 µF
× 1
Bombillas LED de 3 W para reemplazar las halógenas G4 de 10 W existentes
× 1

Acerca de este proyecto

Hace unos años, compré una cabina de ducha china que tenía instalado el sistema de control TR028 con radio. Desafortunadamente, un buen día encontré este sistema completamente muerto. Nadie pudo repararlo, así que compré otra radio de ducha más barata. Murió después de aproximadamente un año.

Mi familia solía tener una radio en la cabina de ducha, así que comencé a estudiar cómo se fabricaban estas radios. Dentro del sistema TR028 encontré un módulo TEA5767 extraño. Algunas búsquedas me permiten saber que se trata de un módulo de radio FM pequeño y económico. En los resultados de búsqueda encontré otro módulo de radio FM interesante:el RDA5807. Es muy similar al TEA5767, pero tiene RDS, control de volumen y funciones de refuerzo de graves. Entonces mi decisión fue usar RDA5807 en mi nuevo proyecto.

Busqué en Internet y encontré varios proyectos en los que se utilizó el módulo RDA5807:

  • Proyecto principal que inspiró mi visión.
  • Variación en la que encontré un gran signo de fuerza de señal e información más útil.
  • Otra variación.
  • Gran biblioteca de módulos de radio
  • Información útil (en ruso).
  • Uno más

Fue posible repetir uno de estos proyectos, pero nadie cumplió exactamente mi visión.

Mi visión fue:

  • El dispositivo con pantalla táctil para garantizar una construcción a prueba de agua. (Usé gabinete con panel táctil de TR0289 muerto).
  • Radio
  • Varias presintonías de estaciones de radio favoritas
  • Control de volumen
  • Función de búsqueda automática de emisoras de radio
  • Posibilidad de memorizar la emisora ​​de radio buscada
  • Un reloj para ver la hora actual.
  • Función de encendido / apagado
  • Control de luz
  • Se muestra información menor, como la temperatura dentro de una cabina, RDS.

En Aliexpress compré RDA5807, Tiny RTC con 32kb EEPROM, PAM8403, NOKIA 5110 LCD, módulos LM2596 por menos de 10 € y comencé a experimentar.

Lo que finalmente obtuve:

  • Radio FM con 2 filas (!) RDS
  • 6 presintonías para estaciones de radio favoritas
  • Sintonización automática o manual
  • Posibilidad de almacenar emisoras de radio favoritas en una de las 6 presintonías
  • Control de aumento de volumen y graves
  • Control de luces de la cabina de ducha
  • Un calendario de hormigas reloj
  • RSSI (indicador de intensidad de la señal de radio)
  • Indicador de modo estéreo
  • Función de encendido / apagado

Algunas fotos del proyecto

Para la pantalla NOKIA 5110 encontré una buena biblioteca

Entendido cómo funciona el panel táctil TR028. Actualmente es un teclado de 2 columnas X 7 filas. Para operarlo utilicé esta biblioteca.

Tablero ensamblado colocado en la caja. Puede notar que desolé la toma USB y soldé el cable directamente. Es para la posibilidad de conectar una PC y futuras mejoras de software.

Cómo funciona:

  • La radio no se enciende después de que se conecta la fuente de alimentación. Esto evita que se reproduzca la radio si la línea eléctrica no es estable o se perdió la energía. Para encender la radio por primera vez, debe conectar la fuente de alimentación y luego de unos segundos presionar la tecla de encendido. La radio reproducirá la última estación de radio reproducida con el volumen en el nivel 03. El modo de funcionamiento será el control de VOLUMEN. Para apagar la radio simplemente presione la tecla de encendido. El dispositivo apagará la pantalla LCD, la retroiluminación de la pantalla LCD, el amplificador y la lámpara LED / halógena.
  • Para buscar una estación de radio, puede elegir el modo de sintonización automática o manual presionando el botón "Mod". Al presionar los botones "<" o ">", la radio buscará una estación de radio disminuyendo o aumentando la frecuencia. Para almacenar una estación de radio encontrada, presione el botón "Mem" y tendrá 4 segundos para seleccionar una de las seis presintonías que desea almacenar.
  • Para ver la fecha actual, presione la tecla I (información). La fecha se mostrará 4 segundos. Esta parte del código se puede optimizar porque usa una función delay ().
  • Para ajustar el reloj, mantenga presionada la tecla D durante al menos 2 segundos cuando escuche las señales de finalización de una hora (señales de tiempo), o vea los últimos segundos de una hora en algún reloj preciso. Suelte la tecla D para configurar hh.00.00. Si su reloj se retrasó de 15 a 1 minutos, los minutos y segundos se ajustarán a 00 y las horas se incrementarán en 1 y si su reloj se apresuró de 1 a 15 minutos, solo los minutos y segundos se ajustarán a 00 después del procedimiento de ajuste. .

¿Qué cambiaría?

  • El resonador en el módulo RTC tiene una mejor precisión, pero la función de ajuste del reloj permite resolver este problema.
  • La pantalla LCD 5110 a una más grande y brillante. Puede ser una pantalla LCD a color de 1, 8 "o 2.0" porque a veces es difícil leer la información en la pantalla LCD NOKIA 5110 utilizada en el proyecto.
  • El amplificador PAM8403 a PAM8610 que tiene una potencia de salida de 2x15W o TDA7297 con las mismas características.

Conclusión:

Estoy feliz de cómo funciona mi nuevo proyecto. No se observaron problemas después de 1 mes de trabajo, excepto la precisión del reloj.

No soy programador, por lo que el código se puede optimizar mejor. Mi experiencia en programación C / C ++ es de aproximadamente un año, aprendida por mí mismo. Es mi primer proyecto útil usando la plataforma Arduino y el primer proyecto que estoy compartiendo en el centro. Por favor, comprenda y perdóneme por posibles errores y mi mal inglés.

Si tiene alguna pregunta, no dude en preguntar en comentarios o PM.

Actualización 1:actualizaciones menores de hardware y software.

Hardware:instaló un fusible de 2A en una línea de 12V. Solo por razones de seguridad.

Software:se agregó la línea 586 menú = 1; Esto restaura el modo a VOLUMEN después de presionar la tecla de encendido.

Actualización 2:

Desafortunadamente, la pantalla LCD de mi radio se va a apagar.

Así que estoy buscando una alternativa barata a la pantalla LCD NOKIA 5110. No instalaré una nueva pantalla LCD 5110 porque es pequeña y difícil de leer. Creo que experimentaré con LCD TFT de 1.8 ". Lo bueno es que es más grande, más brillante, tiene mejor resolución. Lo malo, estoy seguro de que el TFT de 1.8" consumirá más recursos que son críticos.

Sus consejos sobre reemplazos de LCD son bienvenidos.

Código

  • Bosquejo del proyecto
  • Símbolos de intensidad de la señal
Bosquejo del proyecto Arduino
 ///////////////////////////////////////////////// ////////////////////// Proyecto de radio FM de ducha basado en Arduino //// Arduino NANO, RDA5807M, RTC, EEPROM, LCD5110, Termistor //////// //////////////////////////////////////////////////// ///////// # include  //http://www.rinkydinkelectronics.com/library.php?id=48#include  // https:// github. com / cyberp / AT24Cx # include  // Arduino IDE incluido # include  //http://www.mathertel.de/Arduino/RadioLibrary.aspx#include  // http://www.mathertel.de/Arduino/RadioLibrary.aspx#include  //https://github.com/adafruit/RTClib#include  // http:// www. mathertel.de/Arduino/RadioLibrary.aspx#include  //http://playground.arduino.cc/Code/Keypad#define MAXmenu 4 # define ledPin 13 # define blPin 7 // define los símbolos en el botones del teclado teclas de char [7] [2] ={{'L', 'P'}, // LED, POWER {'I', 'D'}, // INFO, DISPLAY {'1', '2 '}, // presets {' 3 ',' 4 '}, // desde 1 {' 5 ',' 6 '}, // a 6 {' M ',' m '}, // M ODE, MEM {'<', '>'} // abajo, arriba}; byte rowPins [7] ={11, 12, 10, 17, 9, 16, 8}; // conectarse a los pines de fila del keypadbyte colPins [2] ={15, 14}; // conectar a los pines de columna del teclado // Teclado kpd =Teclado (makeKeymap (teclas), rowPins, colPins, ROWS, COLS); Teclado keypad =Keypad (makeKeymap (teclas), 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 Frequency, FrequencyOld; int txtl =0, temparray =0; int samples [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); // Crear una instancia de una radio RDA5807 chip radioRDA5807M; /// obtener un analizador RDS RDSParser rds; extern unsigned char SmallFont []; extern uint8_t signal5 []; extern uint8_t signal4 []; extern uint8_t señal3 []; extern uint8_t señal2 []; extern uint8_t señal1 []; // -------------------------- SETUP ---- ------------------------------ // configuración vacía () {analogReference (EXTERNAL); Serial.begin (9600); Wire.begin (); // Inicializar la Radio radio.init (); radio.debugEnable (); // inicializar la pantalla lcd.InitLCD (); lcd.clrScr (); //lcd.setContrast(45); // ajustar si el valor predeterminado no es bueno lcd.setFont (SmallFont); lcd.enableSleep (); // modo de espera power_state =0; // no "encienda" la unidad (modo de espera) cuando la fuente de alimentación esté conectada // inicialice el teclado keypad.addStatedEventListener (keypadEvent); // Agregue un detector de eventos para este teclado keypad.setHoldTime (1500); pinMode (ledPin, SALIDA); // Establece el pin digital como salida. pinMode (blPin, SALIDA); // Establece el pin digital como salida. digitalWrite (ledPin, BAJO); // Apaga el LED. digitalWrite (blPin, BAJO); // Apague el BL (modo de espera) ledPin_state =digitalRead (ledPin); // Almacenar el estado inicial del LED. ALTO cuando el LED está encendido. // descomente si es necesario ajustar rtc / * if (! rtc.isrunning ()) {Serial.println ("¡RTC NO se está ejecutando!"); // la siguiente línea establece el RTC en la fecha y hora en que se compiló este boceto rtc.adjust (DateTime (F (__ DATE__), F (__ TIME__))); // Esta línea establece el RTC con una fecha y hora explícitas, por ejemplo, para establecer // 21 de enero de 2014 a las 3 a. M., Llamaría://rtc.adjust(DateTime(2018, 3, 13, 22, 33, 0) ); } * / // valor leído de la última frecuencia frecuencia =mem.readInt (201); volumen =2; // nivel de volumen en el menú de inicio =1; // muestra el modo VOLUMME al inicio si (volumen <0) volumen =0; si (volumen> 15) volumen =15; si (frecuencia <0) frecuencia =0; si (frecuencia> 210) frecuencia =210; WriteReg (0x02, 0xC00d); // escribe 0xC00d en Reg.2 (soft reset, enable, RDS,) // bbz canal (frecuencia); // configura la cadena de información para datos RDS. radio.attachReceiveRDS (RDS_process); rds.attachServicenNameCallback (DisplayServiceName); //rds.attachTimeCallback(DisplayTime); //para uso futuro. muy inexacto cuando la señal RDS es débil. rds.attachTextCallback (DisplayText);} // ----------------------- fin de la instalación -------------- ---------------------- //// ------------------------ --LOOP ---------------------------------------- // bucle vacío () { if (frecuencia! =frecuencia antigua) {frecuencia antigua =frecuencia; mem.writeInt (201, frecuencia); canal (frecuencia); } if (volumen! =volumenOld) {volumenOld =volumen; WriteReg (5, 0x84D0 | volumen); } // lee el carácter del teclado key =keypad.getKey (); // buscar datos RDS radio.checkRDS (); // lee la sonda de temperatura cada 0,6 seg 5 veces y calcula el promedio de flotación promedio; unsigned long timenow =millis (); if ((unsigned long) (timenow - timeprevious)> 600) {timeprevious =timenow; muestras [temparray] =analogRead (A7); temparray ++; } if (temparray ==5) {// calculando el promedio de lecturas promedio =0; para (int i =0; i <5; i ++) {promedio + =muestras [i]; } printTemp (promedio); temparray =0; } // Tiempo de espera de 4 segundos para la visualización de MEM e ingrese unsigned long dabar =millis (); if (mempress ==1) {timeprev =dabar; memdisplay =1; mempress =0; } if (memdisplay ==1) {if ((unsigned long) (dabar - timeprev) <4000) {memdisplay =1; } más {memdisplay =0; }} / * Instrucciones de ajuste de tiempo:1. Ejecute el monitor en serie 2. Configure 9600 boud 3. Presione enter para activar la lectura en serie 4. Escriba hXX, donde XX es la lectura de la hora actual en algún servidor de tiempo y presione enter para ajustar las horas RTC. El monitor serial debe escribir "Hours XX" 5. Escriba mXX, donde XX es la lectura de minutos actual en algún servidor de tiempo y presione enter para ajustar los minutos RTC. El monitor serial debe escribir "Minutos XX" 6. Escriba sXX, donde XX es la lectura de segundos actuales en algún servidor de tiempo y presione enter para ajustar los segundos de RTC. El monitor de serie debe escribir "Segundos XX" 7. Puede ajustar solo las horas. Es decir. cuando se cambió el horario de verano. 8. Puede ajustar solo los segundos si solo necesita corregir la hora. 9. Si el RTC debe ajustarse desde cero (año, mes, día, etc.), elimine el comentario de las líneas de declaración de ajuste del RTC y cargue el croquis. * / DateTime ahora =rtc.now (); if (Serial.available ()> 0) {char t =Serial.read (); cambiar (t) {caso ('h'):{horas int sin firmar =Serial.parseInt (); rtc.adjust (DateTime (now.year (), now.month (), now.day (), hours, now.minute (), now.second ())); Serial.println (F ("Horas")); Serial.println (horas); descanso; } case ('m'):{unsigned int min =Serial.parseInt (); rtc.adjust (DateTime (ahora.año (), ahora.mes (), ahora.día (), ahora.hora (), minutos, ahora.segundo ())); Serial.println (F ("Minutos")); Serial.println (minutos); descanso; } caso ('s'):{unsigned int sec =Serial.parseInt (); rtc.adjust (DateTime (now.year (), now.month (), now.day (), now.hour (), now.minute (), sec)); Serial.println (F ("Segundos")); Serial.println (seg); descanso; }}} // muestra información diversa en la pantalla LCD printSignalStrength (); printLines (); printTime (); printFreq (); printStereo (); printMode (); printMenu (); fecha de impresion(); lcd.update ();} // ------------------------ Fin del ciclo -------------- ---------------------- // void printSignalStrength () // de 0000 a 1111 (0-63) {unsigned int sig; Readstatus (); sig =estado [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); } si (sig> =49) {lcd.drawBitmap (1, 1, señal5, 17, 6); }} vacío printLines () {lcd.drawLine (0, 9, 84, 9); lcd.drawLine (0, 39, 84, 39);} void printTemp (promedio flotante) // podría optimizarse:) {promedio / =5; promedio =1023 / promedio - 1; promedio =51700 / promedio; flotador steinhart; steinhart =promedio / 50000; // (R / Ro) steinhart =log (steinhart); // ln (R / Ro) steinhart / =3950; // 1 / B * ln (R / Ro) steinhart + =1.0 / (25 + 273.15); // + (1 / Para) steinhart =1.0 / steinhart; // invertir steinhart - =273.15; // conversión celsius int tmp =round (steinhart); lcd.printNumI (tmp, 60, 1, 2); lcd.print (F ("~ C"), 72, 1);} /// Actualice el texto ServiceName en la pantalla LCD cuando esté en modo RDS.void DisplayServiceName (char * name) {lcd.print (name, 18, 22);} void DisplayText (char * text) {// desplazarse por la segunda línea RDS lcd.print (text, txtl, 30); txtl =txtl - 66; if (txtl ==-396) txtl =0;} void printTime () {DateTime ahora =rtc.now (); lcd.printNumI (ahora.hora (), 24, 1, 2, '0'); lcd.print (":", 36, 1); lcd.printNumI (now.minute (), 42, 1, 2, '0');} void printDate () {if (dspl ==1) {// comprueba si se presionó la tecla de visualización ClearRDS (); DateTime ahora =rtc.now (); lcd.printNumI (ahora.año (), 12, 22, 4); lcd.print (".", 36, 22); lcd.printNumI (ahora.mes (), 42, 22, 2, '0'); lcd.print (".", 54, 22); lcd.printNumI (ahora.día (), 60, 22, 2, '0'); int dw =now.dayOfTheWeek (); interruptor (dw) {caso 0:lcd.print (F ("Sekmadienis"), CENTRO, 30); // macro domingo F () para guardar sdram break; caso 1:lcd.print (F ("Pirmadienis"), CENTRO, 30); // lunes, etc ... descanso; caso 2:lcd.print (F ("Antradienis"), CENTER, 30); descanso; caso 3:lcd.print (F ("Treciadienis"), CENTER, 30); descanso; caso 4:lcd.print (F ("Ketvirtadienis"), CENTER, 30); descanso; caso 5:lcd.print (F ("Penktadienis"), CENTRO, 30); descanso; caso 6:lcd.print (F ("Sestadienis"), CENTER, 30); descanso; } lcd.update (); retraso (4000); // no es óptimo ClearRDS (); dspl =0; }} void printMode () {lcd.print (F ("MODE"), 0, 41);} void printMenu () {if (menu ==1) {lcd.print (F ("VOLUME"), 30, 41); if (volumen <0) {lcd.print (F ("XX"), 72, 41); } else lcd.printNumI (volumen + 1, 72, 41, 2, '0'); } if (menú ==2) {lcd.print (F ("AUTO-TUNE"), 30, 41); } if (menú ==3) {lcd.print (F ("MAN.-TUNE"), 30, 41); } if (menú ==4) {lcd.print (F ("BASS"), 30, 41); if (bajo ==0) {lcd.print (F ("APAGADO"), 66, 41); } else lcd.print (F ("ENCENDIDO"), 66, 41); }} void printFreq () // muestra la frecuencia actual {int frHundr, frDec; unsigned int fr; fr =870 + frecuencia; frHundr =fr / 10; frDec =fr% 10; lcd.printNumI (frHundr, 30, 12, 3); impresión en lcd (F ("."), 48, 12); lcd.printNumI (frDec, 54, 12, 1); lcd.print (F ("MHz"), 66, 12);} void printStereo () {if (memdisplay ==1) {// si se presionó la tecla MEM lcd.print (F ("MEM>"), 0 , 12); } // Detección estéreo else if ((status [0] &0x0400) ==0) lcd.print (F ("()"), 0, 12); // significa MONO else lcd.print (F ("(ST)"), 0, 12); // significa ESTEREO} búsqueda vacía (byte direc) // búsqueda automática {byte i; // busca hacia arriba o hacia abajo if (! direc) WriteReg (0x02, 0xC30d); más WriteReg (0x02, 0xC10d); para (i =0; i <10; i ++) {retraso (200); Readstatus (); if (estado [0] &0x4000) {frecuencia =estado [0] &0x03ff; descanso; }}} void canal (int canal) // frecuencia directa {byte númeroH, númeroL; númeroH =canal>> 2; númeroL =((canal &3) <<6 | 0x10); Wire.beginTransmission (0x11); Wire.write (0x03); Wire.write (númeroH); // escribe la frecuencia en bits 15:6, establece el bit de ajuste Wire.write (numberL); Wire.endTransmission ();} // RDA5807_adrs =0x10; // Chip RDA de dirección I2C para acceso secuencial Readstatus () {Wire.requestFrom (0x10, 12); for (int i =0; i <6; i ++) {status [i] =256 * Wire.read () + Wire.read (); } Wire.endTransmission ();} // RDA5807_adrr =0x11; // Chip RDA de dirección I2C para Accessvoid WriteReg aleatorio (byte reg, unsigned int valor) {Wire.beginTransmission (0x11); Wire.write (reg); Wire.write (valor>> 8); Wire.write (valor &0xFF); Wire.endTransmission (); // 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);} // Cuidando algunos eventos especiales.void keypadEvent (KeypadEvent key, KeyState kpadState) {switch (kpadState) {/ * Otra forma de ajustar la hora:1. Mantén presionada la tecla D durante al menos 2 segundos, cuando escuche las señales de finalización de la hora o vea los segundos de la última hora en algún reloj preciso. 2. Suelte la tecla D para ajustar hh.00.00. 3. Más allá del ajuste, si su reloj se retrasó de 15 a 1 minuto, los minutos y segundos serán 00 y las horas se incrementarán en 1. 4. Si su reloj se apresuró de 1 a 15 minutos, solo los minutos y segundos serán 00 . * / case HOLD:if (key =='D' &&power_state ==1) {adj =1; } descanso; caso LIBERADO:if (key =='D' &&adj ==1) {DateTime now =rtc.now (); if (ahora.minuto ()> =45 &&ahora.minuto () <=59) {rtc.adjust (DateTime (ahora.year (), ahora.mes (), ahora.día (), ahora.hora () + 1, 0, 0)); } if (ahora.minuto ()> =1 &&ahora.minuto () <=15) {rtc.adjust (DateTime (now.year (), now.month (), now.day (), now.hour ( ), 0, 0)); } adj =0; } descanso; caso PRESIONADO:if (key =='M' &&power_state ==1) {memdisplay =0; menu ++; si (menú> MAXmenú) menú =1; } if (clave =='>' &&power_state ==1) {memdisplay =0; cambiar (menú) {caso 1:if (volumen <0) {if (bajo ==0) {WriteReg (0x02, 0xD00D); volumen =0; } if (bajo ==1) {WriteReg (0x02, 0xC00D); volumen =0; }} más volumen ++; si (volumen> 15) volumen =15; descanso; caso 2:búsqueda (0); ClearRDS (); descanso; caso 3:frecuencia ++; si (frecuencia> 210) frecuencia =210; // límite de frecuencia superior ClearRDS (); descanso; caso 4:if (bajo ==0) {bajo =1; WriteReg (0x02, 0xD00D); } descanso; }} if (key =='<' &&power_state ==1) {memdisplay =0; cambiar (menú) {caso 1:volumen--; si (volumen <0) {WriteReg (0x02, 0x800D); // volumen =0; } descanso; caso 2:búsqueda (1); ClearRDS (); descanso; caso 3:frecuencia--; si (frecuencia <0) frecuencia =0; ClearRDS (); descanso; caso 4:if (bajo ==1) {bajo =0; WriteReg (0x02, 0xC00D); } descanso; }} // LED se enciende / apaga if (key =='L' &&power_state ==1) {digitalWrite (ledPin,! DigitalRead (ledPin)); ledPin_state =digitalRead (ledPin); // Recuerda el estado del LED, encendido o apagado. } // enciende o apaga el "encendido" (modo de espera) if (key =='P') {digitalWrite (blPin,! digitalRead (blPin)); power_state =digitalRead (blPin); if (power_state ==0) {lcd.enableSleep (); digitalWrite (ledPin, BAJO); } else lcd.disableSleep (); volumen =2; menú =1; } if (key =='1' &&power_state ==1) {switch (memdisplay) {caso 0:frecuencia =mem.readInt (110); ClearRDS (); descanso; caso 1:mem.writeInt (110, frecuencia); memdisplay =0; descanso; }} if (key =='2' &&power_state ==1) {switch (memdisplay) {caso 0:frecuencia =mem.readInt (120); ClearRDS (); descanso; caso 1:mem.writeInt (120, frecuencia); memdisplay =0; descanso; }} if (key =='3' &&power_state ==1) {switch (memdisplay) {caso 0:frecuencia =mem.readInt (130); ClearRDS (); descanso; caso 1:mem.writeInt (130, frecuencia); memdisplay =0; descanso; }} if (key =='4' &&power_state ==1) {switch (memdisplay) {caso 0:frecuencia =mem.readInt (140); ClearRDS (); descanso; caso 1:mem.writeInt (140, frecuencia); memdisplay =0; descanso; }} if (key =='5' &&power_state ==1) {switch (memdisplay) {caso 0:frecuencia =mem.readInt (150); ClearRDS (); descanso; caso 1:mem.writeInt (150, frecuencia); memdisplay =0; descanso; }} if (key =='6' &&power_state ==1) {switch (memdisplay) {caso 0:frecuencia =mem.readInt (160); ClearRDS (); descanso; caso 1:mem.writeInt (160, frecuencia); memdisplay =0; descanso; }} if (clave =='m' &&power_state ==1) {mempress =1; } más {mempress =0; } if (key =='I' &&power_state ==1) {dspl =1; } descanso; }} 
Símbolos de intensidad de señal C / C ++
 #if definido (__ AVR__) #include  #define imagedatatype const uint8_t # elif definido (__ PIC32MX__) #define PROGMEM #define imagedatatype const unsigned char # elif definido (__ arm__) #defineGdefine PROGMEM const unsigned char # endifimagedatatype señal5 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0x, 0xFE, // píxeles ,}; imagedatatype signal4 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xFC, 0x0xC0, // }; imagedatatype signal3 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xC0, 0x0xC0, //); señal de tipo de datos de imagen2 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0xC0, //) imagedatatype signal1 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, // 0x0010 (16) píxeles0xC0,}; 

Esquemas


Proceso de manufactura

  1. Radio
  2. Circuito integrado
  3. Generador de ondas JX
  4. MotionSense
  5. PuzzleBox
  6. Regulador de ducha
  7. Escáner de temperatura por infrarrojos inalámbrico
  8. Tanque de WalaBeer
  9. Laboratorio de microcontroladores
  10. MOSMusic
  11. Pulsera inteligente