關於 ESP32 的更多好玩、有趣、實用的博客,請查看 ESP32 系列博客 - 目錄
一次偶然的機會,去參加了由樂鑫和 Pycom 公司組織的 Hackathon 活動,並獲贈了一塊官方最新的 ESP32 開發板 —— ESP32-DevKitC,到家幾次試玩之後,深深地被樂鑫折服,對它愛不釋手。
如上圖所有,一塊開發板,小巧,迷你,接口簡單,功能卻不簡單,只需要一根普通的智能手機USB數據線,就能完成絕大多數操作。
ESP32 的優勢
上手快
第一次試玩,用的官方的 esp-idf-template,一邊看文檔一邊動手,從搭建開發環境,到把這個 demo 跑起來(板子作爲一個 STA,連接到 WiFi),總共也就半個小時左右。
第一次跑起來後,隔了一段時間,又想跑個 MQTT 試試,然後在網上搜相關資源,發現了一個 ESP32 的 MQTT 組件庫 espmqtt,然後通過這個庫的作者提供的模板,成功地將 ESP32 接入了中國移動的物聯網雲平臺 OneNET。整個過程耗時 3 天(其中,週末2天)。在接入的過程中也發生了兩個小插曲:
- 發現移動 OneNET 提供的 SDK 存在 2 個 bug,導致我 publish 消息時始終失敗,最後分析源碼,已經幫他們把 bug 解決掉了。我提交的補丁在這裏: https://github.com/cm-heclouds/MQTT/pull/1
- 發現 espmqtt 組件存在 bug,到時我 publish 質量等級爲 QoS2 的消息失敗(其實已經成功,但是組件判斷錯誤,以爲我 publish 沒有成功),也已經幫他們把 bug 解決掉了。我提交的補丁在這裏:https://github.com/tuanpmt/espmqtt/pull/6
後來又試了是官方提供的空中升級功能,雖然中間同樣遇到了一點問題,但是一個晚上就解決了。
然後就是這幾天,打算做個與 audio 相關的項目。然後在 ESP32 的論壇上以 audio 爲關鍵字搜索整個論壇的帖子,發現了一個開源項目 ESP8266_MP3_DECODER。這個項目是做一個網絡電臺,從服務器上面獲取音頻數據,然後實時解碼,實現播放網絡上的音樂的功能。經過幾天的學習研究,加上向項目作者的請教,也終於在昨晚基本實現了功能。整個過程耗時 5 天。期間也發現了該項目的 bug:
開源
這一點是我非常看中的一個地方。現在是一個流行開源的年代,在我看來,不開源的原因很有可能是——代碼太爛,不敢開源!當然,這是比較偏激的看法,但是至少說明樂鑫對它自己有信心,有勇氣!從結果來看,他們的信心和勇氣完全來自於他們的實力。
其實樂鑫的代碼也並非完全開源,WiFi 驅動就只是赤裸裸地提供了庫和頭文件,這真實一個悲傷的事實!不過還好 ,它頭文件的註釋太規範了,以至於我都沒想到去看驅動的源碼。
規範的代碼和註釋
正如上面所說,樂鑫的頭文件的註釋太規範了,讓我都不知道該怎麼評價了,只有一句話——太具國際範兒了!
除了少部分組件是從其它地方移植過來的,只要是他們自己寫的組件,代碼的註釋讓我看得神清氣爽。
而且代碼風格也非常符合我的胃口,O(∩_∩)O哈哈哈~
巧妙/簡潔的組織結構
ESP-IDF 中“組件”的概念真實深入我心。整個 ESP-IDF 由一個一個組件構成,各個組件之間的耦合性非常低(部分組件之間存在耦合),使整個工程的結構顯得非常清晰。此外,用戶在編寫應用程序時,也可以完全按照組件來組織代碼結構,使應用程序的結構也非常清晰。我上面提到的 ESP8266_MP3_DECODER 就是這樣組織代碼的。
關於組件的更多概念,請參考 ESP-IDF 的文檔 構建系統。
豐富的Demo
這一點也非常贊,直接看下面的組織結構:
work@ubuntu:~/esp/esp-idf/examples$ tree -L 2 -d
.
├── bluetooth
│ ├── a2dp_sink
│ ├── ble_adv
│ ├── blufi
│ ├── controller_hci_uart
│ ├── gatt_client
│ ├── gatt_security_server
│ ├── gatt_server
│ └── gatt_server_service_table
├── ethernet
│ └── ethernet
├── get-started
│ ├── blink
│ └── hello_world
├── performance
│ ├── tcp_perf
│ └── udp_perf
├── peripherals
│ ├── adc
│ ├── gpio
│ ├── i2c
│ ├── i2s
│ ├── ledc
│ ├── pcnt
│ ├── rmt_nec_tx_rx
│ ├── sigmadelta
│ ├── spi_master
│ ├── spi_slave
│ ├── timer_group
│ ├── touch_pad_interrupt
│ ├── touch_pad_read
│ ├── uart_echo
│ └── uart_events
├── protocols
│ ├── aws_iot
│ ├── coap_client
│ ├── coap_server
│ ├── http_request
│ ├── https_request
│ ├── mdns
│ ├── openssl_client
│ ├── openssl_server
│ ├── pppos_client
│ └── sntp
├── storage
│ ├── nvs_rw_blob
│ ├── nvs_rw_value
│ ├── sd_card
│ └── wear_levelling
├── system
│ ├── deep_sleep
│ ├── ota
│ └── ulp
└── wifi
├── power_save
├── wpa2_enterprise
└── wps
57 directories
學習資料
目前的學習資料不算多,請儘量多閱讀閱讀官方提供的文檔:
另外,本人還打算將 ESP-IDF 翻譯成中文文檔,源碼已經託管到 GitHub 上面了,熱烈歡迎有興趣的小夥伴一起加入翻譯呀(盡算僅指出一個錯別字也非常歡迎~~)
最後,還不得不說一句,ESP-IDF 的源碼是最好的學習資料!儘量多看看它的源碼,以及源碼中的註釋,絕對讓你受益匪淺!