Open6

"ESP-IDF で MQTT を使って Adafruit IOとやりとりするクソコード"を動かしてみる

kakimochikakimochi

トピック

  1. ESP-IDFで新規プロジェクトを作成する
  2. AdafruitIOを開通する
  3. ESP-IDFでMQTTコードを書く
  4. 動作確認
  5. まとめ
kakimochikakimochi

1. ESP-IDFで新規プロジェクトを作成する

  • 新規プロジェクト作成
d:\git>idf.py create-project mqtt
Executing action: create-project
The project was created in D:\git\mqtt
  • クリーン
d:\git\mqtt>idf.py fullclean
Executing action: fullclean
Build directory 'D:\git\mqtt\build' not found. Nothing to clean.
Executing action: remove_managed_components
Done
  • ターゲット設定
d:\git\mqtt>idf.py set-target esp32s3
Adding "set-target"'s dependency "fullclean" to list of commands with default set of options.
Executing action: fullclean
Build directory 'D:\git\mqtt\build' not found. Nothing to clean.
Executing action: set-target
Set Target to: esp32s3, new sdkconfig will be created.
Running cmake in directory D:\git\mqtt\build
Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED=1 -DPYTHON=D:\Espressif\python_env\idf5.3_py3.11_env\Scripts\python.exe -DESP_PLATFORM=1 -DIDF_TARGET=esp32s3 -DCCACHE_ENABLE=1 D:\git\mqtt"...
-- Found Git: D:/Espressif/tools/idf-git/2.44.0/cmd/git.exe (found version "2.44.0.windows.1")
-- ccache will be used for faster recompilation
-- The C compiler identification is GNU 13.2.0
-- The CXX compiler identification is GNU 13.2.0
-- The ASM compiler identification is GNU
-- Found assembler: D:/Espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc.exe
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/Espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/Espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- git rev-parse returned 'fatal: not a git repository (or any of the parent directories): .git'
-- Could not use 'git describe' to determine PROJECT_VER.
-- Building ESP-IDF components for target esp32s3
-- Project sdkconfig file D:/git/mqtt/sdkconfig
-- Compiler supported targets: xtensa-esp-elf
-- Found Python3: D:/Espressif/python_env/idf5.3_py3.11_env/Scripts/python.exe (found version "3.11.2") found components: Interpreter
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS
-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS - Success
-- App "mqtt" version: 1
-- Adding linker script D:/git/mqtt/build/esp-idf/esp_system/ld/memory.ld
-- Adding linker script D:/git/mqtt/build/esp-idf/esp_system/ld/sections.ld.in
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/soc/esp32s3/ld/esp32s3.peripherals.ld
-- Components: app_trace app_update bootloader bootloader_support bt cmock console cxx driver efuse esp-tls esp_adc esp_app_format esp_bootloader_format esp_coex esp_common esp_driver_ana_cmpr esp_driver_cam esp_driver_dac esp_driver_gpio esp_driver_gptimer esp_driver_i2c esp_driver_i2s esp_driver_isp esp_driver_jpeg esp_driver_ledc esp_driver_mcpwm esp_driver_parlio esp_driver_pcnt esp_driver_ppa esp_driver_rmt esp_driver_sdio esp_driver_sdm esp_driver_sdmmc esp_driver_sdspi esp_driver_spi esp_driver_touch_sens esp_driver_tsens esp_driver_uart esp_driver_usb_serial_jtag esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_hw_support esp_lcd esp_local_ctrl esp_mm esp_netif esp_netif_stack esp_partition esp_phy esp_pm esp_psram esp_ringbuf esp_rom esp_system esp_timer esp_vfs_console esp_wifi espcoredump esptool_py fatfs freertos hal heap http_parser idf_test ieee802154 json log lwip main mbedtls mqtt newlib nvs_flash nvs_sec_provider openthread partition_table perfmon protobuf-c protocomm pthread sdmmc soc spi_flash spiffs tcp_transport touch_element ulp unity usb vfs wear_levelling wifi_provisioning wpa_supplicant xtensa
-- Component paths: D:/Espressif/frameworks/esp-idf-v5.3.2/components/app_trace D:/Espressif/frameworks/esp-idf-v5.3.2/components/app_update D:/Espressif/frameworks/esp-idf-v5.3.2/components/bootloader D:/Espressif/frameworks/esp-idf-v5.3.2/components/bootloader_support D:/Espressif/frameworks/esp-idf-v5.3.2/components/bt D:/Espressif/frameworks/esp-idf-v5.3.2/components/cmock D:/Espressif/frameworks/esp-idf-v5.3.2/components/console D:/Espressif/frameworks/esp-idf-v5.3.2/components/cxx D:/Espressif/frameworks/esp-idf-v5.3.2/components/driver D:/Espressif/frameworks/esp-idf-v5.3.2/components/efuse D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp-tls D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_adc D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_app_format D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_bootloader_format D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_coex D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_common D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_ana_cmpr D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_cam D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_dac D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_gpio D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_gptimer D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_i2c D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_i2s D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_isp D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_jpeg D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_ledc D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_mcpwm D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_parlio D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_pcnt D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_ppa D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_rmt D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_sdio D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_sdm D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_sdmmc D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_sdspi D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_spi D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_touch_sens D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_tsens D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_uart D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_driver_usb_serial_jtag D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_eth D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_event D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_gdbstub D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_hid D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_http_client D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_http_server D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_https_ota D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_https_server D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_hw_support D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_lcd D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_local_ctrl D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_mm D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_netif D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_netif_stack D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_partition D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_phy D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_pm D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_psram D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_ringbuf D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_system D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_timer D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_vfs_console D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_wifi D:/Espressif/frameworks/esp-idf-v5.3.2/components/espcoredump D:/Espressif/frameworks/esp-idf-v5.3.2/components/esptool_py D:/Espressif/frameworks/esp-idf-v5.3.2/components/fatfs D:/Espressif/frameworks/esp-idf-v5.3.2/components/freertos D:/Espressif/frameworks/esp-idf-v5.3.2/components/hal D:/Espressif/frameworks/esp-idf-v5.3.2/components/heap D:/Espressif/frameworks/esp-idf-v5.3.2/components/http_parser D:/Espressif/frameworks/esp-idf-v5.3.2/components/idf_test D:/Espressif/frameworks/esp-idf-v5.3.2/components/ieee802154 D:/Espressif/frameworks/esp-idf-v5.3.2/components/json D:/Espressif/frameworks/esp-idf-v5.3.2/components/log D:/Espressif/frameworks/esp-idf-v5.3.2/components/lwip D:/git/mqtt/main D:/Espressif/frameworks/esp-idf-v5.3.2/components/mbedtls D:/Espressif/frameworks/esp-idf-v5.3.2/components/mqtt D:/Espressif/frameworks/esp-idf-v5.3.2/components/newlib D:/Espressif/frameworks/esp-idf-v5.3.2/components/nvs_flash D:/Espressif/frameworks/esp-idf-v5.3.2/components/nvs_sec_provider D:/Espressif/frameworks/esp-idf-v5.3.2/components/openthread D:/Espressif/frameworks/esp-idf-v5.3.2/components/partition_table D:/Espressif/frameworks/esp-idf-v5.3.2/components/perfmon D:/Espressif/frameworks/esp-idf-v5.3.2/components/protobuf-c D:/Espressif/frameworks/esp-idf-v5.3.2/components/protocomm D:/Espressif/frameworks/esp-idf-v5.3.2/components/pthread D:/Espressif/frameworks/esp-idf-v5.3.2/components/sdmmc D:/Espressif/frameworks/esp-idf-v5.3.2/components/soc D:/Espressif/frameworks/esp-idf-v5.3.2/components/spi_flash D:/Espressif/frameworks/esp-idf-v5.3.2/components/spiffs D:/Espressif/frameworks/esp-idf-v5.3.2/components/tcp_transport D:/Espressif/frameworks/esp-idf-v5.3.2/components/touch_element D:/Espressif/frameworks/esp-idf-v5.3.2/components/ulp D:/Espressif/frameworks/esp-idf-v5.3.2/components/unity D:/Espressif/frameworks/esp-idf-v5.3.2/components/usb D:/Espressif/frameworks/esp-idf-v5.3.2/components/vfs D:/Espressif/frameworks/esp-idf-v5.3.2/components/wear_levelling D:/Espressif/frameworks/esp-idf-v5.3.2/components/wifi_provisioning D:/Espressif/frameworks/esp-idf-v5.3.2/components/wpa_supplicant D:/Espressif/frameworks/esp-idf-v5.3.2/components/xtensa
-- Configuring done (15.4s)
-- Generating done (3.3s)
-- Build files have been written to: D:/git/mqtt/build
  • ビルド
