零基础入门学用物联网(ESP8266) 第一部分 基础知识篇(一)

参考教程:https://www.bilibili.com/video/BV1L7411c7jw/?spm_id_from=333.1387.favlist.content.click

一、概述

1、开发板详解

(1)本教程使用ESP8266-NodeMCU开发板进行学习,需要配备两块ESP8266-NodeMCU开发板。

(2)ESP8266-NodeMCU开发板的引脚定义如下图所示。

①对于数字引脚,ESP8266-NodeMCU开发板接受的高电平电压为3.3V,不可给数字输入输出引脚连接或控制其输出高于3.3V的电压,否则会损坏开发板。

1\]Arduino开发环境中,可使用digitalWrite函数****将数字引脚写为HIGH(高电平)或LOW(低电平)**** ,它有两个参数,第一个参数用于指示数字引脚,第二个参数用于指示高电平/低电平,该函数产生作用的前提是****该引脚需要通过pinMode函数设置为输出模式(OUTPUT)****。 \[2\]Arduino开发环境中,可使用digitalRead函数****读取数字引脚的当前电平,即HIGH(高电平)或LOW(低电平)****,它有一个参数用于指示数字引脚。 ②对于模拟引脚,ESP8266-NodeMCU开发板接受的电压范围为****0-1V****,这个边界同样不能逾越,否则也会损坏开发板。ESP8266只有一个模拟输入引脚(ADC)。 \[1\]Arduino开发环境中,analogWrite函数借助PWM调制,可以用于****输出模拟信号**** ,它有两个参数,第一个参数是模拟引脚号,第二个参数是****0到255之间的PWM频率值****,0对应"off",255对应"on"。 \[2\]Arduino开发环境中,analogRead函数仅有一个参数用于指示模拟引脚,该函数用于****从Arduino的模拟输入引脚读取**** ****模拟电压的**** ****数值****。 ③特殊引脚情况说明: \[1\]GPIO2引脚在ESP8266-NodeMCU开发板启动时不能连接低电平。 \[2\]GPIO15引脚在开发板运行中一直保持低电平状态,因此不能使用GPIO15引脚来读取开关状态或进行I²C通讯。 \[3\]GPIO0引脚在开发板运行中需要一直保持高电平状态,否则ESP8266将进入程序上传工作模式,也就无法正常工作了。程序员无需对GPIO0引脚进行额外操作,因为ESP8266-NodeMCU的内置电路可以确保GPIO0引脚在工作时连接高电平而在上传程序时连接低电平。 \[4\]GPIO6-GPIO11引脚连接闪存,无特殊情况不能使用。 ④ESP8266有2个硬件串行端口(UART)。 \[1\]串行端口0(UART0)使用GPIO1和GPIO3引脚,其中GPIO1引脚是TX0,GPIO3是RX0。 \[2\]串行端口1(UART1)使用GPIO2和GPIO8引脚,其中GPIO2引脚是TX1,GPIO8是RX1。需要注意的是,由于GPIO8被用于连接闪存芯片,串行端口1只能使用GPIO2来向外发送串行数据。 ### 2、物联网的概念 (1)物联网(IOT)全称为Internet Of Things,简单来说,就是把我们日常生活中使用的各种物理设备,通过互联网连接起来,形成一个巨大的网络,这样,这些设备就可以互相通信、收集数据,并且可以被远程控制和智能化管理。 ![](https://i-blog.csdnimg.cn/direct/1b608a20bb06440982818e0ff55ed8e1.png) (2)物联网的工作流程通常分为四个步骤: ①感知:设备通过身上的"感官"------传感器,来收集信息。比如智能空调里的温度传感器感知室温;智能门锁上的摄像头捕捉人脸;智能手环里的加速度传感器记录你的步数。 ②连接:设备把感知到的信息,通过有线或无线的方式发送出去,这就像设备的"神经",将信息传回大脑。常见的连接技术有:Wi-Fi(无线局域网)、蓝牙、4G/5G、LoRa(远距离低功耗无线通信技术,专门为物联网设计的一种低功耗、远距离的无线通信技术)、Zigbee(一种低功耗、低速率、短距离的无线通信技术)等。 ③处理:信息被发送到云端或本地的处理中心,在这里,数据被分析和解读,并做出决策。比如云端收到空调的数据,发现"当前室温28℃,而用户设定的目标是26℃"。 ④应用:系统根据处理结果,向设备发出指令,或者向用户展示信息。比如云端向空调发送指令------"开始制冷,直到室温降到26℃",同时,手机App上收到一条通知------"空调已根据您的设定自动开启"。 ## 二、ESP8266互联网开发基础 ### 1、TCP/IP协议的概念 (1)TCP/IP协议包含如下协议,它们分布在计算机网络体系结构的不同层级中。 ![](https://i-blog.csdnimg.cn/direct/933d5badd23344acb9ea797e270e9b89.png) (2)关于TCP/IP协议及互联网基础的详细介绍,可参考《计算机网络》课程。 ### 2、链路层简介 (1)链路层的主要作用是实现设备之间的物理连接,比如日常使用的Wi-Fi就是链路层协议中的一种。 (2)ESP8266利用Wi-Fi联网时有三种工作模式: ①接入点模式:ESP8266可以建立Wi-Fi网络,其它设备通过查找网络名并输入密码,可以接入此网络(相当于作为一个Wi-Fi路由器)。 ![](https://i-blog.csdnimg.cn/direct/7fa49155f5e644239c0b6926f69d8e8f.png) ②无线终端模式:ESP8266作为一个无线终端,连接Wi-Fi路由器,从而接入Wi-Fi网络,进而能够接入互联网。 ![](https://i-blog.csdnimg.cn/direct/28c985b1a9464ecd9d6b9a9f26f3fed3.png) ③混合模式:接入点模式和无线终端模式的混合,能够同时实现两种模式的功能。 ### 3、网络层简介 (1)网络层的主要作用是实现网络互连,进而实现数据包在各网络之间的传输,它需要解决网络层寻址问题,也就是一个数据包由谁发出、由谁接收,而IP地址正是用来标识"发件人"和"收件人"的。 (2)不同版本IP地址的格式: ①IPv4版本:由4个十进制数表示IP地址,每个数之间用点分割,每个数的取值范围为0\~255,如"192.168.0.3",本教程主要关注该版本。 ②IPv6版本:由8个十六进制数表示IP地址,每个数之间用冒号分割,每个数的取值范围为0\~FFFF,如"2001:db8:1f70:999:de8:7648:3a49:6e8"。 (3)如下图所示,三台不同的设备与同一个Wi-Fi路由器连接,Wi-Fi路由器会为局域网络中的三台设备分别分配不同的IP地址,当设备想要向其它设备发送数据时,可通过配置报文中的IP地址字段以标识报文的发送方和接收方。 ![](https://i-blog.csdnimg.cn/direct/98573616374941c7aee08e3fbcc72eb4.png) (4)如果电脑的系统是Windows,则可打开命令行,输入"ipconfig",按下回车,即可查询电脑的IP地址,对于本教程,需要关注"无限局域网适配器 WLAN"部分。 ![](https://i-blog.csdnimg.cn/direct/5f0b4c3c76c042f8af4922a4f50aa1c7.png) ①Wi-Fi路由器是局域网络中的网关("网关"可以理解为是各局域网衔接的"关口"),默认网关则是Wi-Fi路由器的IP地址。局域网要想与其它局域网通信,也就是接入互联网,那么Wi-Fi路由器需要连接服务器,服务器会为各网关再分配一个IP地址。 ![](https://i-blog.csdnimg.cn/direct/d8e3f7372158495cafd4855ed6ae544d.png) ②子网掩码用于标识IP地址中哪一部分属于子网地址、哪一部分属于设备在子网中的地址。 ### 4、传输层简介 (1)TCP协议简介: ①TCP协议的初衷是保证所有数据都能被接收端接收(这个保证并不是"打包票",而是尽最大的能力保证数据的完整性),数据的传输顺序不会打乱,如果传输数据有损坏,则重发受损数据。 ②TCP协议的优点是数据传输的可靠性,那么相应地,其缺点就是传输速度并非最佳,因此TCP协议多应用于电子邮件、文件传输等注重数据可靠性的场景(数据传输可以慢,但不能出错)。 (2)UDP协议简介: ①UDP协议的数据传输速度比TCP协议快,但不保证所有数据都能被接收端接收,如果传输数据一旦受损,接收方将抛弃受损数据,并且发送方不会重发受损数据。 ②UDP协议的优点是传输速度快(相对于TCP协议而言),那么相应地,其缺点就是不能保证数据传输的可靠性,因此UDP协议多应用于在线语音视频、网络游戏等注重数据传输速率的场景(数据传输可以偶尔出现丢包的情况,但必须注重数据的实时性)。 ### 5、应用层HTTP协议介绍 (1)HTTP定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及万维网服务器怎样把万维网文档传送给浏览器。(当然,这并不意味着HTTP协议仅应用于电脑访问网页) (2)如下图所示,使用用户主机来访问湖南科技大学的万维网服务器,可以看成是用户主机中的浏览器进程(即客户进程)与服务器中的服务器进程基于因特网的通信。 ①浏览器进程首先发起与服务器进程的TCP连接,使用熟知端口号80,基于这条已建立好的TCP连接,浏览器进程向服务器进程发送HTTP请求报文。 ②服务器进程收到HTTP请求报文后执行相应操作,然后给浏览器进程发回HTTP响应报文。 ![](https://i-blog.csdnimg.cn/direct/c9321b0677d54a34a856ea2bc379cbe0.png) (3)HTTP/1.0采用非持续连接方式,在该方式下,每次浏览器要请求一个文件都要与服务器建立TCP连接,当收到响应后就立即关闭连接。 ①客户与服务器之间通过"三报文握手"进行TCP连接,在这三个报文中的最后一个报文的数据载荷部分携带有HTTP请求报文,服务器收到后给客户发回HTTP响应报文。 ②一次请求和响应所耗费的时间记为往返时间RTT,请求一个万维网文档所需的时间为2RTT+文档的传输时延。 ③每请求一个文档就要有两倍的RTT的开销。若一个网页上有很多引用对象(例如图片等),那么请求每一个对象都需要花费2RTT的时间。 ④为了减小时延,浏览器通常会建立多个并行的TCP连接同时请求多个对象,但是这会大量占用万维网服务器的资源,特别是万维网服务器往往要同时服务于大量客户的请求,这会使其负担很重。 ![](https://i-blog.csdnimg.cn/direct/87b9717648a742829995cbb5bb9951d8.png) (4)HTTP/1.1采用持续连接方式(默认采用持续连接方式,可以更改为非持续连接方式),在该方式下,万维网服务器在发送响应后仍然保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。 ①这并不局限于传送同一个页面上引用的对象,而是只要这些文档都在同一个服务器上就行。 ②为了进一步提高效率,HTTP/1.1的持续连接还可以使用流水线方式工作,即浏览器在收到HTTP的响应报文之前就能够连续发送多个请求报文。这样的一个接一个的请求报文到达服务器后,服务器就发回一个接一个的响应报文,这样就节省了很多个RTT时间,使TCP连接中的空闲时间减少,提高了下载文档的效率。(下图所示的是非流水线方式) ![](https://i-blog.csdnimg.cn/direct/092c96e7689f4d42bd73c7534fd385fa.png) (5)HTTP是面向文本的,其报文中的每一个字段都是一些ASCII码串,并且每个字段的长度都是不确定的。 ①HTTP请求报文格式: \[1\]第一行是请求行。由方法字段开始,其后跟一个空格,后跟统一资源定位符字段,其后跟一个空格,后跟版本字段,最后是回车换行。 \[2\]从第二行开始是首部行。每一个首部行由首部字段名开始,其后跟一个冒号,再跟一个空格,然后是该字段的取值,最后是回车换行。 \[3\]可以有多个首部行,如下图所示,多个首部行组成请求头。 \[4\]在最后的首部行下面是一个空行。 \[5\]在空行下面是实体主体,通常不使用。 ![](https://i-blog.csdnimg.cn/direct/7c2ded93088d48448e7358472d5d573f.png) ![](https://i-blog.csdnimg.cn/direct/29c5b01025714c80ab12b0a52b7b9414.png) ②HTTP响应报文的格式: \[1\]第一行是状态行。由版本字段开始,其后跟一个空格,后跟状态码字段,其后跟一个空格,后跟短语字段,最后是回车换行。 \[2\]除状态行外,其它部分与HTTP请求报文格式的对应部分是相似的,它们会组成响应头,这里不再赘述。 ![](https://i-blog.csdnimg.cn/direct/fd142d58f23b4d84a3fdc5b8327260f4.png) ![](https://i-blog.csdnimg.cn/direct/d175808e4cee4adeb13c1bc42dce13cd.png) ## 三、ESP8266物联网开发基础 ### 1、准备工作 (1)安装开发板驱动程序:前往驱动芯片制造商官网下载NODEMCU/ESP8266驱动(CP210x_Universal_Windows_Driver),下载到本地的是一个压缩包,将其解压后,右键选择其中的.inf文件,点击"安装"即可。 ![](https://i-blog.csdnimg.cn/direct/0019654cc8114c01971c8730b961d7c1.png) (2)用USB线将电脑与ESP8266-NodeMCU连接,然后打开设备管理器,查看端口选项,如果能看到下图所示的端口,说明驱动开发板驱动程序安装成功。 ![](https://i-blog.csdnimg.cn/direct/5263db749bc9470aaac1183c23bf43a5.png) (3)为开发板搭建开发环境: ①打开Arduino IDE,在菜单栏中选择"文件"→"首选项",在弹出的对话框中找到"其他开发板管理器地址",将"http://arduino.esp8266.com/stable/package_esp8266com_index.json"填入此栏中,然后点击"确定"。 ![](https://i-blog.csdnimg.cn/direct/4157f1b3093b40b5bca2373eb45be09b.png) ②在菜单栏中选择"工具"→"开发板"→"开发板管理器",搜索"esp8266",找到对应项目后点击"安装"即可。 ![](https://i-blog.csdnimg.cn/direct/431875b5055147b4b26702a335d130fe.png) ③在菜单栏中选择"工具"→"开发板"→"esp8266"→"NodeMCU 1.0 (ESP-12E Module)"。 ![](https://i-blog.csdnimg.cn/direct/dff3349fc3c646ec9ccf2c1bbe2a4d24.png) ④在菜单栏中选择"工具"→"端口",然后选择ESP8266-NodeMCU与电脑连接的端口(在设备管理器中可查询,上面设备管理器的图示指出这里应选择COM5)。 ![](https://i-blog.csdnimg.cn/direct/c4303aa7138f4e83b94504f57181c726.png) ### 2、NodeMCU开发板的接入点模式(Access Point,AP) (1)将以下示例程序粘贴到代码区中,然后将其编译并上传NodeMCU开发板,NodeMCU开发板将会建立一个名为"Zevalin_esp8266"的Wi-Fi,可以使用手机或电脑连接该Wi-Fi,从而实现与NodeMCU的网络通讯,不过需要注意的是,该Wi-Fi目前没有连接互联网,所以当连接该Wi-Fi后,连接设备将无法访问互联网。 ![](https://i-blog.csdnimg.cn/direct/2d791b0f5a274e81b74c0776dfc42ee2.png) ```cpp #include //本程序使用ESP8266WiFi库 const char *ssid = "Zevalin_esp8266";//定义将要建立的Wi-Fi名称,此处以"Zevalin_esp8266"为示例 const char *password = "00114514"; //定义将要建立的Wi-Fi密码,此处以00114514为示例 //如果建立的Wi-Fi不要密码,则在双引号内不要填入任何信息 void setup() { Serial.begin(9600); //启动串口通讯 WiFi.softAP(ssid, password); //WiFi.softAP用于启动NodeMCU的AP模式 //ssid是Wi-Fi名,password是Wi-Fi密码 Serial.print("Access Point: "); //通过串口监视器输出信息,告知用户所建立的Wi-Fi名 Serial.println(ssid); Serial.print("IP address: "); //通过串口监视器输出信息,告知用户所建立的Wi-Fi的IP地址 Serial.println(WiFi.softAPIP()); //通过调用WiFi.softAPIP()可以得到NodeMCU的IP地址 } void loop() { } ``` (2)如果电脑的系统是Windows,则可打开命令行,输入"ping 192.168.4.1"。ping命令可用于测试电脑与网络上的某个设备是否成功建立连接,其中"192.168.4.1"是NodeMCU的默认IP地址,该命令会使电脑向目标设备发送数据,如果得到目标设备的回复,说明成功建立连接。 ![](https://i-blog.csdnimg.cn/direct/e3a0c40ca51f41269eeab4e74ea086ef.png) ### 3、NodeMCU开发板的无线终端模式(Station) (1)将以下示例程序粘贴到代码区中,然后将其编译并上传NodeMCU开发板,NodeMCU开发板将会连接名为"Zevalin_Computer"的Wi-Fi(本例使用电脑热点作为NodeMCU开发板的连接对象),连接成功后,NodeMCU开发板会被分配一个IP地址,此时IP地址不一定是NodeMCU开发板的默认IP地址。 ![](https://i-blog.csdnimg.cn/direct/5ba810b7d49648818753bc06d4c9236a.png) ```cpp #include // 本程序使用ESP8266WiFi库 const char* ssid = "Zevalin_Computer"; // 连接WiFi名(此处使用Zevalin_Computer为示例) const char* password = "00114514"; // 连接WiFi密码(此处使用00114514为示例) void setup() { Serial.begin(9600); // 启动串口通讯 WiFi.begin(ssid, password); // 启动网络连接 Serial.print("Connecting to "); // 串口监视器输出网络连接信息 Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试Wi-Fi连接 int i = 0; // 这一段程序语句用于检查Wi-Fi是否连接成功 while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的Wi-Fi连接状态所决定的,如果Wi-Fi连接成功则返回值为WL_CONNECTED delay(1000); Serial.print(i++); Serial.print(' '); // 通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值,同时NodeMCU将通过串口监视器输出连接时长读秒 } Serial.println(""); Serial.println("Connection established!"); // Wi-Fi连接成功后,NodeMCU将通过串口监视器输出"连接成功"信息 Serial.print("IP address: "); Serial.println(WiFi.localIP()); // 输出NodeMCU的IP地址,通过调用WiFi.localIP()函数实现,该函数的返回值即NodeMCU的IP地址 } void loop() { } ``` (2)如果电脑的系统是Windows,则可打开命令行,输入"ping 192.168.137.173"。其中"192.168.137.173"是NodeMCU被分配的IP地址(该地址是不固定的),该命令会使电脑向目标设备发送数据,如果得到目标设备的回复,说明成功建立连接(如果电脑同时连接互联网,或者NodeMCU开发板直接与联网的路由器连接,那么NodeMCU开发板就是接入了互联网)。 ![](https://i-blog.csdnimg.cn/direct/ec01dca5a5454442933158db6e984828.png) (3)如果希望NodeMCU在多个地点使用时都能自动连接当地的Wi-Fi网络,则可以使用WiFiMulti库的addAP函数将个地点的Wi-Fi网络信息提前记录,然后调用WiFiMulti库的run函数,尝试连接信号最强的Wi-Fi网络。当然,如果能实现用户与单片机之间的信息交互,可以让用户选择连接需要且能够连接的Wi-Fi网络。 ```cpp #include // 本程序使用ESP8266WiFi库 #include // 本程序使用ESP8266WiFiMulti库 ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti' void setup() { Serial.begin(9600); // 启动串口通讯 //通过addAp函数存储若干个Wi-Fi网络信息,即Wi-Fi名称、Wi-Fi密码 wifiMulti.addAP("taichi-maker1", "12345678"); wifiMulti.addAP("taichi-maker2", "87654321"); wifiMulti.addAP("taichi-maker3", "13572468"); Serial.println("Connecting ..."); // 通过串口监视器输出信息告知用户NodeMCU正在尝试连接WiFi // 调用wifiMulti.run(),NodeMCU将会在当前环境中搜索addAP函数所存储的Wi-Fi,如果搜到多个存储的Wi-Fi,那么NodeMCU将会连接信号最强的那一个Wi-Fi,一旦连接Wi-Fi成功,wifiMulti.run()将会返回"WL_CONNECTED" while (wifiMulti.run() != WL_CONNECTED) { delay(1000); Serial.print('.'); } Serial.println('\n'); Serial.print("Connected to "); Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的Wi-Fi名称 Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); // 通过串口监视器输出NodeMCU的IP地址 } void loop() { } ``` ### 4、常用库函数阶段性总结 |------------------|----------|----------------------------------------|---------------------------------------------------------------------------------------------------| | 库 | 函数 | 参数(从左到右) | 作用 | | ESP8266WiFi | softAP | ssid:AP模式的Wi-Fi名 password:AP模式的Wi-Fi密码 | 启动AP模式 | | ESP8266WiFi | softAPIP | / | 获取作为"路由器"的IP地址 | | ESP8266WiFi | begin | ssid:欲连接Wi-Fi的名 password:欲连接Wi-Fi的密码 | 连接目标Wi-Fi网络 | | ESP8266WiFi | SSID | / | 获取连接的Wi-Fi名 | | ESP8266WiFi | localIP | / | 获取被分配的IP地址 | | ESP8266WiFiMulti | addAP | ssid:欲连接Wi-Fi的名 password:欲连接Wi-Fi的密码 | 每调用一次,就存储一个Wi-Fi网络的信息,即Wi-Fi名称和Wi-Fi密码 | | ESP8266WiFiMulti | run | / | 在当前环境中搜索addAP函数所存储的所有Wi-Fi,如果搜到多个存储的Wi-Fi,NodeMCU将会连接信号最强的那一个Wi-Fi,一旦连接Wi-Fi成功,将会返回"WL_CONNECTED" |

相关推荐
wuxuand2 小时前
DIFT:用扩散模型+Transformer解决物联网入侵检测中的类别不平衡问题
深度学习·物联网·transformer
没有医保李先生2 小时前
蓝牙入门理解
stm32·单片机
互联网江湖2 小时前
鹿客科技IPO,陈彬不想“站在门外”
大数据·人工智能·物联网
csg11073 小时前
PIC单片机高阶实战(三):PIC32MX电平变化中断输入
单片机·嵌入式硬件·物联网
wsoz3 小时前
GCC编译
linux·c语言·嵌入式·gcc
梁山1号3 小时前
【LCD屏幕相关】针对中景园
stm32·单片机·物联网
银月光科技3 小时前
红外LED加热应用的市场格局与增长潜力
单片机·嵌入式硬件
项目題供诗3 小时前
51单片机入门-蜂鸣器(十一)
单片机·嵌入式硬件·51单片机
Kingexpand_com4 小时前
物联网APP开发实战:如何打造用户真正愿意用的智能硬件伴侣
物联网·小程序·app·智能硬件·物联网app定制开发