Arduino是一套便捷、灵活、容易上手的硬件开发平台,它包括多种型号的Arduino控制电路板和专用编程开发软件(Arduino IDE)
ESP32S3内置设备:
开发板
LCD(2)
TFT 液晶显示屏模组(SPI 接口 TFT-LCD),包含驱动底板 + 液晶屏幕本体。
- 底板带有 FPC 软排线插座,用来插接液晶面板,上方金色排针是 SPI 通讯引脚,可直接对接 ESP32S3 开发板。
- 屏幕尺寸为 2.0~2.4 英寸级别,常用于单片机项目做文字、图形、图片显示。
- 供电一般为 3.3V,通过 SPI 总线和主控通信,可以用来显示人体红外传感器的检测状态、数据等内容。
HC-SR501 人体红外热释电传感器(4)
- 功能:检测人体移动,当有人在探测范围内活动时,输出高电平;无人活动则为低电平。
- 用法:VCC 接 3.3V~5V 电源,GND 接地线,OUT 接到 ESP32 的 GPIO 引脚,即可读取是否检测到人。
- 上面两颗电位器:分别调节检测延时和感应灵敏度。
21 键红外遥控器(38KHz)(4)
一般搭配 MP3 解码板、蓝牙音响模块使用。 按键功能:开关机、模式切换、播放暂停、上下曲、音量加减、音效 EQ、数字选曲、单曲循环、U 盘 / SD 卡切换。 配合红外接收头,可以直接接到你的 ESP32S3 开发板上做红外遥控控制。
电机(11)
28BYJ-48 5V 四相五线减速步进电机。
- 供电电压:直流 5V,不能直接用 3.3V 驱动。
- 使用方式:必须搭配 ULN2003 驱动板,再连接到 ESP32S3 开发板⑩号上方的 MOTOR 接口(电机专用位置)。
- 用途:低速转动、角度定位,常用于风向摆叶、小型云台等项目。
接线说明: 电机插头插到 ULN2003 驱动板,驱动板四根控制引脚接到开发板 MOTOR 排针,供电由开发板 5V 供给。
130 直流小电机(普通有刷直流马达),工作电压一般为 3V~6V。
它不能直接接到 ESP32 主控引脚,必须搭配 L298N 或者三极管驱动模块使用。 接线位置:接开发板上标号 11(MOTOR)区域,由驱动板控制正转、反转与启停。
红、棕两根线调换接线方向,电机就会改变转动方向。
SG90 9g 舵机(4)
作用
能精准转到指定角度(0°~180°),用来做云台转向、开关门、机械摆臂、摄像头角度调节。
接线
开发板④号黄色通用 GPIO 排针,棕线 = GND,红线 = 3.3V,橙线 = 信号脚(随便选 IO4/IO5)
黄铜金属头:激光发射模块(4)
作用
射出一道红色激光细线,搭配激光接收模块做对射检测,激光被挡住就触发信号,用于红外计数、遮挡感应、光电门。
接线
④号排针VCC→3.3V,GND→GND,信号脚接任意空闲数字 IO
各模块
激光接收传感器小板(4)
作用
接收对面发射的激光,无激光时输出高电平,激光被遮挡输出低电平,和激光发射成对使用,检测有无物体遮挡光路。
接线
④号排针VCC→3.3V,GND→GND,OUT 信号接数字 IO
电位器可调电阻模块(7/4)
作用
旋转旋钮改变输出电压,ESP32 读取电压数值;可用来手动调速、手动控制舵机角度、调节屏幕亮度。
接线
⑦号 ADC 模拟接口 / ④号排针模拟引脚VCC→3.3V,GND→GND,AO 模拟输出接 ADC 引脚
标 BMP280 小板:气压高度传感器
作用
实时测量环境大气压强,换算出海拔高度,同时可测环境温度;适合气象检测、高度测量项目。
接线
④号排针 I2C 引脚VCC→3.3V,GND→GND,SDA、SCL 对应 I2C 通讯引脚
中间器件:HC-SR04 超声波测距模块(4)
作用
发射超声波,碰到物体反射回来,计算和障碍物之间的距离,用来避障、测距离、感应有无物体。
四根引脚定义
VCC:供电(接 3.3V/5V 都可以,推荐 5V)
Trig:触发引脚(单片机发信号启动测距)
Echo:回响引脚(接收反射信号)
GND:地线
接线位置
开发板④号黄色通用 GPIO 排针VCC 接 5V,GND 接 GND,Trig、Echo 分别接两个空闲数字 IO(比如 IO2、IO3)
各色带黑色插头的线:杜邦线
是什么
单片机通用连接线,一头插模块,一头插开发板排针,用来传递电信号、供电。
不同颜色只是区分线路,功能无差别:
红线:习惯用来接电源正极(3.3V/5V)
黑色 / 棕色:习惯用来接地线 GND
其余彩色(橙、黄、绿、蓝、白、紫):全部用作信号传输线(传感器、电机、屏幕信号线)
DHT11 温湿度传感器
作用
实时检测环境温度 + 空气湿度,用来做室内温湿度监测、智能家居环境采集。
四根引脚定义
VCC:供电(3.3V)
DATA:温湿度数据信号线
NC:空脚,不用接线
GND:地线
接开发板位置
普中 ESP32S3 高配板④号黄色通用 GPIO 排针
- VCC → 3V3
- GND → GND
- DATA → 随便一个空闲数字 IO(比如 IO4)
黑色多功能传感器底板(接④号GPIO排针)
1.8 块带蓝色可调电阻小板:光敏 / 红外对射 / 触摸类通用传感器模块,作用:检测光线变化、物体遮挡、人体触摸;蓝色旋钮调节检测灵敏
2.带摇杆的模块:双轴 XY 摇杆模块,作用:游戏操纵杆,上下左右 + 按键,控制小车、屏幕光标
3.带白色圆形小元件:DS18B20 温度传感器,作用:测量环境温度
4.黑色小圆元件:震动传感器模块,作用:检测震动、敲击,触发报警
5.白色圆形元件:声音传感器模块,声音模块:检测环境音量大小;人体模块检测附近人体活动
6.长条金属栅格:金属触摸传感器,作用:手触摸金属栅格输出电平信号
7.银色圆形金属盖模块:MQ-2 气体烟雾传感器,作用:检测烟雾、燃气、可燃气体浓度
8.右下角单蓝色可调小板:火焰传感器,作用:检测明火、火光,用于消防报警项目
RC522 射频 RFID 读卡模块(含蓝色感应卡 + 钥匙扣卡)
- 作用:读取感应卡片 ID,做门禁刷卡、身份识别、打卡系统
- 通信:SPI 通讯
- 接线:开发板④号黄色通用 GPIO 排针,占用一组 SPI 引脚
Arduino语言
Arduino语言结构
Arduino 语言,本质不是一门全新编程语言,而是一堆封装好的 API 函数合集,全都放在 Arduino 核心库里。
API= 现成功能函数(点灯、读取 GPIO、串口通信、WiFi 连接等),不用你从零写底层驱动。
底层是 ESP-IDF(ESP32 官方 C 语言底层开发库),操作寄存器、硬件时序、WiFi 协议这些复杂代码官方提前写好了。
Arduino 团队把难懂的 ESP-IDF 底层代码二次封装,简化成简单函数: 举例子: 底层 ESP-IDF 要十几行代码点亮 LED; Arduino API 只需要两行:
plaintext:
pinMode(2,OUTPUT); digitalWrite(2,HIGH);好处:底层复杂操作全部屏蔽,我们只需要直接调用封装好的 API 函数,不用研究单片机寄存器、底层驱动,上手简单。
C/C++ 才是单片机真正底层语言;
Arduino 只是套了一层简易 API 外壳,代码最后还是会编译成底层 ESP-IDF 程序烧录进 ESP32;
所有你用的 Serial、analogRead、WiFi.begin () 全部都是封装后的 API。
Arduino程序结构(setup和loop)
Arduino没有main函数(main函数被隐藏在了Arduino核心库中)而是使用setup和loop函数
setup函数里面的代码只会执行一次,外设的初始化配置等等
loop函数类似于一个大循环,里面的代码会重复执行
C/C++语言基础
C是面向过程的编程语言;C++是面向对象的编程语言
数据类型
常量:在程序运行中,值不能被改变的量称为常量
#define 常量名 常量值
eg:#define LED1 3
变量:程序中可变的量称为变量
类型 变量名称
eg:int i = 0;
或 int i;
i = 0;
字符型要' ';float四字节,double八字节
运算符
表达式
运算符加运算对象 eg:a+b
数组
数组是由一组相同数据类型的数据构成的集合
数组的定义:数据类型 数组名称[数组元素个数]
int a[5]
数组元素的调用:数组名称 [下标]
eg:int a[5] = [1,2,3,4,5] ;
printf ( a[3] ) (结果是4)
字符串
字符串的定义:用字符型数组方式定义,另一种是String类型定义,字符组成字符串字符串要用英文双引号括起来" "
char 字符串名称 [字符个数];
String 字符串名称;
注释
多行注释:“/*”与“*/”之间内容为注释;单行注释:“//”
c/c++语言结构
选择结构
更多分支
switch语句:从前往后看常量表达式1234...与表达式是否相等,相等执行对应的语句,不相等就执行到最后default语句,遇到break跳出当前语句块,跳出switch;如果没有写default语句并且常量表达式与表达式不相等,就不会执行switch里的语句。注意:常量表达式1234...各不相同
switch语句的表达式结果必须是整型或字符型,别的类型只能用 if 语句
循环结构
Arduino添加第三方库
pinMode()函数
该函数主要是用来设置我们对应单片机的一个管脚及模式,即定义这个口是干啥用的(必须先写)。
语法:void pinMode(引脚号,模式)
参数1引脚号是用来设置我们的这个管脚标号
参数2模式是指定 IO 口的模式
那像我们这个函数呢,里面有两个参数,第一个呢是用来设置我们的这个管脚标号,比如我们的 ESP 32 开发板当中,对应我们的排针旁边呢都会有对应的一些标号引脚,就把对应的引脚传进来。第二个是指定我们这个 IO 口的一个模式, IO 口它可以作为输出使用,也可以作为输入使用。那你使用哪一种就要自己选择。
上图就是 IO 口的各种模式的宏定义(参数2)
官方提供了很多的宏定义。
OUTPUT 输出模式(控制 LED、继电器用的)引脚可以主动输出高电平、低电平,用来点灯、控制外设,咱们点亮彩灯就用这个。
INPUT 普通输入模式用来读取外部信号(按键、传感器),引脚悬空的时候电平会乱跳,信号不稳定。
INPUT_PULLUP 上拉输入(最常用读按键)内部自带拉高电阻,按键没按下时默认高电平,按下变低;不用额外接电阻,不会出现信号飘忽的问题。
INPUT_PULLDOWN 下拉输入内部把电平拉低,按键松开是低电平,按下变成高电平,用得比上拉少。
OUTPUT_OPEN_DRAIN 开漏输出引脚只能主动输出低电平;想要高电平,必须在外面再接一个上拉电阻,适合多器件共用一条信号线的场景。
INPUT_ANALOG 模拟输入(ADC)专门用来读取电位器、电压这类连续变化的模拟信号,才能用
analogRead()采集数值,不能做高低电平的数字读写。
digitalWrite()函数
语法:digitalWrite (引脚号,电平)
作用:已经把引脚设为输出模式后,控制引脚通电断电
参数:HIGH(等同于数字 1):输出 3.3V 高电平,LED 点亮
LOW(等同于数字 0):输出 0V 低电平,LED 熄灭 ESP32 芯片标准输出电压:高电平 3.3V;普通 Uno 单片机是 5V。
两种写法完全等效:digitalWrite(3, HIGH);digitalWrite(3, 1);
delay ()函数
语法:delay(时间)
时间单位:毫秒(ms),1 秒 = 1000 毫秒eg:delay(100);程序在这里暂停 100 毫秒。
delayMicroseconds()函数
语法:void delayMicroseconds(时长)
微秒级延迟函数,1毫秒=1000微秒(us)
digitalRead()函数
数字读取函数
语法:int digitalRead(int pin);
eg:key=digitalRead(1) 即读取1号管脚的电平作为key变量
引脚编号作为函数传进去
LED实验
点亮LED模块中的一个LED灯,即让GPIO输出高或低电平,对ESP32来说,高电平约3.3V,低电平约0V。
原理图:
由图可知LED连3号IO口,引脚号为3;LED口阳极连的是控制引脚,控制引脚接高电平发光二极管通,发电;低电平不发电
蜂鸣器实验
蜂鸣器分为两种,有源蜂鸣器和无源蜂鸣器
有源蜂鸣器给电压就能发出声音;无源蜂鸣器需要连续输出一定频率的脉冲信号才能使其发声即循环让IO口输出高低电平,控制在1.5K-5.0K之间频率(2K赫兹~0.5ms一个周期)
占公比:高电平在于整个周期的时间比例
原理图:
蜂鸣器BP连IO输出口15号引脚
继电器实验
继电器可实现小电流控制大电流,低压控制高压
原理图:
芯片为反向驱动芯片,输入端为高电平输出端就是低电平
电机模块:RELAY高电平则RELAY OUT为低电平,则继电器模块的RELAY OUT为低电平;线圈RK1一端(下端)连VCC5(5伏,正极)又因为上端为低电平0伏(负极),有电压差,线圈导通
P2为继电器接线端子
控制IO给高电平则线圈导通,继电器常开
NO = 常开(平时断开,继电器吸合之后就连通)
NC = 常闭(本来连着,继电器一吸合就断开)
按键控制实验
按键松开默认为高电平
由于按下抬起会有波动所以通常会用delay函数在识别到低电平时延迟大约10ms再进行运作
原理图:
需要设置引脚为输入上拉模式
程序中想单次扫描按键就设置mode=0;多次扫描mode=1
将key设置为静态变量,让它能够在循环中保存上一次的值
直流电机实验
直流电机:将直流电能转化为机械能(直流电动机)或将机械能转化为直流电能(发动机)
直流电机没有正负之分,在两端加上直流电压就可以工作
ULN2003
ULN2003 是7 路达林顿反向驱动芯片,简单说:一块芯片里集成了 7 个放大开关,专门用来放大单片机微弱信号,驱动继电器、蜂鸣器、电机这类需要大电流的元器件。
最核心特性:反向输出。输入高电平 → 输出低电平 输入低电平 → 输出高阻态(断开)
ESP32 单片机 IO 口输出电流很小(几毫安),直接带不动继电器线圈; ULN2003 可以承受500mA 大电流,完美驱动继电器、蜂鸣器,保护 ESP32 芯片不被烧坏。
必须一个接正极一个接ULN2003的输出口
ULN2003输入高电平,输出低电平接电机一端,另一端接正极可以使电机旋转,反之输入低电平,输出高阻态会停止旋转