【NodeMCU实时天气时钟温湿度项目 2】WIFI模式设置及连接

第一专题内容,请参考

【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计-CSDN博客

第三专题内容,请参考
【NodeMCU实时天气时钟温湿度项目 3】连接SHT30传感器,获取并显示当前环境温湿度数据(I2C)-CSDN博客

今天是第二专题。

NodeMCU是一个基于乐鑫ESP8266的开源IoT物联网硬件开发平台,支持WIFI功能,使用方法简单,受到越来越多来自全世界的创客朋友们的青睐。

ESP8266是一款低成本、高性能的Wi-Fi模块,由Espressif Systems开发。它集成了Wi-Fi功能和TCP/IP协议栈,并可通过串口与主控制器进行通信。它采用先进的WIFI技术,提供高速、稳定的网络连接。其强大的处理能力使得设备能够快速响应指令,实现流畅的数据传输和通信。无论是智能家居、工业自动化还是远程监控等领域,都获得了广泛应用。

一、NodeMCU模块的WiFi工作模式

1、 无线终端(STA)模式

在此模式下,模块可连接到由其他设备提供的无线网络,例如通过 WIFI 连接至路由器访问互联网,实现手机或电脑通过互联网实现对设备的远程控制。

简单来说,此模式下,该模块相当于一个用户,需要链接外部的WIFI(或自己的热点),通过链接的WIFI与其他在线设备进行通信。

2、接入点(soft-AP)模式

在此模式下,模块将作为热点供其他设备连接, 从而让手机或电脑直接与模块进行通讯,实现局域网的无线控制。同时支持0~8个无线终端连接到此soft-AP,默认为4个。

简单来说,此模式下,该模块相当于提供一个热点,创建一个小范围的局域网,凡是连接上的设备就能与其进行通信。

需要提醒的是:设置为soft-AP工作模式的模块,没有提供访问其他网络的接口。

3、混杂(STA+AP)模式

该模式为 STA 模式与 AP 模式共存的一种模式,模块既能连接到由其他设备提供的无线网络,又能作为热点供其他设备连接,以实现广域网与局域网的无缝切换, 方便操作使用。

二、NodeMCU模块的WiFi连接代码实现

将NodeMCU连接到Wi-Fi,就如同把移动手机连接到网络接点一样简单方便,只需要几行代码就可以实现。以下是官方示例代码。

(摘自:ESP8266WiFi library --- ESP8266 Arduino Core 3.1.2-21-ga348833 documentation

cpp 复制代码
#include <ESP8266WiFi.h>     //连接WiFi必须的头文件

void setup()
{
  Serial.begin(115200);
  Serial.println();

  //此处需要将"network-name" 和 "pass-to-network",修改为您自己所在环境下的接入点名称和密码
  WiFi.begin("network-name", "pass-to-network");

  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {}

三、在项目中添加WiFi功能的有关代码

  1. 添加ESP8266WiFi library支持WiFi功能的头文件
cpp 复制代码
#include <ESP8266WiFi.h>
  1. 增加设置WiFi模块将要连接的路由器的名称和密码
cpp 复制代码
/**
   配置您所在环境的wifi 账号和密码
   注意:切勿连接 5G的频率、不要使用双频融合(路由器)
   注意:账号密码必须完全正确,包括字母大小写、空格、中划线、下划线
   ******请务必修改成您所在环境的路由器名称和密码******
*/
const char* ssid     = "xcb940";
const char* password = "87589940abc";
  1. 增加实现WiFi连接功能函数的声明
cpp 复制代码
//WiFi 连接函数声明
void connectWiFi();

4、在setup()函数中调用 connectWiFi(),进行WiFi实际连接过程

cpp 复制代码
  联网,建立WiFi连接    
  tft.println("Wi-Fi >> " + String(ssid));
  connectWiFi();
  1. 增加WiFi连接功能函数 connectWiFi() 的定义
cpp 复制代码
//连接wifi
void connectWiFi() {

  Serial.print("Connecting to ");
  Serial.println(ssid);

  //设置WiFi工作在终端模式,参数可选填WIFI_AP、WIFI_STA、WIFI_AP_STA、WIFI_OFF
  WiFi.mode(WIFI_STA);
  
  //开始连接
  WiFi.begin(ssid, password);

  //检查连接是否成功
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    tft.print(".");
  }

  tft.println("");
  tft.println("");
  tft.setTextColor(TFT_GREEN, TFT_BLACK, true);
  tft.println(WiFi.localIP());

  //设置:当路由器断开连接时,是否启动自动重新连接功能。true: 启用自动重新连接;false:不启用此功能
  WiFi.setAutoReconnect(true);

  //设置:是否将WiFi参数保存于Flash中,默认为true,即在每次调用WiFi.begin()、WiFi.softAP()、WiFi.disconnect、WiFi.softAPdisconnect方法时都会将相关数据写入到Flash中;
  //      当设置为false时,以上动作将不会把数据写入Flash中,仅仅改变内存中的WiFi设置
  WiFi.persistent(true);
}

说明:除以上5点增加内容外,main.cpp其他内容未发生变化。

四、实现STA模式连接功能函数说明

1. wl_status_t WiFi.begin (const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid, bool connect)

功能 :启动无线连接

参数: 可设置5个参数,后4个为可选参数

ssid -- 要连接的wifi接入点的名称,最多可以包含32个字符。

password -- 可选。wifi接入点密码,长度至少应为8个字符且不超过64个字符。

channel -- 可选。要连接的wifi接入点信道。

bssid -- 可选。要连接的wifi接入点的mac地址。

connect -- 可选。连接状态参数。如果connect参数为true,NodeMCU开发板会使用闪存中储存的信息尝试连接WiFi。如果connect参数为false,ESP8266开发板不会尝试连接WiFi,而只会将WiFi连接信息保存在闪存中。

**返回值:**返回值数据类型为表示连接状态的 wl_status_t 类型。

2. wl_status_t WiFi.status()

功能: 返回STA模式下WiFi状态

返回值:

0 : WL_IDLE_STATUS,表示WiFi模块处于空闲状态,没有与任何网络连接

1 : WL_NO_SSID_AVAILin,表示找不到指定的 WiFi 网络(SSID)

2 : WL_SCAN_COMPLETED,表示WiFi模块网络扫描已结束

3 : WL_CONNECTED ,表示连接成功

4 : WL_CONNECT_FAILED,表示连接失败

5:WL_CONNECTION_LOST,表示连接已失去

6 : WL_WRONG_PASSWORD,表示连接密码错误

7:WL_DISCONNECTED,表示已断开连接。

3. bool WiFi.mode(WiFiMode_t m)

功能: 用于设置 Wi-Fi 工作模式。

参数:

WIFI_OFF: = 0,关闭 Wi-Fi。

WIFI_STA: = 1,设置为 Wi-Fi 无线终端模式,用于连接到 Wi-Fi 热点。

WIFI_AP: = 2,设置为 Wi-Fi 接入点模式,其他 在线Wi-Fi 设备可以连接到它。

WIFI_AP_STA: = 3,设置为同时作为 Wi-Fi 接入点和客户端,可以连接到其他 Wi-Fi 热点并接受其他 Wi-Fi 设备的连接。

**返回值:**布尔型。

4. IPAddress WiFi.localIP()

功能:获取NodeMCU开发板本地接口的IP地址

返回值:本地接口的IP地址

5. bool WiFi.setAutoReconnect(bool autoReconnect)
功能:
当路由器(AP)断开连接时,是否启动自动重新连接功能。

参数: 布尔类型。true,启用自动重新连接;false,不启用此功能。

**返回值:**布尔类型。设置成功返回true,失败则返回false。

6. void WiFi.persistent(bool persistent)
功能:
设置是否将WiFi参数保存于Flash中,默认为true。即在每次调用WiFi.begin()、WiFi.softAP()、WiFi.disconnect、WiFi.softAPdisconnect方法时都会将相关数据写入到Flash中;

参数: 布尔类型。true表示保存到FLASH中;false表示将不会把数据写入Flash中,仅仅改变内存中的WiFi设置。

**返回值:**无。

五、项目第2阶段 main.cpp 的主要内容

cpp 复制代码
#include <Arduino.h>
#include <TFT_eSPI.h>

#include <ESP8266WiFi.h>

/**
   配置您所在环境的wifi 账号和密码
   注意:切勿连接 5G的频率、不要使用双频融合(路由器)
   注意:账号密码必须完全正确,包括字母大小写、空格、中划线、下划线
*/
const char* ssid     = "LGCWZS";
const char* password = "87129168";


//构造函数,实例化 TFT 屏幕对象
TFT_eSPI tft = TFT_eSPI();

//WiFi 连接函数声明
void connectWiFi();

//程序用到的字库文件,后面会详细说明
#include "hefeng-min-40px.h"
#include "weather_font20.h"
#include "weather_font16.h"

void setup()
{
  //设置串口波特率
  Serial.begin(115200);

  //等待串口稳定
  Serial.println("");
  Serial.println("");
  Serial.println("");

  //TFT初始化设置
  tft.init();
  tft.setSwapBytes(true);
  tft.setRotation(0);  
  tft.fillScreen(TFT_BLACK);
  tft.setTextColor(TFT_WHITE, TFT_BLACK, true);
  
  //设置显示字号
  tft.setTextSize(2);

  联网,建立WiFi连接    
  tft.println("Wi-Fi >> " + String(ssid));
  connectWiFi();

   delay(10000);
  tft.fillScreen(TFT_BLACK);  

    // 显示当前日期,星期几,农历
  tft.loadFont(weather_font16);
  tft.setTextColor(TFT_WHITE, TFT_BLACK, true);
  tft.drawString("2024-05-03  星期五  三月二五", 0, 0);
  tft.unloadFont();

  tft.setTextSize(5);
  tft.setTextColor(TFT_GREEN, TFT_BLACK, true);
  tft.drawString("17:16:26", 0, 30);

  // 今日天气
  // 擦除指定区域
  tft.fillRect(55, 90, 240, 40, TFT_BLACK);
  tft.setTextColor(TFT_YELLOW, TFT_BLACK, true);
  tft.loadFont(hefeng40);
  tft.drawString("\uf101", 10, 90);
  tft.unloadFont();

  tft.loadFont(weather_font20);
  tft.setTextColor(TFT_WHITE, TFT_BLACK, true);
  tft.drawString("25°C  晴", 55, 90);
  tft.drawString("东南风3级 3KM/H", 55, 110);

  tft.drawLine(0, 140, 240, 140, TFT_WHITE);

  // 明日天气
  // 擦除指定区域
  tft.fillRect(55, 150, 240, 40, TFT_BLACK);

  tft.loadFont(hefeng40);
  tft.setTextColor(TFT_YELLOW, TFT_BLACK, true);
  tft.drawString("\uf103", 10, 150);
  tft.unloadFont();

  tft.loadFont(weather_font20);
  tft.setTextColor(TFT_WHITE, TFT_BLACK, true);
  tft.drawString("明天 15° - 28°", 55, 150);
  tft.drawString("多云", 55, 170);

  tft.drawLine(0, 200, 240, 200, TFT_WHITE);

  // 温湿度传感器的数据
  tft.loadFont(weather_font20);
  tft.setTextColor(TFT_WHITE, TFT_BLACK, true);

  tft.drawString("室温:", 20, 210);
  tft.setTextColor(TFT_GREEN, TFT_BLACK, true);

  tft.setTextColor(TFT_WHITE, TFT_BLACK, true);
  tft.drawString("湿度:", 120, 210);

  tft.setTextColor(TFT_GREEN, TFT_BLACK, true);
}

void loop()
{

}

//连接wifi
void connectWiFi() {

  Serial.print("Connecting to ");
  Serial.println(ssid);

  //设置WiFi工作在终端模式,参数可选填WIFI_AP、WIFI_STA、WIFI_AP_STA、WIFI_OFF
  WiFi.mode(WIFI_STA);
  
  //开始连接
  WiFi.begin(ssid, password);

  //检查连接是否成功
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    tft.print(".");
  }

  tft.println("");
  tft.println("");
  tft.setTextColor(TFT_GREEN, TFT_BLACK, true);
  tft.println(WiFi.localIP());

  //设置:当路由器断开连接时,是否启动自动重新连接功能。true: 启用自动重新连接;false:不启用此功能
  WiFi.setAutoReconnect(true);

  //设置:是否将WiFi参数保存于Flash中,默认为true,即在每次调用WiFi.begin()、WiFi.softAP()、WiFi.disconnect、WiFi.softAPdisconnect方法时都会将相关数据写入到Flash中;
  //      当设置为false时,以上动作将不会把数据写入Flash中,仅仅改变内存中的WiFi设置
  WiFi.persistent(true);
}

