IoT og smarthus

Slik programmerer du ESP32 og M5Stack: UIFlow, Python eller C++

ESP32- og M5Stack-lignende kort foran utviklingsmiljø med blokker og kode

ESP32 og M5Stack kan programmeres på fire nivåer: grafiske blokker i UIFlow 2.0, MicroPython, Arduino C++ og Espressifs eget ESP-IDF. PlatformIO er et verktøy som bygger både Arduino- og ESP-IDF-prosjekter. Det finnes ikke ett riktig valg for alle. Det beste startpunktet avhenger av kortet, bibliotekene du trenger, hva du vil lære og hvor mye kontroll du trenger over minne, strøm og timing.

Kort forklartEr du nybegynner med et M5Stack-kort, start i UIFlow 2.0. Vil du skrive tekstkode og teste raskt, velg MicroPython. Vil du ha størst bibliotekutvalg, velg Arduino C++. Trenger du full kontroll over FreeRTOS, strømstyring, sikkerhet og konfigurasjon, velg ESP-IDF. Start med én vei, men hold logikken atskilt fra maskinvaren slik at den kan flyttes senere.

Språk, rammeverk og IDE

Tre begreper blandes ofte sammen. Et programmeringsspråk beskriver hvordan koden skrives, for eksempel Python eller C++. Et rammeverk gir ferdige funksjoner for maskinvaren, for eksempel Arduino-ESP32 eller ESP-IDF. Et utviklingsmiljø (IDE) er verktøyet du redigerer, bygger og laster opp med, for eksempel UIFlow 2.0, Arduino IDE eller VS Code med PlatformIO eller Espressifs utvidelse.

MicroPython er en Python-implementasjon for mikrokontrollere og er ikke identisk med full Python på en PC. Arduino-kode for ESP32 skrives i C++ med Arduino-API-et, men bygger på en ESP32-kjerne som må passe brikken. ESP-IDF er Espressifs offisielle rammeverk med egen verktøykjede, CMake og Ninja, komponenter og FreeRTOS.

Diagrammet viser en mulig læringsvei, ikke et krav. Et undervisningsprosjekt kan godt bli værende i UIFlow, og et ferdig produkt kan bruke MicroPython hvis ytelse og vedlikehold er vurdert. Du kan også gå rett til ESP-IDF når prosjektet krever det.

Sammenligning av metodene

MetodeSpråkStørste styrkePasser tilVurder neste nivå når
UIFlow 2.0Blokker (Blockly) som blir MicroPythonSynlig programflyt og ferdige blokker for M5Stack-maskinvareUndervisning, skjerm, sensorer og tidlige prototyperDu trenger egne biblioteker, versjonskontroll eller mer struktur
MicroPythonPythonRask rediger-og-kjør-syklus og interaktiv REPLIoT-prototyper, sensorer og første tekstkodeMinne, timing, oppstartstid eller drivere blir en flaskehals
Arduino C++C++Stort bibliotekutvalg og kjent setup/loop-modellPrototyper, små produkter og tredjepartsmodulerProsjektet trenger tydelig komponentarkitektur og full ESP-IDF-kontroll
PlatformIOC/C++ (verktøy, ikke språk)Prosjektfil, bibliotekstyring og flere byggemiljøerArduino eller ESP-IDF med Git og automatisk byggingDu trenger en ny brikke eller funksjon før plattformen støtter den
ESP-IDFC/C++Offisielt SDK med full kontrollFreeRTOS, nettverk, sikkerhet, strømstyring og større firmwareKompleksiteten krever streng arkitektur, CI og langsiktig vedlikehold

Hvilken vei passer deg?

