Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Rádio FM com cabine de banho baseada em Arduino

Componentes e suprimentos

Arduino Nano R3
× 1
Módulo de rádio FM RDA Microelectronics RDA5807
× 1
NXP NOKIA 5110 LCD versão 3V-5V
× 1
Módulo Tiny RTC (DS1307 + 24c32 EEPROM)
× 1
PAM8403 - amplificador 2X3W classe D
× 1
Módulo conversor redutor Texas Instruments LM2596 DC-DC
× 1
Bateria recarregável LIR2032 3,6 V
× 1
Resistor 100 ohm
× 1
Resistor 1k ohm
× 1
Resistor 10k ohm
× 6
Resistor 100k ohm
× 1
Infineon IRLZ44 power Mosfet
× 1
Alto-falantes PEIYING PY1010C 60W 4Ohm.
× 1
Fonte de alimentação 12V 3A encontrada no refugo.
× 1
Capacitores de 2200 uF 25 V
× 2
Capacitor 100 µF
× 1
Lâmpadas LED de 3W para substituir os halogênios G4 de 10W existentes
× 1

Sobre este projeto


Há alguns anos comprei uma cabina de duche chinesa que tinha instalado o sistema de comando TR028 com rádio. Infelizmente, um belo dia, encontrei este sistema completamente morto. Ninguém poderia consertá-lo, então comprei outro rádio de banho mais barato. Ele morreu depois de cerca de um ano.

Minha família tinha um rádio no box do chuveiro, então comecei a estudar como esses rádios eram feitos. Dentro do sistema TR028 encontrei um módulo TEA5767 estranho. Algumas pesquisas me mostram que é um pequeno módulo de rádio FM barato. Nos resultados da pesquisa encontrei outro módulo de rádio FM interessante - RDA5807. É muito semelhante ao TEA5767, mas tem recursos de RDS, controle de volume e reforço de graves. Portanto, minha decisão foi usar o RDA5807 em meu novo projeto.

Pesquisei na Internet e encontrei vários projetos onde o módulo RDA5807 foi usado:
  • Projeto principal que inspirou minha visão.
  • Variação em que encontrei um ótimo sinal de força e informações mais úteis.
  • Outra variação.
  • Ótima biblioteca de módulos de rádio
  • Informações úteis (em russo).
  • Mais um

Foi possível repetir um desses projetos, mas ninguém atendeu exatamente a minha visão.





Minha visão era:

  • O dispositivo com tela de toque para garantir uma construção à prova d'água. (Usei gabinete com painel de toque do TR0289 morto).
  • Rádio
  • Várias predefinições de estações de rádio favoritas
  • Controle de volume
  • Recurso de busca automática de estação de rádio
  • Possibilidade de memorizar a estação de rádio procurada
  • Um relógio para ver a hora atual.
  • Recurso liga / desliga
  • Controle de luz
  • Algumas informações secundárias são exibidas como temperatura dentro de uma cabine, RDS.

No Aliexpress comprei módulos RDA5807, Tiny RTC com EEPROM de 32kb, PAM8403, NOKIA 5110 LCD, LM2596 por menos de 10 € e iniciei experiências.





O que finalmente consegui:

  • Rádio FM com 2 linhas (!) RDS
  • 6 predefinições para estações de rádio favoritas
  • Ajuste automático ou manual
  • Possibilidade de armazenar estação de rádio favorita em uma das 6 predefinições
  • Controle de aumento de volume e graves
  • Controle das luzes da cabine de banho
  • Um calendário de formigas de relógio
  • RSSI (indicador de intensidade do sinal de rádio)
  • Indicador de modo estéreo
  • Recurso liga / desliga





Algumas fotos do projeto


Para o display NOKIA 5110 eu encontrei uma boa biblioteca

Entendi como funciona o painel de toque TR028. Na verdade, é um teclado de 2 colunas X 7 linhas. Para operá-lo usei esta biblioteca.





Placa montada colocada na caixa. Você pode notar que desoldei o soquete USB e soldei o cabo diretamente. É para a possibilidade de conectar um PC e futuras melhorias de software.










Como funciona:

  • O rádio não liga depois que a fonte de alimentação é conectada. Isso evita que o rádio toque se a linha de alimentação não estiver estável ou se houver perda de energia. Para ligar o rádio pela primeira vez, você deve conectar a fonte de alimentação e depois de alguns segundos pressionar a tecla liga / desliga. O rádio tocará a última estação de rádio reproduzida com o volume no nível 03. O modo de operação será o controle de VOLUME. Para desligar o rádio, basta pressionar o botão liga / desliga. O dispositivo desligará o LCD, a luz de fundo do LCD, o amplificador e a lâmpada LED / halógena.
  • Para buscar uma estação de rádio, você pode escolher o modo de sintonia automática ou manual pressionando o botão "Mod". Ao pressionar os botões "<" ou ">", o rádio irá pesquisar uma estação de rádio diminuindo ou aumentando a frequência. Para armazenar uma estação de rádio encontrada, pressione o botão "Mem" e você terá 4 segundos para selecionar uma das seis predefinições que deseja armazenar.
  • Para ver a data atual, pressione a tecla I (informações). A data será exibida em 4 segundos. Esta parte do código pode ser otimizada porque usa uma função delay ().
  • Para ajustar o relógio, pressione e segure a tecla D por pelo menos 2 segundos ao ouvir os sinais de término de uma hora (sinais de hora) ou ver os últimos segundos de uma hora em algum relógio preciso. Solte a tecla D para definir hh.00.00. Se o seu relógio atrasou 15 a 1 minutos, os minutos e segundos serão ajustados para 00 e as horas serão aumentadas em 1 e se o seu relógio estava com pressa de 1 a 15 minutos, apenas os minutos e segundos serão ajustados para 00 após o procedimento de ajuste .





O que eu mudaria:

  • O ressonador no módulo RTC tem melhor precisão, mas o recurso de ajuste do relógio permite resolver este problema.
  • O 5110 LCD para um maior e mais brilhante. Pode ser algum LCD colorido de 1, 8 "ou 2,0" porque às vezes é difícil ler as informações no LCD NOKIA 5110 usado no projeto.
  • O amplificador PAM8403 para PAM8610 que tem potência de saída 2x15W ou TDA7297 com as mesmas características.





Conclusão:


Estou feliz como meu novo projeto funciona. Nenhum problema foi observado após 1 mês de trabalho, exceto a precisão do relógio.

Não sou um programador, então o código pode ser melhor otimizado. Minha experiência em programação C / C ++ é de cerca de um ano, autodidata. É meu primeiro projeto útil usando a plataforma Arduino e o primeiro projeto que estou compartilhando no hub. Por favor, entenda e me perdoe por possíveis erros e meu péssimo inglês.

Se você tiver alguma dúvida, não hesite em perguntar nos comentários ou PM.

Atualização 1:Pequenas atualizações de hardware e software.

Hardware - instalado um fusível 2A na linha 12V. Apenas por razões de segurança.

Software - adicionada a linha 586 menu = 1; Isso restaura o modo para VOLUME após pressionar a tecla liga / desliga.

Atualização 2:

Infelizmente, o LCD do meu rádio vai morrer.



Estou em busca de uma alternativa barata para o LCD NOKIA 5110. Não vou instalar um novo 5110 LCD porque é pequeno e difícil de ler. Acho que vou experimentar o LCD TFT de 1,8 ". As coisas boas - é maior, mais brilhante, tem melhor resolução. As coisas ruins - tenho certeza que o TFT de 1,8" consumirá mais recursos que são essenciais.

Seus conselhos sobre substitutos de LCD são bem-vindos.

Código

  • esboço do projeto
  • Símbolos de força do sinal
