Arduino 是一个基于易于使用的硬件和软件的开源电子平台。 硬件包含各种型号的Arduino电路板,这些电路板就像是Arduino的大脑和身体,能够连接各种电子元件,比如传感器、LED灯等。
Arduino 软件 (IDE) 是一个在计算机上运行的程序开发环境,你可以在这里编写代码,然后上传到Arduino电路板上,让电路板按照你的指令去工作。Arduino IDE可在 Windows、Macintosh OSX 和 Linux 操作系统上运行。
Arduino 软件作为开源工具发布,可供经验丰富的程序员进行扩展。Arduino-ESP32是由乐鑫开发和维护的针对ESP32开发板的开发包。
本书使用的Arduino IDE版本为2.3.6
为了能够使用 Arduino IDE 开发 ESP32,需要向 Arduino IDE 板管理器添加一个额外的源,然后安装 ESP32。我们需要先添加 ESP32 开发板附加网址。打开【文件】菜单下的【首选项】。
把https://espressif.github.io/arduino-esp32/package_esp32_index.json 粘贴到文本框内
选择左侧导航“开发板管理器”
找到”esp32”这个开发板进行安装,本书例子使用 2.0.17 的版本。
ArduinoIDE还提供了众多的第三方库,即包含各类传感器、显示屏等硬件驱动相关的库,也包含PubSubClient、ArduinoJSON等各类软件库。
选择左侧导航”库管理”,然后查询需要的库安装后,程序中通过include引用库。
本书中要使用的第三方库在对应小节内说明。
想像一下,如果ESP32芯片是一个大脑,那么GPIO(通用输入输出接口)就是它的神经末梢,用于感知外界信息(输入)和输出控制信号,例如感知一个按键的按下、获取传感器数据、点亮一个LED和输出控制舵机转动的信号等等。
下面以点亮板载LED为例来说明GPIO的输出操作。
Arduino的digitalWrite函数用于GPIO输出,LED就是发光二极管,导通时发光。
实例1:LED灯的简单控制
const int LED_PIN = 4;
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
}
上面的Arduino程序包含一个setup()函数和一个loop()函数,setup()在运行时只执行一次,一般放初始化相关的代码;而loop()会反复执行,一般放主代码。
本例中,在setup()中用pinMode()将接LED灯的引脚4设置为OUTPUT,然后在loop()中用digitalWrite()设置引脚4 为1(输出高电平)点亮LED。
上传程序并运行
将开发板用连接到电脑的USB端口,在ArduinoIDE中通过选择对应开发板和端口
然后点击上传按钮
程序将上传到开发板中并开始执行。
在上例中,digitalWrite()放在setup()内也是可以的,loop()函数要理解loop()函数的用法,我们来看一个LED呼吸灯的实现。
实例2:LED呼吸灯
const int LED_PIN = 4;
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
delay(500);
digitalWrite(LED_PIN, LOW);
delay(500);
}
本例中,在loop()函数内,首先用digitalWrite()输出1点亮LED,然后用delay()延时500ms(注意在延时期间,引脚的输出是保持为1的,所以LED一直亮着),接着用digitalWrite()输出0熄灭LED,再次用delay()延时500ms(LED一直熄灭),loop()执行完毕后被主程序再次调用,周而复始以达到呼吸灯的效果。
delay()函数
delay()是阻塞式的延时函数,但程序遇到这个函数时,要等待指定的毫秒(ms)数。时间到了才会继续执行后面的代码。
串口用于不同设备间互相传输数据,比如在电脑上实时输入指令来控制Arduino 板做出相应的反应、Arduino 板将程序运行日志传输给电脑进行显示。
Arduino采用USART通信模式,支持硬串口和软串口两种实现方式。
ESP32有3组USART串口,引脚分别是(1,3)、(10,9)、(17,16)
在Arduino中,Serial是预定义好的串口类实例,下面通过一个实例来学习串口输出的操作。
实例3:使用串口输出程序运行信息
void setup() {
Serial.begin(115200);
Serial.println("初始化完成.");
}
void loop() {
Serial.print("主程序");
Serial.println("运行中.");
Serial.printf("Hello %s\n", "World!");
// code...
delay(3000);
}
本例中,在loop()函数内,首先用Serial.begin()设置串口波特率为115200,波特率是串口的传输速率,指1秒中传输多少位码(1个字节是8个位码),然后用Serial.println()输入内容;在loop()函数中,分别用print()、printf()和printf()来输出内容。
l print():输出字符串内容
l println(): 输出字符串内容并换行
l printf(): 格式化输出字符串,可使用%s, %d, %f等格式化符输出字符串、整数和浮点数等
上传代码到开发板运行,然后打开串口监视器并设置波特率为115200即可看到从开发板串口输出的内容。
在后面的项目代码内,我们将使用串口来输出日志用于调试程序和了解程序运行情况。
关于串口的其它操作在后面案例中讲解。
在C语言中,程序是从main函数开始执行的,下面是一个简单的示例代码。
#include <studio.h>
int main(const char* args) {
printf(“Hello, World!\n”);
return 0;
}
在Arduino中,程序实际上也从main函数开始执行的,对于ESP32系列,这个函数是由Arduino-ESP32开发板库提供的,伪代码如下:
int main() {
// init code...
setup();
for (;;) {
loop();
}
}
可以看出,因为各类开发板的初始化要求差异,这个main函数只能是由对应的开发板库提供。
而Arduino的价值在于屏蔽底层细节,提供相对统一的编程接口,降低学习和迁移不同开发板间的成本。
本书所有项目均采用迭代式开发方式进行开发。
迭代式开发是一种将软件开发过程分解为多个短周期的迭代,每个迭代包含需求分析、设计、实现与测试等环节的软件开发方法。
需求分析的主要目的是确定项目的范围和目标,明确项目的功能和特性,并将期转化为可理解和可执行的任务。
设计阶段的主要目的是将需求转化为可执行的设计方案,并提供清晰的开发目标和方向。
开发阶段的主要目的是将设计方案转化为具体的代码,实现系统的核心功能和业务逻辑。
测试阶段的主要目的是发现和修复系统上的问题和错误,确保系统的质量和稳定性。
串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。
本程序是小鹏物联网智能浇花套件的单机版程序(不连接物联网),供同学们参考。
本文介绍ESP32中的中断机制,以及如何通过GPIO中断实现按钮控制。重点讲解了如何设置中断服务例程、处理中断抖动问题,并提供了消除中断抖动的示例代码。
本文主要介绍在未联网(AP热点)情况下实现WEB交互界面的CSS和javascript库。
本文介绍如何使用Arduino-ESP32库中的API函数获取ESP32的芯片、RAM信息等,并提供了一个示例程序代码。
ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。
ESP32 芯片有34个物理GPIO管脚。每个GPIO管脚都可用作一个通用IO,或连接一个内部的外设信号。IO_MUX ¹、RTC IO MUX 和GPIO交换矩阵用于将信号从外设传输至GPIO管脚。
ESP32Encoder库是一个利用ESP32脉冲计数器硬件外设实现高效旋转编码器读取的软件库。
本文对比了几款适合物联网开发的盒子硬件参数,供大家参考。
乐动掌控采用掌控板作为主控,塑胶一体式外壳,侧面和底面开具多个乐高扩展孔位,兼容乐高积木,可完成多种创意应用。
在MicroPython的ESP32库中,NVS类用于管理非易失性存储,支持 32 位有符号整数和 二进制blob。
专属教研服务系统,助您构建STEM课程体系,打造一站式教学环境。
为讲师、学员提供专属的物联网教学环境。