d:\git\mqtt>idf.py build
Executing action: all (aliases: build)
Running ninja in directory D:\git\mqtt\build
Executing "ninja all"...
[4/1016] Generating ../../partition_table/partition-table.bin
Partition table binary generated. Contents:
*******************************************************************************
# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs,data,nvs,0x9000,24K,
phy_init,data,phy,0xf000,4K,
factory,app,factory,0x10000,1M,
*******************************************************************************
[941/1016] Performing configure step for 'bootloader'
-- Found Git: D:/Espressif/tools/idf-git/2.44.0/cmd/git.exe (found version "2.44.0.windows.1")
-- The C compiler identification is GNU 13.2.0
-- The CXX compiler identification is GNU 13.2.0
-- The ASM compiler identification is GNU
-- Found assembler: D:/Espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc.exe
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/Espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/Espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Building ESP-IDF components for target esp32s3
-- Project sdkconfig file D:/git/mqtt/sdkconfig
-- Compiler supported targets: xtensa-esp-elf
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/soc/esp32s3/ld/esp32s3.peripherals.ld
-- Bootloader project name: "bootloader" version: 1
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/bootloader/subproject/main/ld/esp32s3/bootloader.ld
-- Adding linker script D:/Espressif/frameworks/esp-idf-v5.3.2/components/bootloader/subproject/main/ld/esp32s3/bootloader.rom.ld
-- Components: bootloader bootloader_support efuse esp_app_format esp_bootloader_format esp_common esp_hw_support esp_rom esp_system esptool_py freertos hal log main micro-ecc newlib partition_table soc spi_flash xtensa
-- Component paths: D:/Espressif/frameworks/esp-idf-v5.3.2/components/bootloader D:/Espressif/frameworks/esp-idf-v5.3.2/components/bootloader_support D:/Espressif/frameworks/esp-idf-v5.3.2/components/efuse D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_app_format D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_bootloader_format D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_common D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_hw_support D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_rom D:/Espressif/frameworks/esp-idf-v5.3.2/components/esp_system D:/Espressif/frameworks/esp-idf-v5.3.2/components/esptool_py D:/Espressif/frameworks/esp-idf-v5.3.2/components/freertos D:/Espressif/frameworks/esp-idf-v5.3.2/components/hal D:/Espressif/frameworks/esp-idf-v5.3.2/components/log D:/Espressif/frameworks/esp-idf-v5.3.2/components/bootloader/subproject/main D:/Espressif/frameworks/esp-idf-v5.3.2/components/bootloader/subproject/components/micro-ecc D:/Espressif/frameworks/esp-idf-v5.3.2/components/newlib D:/Espressif/frameworks/esp-idf-v5.3.2/components/partition_table D:/Espressif/frameworks/esp-idf-v5.3.2/components/soc D:/Espressif/frameworks/esp-idf-v5.3.2/components/spi_flash D:/Espressif/frameworks/esp-idf-v5.3.2/components/xtensa
-- Configuring done (14.8s)
-- Generating done (0.3s)
-- Build files have been written to: D:/git/mqtt/build/bootloader
[113/114] Generating binary image from built executable
esptool.py v4.8.1
Creating esp32s3 image...
Merged 2 ELF sections
Successfully created esp32s3 image.
Generated D:/git/mqtt/build/bootloader/bootloader.bin
[114/114] C:\WINDOWS\system32\cmd.exe /C "cd /D D:\git\mqt...ootloader 0x0 D:/git/mqtt/build/bootloader/bootloader.bin"
Bootloader binary size 0x5490 bytes. 0x2b70 bytes (34%) free.
[1015/1016] Generating binary image from built executable
esptool.py v4.8.1
Creating esp32s3 image...
Merged 2 ELF sections
Successfully created esp32s3 image.
Generated D:/git/mqtt/build/mqtt.bin
[1016/1016] C:\WINDOWS\system32\cmd.exe /C "cd /D D:\git\m...tion_table/partition-table.bin D:/git/mqtt/build/mqtt.bin"
mqtt.bin binary size 0x32850 bytes. Smallest app partition is 0x100000 bytes. 0xcd7b0 bytes (80%) free.

