Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino-basiertes FM-Radio in Duschkabine

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1
RDA Microelectronics RDA5807 FM-Radiomodul
× 1
NXP NOKIA 5110 LCD 3V-5V-Version
× 1
Kleines RTC-Modul (DS1307 + 24c32 EEPROM)
× 1
PAM8403 - 2X3W Klasse-D-Verstärker
× 1
Texas Instruments LM2596 DC-DC-Abwärtswandlermodul
× 1
LIR2032 3,6-V-Akku
× 1
Widerstand 100 Ohm
× 1
Widerstand 1k Ohm
× 1
Widerstand 10k Ohm
× 6
Widerstand 100k Ohm
× 1
Infineon IRLZ44 Power Mosfet
× 1
PEIYING PY1010C 60W 4Ohm Lautsprecher.
× 1
12V 3A Netzteil in Schrott gefunden.
× 1
2200 uF 25V Kondensatoren
× 2
Kondensator 100 µF
× 1
3W LED-Lampen als Ersatz für vorhandene G4 10W Halogene
× 1

Über dieses Projekt

Vor einigen Jahren habe ich eine chinesische Duschkabine gekauft, die das TR028-Steuerungssystem mit Funk installiert hat. Leider fand ich dieses System eines schönen Tages völlig tot. Niemand konnte es reparieren, also kaufte ich ein anderes, billigeres Duschradio. Es starb nach etwa einem Jahr.

Meine Familie hatte früher ein Radio in der Duschkabine, also begann ich zu studieren, wie diese Radios hergestellt wurden. Im TR028-System fand ich ein seltsames TEA5767-Modul. Einige Recherchen lassen mich wissen, dass es sich um ein kleines billiges UKW-Radiomodul handelt. In den Suchergebnissen habe ich ein weiteres interessantes FM-Radiomodul gefunden - RDA5807. Es ist dem TEA5767 sehr ähnlich, verfügt jedoch über RDS-, Lautstärkeregler- und Bass-Boost-Funktionen. Daher entschied ich mich, RDA5807 in meinem neuen Projekt zu verwenden.

Ich habe im Internet gesucht und mehrere Projekte gefunden, in denen das RDA5807-Modul verwendet wurde:

  • Hauptprojekt, das meine Vision inspiriert hat.
  • Variation, bei der ich ein großartiges Signal für die Signalstärke und weitere nützliche Informationen gefunden habe.
  • Eine andere Variante.
  • Großartige Radiomodulbibliothek
  • Nützliche Informationen (auf Russisch).
  • Noch einer

Eines dieser Projekte konnte wiederholt werden, aber keiner entsprach genau meiner Vision.

Meine Vision war:

  • Das Gerät mit Touchscreen für eine wasserdichte Konstruktion. (Ich habe ein Gehäuse mit Touchpanel von totem TR0289 verwendet).
  • Radio
  • Mehrere Voreinstellungen für Lieblingsradiosender
  • Lautstärkeregelung
  • Automatischer Sendersuchlauf
  • Möglichkeit, den gesuchten Radiosender zu speichern
  • Eine Uhr, um die aktuelle Uhrzeit anzuzeigen.
  • Ein/Aus-Funktion
  • Lichtsteuerung
  • Einige kleinere Informationen wie Temperatur in einer Kabine, RDS.

Auf Aliexpress kaufte ich RDA5807, Tiny RTC mit 32kb EEPROM, PAM8403, NOKIA 5110 LCD, LM2596 Module für weniger als 10€ und begann mit Experimenten.

Was ich endlich habe:

  • FM-Radio mit 2 Reihen (!) RDS
  • 6 Voreinstellungen für Lieblingsradiosender
  • Automatische oder manuelle Abstimmung
  • Möglichkeit, Lieblingsradiosender in einem von 6 Voreinstellungen zu speichern
  • Lautstärke- und Bass-Boost-Steuerung
  • Steuerung der Duschkabinenbeleuchtung
  • Ein Uhrameisenkalender
  • RSSI (Funksignalstärkeanzeige)
  • Stereomodusanzeige
  • Ein/Aus-Funktion

Einige Bilder des Projekts

Für NOKIA 5110 Display habe ich eine schöne Bibliothek gefunden

Verstehen, wie das TR028-Touchpanel funktioniert. Eigentlich ist es eine Tastatur mit 2 Spalten x 7 Zeilen. Um es zu betreiben, habe ich diese Bibliothek verwendet.

Zusammengebaute Platine in der Box platziert. Man merkt, dass ich die USB-Buchse entlötet und das Kabel direkt angelötet habe. Es ist für die Möglichkeit, einen PC anzuschließen und zukünftige Softwareverbesserungen.

So funktioniert es:

  • Das Radio lässt sich nach dem Anschließen der Stromversorgung nicht einschalten. Dies verhindert die Radiowiedergabe, wenn die Stromleitung nicht stabil ist oder die Stromversorgung unterbrochen wurde. Um das Radio zum ersten Mal einzuschalten, müssen Sie das Netzteil anschließen und nach einigen Sekunden die Einschalttaste drücken. Das Radio spielt den zuletzt gespielten Radiosender mit der Lautstärke auf Stufe 03. Der Betriebsmodus ist die Lautstärkeregelung. Um das Radio auszuschalten, drücken Sie einfach die Power-Taste. Das Gerät schaltet LCD, LCD-Hintergrundbeleuchtung, Verstärker und LED / Halogenlampe aus.
  • Um einen Radiosender zu suchen, können Sie den automatischen oder manuellen Sendersuchmodus wählen, indem Sie die "Mod"-Taste drücken. Durch Drücken der Tasten "<" oder ">" sucht das Radio einen Radiosender mit abnehmender oder steigender Frequenz. Um einen gefundenen Radiosender zu speichern, drücken Sie die "Mem"-Taste und Sie haben 4 Sekunden Zeit, um einen von sechs Sendern auszuwählen, die Sie speichern möchten.
  • Um das aktuelle Datum anzuzeigen, drücken Sie die Taste I (Info). Das Datum wird 4 Sekunden lang angezeigt. Dieser Teil des Codes kann optimiert werden, da er eine Funktion delay() verwendet.
  • Um die Uhr einzustellen, halten Sie die D-Taste mindestens 2 Sekunden lang gedrückt, wenn Sie das Ende einer Stunde (Zeitsignale) hören oder die letzten Sekunden einer Stunde auf einer genauen Uhr sehen. Lassen Sie die D-Taste los, um hh.00.00 einzustellen. Wenn Ihre Uhr von 15 auf 1 Minute zu spät war, werden Minuten und Sekunden auf 00 gestellt und Stunden um 1 erhöht. Wenn Ihre Uhr von 1 auf 15 Minuten eilig war, werden nach dem Einstellvorgang nur Minuten und Sekunden auf 00 gestellt .

Was würde ich ändern:

  • Der Resonator auf dem RTC-Modul hat eine bessere Genauigkeit, aber die Taktanpassungsfunktion ermöglicht es, dieses Problem zu lösen.
  • Das 5110 LCD zu einem größeren und helleren. Kann ein 1, 8" oder 2,0" Farb-LCD sein, da es manchmal schwierig ist, Informationen über das im Projekt verwendete NOKIA 5110 LCD zu lesen.
  • Der PAM8403-Verstärker zu PAM8610 mit 2x15W Ausgangsleistung oder TDA7297 mit gleichen Eigenschaften.

Fazit:

Ich bin glücklich, wie mein neues Projekt funktioniert. Nach 1 Monat Arbeit wurden keine Probleme festgestellt, außer der Genauigkeit der Uhr.

