ãã®èšäºã¯ãç¶²çŸ çãªã¬ã€ããšãªãããšãæå³ãããã®ã§ã¯ãªããè³æãšæšå¥šäºé ã®ãœãŒã¹ãéãããã®ã§ãããã®èšäºã§ã¯ããããžã§ã¯ãéçºçšã®ãœãããŠã§ã¢ããŒã«ãéžæããéã«çŽé¢ããªããã°ãªããªãã£ãåé¡ãšãESP32ã¢ãžã¥ãŒã«ã®å®éã®é©çšäŸã«ã€ããŠè§ŠããããšæããŸãã次ã®èšäºã§ã¯ãESP32ãå°åã®äºèŒªã¢ãã€ã«ãã©ãããã©ãŒã ã®å¶åŸ¡ã³ã³ãããŒã©ãŒãšããŠäœ¿çšããäŸã瀺ããããšæããŸãããããã£ãŠãããã§ã¯æ¬¡ã®ãããªè©³çŽ°ãæ€èšããŸãã
- éçºç°å¢ã®éžæ;
- äœæ¥ç°å¢ã®ã»ããã¢ãããESP-IDFãããžã§ã¯ãã®ã³ã³ãã€ã«ãšããŒãã
- å ¥å/åºåä¿¡å·ã®åŠçGPIO;
- MCPWMã¢ãžã¥ãŒã«ã䜿çšãããã«ã¹å¹ å€èª¿ã
- PCNTããŒããŠã§ã¢ã«ãŠã³ã¿ãŒ;
- WI-Fiããã³MQTTæ¥ç¶ã
ESP32-WROOM-32Eã¢ãžã¥ãŒã«ã®æŠèŠ
ããŒã¿ã·ãŒãã«ãããšãã¢ãžã¥ãŒã«ã«ã¯æ¬¡ã®ãã®ãå«ãŸããŠããŸã
ãMCU
- ESP32-D0WD-V3çµã¿èŸŒã¿ãXtensaãã¥ã¢ã«ã³ã¢32ãããLX6ãã€ã¯ãããã»ããµãæ倧240 MHz
- èµ·åããã³ã³ã¢æ©èœçšã®448KB ROM
- ããŒã¿ãšåœä»€çšã®520KBã®SRAM
- RTCã®16KBSRAM
Wi-Fi
- 802.11b / g / n
- ãããã¬ãŒãïŒ802.11næ倧150 Mbps
- A-MPDUããã³A-MSDUã¢ã°ãªã²ãŒã·ã§ã³
- 0.4 µsã®ã¬ãŒãééã®ãµããŒã
- åäœãã£ãã«ã®äžå¿åšæ³¢æ°ç¯å²ïŒ2412ã2484 MHz
ãã«ãŒãã¥ãŒã¹
- Bluetooth V4.2 BR / EDRããã³BluetoothLEä»æ§
- ã¯ã©ã¹1ãã¯ã©ã¹2ãã¯ã©ã¹3ã®éä¿¡æ©
- AFH
- CVSDããã³SBC
ããŒããŠã§ã¢
- Interfaces: SD card, UART, SPI, SDIO, I 2 C, LED PWM, Motor PWM, I 2 S, IR, pulse counter, GPIO, capacitive touch sensor, ADC, DAC
- 40 MHz crystal oscillator
- 4 MB SPI flash
- Operating voltage/Power supply: 3.0 ~ 3.6 V
- Operating temperature range: â40 ~ 85 °C
- Dimensions: See Table 1
Certification
- Bluetooth certification: BQB
- RF certification: FCC/CE-RED/SRRC
- Green certification: REACH/RoHS
æ©èœãããã¯å³
ãã€ã¯ãããã»ããµã®æ©èœã®è©³çŽ°ã«ã€ããŠã¯ã Wikipediaãåç §ããŠãã ããã
ãã®ã¢ãžã¥ãŒã«ã¯ãESP32-D0WD-V3 *ãã€ã¯ãåè·¯ã«åºã¥ããŠããŸããçµã¿èŸŒã¿ãããã¯ãã¹ã±ãŒã©ããªãã£ãšé©å¿æ§ã念é ã«çœ®ããŠèšèšãããŠããŸããäžå€®åŠçè£ çœ®ã«ã¯ãåå¥ã«å¶åŸ¡ã§ãã2ã€ã®ã³ã¢ãå«ãŸããŠãããCPUã¯ããã¯é床ã¯80MHzãã240MHzãŸã§èª¿æŽå¯èœã§ãããããã«ã¯ããã³ã®ã¹ããŒã¿ã¹ã®ç£èŠãªã©ãå€ãã®èšç®èœåãå¿ èŠãšããªãã¿ã¹ã¯ãå®è¡ãããšãã«é»åãç¯çŽããããã«CPUã®ä»£ããã«äœ¿çšã§ããäœé»åã³ããã»ããµããããŸãã ESP32ã¯ã容éæ§ã¿ããã»ã³ãµãŒãããŒã«ã»ã³ãµãŒãSDã«ãŒãã€ã³ã¿ãŒãã§ã€ã¹ãã€ãŒãµããããé«éSPIãUARTãI²SãI²Cãªã©ã®è±å¯ãªåšèŸºæ©åšãçµ±åããŠããŸãã
æè¡ææžã¯å ¬åŒãªãœãŒã¹ã«æ²èŒãããŠããŸãã
ESP-WROOM-32ã¢ãžã¥ãŒã«ã®ãã³é 眮ã«é¢ããæ å ±ã¯ãããã«ããããã«ããããã¯ãŒã¯ã®ãªãŒãã³ã¹ããŒã¹ã§ç°¡åã«èŠã€ããããšãã§ããŸãã
éçºç°å¢ã®éžæ
Arduino IDE
AVRãã¡ããªãŒã®ãã€ã¯ãã³ã³ãããŒã©ãŒããããŠArduinoãã©ãããã©ãŒã ã¯ãESP32ãããã£ãšåã«ç»å ŽããŸããã Arduinoã®éèŠãªæ©èœã®1ã€ã¯ãäŸµå ¥ã«å¯Ÿããéå£ãæ¯èŒçäœãããšã§ããããã«ãããã»ãšãã©ã®äººããã°ããç°¡åã«äœããäœæã§ããŸãããã®ãã©ãããã©ãŒã ã¯ããªãŒãã³ãœãŒã¹ã®ããŒããŠã§ã¢ã³ãã¥ããã£ã«éèŠãªè²¢ç®ãããŠãããèšå€§ãªæ°ã®ã©ãžãªã¢ããã¥ã¢ãåå ã§ããããã«ãªã£ãŠããŸãã Arduino IDEã¯ããªããµã€ãããç¡æã§ããŠã³ããŒãã§ããŸããããã®éçºç°å¢ãšæ¯èŒããŠæãããªå¶éãããã«ãããããããArduino IDEã¯è¶£å³ã®ãããžã§ã¯ãã«å¿ èŠãªãã®ã®90ïŒ ãã«ããŒããŠããŸãããŸããESP32ã¢ãžã¥ãŒã«ãããã°ã©ãã³ã°ããããã®Arduino IDEã®ã€ã³ã¹ããŒã«ãšæ§æã«é¢ãããããã¯ã«ã€ããŠã¯ããããã¯ãŒã¯äžã«ååãªæ°ã®èšäºããããŸããäŸïŒESP32çšã®Arduinoã³ã¢ãhabr.comãvoltiq.ruããã³randomnerdtutorials.comã
Arduinoç°å¢ã§ESP32ãããã°ã©ãã³ã°ãããšãã¯ãarduino-esp32ããŒãžã«ç€ºãããŠãããã³é 眮ãèæ ®ããå¿ èŠããããŸãã
ESP32ã¢ãžã¥ãŒã«ã®ãã³é 眮
ãã®èšèšã¢ãããŒãã®äž»ãªå©ç¹ã¯ãArduinoã®å Žåãšåãååã䜿çšããŠããããžã§ã¯ãããã°ããå ¥åããç°¡åã«äœæã§ããããšã§ãããŸããArduinoã®ããã«ãå€ãã®ã©ã€ãã©ãªã®äœ¿çšããã1ã€ã®åªããæ©èœã¯ãArduinoã©ã€ãã©ãªãšèšèšååãå ã®ESP-IDFãã¬ãŒã ã¯ãŒã¯ãšçµã¿åãããæ©èœã§ãã
PlatformIO
å ¬åŒãªãœãŒã¹ã«èšèŒãããŠããããã«ããã¯ãã¹ãã©ãããã©ãŒã ã®PlatformIO IDEãšçµ±åãããã¬ãŒã»éçã³ãŒãã¢ãã©ã€ã¶ãŒãšãªã¢ãŒããŠããããã¹ãããã«ããã©ãããã©ãŒã ããã³ãã«ãã¢ãŒããã¯ãã£ãã«ãã·ã¹ãã ã»ãã¡ãŒã ãŠã§ã¢ãã¡ã€ã«ãšã¯ã¹ãããŒã©ãŒãšã¡ã¢ãªæ€æ»Â»èšãæãããšãPlatformIOã¯ãArduinoãESP32ãå«ãè€æ°ã®ãã©ãããã©ãŒã ããµããŒãããçµã¿èŸŒã¿ããã€ã¹éçºã®ããã®ãšã³ã·ã¹ãã ã§ãã IDEã¯VisualStudioCodeãŸãã¯Atomã§ããã€ã³ã¹ããŒã«ãšæ§æã¯éåžžã«ç°¡åã§ããã³ãŒããšãã£ã¿ãŒãã€ã³ã¹ããŒã«ããåŸããã©ã°ã€ã³ã®ãªã¹ãããPlatformIOãéžæããŠã€ã³ã¹ããŒã«ããŸããç¹°ãè¿ãã«ãªããŸããããããäžã«ã¯ãã®ãããã¯ã«é¢ããå€ãã®è³æããããŸãããããšããã®å ¬åŒãœãŒã¹ããå§ãŸãããããšããã®è©³çŽ°ãªã€ã©ã¹ããå«ãèšäºãç¶ããŸãã..ã
Arduino IDEãšæ¯èŒãããšãPlatformIOã«ã¯ããããžã§ã¯ãã®ç·šæããã©ã°ã€ã³ã®ãµããŒããã³ãŒãã®å®æãªã©ãææ°ã®éçºç°å¢ã®ãã¹ãŠã®å質ãåãã£ãŠããŸãã
PlatformIOã§ã®éçºã®ç¹åŸŽã¯ããã¹ãŠã®ãã©ãããã©ãŒã ã®çµ±äžããããããžã§ã¯ãæ§é ã§ãã
project_dir
âââ lib
â âââ README
âââ platformio.ini
âââ src
âââ main.cpp
åPlatformIOãããžã§ã¯ãã«ã¯ããããžã§ã¯ãã®ã«ãŒãã«platformio.iniãšããååã®æ§æãã¡ã€ã«ãå«ãŸããŠããŸããplatformio.iniã«ã¯ãã»ã¯ã·ã§ã³ïŒãããã[ã¿ã€ãã«]ã§ç€ºãããŸãïŒãšã»ã¯ã·ã§ã³å ã®ããŒ/å€ã®ãã¢ããããŸãããããã»ãã³ãã³æåã;ãã§å§ãŸãè¡ ç¡èŠãããã³ã¡ã³ãã«äœ¿çšã§ããŸããè€æ°ã®å€ãã©ã¡ãŒã¿ãŒã¯ã次ã®2ã€ã®æ¹æ³ã§æå®ã§ããŸãã
- å€ããããïŒã³ã+ã¹ããŒã¹ïŒã§åºåããŸãã
- è€æ°è¡åœ¢åŒãæ°ããåè¡ã¯å°ãªããšã2ã€ã®ã¹ããŒã¹ã§å§ãŸããŸãã
ESP32ã®æ¬¡ã®éçºæ©èœã¯ããã¬ãŒã ã¯ãŒã¯ãéžæããæ©èœã§ãïŒArduinoãŸãã¯ESP-IDFããã¬ãŒã ã¯ãŒã¯ãšããŠArduinoãéžæããããšã«ãããåè¿°ã®éçºäžã®ã¡ãªãããåŸãããŸãã
PlatformIOã«ã¯ããããžã§ã¯ããæ§ç¯ãããŠã³ããŒããããã³ãããã°ããããã®äŸ¿å©ãªããŒã«ãå«ãŸããŠããŸã
EspressifIoTéçºãã¬ãŒã ã¯ãŒã¯
ESP32ã®å ŽåãEspressifã¯ãESP-IDFããšåŒã°ããIoTéçºãã¬ãŒã ã¯ãŒã¯ãšåŒã°ãããã¬ãŒã ã¯ãŒã¯ãéçºããŸãããããã¯Githubã§èŠã€ããããšãã§ããŸãããããžã§ã¯ãã«ã¯éåžžã«åªããããã¥ã¡ã³ããå«ãŸããŠãããããŒã¹ãšããŠäœ¿çšã§ããäŸãæäŸãããŠããŸããç°å¢ã®ã»ããã¢ãããšã»ããã¢ããã«ã€ããŠã¯ããã¯ããã«ãã»ã¯ã·ã§ã³ã§è©³ãã説æãããŠããŸãããã¬ãŒã ã¯ãŒã¯ãã€ã³ã¹ããŒã«ããŠæäœããã«ã¯ãããã€ãã®ãªãã·ã§ã³ããããŸãã
ãªããžããªãããããžã§ã¯ããã¯ããŒã³ãããŠãŒãã£ãªãã£ãæåã§ã€ã³ã¹ããŒã«ããŸãã
Githubãããããžã§ã¯ããã¯ããŒãã³ã°ãã
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
Windowsã®å ŽåãéçºãŠãŒãã£ãªãã£ã®ã€ã³ã¹ããŒã«ã¯ãã€ã³ã¹ããŒã©ãŒãŸãã¯ã³ãã³ãã©ã€ã³ã®ã¹ã¯ãªããã䜿çšããŠå¯èœã§ãã
cd %userprofile%\esp\esp-idf
install.bat
PowerShellã®å Žå
cd ~/esp/esp-idf
./install.ps1
Linuxããã³macOSã®å Žå
cd ~/esp/esp-idf
./install.sh
次ã®ã¹ãããã¯ãç°å¢å€æ°ãèšå®ããããšã§ããã€ã³ã¹ããŒã©ãŒã䜿çšããŠéçºããŒã«ãWindowsã«ã€ã³ã¹ããŒã«ããå Žåã¯ãã³ãã³ãã³ã³ãœãŒã«ãžã®ã·ã§ãŒãã«ãããã¡ãã¥ãŒãšãã¹ã¯ãããã«è¿œå ãããŸãããã®åŸãã³ãã³ãã·ã§ã«ãéããŠãããžã§ã¯ããæäœã§ããŸãããŸãã¯ãWindowsã³ãã³ãã·ã§ã«ãå®è¡ããã«ã¯ïŒ
%userprofile%\esp\esp-idf\export.bat
ãŸãã¯WindowsPowerShellïŒ
.$HOME/esp/esp-idf/export.ps1
LinuxãšmacOSïŒ
. $HOME/esp/esp-idf/export.sh
ããããšã¹ã¯ãªãããžã®ãã¹ã®éã®ã¹ããŒã¹ã«æ³šæããå¿ èŠããããŸãã
ããã«ã¬ã€ãã§ã¯ãLinuxãŸãã¯macOSã§äœæ¥ããŠããå Žåã¯ããŠãŒã¶ãŒãããã¡ã€ã«ã§ç°å¢å€æ°ãèšå®ããããã®ãšã€ãªã¢ã¹ãã¹ã¯ãªããã«è¿œå ããããšããå§ãããŸãããããè¡ãã«ã¯ã次ã®ã³ãã³ããã³ããŒããŠã·ã§ã«ãããã¡ã€ã«ïŒ.profileã.bashrcã.zprofileãªã©ïŒã«è²Œãä»ããŸãã
alias get_idf='. $HOME/esp/esp-idf/export.sh'
ã³ã³ãœãŒã«ã§get_idfã³ãã³ããåŒã³åºããšãå¿ èŠãªç°å¢å€æ°ããšã¯ã¹ããŒããããŸããç§ã®å Žåãpythonä»®æ³ç°å¢ãéå§ããããã«ãšã€ãªã¢ã¹ãç»é²ããå¿ èŠããããŸãã
alias esp_va=âsource $HOME/.espressif/python_env/idf4.2_py2.7_env/bin/activateâ
次ã®ãšã€ãªã¢ã¹ã«è¿œå ããŸã
alias get_idf='esp_ve && . $HOME/esp/esp-idf/export.sh'
æ°ãããããžã§ã¯ããæåããäœæããã«ã¯ã github.comãããœãŒã¹ãè€è£œããããexamples esp-idf / examples / get-started / hello_world /ã䜿çšããŠãã£ã¬ã¯ããªããã³ããŒããŸãã
ãããžã§ã¯ãã®æ§é ãã³ã³ãã€ã«ãããŒããæ§æãŠãŒãã£ãªãã£ãªã©ã«é¢ããæ å ±ã¯ãããã«ãããŸãã
ãããžã§ã¯ãã¯ã次ã®æ§é ã®ãã£ã¬ã¯ããªã§ãã
- myProject/
- CMakeLists.txt
- sdkconfig
- components/ - component1/ - CMakeLists.txt
- Kconfig
- src1.c
- component2/ - CMakeLists.txt
- Kconfig
- src1.c
- include/ - component2.h
- main/ - CMakeLists.txt
- src1.c
- src2.c
- build/
ãããžã§ã¯ãæ§æã¯ãã«ãŒããã£ã¬ã¯ããªã®sdkconfigãã¡ã€ã«ã«å«ãŸããŠããŸããèšå®ãå€æŽããã«ã¯ãidf.py menuconfigã³ãã³ãïŒãŸãã¯Windowsã®å Žåã¯idf.py.exe menuconfigïŒãåŒã³åºãå¿ èŠããããŸãã
éåžžã2ã€ã®ã¢ããªã±ãŒã·ã§ã³ã1ã€ã®ãããžã§ã¯ãã§äœæãããŸããããããžã§ã¯ãã¢ããªãïŒã¡ã€ã³ã®å®è¡å¯èœãã¡ã€ã«ãã€ãŸãã«ã¹ã¿ã ãã¡ãŒã ãŠã§ã¢ïŒãšãããŒãããŒããŒã¢ããªãïŒãããžã§ã¯ãã®ããŒãããŒããŒã®ããã°ã©ã ïŒã§ãã
ãã³ã³ããŒãã³ããã¯ãéçã©ã€ãã©ãªïŒ.aãã¡ã€ã«ïŒã«ã³ã³ãã€ã«ãããã¢ããªã±ãŒã·ã§ã³ã«ãªã³ã¯ãããã¹ã¿ã³ãã¢ãã³ã³ãŒãã®ã¢ãžã¥ãŒã«éšåã§ãããããã®äžéšã¯ESP-IDFèªäœã«ãã£ãŠæäŸããããã®ä»ã¯ä»ã®ãœãŒã¹ããååŸãããå ŽåããããŸãã
idf.pyã³ãã³ãã©ã€ã³ãŠãŒãã£ãªãã£ã¯ããããžã§ã¯ããã«ããç°¡åã«ç®¡çããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸããWindowsã§ã®ãã®å Žæã¯ïŒ userprofileïŒ \ã§ããEspressif\ tools \ idf-exe \ 1.0.1 \ idf.py.exeã圌女ã¯æ¬¡ã®æ¥œåšãæäœããŸãã
- CMake-ãã«ããããããžã§ã¯ããæ§æããŸã
- ã³ã³ãœãŒã«ãããžã§ã¯ããã«ããŒïŒNinjaããŸãã¯GNU MakeïŒ
- esptool.py-ã¢ãžã¥ãŒã«ã®ãã©ãã·ã¥çšã
åãããžã§ã¯ãã«ã¯ããããžã§ã¯ãå šäœã®ãã«ãèšå®ãå«ã1ã€ã®ãããã¬ãã«ã®CMakeLists.txtãã¡ã€ã«ããããŸããæå°éã®ãã¡ã€ã«æ§æã«ã¯ã次ã®å¿ é è¡ãå«ãŸããŸãã
cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(myProject)
ESP-IDFãããžã§ã¯ãã¯ãã¡ã€ã³ãã£ã¬ã¯ããªãã³ãŒããå®è¡ããã¡ã€ã³ã³ã³ããŒãã³ãã§ããã³ã³ããŒãã³ãã®ã³ã¬ã¯ã·ã§ã³ãšèããããšãã§ããŸãããããã£ãŠããã®ãã£ã¬ã¯ããªã«ã¯CMakeLists.txtãã¡ã€ã«ãå«ãŸããŠããŸããã»ãšãã©ã®å Žåããã®æ§é ã¯äŒŒãŠããŸãã
idf_component_register(SRCS "main.c" INCLUDE_DIRS ".")
ãœãŒã¹ãã¡ã€ã«main.cãã³ã³ããŒãã³ãã«ç»é²ããå¿ èŠããããããããŒãã¡ã€ã«ãçŸåšã®ãã£ã¬ã¯ããªã«å«ãŸããŠããããšã瀺ãããŠããå Žåãå¿ èŠã«å¿ããŠãCMakeLists.txtãããžã§ã¯ãã§EXTRA_COMPONENT_DIRSãèšå®ããããšã«ãããã¡ã€ã³ãã£ã¬ã¯ããªã®ååãå€æŽã§ããŸãã詳现ã«ã€ããŠã¯ããã¡ããã芧ãã ããã
ããã«ããã£ã¬ã¯ããªã«ã¯ããšã³ããªãã€ã³ãïŒvoid app_mainïŒvoidïŒé¢æ°ïŒãæã€å ã®main.cïŒååã¯ä»»æïŒãã¡ã€ã«ãå«ãŸããŠããŸãã
ã«ã¹ã¿ã ã³ã³ããŒãã³ãã¯ãcomponentsãã£ã¬ã¯ããªã«äœæãããŸãããã®ããã»ã¹ã«ã€ããŠã¯ããã³ã³ããŒãã³ãèŠä»¶ãã»ã¯ã·ã§ã³ã§è©³ãã説æããŠããŸãã
ã»ãšãã©ã®å ŽåãESP32ã¢ãžã¥ãŒã«ãã³ã³ãã¥ãŒã¿ãŒã«æ¥ç¶ããã«ã¯ãæ¢åã®ããŒãããŒããŒããããããArduinoããŒãã®ãããªUSBã±ãŒãã«ã䜿çšããŸãããã®ããã»ã¹ã«ã€ããŠã¯ããã¡ãã§è©³ãã説æããŠããŸãã..ãå¿ èŠãªã®ã¯ãã·ã¹ãã å ã«USBããUARTãžã®ã³ã³ããŒã¿ãŒãã©ã€ããŒãååšããããšã ãã§ããããã¯ãæäŸããããœãŒã¹ããããŠã³ããŒãã§ããŸãããã©ã€ããã€ã³ã¹ããŒã«ããåŸãã³ã³ãã€ã«ããããã¡ãŒã ãŠã§ã¢ãã¢ãžã¥ãŒã«ã«ããŒãããããã«ãã·ã¹ãã ã®COMããŒãçªå·ã決å®ããå¿ èŠããããŸãã
ãããžã§ã¯ãã®æ§æã
ã»ãšãã©ã®å Žåãããã©ã«ãèšå®ã§åé¡ãããŸããããã ããã³ã³ãœãŒã«ã¡ãã¥ãŒã€ã³ã¿ãŒãã§ã€ã¹ãåŒã³åºãã«ã¯ããããžã§ã¯ããã£ã¬ã¯ããªã«ç§»åããã³ãã³ãã©ã€ã³ãå ¥åããå¿ èŠããããŸãã
idf.py menuconfig
æ§æèšå®ã®ã¡ãã¥ãŒ
ãã®ã³ãã³ããåŒã³åºããåŸãsdkconfigãã¡ã€ã«ã¯ã以åã«äœæãããŠããªãå ŽåããŸãã¯åæ§æãããŠããå Žåã«äœæãããŸãã以åã®ãã¥ãŒããªã¢ã«ã§ã¯ãå»æ¢ãããmakemenuconfigã³ãã³ãããããŸãã
sdkconfigãã¡ã€ã«ã«ã«ã¹ã¿ã èšå®ãè¿œå ããããšã¯æåã§å¯èœã§ããäŸïŒ
#
# WiFi Settings
#
CONFIG_ESP_HOST_NAME=" "
CONFIG_ESP_WIFI_SSID=" "
CONFIG_ESP_WIFI_PASSWORD=""
ãã ããæšå¥šãããæ¹æ³ã¯ãè¿œå ã®æ§æãã¡ã€ã«Kconfig.projbuildã䜿çšããããšã§ãããã®ãã¡ã€ã«ã¯ãã³ã³ããŒãã³ãã®ãããã£ã¬ã¯ããªã«é 眮ããå¿ èŠããããŸãããã¡ã€ã«ã®å 容ã¯æ¬¡ã®ãšããã§ãã
# put here your custom config value
menu "Example Configuration"
config ESP_WIFI_SSID
string "Keenetic"
default "myssid"
help
SSID (network name) for the example to connect to.
config ESP_WIFI_PASSWORD
string "password"
default "mypassword"
help
WiFi password (WPA or WPA2) for the example to use.
endmenu
idf.py menuconfigã³ãã³ããåŒã³åºããåŸãè¿œå ã®ã»ã¯ã·ã§ã³ãsdkconfigãã¡ã€ã«ã«èªåçã«è¿œå ãããŸããPlatformIOãããžã§ã¯ãã§idf.pymenuconfigã³ãã³ããåŒã³åºãããšãã§ããŸãããPlatformIOãããžã§ã¯ãã®æ§é ãåŸæ¥ã®ESP-IDFãšã¯ç°ãªããšããäºå®ãèæ ®ããå¿ èŠããããŸãããã®ãããsdkconfigãã¡ã€ã«ãåçæããŠã«ã¹ã¿ã èšå®ã埮調æŽã§ããŸããäžèšã®ãªãã·ã§ã³ã¯ããã§å¯èœã§ã-æåã§ãã¡ã€ã«ãç·šéãããmainã®srcãã£ã¬ã¯ããªã®ååãäžæçã«å€æŽããããŸãã¯CMakeLists.txtãã¡ã€ã«ãèšå®ããŸãã
ãããžã§ã¯ããã³ã³ãã€ã«ããŠããŒãããŸãã
ãããžã§ã¯ãããã«ãããã«ã¯ãã³ãã³ããå ¥åããå¿ èŠããããŸã
idf.py build
ãã®ã³ãã³ãã¯ãã¢ããªã±ãŒã·ã§ã³ãšãã¹ãŠã®ESP-IDFã³ã³ããŒãã³ããã³ã³ãã€ã«ããŠãããããŒããŒãããŒãã£ã·ã§ã³ããŒãã«ãããã³ã¢ããªã±ãŒã·ã§ã³ãã€ããªãçæããŸãã
$ idf.py build
Running cmake in directory /path/to/hello_world/build
Executing "cmake -G Ninja --warn-uninitialized /path/to/hello_world"...
Warn about uninitialized values.
-- Found Git: /usr/bin/git (found version "2.17.0")
-- Building empty aws_iot component due to configuration
-- Component names: ...
-- Component paths: ...
... (more lines of build system output)
[527/527] Generating hello-world.bin
esptool.py v2.3.1
Project build complete. To flash, run this command:
../../../components/esptool_py/esptool/esptool.py -p (PORT) -b 921600 write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x10000 build/hello-world.bin build 0x1000 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin
or run 'idf.py -p PORT flash'
åçŽãªãããžã§ã¯ãã§ãæåã®ã³ã³ãã€ã«ããã»ã¹ã«ã¯æéãããããããArduinoãã¬ãŒã ã¯ãŒã¯ãšã¯ç°ãªããå€ãã®è¿œå ã®ESP-IDFã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ãããããšã«æ³šæããŠãã ããããœãŒã¹ãããã«å€æŽãããšãåããã¡ã€ã«ãã³ã³ãã€ã«ãããã ãã§ããäŸå€ã¯æ§æã®å€æŽã§ãã
ã³ã³ãã€ã«ããããã€ããªïŒbootloader.binãpartition-table.binãããã³hello-world.binïŒãESP32ããŒãã«ããŠã³ããŒãããã«ã¯ã次ã®ã³ãã³ããå®è¡ããŸãã
idf.py -p PORT [-b BAUD] flash
ããã§ãPORTãå¿ èŠãªãã®ïŒCOM1ã/ dev / ttyUSB1ïŒã«çœ®ãæãããªãã·ã§ã³ã§BAUDã«å¿ èŠãªå€ãæå®ããŠããŠã³ããŒãé床ãå€æŽã§ããŸãã
ããŒããããããã°ã©ã ã远跡ããã«ã¯ãHTermãCoolTermãªã©ã®ä»»æã®comããŒãç£èŠãŠãŒãã£ãªãã£ã䜿çšã§ããŸããããŸãã¯IDFã¢ãã¿ãŒç£èŠãŠãŒãã£ãªãã£ã䜿çšããŠéå§ããã«ã¯ã次ã®ã³ãã³ããå ¥åããŸãã
idf.py -p PORT monitor
ESP-IDFEclipseãã©ã°ã€ã³
ãã©ã°ã€ã³ã®ã€ã³ã¹ããŒã«ãšæ§æã«é¢ããããã¥ã¡ã³ãã¯ã次ã®å Žæã«ãã
ãŸãã䜿çšããããªã»ããïŒ
- Java11以éãïŒJava 8ã§åäœããŸããããããããã®ã°ãªãããåå ã§ãïŒã
- Python3.5以éã
- Eclipse 2020-06 CDT;
- ã®ãã;
- ESP-IDF4.0以éã
ãã©ã°ã€ã³ã¯éçºç°å¢ã«éåžžã«ããçµ±åãããŠãããæ©èœã®å€§éšåãèªååããŸããããããæ®å¿µãªãããè»èã«ããšããªãããã§ã¯ãããŸããã2019-09以éã®EclipseããŒãžã§ã³ã§ã¯ãWindowsäžã®ESP-IDFãããžã§ã¯ãã®ãœãŒã¹ãã¡ã€ã«ã®ã€ã³ããã¯ã¹äœæã«ãŸã ãã°ããããŸãã
ããã«ãäžæãªçç±ã§ãããžã§ã¯ããåçŽã«ãã«ããããªãå Žåãä»ã®äžå ·åãçºçããŸãããããžã§ã¯ããéããŠEclipseãåèµ·åããã ãã§åœ¹ã«ç«ã¡ãŸãã
ESP-IDF VisualStudioã³ãŒãæ¡åŒµ
ãããŠæåŸã«ãç§ã®æèŠã§ã¯ãæãèå³æ·±ããªãã·ã§ã³ã¯Visual StudioCodeã®å ¬åŒãã©ã°ã€ã³ã§ãã
PlatformIOãšåæ§ã«ãæ¡åŒµæ©èœã»ã¯ã·ã§ã³ããç°¡åã«ã€ã³ã¹ããŒã«ã§ããŸãããã®æ¡åŒµæ©èœã§ã®ESP-IDFãã¬ãŒã ã¯ãŒã¯ã®ã€ã³ã¹ããŒã«ãšæ§æã¯ããªã³ããŒãã£ã³ã°ã¡ãã¥ãŒãšããŠè¡šç€ºãããŸããããã«ã€ããŠãã説æã§èª¬æããŠããŸãããã¹ãŠã®ã³ã³ããŒãã³ãã®ããŠã³ããŒããšã€ã³ã¹ããŒã«ã¯ãã¡ãã¥ãŒæ®µéãééããéçšã§èªåçã«è¡ãããŸããããã»ã¹ã®ãã¹ãŠã®ã¹ã¯ãªãŒã³ã·ã§ãããåŒçšã§ããŸããããããã¯çŽæçã§ããã説æã¯ã»ãšãã©ãŸãã¯ãŸã£ããå¿ èŠãããŸããã PlatformIOãæ¯æããŠããããžã§ã¯ããæ§ç¯ãããŠã³ããŒããããã³ç£èŠããããã®ãã䟿å©ãªããŒã«ãããã«æ³šç®ããããšãã§ããŸããå¯Ÿç §çã«ãESP-IDFãã©ã°ã€ã³ã¯ãF1ããŒããŸãã¯ããã¥ã¢ã«ã«èšèŒãããŠããããŒã®çµã¿åããã䜿çšããŠåŒã³åºãããšãã§ããã³ãã³ãã¡ãã¥ãŒã䜿çšããŠå¶åŸ¡ãããŸãã
ãã©ã°ã€ã³ã®åæèšå®
ãã©ã°ã€ã³ã䜿çšããå©ç¹ã¯ãåŸæ¥ã®ãããžã§ã¯ãæ§é ãå°éãããèšå®ãããããåãå¿ èŠããªãããšã§ãïŒPlatformIOã§ã¯ããã®ãããªå¿ èŠãçããŸãïŒã以åã«äœæãããããžã§ã¯ããESP-IDFãã©ã°ã€ã³ã䜿çšããŠVisualStudioã³ãŒãã§éãå Žåã¯ã.vscodeãã£ã¬ã¯ããªããããžã§ã¯ãã®ã«ãŒãã«ã³ããŒããã ãã§æžã¿ãŸããããã¯ãESP-ã䜿çšããŠãã³ãã¬ãŒããããžã§ã¯ããå°ãªããšã1åçæããããšã§ååŸã§ããŸãã IDFãã©ã°ã€ã³ã
ã³ãã³ãã¡ãã¥ãŒ
FreeRTOS
ãŠã£ãããã£ã¢ã«ãããšãFreeRTOSã¯çµã¿èŸŒã¿ã·ã¹ãã çšã®ãªã¢ã«ã¿ã€ã ãã«ãã¿ã¹ã¯ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒRTOSïŒã§ããFreeRTOSã¯ããã¹ãŠã®ã¹ã¬ããããŸãã¯OSçšèªã§ã¯ã¿ã¹ã¯ã«ãã£ãŠCPUæéãå ±æããããšã«ããããã«ãã¿ã¹ã¯ãæäŸããŸããç§ã®æèŠã§ã¯ããã·ã¢èªã§æãå®å šã§ããããããFreeRTOSããã¥ã¢ã«ã¯ããã«ãããŸããå ã®èšèªã§ã¯ãããã¥ã¢ã«ã¯å ¬åŒãœãŒã¹ãã調ã¹ãããšãã§ããŸããã¿ã¹ã¯ã®ã¹ããŒã¿ã¹ã®åçã®ã¿ãæäŸããŸãã
FreeRTOSã¯ãESP32ã§äœ¿çšãããXtensaããã»ããµãå«ããããŸããŸãªããŒããŠã§ã¢ãã©ãããã©ãŒã ã«ç§»æ€ãããŠããŸãã詳现ã«ã€ããŠã¯ãããã¥ã¡ã³ããã芧ãã ããã
GPIO
GPIOãŸãã¯ãŠãããŒãµã«å ¥å/åºåã¯ãã1ããŸãã¯ã0ãä¿¡å·ã§ãã³ãåå¥ã«å¶åŸ¡ããæ©èœã§ãã
ååã瀺ãããã«ããã®ãããªãã³ã«ã¯ãå ¥åãŸãã¯åºåã®2ã€ã®åäœã¢ãŒãããããŸããæåã®ã±ãŒã¹ã§ã¯ãå€ãèªã¿åãã2çªç®ã®ã±ãŒã¹ã§ã¯ããããæžãçããŸãã GPIOãæ±ãéã®ãã1ã€ã®éèŠãªèŠçŽ ã¯ãé»å§ã¬ãã«ã§ãã ESP32ã¯3.3Vããã€ã¹ã§ããããã5V以äžã®é»å§ãæã€ä»ã®ããã€ã¹ã䜿çšããå Žåã¯æ³šæãå¿ èŠã§ãã GPIOãã³ã«é©çšã§ããæ倧é»æµã¯12mAã§ããããšãç解ããããšãéèŠã§ãã ESP-IDFãæäŸããGPIOé¢æ°ã䜿çšããã«ã¯ãdriver /gpio.hããããŒãæ¥ç¶ããå¿ èŠããããŸãã次ã«ãgpio_pad_select_gpioïŒïŒãåŒã³åºããŠããã®ãã³ã®æ©èœãæå®ã§ããŸãã ESP32ã«ã¯34ã®ç°ãªãGPIOããããŸãããããã¯æ¬¡ã®ããã«æå®ãããŸãã
- GPIO_NUM_0-GPIO_NUM_19
- GPIO_NUM_21-GPIO_NUM_23
- GPIO_NUM_25-GPIO_NUM_27
- GPIO_NUM_32-GPIO_NUM_39
次ã®çªå·ã¯ããã³
20ã24ã28ã29ã30 ãããã³31ã®æ°ã«ã¯å«ãŸããŠããŸããããã³é 眮衚ã¯ããã«ãããŸãã
ãã³GPIO_NUM_34-GPIO_NUM_39-ã¯å ¥åã¢ãŒãã®ã¿ã䜿çšããããšã«æ³šæããŠãã ãããä¿¡å·åºåã«ã¯äœ¿çšã§ããŸãããããã«ããã³6ã7ã8ã9ã10ãããã³11ã¯ãSPIãä»ããŠå€éšãã©ãã·ã¥ã«ãŒããšå¯Ÿè©±ããããã«äœ¿çšãããŸããä»ã®ç®çã§äœ¿çšããããšã¯ãå§ãããŸããããæ¬åœã«å¿ èŠãªå Žåã¯äœ¿çšã§ããŸããgpio_num_tããŒã¿ã¿ã€ãã¯ããã³çªå·ã«å¯Ÿå¿ããå€ãæã€åæåã§ããæ°å€ã§ã¯ãªãããããã®å€ã䜿çšããããšããå§ãããŸãããã³ã®æ¹åã¯ãgpio_set_directionïŒïŒé¢æ°ã䜿çšããŠèšå®ãããŸããããšãã°ããã³ãåºåãšããŠèšå®ããã«ã¯ã次ã®ããã«ããŸãã
gpio_set_direction(GPIO_NUM_17, GPIO_MODE_OUTPUT);
ãã³ãå ¥åãšããŠèšå®ããã«ã¯ïŒ
gpio_set_direction(GPIO_NUM_17, GPIO_MODE_INPUT);
GPIOãåºåãšããŠæ§æããå Žåãgpio_set_levelïŒïŒãåŒã³åºãããšã«ããããã®å€ã1ãŸãã¯0ã«èšå®ã§ããŸãã
次ã®äŸã§ã¯ãGPIOã1ç§ã«1ååãæ¿ããŸãã
gpio_pad_select_gpio(GPIO_NUM_17);
gpio_set_direction(GPIO_NUM_17, GPIO_MODE_OUTPUT);
while(1) {
printf("Off\n");
gpio_set_level(GPIO_NUM_17, 0);
vTaskDelay(1000 / portTICK_RATE_MS);
printf("On\n");
gpio_set_level(GPIO_NUM_17, 1);
vTaskDelay(1000 / portTICK_RATE_MS);
}
åã ã®ãã³ã®ãã¹ãŠã®å±æ§ãèšå®ãã代ããã«ãgpio_configïŒïŒé¢æ°ãåŒã³åºããŠ1ã€ä»¥äžã®æ¥ç¹ã®ããããã£ãèšå®ã§ããŸããå ¥åãšããŠgpio_config_tæ§é ãåããããããã¹ã¯ã§è¡šããããã¹ãŠã®ãã³ã®æ¹åããã«ã¢ããããã«ããŠã³ãããã³å²ã蟌ã¿èšå®ãèšå®ããŸãã
äŸãã°ïŒ
gpio_config_t gpioConfig;
gpioConfig.pin_bit_mask = (1 << 16) | (1 << 17);
gpioConfig.mode = GPIO_MODE_OUTPUT;
gpioConfig.pull_up_en = GPIO_PULLUP_DISABLE;
gpioConfig.pull_down_en = GPIO_PULLDOWN_ENABLE;
gpioConfig.intr_type = GPIO_INTR_DISABLE;
gpio_config(&gpioConfig);
ãã«ã¢ããããã³ãã«ããŠã³èšå®
éåžžãGPIOå ¥åãã³ããã€ãŸãã¯ããŒã§ãããšèªã¿åãããŸããããã¯ãé»æºãŸãã¯ã¢ãŒã¹ã«æ¥ç¶ãããŠããããšãæå³ããŸãããã ãããã³ãäœã«ãæ¥ç¶ãããŠããªãå Žåã¯ãããããŒãã£ã³ã°ãç¶æ ã«ãªã£ãŠããŸããå€ãã®å Žåãæ¥ç¶ãããŠããªããã³ã®åæã¬ãã«ãé«ãŸãã¯äœã«èšå®ããå¿ èŠããããŸãããã®å Žåãåºåã®ããŒããŠã§ã¢ïŒæµæã䜿çšããæ¥ç¶ïŒãŸãã¯ãœãããŠã§ã¢ã®ãã«ã¢ãããããããã+ V-ãã«ã¢ãããŸãã¯0-ãã«ããŠã³ã«å®è¡ãããŸãã ESP32 SDKã§ã¯ãgpio_set_pull_modeïŒïŒé¢æ°ã䜿çšããŠãGPIOããã«ã¢ãããŸãã¯ãã«ããŠã³ãšããŠå®çŸ©ã§ããŸãããã®é¢æ°ã¯ãèšå®ãããã³ã®çªå·ãšããã®ãã³ã«é¢é£ä»ããããŠãããã«ã¢ããã¢ãŒããå ¥åãšããŠåãåããŸãã
äŸãã°ïŒ
gpio_set_pull_mode (21, GPIO_PULLUP_ONLY);
GPIOå²ã蟌ã¿åŠç
ãã³ã®å ¥åä¿¡å·ã®å€åãæ€åºããããã«ããã®ã¹ããŒã¿ã¹ãå®æçã«ããŒãªã³ã°ã§ããŸãããããã¯ããã€ãã®çç±ããæåã®è§£æ±ºçã§ã¯ãããŸããããŸãããã§ãã¯ãç¹°ãè¿ããŠãCPUæéãç¡é§ã«ããå¿ èŠããããŸãã次ã«ãããŒãªã³ã°ã®æç¹ã§ãé 延ã®ããã«ãã³ã®ç¶æ ãé¢ä¿ããªããªã£ãŠããå¯èœæ§ããããå ¥åä¿¡å·ãã¹ãããã§ããŸãããããã®åé¡ã®è§£æ±ºçã¯äžæã§ããäžæã¯ãã¢ãã«ã®ãããªãã®ã§ãã鳎ãããã«ã誰ãããã¢ã«ãããã©ãããå®æçã«ãã§ãã¯ããå¿ èŠããããŸãããœãŒã¹ã³ãŒãã§ã¯ããã³ãä¿¡å·ã®å€ãå€æŽãããšãã«åŒã³åºãããå²ã蟌ã¿ã³ãŒã«ããã¯é¢æ°ãå®çŸ©ã§ããŸãã次ã®ãã©ã¡ãŒã¿ãèšå®ããããšã§ããã³ãã©ãåŒã³åºãããåå ãç¹å®ããããšãã§ããŸãã
- ç¡å¹-ä¿¡å·ãå€åããŠãäžæãåŒãèµ·ãããŸããã
- PosEdge-äœããé«ã«å€æŽãããšãã«å²ã蟌ã¿ãã³ãã©ãŒãåŒã³åºããŸãã
- NegEdge-é«ããäœã«å€æŽãããšãã«å²ã蟌ã¿ãã³ãã©ãŒãåŒã³åºããŸãã
- AnyEdge-äœããé«ã«å€æŽãããšãããŸãã¯é«ããäœã«å€æŽãããšãã«ãå²ã蟌ã¿ãã³ãã©ãŒãåŒã³åºããŸãã
å²ã蟌ã¿ãã³ãã©ãŒã¯ãã³ã³ãã€ã«æã«RAMã«ããŒãããããã«ããŒã¯ã§ããŸããããã©ã«ãã§ã¯ãçæãããã³ãŒãã¯ãã©ãã·ã¥ã¡ã¢ãªã«ãããŸããäºåã«IRAM_ATTRãšããŠããŒã¯ããŠãããšãRAMããããã«å®è¡ã§ããããã«ãªããŸãã
void IRAM_ATTR my_gpio_isr_handle(void *arg) {...}
ãã€ã¯ãã¡ãŒã¿ã䜿çšããããšããã人ã¯ããã¿ã³ããã®å ¥åä¿¡å·ã®åŠçã«ã¯ã³ã³ã¿ã¯ãããŠã³ã¹ã䌎ãããšãç¥ã£ãŠããŸããããã¯äžé£ã®é·ç§»ããããã£ãŠäžé£ã®å²ã蟌ã¿ãã³ãã©ã€ãã³ããšããŠè§£éã§ããŸãããããè¡ãã«ã¯ãé£çµ¡å ããŠã³ã¹åŠçãã³ãŒãã«è¿œå ããå¿ èŠããããŸãããããè¡ãã«ã¯ãå ã®ã€ãã³ããèªã¿åããæ¯åãåãŸããŸã§åŸ ã£ãŠãããå ¥åç¶æ ãåãµã³ããªã³ã°ããå¿ èŠããããŸãã
次ã®äŸã¯ãå ¥åä¿¡å·ã®å²ã蟌ã¿åŠçã瀺ããŠããŸãããŸã æ £ããŠããªãå Žåã¯ãã³ãŒããããã«ç解ããããã«ãFreeRTOSã®ãã¥ãŒç®¡çã«ç²Ÿéããããšã匷ããå§ãããŸãããã®äŸã¯ã2ã€ã®ã¿ã¹ã¯ã瀺ããŠããŸãã
- test1_taskã¯ããã³25ã§ä¿¡å·ãã¢ã¯ãã£ãåããããã¯ãªãã¯ãç»é²ããŸããããšããã¡ãã»ãŒãžãã³ã³ãœãŒã«ã«1å衚瀺ããããšãã«ãå²ã蟌ã¿ã€ãã³ããçºçãããšããã¯ã解é€ãããŸãã
- test2_taskã¯å®æçã«ããŒãªã³ã°ããããã³26ã®ä¿¡å·ãã¢ã¯ãã£ãã«ãªããšããGPIO 26ããã€ã§ãïŒããšããã¡ãã»ãŒãžã100ããªç§ããšã«ã³ã³ãœãŒã«ã«åºåãããŸãã
ãã®äŸã«ã¯ããœãããŠã§ã¢ã¿ã€ããŒxTimerãèšå®ãããŠããŸãããã®å Žåãéåæé 延ã®äŸãšããŠã§ã¯ãªãããªãã·ã§ã³ã§ãã
ã¢ã³ãããŠã³ã¹ã¯ãtimeval_durationBeforeNowé¢æ°ã䜿çšããŠå®è¡ãããŸãããã®é¢æ°ã¯ããã¬ã¹ã100ããªç§ä»¥äžç¶ããã©ããããã§ãã¯ããŸããä»ã«ãããŠã³ã¹é²æ¢ãœãããŠã§ã¢ã®ãã¿ãŒã³ããããŸãããæå³ã¯ã»ãŒåãã§ããESP-IDFã«ã¯ã GPIOã®åäœäŸãå«ãŸããŠããŸãã
å
¥åä¿¡å·åŠç
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "freertos/queue.h"
#include "c_timeutils.h"
#include "freertos/timers.h"
static char tag[] = "test_intr";
static QueueHandle_t q1;
TimerHandle_t xTimer;
#define TEST_GPIO (25)
static void handler(void *args) {
gpio_num_t gpio;
gpio = TEST_GPIO;
xQueueSendToBackFromISR(q1, &gpio, NULL);
}
void test1_task(void *ignore) {
struct timeval lastPress;
ESP_LOGD(tag, ">> test1_task");
gpio_num_t gpio;
q1 = xQueueCreate(10, sizeof(gpio_num_t));
gpio_config_t gpioConfig;
gpioConfig.pin_bit_mask = GPIO_SEL_25;
gpioConfig.mode = GPIO_MODE_INPUT;
gpioConfig.pull_up_en = GPIO_PULLUP_DISABLE;
gpioConfig.pull_down_en = GPIO_PULLDOWN_ENABLE;
gpioConfig.intr_type = GPIO_INTR_POSEDGE;
gpio_config(&gpioConfig);
gpio_install_isr_service(0);
gpio_isr_handler_add(TEST_GPIO, handler, NULL);
while(1) {
//ESP_LOGD(tag, "Waiting on queue");
BaseType_t rc = xQueueReceive(q1, &gpio, portMAX_DELAY);
//ESP_LOGD(tag, "Woke from queue wait: %d", rc);
struct timeval now;
gettimeofday(&now, NULL);
if (timeval_durationBeforeNow(&lastPress) > 100) {
if(gpio_get_level(GPIO_NUM_25)) {
ESP_LOGD(tag, "Registered a click");
if( xTimerStart( xTimer, 0 ) != pdPASS ) {
// The timer could not be set into the Active state.
}
}
}
lastPress = now;
}
vTaskDelete(NULL);
}
void test2_task(void *ignore) {
gpio_set_direction(GPIO_NUM_26, GPIO_MODE_INPUT);
gpio_set_pull_mode(GPIO_NUM_26, GPIO_PULLDOWN_ONLY);
while(true) {
if(gpio_get_level(GPIO_NUM_26)) {
ESP_LOGD(tag, "GPIO 26 is high!");
if( xTimerStart( xTimer, 0 ) != pdPASS ) {
// The timer could not be set into the Active state.
}
}
vTaskDelay(100/portTICK_PERIOD_MS);
}
}
void vTimerCallback( TimerHandle_t pxTimer ) {
ESP_LOGD(tag, "The timer has expired!");
}
void app_main(void)
{
xTaskCreate(test1_task, "test_task1", 5000, NULL, 8, NULL);
xTaskCreate(test2_task, "test_task2", 5000, NULL, 8, NULL);
xTimer = xTimerCreate("Timer", // Just a text name, not used by the kernel.
2000/portTICK_PERIOD_MS, // The timer period in ticks.
pdFALSE, // The timers will auto-reload themselves when they expire.
( void * ) 1, // Assign each timer a unique id equal to its array index.
vTimerCallback // Each timer calls the same callback when it expires.
);
}
PCNTïŒãã«ã¹ã«ãŠã³ã¿ãŒïŒ
PCNTïŒãã«ã¹ã«ãŠã³ã¿ãŒïŒ ã¢ãžã¥ãŒã«ã¯ãå ¥åä¿¡å·ã®ç«ã¡äžãããšããžããã³/ãŸãã¯ç«ã¡äžãããšããžã®æ°ãã«ãŠã³ãããããã«èšèšãããŠããŸããã¢ãžã¥ãŒã«ã®åãããã¯ã«ã¯ã16ãããã®ç¬Šå·ä»ãã¬ãžã¹ã¿ãšãã«ãŠã³ã¿å€ãå¢æžããããã«æ§æã§ãã2ã€ã®ãã£ãã«ããããŸããåãã£ãã«ã«ã¯ãä¿¡å·ã®å€åããã£ããã£ããå ¥åä¿¡å·ãšãã«ãŠã³ããæå¹ãŸãã¯ç¡å¹ã«ããããã«äœ¿çšã§ããå¶åŸ¡å ¥åããããŸããå ¥åã«ã¯ãäžèŠãªä¿¡å·ã¹ãã€ã¯ãæé€ããããã«äœ¿çšã§ããè¿œå ã®ãã£ã«ã¿ãŒããããŸãã
PCNTã«ãŠã³ã¿ãŒã«ã¯ã0ãã7ãŸã§ã®çªå·ãä»ãããã8ã€ã®ç¬ç«ãããŠãããããããŸããAPIã§ã¯ãpcnt_unit_tã䜿çšããŠæå®ãããŸããåã¢ãžã¥ãŒã«ã«ã¯ãpcnt_channel_tã§ç€ºããã0ãš1ã®çªå·ãä»ãããã2ã€ã®ç¬ç«ãããã£ãã«ããããŸãã
æ§æã¯ãpcnt_config_tã䜿çšããŠããã€ã¹ãã£ãã«ããšã«åå¥ã«æäŸããã以äžãã«ããŒããŸãã
- ãã®æ§æãå±ãããŠãããçªå·ãšãã£ãã«çªå·ã
- ãã«ã¹å ¥åããã³ã²ãŒãå ¥åGPIOçªå·ã
- å¶åŸ¡ä¿¡å·ã®ç¶æ ã«å¿ããŠã«ãŠã³ã¿ãã©ã®ããã«åå¿ããããããã³ç«ã¡äžãããšããž/ç«ã¡äžãããšããžãã©ã®ããã«ã«ãŠã³ããããããå®çŸ©ããã2çµã®ãã©ã¡ãŒã¿pcnt_ctrl_mode_tãšpcnt_count_mode_tã
- ãŠã©ãããã€ã³ããèšå®ãããã«ã¹ã«ãŠã³ã¿ãŒãç¹å®ã®å¶éã«éãããšãã«å²ã蟌ã¿ãããªã¬ãŒããããã«äœ¿çšããã2ã€ã®å¶éå€ïŒæå°/æ倧ïŒã
次ã«ãç¹å®ã®ãã£ãã«ã®æ§æã¯ãäžèšã®pcnt_config_tæ§ææ§é ãå ¥åãã©ã¡ãŒã¿ãŒãšããŠäœ¿çšããŠpcnt_unit_configïŒïŒé¢æ°ãåŒã³åºãããšã«ãã£ãŠè¡ãããŸãã
æ§æã§ãã«ã¹ãŸãã¯å¶åŸ¡å ¥åãç¡å¹ã«ããã«ã¯ãGPIOçªå·ã®ä»£ããã«PCNT_PIN_NOT_USEDãæå®ããå¿ èŠããããŸãã
pcnt_unit_configïŒïŒã§æ§æããåŸãã«ãŠã³ã¿ãŒã¯ããã«å®è¡ãéå§ããŸãã环ç©ãããã«ãŠã³ã¿ãŒå€ã¯ãpcnt_get_counter_valueïŒïŒãåŒã³åºãããšã§ç¢ºèªã§ããŸãã
次ã®é¢æ°ã䜿çšãããšãã«ãŠã³ã¿ãŒæäœãå¶åŸ¡ã§ããŸããpcnt_counter_pauseïŒïŒãpcnt_counter_resumeïŒïŒãããã³pcnt_counter_clearïŒïŒ
pcnt_set_modeïŒïŒãåŒã³åºããŠãpcnt_unit_configïŒïŒã䜿çšããŠä»¥åã«èšå®ããã«ãŠã³ã¿ãŒã¢ãŒããåçã«å€æŽããããšãã§ããŸãã
å¿ èŠã«å¿ããŠãpcnt_set_pinïŒïŒã䜿çšããŠããã«ã¹å ¥åãã³ãšå¶åŸ¡å ¥åãã³ããªã³ã¶ãã©ã€ã§å€æŽã§ããŸãã
PCNTã¢ãžã¥ãŒã«ã«ã¯ããã«ã¹å ¥åãšå¶åŸ¡å ¥åã®ããããã«ãã£ã«ã¿ãŒããããä¿¡å·ã®çãã¹ãã€ã¯ãç¡èŠããæ©èœãè¿œå ãããŠããŸããç¡èŠããããã«ã¹ã®é·ãã¯ãpcnt_set_filter_valueïŒïŒãåŒã³åºãããšã«ãããAPB_CLKã¯ããã¯ãµã€ã¯ã«ã§æäŸãããŸããçŸåšã®ãã£ã«ã¿ãŒèšå®ã¯ãpcnt_get_filter_valueïŒïŒã§ç¢ºèªã§ããŸãã APB_CLKãµã€ã¯ã«ã¯80MHzã§åäœããŸãã
pcnt_filter_enableïŒïŒ/ pcnt_filter_disableïŒïŒãåŒã³åºãããšã«ããããã£ã«ã¿ãŒãéå§/äžæåæ¢ãããŸãã
pcnt_evt_type_tã§å®çŸ©ãããŠãã次ã®ã€ãã³ãã¯ãå²ã蟌ã¿ãããªã¬ãŒã§ããŸãããã®ã€ãã³ãã¯ããã«ã¹ã«ãŠã³ã¿ãŒãç¹å®ã®å€ã«éãããšãã«çºçããŸãã
- : counter_l_lim counter_h_lim, pcnt_config_t;
- 0 1, pcnt_set_event_value ().
- = 0
äžèšã®ã€ãã³ãã®å²ã蟌ã¿ãç»é²ãæå¹åããŸãã¯ç¡å¹åããã«ã¯ãpcnt_isr_registerïŒïŒãpcnt_intr_enableïŒïŒãããã³pcnt_intr_disableïŒïŒãåŒã³åºãå¿ èŠããããŸãããããå€ã«éãããšãã«ã€ãã³ããæå¹ãŸãã¯ç¡å¹ã«ããã«ã¯ãpcnt_event_enableïŒïŒããã³pcnt_event_disableïŒïŒãåŒã³åºãå¿ èŠããããŸãã
çŸåšèšå®ãããŠãããããå€ã確èªããã«ã¯ãpcnt_get_event_valueïŒïŒé¢æ°ã䜿çšããŸãã
ESP-IDFã®äŸãããã«ç€ºããŸãã
PCNTã«ãŠã³ã¿ãŒã䜿çšããŠãã€ãŒã«é床ãèšç®ããŸããããããè¡ãã«ã¯ã1å転ãããã®ãã«ã¹æ°ãã«ãŠã³ãããŠãããã«ãŠã³ã¿ãŒããªã»ããããå¿ èŠããããŸãã
ãµã³ãã«ã³ãŒã
typedef struct {
uint16_t delay; //delay im ms
int pin;
int ctrl_pin;
pcnt_channel_t channel;
pcnt_unit_t unit;
int16_t count;
} speed_sensor_params_t;
esp_err_t init_speed_sensor(speed_sensor_params_t* params) {
/* Prepare configuration for the PCNT unit */
pcnt_config_t pcnt_config;
// Set PCNT input signal and control GPIOs
pcnt_config.pulse_gpio_num = params->pin;
pcnt_config.ctrl_gpio_num = params->ctrl_pin;
pcnt_config.channel = params->channel;
pcnt_config.unit = params->unit;
// What to do on the positive / negative edge of pulse input?
pcnt_config.pos_mode = PCNT_COUNT_INC; // Count up on the positive edge
pcnt_config.neg_mode = PCNT_COUNT_DIS; // Keep the counter value on the negative edge
pcnt_config.lctrl_mode = PCNT_MODE_REVERSE; // Reverse counting direction if low
pcnt_config.hctrl_mode = PCNT_MODE_KEEP; // Keep the primary counter mode if high
pcnt_config.counter_h_lim = INT16_MAX;
pcnt_config.counter_l_lim = - INT16_MAX;
/* Initialize PCNT unit */
esp_err_t err = pcnt_unit_config(&pcnt_config);
/* Configure and enable the input filter */
pcnt_set_filter_value(params->unit, 100);
pcnt_filter_enable(params->unit);
/* Initialize PCNT's counter */
pcnt_counter_pause(params->unit);
pcnt_counter_clear(params->unit);
/* Everything is set up, now go to counting */
pcnt_counter_resume(params->unit);
return err;
}
int32_t calculateRpm(speed_sensor_params_t* params) {
pcnt_get_counter_value(params->unit, &(params->count));
int32_t rpm = 60*(1000/params->delay)*params->count/PULSE_PER_TURN;
pcnt_counter_clear(params->unit);
return rpm;
}
MCPWMã¢ãžã¥ãŒã«ã䜿çšãããã«ã¹å¹ å€èª¿ïŒPWMïŒ
ã¢ãžã¥ãŒã«ã«é¢ããæ å ±ã¯ããã«è¡šç€ºãããŸããç¹ã«Arduinoã«é¢é£ããŠæ€çŽ¢ããå Žå
ã¯ãPWMã®ãããã¯ã«é¢ããå€ãã®èšäºããããäžã«ãããŸãã
ãŠã£ãããã£ã¢ã§ã¯ãçãç°¡æœãªå®çŸ©ïŒãã«ã¹å¹ å€èª¿ïŒPWMïŒïŒã瀺ããŠããŸããããã¯ãããã€ã¹ããªã³/ãªãããããšã«ãã£ãŠé»åãå¶åŸ¡ããããã»ã¹ã§ãã PWMå¶åŸ¡ã®åçã¯ãä¿¡å·ã®äžå®ã®æ¯å¹ ãšåšæ³¢æ°ã§ãã«ã¹å¹ ãå€æŽããããšã§ãã
Arduinoã®PWMåšæ³¢æ°ã¯488.28Hzãå解èœã¯8ãããïŒ0 ... 255ïŒã§ã6ã€ã®ããŒããŠã§ã¢ãã³3ã5ã6ã9ã10ã11ã䜿çšã§ããŸãããã ããAVRãã€ã¯ãã³ã³ãããŒã©ãŒã®ã¬ãžã¹ã¿èšå®ã䜿çšãããšãä»ã®å€ãå®çŸã§ããŸãã PWMåšæ³¢æ°ã
ESP32ãã€ã¯ãããã»ããµã«ã¯ãåå¥ã®MCPWMã¢ãžã¥ãŒã«ããŸãã¯2ã€ã®ã¢ãžã¥ãŒã«ããããããããã«3察ã®PWMãã³ããããŸãã
ããã«ãããã¥ã¡ã³ãã§ã¯ãåå¥ã®ãããã¯ã®åºåã¯PWMxA / PWMxBãšããŒã¯ãããŠããŸãã
MCPWMãããã¯ã®ãã詳现ãªãããã¯å³ã以äžã«ç€ºããŸããåA / Bãã¢ã¯ãã¿ã€ããŒ0ã1ãããã³2ã®3ã€ã®ã¿ã€ããŒã®ãããããšåæã§ããŸããåãã¿ã€ããŒã䜿çšããŠãPWMåºåã®è€æ°ã®ãã¢ãåæã§ããŸããåãŠãããã¯ãåæä¿¡å·ãªã©ã®å ¥åããŒã¿ãåéããéé»æµãã¢ãŒã¿ãŒéé»å§ãªã©ã®ã¢ã©ãŒã ãæ€åºããããŒã¿ãŒäœçœ®ãªã©ã®ãã£ããã£ä¿¡å·ã§ãã£ãŒãããã¯ãåä¿¡ããããšãã§ããŸãã
æ§æã®ç¯å²ã¯ãã¢ãŒã¿ãŒã®ã¿ã€ããç¹ã«å¿ èŠãªåºåãšå ¥åã®æ°ãããã³ã¢ãŒã¿ãŒãå¶åŸ¡ããããã®ä¿¡å·ã®ã·ãŒã±ã³ã¹ã«ãã£ãŠç°ãªããŸãã
ãã®äŸã§ã¯ãå©çšå¯èœãªMCPWMãªãœãŒã¹ã®äžéšã®ã¿ã䜿çšãããã©ã·ä»ãDCã¢ãŒã¿ãŒãé§åããããã®ç°¡åãªæ§æã«ã€ããŠèª¬æããŸããåè·¯äŸã以äžã«ç€ºããŸããã¢ãŒã¿ãŒïŒMïŒã«äŸçµŠãããé»å§ã®å極ãåãæ¿ããã¢ãŒã¿ãŒãé§åããã®ã«ååãªé»æµãäŸçµŠããããã®Hããªããžãå«ãŸããŠããŸãã
æ§æã«ã¯ã次ã®æé ãå«ãŸããŸãã
- ã¢ãŒã¿ãŒã®é§åã«äœ¿çšãããMPWnãããã¯ã®éžæãeSP32ããŒãã«ã¯ãmcpwm_unit_tã«ãªã¹ããããŠããã¢ãžã¥ãŒã«ãã2ã€ã®ã¢ãžã¥ãŒã«ããããŸãã
- mcpwm_gpio_initïŒïŒãåŒã³åºããŠãéžæããã¢ãžã¥ãŒã«ã®åºåãšããŠ2ã€ã®GPIOãåæåããŸãã2ã€ã®åºåä¿¡å·ã¯éåžžãã¢ãŒã¿ãŒãå³ãŸãã¯å·Šã«é§åããããã«äœ¿çšãããŸãã䜿çšå¯èœãªãã¹ãŠã®ä¿¡å·ãã©ã¡ãŒã¿ãŒã¯ãmcpwm_io_signals_tã«ãªã¹ããããŠããŸããäžåºŠã«è€æ°ã®ãã³ãèšå®ããã«ã¯ãmcpwm_set_pinïŒïŒé¢æ°ãmcpwm_pin_config_tãšäžç·ã«äœ¿çšããŸãã
- ã¿ã€ããŒã®éžæãããã€ã¹ã§äœ¿çšå¯èœãª3ã€ã®ã¿ã€ããŒããããŸããã¿ã€ããŒã¯mcpwm_timer_tã«ãªã¹ããããŠããŸãã
- mcpwm_config_tæ§é ã§ã¿ã€ããŒåšæ³¢æ°ãšããŒãã¹ãã©ãããèšå®ããŸãã
- äžèšã®ãã©ã¡ãŒã¿ã䜿çšããŠmcpwm_initïŒïŒãåŒã³åºããŸãã
PWMå¶åŸ¡æ¹æ³ã¯æ¬¡ã®ãšããã§ãã
- mcpwm_set_signal_high () mcpwm_set_signal_low (). . A B .
- â , mcpwm_start () mcpwm_stop (). .
- , mcpwm_set_duty () . mcpwm_set_duty_in_us (), . mcpwm_get_duty (). , mcpwm_set_duty_type (). A B mcpwm_generator_t. . mcpwm_init (), , mcpwm_duty_type_t.
ãã©ã·ããããã¢ãŒã¿ãŒã®ã³ãŒãã®äŸã次ã«ç€ºããŸãã
ç§ã®ãããžã§ã¯ãã§ã¯ãå®éã«äŸã®ã³ãŒãã䜿çšããŠããããã«ä¿®æ£ãã2çªç®ã®ã¢ãŒã¿ãŒã³ã³ãããŒã«ãè¿œå ããŸãããPWMãã£ãã«ãç¬ç«ããŠå¶åŸ¡ããã«ã¯ãMCPWM_TIMER_0ãCPWM_TIMER_1ãªã©ãããããã«åå¥ã®ã¿ã€ããŒãèšå®ããå¿ èŠããããŸãã
ãµã³ãã«ã³ãŒã
void mcpwm_example_gpio_initialize(void)
{
mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, GPIO_PWM0A_OUT);
mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0B, GPIO_PWM0B_OUT);
mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM1A, GPIO_PWM1A_OUT);
mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM1B, GPIO_PWM1B_OUT);
//mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM_SYNC_0, GPIO_SYNC0_IN);
mcpwm_config_t pwm_config;
pwm_config.frequency = 1000; //frequency = 500Hz,
pwm_config.cmpr_a = 0; //duty cycle of PWMxA = 0
pwm_config.cmpr_b = 0; //duty cycle of PWMxb = 0
pwm_config.counter_mode = MCPWM_UP_COUNTER;
pwm_config.duty_mode = MCPWM_DUTY_MODE_0;
mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); //Configure PWM0A & PWM0B with above settings
mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_1, &pwm_config); //Configure PWM0A & PWM0B with above settings
// deadtime (see clock source changes in mcpwm.c file)
mcpwm_deadtime_enable(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_BYPASS_FED, 80, 80); // 1us deadtime
mcpwm_deadtime_enable(MCPWM_UNIT_0, MCPWM_TIMER_1, MCPWM_BYPASS_FED, 80, 80);
}
WI-Fiã«æ¥ç¶ããŠMQTTãæäœãã
Wi-FIãããã³ã«ã®ãããã¯ã¯éåžžã«åºç¯å²ã§ãããããã³ã«ã説æããã«ã¯ãäžé£ã®åå¥ã®èšäºãå¿ èŠã«ãªããŸããå ¬åŒã¬ã€ãã§ã¯ãWi-Fiãã©ã€ããŒã®ã»ã¯ã·ã§ã³ãåç §ããŠãã ããããœãããŠã§ã¢APIã®èª¬æã¯ãã¡ãã§ããã³ãŒãäŸã¯ããã§èŠãããšãã§ããŸã
Wi-Fiã©ã€ãã©ãªã¯ãESP32Wi-Fiãããã¯ãŒãã³ã°æ©èœã®æ§æãšç£èŠããµããŒãããŸãã次ã®æ§æã䜿çšã§ããŸãã
- ( STA Wi-Fi). ESP32 .
- AP ( Soft-AP ). ESP32.
- AP-STA (ESP32 , ).
- (WPA, WPA2, WEP . .)
- ( ).
- Wi-Fi IEEE802.11.
MQTT
ãããŸãã¯ãã㧠ãããã¯ã«ç²Ÿéããããšãã§ããŸããäŸãå«ãESP-IDFããã¥ã¢ã«ã¯ãã¡ãã§ãã
ã³ãŒãã§MQTTãèšå®ããã«ã¯ãæåã«Wi-Fiãããã¯ãŒã¯ã«æ¥ç¶ããå¿ èŠããããŸãã次ã«ããããŒã«ãŒãžã®æ¥ç¶ã確ç«ããŸããã¡ãã»ãŒãžã¯ã³ãŒã«ããã¯ã§åŠçããããã®ãã©ã¡ãŒã¿ãŒã¯esp_mqtt_event_handle_tã€ãã³ãã§ããã€ãã³ãã¿ã€ããMQTT_EVENT_DATAã®å Žåããããã¯ãšããŒã¿ã解æã§ããŸããæ¥ç¶ãåæããããã¯ãµãã¹ã¯ãªãã·ã§ã³ãæåããçµæãšããŠãããŸããŸãªåäœãã«ã¹ã¿ãã€ãºã§ããŸãã
Wi-Fiæ¥ç¶ã®äŸïŒ
tcpip_adapter_init();
wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK(esp_event_loop_create_default());
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &ip_event_handler, NULL));
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );
ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
wifi_config_t sta_config = {
.sta = {
.ssid = CONFIG_ESP_WIFI_SSID,
.password = CONFIG_ESP_WIFI_PASSWORD,
.bssid_set = false
}
};
ESP_ERROR_CHECK( esp_wifi_set_config(WIFI_IF_STA, &sta_config) );
ESP_LOGI(TAG, "start the WIFI SSID:[%s] password:[%s]", CONFIG_ESP_WIFI_SSID, "******");
ESP_ERROR_CHECK( esp_wifi_start() );
ESP_LOGI(TAG, "Waiting for wifi");
xEventGroupWaitBits(wifi_event_group, BIT0, false, true, portMAX_DELAY);
//MQTT init
mqtt_event_group = xEventGroupCreate();
mqtt_app_start(mqtt_event_group);
MQTTãããŒã«ãŒãžã®æ¥ç¶
void mqtt_app_start(EventGroupHandle_t event_group)
{
mqtt_event_group = event_group;
const esp_mqtt_client_config_t mqtt_cfg = {
.uri = "mqtt://mqtt.eclipse.org:1883", //mqtt://mqtt.eclipse.org:1883
.event_handle = mqtt_event_handler,
.keepalive = 10,
.lwt_topic = "esp32/status/activ",
.lwt_msg = "0",
.lwt_retain = 1,
};
ESP_LOGI(TAG, "[APP] Free memory: %d bytes", esp_get_free_heap_size());
client = esp_mqtt_client_init(&mqtt_cfg);
esp_mqtt_client_start(client);
MQTTãã³ãã©ãŒ
esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
{
esp_mqtt_client_handle_t client = event->client;
int msg_id;
command_t command;
// your_context_t *context = event.context;
switch (event->event_id) {
case MQTT_EVENT_CONNECTED:
xEventGroupSetBits(mqtt_event_group, BIT1);
ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");
msg_id = esp_mqtt_client_subscribe(client, "esp32/car/#", 0);
msg_id = esp_mqtt_client_subscribe(client, "esp32/camera/#", 0);
ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);
break;
case MQTT_EVENT_DISCONNECTED:
ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");
break;
case MQTT_EVENT_SUBSCRIBED:
ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
msg_id = esp_mqtt_client_publish(client, "esp32/status/activ", "1", 0, 0, 1);
ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);
break;
case MQTT_EVENT_UNSUBSCRIBED:
ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_PUBLISHED:
ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_DATA:
ESP_LOGI(TAG, "MQTT_EVENT_DATA");
printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
printf("DATA=%.*s\r\n", event->data_len, event->data);
memset(topic, 0, strlen(topic));
memset(data, 0, strlen(data));
strncpy(topic, event->topic, event->topic_len);
strncpy(data, event->data, event->data_len);
command_t command = {
.topic = topic,
.message = data,
};
parseCommand(&command);
break;
case MQTT_EVENT_ERROR:
ESP_LOGI(TAG, "MQTT_EVENT_ERROR");
break;
default:
break;
}
return ESP_OK;
}
ããã§ãESP32ã¢ãžã¥ãŒã«ã®äœ¿çšã«é¢ããç§ã®è©±ã¯çµããã§ãããã®èšäºã§ã¯ãã¢ãžã¥ãŒã«ã®ãªãœãŒã¹ãæ倧éã«æŽ»çšãããã¬ãŒã ã¯ãŒã¯ãšããŠãESP-IDFã®äŸãæ€èšããŸãããjavaScriptãMicroPythonãLuaãªã©ã®ä»ã®ãã©ãããã©ãŒã ã䜿çšããããã°ã©ãã³ã°ã¯ãé¢é£ãªãœãŒã¹ã«ãããŸãã次ã®èšäºã§ã¯ããã§ã«è¿°ã¹ãããã«ããã€ã¯ãããã»ããµã䜿çšããå®éçãªäŸã瀺ããArduinoãšESP-IDFã®ãœãããŠã§ã¢ã¢ãããŒããæ¯èŒããŸãã