六、项目第2阶段运行结果

项目编译上传成功后,将先后出现两个界面。

第1个界面如下图,显示WiFi连接过程,成功后将显示STA的IP地址。

第2个界面如下图,此时仍为静态画面UI布局,各项功能还未实现网络实时获取。

七、项目源码下载

百度网盘下载地址:https://pan.baidu.com/s/1Ae-Q2NBCKoG2pZTolu5j4Q?pwd=l2w6

提取码:l2w6

参考链接

  1. ESP8266WiFi library --- ESP8266 Arduino Core 3.1.2-21-ga348833 documentation

  2. ESP8266WiFi library 部分源代码

相关推荐
远翔调光芯片^138287988726 分钟前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源
可均可可23 分钟前
C++之OpenCV入门到提高004:Mat 对象的使用
c++·opencv·mat·imread·imwrite
白子寰1 小时前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
小芒果_011 小时前
P11229 [CSP-J 2024] 小木棍
c++·算法·信息学奥赛
gkdpjj1 小时前
C++优选算法十 哈希表
c++·算法·散列表
王俊山IT1 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
-Even-1 小时前
【第六章】分支语句和逻辑运算符
c++·c++ primer plus
极客小张1 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
我是谁??2 小时前
C/C++使用AddressSanitizer检测内存错误
c语言·c++
发霉的闲鱼2 小时前
MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击
c++·mfc