Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
FAQ zum iRadioMini
Lieb von dir, Bernhard! Warten ist kein Problem.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
So Jupp, da bin ich wieder.

Dein Display ist heute angekommen und ich konnte alles aufbauen.

Zunächst einmal habe ich den Treiber in menuconfig auf den PCD8544 abgeändert und weil dieser nach Datenblatt nicht der schnellste ist, die SPI-Busgeschwindigkeit auf "niedliche" 1 MHz runtergesetzt.


.jpg   1.jpg (Größe: 20,13 KB / Downloads: 179)

Die Verkabelung ist jetzt beispielhaft, kann abweichen, sofern keine Ressourcenkonflikte mit anderen Bauteilen und/oder Daemonen (gpiod, ...) bestehen.


.jpg   2.jpg (Größe: 12,07 KB / Downloads: 180)

Im displayd_code noch die Auflösung gesetzt

  lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);

 
    disp_drv.hor_res  = 84;
    disp_drv.ver_res  = 48;

    disp_drv.flush_cb = disp_driver_flush;

kompiliert, geflashed und .... bam. Genau das gleiche Bild wie bei Dir!

Ich bin dann nochmal die Verkabelung durchgegangen, sollte man immer 2x / 3x prüfen - war aber alles in Ordnung.
Dann bin ich nochmal in den Initialisierungscode gegangen und dann kam mir etwas seltsam vor:



#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820        \
    || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A    \
    || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D    \
    || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306   

    /* Actual size in pixels, not bytes. */
    size_in_px *= 8;
#endif

    /* Initialize the working buffer depending on the selected display.
    * NOTE: buf2 == NULL when using monochrome displays. */
    lv_disp_draw_buf_init(&disp_buf, buf1, buf2, size_in_px);

    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);

 
    disp_drv.hor_res  = 84;
    disp_drv.ver_res  = 48;

    disp_drv.flush_cb = disp_driver_flush;

Hier fehlt doch was -> nämlich dein PCD8544 Treiber, der doch genau auch diesen Codeteil benötigt.  Das haben die in der LVGL-Beispielschablone für die Initialisierung, die man für eigenen Anwendungen kopieren soll wohl vergessen. Nun gut, füge ich es manuell hinzu:

#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820        \
    || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A    \
    || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D    \
    || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306    \
    || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544

    /* Actual size in pixels, not bytes. */
    size_in_px *= 8;
#endif

    /* Initialize the working buffer depending on the selected display.
    * NOTE: buf2 == NULL when using monochrome displays. */
    lv_disp_draw_buf_init(&disp_buf, buf1, buf2, size_in_px);

    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);

 
    disp_drv.hor_res  = 84;
    disp_drv.ver_res  = 48;


Kompilieren, flashen und bitte:


.jpg   3.jpg (Größe: 17,9 KB / Downloads: 180)

Gut dieser displayd_code zeigt schon eine "zurechtgerückte" Ausgabe der Elemente, weil dein Display dann doch nochmal viel geringer auflöst, als das SSD1306 welches ich gestern als Beispiel gezeigt habe:

Den gesamten displayd_lvgl.c hast Du hier:


Code:
#include "displayd_lvgl.h"
#include "globals.h"
#include "messages.h"

#include <esp_log.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>


static const char *TAG = "DISPLAYD_LVGL";
int old_ch = -1;

void lvgl_tick(void *pvParameters) {
while(1)
    {
         lv_task_handler();
         lv_tick_inc(LV_TICK_PERIOD_MS);
         vTaskDelay(LV_TICK_PERIOD_MS/portTICK_PERIOD_MS );
    }
}

void displayd_lvgl(void *pvParameters) {
   // Messagequeues
   struct ADisplaydMessage *rxMsg; // -> vom Playerprozess
   struct AMessage *txMsg;         // -> zum Playerprozess
   static uint32_t size_in_px = DISP_BUF_SIZE;
/////////////////////////////////// lib & driver init //////////////////////////////////////////
   lv_init();
   lvgl_driver_init();

   lv_color_t* buf1 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);
   assert(buf1 != NULL);

   /* Use double buffered when not working with monochrome displays */
#ifndef CONFIG_LV_TFT_DISPLAY_MONOCHROME
    lv_color_t* buf2 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);
    assert(buf2 != NULL);
#else
    static lv_color_t *buf2 = NULL;
#endif


#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820         \
    || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A    \
    || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D     \
    || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306     \
    || defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_PCD8544

    /* Actual size in pixels, not bytes. */
    size_in_px *= 8;
#endif

    /* Initialize the working buffer depending on the selected display.
     * NOTE: buf2 == NULL when using monochrome displays. */
    lv_disp_draw_buf_init(&disp_buf, buf1, buf2, size_in_px);

    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);

   
    disp_drv.hor_res  = 84;
    disp_drv.ver_res  = 48;

    disp_drv.flush_cb = disp_driver_flush;

    /* When using a monochrome display we need to register the callbacks:
     * - rounder_cb
     * - set_px_cb */
#ifdef CONFIG_LV_TFT_DISPLAY_MONOCHROME
    disp_drv.rounder_cb = disp_driver_rounder;
    disp_drv.set_px_cb = disp_driver_set_px;
#endif

    disp_drv.draw_buf = &disp_buf;
    lv_disp_drv_register(&disp_drv);

    /* Register an input device when enabled on the menuconfig */
#if CONFIG_LV_TOUCH_CONTROLLER != TOUCH_CONTROLLER_NONE
    lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);
    indev_drv.read_cb = touch_driver_read;
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    lv_indev_drv_register(&indev_drv);
#endif

/////////////////////////////////// END: lib & driver init //////////////////////////////////////////


   /* Get the current screen  */
   lv_obj_t * scr = lv_disp_get_scr_act(NULL);


   /*Create a widgets on the currently active screen*/
   lv_obj_t * label_prog =  lv_label_create(scr);
   lv_obj_align(label_prog, LV_ALIGN_CENTER, -5, -10);
   lv_label_set_text(label_prog,"P");

   lv_obj_t * label_prog_num =  lv_label_create(scr);
   lv_obj_align(label_prog_num, LV_ALIGN_CENTER, 5, -10);
   
   lv_obj_t * label_url =  lv_label_create(scr);
   lv_label_set_long_mode(label_url, LV_LABEL_LONG_SCROLL_CIRCULAR);
   lv_obj_set_width(label_url,250);
   lv_obj_align(label_url, LV_ALIGN_LEFT_MID, 0, 5);

   char buffer[10];
   
   TaskHandle_t xlvglTickHandle = NULL;
   xTaskCreate( lvgl_tick, "lvgl_tick", 4096, NULL , tskIDLE_PRIORITY, &xlvglTickHandle );
   configASSERT(xlvglTickHandle);

   // Daemonbetrieb
   while(1)
    {
       xMessage.ucMessage = GET_CHANNEL_INFO;
       txMsg = &xMessage;
       xQueueSend( xPlayerQueue, ( void * ) &txMsg, ( TickType_t ) 0 );

       if( xQueueReceive( xDisplaydQueue, &( rxMsg ), ( TickType_t ) 10 )  )
          {
            if (rxMsg->ucMessage==GET_CHANNEL_INFO) {
        ESP_LOGI(TAG, "actual channel num: %i",rxMsg->iChannelNum);
   
                if (old_ch!=rxMsg->iChannelNum) {

                  itoa(rxMsg->iChannelNum,buffer,10);
                  lv_label_set_text(label_prog_num, buffer);
                  lv_label_set_text(label_url, rxMsg->ucURI);     
       
                } // if (old_ch!=rxMsg->iChannelNum) {
           old_ch = rxMsg->iChannelNum;

            }
        }
   
        ESP_LOGI(TAG, "Heartbeat");     
        vTaskDelay(1000/portTICK_PERIOD_MS );
    }

  if (xlvglTickHandle)
     vTaskDelete(xlvglTickHandle);

  vTaskDelete(NULL);
}


Das kannst Du dann noch so hinrücken wie Du es haben willst. Du kannst auch zusätzliche Grafikprimitiven (Linien, Kästen, ...) zeichnen.  Die Widgets findest Du hier in der Doku: https://docs.lvgl.io/master/widgets/core/index.html

Wenn Du andere Schriften/Schriftgrößen nutzen willst, denke daran, diese erst in menuconfig zu aktivieren!

Gruß
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
Mensch Bernhard, das war ja eine tolle Aktion!

Ich habe es mit 4MHz laufen. Die Schrift-Positionierung werde ich evtl. noch etwas korrigieren.

   

Bernhard45 schrieb:..Ich bin dann nochmal die Verkabelung durchgegangen, sollte man immer 2x / 3x prüfen - war aber alles in Ordnung..

Die Anschlussbezeichnungen finde ich sehr verwirrend, bzw. sie sind nicht einheitlich. Deshalb habe ich mir eine Tabelle erstellt


.jpg   nokia-tabelle.JPG (Größe: 35,92 KB / Downloads: 168)
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

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

in dem angehängten Code habe ich die Elemente schon etwas passender zurecht gerückt. Ja bei den Bezeichnungen druckt auch jeder was anderes rauf.
DIN = Data In, nichts anderes als MOSI = Master out Slave in (also ESP32 raus Display rein) usw.
Bei CS = Chip Select bzw. CE = Chip Enable kannst Du dir den Pin am ESP32 auch sparen, wenn das Display das einzige Bauteil am SPI-Bus ist. Ich habe CS ja in menuconfig gar nicht belegt und den Displayanschluß auf Masse gelegt. Im Gegensatz zu I2C haben die Geräte bei SPI ja keine "virtuelle" Busadresse, brauchen also noch einen CS ( Tritt in den Hintern-Pin ), damit Sie wissen das die Nachricht auf dem Bus für Sie gedacht ist. Fällt bei einem Busteilnehmer weg, denn alle Nachrichten gehen ja nur an den einen Teilnehmer.

Baust Du jetzt Nokia 5110 mit Internetradios neu auf? Müsste eigentlich alles reinpassen.

Gruß
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
ja so ist es besser. Das ist ja schon eine richtig schön nostalgische Anzeige. Wenn man mit den alten Telefonen und grob gepixelten Grafiken aufgewachsen ist :-)

   

Zitat:Baust Du jetzt Nokia 5110 mit Internetradios neu auf?

ich will nicht spoilern, aber nein, ein Internet-Telefon wird es nicht.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
Hallo Euch allen!
Vor einiger Zeit wollte ich das Framework updaten, erhielt allerding eine Fehlermeldung. Heute habe ich es erneut versucht und erhalte das:
PHP-Code:
hans@hans-Aspire-5742G:~/esp-adf/esp-idf git fetch
remote
Enumerating objects6684done.
remoteCounting objects100% (3821/3821), done.
remoteTotal 6684 (delta 3820), reused 3821 (delta 3820), pack-reused 2863
Empfange Objekte
100% (6684/6684), 2.61 MiB 2.75 MiB/sfertig.
Löse Unterschiede auf100% (5020/5020), abgeschlossen mit 1428 lokalen Objekten.
Von https://github.com/espressif/esp-idf
   229ed08484..aab535fe4a  master       -> origin/master
   2ed96858a5
..23e8233506  release/v4.1 -> origin/release/v4.1
   d503c23d7a
..cc230188ea  release/v4.2 -> origin/release/v4.2
   040ae4ac72
..79c9a043f2  release/v4.3 -> origin/release/v4.3
   000d3823bb
..c29343eb94  release/v4.4 -> origin/release/v4.4
 
* [neues Tag]             v4.2.3       -> v4.2.3
Anfordern des Submoduls components
/esptool_py/esptool
Von https
://github.com/espressif/esptool
   8fa1f76..4f8e646  master     -> origin/master
Anfordern des Submoduls components
/lwip/lwip
Von https
://github.com/espressif/esp-lwip
   1c9cd9c1..76303df2  2.1.2-esp  -> origin/2.1.2-esp