Ich bin kein Programmierer, daher kann der Code besser optimiert werden. Meine Programmiererfahrung in C/C++ beträgt etwa ein Jahr, selbst erlernt. Es ist mein erstes nützliches Projekt mit der Arduino-Plattform und das erste Projekt, das ich auf dem Hub teile. Bitte haben Sie Verständnis und verzeihen Sie mir mögliche Fehler und mein schlechtes Englisch.

Wenn Sie Fragen haben, zögern Sie nicht, sie in Kommentaren oder PN zu stellen.

Update 1.:Kleinere Hardware- und Software-Updates.

Hardware - installiert eine 2A-Sicherung auf der 12-V-Leitung. Nur aus Sicherheitsgründen.

Software - Zeile 586 menu hinzugefügt = 1; Dadurch wird der Modus auf VOLUME zurückgesetzt, nachdem die Einschalttaste gedrückt wurde.

Update 2:

Leider wird das LCD in meinem Radio sterben.

Also bin ich auf der Suche nach einer günstigen NOKIA 5110 LCD Alternative. Ich werde kein neues 5110 LCD installieren, da es klein und schwer zu lesen ist. Ich denke, ich werde mit 1,8" TFT-LCD experimentieren. Die guten Dinge - es ist größer, heller, hat eine bessere Auflösung. Die schlechten Dinge - ich bin sicher, dass das 1,8" TFT mehr Ressourcen verbrauchen wird, die kritisch sind.

Ihre Ratschläge zum LCD-Ersatz sind willkommen.

Code

  • Projektskizze
  • Signalstärkesymbole
ProjektskizzeArduino
///////////////////////////////////////////// //////////////////// Arduino basierte Dusche FM Radio Project //// Arduino NANO, RDA5807M, RTC, EEPROM, LCD5110, Thermistor //////// //////////////////////////////////////////////// /////////#include  //http://www.rinkydinkelectronics.com/library.php?id=48#include  //https://github. com/cyberp/AT24Cx#include  //Arduino IDE enthalten#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//definiere die Becken auf dem Tasten der Keypadschar-Tasten[7][2] ={ {'L', 'P'}, //LED, POWER {'I', 'D'}, //INFO, DISPLAY {'1', '2 '}, //Voreinstellungen {'3', '4'}, //von 1 {'5', '6'}, //bis 6 {'M', 'm'}, //M ODE, MEM {'<', '>'} //down, up};byte rowPins[7] ={11, 12, 10, 17, 9, 16, 8}; // mit den Zeilen-Pinbelegungen des Keypadbyte verbinden colPins [2] ={15, 14}; // mit den Spaltenpinbelegungen der Tastatur verbinden // Tastatur kpd =Keypad (makeKeymap(keys), rowPins, colPins, ROWS, COLS); Tastaturtastenblock =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 frequency, frequencyOld;int txtl =0, temparray =0; int sample[5];unsigned int status[6];unsigned long timeprev =0, timeprev =0;// EEPROM objectAT24CX mem;RTC_DS1307 rtc;//(clk, din, dc, ce, rst)LCD5110 lcd(6, 5, 4, 2, 3);// Erstellen Sie eine Instanz eines RDA5807-ChipradioRDA5807M-Radios;/// Holen Sie sich einen 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[];//----------------------------SETUP---- ------------------------------------------ //void setup () { analogReference (EXTERNAL); Serial.begin (9600); Wire.begin(); // Radio initialisieren radio.init(); radio.debugEnable(); // den Bildschirm initialisieren lcd.InitLCD(); lcd.clrScr(); //lcd.setContrast(45); // anpassen, wenn Standard nicht gut ist lcd.setFont (SmallFont); lcd.enableSleep(); // Standby-Modus power_state =0; // Gerät nicht "einschalten" (Stand-by-Modus), wenn die Stromversorgung angeschlossen ist // Tastatur initialisieren keyboard.addStatedEventListener(keypadEvent); // Fügen Sie einen Ereignis-Listener für diese Tastatur hinzu keyboard.setHoldTime(1500); pinMode (ledPin, AUSGANG); // Setzt den digitalen Pin als Ausgang. pinMode (blPin, AUSGANG); // Setzt den digitalen Pin als Ausgang. digitalWrite (ledPin, LOW); // Schalten Sie die LED aus. digitalWrite (blPin, LOW); // BL ausschalten (Stand-by-Modus) ledPin_state =digitalRead (ledPin); // Den anfänglichen LED-Zustand speichern. HIGH, wenn LED an ist. // Kommentar entfernen, wenn rtc angepasst werden muss / * if (! rtc.isrunning ()) { Serial.println ( "RTC läuft NICHT!"); // folgende Zeile setzt die RTC auf das Datum und die Uhrzeit, zu der diese Skizze kompiliert wurde rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Diese Zeile setzt die RTC mit einem expliziten Datum und einer expliziten Uhrzeit, um beispielsweise den // 21. Januar 2014 um 3 Uhr morgens zu setzen, würden Sie Folgendes aufrufen://rtc.adjust(DateTime(2018, 3, 13, 22, 33, 0) ); } */ // Wert der letzten Frequenz lesen Frequenz =mem.readInt (201); Volumen =2; // Lautstärke im Startmenü =1; // zeigt den VOLUMME-Modus beim Start an, wenn (Lautstärke <0) Lautstärke =0; wenn (Volumen> 15) Volumen =15; wenn (Frequenz <0) Frequenz =0; wenn (Frequenz> 210) Frequenz =210; WriteReg(0x02, 0xC00d); // 0xC00d in Reg.2 schreiben (Soft-Reset, Enable, RDS,) // bbz-Kanal (Frequenz); // Richten Sie die Informationskette für RDS-Daten ein. radio.attachReceiveRDS(RDS_Prozess); rds.attachServicenNameCallback(DisplayServiceName); //rds.attachTimeCallback (DisplayTime); //Für zukünftige Verwendung. sehr ungenau, wenn das RDS-Signal schwach ist. rds.attachTextCallback(DisplayText);}//-------------Ende des Setups------------- ----------------------////------------------------ --LOOP---------------------------------------------------- //void loop(){ if ( Frequenz !=FrequenzOld) { FrequenzOld =Frequenz; mem.writeInt(201, Häufigkeit); Kanal (Frequenz); } if (Volumen!=volumeOld) { volumeOld =volume; WriteReg(5, 0x84D0 | Volumen); } // Lesen Sie die Zeichentaste der Tastatur =Keypad.getKey (); // auf RDS-Daten prüfen radio.checkRDS (); // liest die Temperatursonde alle 0,6 Sek. 5-mal und berechnet den durchschnittlichen Float-Durchschnitt; unsigned long timenow =millis(); if ((unsigned long)(timenow - timevorher)> 600) { timevorher =timenow; Samples[Temparray] =analogRead(A7); temparray++; aufrechtzuerhalten. Wenn (temparray ==5) {// Berechnung des Durchschnitts der Messwerte Durchschnitt =0; for (int i =0; i <5; i++) { Durchschnitt + =Samples[i]; } printTemp (Durchschnitt); temparray =0; } // 4 Sek. Timeout für die MEM-Anzeige und geben Sie unsigned long ein dabar =millis (); if (mempress ==1) { timeprev =dabar; Speicheranzeige =1; Speicher =0; } if (memdisplay ==1) { if ((unsigned long)(dabar - timeprev) <4000) { memdisplay =1; aufrechtzuerhalten. Sonst { memdisplay =0; } } /*Anweisungen zur Zeiteinstellung:1. Seriellen Monitor ausführen 2. 9600 boud einstellen 3. Enter drücken, um das serielle Lesen zu aktivieren 4. hXX schreiben, wobei XX die aktuelle Stundenanzeige auf einem Zeitserver ist, und Enter drücken, um die RTC-Stunden einzustellen. Der serielle Monitor sollte "Stunden XX" schreiben. 5. Schreiben Sie mXX, wobei XX die aktuellen Minuten ist, die auf einem Zeitserver gelesen werden, und drücken Sie die Eingabetaste, um die RTC-Minuten einzustellen. Der serielle Monitor sollte "Minutes XX" schreiben. 6. Schreiben Sie sXX, wobei XX die aktuellen Sekunden ist, die auf einem Zeitserver gelesen werden, und drücken Sie die Eingabetaste, um die RTC-Sekunden einzustellen. Serieller Monitor sollte "Sekunden XX" schreiben 7. Sie können nur Stunden einstellen. D.h. wenn die Sommerzeit geändert wurde. 8. Sie können nur Sekunden einstellen, wenn Sie nur die Zeit korrigieren müssen. 9. Wenn die RTC von Null (Jahr, Monat, Tag usw.) angepasst werden muss, entkommentieren Sie die Zeilen der RTC-Anpassung und laden Sie die Skizze hoch. */ DateTime now =rtc.now(); if (Serial.available ()> 0) { char t =Serial.read (); switch (t) { case ('h'):{ unsigned int hours =Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), hours, now.minute(), now.second())); Serial.println (F ("Stunden")); Serial.println (Stunden); brechen; } case ('m'):{ unsigned int mins =Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), mins, now.second())); Serial.println (F ("Minuten")); Serial.println (Minuten); brechen; } case ('s'):{ unsigned int sec =Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), sec)); Serial.println (F ("Sekunden")); Serial.println (Sek.); brechen; } } } // verschiedene Informationen auf dem LCD anzeigen printSignalStrength (); printLines(); printTime(); printFreq(); printStereo(); printMode(); printMenu(); Datum des Drucks(); lcd.update();}//------------------------Ende der Schleife------------- ---------------------- //void printSignalStrength() //von 0000 bis 1111 (0-63){ unsigned int sig; Readstatus(); sig =Status[1] / 1000; if ((sig>=0) &&(sig <=12)) {lcd.drawBitmap(1, 1, signal1, 17, 6); aufrechtzuerhalten. Wenn ((sig>=13) &&(sig <=24)) {lcd.drawBitmap(1, 1, signal2, 17, 6); aufrechtzuerhalten. Wenn ((sig>=25) &&(sig <=36)) {lcd.drawBitmap(1, 1, signal3, 17, 6); aufrechtzuerhalten. Wenn ((sig>=37) &&(sig <=48)) {lcd.drawBitmap(1, 1, signal4, 17, 6); aufrechtzuerhalten. Wenn (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(float Average) // könnte optimiert werden :){ Average /=5; Durchschnitt =1023 / Durchschnitt - 1; Durchschnitt =51700 / Durchschnitt; schwimmen steinhart; Steinhart =Durchschnitt / 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; // Steinhart invertieren -=273,15; // Celsius-Konvertierung int tmp =round(steinhart); lcd.printNumI(tmp, 60, 1, 2); lcd.print(F("~C"), 72, 1);} /// Aktualisieren Sie den ServiceName-Text auf dem LCD-Display im RDS-Modus.void DisplayServiceName(char *name){ lcd.print(name, 18, 22);}void DisplayText(char *text){//scrollen Sie die zweite RDS-Zeile 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) { //überprüft, ob die Displaytaste gedrückt wurde 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(); Schalter (dw) { Fall 0:lcd.print (F ("Sekmadienis"), CENTER, 30); // Sonntag F() Makro zum Speichern der SDRAM-Pause; Fall 1:lcd.print (F ("Pirmadienis"), CENTER, 30); //Montag usw... Pause; Fall 2:lcd.print(F("Antradienis"), CENTER, 30); brechen; Fall 3:lcd.print(F("Treciadienis"), MITTE, 30); brechen; Fall 4:lcd.print(F("Ketvirtadienis"), CENTER, 30); brechen; Fall 5:lcd.print(F("Penktadienis"), CENTER, 30); brechen; Fall 6:lcd.print(F("Sestadienis"), CENTER, 30); brechen; } lcd.update(); Verzögerung (4000); // nicht optimal ClearRDS (); dspl =0; }}void printMode(){ lcd.print(F("MODE"), 0, 41);}void printMenu(){ if (menu ==1) { lcd.print(F("VOLUME"), 30, 41); wenn (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); wenn (Bass ==0) {lcd.print (F ("OFF"), 66, 41); aufrechtzuerhalten. Sonst lcd.print (F ("ON"), 66, 41); }}void printFreq () // zeigt die aktuelle Frequenz an { Int frHundr, frDec; unsigned int fr; fr =870 + Frequenz; 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) { //wenn die MEM-Taste gedrückt wurde lcd.print(F("MEM>"), 0 , 12); } //Stereo-Erkennung else if ((status[0] &0x0400) ==0) lcd.print(F("( )"), 0, 12); // bedeutet MONO sonst lcd.print (F ("(ST)"), 0, 12); //bedeutet STEREO}void search(byte direc) //automatische Suche{Byte i; // nach oben oder unten suchen if (!direc) WriteReg(0x02, 0xC30d); sonst WriteReg(0x02, 0xC10d); für (i =0; i <10; i++) { Verzögerung (200); Readstatus(); if (status[0] &0x4000) { Häufigkeit =status[0] &0x03ff; brechen; aufrechtzuerhalten. aufrechtzuerhalten. NummerH =Kanal>> 2; ZahlL =((Kanal &3) <<6 | 0x10); Wire.beginTransmission(0x11); Wire.write (0x03); Wire.write (NummerH); // Frequenz in Bits 15:6 schreiben, Tune-Bit setzen Wire.write (numberL); Wire.endTransmission();}//RDA5807_adrs=0x10;// I2C-Address RDA Chip für sequentiellen Accessint Readstatus(){ Wire.requestFrom(0x10, 12); for (int i =0; i <6; i++) { status[i] =256 * Wire.read () + Wire.read(); aufrechtzuerhalten. Wire.write (reg); Wire.write (Tapferkeit>> 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);}// Einige spezielle Ereignisse berücksichtigen.void keyboardEvent(KeypadEvent key, KeyState kpadState ) { switch (kpadState) { /* Eine andere Möglichkeit, die Zeit einzustellen:1. Drücken und halten Sie Taste D mindestens 2 Sek. lang drücken, wenn Sie die Zeitsignale für das Stundenende hören oder die Sekunden der letzten Stunde auf einer genauen Uhr sehen. 2. Taste D loslassen, um hh.00.00 einzustellen. 3. Nach der Einstellung, wenn Ihre Uhr von 15 auf 1 Minute verspätet war, werden Minuten und Sekunden auf 00 gesetzt und Stunden um 1 erhöht. 4. Wenn Ihre Uhr von 1 auf 15 Minuten eilig war, werden nur Minuten und Sekunden auf 00 gestellt */ case HOLD:if (key =='D' &&power_state ==1) { adj =1; } brechen; 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; } brechen; Fall GEDRÜCKT:if (Taste =='M' &&power_state ==1) { memdisplay =0; Menü++; if (Menü> MAXmenü)Menü =1; } if (key =='>' &&power_state ==1) { memdisplay =0; Schalter (Menü) { Fall 1:Wenn (Lautstärke <0) { Wenn (Bass ==0) { WriteReg (0x02, 0xD00D); Volumen =0; } if (Bass ==1) { WriteReg (0x02, 0xC00D); Volumen =0; } } sonst Volumen++; if (Volumen> 15)Volumen =15; brechen; Fall 2:Suche(0); ClearRDS(); brechen; Fall 3:Frequenz++; wenn (Frequenz> 210)Frequenz =210; // obere Frequenzgrenze ClearRDS (); brechen; Fall 4:if (Bass ==0) { Bass =1; WriteReg(0x02, 0xD00D); } brechen; } } if (key =='<' &&power_state ==1) { memdisplay =0; Schalter (Menü) { Fall 1:Lautstärke--; if (Volume <0) { WriteReg (0x02, 0x800D); // Lautstärke =0; } brechen; Fall 2:Suche(1); ClearRDS(); brechen; Fall 3:Häufigkeit--; wenn (Frequenz <0)Frequenz =0; ClearRDS(); brechen; Fall 4:Wenn (Bass ==1) {Bass =0; WriteReg(0x02, 0xC00D); } brechen; aufrechtzuerhalten. ledPin_state =digitalRead (ledPin); // Erinnern Sie sich an den LED-Zustand, beleuchtet oder nicht. } // schaltet "Power" ein oder aus (Stand-by-Modus) if (key =='P') { digitalWrite (blPin, ! digitalRead (blPin)); power_state =digitalRead (blPin); if (power_state ==0) {lcd.enableSleep(); digitalWrite (ledPin, LOW); } sonst lcd.disableSleep(); Volumen =2; Menü =1; } if (key =='1' &&power_state ==1) { switch (memdisplay) { case 0:frequency =mem.readInt(110); ClearRDS(); brechen; Fall 1:mem.writeInt(110, Frequenz); Speicheranzeige =0; brechen; } } if (key =='2' &&power_state ==1) { switch (memdisplay) { case 0:frequency =mem.readInt(120); ClearRDS(); brechen; Fall 1:mem.writeInt (120, Häufigkeit); Speicheranzeige =0; brechen; } } if (key =='3' &&power_state ==1) { switch (memdisplay) { case 0:frequency =mem.readInt(130); ClearRDS(); brechen; Fall 1:mem.writeInt (130, Häufigkeit); Speicheranzeige =0; brechen; } } if (key =='4' &&power_state ==1) { switch (memdisplay) { case 0:frequency =mem.readInt(140); ClearRDS(); brechen; Fall 1:mem.writeInt(140, Häufigkeit); Speicheranzeige =0; brechen; } } if (key =='5' &&power_state ==1) { switch (memdisplay) { case 0:frequency =mem.readInt(150); ClearRDS(); brechen; Fall 1:mem.writeInt(150, Häufigkeit); Speicheranzeige =0; brechen; } } if (key =='6' &&power_state ==1) { switch (memdisplay) { case 0:frequency =mem.readInt(160); ClearRDS(); brechen; Fall 1:mem.writeInt(160, Frequenz); Speicheranzeige =0; brechen; } } if (key =='m' &&power_state ==1) { mempress =1; aufrechtzuerhalten. Sonst { Mempress =0; } if (Schlüssel =='I' &&power_state ==1) { dspl =1; } brechen; }}
SignalstärkesymboleC/C++
#if definiert(__AVR__) #include  #define Bilddatentyp const uint8_t#elif definiert(__PIC32MX__) #define PROGMEM #define Bilddatentyp const unsigned char#elif definiert(__arm__) #define PROGMEM . #define Bilddatentyp const unsigned char#endifimagedatatype signal5[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xFC, 0xFEC (16), // 0xFEC , };Bilddatentyp signal4[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xFC, 0xC0 (16), // 0x00 };Bilddatentyp signal3[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0 (16), // 0x0010, Pixel, // 0x0010;imagedatatype signal2[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, // 0x0010, (16)} Pixel imagedatatype signal1[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, // 0x0010 (16) Pixel0xC0, };

Schaltpläne


Herstellungsprozess

  1. Radio
  2. Integrierter Schaltkreis
  3. JX-Wellengenerator
  4. MotionSense
  5. PuzzleBox
  6. Duschregler
  7. Drahtloser IR-Temperaturscanner
  8. WalaBeer Tank
  9. Mikrocontroller-Labor
  10. MOSMusic