12. 应用开发:Arduino C/C++ 和 IoT
🤖 作者:包瑞清(richie bao): lastmod: 2025-02-10T22:36:16+08:00
该部分并不做详细的阐述,但通过对 Arduino 开源硬件嵌入式开发平台、用于物联网(Internet of Things,IoT)的 ESP8266 NodeMCU (基于 ESP8266 Wi-Fi 模块 的开发板)的介绍,和案例演示展示编程语言 C/C++ 在嵌入式系统和物联网上的使用;并通过示例帮助理解这些工具和平台如何支持嵌入式系统开发及与 IoT系统进行连接。
12.1 Arduino
Arduino 是一个开源的硬件和软件平台,易于使用,简便了嵌入式系统的设计,并具有丰富的开发工具和支持社区,广泛应用于教育、艺术、科学研究,及 DIY 项目和嵌入式系统、IoT 等项目开发中。Arduino 的组成包括 Arduino 开发板(开源硬件)、集成开发环境 Arduino IDE 和 Arduino 库。Arduino 开发板是一个包含微控制器的硬件平台,能够与外部电子组件(如传感器、LED、马达等)进行交互。常见的开发板有 Arduino Uno、Arduino Mega、Arduino Nano、Arduino MKR 等。其中 Arduino Uno 是基于 ATmega328P 入门级的微控制器,有 14 个数字输入/输出引脚(其中 6 个可用于 PWM 输出),6 个模拟输入,一个 16 MHz 陶瓷谐振器(CSTCE16M0V53-R0),一个 USB 连接,一个电源插孔,一个 ICSP 头和一个复位按钮,如图12-1。Arduino Uno 包含了支持微控制器所需的一切,只需用 USB 连接到电脑,或用直流适配器、电池为其供电就可以使用。”Uno“ 在意大利语中是“一”的意思,开发者用来标志 Arduino 软件(IDE) 1.0 的发布。Uno 板 和 1.0 版本的 Arduino IDE 是 Arduino 的参考版本,是一系列 USB Arduino 板中的第一款,也是 Arduino 平台的参考模型。
图 12-1 Arduino Uno 开发板
Arduino IDE 是一个用于编写、编译和上传代码到 Arduino 开发板的软件工具,使用的是类似 C/C++ 的编程语言;并提供了许多库和函数,简化与各种传感器、显示器、马达、网络通信模块等外部硬件的交互,且可以直接在代码中使用,减少了编程的复杂性。
12.1.1 Hello World!
在 Arduino 中,经典的“Hello World”程序通常是点亮一个 LED 来实现。这是最简单的程序之一,可以帮助学习者理解 Arduino 编程的基本概念和控制硬件的方式。试验中仅使用了一块 Arduino Uno 开发板,闪烁板载的 13引脚 LED 指示灯,设置在 1 秒中内闪烁一次。从 Arduino 官网下载 Arduino IDE,界面和程序如图12-2。
图 12-2 Arduino IDE 和 Hello World 程序
将 Arduino Uno 开发板通过 USB 线连接到电脑;打开 Arduino IDE, 选择Tools->Board: ->Arduino AVR Boards->Arduino Uno
开发板型号;选择Tools->Port: ->COMx(Arduino Uno)
端口;打开File->Examples->Built-in example->01.Basics->Blink
,可以直接获得该程序。在顶部工具栏选择 Upload(右侧箭头图标按钮),直接编译后上载至 Arduino Uno 开发板后,可以观察到板载的 LED 灯开始闪烁。编译和上载的信息会在底部的Output
窗口显示,详细信息如下。从中可以查看到开发板硬件的相关信息,如所用端口、微控制器型号、内存等。
Sketch uses 924 bytes (2%) of program storage space. Maximum is 32256 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.
"C:\Users\richi\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/bin/avrdude" "-CC:\Users\richi\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf" -v -V -patmega328p -carduino "-PCOM5" -b115200 -D "-Uflash:w:C:\Users\richi\AppData\Local\arduino\sketches\77D3D2018251B895496ACB24FED5C8CC/Blink.ino.hex:i"
avrdude: Version 6.3-20190619
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "C:\Users\richi\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf"
Using Port : COM5
Using Programmer : arduino
Overriding Baud Rate : 115200
AVR Part : ATmega328P
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PC2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
Programmer Type : Arduino
Description : Arduino
Hardware Version: 3
Firmware Version: 4.4
Vtarget : 0.3 V
Varef : 0.3 V
Oscillator : 28.800 kHz
SCK period : 3.3 us
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "C:\Users\richi\AppData\Local\arduino\sketches\77D3D2018251B895496ACB24FED5C8CC/Blink.ino.hex"
avrdude: writing flash (924 bytes):
Writing | ################################################## | 100% 0.16s
avrdude: 924 bytes of flash written
avrdude done. Thank you.
🤖 代码解读
setup()
是一个特殊的函数,在程序启动时运行一次,或者按下开发板上的reset
按钮及为板子通电时自动运行,通常用于初始化设置,比如配置引脚模式、初始化串口通信等。pinMode(LED_BUILTIN, OUTPUT);
:pinMode()
函数用于设置一个引脚的工作模式。LED_BUILTIN
是 Arduino 板子上的一个内置 LED 引脚(通常是 13 号引脚)。这行代码将LED_BUILTIN
引脚设置为输出模式,运行程序通过该引脚控制 LED 等的开关。OUTPUT
表示该引脚作为输出使用,程序可以通过该引脚发送电平信号(高或低)来控制外部设备(如 LED)。loop()
是另一个特殊的函数,在setup()
执行完后会反复执行。意味着,loop()
中的代码会一直运行,直到 Arduino 被断电或重启;是一个无限循环,用来执行需要反复进行的任务。digitalWrite()
函数用来将一个引脚设置为高电平(HIGH
)或低电平(LOW
)。这里,LED_BUILTIN
引脚先被设置为高电平,意味着 LED 被点亮。用delay(1000)
函数延迟程序执行 1000 毫秒(即 1 秒)后,再将LED_BUILTIN
引脚设置为低电平,熄灭 LED 灯。
12.1.2 读取温湿度传感器 DHT22
DHT22 是一款常用于物联网(IoT)和嵌入式系统中的温湿度传感器,可以测量温度和湿度,温度精度在 ±0.5°C,湿度精度在 ±2% RH。获取 DHT22 测量值,需要在 Arduino IDE 中安装DHT
库读取温湿度值。可以在左侧工具栏,点开LIBRARY MANAGER
(库管理器),搜索 DHT sensor libray(by Adafruit)并直接安装。试验中的开发板使用 Arduino Uno。
面包版图和电路图用Fritzing绘制。
电路 | 代码(.ino) |
---|---|
|
|
🤖 代码解读
|
12.2 IoT
12.2.1 IoT 和 Arduino
物联网(Internet of Things,IoT)是指通过互联网将各种物理设备(如传感器、家电、车辆、机器等)与网络连接起来,使之能够交互数据和互相通信。这些设备通过嵌入式传感器、处理器、软件及其它技术,能够收集、传输和处理数据,从而实现自动化和智能化操作。【设备/物理对象】IoT基本组成中的设备/物理对象是 IoT 系统中的核心部分,包括各种可以感知外部环境并与其它设备进行交互的硬件设备,如温湿度传感器、摄像头、智能手表、智能家居等。【传感器和执行器】传感器用于收集环境数据(如温度、湿度、位置等),而执行器则用于根据接收到的数据做出动作(如控制机器人、调节温湿度、开关灯具和阀门等)。【连接性】物理设备通过不同的通信技术(如 Wi-Fi、蓝牙、Zigbee、LoRa、5G等)将数据传输到云平台、边缘设备或其它设备进行处理。通信方式的选择取决于应用的需求,如范围、速度和功耗等。【数据处理和分析】数据在云端或本地服务器上进行处理和分析,通常利用(大)数据分析、人工智能(AI)等技术来挖掘数据的价值。分析结果可以帮助做出决策,如自动调整设备设置、发出警报等。【用户界面/应用】用户通过应用程序(如手机/电脑应用、网页界面等)与 IoT 设备进行交互、控制设备、查看数据和设置通知等。
IoT涉及的领域非常广泛,如智能家居、健康医疗、智慧城市、工业物联网、农业物联网等。通过网络将物理设备连接起来,,实现数据交换和智能化管理,不仅改变了家庭生活、工业生产等各个领域的运作模式,也带来了新的商业机会和技术挑战。
因为 Arduino 是一个开源硬件平台, 提供了易于使用的开发环境和大量的扩展模块,可以快速的构建 IoT 设备,因此在 IoT 中的应用非常广泛。Arduino 作为硬件控制平台,与 IoT 技术的结合,主要体现在将设备连接到网络、收集和传输数据,及通过互联网进行远程控制和监测。
12.2.2 ESP32 [NodeMCU]
ESP32 是由 Espressif Systems开发的一款支持 Wi-Fi 和蓝牙的双模芯片,广泛应用于 IoT 和嵌入式项目中。ESP32 芯片处理器为双核 Xtensa® 32-bit LX6 CPU,最大工作频率 240 MHz;内存为520 KB 内部 RAM 和 4 MB Flash 存储(可扩展);无线通信包括 Wi-Fi, 支持 IEEE 802.11b/g/n 协议,802.11n (2.4 GHz) 速度达 150 Mbps。蓝牙 v4.2 完整标准,包含传统蓝牙 (BR/EDR) 和低功耗蓝牙 (Bluetooth LE);I/O 引脚最大支持 34 个 GPIO(通用输入输出引脚),支持 PWM、ADC(模数转换)、DAC(数模转换)、I2C、SPI、UART 等通信接口;具有多种低功耗模式(深度睡眠模式等),适合电池供电的 IoT 设备;具有多种低功耗模式(深度睡眠模式等),适合电池供电的 IoT 设备。
NodeMCU-32S 开发板(如图),是基于 ESP32 芯片的开发板,适合 Arduino IDE 开发,且有丰富的开发支持,尤其适合 IoT 项目。
图 12-3 ESP32 NodeMCU-32S,图片来源于 Waveshare,https://www.waveshare.com/nodemcu-32s.htm
ESP32 支持通过 Arduino IDE 开发,但需要安装 ESP32 支持包。打开 Arduino IDE,在File->Preferences..->Settings->Additional boards manager URLs
下输入https://espressif.github.io/arduino-esp32/package_esp32_index.json
链接地址;然后进入左侧工具栏下的开发板管理器(BOARD MANAGER),搜索 ESP32,安装esp32 [by Espressif Systems]
。安装成功后,就可以在Tools->Board:...->esp32
下选择Node32s
,并选择连接开发板后对应的端口(Port:...
)。将下述代码编译上传至 ESP32 芯片后,可以看到板载的 LED 灯开始闪烁,从而验证上述安装过程是否正确。
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // 设置 LED 引脚为输出
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // LED 灯亮
delay(1000); // 等待 1 秒
digitalWrite(LED_BUILTIN, LOW); // LED 灯灭
delay(1000); // 等待 1 秒
}
也可以从File-Examples->ESP32
等下选择安装支持包时预加载的示例代码,查看或学习 ESP32 的不同共用。
12.2.3 IoT 试验
对 Arduino 有了一定开发经验,并具备了一定的硬件知识,如微控制器(MCU);外围设备和接口,如 GPIO(General Purpose Input/Output)通用输入输出,串口通信(UART、USART等),用于与传感器、外设等通信的 SPI/I2C 等常见的通信协议,ADC/DAC 模拟数字转换和数字模拟转换,用于控制电机、LED 等设备的 PWM,及中断处理、定时器/计数器、电源管理等,从而有助于开发更复杂的项目。下面就 IoT 领域,示例一个相对较为简单的案例(如24-4),基于 ESP32 (Node MCU-32S)开发 IoT Web 服务器,通过 Wi-Fi 与 Web 服务器连接,控制 GPIO 引脚和获取 DHT22 传感器的温湿度数据。
Web 服务器的搭建是通过 ESPAsyncWebServe
库完成 ,能够显示温湿度信息数据,并且可以通过页面上的按钮控制三个 LED 灯的开关。同时,可以通过物理开关点亮和熄灭 GPIO 26 引脚的 LED 灯,并将开关的状态同步到网页上,显示State On
或State Off
信息,且网页虚拟开关按钮也会同步发生改变。
图 12-4 ESP32 IoT
因为用到ESPAsyncWebServe库,需要下载该安装包,为一个.zip
文件夹,解压缩后,将ESPAsyncWebServer-master
文件夹名重命名为ESPAsyncWebServer
,并复制到 Arduino IDE 安装库文件夹下,其路径通常为C:\Users\[user]\AppData\Local\Arduino15\libraries
。同时,ESPAsyncWebServe
库需要AsyncTCP库才能工作,因此下载该.zip
文件夹,解压后,重名名为AsyncTCP
,同样复制到 Arduino IDE 安装库文件夹下。
电路 | 代码(.ino) |
---|---|
|
代码参考 Random Nerd Tutorials,https://randomnerdtutorials.com/ |
🤖 代码解读
这段代码的功能是每隔 10 秒向服务器发起一个 GET 请求,获取
与前一个
该部分代码是每隔 1 秒(1000 毫秒)通过
这段 JavaScript 代码定义了一个
该段代码配置了一个 Web 服务器路由。当用户访问设备的根路径(
|
参考文献(Reference):
[1] Santos, R., & Santos, S. (n.d.). Learn ESP32 with Arduino IDE. https://randomnerdtutorials.com/.
[2] 250+ ESP32 Projects, Tutorials and Guides with Arduino IDE,https://randomnerdtutorials.com/projects-esp32/.
[3] Espressif, ESP32 系列芯片技术规格书 版本4.8, www.espressif.com.
[4] Arduino, https://www.arduino.cc/.