第1篇:Arduino与ESP32开发板的安装方法
第2篇:ESP32 helloword第一个程序示范点亮板载LED
第3篇:vscode搭建esp32 arduino开发环境
第4篇:vscode+platformio搭建esp32 arduino开发环境
第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验
第6篇:ESP32连接无源喇叭播放音乐《涛声依旧》
第7篇:ESP32连接按钮点亮LED无源喇叭播放声音
第8篇:ESP32连接超声波HC-SR04测距点亮LED无源喇叭播放声音
第9篇:ESP32超声波HC-SR04Arduino类库编写
第10篇:ESP32外部中断功能的使用
第11篇:ESP32vscode_platformio_idf框架helloworld点亮LED
第12篇:ESP32模拟SPI驱动12864LCD_ST7920显示屏
第13篇:ESP32 idf wifi联网使用SNTP同步网络时间LCD ST7920液晶屏显示
第14篇ESP32 idf wifi联网LCD ST7920液晶屏显示
一、ESP32 WIFI介绍
Wi-Fi 库支持配置及监控 ESP32 Wi-Fi 连网功能。
支持配置:
基站模式(即 STA 模式或 Wi-Fi 客户端模式),此时 ESP32 连接到接入点 (AP)。
AP 模式(即 Soft-AP 模式或接入点模式),此时基站连接到 ESP32。
AP-STA 共存模式(ESP32 既是接入点,同时又作为基站连接到另外一个接入点)。
上述模式的各种安全模式(WPA、WPA2 及 WEP 等)。
扫描接入点(包括主动扫描及被动扫描)。
使用混杂模式监控 IEEE802.11 Wi-Fi 数据包。
二、WiFi 的启动(STA)
1. WiFi STA 模式(连接到其他设备的热点WIFI)
(1) 步骤及API简介
① 初始化nvs_flash
② 初始化esp_netif
③ 创建事件循环event_loop —— event_loop是esp32库的一种事件处理模式,中文曰“事件循环”
④ 初始化、配置WiFi并启动
⑤ 事件处理(使用第③步创建的事件循环)
(2)各个函数介绍
1.初始化nvs_flash
#include <nvs_flash.h>/*** @brief 用于初始化nvs*/
void init_nvs() {/*尝试初始化一次nvs_flash*/esp_err_t err = nvs_flash_init();if(err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND){/*第一次初始化失败, 检查错误, 处理错误, 重新初始化*/nvs_flash_erase();err = nvs_flash_init();}ESP_ERROR_CHECK(err);
}
2 .初始化event_loop
#include "esp_event.h"esp_event_loop_create_default();esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID,想要用于处理事件的函数, NULL, &wifi_handler);
esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP,想要用于处理时间的函数, NULL, &ip_handler));
代码详解:
① esp_event_loop_create_default(); 函数用于创建一个默认的事件循环(同一个esp32程序中可以有多个event_loop,这里使用默认的事件循环)
② esp_event_handler_instance_register() 函数解析见下:
函数名 esp_event_handler_instance_register()
函数原型 esp_err_t esp_event_handler_instance_register(esp_event_base_t event_base, int32_t event_id, esp_event_handler_t event_handler, void *event_handler_arg, esp_event_handler_instance_t *instance)
含义 将事件处理程序的实例注册到默认循环。
返回值 esp_err_t
参数 event_base类型为:esp_event_base_t;表示 事件基,代表事件的大类(如WiFi事件,IP事件等)
event_id类型为:int32_t;表示事件ID,即事件基下的一个具体事件(如WiFi连接丢失,IP成功获取)
event_handler类型为:esp_event_handler_t;表示一个handler函数(模板请见第⑤步)
*event_handler_arg类型为:void;表示需要传递给handler函数的参数
*instance类型为:esp_event_handler_instance_t指针;**[输出]**表示此函数注册的事件实例对象,用于生命周期管理(如删除unrigister这个事件handler)
3.初始化esp_netif
#include "esp_netif.h"esp_netif_t *pEsp_wifi_netif;esp_netif_init();/*创建wifi sta模式的默认netif, 返回一个指针*/
pEsp_wifi_netif = esp_netif_create_default_wifi_sta();/* (不是必须) 这行代码是修改ESP32的主机名, 即WiFi设备名, 连接其他WiFi时显示的名称 */
esp_netif_set_hostname(esp_wifi_netif, "test11");// 不使用汉字
上述代码第 6 行函数esp_netif_create_default_wifi_sta()
是必要的,只不过函数返回值可以在不需要的时候忽略(借助这个创建得到的esp_netif
对象来修改了主机名为test11,因此保留了这个返回值)
④ 初始化、配置WiFi并启动
#include "driver/wifi.h"
/* 第一步, WiFi初始化 */
/*这个宏 WIFI_INIT_CONFIG_DEFAULT() 可以初始化一 个wifi_init_config(wifi初始化配置)结构体为默认值
*/
wifi_init_config_t wifi_init_config = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&wifi_init_config);/* 第二步, WiFi配置 */
wifi_config_t wifi_config = {.sta = {.ssid = "WiFi_SSID", // wifi名(ssid).password = "password",// wifi密码}
};
esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
esp_wifi_set_mode(WIFI_MODE_STA); // 设置工作模式/* 第三步, 启动WiFi */
esp_wifi_start();
⑤ 事件处理(使用第③步创建的事件循环)
这里这个函数就是第 ③ 步注册的事件循环handler函数。
handler函数模板如下:
void xxx(void *arg, esp_event_base_t eventBase, int32_t eventID, void *eventData) {
/*函数参数一:arg。表示传递给handler函数的参数,在第三步register函数里声明函数参数二,eventBase,表示事件基,详见第三步函数esp_event_handler_instance_register()解析函数参数三:eventID,表示事件ID,详见第三步函数esp_event_handler_instance_register()解析函数参数四,表示传递给这个事件的数据。例如:例如事件基 IP_EVENT 下的 IP_EVENT_STA_GOT_IP 事件会把获取到的IP地址传递过来,下方示范。
*/
}
下面为WiFi事件处理的一个简单的handler函数。
处理的事件:
事件基 事件 含义
WiFi_EVENT WIFI_EVENT_STA_START WiFi启动成功
WiFi_EVENT WIFI_EVENT_STA_DISCONNECTED WiFi连接断开/连接失败
IP_EVENT IP_EVENT_STA_GOT_IP WiFi连接成功并获取到IP地址
下面给出一个示例及其代码:
当WIFI_EVENT_STA_START发生即WiFi启动成功之后,我们就连接WiFi。
当WIFI_EVENT_STA_DISCONNECT发生即WiFi断开连接/连接失败后,我们就尝试重新连接
当 IP_EVENT_STA_GOT_IP发生即WiFi连接成功并获取到IP地址之后,我们就在屏幕上打印出获取到的IP地址
printf("connected, got ip: "IPSTR"\n", IP2STR(&ip->ip_info.ip));
完整代码:
#include "driver/gpio.h"
#include <stdio.h>
#include "unistd.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include <stddef.h>
#include <time.h>#include <string.h>
#include <time.h>
#include <sys/time.h>
#include "esp_system.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_attr.h"
#include "esp_sleep.h"
#include "nvs_flash.h"
#include "esp_sntp.h"
#include "esp_wifi.h"
#include "lcd12864st7920idf.h"// 联网相关的宏
//#define EXAMPLE_ESP_WIFI_SSID "xx" // 账号
//#define EXAMPLE_ESP_WIFI_PASS "@xx68" // 密码
#define EXAMPLE_ESP_WIFI_SSID "xxx" // WIFI名字
#define EXAMPLE_ESP_WIFI_PASS "xxx" // WIFI密码#define EXAMPLE_ESP_MAXIMUM_RETRY 5 // wifi连接失败以后可以重新连接的次数
#define WIFI_CONNECTED_BIT BIT0 // wifi连接成功标志位
#define WIFI_FAIL_BIT BIT1 // wifi连接失败标志位
#define AR_SIZE(a) sizeof(a) / sizeof(a[0])unsigned char show1[] = {0xB0, 0xA2, 0xCE, 0xE4, 0xBF, 0xC6, 0xBC, 0xBC}; //阿武科技unsigned char show_we_chat1[] = "wechat:";
unsigned char show_nick1[] = "txwtech";
unsigned char show_wifi_connecting[]="wifi_connecting...";
unsigned char show_wifi_reconnect[]="wifi_reconnecting...";
unsigned char show_wifi_connected[]="wifi_connected";// 联网相关的变量
static EventGroupHandle_t s_wifi_event_group; // 事件组,用于对wifi响应结果进行标记
static int s_retry_num = 0; // 记录wifi重新连接尝试的次数static const char *TAG = "esp32idf_title_txwtech";/*** @description: 处理wifi连接和ip分配时候事件的回调函数* @return {*}* @note:*/
static void event_handler(void *arg, esp_event_base_t event_base,int32_t event_id, void *event_data)
{// 如果是wifi station开始连接事件,就尝试将station连接到APif (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START){esp_wifi_connect();}// 如果是wifi station从AP断连事件else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED){// 如果没有达到最高尝试次数,继续尝试if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY){esp_wifi_connect();s_retry_num++;ESP_LOGI(TAG, "retry to connect to the AP ^_^");}// 如果达到了最高尝试次数,就标记连接失败else{xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);}ESP_LOGI(TAG, "connect to the AP fail *_*");}else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP){ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data;ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));s_retry_num = 0;xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); // 成功获取到了ip,就标记这次wifi连接成功}
}/*** @description: 用于连接wifi的函数* @return {*}* @note: 这里wifi连接选项设置了使用nvs,会把每次配置的参数存储在nvs中。因此请查看分区表中是否对nvs分区进行了设置*/
void wifi_init_sta(void)
{// 00 创建wifi事件组s_wifi_event_group = xEventGroupCreate();/******************** 01 Wi-Fi/LwIP 初始化阶段 ********************/// 01-1 创建LWIP核心任务ESP_ERROR_CHECK(esp_netif_init());// 01-2 创建系统事件任务,并初始化应用程序事件的回调函数ESP_ERROR_CHECK(esp_event_loop_create_default());// 01-3 创建有 TCP/IP 堆栈的默认网络接口实例绑定 stationesp_netif_create_default_wifi_sta();// 01-4 创建wifi驱动程序任务,并初始化wifi驱动程序wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));// 01-5 注册,用于处理wifi连接的过程中的事件esp_event_handler_instance_t instance_any_id; // 用于处理wifi连接时候的事件的句柄esp_event_handler_instance_t instance_got_ip; // 用于处理ip分配时候产生的事件的句柄// 该句柄对wifi连接所有事件都产生响应,连接到event_handler回调函数ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,ESP_EVENT_ANY_ID,&event_handler,NULL,&instance_any_id));// 该句柄仅仅处理IP_EVENT事件组中的从AP中获取ip地址事件,连接到event_handler回调函数ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,IP_EVENT_STA_GOT_IP,&event_handler,NULL,&instance_got_ip));/******************** 02 WIFI配置阶段 ********************/wifi_config_t wifi_config = {.sta = {.ssid = EXAMPLE_ESP_WIFI_SSID,.password = EXAMPLE_ESP_WIFI_PASS,/* Setting a password implies station will connect to all security modes including WEP/WPA.* However these modes are deprecated and not advisable to be used. Incase your Access point* doesn't support WPA2, these mode can be enabled by commenting below line */.threshold.authmode = WIFI_AUTH_WPA2_PSK, // 设置快速扫描模式下能接受的最弱的验证模式.sae_pwe_h2e = WPA3_SAE_PWE_BOTH, // 设置SAE和PWE(wifi协议)的配置},};// 02-2 配置station工作模式ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));// 02-3 配置ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));/******************** 03 wifi启动阶段 ********************/// 03-1 启动wifi驱动程序ESP_ERROR_CHECK(esp_wifi_start()); // 会触发回调函数ESP_LOGI(TAG, "wifi_init_sta finished.");/* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum* number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) *//******************** 输出wifi连接结果 ********************/EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,pdFALSE,pdFALSE,portMAX_DELAY);/* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually* happened. */if (bits & WIFI_CONNECTED_BIT){ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);}else if (bits & WIFI_FAIL_BIT){ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);}else{ESP_LOGE(TAG, "UNEXPECTED EVENT");}/* The event will not be processed after unregister */// 05 事件注销ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id));vEventGroupDelete(s_wifi_event_group);
}void app_main()
{Initialise();DisplayString(0, 0, show_wifi_connecting, AR_SIZE(show_wifi_connecting)); int mLevel = 0;int temp = 0;esp_err_t ret = nvs_flash_init();if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND){ESP_ERROR_CHECK(nvs_flash_erase());ret = nvs_flash_init();}ESP_ERROR_CHECK(ret);//CLEAR();// 连wifiESP_LOGI(TAG, "ESP_WIFI_MODE_STA");wifi_init_sta();CLEAR();DisplayString(1, 0, show_wifi_connected, AR_SIZE(show_wifi_connected)); while (false){time_t timer; // time_t就是long int 类型// DisplayString(0, 1, show1, AR_SIZE(show1)); //第一行第三格开始// DisplayString(3, 2, show_wifi_connected, AR_SIZE(show_wifi_connected)); //DisplayString(1, 0, show_wifi_connected, AR_SIZE(show_wifi_connected)); usleep(1000 * 1000 * 1); //微秒,1000微秒=1毫秒,1000毫秒=1秒 }
}
LCD液晶屏初始化:
void Initialise()
{IOT_GPIO_VALUE00 = 0;IOT_GPIO_VALUE11 = 1;gpio_set_direction(lcd_rs, GPIO_MODE_OUTPUT); //gpio_set_direction(lcd_sclk, GPIO_MODE_OUTPUT);gpio_set_direction(lcd_sid, GPIO_MODE_OUTPUT); //// digitalWrite(latchPin, LOW);gpio_set_level(lcd_rs, IOT_GPIO_VALUE00);// delayns();delay_ms(10);WriteCommand(0x30); //功能设定控制字WriteCommand(0x0c); //显示开关控制字WriteCommand(0x01); //清除屏幕控制字WriteCommand(0x06); //进入设定点控制字
}
连接方法参考:
第12篇:ESP32模拟SPI驱动12864LCD_ST7920显示屏
工程代码:
待更新。。。