Espressif IDF – Menuconfig

Last Updated on 15. Oktober 2026 by sfambachLink-Status: OK

Eine der schönen Errungenschaften der IDF ist die menügesteuerte Konfiguration. Noch schöner finde ich, dass eigene Konfigurationspunkte erstellt werden können. Diese werden dann automatisch in das Hauptmenü eingehängt. Vorab:

  • Die Bibliothek „esp_system.h“ wird im Quellcode benötigt, sonst klappt’s nicht
  • Nach Änderungen am Menü ein idf.py clean durchführen

Zur Erstellung solch eines Konfigurationspunktes nehme ich das Programm aus dem Beispiel Konsolenausgabe und ersetze den Text durch einen Konfigurationspunkt. Benannt werden diese grundsätzlich mit CONFIG_ , gefolgt von einem sprechenden Namen.

Quellcode main.c (GitHubLink-Status: OK)

/** idf example
 *
 * Example 5 for custom configuration for menuconfig
 *
 * Some parts are copied from the official idf examples found on 
 * https://docs.espressif.com/projects/esp-idf/en/latest/esp32/
 * 
 * Modified by SteFam @ http://www.fambach.net
 *
 * GPLv3 
 * Blah blah blah, free to use. 
 * I invested some time and money in those examples if you want to delete this header 
 * please do not forget to mention at least my website, thanks!
*/


#include <stdio.h>
#include "esp_system.h"

static const char* text = CONFIG_OUTPUT_TEXT;

void app_main(void)
{
    // single console output 
	printf("%s \n",text);
	
}

Damit diese Konfiguration im Menuconfig angezeigt wird, muss noch eine Datei „Kconfig.projbuild“ erstellt werden. Diese enthält zusätzliche Informationen zum Konfigurationspunkt:

Quellcode Kconfig.projbuild (GitHubLink-Status: OK)

menu "L5_Menuconfig"

    config OUTPUT_TEXT
        string "Output Text"
        default "www.fambach.net!"
        help
            Enter the text, that will be shown in the program.


endmenu

Nun einmal Menuconfig starten (>idf.py menuconfig) :

Noch bauen und schauen, wie es aussieht (idf.py build flash -p COM7 monitor )

Ausgabe mit konfiguriertem Text.

Es gibt nicht nur die Möglichkeit, Text zu formatieren, Zahlen und Auswahllisten sind ebenfalls möglich. Hier ein paar Beispiele

menu "Example Configuration"
config MOSI_GPIO
		int "MOSI GPIO number"
		range 0 46
		default 23 if IDF_TARGET_ESP32
		default 35 if IDF_TARGET_ESP32S2
		help
		    GPIO number (IOxx) to SPI MOSI. ...

config INVERSION
		bool "Enable Display Inversion"
		default false
		help
		    Enable Display Inversion.
		
choice
        bool "Mesh AP Authentication Mode"
        default WIFI_AUTH_WPA2_PSK
        help
            Authentication mode.

        config WIFI_AUTH_OPEN
            bool "WIFI_AUTH_OPEN"
        config WIFI_AUTH_WPA_PSK
            bool "WIFI_AUTH_WPA_PSK"
        config WIFI_AUTH_WPA2_PSK
            bool "WIFI_AUTH_WPA2_PSK"
        config WIFI_AUTH_WPA_WPA2_PSK
            bool "WIFI_AUTH_WPA_WPA2_PSK"
endchoice

config MESH_GLOBAL_DNS_IP
        hex "Global DNS"
        depends on MESH_USE_GLOBAL_DNS_IP
        default 0x08080808
        help
            The IP address of global DNS server that is used
            for internal IP subnet formed by the mesh network
            if MESH_USE_GLOBAL_DNS_IP is enabled.
            Note: The IP address is in platform (not network)
            format.
...

endmenu

Es sind auch Abhängigkeiten zwischen Konfigurationspunkten möglich. Diese werden mit den Schlüsselwörtern „depends on“, gefolgt von einem oder mehreren Konfigurationsnamen mit logischen Verknüpfungen, angegeben. Logische Verknüpfungen sind || (oder) oder && (und).

... 
config SW1_PIN
		int "SW1 pin"
		range 0 39
        default 36
		depends on SW1_ENABLE
		help 
			Switch 1 Gpio pin
config SW2_ENABLE
		bool "SW2 Enable"
        default false
		help 
			Enable Switch 2
config SW2_PIN
		int "SW2 pin"
		range 0 39
        default 35
		depends on SW2_ENABLE
		help 
			SW2 Gpio pin
config LONG_PRESS_ENABLED
		bool "Long press enabled"
        default false
		depends on (SW1_ENABLE || SW2_ENABLE)
		help 
		   If this is enabled the system 
		   distinguishes between long pressed buttons
                   and short pressed buttons
	config LONG_PRESS_TIME_MS
		int "Long press time ms"
		range 1000 8000
        default 2000
		depends on LONG_PRESS_ENABLED
		help 
		  How long should the a button be pressed to be
                  marked as a long pess	if it is not long pressed 
                  it is a short press
...

Fazit

Die Idee, Konfigurationen auszulagern, ist nicht neu. Sie aber mit einem Menü zu versehen, finde ich sehr charmant gelöst.

Verwandte Beiträge

HauptbeitragLink-Status: Kaputt

Quellen

Link-Status: OKIDF – KonfigurationLink-Status: Unbekannt

KConfig AnleitungLink-Status: Unbekannt

KConfig ErweiterungenLink-Status: Unbekannt

DatumÄnderungAutor
15.10.2026Beispielcode als Code-Block eingefügt (Einbettung über gist-it.appspot.com funktionierte nicht mehr)sfambach
03.10.2026Rechtschreibung korrigiert: Tippfehler, Kommas, Grammatik
Log-Liste eingefügt
sfambach
08.01.2021Beitrag erstelltsfambach
Logbuch

2 Gedanken zu „Espressif IDF – Menuconfig“

  1. Hallo Jürgen,

    wie im Impressum steht mache ich keine Anleitungen für Anfänger sondern dokumentiere nur was ich mir selbst erarbeite. Ich denke Profies brauchen diese Anleitung nicht. Ich bin aber gerne bereit Anpassungen/Ergänzungen vorzunehmen wenn du mir genau schreibst an welcher Stelle es hapert.

    Zur Veranschaulichung der Projektstruktur ist ein Beispielprojekt auf GitHub gelinkt, in dem alle nötigen Dateien an der passenden Position sind. Reicht das nicht? Was kann ich hier besser machen?

    Dein Kommentar ist zu einem Bericht über die Anwendung der Menuconfig über die Konsole, wo spielt da VSCode mit rein? Ja die Bedienung geht auch mit VSCode aber hier auf Basis eines Menüs das mit der Mouse bedient wird. Allerdings ist es auch bei mir so, dass VSCode an einem Tag funktioniert und mit der nächsten Version schon wieder nicht. Deshalb würde erstmal versuchen die IDF auf der Konsole (CMD) zum laufen zu bringen.

    NCurses Menüs wurden/werden oft unter Linux (o.ä. in der Window Konsole) verwendet deshalb bin ich hier nicht mehr näher darauf eingegangen. Im Grunde brauchst du nur Enter um in ein Untermenü zu kommen oder einen Menüpunkt zu bearbeiten und Esc um wieder heraus zu kommen. Die Pfeiltasten helfen beim navigieren, evtl noch Tab zum springen bzw. s zum speichern.

    Die IDF ist definitiv schon mal nicht sonderlich geeignet für Anfänger, leider kommt man an ihr für neue ESPs nicht vorbei, da die Implementierung auf für die Arduino Gui immer etwas hinterherhinkt. Ansonsten würde ich empfehlen als Anfänger die Arduino Gui zu verwenden.

    Gruß
    Stefan

  2. Hallo,

    Ihre Begeisterung für menuconfig kann ich nicht teilen.

    Klar, lässt sich die aus VS Ciode/PlatformIO heraus aufrufen. Der Irrsinn fängt damit an, dass unten einige Tastaturkürzel stehen, die wichtigsten (j und k) aber nicht.

    Und so simpel, einfach eine „kconfig.projbuild“ erstellen und menuconfig starten, ist es auch nicht. Wo muss die denn stehen, damit sie erkannt wird?

    Es gibt eine Taste „o“ zum Laden, aber in dem erscheinenden Fenster funktionieren nicht einmal j und k. Also wie zum Pfad navigieren, wo die kconfig.projbuild steht?

    Ihr Blog scheint eher für Profis gedacht zu sein, die schon alles wissen. Als Anfänger wühlt man sich nur stundenlang durchs Internet, auch die Doku von Espressif ist wenig hilfreich.

    Grüße

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert