Arduino与Proteus仿真-WiFi网络仿真环境搭建

Arduino与Proteus网络(WiFi)仿真环境搭建

文章目录

本文将详细介绍如何在Proteus搭建Arduino的WiFi仿真环境。

1、软件准备

1)Arduino IDE或 VSCode + PlatformIO

2)Proteus电路仿真软件

3)Arduino的Proteus仿真模型库,ArduinoLibraryforProteusV2.0.zip

4)串口调试工具软件

2、硬件准备

1)WiFi模块:ESP01-S模块或其他带标准AT固件的WiFi模块,本文使用ESP01-S模块。

2)串口(TTL)转USB模块。该模块用于连接ESP01-S的串口引脚并通过USB接口连接到电脑。

3、仿真电路原理图

在这里插入图片描述

在仿真原理图中,我们通过一个COMPIM组件与PC主机的串口连接起来。请注意,该组件与Arduino的USART接线:

在这里插入图片描述

COMPIM组件的RXD与TXD分别与RX1和TX1连接,即连接到Arduino的Serial1端口。另外,我们使用一个虚拟串口仿真组件作为调试输出。COMPIM的配置如下(双击COMPIM组件):

在这里插入图片描述

配置中的Physical port为电脑中的物理串口,为ESP01-S连接到电脑中显示的串口。当ESP01-S连接到电脑后,在电脑的设备管理器中可以查看:

在这里插入图片描述

配置中的Physical Baud Rate为物理串口通信的波特率,ESP01-S默认为115200。(请查看使用的WiFi模块相关说明)

配置中的Physical Data Bits为物理串口通信的数据位

配置中的Physical Parity为物理串口的奇偶校验位

配置的中Virtual Baud Rate为虚拟串口通信的波特率,即为Arduino的串口波特率,一般与物理串口的配置一样。

其他虚拟串口的配置请配置与物理串口一致。

4、仿真代码实现

示例代码使用到如下开源库:

该库与Arduino的WiFi库和Ethernet 类似,因此使用起来非常方便。下面将实现如何连接WiFi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <Arduino.h>

#define DEBUG_ESP8266_AT_WEBSERVER_PORT Serial

// 日志输出
#define _ESP_AT_LOGLEVEL_ 1
#define ESP_AT_USE_AVR 1
#define BOARD_TYPE "AVR Mega2560"
#define EspSerial Serial1
#define BOARD_NAME BOARD_TYPE
#define MULTIPLY_FACTOR 1

#include "ESP8266_AT_WebServer.h"

char ssid[] = "*************";
char pass[] = "*************";
int status = WL_IDLE_STATUS; // WiFi状态
int reqCount = 0;

void printCurrentNet();
void printWifiData();

void setup()
{
// 初始化串口
Serial.begin(115200);
// 初始化ESP01-S模块串口
Serial1.begin(115200);
// 初始化ESP01-S模块
WiFi.init(&Serial1);

// 检查ESP01模块是否已经连接
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
while (true);
}

// 连接网络
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
// 连接到WiFi热点
status = WiFi.begin(ssid, pass);
}

Serial.println("You're connected to the network");
}

void loop()
{
Serial.println();
printCurrentNet();
printWifiData();

delay(10000);
}

void printWifiData()
{
// 打印IP地址
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);

// 打印MAC地址
byte mac[6];
WiFi.macAddress(mac);
char buf[20];
sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]);
Serial.print("MAC address: ");
Serial.println(buf);
}

void printCurrentNet()
{
// 打印当前网络信息
Serial.print("SSID: ");
Serial.println(WiFi.SSID());

byte bssid[6];
WiFi.BSSID(bssid);
char buf[20];
sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", bssid[5], bssid[4], bssid[3],
bssid[2], bssid[1],bssid[0]);
Serial.print("BSSID: ");
Serial.println(buf);

// WiFi信号强度
long rssi = WiFi.RSSI();
Serial.print("Signal strength (RSSI): ");
Serial.println(rssi);
}

代码如何工作?

1)导入依赖库头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <Arduino.h>
#include <Arduino.h>

#define DEBUG\_ESP8266\_AT\_WEBSERVER\_PORT Serial

// 日志输出
#define \_ESP\_AT\_LOGLEVEL\_ 1
#define ESP\_AT\_USE\_AVR 1
#define BOARD\_TYPE "AVR Mega2560"
#define EspSerial Serial1
#define BOARD\_NAME BOARD\_TYPE
#define MULTIPLY\_FACTOR 1

#include "ESP8266\_AT\_WebServer.h"

2)声明连接WiFi热点的相关变量

1
2
3
4
5
char ssid[] = "\*\*\*\*\*\*\*\*\*\*\*\*\*";         
char pass[] = "\*\*\*\*\*\*\*\*\*\*\*\*\*";
int status = WL_IDLE_STATUS; // WiFi状态
int reqCount = 0;

3)在setup函数中

初始化调试串口和WiFi串口

1
2
3
4
5
// 初始化串口
Serial.begin(115200);
// 初始化ESP01-S模块串口
Serial1.begin(115200);

初始化WiFi模块

1
2
WiFi.init(&Serial1);

检查WiFi模块是否连接

1
2
3
4
5
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
while (true);
}

连接WiFi热点

1
2
3
4
5
6
7
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
// 连接到WiFi热点
status = WiFi.begin(ssid, pass);
}

4)打印WiFi连接信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void printWifiData()
{
// 打印IP地址
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);

// 打印MAC地址
byte mac[6];
WiFi.macAddress(mac);
char buf[20];
sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]);
Serial.print("MAC address: ");
Serial.println(buf);
}

5)打印当前WiFi网络信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void printCurrentNet()
{
// 打印当前网络信息
Serial.print("SSID: ");
Serial.println(WiFi.SSID());

byte bssid[6];
WiFi.BSSID(bssid);
char buf[20];
sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", bssid[5], bssid[4], bssid[3],
bssid[2], bssid[1],bssid[0]);
Serial.print("BSSID: ");
Serial.println(buf);

// WiFi信号强度
long rssi = WiFi.RSSI();
Serial.print("Signal strength (RSSI): ");
Serial.println(rssi);
}

6)在loop函数中,调用printWifiDataprintCurrentNet实现输出

1
2
3
4
5
6
7
8
9
void loop()
{
Serial.println();
printCurrentNet();
printWifiData();

delay(10000);
}

5、仿真结果

在这里插入图片描述

从仿真结果可以知道,Arduino仿真器已经和WiFi模块正常通信。

文章来源: https://iotsmart.blog.csdn.net/article/details/132962911