Situasjonen dinStart medHvorfor
Første gang du programmerer, M5Stack-kort med skjermUIFlow 2.0Blokker for skjerm, knapper og sensorer, og du ser koden bak
Du kan litt Python og vil teste idéer rasktMicroPythonIngen kompilering; du kan prøve kommandoer direkte i REPL
Du skal bruke en bestemt sensor eller skjerm med kjent bibliotekArduino C++De fleste modulprodusenter leverer Arduino-eksempler
Flere kort, flere personer eller automatisk byggingPlatformIOVersjoner og innstillinger ligger i én fil som kan deles i Git
Batteriprodukt med strenge strømkrav, sikker oppstart eller flash-krypteringESP-IDFDirekte tilgang til strømstyring, partisjoner og sikkerhetsfunksjoner

Eksemplene under blinker en LED hvert halve sekund. GPIO 2 er bare et eksempel; mange enkle ESP32-kort har en LED der, men ikke alle. Kontroller alltid kortets pinout, fordi innebygd LED og ledige pinner varierer mellom ESP32, ESP32-S3, C3, H2 og M5Stack-modellene.

MicroPython

from machine import Pin
from time import sleep

led = Pin(2, Pin.OUT)
led_on = False

while True:
    led_on = not led_on
    led.value(led_on)
    sleep(0.5)

Arduino C++

constexpr int LED_PIN = 2;
bool ledOn = false;

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  ledOn = !ledOn;
  digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
  delay(500);
}

ESP-IDF