Anfordern des Submoduls components
/mbedtls/mbedtls
Von https
://github.com/espressif/mbedtls
 
* [neuer Branch]        mbedtls-3.1.0-idf -> origin/mbedtls-3.1.0-idf
Anfordern des Submoduls components
/mqtt/esp-mqtt
Von https
://github.com/espressif/esp-mqtt
   08ce9ed..4874bab  master     -> origin/master
fatal
Fehler am anderen Endeupload-packnot our ref 284d235f286fc57fd0f73b37d993be7b784ca591
Fehler während des Anforderns der Submodule
:
    
components/mbedtls/mbedtls 

Hm, jetzt stehe ich mal wieder am Schlauch...

Viele Grüße
Hans
Zitieren
Guten Tag.

Mit dem IRadio auf dem ESP könnte man doch einen super Radiotester aufbauen. Das 9850 Modul hat doch einen Sinus und Rechteckausgang den man in der Software sweepen kann. Ein Triggerimpuls kann der ESP sicher auch erzeugen. Ein Frequenzzähler ist auch schon dank Bernhard drin. Eine externe Modulation kann man aufschalten. Eine interne Modulation kann der ESP machen. Und wenn man die alten Radios stilecht versorgen will muss man nur das sowieso eingebaute Internetradio aktivieren. Wer kann den für so etwas eine grafische Nutzeroberfläche bauen? Mit jeweils mehreren Tabs für die einzelnen Funktionen? Wäre das sehr schwer oder aufwendig in Lvgl ?

MfG BalticSea
Zitieren
Ģibt es denn noch eine Antwort und wie geht es weiter?

Mit freundlichen Grüßen BalticSea
Zitieren
Der "Kapitän" entschuldigt, wenn nicht sofort nach seiner Pfeife getanzt wird! Allerdings hätte ich in dieser Position auch Personen erwartet, die etwas mehr auf dem Kasten haben und sich ggf. auch Wissen selbst anlesen können. Aber ich überschätze wohl oft die Möglichkeiten mancher Mitleser.

Ich versuche mal in Ihrer Art zu antworten:

(16.03.2022, 10:42)BalticSea schrieb: Wer kann den für so etwas eine grafische Nutzeroberfläche bauen?

Ich kann es, aber ich tue es nicht! Ihr Wunschgerät fertig zu entwickeln, ist nicht meine Baustelle! 

(16.03.2022, 10:42)BalticSea schrieb: Mit jeweils mehreren Tabs für die einzelnen Funktionen?
Wäre das sehr schwer oder aufwendig in Lvgl ?

Für mich nicht, für andere Mitleser vielleicht auch nicht.

Für Sie, der etwas in LVGL entwickeln möchte (oder sollte ich sagen, fertig entwickelt haben möchte?) und dabei nicht einmal auf die Idee kommt, die LVGL-Dokumentation https://docs.lvgl.io/master/index.html mit genau für solche Fragen existierenden Beispielcode https://docs.lvgl.io/master/examples.html#tabview durchzuarbeiten, könnte die Sache schwierig bis unmöglich werden! -> RTFM!

Wenn Sie eine GUI (zur Not mit Papier/Bleistift) fertig designed haben und bei der Umsetzung mit einem LVGL-Widget Probleme haben, zeigen Sie hier den Code und Ihnen wird an dieser Stelle geholfen. Das gleiche gilt auch für die "Zweckentfremdung" und Ansteuerung der iRadioMini Module.

Wenn ich aber Ihr gesamtes Gerät mit Nutzerinterface, ... entwickeln soll, so wie in Ihrer EMail angedeutet, ...  Thumbs_down 

Gruß
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  iRadioMini für ESP32 Bernhard45 17 11.336 09.03.2024, 22:29
Letzter Beitrag: OttoBerger
  Art-Deco Radio mit iRadioMini saarfranzose 9 2.120 21.03.2022, 13:54
Letzter Beitrag: saarfranzose

Gehe zu: