Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Sonstiges » Hilfe bei Arduino-Programm » Themenansicht

Autor Thread - Seiten: -1-
000
Heute, 13:05 Uhr
wolle1945



Hallo,
ich suche jemanden, der mir ein kleines Programm kommentiert
und dann per eMail zuschicken könnte.

#include <Wire.h>
#include <RDA5807.h>
#include <LiquidCrystal_I2C.h>
RDA5807 radio = RDA5807();
LiquidCrystal_I2C LCD(39, 16, 2);
float frequency = 0;
int fUP = A0;
int fDOWN = A1;
int count = 0;
void setup() {
delay(1000);
Wire.begin();
radio.setup();
frequency = 88.0; //starting frequency
radio.setFrequency(frequency);
radio.setVolume(10);
LCD.begin(16, 2);
LCD.clear();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("FM: ");
LCD.setCursor(0, 1);
LCD.print(frequency); LCD.print(" Mhz");
}
void loop()
{
delay (10000);if (digitalRead(fUP))
{
count = 0;
while (digitalRead(fUP))
{
count++;
if (count > 0 && count <= 6)
{
frequency += 0.1;
frequencyUpdate();
delay(2000);
}
else if (count > 6 && count <= 2)
{
frequency += 0.1;
frequencyUpdate();
delay(800);
}
else
{
frequency += 0.1;
frequencyUpdate();
delay(50);
}
}
}
if (digitalRead(fDOWN))
{
count = 0;
while (digitalRead(fDOWN))
{
count--;
if (count < 0 && count >= -6)
{
frequency -= 0.1;
frequencyUpdate();
delay(2000);
}
else if (count < -6 && count >= -12) {
frequency -= 0.1;
frequencyUpdate();
delay(800);
}
else {
frequency -= 0.1;
frequencyUpdate();
delay(50);
}
}
}
}
//this function changes the frequency of the station, is called by preset and frequency up/down conditions.
void frequencyUpdate()
{
frequency = constrain(frequency, 88.0, 108.0);
LCD.setCursor(0, 0);
LCD.print("Radio Search:");
LCD.setCursor(0, 1);
LCD.print(frequency); LCD.print("Mhz");
radio.setFrequency(frequency);
}

Die Initialisierung und Setup zu Beginn verstehe ich soweit, bis auf float frequency
und Wire.begin()
Für den gesamten loop-Teil hätte ich gerne eine Zeilenweise kommentierung.
Ich verstehe den Ablauf if und else nicht. Wozu dient count?
Ich würde gerne das Programm verstehen. Mein technischer Aufbau durchsucht
das FM-Frequenzband von 88.0 bis 108.0 ohne Halt bei gefundenem Sender.
--
mfG wolle1945
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
Heute, 13:59 Uhr
wpwsaw
Default Group and Edit


...mal ganz kurz

float frequency - float ist der Typ der Variablen frequency
wire.begin() ist der Start der wire Bibliothek für I2C für das LCD Display und RD....Modul
count ist die Zählvariable für die if-Schleife
if else while ist für die Zählrichtung count++ oder count-- je nach dem ob die Frequenz aufwärts oder abwärts sucht.

warum er nicht anhält wenn ein Sender gefunden wurde ? dazu müsste man die RDA5807.h Bibliothek untersuchen, denn die wird ja bei der Suche nach Sendern benutzt


wie gesagt schnell mal überflogen

wpw
--
RECORD, CRN1; CRN2; PicoDat; LC80; Poly880; KC85/2,3,4,5 ; KC87; Z1013; BIC; PC1715; K8915; K8924; A7100; A7150; EC1834; und P8000 ab jetzt ohne Tatra813-8x8 aber mit W50LA/Z/A; P3; ES175/2 und Multicar M25 3SK; Barkas B1000 HP

Dieser Beitrag wurde am 29.03.2026 um 18:33 Uhr von wpwsaw editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
Heute, 16:07 Uhr
Ordoban



Ok, dann versuch ichs mal:
Zuerst stellen wir das mit der richtigen Einrückung dar. Dadurch kann man erkennen welches { zu welchem } gehört; die sollten den selben Abstand zum Rand haben.

Quellcode:

void loop()
{
    delay (10000);
    
    if (digitalRead(fUP))
    {
        count = 0;
        while (digitalRead(fUP))
        {
            count++;
            if (count > 0 && count <= 6)
            {
                frequency += 0.1;
                frequencyUpdate();
                delay(2000);
            }
            else if (count > 6 && count <= 2)
            {
                frequency += 0.1;
                frequencyUpdate();
                delay(800);
            }
            else
            {
                frequency += 0.1;
                frequencyUpdate();
                delay(50);
            }
        }
    }

    if (digitalRead(fDOWN))
    {
        count = 0;
        while (digitalRead(fDOWN))
        {
            count--;
            if (count < 0 && count >= -6)
            {
                frequency -= 0.1;
                frequencyUpdate();
                delay(2000);
            }
            else if (count < -6 && count >= -12)
            {
                frequency -= 0.1;
                frequencyUpdate();
                delay(800);
            }
            else
            {
                frequency -= 0.1;
                frequencyUpdate();
                delay(50);
            }
        }
    }
}



Man erkennt schon, dass es hier 2 sehr ähnliche Blöcke gibt: if (digitalRead(fUP)) und if (digitalRead(fDOWN))
Der eine behandelt die Frequenz-Erhöhung, der andere die Frequenz-Reduzierung.
Das innere dieser Blöcke wird nur ausgeführt, wenn der Digital Eingang 1 ist bzw. die Taste gedrückt ist.
Innerhalb dieses IF-Blocks wird als erstes die count-Variable auf 0 gesetzt und dann gibt es einen while (digitalRead(fUP)) Block. Dieser Block wird solange wiederholt bis der Digital Eingang nicht mehr 1 ist bzw. die Taste losgelassen wird. Innerhalb des While-Blocks wird bei jeder Wiederholung der counter erhöht bzw. reduziert. Und je nachdem in welchem Bereich der counter dann steht, wird die Frequenz erhöht/reduziert, in die Hardware+LCD geschrieben und eine Zeit gewartet. Die Wartezeit ist dabei der einzige Unterschied zwischen den count-Bereichen.
Das Ganze stellt also eine Tasten-Wiederholung dar, die in 2 Stufen schneller wird wenn man die Taste länger gedrückt hält.
--
Gruß
Stefan
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
Heute, 16:18 Uhr
Ordoban



Ergänzung:
Hier haben wir einen logischen Fehler

Quellcode:

else if (count > 6 && count <= 2)


count kann nie gleichzeitig größer als 6 und kleinergleich als 2 sein. Die Wirkung dieses Fehlers dürfte sein, dass die Tastenwiderholung nur einmal schneller wird statt wie beabsichtigt 2 mal.
Bei der anderen Richtung passt das:

Quellcode:

else if (count < -6 && count >= -12)


--
Gruß
Stefan

Dieser Beitrag wurde am 29.03.2026 um 16:19 Uhr von Ordoban editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
Heute, 19:13 Uhr
wolle1945



@Ordoban,
so langsam verstehe ich das Ganze.
Ich habe das Programm aus dem Internet und mit count <= 12 korrigiert.
Ich mußte die Wartezeiten verlängern damit der RDA5807 reagieren kann.
Nur noch ein Problem, denn der Suchlauf beginnt nach 5 sec. , ohne
anzuhalten, er sollte doch erst nach Tastenbetätigung starten und nur
für 1x, dann Taste wieder Drücken für 1x.
Die Pin A0 un A1 sind laut Schaltplan: Widerstand 10 kOhm gegen Masse
und zum anderen über Tastenöffner an 5 P angeschlossen.
Im Ruhezustand also Potential 5 P, bei Tastenöffnung Masse über 10 kOhm.
--
mfG wolle1945
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
Heute, 19:29 Uhr
Ordoban




Zitat:
wolle1945 schrieb
Die Pin A0 un A1 sind laut Schaltplan: Widerstand 10 kOhm gegen Masse
und zum anderen über Tastenöffner an 5 P angeschlossen.
Im Ruhezustand also Potential 5 P, bei Tastenöffnung Masse über 10 kOhm.


Öffner? Ruhezustand 5V? Vom Programm her müsste Ruhezustand 0V sein.
Damit ist klar, warum sofort der Suchlauf beginnt: das Ding denkt dass du die Taste gedrückt hälst, obwohl das nicht so ist. Also entweder Schließer einbauen, oder Taster und Widerstand vertauschen, oder das Signal im Programm negieren mit "!" vor allen digitalRead.
--
Gruß
Stefan
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
Heute, 19:58 Uhr
wolle1945



Schließer eingebaut, läuft Alles super.

vielen Dank an die Beteiligten.
--
mfG wolle1945
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Sonstiges ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek