在本文中,让我们讨论如何将WIFI模块ESP8266与PIC微控制器接口。到目前为止,您可能已经将ESP8266模块用作独立的微控制器,或者可能已将其与Arduino库一起使用。但是,涉及硬核嵌入式系统项目时,我们也应该知道如何将其与PIC单片机一起使用。这将帮助您从设计角度自定义项目,同时也使其变得便宜。
ESP8266模块随附了默认固件,因此我们可以使用AT命令对模块进行编程。这些命令必须通过串行通信通道发送。通过使用PIC微控制器中的USART模块在PIC和ESP8266模块之间建立此通道。整个工作将通过16x2 LCD显示器进行监控并报告给用户。因此,本教程假设您具有一些有关PIC中的USART模块,LCD与PIC接口以及在ESP8266中使用AT命令的基本知识。如果您不这样做,则可以退回到链接的教程以事先学习它们。
所需材料:
您需要以下硬件来完成本教程
- PIC16F877A
- 20MHz晶体振荡器
- 7805
- LM317
- ESP8266
- 16 * 2 LCD显示屏
- PicKit3程序员
- 电阻(1K,220ohm,360ohm)
- 电容器(1uF,0.1uF,33pF)
- 跳线
- 12V适配器为PIC和ESP模块供电
硬件:
该项目的完整示意图如下所示
原理图由两个稳压器电路组成,一个是用于为PIC微控制器供电的+ 5V稳压器,另一个是为ESP8266模块供电的3.3V稳压器。通过使用7805(线性稳压器IC)来调节+ 5V。3.3V通过使用LM317(可变电压调节器)来调节。ESP8266模块消耗大量电流(〜800mA),因此,如果您设计自己的电源,请确保它可以提供如此高的电流。还要确保PIC和ESP8266模块的接地引脚连接在一起。
所以现在我们知道PIC工作在+ 5V,ESP8266工作在3.3V伏。为了在这两个模块之间建立USART通信,我们需要一个5V-3.3V逻辑转换器电路,如上图所示。该电路不过是一个分压器,将输入的+ 5V转换为3.3V。这将防止ESP8266的3.3V容忍RX引脚获得+ 5V电压。
如这些教程所示,我已经在两个单独的性能板上制作了PIC和ESP模块。这样,我可以将它们普遍用于更多类似的项目
- 使用PIC的LED硬件
- ESP8266入门
您可以遵循相同的方法,也可以按照自己的风格构建自己的电路板,或者将上述电路连接到面包板上。
PIC单片机编程:
为了对PIC单片机进行编程,以便使用USART将其“ AT命令”串行发送到ESP8266模块,我们必须使用一个库。该库将为您节省很多麻烦,例如使用ESP8266指令模块检查每个AT命令,然后找到一种将它们传输到ESP模块的方法。该库是最初由Camil Staps开发的免费软件,后来经过Circuit Digest进行了改进和修改,因此可以与我们的PIC16F877A单片机一起使用。你可以在这里下载
该库仍在开发中,但您可以使用ESP8266固件中的大多数重要AT命令。如果您发现缺少所需的任何命令,请在注释部分告知我,我将尝试为您添加它。本教程将向您介绍该库可以使用的所有命令(到目前为止)。进一步还将指导您将自己的函数添加到库中。
ESP8266 Library中的功能:
- Initialize_ESP8266():此函数将初始化PIC的USART模块以与ESP8266模块通信。它将波特率设置为115200,并准备PIC的Rx和Tx引脚以进行USART通信。
- _esp8266_putch():此函数用于将单个字符串行发送到ESP8266模块。例如, _esp8266_putch('a') 会将字符串行发送到ESPmodule。
- _esp8266_getch():此函数用于从ESP模块获取单个字符。例如,如果ESP正在打印“ OK”,并且我们使用char a = _esp8266_getch()。然后,字符“ o”将存储在变量a中。
- ESP8266_send_string():此函数是_esp8266_putch()的字符串版本。它可以发送一个完整的字符串到ESP8266模块。例如,ESP8266_send_string(“ AT / r / n”)会将命令“ AT”发送给ESP8266模块。
- esp8266_isStarted():用于检查PIC是否可以与ESP模块通信。它发送命令“ AT”并等待“确定”(如果收到),它返回true,否则返回false。
- esp8266_restart():重置ESP8266模块,返回true表示重置成功,如果失败则返回false。
- esp8266_mode():用于设置ESP8266模块的工作模式。我们知道它可以在三种不同的模式下工作。
站模式 |
|
软AP模式 |
|
工作站和AP模式 |
- esp8266_connect():允许您连接到wifi信号。例如 esp8266_connect(“ home”,“ 12345678”) ,将允许您的模块连接到名为home的wifi信号,其密码为12345678。
- esp8266_disconnect():此功能可将您的模块与以前连接的任何wifi连接断开连接
- esp8266_ip():获取IP地址并返回。如果您想知道ESP8266模块的IP地址,请使用此功能。
- esp8266_start():此函数用于启动TCP或UDP通信。例如 esp8266_start( “ TCP”,“ 192.168.101.110”,80) 。将在该IP和端口80中启动TCP网络。
- esp8266_send():此函数用于将信息发送到TCP / UDP网络。HTML脚本将使用此命令发送。然后,该脚本将出现在先前建立通信的IP地址中。
- esp8266_config_softAP():此函数用于配置softAP。例如 esp8266_config_softAP(“ office”,“ 12345678”); 将创建一个名为office的Wifi信号,并应使用密码12345678进行访问。
- esp8266_get_stationIP():此函数将为您返回连接到softAP的客户端的IP / MAC地址。
示例程序:
现在,我们已经了解了库中每个命令的功能,现在我们来看一个小的示例程序。在此程序中,我们将检查ESP8266与PIC之间的连接是否成功,然后创建具有首选名称和密码的WIFI网络(SoftAP)。为了您的理解,将说明完整的程序及其仿真。
同样,如果您还没有阅读我们的PIC与LCD的接口以及PIC USART教程,请在继续阅读之前阅读,因为只有这样对您有意义。
由于我们才刚刚开始将PIC与ESP8266接口,因此我使用LCD来确保一切正常。
做{Lcd_Set_Cursor(1,1); Lcd_Print_String(“未找到ESP”); }同时(!esp8266_isStarted()); //等到ESP发回“ OK” Lcd_Set_Cursor(1,1); Lcd_Print_String(“ ESP已连接”); __delay_ms(1500); Lcd_Clear();
当我们将“ AT”发送到ESP8266模块时,它会以“ OK”回复。这可以确保我们成功连接ESP8266模块。函数esp8266_isStarted()用于相同的功能。我们从PIC发送信号AT,然后等到ESP模块开始运行并向我们发送OK。如果确定,我们将在LCD上显示“ ESP已连接”。
esp8266_mode(2); Lcd_Set_Cursor(1,1); Lcd_Print_String(“ ESP设置为AP”); __delay_ms(1500); Lcd_Clear();
上面的代码行用于将ESP模块设置为在“ soft AP”模式下工作。函数esp8266_mode(2); 向模块发送AT命令“ AT + CWMODE = 3”,并等待模块以“ OK”响应
/ *配置AP名称和密码* / esp8266_config_softAP(“ CircuitDigest”,“ 619007123”); Lcd_Set_Cursor(1,1); Lcd_Print_String(“已配置AP”); __delay_ms(1500); Lcd_Clear(); / *已配置AP * /
该段代码用于配置softAP。在这里,我们将SSID命名为“ CircuitDigest”,并将密码命名为“ 619007123”。为了表明该过程已完成,我们将等待模块以“ OK”响应,然后将配置的AP打印到LCD屏幕上。
就是说,现在我们已经将ESP8266模块与PIC MCU连接起来,并为softAP配置了我们选择的名称和密码。与往常一样,让我们模拟此代码并查看其工作方式。
模拟输出:
我们正在使用Proteus软件来模拟输出。附件中提供了相同的设计文件。
由于Proteus库中没有ESP8266模块,因此我们使用了串行终端,并以用户身份回覆PIC模块。模拟完成后的屏幕如下所示
我们的代码输出显示在Virtual终端中。下面的视频将说明仿真的完整工作。
输出验证:
使用仿真对程序进行验证后,将其转储到PIC微控制器中。按照上面的示意图(“硬件”部分)进行连接。您应该能够通过LCD显示屏跟踪进度。
当LCD显示AP已配置后,我们可以使用Phone或Laptop中的WIFI设置进行签出。我的笔记本电脑按照我们的程序显示以下信号。
就是说,我们已经成功地将ESP8266模块与PIC单片机接口了。这是一个非常基本的界面,如果您想使用ESP8266进行任何复杂的项目,则可能必须添加自己的库或至少添加自己的功能。相信我,这样做非常容易,我将简要介绍一下。
向ESP8266库添加功能:
添加自己的功能将帮助您将任何“ AT”命令发送到ESP8266模块。要进行此操作,您需要阅读ESP8266模块的指令集文档。您可以直接发送在该指令集手册中找到的任何AT命令。但是请始终记住,在每个AT命令的末尾都附加“ / r / n”。例如,如果您想与ESP模块建立多个连接。然后打开指令集文档,找到我们的哪个AT命令将为您完成此工作。在这里,命令“ AT + CIPMUX = 1”将允许您与ESP模块建立多个连接。
现在,您要做的就是使用串行端口将此“ AP + CIPMUX = 1”发送到ESP8266模块。做到这一点的最核心方法是仅使用命令
_esp8266_print(“ AT + CIPMUX = 1 \ r \ n”“)
这将起作用,但不是最佳方法。您必须回读ESP8266对命令的响应。在我们的情况下,它将以“确定”响应。因此,您必须从ESP8266模块读取传入的数据,并确认它是“ OK”。您也可以在可以将“ 1”或“ 0”作为参数传递的位置上使用此函数。
继续尝试为库创建自己的函数。但是,如果您需要帮助,请随意使用评论部分,我们将为您提供帮助。