Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Radio FM pour cabine de douche à base d'Arduino

Composants et fournitures

Arduino Nano R3
× 1
Module radio FM RDA Microelectronics RDA5807
× 1
Version NXP NOKIA 5110 LCD 3V-5V
× 1
Petit module RTC (DS1307 + 24c32 EEPROM)
× 1
PAM8403 - Amplificateur classe D 2X3W
× 1
Module convertisseur abaisseur DC-DC LM2596 de Texas Instruments
× 1
Batterie rechargeable LIR2032 3,6 V
× 1
Résistance 100 ohm
× 1
Résistance 1k ohm
× 1
Résistance 10k ohm
× 6
Résistance 100k ohm
× 1
Mosfet de puissance Infineon IRLZ44
× 1
Enceintes PEIYING PY1010C 60W 4Ohm.
× 1
Alimentation 12V 3A trouvée dans la ferraille.
× 1
Condensateurs 2200 uF 25V
× 2
Condensateur 100 µF
× 1
Ampoules LED 3W pour remplacer les halogènes G4 10W existants
× 1

À propos de ce projet

Il y a quelques années, j'ai acheté une cabine de douche chinoise qui a installé le système de contrôle TR028 avec radio. Malheureusement, un beau jour, j'ai trouvé ce système complètement mort. Personne ne pouvait le réparer alors j'ai acheté une autre radio de douche moins chère. Il est mort au bout d'un an environ.

Ma famille avait une radio dans la cabine de douche, alors j'ai commencé à étudier comment ces radios étaient fabriquées. À l'intérieur du système TR028, j'ai trouvé un étrange module TEA5767. Certaines recherches m'ont permis de savoir qu'il s'agit d'un petit module radio FM bon marché. Dans les résultats de recherche, j'ai trouvé un autre module radio FM intéressant - RDA5807. Il est très similaire au TEA5767, mais dispose de fonctions RDS, de contrôle du volume et d'amplification des basses. Ma décision a donc été d'utiliser RDA5807 dans mon nouveau projet.

J'ai cherché sur Internet et j'ai trouvé plusieurs projets où le module RDA5807 a été utilisé :

  • Projet principal qui a inspiré ma vision.
  • Variation où j'ai trouvé un excellent signe de force de signal et des informations plus utiles.
  • Une autre variante.
  • Grande bibliothèque de modules radio
  • Informations utiles (en russe).
  • Un de plus

Il était possible de répéter l'un de ces projets, mais personne n'a répondu exactement à ma vision.

Ma vision était :

  • L'appareil avec écran tactile pour assurer une construction étanche. (J'ai utilisé un boîtier avec écran tactile de TR0289 mort).
  • Radio
  • Plusieurs préréglages de stations de radio préférées
  • Contrôle du volume
  • Fonction de recherche automatique de stations de radio
  • Possibilité de mémoriser la radio recherchée
  • Une horloge pour voir l'heure actuelle.
  • Fonction Marche/Arrêt
  • Contrôle de la lumière
  • Certaines informations mineures s'affichent comme la température à l'intérieur d'une cabine, RDS.

Sur Aliexpress j'ai acheté RDA5807, Tiny RTC avec 32kb EEPROM, PAM8403, NOKIA 5110 LCD, modules LM2596 pour moins de 10€ et j'ai commencé les expérimentations.

Ce que j'ai finalement obtenu :

  • Radio FM avec 2 rangées (!) RDS
  • 6 préréglages pour les stations de radio préférées
  • Réglage automatique ou manuel
  • Possibilité de stocker la station de radio préférée dans l'un des 6 préréglages
  • Contrôle du volume et de l'amplification des basses
  • Contrôle des lumières de la cabine de douche
  • Un calendrier et une horloge
  • RSSI (indicateur de force du signal radio)
  • Indicateur de mode stéréo
  • Fonction Marche/Arrêt

Quelques photos du projet

Pour l'écran NOKIA 5110, j'ai trouvé une belle bibliothèque

Compris le fonctionnement de l'écran tactile TR028. En fait, c'est un clavier à 2 colonnes X 7 rangées. Pour le faire fonctionner, j'ai utilisé cette bibliothèque.

Planche assemblée placée dans la boîte. Vous pouvez remarquer que j'ai dessoudé la prise USB et soudé le câble directement. C'est pour la possibilité de connecter un PC et les futures améliorations logicielles.

Comment ça marche :

  • La radio ne s'allume pas une fois que l'alimentation est connectée. Cela empêche la lecture de la radio si la ligne électrique n'est pas stable ou si l'alimentation a été coupée. Pour allumer la radio la première fois, vous devez connecter l'alimentation et après quelques secondes, appuyez sur la touche d'alimentation. La radio jouera la dernière station de radio jouée avec un volume au niveau 03. Le mode de fonctionnement sera le contrôle du VOLUME. Pour éteindre la radio, appuyez simplement sur la touche marche/arrêt. L'appareil éteint l'écran LCD, le rétroéclairage LCD, l'amplificateur et la lampe LED / halogène.
  • Pour rechercher une station de radio, vous pouvez choisir le mode de syntonisation Auto ou Manuel en appuyant sur le bouton "Mod". En appuyant sur les boutons "<" ou ">", la radio recherchera une station de radio en diminuant ou en augmentant la fréquence. Pour mémoriser une station de radio trouvée, appuyez sur le bouton "Mem" et vous aurez 4 secondes pour sélectionner l'un des six préréglages que vous souhaitez mémoriser.
  • Pour voir la date actuelle, appuyez sur la touche I (info). La date sera affichée 4 secondes. Cette partie du code peut être optimisée car elle utilise une fonction delay().
  • Pour régler l'horloge, maintenez enfoncée la touche D pendant au moins 2 secondes lorsque vous entendez des signaux de fin d'heure (signaux horaires), ou voyez les dernières secondes d'une heure sur une horloge précise. Relâchez la touche D pour régler hh.00.00. Si votre horloge était en retard de 15 à 1 minutes, les minutes et secondes seront mises à 00 et les heures seront augmentées de 1 et si votre horloge était pressée de 1 à 15 minutes, seules les minutes et secondes seront mises à 00 après la procédure de réglage .

Qu'est-ce que je changerais :

  • Le résonateur sur le module RTC pour avoir une meilleure précision mais la fonction de réglage de l'horloge permet de résoudre ce problème.
  • L'écran LCD 5110 vers un écran plus grand et plus lumineux. Il peut s'agir d'un écran LCD couleur 1, 8" ou 2,0", car il est parfois difficile de lire les informations sur l'écran LCD NOKIA 5110 utilisé dans le projet.
  • L'amplificateur PAM8403 vers PAM8610 qui a une puissance de sortie 2x15W ou TDA7297 avec les mêmes caractéristiques.

Conclusion :

Je suis heureux de la façon dont mon nouveau projet fonctionne. Aucun problème n'a été observé après 1 mois de travail hormis la précision de l'horloge.

Je ne suis pas un programmeur, donc le code peut être mieux optimisé. Mon expérience en programmation C/C++ est d'environ un an, autodidacte. C'est mon premier projet utile utilisant la plate-forme Arduino et le premier projet que je partage sur le hub. S'il vous plaît, comprenez-moi et pardonnez-moi pour les erreurs possibles et mon mauvais anglais.

Si vous avez des questions n'hésitez pas à les poser en commentaire ou en MP.

Mise à jour 1 : mises à jour matérielles et logicielles mineures.

Matériel - installé un fusible 2A sur la ligne 12V. Juste pour des raisons de sécurité.

Logiciel - ajout de la ligne 586 menu = 1 ; Cela restaure le mode sur VOLUME après avoir appuyé sur la touche marche/arrêt.

Mise à jour 2 :

Malheureusement, l'écran LCD de ma radio va mourir.

Je suis donc à la recherche d'une alternative LCD NOKIA 5110 bon marché. Je n'installerai pas un nouvel écran LCD 5110 car il est petit et difficile à lire. Je pense que je vais expérimenter avec l'écran LCD TFT 1,8". Les bonnes choses - il est plus grand, plus lumineux, a une meilleure résolution. Les mauvaises choses - je suis sûr que le TFT 1,8" consommera plus de ressources qui sont critiques.

Vos conseils concernant le remplacement des écrans LCD sont les bienvenus.

Code

  • Esquisse du projet
  • Symboles de puissance de signal
Esquisse du projetArduino
//////////////////////////////////////////// /////////////////// Projet de radio FM de douche basé sur Arduino //// Arduino NANO, RDA5807M, RTC, EEPROM, LCD5110, Thermistance //////// ////////////////////////////////////////////////////////////// /////////#include //http://www.rinkydinkelectronics.com/library.php?id=48#include //https://github. com/cyberp/AT24Cx#include //Arduino IDE inclus#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//définir les cymbales sur le boutons du clavierscharch keys[7][2] ={ {'L', 'P'}, //LED, POWER {'I', 'D'}, //INFO, DISPLAY {'1', '2 '}, //préréglages {'3', '4'}, //de 1 {'5', '6'}, //à 6 {'M', 'm'}, //M ODE, MEM {'<', '>'} //down, up};byte rowPins[7] ={11, 12, 10, 17, 9, 16, 8} ; // se connecte aux broches de ligne de l'octet de clavier colPins[2] ={15, 14} ; // se connecter aux brochages de colonne du clavier // Clavier kpd =Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );Keypad keyboard =Keypad( makeKeymap(keys), rowPins, colPins, 7, 2 ); boolean bass =0, dspl =0, memdisplay =0, mempress =0, adj =0;boolean ledPin_state, power_state;int menu;int volume, volumeOld =5;int fréquence, fréquenceOld;int txtl =0, temparray =0; échantillons int[5];état int non signé[6];temps long non signé précédent =0, temps précédent =0;// objet EEPROMAT24CX mem;RTC_DS1307 rtc;//(clk, din, dc, ce, rst)LCD5110 lcd(6, 5, 4, 2, 3);// Créer une instance d'une radio à puce RDA5807RDA5807M radio;/// obtenir un analyseur RDSRDSParser rds;extern unsigned char SmallFont[];extern uint8_t signal5[];extern uint8_t signal4[];extern uint8_t signal3[];externe uint8_t signal2[];externe uint8_t signal1[];//--------------------------SETUP---- ------------------------------//void setup(){ analogReference(EXTERNAL); Serial.begin(9600); Fil.begin(); // Initialiser la radio radio.init(); radio.debugEnable(); //initialiser l'écran lcd.InitLCD(); lcd.clrScr(); //lcd.setContrast(45); // ajuster si la valeur par défaut n'est pas bonne lcd.setFont(SmallFont); lcd.enableSleep(); //mode veille power_state =0; //ne pas "mettre sous tension" l'unité (mode veille) lorsque l'alimentation est connectée //initialiser le clavier clavier.addStatedEventListener(keypadEvent); // Ajout d'un écouteur d'événement pour ce clavier keyboard.setHoldTime(1500); pinMode(ledPin, SORTIE); // Définit la broche numérique comme sortie. pinMode(blPin, SORTIE); // Définit la broche numérique comme sortie. digitalWrite(ledPin, LOW); // Éteindre la LED. digitalWrite(blPin, LOW); // Désactiver le BL (mode veille) ledPin_state =digitalRead(ledPin); // Stocke l'état initial de la LED. ÉLEVÉ lorsque la LED est allumée. //décommenter si rtc doit être ajusté /*if (! rtc.isrunning()) { Serial.println("RTC n'est PAS en cours d'exécution!"); // la ligne suivante définit le RTC à la date et à l'heure auxquelles ce croquis a été compilé rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Cette ligne définit le RTC avec une date et une heure explicites, par exemple pour définir // le 21 janvier 2014 à 3 heures du matin, vous appelleriez :// rtc.adjust(DateTime(2018, 3, 13, 22, 33, 0) ); }*/ // lecture de la valeur de la dernière fréquence fréquence =mem.readInt(201); volume =2 ; //niveau de volume au menu de démarrage =1; // affiche le mode VOLUMME au démarrage si (volume <0) volume =0; si (volume> 15) volume =15; si (fréquence <0) fréquence =0 ; si (fréquence> 210) fréquence =210 ; WriteReg(0x02, 0xC00d); // écrivez 0xC00d dans Reg.2 ( soft reset, enable, RDS, ) // bbz canal (fréquence); // configurer la chaîne d'information pour les données RDS. radio.attachReceiveRDS(RDS_process); rds.attachServicenNameCallback(DisplayServiceName); //rds.attachTimeCallback(DisplayTime); //pour une utilisation future. très imprécis lorsque le signal RDS est faible. rds.attachTextCallback(DisplayText);}//-----------------------fin de l'installation-------------- ----------------------////------------------------ --LOOP----------------------------------------//boucle vide(){ if ( fréquence !=fréquenceOld) { fréquenceOld =fréquence; mem.writeInt(201, fréquence); canal(fréquence); } if (volume !=volumeOld) { volumeOld =volume; WriteReg(5, 0x84D0 | volume); } //lire le clavier car key =keyboard.getKey(); //vérification des données RDS radio.checkRDS(); // lit la sonde de température toutes les 0,6 s 5 fois et calcule la moyenne flottante moyenne ; long timenow non signé =millis(); if ((unsigned long)(timenow - timeprevious)> 600) { timeprevious =timenow; échantillons[temparray] =analogRead(A7) ; temparray++; } if (temparray ==5) { // calcul de la moyenne des lectures moyenne =0; for (int i =0; i <5; i++) { moyenne +=échantillons[i]; } printTemp(moyenne); tableau temporaire =0 ; } // Délai d'attente de 4 secondes pour l'affichage MEM et entrez un dabar long non signé =millis (); if (mempress ==1) { timeprev =dabar; memdisplay =1; mempress =0; } if (memdisplay ==1) { if ((unsigned long)(dabar - timeprev) <4000) { memdisplay =1; } else { memdisplay =0; } } /*Instructions de réglage de l'heure :1. Exécutez le moniteur série 2. Réglez 9600 boud 3. Appuyez sur Entrée pour activer la lecture en série 4. Écrivez hXX, où XX est la lecture de l'heure actuelle sur un serveur de temps et appuyez sur Entrée pour ajuster les heures RTC. Le moniteur série doit écrire « Heures XX » 5. Écrivez mXX, où XX est la lecture des minutes en cours sur un serveur de temps et appuyez sur Entrée pour ajuster les minutes RTC. Le moniteur série doit écrire « Minutes XX » 6. Écrivez sXX, où XX correspond à la lecture des secondes en cours sur un serveur de temps et appuyez sur Entrée pour ajuster les secondes RTC. Le moniteur série doit écrire "Secondes XX" 7. Vous ne pouvez régler que les heures. C'est à dire. lorsque l'heure d'été a été modifiée. 8. Vous ne pouvez régler que les secondes si vous n'avez besoin que de corriger l'heure. 9. Si le RTC doit être ajusté à partir de zéro (année, mois, jour, etc.), décommentez les lignes du relevé d'ajustement RTC et téléchargez le croquis. */ DateHeure maintenant =rtc.now(); if (Serial.available()> 0) { char t =Serial.read(); switch (t) { case ('h'):{ heures int non signées =Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), hours, now.minute(), now.second())); Serial.println(F("Heures")); Serial.println(heures); Pause; } case ('m'):{ unsigned int mins =Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), mins, now.second())); Serial.println(F("Minutes")); Serial.println(mins); Pause; } case ('s'):{ unsigned int sec =Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), sec)); Serial.println(F("Secondes")); Serial.println(sec); Pause; } } } //afficher diverses informations sur l'écran LCD printSignalStrength(); printLines(); printTime(); printFreq(); printStereo(); printMode(); printMenu(); date d'impression(); lcd.update();}//------------------------Fin de boucle-------------- ----------------------//void printSignalStrength() //de 0000 à 1111 (0-63){ non signé int sig; Readstatus(); sig =état[1] / 1000 ; if ((sig>=0) &&(sig <=12)) { lcd.drawBitmap(1, 1, signal1, 17 , 6); } if ((sig>=13) &&(sig <=24)) { lcd.drawBitmap(1, 1, signal2, 17 , 6); } if ((sig>=25) &&(sig <=36)) { lcd.drawBitmap(1, 1, signal3, 17 , 6); } if ((sig>=37) &&(sig <=48)) { lcd.drawBitmap(1, 1, signal4, 17 , 6); } if (sig>=49) { lcd.drawBitmap(1, 1, signal5, 17 , 6); }}void printLines(){ lcd.drawLine(0, 9, 84, 9); lcd.drawLine (0, 39, 84, 39);} void printTemp (moyenne flottante) //pourrait être optimisé :){ moyenne /=5; moyenne =1023 / moyenne - 1 ; moyenne =51700 / moyenne ; flotteur steinhart; steinhart =moyenne / 50000; // (R/Ro) steinhart =log(steinhart); // ln(R/Ro) steinhart /=3950; // 1/B * ln(R/Ro) steinhart +=1,0 / (25 + 273,15); // + (1/Pour) steinhart =1.0 / steinhart; // inverse steinhart -=273.15; // conversion celsius int tmp =round(steinhart); lcd.printNumI(tmp, 60, 1, 2); lcd.print(F("~C"), 72, 1);}/// Mettre à jour le texte ServiceName sur l'écran LCD en mode RDS.void DisplayServiceName(char *name){ lcd.print(name, 18, 22);}void DisplayText(char *text){ //faire défiler la deuxième ligne 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) { //vérifie si la touche d'affichage a été enfoncée ClearRDS(); DateHeure maintenant =rtc.now(); lcd.printNumI(maintenant.année(), 12, 22, 4); lcd.print(".", 36, 22); lcd.printNumI(maintenant.mois(), 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"), CENTRE, 30); // macro F() du dimanche pour enregistrer la pause sdram ; cas 1 :lcd.print(F("Pirmadienis"), CENTRE, 30); //lundi etc... pause ; cas 2:lcd.print(F("Antradienis"), CENTRE, 30); Pause; cas 3 :lcd.print(F("Treciadienis"), CENTRE, 30); Pause; cas 4:lcd.print(F("Ketvirtadienis"), CENTRE, 30); Pause; cas 5:lcd.print(F("Penktadiénis"), CENTRE, 30); Pause; cas 6 :lcd.print(F("Sestadienis"), CENTRE, 30); Pause; } lcd.update(); retard (4000); //pas optimal ClearRDS(); dsp =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(" BASSE "), 30, 41); if (basse ==0) { lcd.print(F("OFF"), 66, 41); } else lcd.print(F("ON"), 66, 41); }}void printFreq() // affiche la fréquence actuelle{ int frHundr, frDec; non signé int fr; fr =870 + fréquence; frHundr =fr/10 ; frDéc =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) { //si la touche MEM a été enfoncée lcd.print(F("MEM>"), 0 , 12); } //Détection stéréo else if ((status[0] &0x0400) ==0) lcd.print(F("( )"), 0, 12); //signifie MONO else lcd.print (F("(ST)"), 0, 12); //signifie STEREO}recherche vide (octet direc) //recherche automatique{ octet i; // recherche vers le haut ou vers le bas if (!direc) WriteReg(0x02, 0xC30d); else WriteReg(0x02, 0xC10d); pour (i =0; i <10; i++) { délai (200); Readstatus(); if (status[0] &0x4000) { fréquence =status[0] &0x03ff; Pause; } }}canal vide (canal int) //fréquence directe{ octet nombreH, nombreL; nombreH =canal>> 2 ; nombreL =((canal &3) <<6 | 0x10); Wire.beginTransmission (0x11); Wire.write(0x03); Wire.write(nombreH); // écrit la fréquence dans les bits 15:6, règle le bit de réglage Wire.write(numberL); Wire.endTransmission();}//RDA5807_adrs=0x10;// I2C-Address RDA Chip pour séquentiel Accessint Readstatus(){ Wire.requestFrom (0x10, 12); for (int i =0; i <6; i++) { status[i] =256 * Wire.read () + Wire.read(); } Wire.endTransmission();}//RDA5807_adrr=0x11;// I2C-Address RDA Chip for random Accessvoid WriteReg(byte reg, unsigned int valor){ Wire.beginTransmission(0x11); Wire.write(reg); Wire.write(valeur>> 8); Wire.write(valeur &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);}// Prise en charge de certains événements spéciaux.void keyboardEvent(KeypadEvent key, KeyState kpadState ) { switch (kpadState) { /* Une autre façon de régler l'heure :1. Appuyez et maintenez appuyez sur D pendant au moins 2 secondes, lorsque vous entendez les signaux de fin d'heure ou que vous voyez les secondes de la dernière heure sur une horloge précise. 2. Relâcher la touche D pour régler hh.00.00. 3. Après le réglage, si votre horloge était en retard de 15 à 1 minutes, les minutes et secondes seront 00 et les heures seront augmentées de 1. 4. Si votre horloge était pressée de 1 à 15 minutes, seules les minutes et secondes seront 00 . */ case HOLD:if (key =='D' &&power_state ==1) { adj =1; } Pause; case LIBÉRÉ :if (clé =='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; } Pause; case APPUYÉE :if (touche =='M' &&power_state ==1) { memdisplay =0 ; menu++; si (menu> MAXmenu)menu =1 ; } if (clé =='>' &&power_state ==1) { memdisplay =0; switch (menu) { cas 1 :if (volume <0) { if (bass ==0) { WriteReg(0x02, 0xD00D); volume =0 ; } if (basse ==1) { WriteReg(0x02, 0xC00D); volume =0 ; } } else volume++; si (volume> 15)volume =15 ; Pause; cas 2 :recherche(0); ClearRDS(); Pause; cas 3 :fréquence++; si (fréquence> 210)fréquence =210 ; // limite de fréquence supérieure ClearRDS(); Pause; cas 4 :si (basse ==0) { basse =1; WriteReg(0x02, 0xD00D); } Pause; } } if (clé =='<' &&power_state ==1) { memdisplay =0; commutateur (menu) { cas 1 :volume--; if (volume <0) { WriteReg(0x02, 0x800D); //volume =0; } Pause; cas 2 :recherche(1); ClearRDS(); Pause; cas 3 :fréquence--; si (fréquence <0)fréquence =0 ; ClearRDS(); Pause; cas 4 :si (basse ==1) { basse =0; WriteReg(0x02, 0xC00D); } Pause; } } // La LED s'allume/s'éteint if (key =='L' &&power_state ==1) { digitalWrite(ledPin, !digitalRead(ledPin)); ledPin_state =digitalRead(ledPin); // Mémoriser l'état de la LED, allumée ou éteinte. } // allume ou éteint "l'alimentation" (mode veille) 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 :fréquence =mem.readInt(110); ClearRDS(); Pause; cas 1 :mem.writeInt(110, fréquence); memdisplay =0; Pause; } } if (key =='2' &&power_state ==1) { switch (memdisplay) { case 0 :fréquence =mem.readInt(120); ClearRDS(); Pause; cas 1 :mem.writeInt(120, fréquence); memdisplay =0; Pause; } } if (key =='3' &&power_state ==1) { switch (memdisplay) { case 0 :fréquence =mem.readInt(130); ClearRDS(); Pause; cas 1 :mem.writeInt(130, fréquence); memdisplay =0; Pause; } } if (key =='4' &&power_state ==1) { switch (memdisplay) { case 0 :fréquence =mem.readInt(140); ClearRDS(); Pause; cas 1 :mem.writeInt(140, fréquence); memdisplay =0; Pause; } } if (key =='5' &&power_state ==1) { switch (memdisplay) { case 0 :fréquence =mem.readInt(150); ClearRDS(); Pause; cas 1 :mem.writeInt(150, fréquence); memdisplay =0; Pause; } } if (key =='6' &&power_state ==1) { switch (memdisplay) { case 0 :fréquence =mem.readInt(160); ClearRDS(); Pause; cas 1 :mem.writeInt(160, fréquence); memdisplay =0; Pause; } } if (clé =='m' &&power_state ==1) { mempress =1; } else { mempress =0; } if (clé =='I' &&power_state ==1) { dspl =1; } Pause; }}
Symboles de force de signalC/C++
#ifdefined(__AVR__) #include  #define imagedatatype const uint8_t#elifdefined(__PIC32MX__) #define PROGMEM #define imagedatatype const unsigned char#elifdefined(__arm__) #define PROGMEM #define imagedatatype const unsigned char#endifimagedatatype signal5[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xFC, 0xFE100 (16), // 0xFE100 (16) , };imagedatatype signal4[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xFC, 0xC0, 0xC0, (16) };imagedatatype signal3[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0,0} 0x010, (16) pixels;imagedatatype signal2[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, // 0x010, (16) pixels}0; imagedatatype signal1[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, // 0x0010 (16) pixels0xC0, } ;

Schémas


Processus de fabrication

  1. Radio
  2. Circuit intégré
  3. Générateur d'ondes JX
  4. MotionSense
  5. PuzzleBox
  6. Régulateur de douche
  7. Scanner de température infrarouge sans fil
  8. Réservoir de WalaBeer
  9. MOSMusique