Project build complete. To flash, run:
 idf.py flash
or
 idf.py -p PORT flash
or
 python -m esptool --chip esp32s3 -b 460800 --before default_reset --after hard_reset write_flash --flash_mode dio --flash_size 2MB --flash_freq 80m 0x0 build\bootloader\bootloader.bin 0x8000 build\partition_table\partition-table.bin 0x10000 build\mqtt.bin
or from the "D:\git\mqtt\build" directory
 python -m esptool --chip esp32s3 -b 460800 --before default_reset --after hard_reset write_flash "@flash_args"
kakimochikakimochi

2. AdafruitIOを開通する

  • サイト:https://io.adafruit.com/

    • 直感的なサイトなので、適当にがんばれる
  • アカウント作成

  • API-KEYの取得

    • サイト右上のアイコン(黄スパナ)からAPI-KEYを表示できる
      • "Active Key"の"aio_XXXXX"がAdafruit.ioのAPI-KEY
  • ダッシュボード作成

    • ボタンやゲージなどを配置できる
    • どのFEEDと関連付けるか設定できる
  • Feed作成

    • "New Feed"から作成する
    • 画面右の"Feed Info"から設定を確認できる
kakimochikakimochi

3. ESP-IDFでMQTTコードを書く

ポイントは

  • WiFi接続してからMQTT接続すること
  • ログを仕込んでおくこと (開通まではログで動作確認をすすめると楽)

あとでかく:コードのリポジトリ