#include <stdbool.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void app_main(void) {
    const gpio_num_t led_pin = GPIO_NUM_2;
    bool led_on = false;

    gpio_reset_pin(led_pin);
    gpio_set_direction(led_pin, GPIO_MODE_OUTPUT);

    while (true) {
        led_on = !led_on;
        gpio_set_level(led_pin, led_on);
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

Alle tre eksemplene lagrer LED-tilstanden i en variabel i stedet for å lese pinnen tilbake. Det er et bevisst valg: i ESP-IDF returnerer gpio_get_level() alltid 0 når pinnen bare er satt opp som utgang, så et «les og inverter»-blink ville aldri slukke LED-en. I et ekte prosjekt bør tilstand også holdes eksplisitt, feil kontrolleres og pinnevalget samles på ett sted.

UIFlow 2.0: blokker som blir MicroPython

UIFlow 2.0 er M5Stacks nettbaserte IDE. Offisiell dokumentasjon beskriver Blockly-arbeidsområdet, UI-editoren for skjermen, maskinvare- og sensormoduler, Code Preview og kjøring via USB eller Access Code. Arbeidsområdet genererer redigerbar MicroPython-kode mens du bygger. En nybegynner kan dermed forstå løkker og betingelser visuelt, mens en mer erfaren bruker kan lese og kontrollere koden.

En M5StickC Plus SE med skjerm gir et kompakt UIFlow-prosjekt med knapper og display. En AtomS3 Lite er mer minimalistisk og passer når en sensor eller utgang er viktigere enn skjerm. Kontroller maskinvarestøtten i den UIFlow 2-versjonen du bruker; at ett M5Stack-produkt støttes, betyr ikke at alle produkter har de samme blokkene.

Den praktiske arbeidsflyten med M5Burner, Run Once og WebTerminal forklares i guiden UIFlow 2.0 og MicroPython med M5Stack.

Arduino IDE og Arduino-ESP32

Arduino-modellen med setup() og loop() er lett å kjenne igjen og støttes av svært mange biblioteker. Espressif vedlikeholder selv Arduino-ESP32 og dokumenterer installasjon gjennom Boards Manager. Velg den stabile pakken og riktig kortdefinisjon. En feil kortvariant kan gi feil flashstørrelse, USB-modus eller pinnetilordning selv om koden kompilerer.

Arduino-ESP32 er bygget oppå ESP-IDF, og hovedversjon 3 av kjernen bruker ESP-IDF 5. Eldre eksempler skrevet for versjon 2 kan derfor trenge endringer, blant annet i funksjonene for PWM (LEDC) og timere. Sjekk hvilken kjerneversjon et eksempel er skrevet for før du feilsøker din egen kode.

M5Stacks offisielle biblioteker M5Unified og M5GFX samler maskinvare- og grafikkstøtte for mange produkter. Sjekk eksempler og støtteliste for akkurat ditt kort, og fest bibliotekversjonene når prosjektet skal kunne bygges på nytt senere.

PlatformIO: prosjektverktøy, ikke språk

PlatformIO brukes ofte i VS Code og kan bygge både Arduino- og ESP-IDF-prosjekter. Filen platformio.ini beskriver plattform, kort, rammeverk og biblioteker. Det gjør det enkelt å dele flere byggemiljøer og faste versjoner i Git.

PlatformIO-dokumentasjonen anbefaler å feste en konkret plattformversjon i stedet for en flytende «latest». Det reduserer overraskelser, men gir et vedlikeholdsansvar: sikkerhets- og kompatibilitetsoppdateringer må testes og tas inn bevisst. Den offisielle PlatformIO-plattformen har også i perioder ligget etter Espressifs nyeste Arduino-kjerne og ESP-IDF. Kontroller derfor hvilke versjoner plattformen faktisk inneholder før du velger en helt ny brikke. Se sammenligningen Arduino IDE, PlatformIO eller ESP-IDF for prosjektstruktur og eksempel på konfigurasjon.

Når ESP-IDF er riktig

ESP-IDF gir direkte tilgang til Espressifs komponenter, FreeRTOS, nettverksstakk, konfigurasjon og verktøy for bygging, flashing og overvåking. Det passer når prosjektet trenger flere samtidige oppgaver, hendelseskøer, sikre oppdateringer, strømprofiler eller en egen komponentarkitektur. Læringskurven er brattere, fordi du også må forstå byggesystemet, Kconfig-konfigurasjonen og livssyklusen til driverne.

Bruk en stabil ESP-IDF-versjon som passer brikken og avhengighetene. Espressifs dokumentasjon skiller mellom «latest», som følger utviklingsgrenen, og stabile versjoner. Kopier derfor ikke et eksempel fra «latest» uten å kontrollere hvilken versjon prosjektet ditt faktisk bygger mot.

Slik velger du uten å låse deg

  1. Velg konkret maskinvare: brikke, flash og PSRAM, skjerm, sensorer og USB-modus påvirker hvilke verktøy som støttes.
  2. Bygg én liten helhet først: les en sensor, vis eller send verdien og håndter én feil.
  3. Kontroller biblioteket før miljøet: finn offisiell støtte, eksempel, lisens og versjon.
  4. Fest versjoner: firmware, kortpakke og biblioteker skal kunne bygges likt igjen.
  5. Skill logikk fra maskinvare: beregning og validering kan testes uten fysisk GPIO.
  6. Mål før du bytter nivå: gå til et lavere nivå når minne, timing, stabilitet eller vedlikehold gir en konkret grunn.

Kilder og videre lesing

UIFlow-funksjonene er kontrollert mot M5Stacks offisielle UIFlow 2-introduksjon og layout- og Code Preview-dokumentasjonen. Arduino- og ESP-IDF-delene følger Espressifs Arduino-ESP32-installasjon og ESP-IDF Get Started. PlatformIO-versjonsfesting er kontrollert mot Espressif 32-plattformdokumentasjonen.

Oppsummering

UIFlow 2.0 gir den korteste veien fra idé til fungerende M5Stack-prototype og viser MicroPython bak blokkene. MicroPython gir rask tekstbasert utvikling. Arduino C++ kombinerer enkel struktur med et stort økosystem, mens ESP-IDF gir full kontroll. PlatformIO organiserer bygging og avhengigheter for både Arduino og ESP-IDF. Velg det enkleste nivået som oppfyller kravene, og planlegg veien videre før prosjektet vokser. Er du helt ny på ESP32, begynner du med maskinvaren i ESP32 for nybegynnere.

Alle guider

Produkter omtalt i denne guiden

Produktene som brukes og sammenlignes i guiden, med pris og lagerstatus.