ESP32开发:从入门到精通的全面指南
ESP32 是一款功能强大的微控制器,它可以帮助开发者构建各种物联网(IoT)应用。ESP32 拥有 WiFi 和蓝牙无线连接功能,并且可以轻松地与各种传感器和设备进行通信。本文将介绍 ESP32 的基本知识和常用开发工具,以及如何开始 ESP32 的开发。
第一部分:ESP32 入门
ESP32 是一款基于 Xtensa® 双核 32 位处理器的微控制器,它支持 WiFi 和蓝牙无线连接,具有低功耗和高性能。ESP32 还拥有大量的 GPIO 引脚,可以轻松连接各种外部设备。要开始使用 ESP32 进行开发,您需要一些基本知识:
-
熟悉 C/C++ 编程语言。
-
了解电子电路和传感器的基本知识。
-
掌握基本的无线网络知识,包括 WiFi 和蓝牙。
第二部分:ESP32 开发工具
为了开始 ESP32 开发,您需要准备一些必要的开发工具:
-
ESP-IDF 开发框架:这是 ESP32 官方开发框架,提供了许多开发工具和示例代码。
-
Eclipse IDE:这是一款功能强大的集成开发环境,可以帮助您更轻松地编写代码和调试应用程序。
-
Arduino IDE:如果您熟悉 Arduino 开发,可以使用 Arduino IDE 来编写 ESP32 应用程序。
-
Git:这是一款版本控制工具,可以帮助您更好地管理代码。
第三部分:ESP32 开发示例
为了更好地了解如何使用 ESP32 进行开发,我们将介绍一些常用的 ESP32 开发示例:
-
WiFi 连接:ESP32 可以轻松连接到 WiFi 网络。您可以使用 ESP-IDF 提供的 WiFi 示例代码来开始连接 WiFi。
-
蓝牙连接:ESP32 还支持蓝牙连接。您可以使用 ESP-IDF 提供的蓝牙示例代码来开始使用蓝牙。
-
传感器连接:ESP32 可以轻松连接各种传感器和设备。您可以使用 ESP-IDF 提供的传感器示例代码来开始连接传感器。
第四部分:ESP32 项目示例
为了更好地了解如何使用 ESP32 构建项目,我们将介绍一些常见的 ESP32 项目示例:
-
智能家居控制器
ESP32 可以用于开发智能家居控制器,通过 WiFi 连接到智能家居设备并控制其功能,比如灯光、电视和音响等。用户可以通过手机应用程序远程控制设备,实现智能化控制。
-
温度监控系统
ESP32 可以用于监测温度,通过连接温度传感器并将数据传输到云端进行分析,从而实现温度监测。这种系统可以用于监测房间、冰箱或者实验室中的温度。
-
智能农业系统
ESP32 可以用于开发智能农业系统,通过连接各种传感器,比如土壤湿度、光照和气压等,收集农田数据,并将这些数据发送到云端进行分析。这样,农民可以了解土壤、水分和气候状况,从而更好地管理农田和提高作物产量。
-
智能健身设备
ESP32 可以用于开发智能健身设备,通过连接传感器来监测心率、运动量和睡眠质量等指标,并将这些数据传输到手机应用程序,从而帮助用户更好地管理健康和健身计划。
总结:
ESP32 是一款非常强大的芯片,可以用于开发各种各样的项目。它具有低功耗、多协议、高性能和丰富的外设等特点。如果您正在寻找一个灵活、可扩展和易于使用的开发板,ESP32 是一个不错的选择。
在前面的文章中,简单地介绍了ESP32开发板和开发环境,从本文开始,正式进入ESP32的开发,如果你对于编程方面并没有经验也没问题,开始可以复制粘贴代码来尝试着使用你的开发板。文章也会尽量少用专业术语或艰涩难懂的语气来介绍ESP32的开发。
首先,每个人所购买的开发板可能不尽相同,开发板有不同的版本,也存在个人或厂家设计开发的异形开发板,从指甲盖大小到模块化的,从十多块到上百块的。如果入门学习的话,个人的建议是购买时注意该商品的评价就好了,同时,因为有的版本可能是没有WIFI或蓝牙模块的。学习该开发板大多也是因为针对物联网方面的开发,所以,最好是购买带有WIFI和蓝牙模块的。对于芯片的选择在学习阶段并没有太大的影响,比较新的版本也许只是在运行效率之类的性能加强了,正式开发时,再选择性能更好更强的也不迟。
经过前面的文章,本文默认看到这里的已经安装好arduino IDE和开发板支持了。该开发环境打开后,基本就是一个类似记事本的编辑器。
这里最重要的就是代码编辑区了,所有有代码需要在这里进行编辑设计,代码设计完成后,可以点击编译来测试是否出现错误代码,当出现错误代码时,会在信息反馈区给于提示,并在编辑区把可能错误的代码行显示为红底,大多数情况下,出错的代码会出现在红底文字行的提示附近。具体的错误,还需要配合信息的反馈来确定。
以上图为例 ,以上的代码错误提示显示在第3行,但是真正的错误是在第2行,在使用arduino IDE中开发,使用的是C语言来进行开发,C语言的一个规则是每一个完整的代码语句需要用一个引号(;)来代表这一句代码的结束,在第2行的代码(int a)在结尾缺少了结束的引号(;),所以导致编译的出错。
在如上图的代码中原本正常可以写在一行的代码被分开写在二行,但编译依然能正常通过。但强烈建议你不要这样做,这里只是做为说明在arduino IDE开发时,很多语句可以这样做,但会造成代码的可读性变差。
在以后的开发中,有的情况下利用这个规则也可以让你的代码更具有可读性。
下面,我们可以开始写我们的代码了,我们从最基础的开始,写一个两个数相加并得到结果的代码。
void setup() { //这句我们可以先不管,之后会详细介绍 int a = 1; int b = 2; int c = a + b; } //这个括号也先不管,之后会详细介绍 //这里后面的代码也会在以后详细介绍 void loop() { }
在写完这几句代码后,其实已经写好了一个可以运行的程序了。这个程序的作用是计算1+2的结果,如果运行正确,我们应该得到计算的结果3,这里先详细解说一下这段代码的第2、3、4行。我们把它们拿出来解释一下:
int a = 1; int b = 2; int c = a + b;
第1句:int a = 1;
"int" :
对变量的数据类型进行定义,可选的类型还有比如: "char","float","double","long"等,当然,如果有必要也可以自已定义变量的类型。C语言开发中,数据类型的概念是非常重要的知识点。
那么,为什么要对不同的数据进行不同的类型定义呢,这里要先介绍内存的基本概念,我们可以把内存想象成像作文本一样的一个个格子。每个格子只可以写一个字,在内存里,我们把每个格式用一个单位:"字节(byte)"来表示,和作文本一样,格子是有限的,内存也是有限的。
为了节省,也为了方便管理,用正确的类型来定义变量是比较重要的。因为每种数据类型放到内存中,需要的格子数量是不一样的。比如上面的代码中所用的数据类型"int",每定义一个"int"类型的数据,需要占用4个格子,也就是占用4个字节,那么就需要电脑在内存的格子里给这个数据保留4个字节的内存。所以,比如在第1句代码"int a = 1;"中,等于是我们通知电脑,给我保留4个字节内存,并把数字"1"保存在这4个字节的内存中。当然,我们会想,只保存一个数字"1",为什么需要4个格子。这里要说明一下"int"或其它数据类型的大小范围,"int"类型的数据可以保存从-2,147,483,648 到 2,147,483,647的数字,总范围是4,294,967,295,为什么是这么奇怪的一个数字。我们用电脑的计算机的程序员模式来查看一下这个值:
可以看到,当这个值转换为16进制时,值为FFFFFFFF,为2进制时,值为1111 1111 1111 1111 1111 1111 1111 1111。现在,是不是感觉4个字节可能写不下一个"int"了,不然,因为每个字节的内存可以保存的最大值并不是F或1111,而是每个字节的内存可以保存FF或1111 1111。看到这里,大多人已经开始凌乱,因为,虽然我们说作文本的一个格子只可以写一个字,但电脑中的内存定义每个字节里可以有8个位(bit),相当于作文本的每个格子可以写笔划数量为8的字。位(bit),才是计算机中最小的单位。8位(bit) = 1字节(byte)。说到为什么是8位(bit)等于1字节(byte),原因主要是当年创造计算机的并非中国人吧。详细大家可以自行搜索了解一下。
"a" :
变量名,变量的名称可以自定义,但有一些固定的规则,比如一些系统保留的字和用数字开头,一部份特殊符号不能作为变量名或不能作为变量名的一部份。变量本身并不占用内存,变量名可以理解为一个代号,这个代号今天可以指代张三,明天可以指代李四。变量名称的引入,可以让人类用比较直观地管理一些数据或理解这个数据的作用,比如,我们有一个数据35874,我们要把这个数据和另一个数据68794相加。数据并不大,花点时间还是能记住的,但如果我们用一个名称来分别指代这两个数据,如:data1和data2,是不是能很直观地理解这个数据的作用了。
"= 1 ;":
等号,在这里的这个等号,并非数学中的等号,在C语言中,等号(=)称为赋值运算符,他的作用是告诉计算机,该变量指代的数据改变为当前提供的数据(本例中为1),等号(=)右边的值即为左边变量名所指代的数据。在后续的使用中,只要该变量名未被重新赋值,当使用该变量时,就可以说是相当于使用该变量所指代的数据。最后的分号(;)在之前已经介绍过了,定义一句(并非一行)语句的结束。
第二句可以参考第一句的解释。
第三句 int c = a + b;
这句代码和第一句以及第二句有小许区别。
在赋值运算符后面是一个算式: "a + b",不用怀疑,他就是数学里的一个加法算术,但这个加法算的并非数字,怎么能得到结果呢,这里的a和b就是之前所定义的变量名,所以在这里,我们可以把这两个变量所指代的数据代入该算术里,a指代的是数字1,b指代的是数字2,那么这个算术相当于是"1+2",最后,计算机会把这个算术的结果通过赋值运算符(=)赋值给c这个变量。
如何观察程序运行状态
现在,可以点击编译并上传我们的代码了,如果你是第一次使用ESP32,先要用数据线把计算机和ESP32进行连接,有的版本可能需要安装驱动。连接后,如果你的电脑系统是win10,右键点击些电脑,点击管理,找到设置管理器,在右边找到端口(COM和LPT),点击它前面的小箭头,展开可以看到你的通信端口的数量和名称。如果你的电脑没有连接过多的串口通信设备,应该能看到一到两个通信的设备。大部份情况下,端口号(比如COM3)最高的那个就是你的ESP32设备。如果设备过多或并不确定可以断开它们的连接,看是否有端口连接消失,重新连接又再次出现的应该就是你的ESP32设备了。记住它的端口号(比如COM3),回到arduino IDE,点击工具菜单,找到端口:COM1(也许为空),在子菜单里选择你的ESP32端口号(比如COM3)。
如果通过之前的文章正确的安装了ESP32支持,点击工具菜单,找到开发板:
如果安装正确,会出现ESP32字样的菜单,如果不确定你购买的是哪个开发板,可以观察你的ESP32的芯片上的文字来查看比较对应的来设置。如果实在不知道怎么选择,某宝店家里也很多高手的。
完成以上设置后,就可以点击编译并上传了。
可以发现当这个程序上传到你的ESP32上运行时,只是使用了ESP32上的一些内存,我们看不到运行后有任何的变化,又或许他根本就没有运行。所以,我们需要一个能直观地看到程序的确有在运行的方法。
我们的ESP32大部份不会有屏幕,声光模块,所以,大部份情况下,需要观察代码的运行情况,我们需要他把运行的情况发送到计算机上方便我们调试或查看测试运行的情况。所以,我们需要增加一些代码来实现。
先点击右上角放大镜样子的按钮,打开串号监视器窗口。查看右下角的当前波特率(这里是9600波特率)设置,或设置成你喜欢的波特率,记下来。先别关闭该窗口,回到编辑窗口,完善代码
void setup() { //这句我们可以先不管,之后会详细介绍 Serial.begin(9600); //初始化串口通信 int a = 1; int b = 2; int c = a + b; Serial.print(c); //把变量c的数据发送到串口监视窗口 } //这个括号也先不管,之后会详细介绍 //这里后面的代码也会在以后详细介绍 void loop() { }
这里增加了两句代码,第一句作用是初始化串口通信,至于为什么要初始化这个东西,难道电脑不会自动初始化吗,请记住,ESP32或者计算机不会做你没有通知它要做的事。
第二句的作用是把c这个变量所指代的数据发送到串口监视窗口,现在姑且这么说。串口通信是一种通信的协议,就是一种用规定的信号来发送或接收信息的一种规则,所有的通信(包括有线或无线:如摩斯码通信,电脑上网的通信,电视的遥控器)都有相应的协议来进行通信,这里就不展开来说了,我们大部份情况下只要知道这句代码可以实现这个功能就可以了。
现在,我们再把代码上传,同时要注意观察串口监视窗口,如果代码没有出错并成功上传运行,我们应该可以在串口监视器里看到一个数字3在窗口里显示出来。
如果并未出现,不要着急,只要确定上传成功,出现类似的文字
我们可以按一下ESP32上的重启按钮来重启ESP32,在重启过程中,注意不要过于晃动设备,以免连线接触不断开与计算机的连接,同时保持观察串口监视窗口。
最后,祝大家成功
在之后的文章会继续详细地介绍关于ESP32的更多基础入门知识