ESP32入门 二(ESP32的hello world)

几乎所有学习编程的程序员或爱好者第一个练习程序都是这个叫"hello world"的程序,这个程序最初是指在计算机屏幕上输出"hello world"这行字串符的程序,这个例程在 Brian Kernighan 和 Dennis M. Ritchie合著的The C Programme Language使用而广泛流行。

如果在ESP32中使用,因为该设备在大部份的版本中,是并没有配备屏幕之类的输出模块的,所以如果要实现"hello world",最方便的方法是通过串口通信,把输出信息发送到计算机,从而实现输出可视化的信息。在本文最后,我们会实现并尝试详细说明这个例程,在这之前,先把在之前的文章中尚未介绍的一些知识点进行说明。

我们如果选择使用的是arduino IDE,新建一个项目或文件后,首先出现的是一段默认已经存在的代码:

void setup() {
    
    
  // put your setup code here, to run once:

}

void loop() {
    
    
  // put your main code here, to run repeatedly:

}

这里代码是分成了两个部份,每个部份我们把它称为函数,就是说,在这里,包含了两个初始的函数定义。函数可以理解为把一段代码打包,是一个固定的程序段,也可以称为子程序。定义最基本的函数正常情况下有四个部份

1.函数类型 - 如上面代码的void,就是一种函数类型,函数类型是定义这个函数运行的结果所返回的数据类型。void这个类型比较特殊,是指无类型的函数,就是说这个函数不返回任何结果。但不返回结果,并不是说这个函数不起任何作用。对于函数类型,后续会更详细的介绍。

2.函数名称- 如上面代码的setup,名称可以自定义,和变量一样,一些保留字或特殊符号不能使用,但这里的setup名称,不可以改变,因为这个setup函数和loop函相当于arduino留给开发者的两个固定的接口函数。

3.函数参数 - 如上面代码中的小括号(),在小括号里,可以为空,也可以定义一个或多个变量来作为参数,同样的,对于定义函数参数,后续也会详细介绍

4.函数主体代码 -如上面代码中的大括号{},在左右大括号之间,有一行或多行的空白,函数的所有代码就需要输入到这个大括号的中间。

这两个函数名称分别为setup和loop,如果就字面去理解,我们就可以大概了解这两个函数的作用。

setup在中文中有"软件或硬件的安装,设置"的意思,也就是说这个函数是设置一些功能的初始化。比如说,我们在之前的文章里,就是在这个函数里里对串口通信功能进行初化。

loop在中文中有"环形,循环"的意思,也正说明了这个函数的作用,在这个函数内的代码会不停地重复执行。
下面,我们用hello,world这个练习程序在更详细地观察这两个函数的作用。

我们输入以下代码:

void setup() {
    
    
  sleep(1);                                         //暂停运行1秒
  Serial.begin(9600);                               //初始化串口通信
  Serial.println("Hello world from setup function");  //向串口发送一段字符串,提示该字符串来自setup这个函数
}

void loop() {
    
    
  sleep(1);                                         //暂停运行1秒
  Serial.println("Hello world from loop function");   //向串口发送一段字符串,提示该字符串来自loop这个函数
}

我们打开串口监视器后上传这段代码,同时在串口监视器中观察代码的运行。
在这里插入图片描述
如果运行正确,应该会观察到如图所示的结果,可以看到输出的结果,分为两个类型,一个是从setup函数所发送的字符串"Hello world from setup function"和从loop函数所发送的字符串"Hello world from loop function",不同的是从setup所发送的字符串只有最前面的一句,而从loop函数所发送的字符串是每秒发送一次,只要不断开连接或关闭ESP32,可以观察到,ESP32会永久持继地每隔一秒发送一次该字符串。

我们知道,程序是自上而下的运行的,如果我们把这两个函数位置调换,把loop放在setup的前面,程序是不是就先运行loop呢,我们来做一个测试:

void loop() {
    
    
  sleep(1);                                         //暂停运行1秒
  Serial.println("Hello world from loop function");   //向串口发送一段字符串,提示该字符串来自loop这个函数
}

void setup() {
    
    
  sleep(1);                                         //暂停运行1秒
  Serial.begin(9600);                               //初始化串口通信
  Serial.println("Hello world from setup function");  //向串口发送一段字符串,提示该字符串来自setup这个函数
}

运行前为了防止混淆观察结果,我们在串口监视器上先点一下"清空输出""来清空之前收到的所有消息。
在这里插入图片描述
可以观察到,把两个函数调换位置后,运行的结果并未发生改变。

由此,我们可以得到结论,我们所定义的函数所在的位置并不能改变这两个函数的运行顺序,在ESP32中,setup总是优先于loop函数运行,且只运行一次。而loop函数在之后的运行中,总是永久持继地不断重复运行。

对于各类开发板来说,还存在另一种输出形式,对于ESP32来说,他属于是一款集多种功能于一身的微型控制器,既然是一个控制器,对其它的设备或元器件的控制应该才是这个开发板或这个芯片的主要功能。它对其它的设备或元器件主要方式是利用开发板上的引脚,这些引脚可以输出高、低电平,输出PWM信号,输出模拟信号,也可以通过UART/SPI/I2C等协议,对于这些功能具体的作用在后续的文章中会详细地进行介绍。

本文中我们用指令来控制指定的引脚输出高/低电平,相当于在ESP32这个微型控制器上实现类似"hello world"程序的功能。不同的是,在计算中的"hello world"是面向计算机屏幕输出一个字符串,在ESP32中是面向其它设备或元器件输出一个电平信号。这里,我们的输出对象选择的是一个非常简单好用的元件,叫 发光二极管,可以简称为LED,是非常常见的一种发光元器件。
在这里插入图片描述
在后续的学习中,也会常常用到这种元器件,用LED这种元件来测试的好处是这种元器件首选它便宜,功耗低,体积小,响应速度快,并有不同的颜色可以选择方便观察。原因是ESP32引脚所输出的电流大约在500Ma左右,如果用一些电流要求比较高的器件是无法驱动它进行工作的,所以,在后续的学习中,如果发现你的ESP32能点亮LED但换上小马达却不起作用时,就是这个原因。

为了方便学习这里推荐一个模拟ESP32环境的在线工具,可以让你在没有硬件的情况下也可以随时测试你的代码是否正常工作,工具地址:
https://wokwi.com/
进入网站后,如果有需求,可以试着注册一个帐号,当然,不注册也可以使用,我们找到ESP32的模拟器
在这里插入图片描述
可以看到,随了支持ESP32,这个网站也支持其它一些常见的开发板。
在这里插入图片描述进入后,我们可以看到,介面分为两大部份,左边是代码编辑区,右边是ESP32实物模拟区,在这里,我们可以给这个模拟的ESP32安装上一个LED,LED的正引脚连接到ESP32的2号引脚,LED的负引脚连接到ESP32的GND引脚。
在这里插入图片描述
点击加(+)号新建一个元器件,这里我们选择LED。
在这里插入图片描述
把LED拖动到方便的位置后,(如果需要旋转元件方便放置,选中该元件,按键盘的"R"键可以旋转该元件,"P"键可以把元件左右镜象翻转)直接点击所有元件的引脚就可以自动生成一根导线,我们用导线把LED和ESP32进行连接。注意:这里需要区别LED的正负引脚,如果接反,会造成测试结果出现偏差。
在这里插入图片描述
这里是模拟器,所以我们不用担心电流过大造成LED烧毁,如果你在真实硬件上连接,最好是能连接上一个330~500欧姆的电阻。比如这样:
在这里插入图片描述
下面我们写一段现实让LED每500毫秒反复亮灭的程序,来测试对ESP32引脚的控制,实现对外部元器件的控制。

void setup() {
    
    
  pinMode(2, OUTPUT);         //初始化2号引脚,设置为输出模式
}

void loop() {
    
    
  digitalWrite(2, HIGH);      //把2号引脚设置为高电平
  delay(500);                 //程序暂停500毫秒
  digitalWrite(2, LOW);       //把2号引脚设置为低电平
  delay(500);                 //程序暂停500毫秒
}

写好后点击运行按钮,观察右边的模拟窗口,可以发现我们的LED会每500毫秒反复地亮灭的过程。
在这里插入图片描述
到此,我们已经实现了通过串口监视器和通过引脚输出来实现能直观地观察到程序运行状态了,在之后的开发中,为了方便调试或输出程序运行的状态,这两种方式都是比较常用的输出方式。
在之后的文章中,将会介绍本篇中所用到的新函数,和介绍更多对于引脚进行控制的函数或方法。

猜你喜欢

转载自blog.csdn.net/m0_50114967/article/details/128697057