零基础入门学用物联网(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的电压,否则会损坏开发板。

1Arduino开发环境中,可使用digitalWrite函数将数字引脚写为HIGH(高电平)或LOW(低电平) ,它有两个参数,第一个参数用于指示数字引脚,第二个参数用于指示高电平/低电平,该函数产生作用的前提是该引脚需要通过pinMode函数设置为输出模式(OUTPUT)

2Arduino开发环境中,可使用digitalRead函数读取数字引脚的当前电平,即HIGH(高电平)或LOW(低电平),它有一个参数用于指示数字引脚。

②对于模拟引脚,ESP8266-NodeMCU开发板接受的电压范围为0-1V,这个边界同样不能逾越,否则也会损坏开发板。ESP8266只有一个模拟输入引脚(ADC)。

1Arduino开发环境中,analogWrite函数借助PWM调制,可以用于输出模拟信号 ,它有两个参数,第一个参数是模拟引脚号,第二个参数是0到255之间的PWM频率值,0对应"off",255对应"on"。

2Arduino开发环境中,analogRead函数仅有一个参数用于指示模拟引脚,该函数用于从Arduino的模拟输入引脚读取 模拟电压的 数值

③特殊引脚情况说明:

1GPIO2引脚在ESP8266-NodeMCU开发板启动时不能连接低电平。

2GPIO15引脚在开发板运行中一直保持低电平状态,因此不能使用GPIO15引脚来读取开关状态或进行I²C通讯。

3GPIO0引脚在开发板运行中需要一直保持高电平状态,否则ESP8266将进入程序上传工作模式,也就无法正常工作了。程序员无需对GPIO0引脚进行额外操作,因为ESP8266-NodeMCU的内置电路可以确保GPIO0引脚在工作时连接高电平而在上传程序时连接低电平。

4GPIO6-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,简单来说,就是把我们日常生活中使用的各种物理设备,通过互联网连接起来,形成一个巨大的网络,这样,这些设备就可以互相通信、收集数据,并且可以被远程控制和智能化管理。

(2)物联网的工作流程通常分为四个步骤:

①感知:设备通过身上的"感官"------传感器,来收集信息。比如智能空调里的温度传感器感知室温;智能门锁上的摄像头捕捉人脸;智能手环里的加速度传感器记录你的步数。

②连接:设备把感知到的信息,通过有线或无线的方式发送出去,这就像设备的"神经",将信息传回大脑。常见的连接技术有:Wi-Fi(无线局域网)、蓝牙、4G/5G、LoRa(远距离低功耗无线通信技术,专门为物联网设计的一种低功耗、远距离的无线通信技术)、Zigbee(一种低功耗、低速率、短距离的无线通信技术)等。

③处理:信息被发送到云端或本地的处理中心,在这里,数据被分析和解读,并做出决策。比如云端收到空调的数据,发现"当前室温28℃,而用户设定的目标是26℃"。

④应用:系统根据处理结果,向设备发出指令,或者向用户展示信息。比如云端向空调发送指令------"开始制冷,直到室温降到26℃",同时,手机App上收到一条通知------"空调已根据您的设定自动开启"。

二、ESP8266互联网开发基础

1、TCP/IP协议的概念

(1)TCP/IP协议包含如下协议,它们分布在计算机网络体系结构的不同层级中。

(2)关于TCP/IP协议及互联网基础的详细介绍,可参考《计算机网络》课程。

2、链路层简介

(1)链路层的主要作用是实现设备之间的物理连接,比如日常使用的Wi-Fi就是链路层协议中的一种。

(2)ESP8266利用Wi-Fi联网时有三种工作模式:

①接入点模式:ESP8266可以建立Wi-Fi网络,其它设备通过查找网络名并输入密码,可以接入此网络(相当于作为一个Wi-Fi路由器)。

②无线终端模式:ESP8266作为一个无线终端,连接Wi-Fi路由器,从而接入Wi-Fi网络,进而能够接入互联网。

③混合模式:接入点模式和无线终端模式的混合,能够同时实现两种模式的功能。

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地址字段以标识报文的发送方和接收方。

(4)如果电脑的系统是Windows,则可打开命令行,输入"ipconfig",按下回车,即可查询电脑的IP地址,对于本教程,需要关注"无限局域网适配器 WLAN"部分。

①Wi-Fi路由器是局域网络中的网关("网关"可以理解为是各局域网衔接的"关口"),默认网关则是Wi-Fi路由器的IP地址。局域网要想与其它局域网通信,也就是接入互联网,那么Wi-Fi路由器需要连接服务器,服务器会为各网关再分配一个IP地址。

②子网掩码用于标识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响应报文。

(3)HTTP/1.0采用非持续连接方式,在该方式下,每次浏览器要请求一个文件都要与服务器建立TCP连接,当收到响应后就立即关闭连接。

①客户与服务器之间通过"三报文握手"进行TCP连接,在这三个报文中的最后一个报文的数据载荷部分携带有HTTP请求报文,服务器收到后给客户发回HTTP响应报文。

②一次请求和响应所耗费的时间记为往返时间RTT,请求一个万维网文档所需的时间为2RTT+文档的传输时延。

③每请求一个文档就要有两倍的RTT的开销。若一个网页上有很多引用对象(例如图片等),那么请求每一个对象都需要花费2RTT的时间。

④为了减小时延,浏览器通常会建立多个并行的TCP连接同时请求多个对象,但是这会大量占用万维网服务器的资源,特别是万维网服务器往往要同时服务于大量客户的请求,这会使其负担很重。

(4)HTTP/1.1采用持续连接方式(默认采用持续连接方式,可以更改为非持续连接方式),在该方式下,万维网服务器在发送响应后仍然保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。

①这并不局限于传送同一个页面上引用的对象,而是只要这些文档都在同一个服务器上就行。

②为了进一步提高效率,HTTP/1.1的持续连接还可以使用流水线方式工作,即浏览器在收到HTTP的响应报文之前就能够连续发送多个请求报文。这样的一个接一个的请求报文到达服务器后,服务器就发回一个接一个的响应报文,这样就节省了很多个RTT时间,使TCP连接中的空闲时间减少,提高了下载文档的效率。(下图所示的是非流水线方式)

(5)HTTP是面向文本的,其报文中的每一个字段都是一些ASCII码串,并且每个字段的长度都是不确定的。

①HTTP请求报文格式:

1第一行是请求行。由方法字段开始,其后跟一个空格,后跟统一资源定位符字段,其后跟一个空格,后跟版本字段,最后是回车换行。

2从第二行开始是首部行。每一个首部行由首部字段名开始,其后跟一个冒号,再跟一个空格,然后是该字段的取值,最后是回车换行。

3可以有多个首部行,如下图所示,多个首部行组成请求头。

4在最后的首部行下面是一个空行。

5在空行下面是实体主体,通常不使用。

②HTTP响应报文的格式:

1第一行是状态行。由版本字段开始,其后跟一个空格,后跟状态码字段,其后跟一个空格,后跟短语字段,最后是回车换行。

2除状态行外,其它部分与HTTP请求报文格式的对应部分是相似的,它们会组成响应头,这里不再赘述。

三、ESP8266物联网开发基础

1、准备工作

(1)安装开发板驱动程序:前往驱动芯片制造商官网下载NODEMCU/ESP8266驱动(CP210x_Universal_Windows_Driver),下载到本地的是一个压缩包,将其解压后,右键选择其中的.inf文件,点击"安装"即可。

(2)用USB线将电脑与ESP8266-NodeMCU连接,然后打开设备管理器,查看端口选项,如果能看到下图所示的端口,说明驱动开发板驱动程序安装成功。

(3)为开发板搭建开发环境:

①打开Arduino IDE,在菜单栏中选择"文件"→"首选项",在弹出的对话框中找到"其他开发板管理器地址",将"http://arduino.esp8266.com/stable/package_esp8266com_index.json"填入此栏中,然后点击"确定"。

②在菜单栏中选择"工具"→"开发板"→"开发板管理器",搜索"esp8266",找到对应项目后点击"安装"即可。

③在菜单栏中选择"工具"→"开发板"→"esp8266"→"NodeMCU 1.0 (ESP-12E Module)"。

④在菜单栏中选择"工具"→"端口",然后选择ESP8266-NodeMCU与电脑连接的端口(在设备管理器中可查询,上面设备管理器的图示指出这里应选择COM5)。

2、NodeMCU开发板的接入点模式(Access Point,AP)

(1)将以下示例程序粘贴到代码区中,然后将其编译并上传NodeMCU开发板,NodeMCU开发板将会建立一个名为"Zevalin_esp8266"的Wi-Fi,可以使用手机或电脑连接该Wi-Fi,从而实现与NodeMCU的网络通讯,不过需要注意的是,该Wi-Fi目前没有连接互联网,所以当连接该Wi-Fi后,连接设备将无法访问互联网。

cpp 复制代码
#include <ESP8266WiFi.h>             //本程序使用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地址,该命令会使电脑向目标设备发送数据,如果得到目标设备的回复,说明成功建立连接。

3、NodeMCU开发板的无线终端模式(Station)

(1)将以下示例程序粘贴到代码区中,然后将其编译并上传NodeMCU开发板,NodeMCU开发板将会连接名为"Zevalin_Computer"的Wi-Fi(本例使用电脑热点作为NodeMCU开发板的连接对象),连接成功后,NodeMCU开发板会被分配一个IP地址,此时IP地址不一定是NodeMCU开发板的默认IP地址。

cpp 复制代码
#include <ESP8266WiFi.h>        // 本程序使用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开发板就是接入了互联网)。

(3)如果希望NodeMCU在多个地点使用时都能自动连接当地的Wi-Fi网络,则可以使用WiFiMulti库的addAP函数将个地点的Wi-Fi网络信息提前记录,然后调用WiFiMulti库的run函数,尝试连接信号最强的Wi-Fi网络。当然,如果能实现用户与单片机之间的信息交互,可以让用户选择连接需要且能够连接的Wi-Fi网络。

cpp 复制代码
#include <ESP8266WiFi.h>        // 本程序使用ESP8266WiFi库
#include <ESP8266WiFiMulti.h>   // 本程序使用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" |

相关推荐
Hotchip_MEMS15 分钟前
消费电子声学升级核心器件:MP381A-AB17D MEMS麦克风参数详解与应用场景
人工智能·笔记·物联网·电脑·制造
智购科技自动售卖机厂家22 分钟前
2026自动售货机云端数据备份策略:从全量备份到增量恢复的工程实践~YH
数据库·stm32·嵌入式硬件·物联网·架构·零售
小何code29 分钟前
STM32入门教程,第12课(下),旋转编码器计次
单片机·嵌入式硬件
wtblszn1 小时前
城市二供泵站远程监控运维系统物联网方案
运维·物联网
SMT贴片河南芯途电子1 小时前
中小批量SMT贴片加工的痛点与现代化柔性制造解决方案!
嵌入式硬件·物联网·边缘计算·制造
物联通信量讯说2 小时前
物联网设备出海如何解决通信合规问题?全球 IoT 连接指南
物联网·iot·企业出海·通信合规·设备出海
集芯微电科技有限公司2 小时前
低压功率MOSFETs选型手册
人工智能·单片机·嵌入式硬件·神经网络·生成对抗网络
嵌入式学习菌3 小时前
ESP32 智能插座 Web 上位机设计与实现
物联网
Messy create3 小时前
【BMS-AFE-分压采样电路】
单片机·能源
华允物联-HUAIOT3 小时前
基于网络IO的水泵远程控制系统方案
网络·物联网