Esboço do projeto Arduino
 /////////////////////////////////////////////////// ////////////////////// Projeto de rádio FM do chuveiro baseado em 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 incluído # 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 os símbolos no botões das teclas do teclado numérico [7] [2] ={{'L', 'P'}, // LED, POWER {'I', 'D'}, // INFO, DISPLAY {'1', '2 '}, // presets {' 3 ',' 4 '}, // de 1 {' 5 ',' 6 '}, // a 6 {' M ',' m '}, // M ODE, MEM {'<', '>'} // abaixo, acima}; byte rowPins [7] ={11, 12, 10, 17, 9, 16, 8}; // conecte-se às pinagens de linha do byte do teclado colPins [2] ={15, 14}; // conectar à pinagem da coluna do teclado // Teclado kpd =Teclado (makeKeymap (keys), rowPins, colPins, ROWS, COLS); Teclado do teclado =Teclado (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 frequência, frequênciaOld; int txtl =0, temparray =0; amostras int [5]; status int não assinado [6]; long timeprevious sem sinal =0, timeprev =0; // EEPROM objectAT24CX mem; RTC_DS1307 rtc; // (clk, din, dc, ce, rst) LCD5110 lcd (6, 5, 4, 2, 3); // Criar uma instância de um chip RDA5807 rádioRDA5807M; /// obter um RDS parserRDSParser 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 []; // -------------------------- CONFIGURAÇÃO ---- ------------------------------ // void setup () {analogReference (EXTERNAL); Serial.begin (9600); Wire.begin (); // Inicializa o Radio radio.init (); radio.debugEnable (); // inicializa a Tela lcd.InitLCD (); lcd.clrScr (); //lcd.setContrast(45); // ajusta se o padrão não é bom lcd.setFont (SmallFont); lcd.enableSleep (); // modo de espera power_state =0; // não "ligue" a unidade (modo de espera) quando a fonte de alimentação estiver conectada // inicialize o teclado numérico.addStatedEventListener (keypadEvent); // Adicionar um ouvinte de evento para este teclado keypad.setHoldTime (1500); pinMode (ledPin, OUTPUT); // Define o pino digital como saída. pinMode (blPin, OUTPUT); // Define o pino digital como saída. digitalWrite (ledPin, LOW); // Desligue o LED. digitalWrite (blPin, LOW); // Desligue o BL (modo stand-by) ledPin_state =digitalRead (ledPin); // Armazena o estado inicial do LED. ALTO quando o LED está aceso. // descomente se o rtc precisar ser ajustado / * if (! rtc.isrunning ()) {Serial.println ("RTC NÃO está em execução!"); // a linha seguinte define o RTC para a data e hora em que este esboço foi compilado rtc.adjust (DateTime (F (__ DATE__), F (__ TIME__))); // Esta linha define o RTC com uma data e hora explícitas, por exemplo, para definir // 21 de janeiro de 2014 às 3h, você chamaria://rtc.adjust(DateTime(2018, 3, 13, 22, 33, 0) ); } * / // ler o valor da última frequência de frequência =mem.readInt (201); volume =2; // nível de volume no menu inicial =1; // mostra o modo VOLUMME no início if (volume <0) volume =0; se (volume> 15) volume =15; se (frequência <0) frequência =0; se (frequência> 210) frequência =210; WriteReg (0x02, 0xC00d); // escreve 0xC00d em Reg.2 (reinicialização suave, habilitar, RDS,) // canal bbz (frequência); // configura a cadeia de informações para dados RDS. radio.attachReceiveRDS (RDS_process); rds.attachServicenNameCallback (DisplayServiceName); //rds.attachTimeCallback(DisplayTime); // para uso futuro. muito impreciso quando o sinal RDS é fraco. rds.attachTextCallback (DisplayText);} // ----------------------- fim da instalação -------------- ---------------------- //// ------------------------ --LOOP ---------------------------------------- // void loop () { if (freqüência! =freqüênciaOld) {freqüênciaOld =freqüência; mem.writeInt (201, frequência); canal (frequência); } if (volume! =volumeOld) {volumeOld =volume; WriteReg (5, 0x84D0 | volume); } // leia o teclado char key =keypad.getKey (); // verificar os dados RDS radio.checkRDS (); // lê a sonda de temperatura 5 vezes a cada 0,6 segundos e calcula a média flutuante média; tempo longo sem sinal agora =millis (); if ((sem sinal longo) (timenow - timeprevious)> 600) {timeprevious =timenow; amostras [temparray] =analogRead (A7); temparray ++; } if (temparray ==5) {// cálculo da média das leituras média =0; para (int i =0; i <5; i ++) {média + =amostras [i]; } printTemp (média); temparray =0; } // tempo limite de 4 segundos para exibição de MEM e insira unsigned long dabar =millis (); if (mempress ==1) {timeprev =dabar; memdisplay =1; mempress =0; } if (memdisplay ==1) {if ((unsigned long) (dabar - timeprev) <4000) {memdisplay =1; } else {memdisplay =0; }} / * Instruções de ajuste de tempo:1. Execute o monitor serial 2. Defina 9600 boud 3. Pressione Enter para ativar a leitura serial 4. Escreva hXX, onde XX é a leitura da hora atual em algum servidor de horário e pressione Enter para ajustar as horas RTC. O monitor serial deve escrever "Horas XX" 5. Escreva mXX, onde XX é a leitura dos minutos atuais em algum servidor de horário e pressione Enter para ajustar os minutos RTC. O monitor serial deve escrever "Minutos XX" 6. Escreva sXX, onde XX é a leitura dos segundos atuais em algum servidor de horário e pressione Enter para ajustar os segundos RTC. O monitor serial deve escrever "Segundos XX" 7. Você pode ajustar apenas as horas. Ou seja, quando o horário de verão foi alterado. 8. Você pode ajustar apenas alguns segundos se precisar apenas corrigir a hora. 9. Se o RTC tiver que ser ajustado de zero (ano, mês, dia, etc.), descomente as linhas da declaração de ajuste do RTC e carregue o esboço. * / DateTime now =rtc.now (); if (Serial.available ()> 0) {char t =Serial.read (); switch (t) {case ('h'):{unsigned int horas =Serial.parseInt (); rtc.adjust (DateTime (now.year (), now.month (), now.day (), horas, now.minute (), now.second ())); Serial.println (F ("Horas")); Serial.println (horas); pausa; } case ('m'):{unsigned int mins =Serial.parseInt (); rtc.adjust (DateTime (now.year (), now.month (), now.day (), now.hour (), mins, now.second ())); Serial.println (F ("Minutos")); Serial.println (minutos); pausa; } case ('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); pausa; }}} // exibe várias informações no LCD printSignalStrength (); printLines (); printTime (); printFreq (); printStereo (); printMode (); printMenu (); data de impressão(); lcd.update ();} // ------------------------ Fim do Loop -------------- ---------------------- // void printSignalStrength () // de 0000 a 1111 (0-63) {unsigned int sig; Readstatus (); sig =status [1] / 1000; if ((sig> =0) &&(sig <=12)) {lcd.drawBitmap (1, 1, sinal1, 17, 6); } if ((sig> =13) &&(sig <=24)) {lcd.drawBitmap (1, 1, sinal2, 17, 6); } if ((sig> =25) &&(sig <=36)) {lcd.drawBitmap (1, 1, sinal3, 17, 6); } if ((sig> =37) &&(sig <=48)) {lcd.drawBitmap (1, 1, sinal4, 17, 6); } se (sig> =49) {lcd.drawBitmap (1, 1, sinal 5, 17, 6); }} void printLines () {lcd.drawLine (0, 9, 84, 9); lcd.drawLine (0, 39, 84, 39);} void printTemp (float average) // pode ser otimizado:) {average / =5; média =1023 / média - 1; média =51700 / média; float steinhart; steinhart =média / 50000; // (R / Ro) steinhart =log (steinhart); // ln (R / Ro) steinhart / =3950; // 1 / B * ln (R / Ro) steinhart + =1,0 / (25 + 273,15); // + (1 / To) steinhart =1.0 / steinhart; // inverter steinhart - =273.15; // conversão celsius int tmp =round (steinhart); lcd.printNumI (tmp, 60, 1, 2); lcd.print (F ("~ C"), 72, 1);} /// Atualize o texto ServiceName na tela LCD quando estiver no modo RDS.void DisplayServiceName (char * name) {lcd.print (name, 18, 22);} void DisplayText (char * text) {// rolar a segunda linha RDS lcd.print (text, txtl, 30); txtl =txtl - 66; if (txtl ==-396) txtl =0;} void printTime () {DateTime now =rtc.now (); lcd.printNumI (now.hour (), 24, 1, 2, '0'); lcd.print (":", 36, 1); lcd.printNumI (now.minute (), 42, 1, 2, '0');} void printDate () {if (dspl ==1) {// verifica se a tecla display foi pressionada ClearRDS (); DateTime now =rtc.now (); lcd.printNumI (now.year (), 12, 22, 4); lcd.print (".", 36, 22); lcd.printNumI (now.month (), 42, 22, 2, '0'); lcd.print (".", 54, 22); lcd.printNumI (now.day (), 60, 22, 2, '0'); int dw =now.dayOfTheWeek (); switch (dw) {case 0:lcd.print (F ("Sekmadienis"), CENTER, 30); // macro F () de domingo para salvar o sdram break; caso 1:lcd.print (F ("Pirmadienis"), CENTER, 30); // segunda-feira etc ... break; caso 2:lcd.print (F ("Antradienis"), CENTER, 30); pausa; caso 3:lcd.print (F ("Treciadienis"), CENTER, 30); pausa; caso 4:lcd.print (F ("Ketvirtadienis"), CENTER, 30); pausa; caso 5:lcd.print (F ("Penktadienis"), CENTER, 30); pausa; caso 6:lcd.print (F ("Sestadienis"), CENTER, 30); pausa; } lcd.update (); atraso (4000); // não é ideal 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 (baixo ==0) {lcd.print (F ("OFF"), 66, 41); } else lcd.print (F ("ON"), 66, 41); }} void printFreq () // exibe a frequência atual {int frHundr, frDec; unsigned int fr; fr =870 + frequência; 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) {// se a tecla MEM foi pressionada lcd.print (F ("MEM>"), 0 , 12); } // Detecção de estéreo else if ((status [0] &0x0400) ==0) lcd.print (F ("()"), 0, 12); // significa MONO else lcd.print (F ("(ST)"), 0, 12); // significa ESTÉREO} void search (byte direc) // busca automática {byte i; // busca para cima ou para baixo if (! direc) WriteReg (0x02, 0xC30d); senão WriteReg (0x02, 0xC10d); para (i =0; i <10; i ++) {atraso (200); Readstatus (); if (status [0] e 0x4000) {frequência =status [0] &0x03ff; pausa; }}} canal vazio (canal interno) // frequência direta {número do byteH, númeroL; numeroH =canal>> 2; numeroL =((canal &3) <<6 | 0x10); Wire.beginTransmission (0x11); Wire.write (0x03); Wire.write (númeroH); // escreve a frequência nos bits 15:6, define o bit de sintonia Wire.write (numberL); Wire.endTransmission ();} // RDA5807_adrs =0x10; // Chip RDA I2C-Address para acesso sequencial Readstatus () {Wire.requestFrom (0x10, 12); para (int i =0; i <6; i ++) {status [i] =256 * Wire.read () + Wire.read (); } Wire.endTransmission ();} // RDA5807_adrr =0x11; // Chip RDA I2C-Address para Accessvoid WriteReg aleatório (byte reg, valor int sem sinal) {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 de alguns eventos especiais.void keypadEvent (KeypadEvent key, KeyState kpadState) {switch (kpadState) {/ * Outra maneira de ajustar o tempo:1. Pressione e segure Pressione a tecla D por pelo menos 2 segundos, quando ouvir os sinais do tempo de término das horas ou ver os segundos da última hora em algum relógio preciso. 2. Solte a tecla D para ajustar hh.00.00. 3. Após o ajuste, se o seu relógio atrasou 15 a 1 minutos, os minutos e segundos serão 00 e as horas serão aumentadas em 1. 4. Se o seu relógio estava com pressa de 1 a 15 minutos, apenas os minutos e segundos serão 00 . * / case HOLD:if (key =='D' &&power_state ==1) {adj =1; } pausa; 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; } pausa; case PRESSED:if (key =='M' &&power_state ==1) {memdisplay =0; menu ++; if (menu> MAXmenu) menu =1; } if (key =='>' &&power_state ==1) {memdisplay =0; switch (menu) {case 1:if (volume <0) {if (bass ==0) {WriteReg (0x02, 0xD00D); volume =0; } se (baixo ==1) {WriteReg (0x02, 0xC00D); volume =0; }} else volume ++; se (volume> 15) volume =15; pausa; caso 2:pesquisa (0); ClearRDS (); pausa; caso 3:frequência ++; se (frequência> 210) frequência =210; // limite de frequência superior ClearRDS (); pausa; caso 4:if (baixo ==0) {baixo =1; WriteReg (0x02, 0xD00D); } pausa; }} if (key =='<' &&power_state ==1) {memdisplay =0; interruptor (menu) {caso 1:volume--; if (volume <0) {WriteReg (0x02, 0x800D); // volume =0; } pausa; caso 2:pesquisa (1); ClearRDS (); pausa; caso 3:frequência--; se (frequência <0) frequência =0; ClearRDS (); pausa; caso 4:if (baixo ==1) {baixo =0; WriteReg (0x02, 0xC00D); } pausa; }} // LED acende / apaga if (key =='L' &&power_state ==1) {digitalWrite (ledPin,! DigitalRead (ledPin)); ledPin_state =digitalRead (ledPin); // Lembre-se do estado do LED, aceso ou apagado. } // liga ou desliga a "alimentação" (modo de espera) if (key =='P') {digitalWrite (blPin,! digitalRead (blPin)); power_state =digitalRead (blPin); if (power_state ==0) {lcd.enableSleep (); digitalWrite (ledPin, LOW); } else lcd.disableSleep (); volume =2; menu =1; } if (key =='1' &&power_state ==1) {switch (memdisplay) {case 0:frequency =mem.readInt (110); ClearRDS (); pausa; caso 1:mem.writeInt (110, frequência); memdisplay =0; pausa; }} if (key =='2' &&power_state ==1) {switch (memdisplay) {case 0:frequency =mem.readInt (120); ClearRDS (); pausa; caso 1:mem.writeInt (120, frequência); memdisplay =0; pausa; }} if (key =='3' &&power_state ==1) {switch (memdisplay) {case 0:frequency =mem.readInt (130); ClearRDS (); pausa; caso 1:mem.writeInt (130, frequência); memdisplay =0; pausa; }} if (key =='4' &&power_state ==1) {switch (memdisplay) {case 0:frequency =mem.readInt (140); ClearRDS (); pausa; caso 1:mem.writeInt (140, frequência); memdisplay =0; pausa; }} if (key =='5' &&power_state ==1) {switch (memdisplay) {case 0:frequency =mem.readInt (150); ClearRDS (); pausa; caso 1:mem.writeInt (150, frequência); memdisplay =0; pausa; }} if (key =='6' &&power_state ==1) {switch (memdisplay) {case 0:frequency =mem.readInt (160); ClearRDS (); pausa; caso 1:mem.writeInt (160, frequência); memdisplay =0; pausa; }} if (key =='m' &&power_state ==1) {mempress =1; } else {mempress =0; } if (key =='I' &&power_state ==1) {dspl =1; } pausa; }} 
Símbolos de força do sinal C / C ++
 #if definido (__ AVR__) #include  #define imagedatatype const uint8_t # elif definido (__ PIC32MX__) #define PROGMEM #define imagedatatype const unsigned char # elif definido (__ arm__) #define PROGMedefine const unsigned char # endifimagedatatype signal5 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xFC, 0xC0, // pixels 0x0010 (16) ,}; tipo de imagem signal4 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xFC, 0xC0, // 0x0010 (16) pixels0xC0, }; imagedatatype signal3 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, // 0x0010 (16) pixels0xC0,}; imagedatatype signal2 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, // 0x0010 (16) pixels0xC0,}; imagedatatype signal1 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, // 0x0010 (16) pixels0xC0,}; 

Esquemas


Processo de manufatura

  1. Rádio
  2. Circuito Integrado
  3. JX Wave Generator
  4. MotionSense
  5. PuzzleBox
  6. Regulador de chuveiro
  7. Scanner de temperatura infravermelho sem fio
  8. Tanque WalaBeer
  9. Laboratório de microcontroladores
  10. MOSMusic