软件 - Arduino
# 关于 Arduino
- 公司名称:Arduino(/ɑːrˈdwiːnoʊ/)是一家意大利开源硬件和软件公司
- 硬件:
- 狭义:由 Arduino 公司授权制造的硬件开发板
- 广义:兼容 Arduino 软件的所有开发板
- 软件:Arduino IDE
# Arduino IDE2 - 安装
支持 Windows、macOS https://www.arduino.cc/en/software/
无脑下一步即可
Windows
- 项目文件夹地址:“首选项 - 项目文件夹地址” 处设置,默认为
C:\Users\用户名\Documents\Arduino - 库安装位置:
{项目文件夹地址}\libraries - 开发板包安装目录:
C:\Users\用户名\AppData\Local\Arduino15
# CH343 驱动 - 安装
macOS26,在没有额外手动安装 CH323 驱动下,Arduino 也能识别到串口设备 ESP32,不确定是不是下面安装 ESP32 库时自动安装了。
# Arduino IDE2 - 基本操作

# 基本设置
# 修改简体中文
File (文件) - Preferences (首选项) - Language (编辑器语言)
# 开启代码补全
File (文件) - Preferences (首选项) - 编辑快速建议
# 添加 ESP32 开发板

- 开发板管理 - 搜
esp32,安装By Espressif Systems(乐鑫官方)的库

- 安装成功后,在
(顶部)工具 - 开发板出现esp32选项
# 调整 工程参数
以
esp32-s3为例
由于我手上 adafruit 的 ESP32-S3 只丝印了 ESP32-S3-MINI-1 ,没有具体的 Flash、PSRAM 信息,通过翻查当时活动的教程 (opens new window)可知是: 4 MB Flash + 2 MB of PSRAM ,再翻查乐鑫官网的 ESP32-S3 技术规格书 (opens new window),对应为 ESP32-S3FH4R2 。

工具 - 开发板……,选择ESP32S3 Dev Module工具 - 端口,选择连接的开发板 COM
- 修改工程参数
| 属性 | 推荐参数 | 说明 |
|---|---|---|
| CPU Frequency | 240Mhz | 默认频率,如需低功耗,可调低 |
| Flash Mode | QIO 120MHz | QIO 即 Quad I/O,根据技术手册选择 120MHz,手册可知默认为 80,可调至 120 |
| Flash Size | 4MB(32Mb) | Flash 大小,按芯片实际选择 |
| Partition Scheme | 4MB FATFS | 分区表,按芯片实际选择;读写 FATFS,只读 SPIFFS |
| PSRAM | QSPI PSRAM | RAM 类型,按芯片实际选择 |
# 上传 固件
不同的开发板,进入烧写模式的方法不同,以文档为准。

以为手上的 Feather ESP32-S3 TFT 为例,在烧机前,需要按住 BOOT,再按一下 RST,进入烧机模式,再在 工具 - 端口 选择对应的设备,再上传。
查看开发板引脚文档:https://learn.adafruit.com/adafruit-esp32-s3-tft-feather/pinouts (opens new window),可知红色 LED 的引脚为 13
void setup() {
// put your setup code here, to run once:
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(13, LOW);
delay(500);
digitalWrite(13, HIGH);
delay(500);
}
# 安装库
- 在线安装:窗口左侧 - 库管理
- 离线安装:窗口顶部 - 项目 - 导入库 - 添加.ZIP 库
在 Arduino 代码中,使用 #include 指令引入所需的库文件,然后调用库中函数。
# Arduino IDE2 - 基本语法
- Arduino 使用 C/C++ 语言编写程序
- 不直接操作
main函数,而是使用setup和loop函数,执行顺序为:
int main(void)
{
setup(); // 常用语初始化设置
while(true){
loop(); // 程序的主要功能
}
}
# 数据类型
单片机内存是否受限,一个合理的类型是否重要。
# 整型
| 类型 | 关键字 (简写) | 占用内存 / Byte | 取值范围 |
|---|---|---|---|
| 短整型 | int16_t(short) | 2 | -32768 ~ 32767 |
| 无符号短整型 | uint16_t(unsigned short) | 2 | 0 ~ 65535 |
| 整型 | int32_t(int) | 4 | -2147483648 ~2147483647 |
| 无符号整型 | uint32_t(unsigned int) | 4 | 0 ~ 4294967295 |
| 长整型 | int64_t(long long) | 8 | -9223372036854775808~ 9223372036854775807 |
| 无符号长整型 | uint64_t(unsigned long long) | 8 | 0 ~18446744073709551615 |
# 浮点数
| 数据类型 | 描述 | 大小(字节) | 范围 / 取值示例 |
|---|---|---|---|
float | 单精度浮点数 | 4 | 约 ±3.4e±38(6-7 位有效数字) |
double | 双精度浮点数 | 8 | 约 ±1.7e±308(15 位有效数字) |
# 模块化编程
传统方式编程:所有的函数都放在 xxx.ino 里,不利于代码的组织和管理,而且很影响编程者的思路。
模块化编程:把各个模块的代码放进不同的 .cpp 文件里,在 .h 里面提供外部可调用函数的声
明,其他 .cpp 文件想使用其中代码时,只需要 #include “xxx.h” 文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性。
.h文件:可被外部调用的函数、变量的声明、以及一些宏定义(某程度可以理解为 Java 的接口).c/.cpp文件:函数、变量的定义
任何自定义的变量、函数在调用之前必须有定义或声明
要调用自定义函数,必须 #include 对应的 .h 文件
filename.cpp
#include "filename.h"
void func(void)
{
// ....
}
filename.h
#ifndef __FILENAME_H
#define __FILENAME_H
void func(void);
#endif
# LED 实验示例
led.h 定义一些常量、函数
// 固定写法
#ifndef __LED_H
#define __LED_H
// 引入Arduino.h,因为digitalWrite、digitalRead来自于此
#include "Arduino.h"
// 定义了一个LED_PIN常量,值为13
#define LED_PIN 13
// 定义了一些函数
#define LED(x) digitalWrite(LED_PIN, x)
#define LED_TOGGLE() digitalWrite(LED_PIN, !digitalRead(LED_PIN))
// 声明了一个函数,但为实现
void led_init(void);
#endif
led.cpp
实现 led.h 定义的 led_init 函数
#include "led.h"
void led_init(void)
{
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
}
led.ino
// 引入led.h
#include "led.h"
void setup() {
// 调用led.h的led_init,实际调用的led.cpp的实现
led_init();
}
void loop() {
LED(1);
delay(500);
LED(0);
delay(500);
}