Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Einarbeitung in Nextion Displays
#41
meine neueste Simulation hab ich etwas anders gestaltet. Aber lasst es euch im Video erklären. Stefan von Microsoft spricht dazu (danke Wilhelm für den Tipp!).



die Skala in 480x320px zur freien Verwendung:


.jpg   roland-brandt-480-320.jpg (Größe: 38,9 KB / Downloads: 152)

die entsprechenden code-Schnitzel:

die subroutine für die Skalenzeigerzeichnung und die Bewegung:

Code:
void nextion(void)
{
if (xpos>xposneu)
{
xpos-=1;
Serial.print("fill ");
Serial.print(xpos);
Serial.print(",30,5,250,RED");
Serial.write(NexT,3);

//Lösche Bereich links vom Zeiger
Serial.print("xpic 80,30,");
Serial.print(xpos-80);
Serial.print(",250,80,30,0");
Serial.write(NexT,3);

//Lösche Bereich rechts vom Zeiger
Serial.print("xpic ");
Serial.print(xpos+5);
Serial.print(",30,");
Serial.print(385-xpos);
Serial.print(",250,");
Serial.print(xpos+5);
Serial.print(",30,0");
Serial.write(NexT,3);
}
 
if (xpos<xposneu)
{
xpos+=1;
Serial.print("fill ");
Serial.print(xpos);
Serial.print(",30,5,250,RED");
Serial.write(NexT,3);

//Lösche Bereich links vom Zeiger
Serial.print("xpic 80,30,");
Serial.print(xpos-80);
Serial.print(",250,80,30,0");
Serial.write(NexT,3);

//Lösche Bereich rechts vom Zeiger
Serial.print("xpic ");
Serial.print(xpos+5);
Serial.print(",30,");
Serial.print(385-xpos);
Serial.print(",250,");
Serial.print(xpos+5);
Serial.print(",30,0");
Serial.write(NexT,3);
}
}

die Berechnung der neuen X-Position bei einer channel-Änderung:

Code:
...
radio.setChannel(channel);
xposneu=map(channel,875,1080,80,380);
...

und dann noch die Einblendung von Frequenz (channel) als Text und RDS-Information (PS) als scrolling Text:

Code:
 Serial.print("t0.txt=\"");
 Serial.print(channel/10.);
 Serial.print("MHz");
 Serial.write('"');
 Serial.write(NexT,3);

 Serial.print("g0.txt=\"");
 Serial.print(PS);
 Serial.write('"');
 Serial.write(NexT,3);
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#42
Hallo Jupp,

das im Video erwähnte Problem, dass man mit einem Encoder zur Einstellung der Frequenz sich tot kurbelt, liegt doch nur daran, wie die Encoder behandelt werden. Wennn man die Frequenzschritte in Abhängigkeit der Encoder-Drehgeschwindigkeit (Impulse pro Zeiteinheit) entsprechend automatisch dynamisch anpasst (mehr Impulse je Zeitenheit ergibt größere Frequenzschritte, weniger Impulse dann kleinere bis feinste Frequenzschritte), erhält man eine viel komfortablere Abstimmung als man es vom klassischen Radio gewohnt ist. Muss nur mal jemand entsprechend programmieren.

Gruß

(Reflex-)Kalle
Zitieren
#43
Hallo Kalle,
ich zeige mal den hier verwendeten code zur Decoderabfrage:

Code:
if (digitalRead(0) == CHANGE)
{
// Read elapsed time
  currentTime = millis();
  // Check if it's time to read
  if(currentTime >= (lastTime ))
  {
    // read the two pins
    encA = digitalRead(pinA);
    encB = digitalRead(pinB);
    // check if A has gone from high to low
    if ((!encA) && (lastA))
    {
      // check if B is high
      if (encB)
      {
        // clockwise
        if (channel + changeamnt <= highest)
        {
          channel = channel + changeamnt;        
        }
      }
      else
      {
        // anti-clockwise
        if (channel - changeamnt >= lowest)
        {
          channel = channel - changeamnt;
        }
      }
     SI4703_clearRDS();
    }
    // store channel of A and millis for next loop
    lastA = encA;
    lastTime = currentTime;
  }

da gibt es für mich Ungereimtheiten die ich versucht habe zu recherchieren und noch zu keinem Ergebnis gekommen bin. Da wäre erst mal die 1. Zeile:

if (digitalRead(0) == CHANGE)

Pins werden grundsätzlich über Variablen abgefragt und ein Pin nicht mitten im code absolut angesprochen. Also kann die 0 kein Pin sein. Und den Zustand change kenne ich für Digitalpins nicht, sondern nur im Zusammenhang mit der Flankenbehandlung bei ISR-Routinen. Diese Bedingung legt jedenfalls fest wann der Decoder abgefragt werden kann. Wenn man einfach schneller dreht werden die Impulse verschluckt, die nicht in dieses lahme Zeitraster passen.

Das zweite was mir nicht einleuchtet ist die Art wie die millis hier eingebaut sind. Es gibt keinen definierten Differenzwert zwischen lastTime und currentTime, so daß die millis hier gar nicht zur Entprellung eingesetzt werden. Es wird nur abgefragt ob gleich oder unterschiedlich, aber nicht ob eine bestimmte Anzahl Millisekunden verstrichen sind. Wo liegt dann der Sinn?

Vielleicht liegt hier das Abstimmproblem. Vielleicht hab ich das durch meine Aufteilung der Digitalpin's selbst verbockt. Dass die 0 vielleicht ein Interruptvektor ist der nicht auf alle Pin's anwendbar ist (ich benutze D7 und D8 für den Encoder). Natürlich wäre es einfach auf einen verständlicheren code auszuweichen, es finden sich ja genügend im Netz und bei den libraries. An dem hier halte ich halt fest weil ich damit zum erstenmal funktionierendes RDS auf das Display bekommen habe.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#44
Hallo Jupp,
Zitat
if (digitalRead(0) == CHANGE)
Pins werden grundsätzlich über Variablen abgefragt und ein Pin nicht mitten im code absolut angesprochen.
Also kann die 0 kein Pin sein.
Zitat Ende

Kannst Du bitte einmal das ganze Projekt posten oder mir per E-Mail senden?
Grüße aus Wassenberg,
Norbert.
Zitieren
#45
norbert_w schrieb:..Kannst Du bitte einmal das ganze Projekt posten oder mir per E-Mail senden?

mach ich, Norbert. Ich will in diesem thread auch nicht so weit von den displays wegdriften.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#46
An alle Nextion interessierten Mitleser,
gestern wollte ich eine neue .tft Datei mittels SD-Card im Display installieren.
Das Hochladen der Datei wurde vom Nextion abgebrochen.
Es erschien die Fehlermeldung auf dem Display "No Find File".
Danach konnte ich machen was ich wollte (SD-Card neu formatiert, andere SD-Card mit Projekt Datei) alles leider ohne Erfolg.

Nach ausgiebiger Recherche im Netz machte ich folgendes:
- erstellen eines neuen, leeren Projekts in dem nur die Basis Daten des Displays (Typ und Ausrichtung des Bildschirms) stehen
- speichern des Projektes als .tft Datei auf SD-Card
- einlesen der SD-Card mit dem Nextion

Das Lesen der „leeren" Datei scheint wie ein Reset zu wirken.
Danach kann, zumindest in meinem Fall, wieder wie gehabt neue Projekte übertragen werden.

Ich hoffe mit diesem kleinen Beitrag Leuten helfen kann, bei denen eventuell der gleiche Fehler aufgetreten ist.
Grüße aus Wassenberg,
Norbert.
Zitieren


Gehe zu: