Esp8266物联网(一)(温湿度)
1.0.5版本安信可ide:AiThinkerIDE_V0.5_Setup.exe
导入一个文件:对着project explore 空白处点右键:import→c/c++→ Existing Code as Makefile Project→next→ Cygwin GCC→ browse→选择文件夹→finish
编译:save → clean project→build project
2.flash_download_tools_v3.6.3
3,安信可调试助手AiThinker Serial Tool V1.2.3.exe
4.tcp网络助手
1.文件烧录
需要烧录四个文件
D:\esp8266\doc\10_DHT11\bin
bin下的文件名 | 解释 |
blank.bin | 系统参数 |
eagle.flash.bin | 系统程序 |
eagle.irom0text.bin | 用户程序 |
esp_init_data_default_v08.bin | 射频参数 |
1.ESPFlashDownloadTool_v3.6.3.exe
下载地址
表 4-2. Non-FOTA 的下载地址(单位:KB)
BIN |
各个 Flash 容量对应的下载地址 |
|||||
512 |
1024 |
2048 |
4096 |
8192 |
16*1024 |
|
blank.bin |
0x7B000 |
0xFB000 |
0x1FB000 |
0x3FB000 |
0x7FB000 |
0xFFB000 |
esp_init_data_default.bin |
0x7C000 |
0xFC000 |
0x1FC000 |
0x3FC000 |
0x7FC000 |
0xFFC000 |
blank.bin |
0x7E000 |
0xFE000 |
0x1FE000 |
0x3FE000 |
0x7FE000 |
0xFFE000 |
eagle.flash.bin |
0x00000 |
|||||
eagle.irom0text.bin |
0x10000 |
⼀般烧录,请使⽤⼯具 ESP Flash Download Tool,建议按照烧录地址从低到⾼按顺序排列烧录。
如需烧录 8 MB 或者 16 MB 的⼤容量 Flash,请使⽤⼯具 esptool。
选择spidownlaod
Download 适⽤于 SPI Flash 的下载。 |
HSPIDownload 适⽤于 HSPI Flash 的下载。 |
RFConfig 射频初始化设置。 |
MutiDownload 适⽤于多个⺟板的下载。 |
注意:
用户程序eagle.irom0text.bin不一定是0x10000,需要看D:\esp8266\doc\10_DHT11\ld\eagle.app.v6.ld文件的
MEMORY
{
dport0_0_seg : org = 0x3FF00000, len = 0x10
dram0_0_seg : org = 0x3FFE8000, len = 0x14000
iram1_0_seg : org = 0x40100000, len = 0x8000
irom0_0_seg : org = 0x40210000, len = 0x5C000
}
表 6-1. SPIDownload 配置说明
配置项 |
配置说明 |
SPI FLASH CONFIG |
|
CrystalFreq |
根据实际选⽤的晶振型号选择晶振频率。 |
CombineBin |
将勾选的 BIN ⽂件合成⼀个 target.bin,下载地址为 0x0000。 |
Default |
将 SPI Flash 的配置恢复到默认值。 |
SPI SPEED |
选择 SPI Flash 的读写速度,最⼤值为 80 MHz。 |
SPI MODE |
根据实际使⽤的 Flash 选择对应的模式。如果 Flash 采⽤ Dual SPI,选择 DIO 或 DOUT;如果 Flash 采⽤ Quad SPI,选择 QIO 或 QOUT。 ⚠ 注意: 若⽤户使⽤ ISSI Flash,请参考“附录-配置 ISSI & MXIC Flash QIO 模式”。 |
FLASH SIZE |
根据实际编译的配置对应选择的 Flash ⼤⼩。 说明: 16Mbit-C1 是 1024+1024 的情况;32Mbit-C1 是 1024+1024 的情况。 |
SpiAutoSet |
不建议勾选 SpiAutoSet,推荐⽤户根据实际情况对 Flash 进⾏⼿动配置。 ⽤户如果了勾选 SpiAutoSet,下载⼯具将会按照默认的 Flash map 下载,16 Mbit 和 32 Mbit 的 Flash map 会被设置为 512 Kbyte + 512 Kbyte。 |
DoNotChgBin |
• ⽤户可勾选 DoNotChgBin,Flash 的运⾏频率,⽅式和布局会以⽤户编译时的 配置选项为准。 • 如果不勾选该选项,Flash 的运⾏频率,⽅式和布局会以下载⼯具最终的配置 为准。 |
Download Panel |
|
START |
点击 START 开始下载。当下载结束后,左边绿⾊状态显示 完成。 |
STOP |
点击 STOP 停⽌下载。 |
MAC Address |
下载成功后,系统会显示 ESP8266 STA 和ESP8266 AP 的 MAC 地址。 |
COM PORT |
选择 ESP8266 实际连⼊的 COM 端⼝。 |
BAUDRATE |
BAUDRATE 选择下载的波特率,默认为 115200 |
编译上传后,
打开AiThinker Serial Tool V1.2.3.exe,
【system_get_sdk_version】 //返回SDK版本号
【 Ivoid os_ printf(const char*s)】 //格式化输出,打印字符串工
注意:
默认从UART0打印 //一般常用的就是UART_0
·波特率默认值==74880(晶振26MHz:74880) //ESP-12F模组的晶振==26MHz
·数据格式:数据位=8、停止位=1、无校验位、无数据流控制
选择打开串口→点esp8266的rest复位
可以把自定义端口设置9600,默认的74880
系统接口位于: /ESP8266_NONOS_SDK/include/user_interface. h.
os_XX系列接口位于: /ESP8266NONOS_sdk/include/osapi.h
Hello World
---------------------------------
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
delay_ms(1000); // 延时1秒
"D:\esp8266\doc\4_delay\app\user\user_main.c"
/*
* ESPRESSIF MIT License
*
* Copyright (c) 2016 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
*
* Permission is hereby granted for use on ESPRESSIF SYSTEMS ESP8266 only, in which case,
* it is free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished
* to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
//////////////////////////////////////////////////////
// //
// 工程: 《delay》 //
// //
// 平台: 【技新电子】物联网开发板 ESP8266 V1.0 //
// //
// 功能: 串口每秒发送一句"Hello"问候 //
// //
// 版本: V1.0 //
// //
//////////////////////////////////////////////////////
// 头文件引用
//==============================================================================
#include "user_config.h" // 用户配置
#include "driver/uart.h" // 串口
//#include "at_custom.h"
#include "c_types.h" // 变量类型
#include "eagle_soc.h" // GPIO函数、宏定义
//#include "espconn.h"
//#include "espnow.h"
//#include "ets_sys.h" // 回调函数
//#include "gpio.h"
//#include "ip_addr.h"
//#include "mem.h"
#include "os_type.h" // os_XXX
#include "osapi.h" // os_XXX、软件定时器
//#include "ping.h"
//#include "pwm.h"
//#include "queue.h"
//#include "smartconfig.h"
//#include "sntp.h"
//#include "spi_flash.h"
//#include "upgrade.h"
#include "user_interface.h" // 系统接口、system_param_xxx接口、WIFI等
//==============================================================================
// 宏定义
//==============================================================================
#define ProjectName "delay" //工程名宏定义
//==============================================================================
// 毫秒延时函数(不要延时太久)
//===========================================
void ICACHE_FLASH_ATTR delay_ms(u32 C_time)
{ for(;C_time>0;C_time--)
{ os_delay_us(1000);}
}
//===========================================
// user_init:entry of user application, init user function here
//==============================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
while(1)
{
system_soft_wdt_feed(); // 喂狗
os_printf("\r\nHello\r\n"); // Hello
delay_ms(1000); // 延时1秒
}
}
//==============================================================================
/******************************************************************************
* FunctionName : user_rf_cal_sector_set
* Description : SDK just reversed 4 sectors, used for rf init data and paramters.
* We add this function to force users to set rf cal sector, since
* we don't know which sector is free in user's application.
* sector map for last several sectors : ABCCC
* A : rf cal
* B : rf init data
* C : sdk parameters
* Parameters : none
* Returns : rf cal sector
*******************************************************************************/
uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void)
{
enum flash_size_map size_map = system_get_flash_size_map();
uint32 rf_cal_sec = 0;
switch (size_map) {
case FLASH_SIZE_4M_MAP_256_256:
rf_cal_sec = 128 - 5;
break;
case FLASH_SIZE_8M_MAP_512_512:
rf_cal_sec = 256 - 5;
break;
case FLASH_SIZE_16M_MAP_512_512:
case FLASH_SIZE_16M_MAP_1024_1024:
rf_cal_sec = 512 - 5;
break;
case FLASH_SIZE_32M_MAP_512_512:
case FLASH_SIZE_32M_MAP_1024_1024:
rf_cal_sec = 1024 - 5;
break;
case FLASH_SIZE_64M_MAP_1024_1024:
rf_cal_sec = 2048 - 5;
break;
case FLASH_SIZE_128M_MAP_1024_1024:
rf_cal_sec = 4096 - 5;
break;
default:
rf_cal_sec = 0;
break;
}
return rf_cal_sec;
}
void ICACHE_FLASH_ATTR user_rf_pre_init(void){}
"D:\esp8266\doc\5_GPIO_Output\app\user\user_main.c"
void ICACHE_FLASH_ATTR user_init(void)
{
u8 F_LED = 0 ; // LED状态标志位
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
// 管脚功能选择(注意:参数1【PIN_NAME】管脚名、参数2【FUNC】管脚功能)
//--------------------------------------------------------------------------
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO4设为IO口
// 将相应管脚设为输出模式,并输出对应电平(参数1【gpio_no】、参数2:输出电平)
//--------------------------------------------------------------------------
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // IO4 = 1(高电平)
// 注意:【PIN_NAME】、【FUNC】、【gpio_no】不要混淆
//…………………………………………………………………………………………………
//·【PIN_NAME】 管脚名称 "PERIPHS_IO_MUX_" + "管脚名"
//·【FUNC】 管脚功能 功能序号 - 1
//·【gpio_no】 IO端口序号 GPIO_ID_PIN(IO端口序号)
//…………………………………………………………………………………………………
while(1)
{
system_soft_wdt_feed(); // 喂狗,防止复位
F_LED = !F_LED; // LED状态值翻转
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),F_LED); // 设置LED(IO4)输出值
delay_ms(500); // 延时500Ms
}
}
结果:板子灯隔几秒亮一次
"D:\esp8266\doc\6_GPIO_Input\app\user\user_main.c"
void ICACHE_FLASH_ATTR user_init(void)
{
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
// 初始化LED(注意【PIN_NAME】、【FUNC】、【gpio_no】不要混淆)
//-------------------------------------------------------------------------
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO_4设为IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // GPIO_4 = 1
// 初始化按键(BOOT == GPIO0)
//----------------------------------------------------------------------------------
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0); // GPIO_0设为IO口
GPIO_DIS_OUTPUT(GPIO_ID_PIN(0)); // GPIO_0失能输出(默认)
PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO0_U); // GPIO_0失能内部上拉(默认)
// PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U); // GPIO_0使能内部上拉
while(1)
{
system_soft_wdt_feed(); // 喂狗,防止复位
if( GPIO_INPUT_GET(GPIO_ID_PIN(0)) == 0 ) // 读取GPIO_0电平
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0); // LED亮
else
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // LED灭
}
}
结果:按boot亮,松开不亮
"D:\esp8266\doc\7_GPIO_EXTI\app\user\user_main.c"
// GPIO中断函数【注意:中断函数前不要有"ICACHE_FLASH_ATTR"宏】
//=============================================================================
void GPIO_INTERRUPT(void)
{
u32 S_GPIO_INT; // 所有IO口的中断状态
u32 F_GPIO_0_INT; // GPIO_0的中断状态
// 读取GPIO中断状态
//---------------------------------------------------
S_GPIO_INT = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
// 清除中断状态位(如果不清除状态位,则会持续进入中断)
//----------------------------------------------------
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, S_GPIO_INT);
F_GPIO_0_INT = S_GPIO_INT & (0x01<<0); // 获取GPIO_0中断状态
// 判断是否是KEY中断(未做消抖)
//------------------------------------------------------------
if(F_GPIO_0_INT) // GPIO_0的下降沿中断
{
F_LED = !F_LED;
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),F_LED); // LED状态翻转
}
}
//=============================================================================
// user_init:entry of user application, init user function here
//==========================================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
// 初始化LED(注意【PIN_NAME】、【FUNC】、【gpio_no】不要混淆)
//-------------------------------------------------------------------------
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO_4设为IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // GPIO_4 = 1
// 初始化按键(BOOT == GPIO0)
//-----------------------------------------------------------------------------
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0); // GPIO_0作为GPIO口
GPIO_DIS_OUTPUT(GPIO_ID_PIN(0)); // GPIO_0失能输出(默认)
// PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO0_U); // GPIO_0失能上拉(默认)
// PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U); // GPIO_0使能上拉
// GPIO_0中断设置
//----------------------------------------------------------------------------------
ETS_GPIO_INTR_DISABLE(); // 关闭GPIO中断功能
ETS_GPIO_INTR_ATTACH((ets_isr_t)GPIO_INTERRUPT,NULL); // 注册中断回调函数
gpio_pin_intr_state_set(GPIO_ID_PIN(0),GPIO_PIN_INTR_NEGEDGE); // GPIO_0下降沿中断
ETS_GPIO_INTR_ENABLE(); // 打开GPIO中断功能
//…………………………………………………………
// GPIO_PIN_INTR_DISABLE = 0, // 不触发中断
// GPIO_PIN_INTR_POSEDGE = 1, // 上升沿中断
// GPIO_PIN_INTR_NEGEDGE = 2, // 下降沿中断
// GPIO_PIN_INTR_ANYEDGE = 3, // 双边沿中断
// GPIO_PIN_INTR_LOLEVEL = 4, // 低电平中断
// GPIO_PIN_INTR_HILEVEL = 5 // 高电平中断
//…………………………………………………………
}
结果:按boot亮,再按一次灭
"D:\esp8266\doc\8_OS_Timer\app\user\user_main.c"
// 注:OS_Timer_1必须定义为全局变量,因为ESP8266的内核还要使用
//--------------------------------------------------------------------
os_timer_t OS_Timer_1; // ①:定义软件定时器(os_timer_t型结构体)
// 软件定时的回调函数
//======================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void) // ②:定义回调函数
{
F_LED = !F_LED;
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),F_LED); // LED状态翻转
os_printf("\r\n----OS_Timer_1_cb----\r\n"); // 进入回调函数标志
}
//======================================================================
// 软件定时器初始化(ms毫秒)
//================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{
// 关闭定时器
// 参数一:要关闭的定时器
//--------------------------------------------------------
os_timer_disarm(&OS_Timer_1); // ③:关闭软件定时器
// 设置定时器
// 参数一:要设置的定时器;参数二:回调函数(需类型转换);参数三:回调函数的参数
//【注:os_timer_setfn必须在软件定时器未使能的情况下调用】
//------------------------------------------------------------------------------------------
os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL); // ④:设置回调函数
// 使能(启动)ms定时器
// 参数一:要使能的定时器;参数二:定时时间(单位:ms);参数三:1=重复/0=只一次
//------------------------------------------------------------------------------------------
os_timer_arm(&OS_Timer_1, time_ms, time_repetitive); // ⑤:设置定时器参数并使能定时器
//-------------------------------------------------------------------
// 【如未调用system_timer_reinit,可支持范围:[5ms ~ 6,870,947ms]】
// 【如果调用system_timer_reinit,可支持范围:[100ms ~ 428,496 ms]】
//-------------------------------------------------------------------
}
//================================================================================================
// LED初始化
//=============================================================================
void ICACHE_FLASH_ATTR LED_Init_JX(void)
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO4设为IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // IO4 = 1
}
//=============================================================================
// user_init:entry of user application, init user function here
//=================================================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
LED_Init_JX(); // LED初始化
// 初始化软件定时器
//--------------------------------------------
OS_Timer_1_Init_JX(500,1); // 500ms(重复)
// while(1) system_soft_wdt_feed(); // 死循环,测试用
os_printf("\r\n-------------------- user_init OVER --------------------\r\n");
}
打开安可信串口监视器
串口COM6
波特率115200
数据位8
校验位None
停止位none
流控None
----OS_Timer_1_cb----
----OS_Timer_1_cb----
----OS_Timer_1_cb----
----OS_Timer_1_cb----
----OS_Timer_1_cb----
----OS_Timer_1_cb----
以下软件定时器接口位于esp8266_ NONOS_SDKincludeosapi.h。请注意,以下接口使用的定时器由软件实现,定时器的函数在任务中被执行。因为任务可能被中断,或者被其他高优先级的任务延迟,因此以下 os_timer系列的接口并不能保证定时器精确执行。如果需要精确的定时,例如,周期性操作某GPI,请使用硬中断定时器,具体可参考 hw_timer.c,硬件定时器的执行函数在中断里被执行。
1.首先把hw_timer.c app\driver文件夹下
"D:\esp8266\doc\9_HW_Timer\app\driver\hw_timer.c"
2."D:\esp8266\doc\9_HW_Timer\app\user\user_main.c"
// 硬件定时器中断回调函数【注意:中断函数前不要有"ICACHE_FLASH_ATTR"宏】
//=================================================================================================
void HW_Timer_INT(void) // ②:硬件定时器中断回调函数
{
F_LED = !F_LED;
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),F_LED); // LED状态翻转
os_printf("\r\n--- HW_Timer_INT ---\r\n"); // 进入硬件定时器中断回调函数标志
}
//=================================================================================================
// LED初始化
//=============================================================================
void ICACHE_FLASH_ATTR LED_Init_JX(void)
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO4设为IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // IO4 = 1
}
//=============================================================================
// user_init:entry of user application, init user function here
//=================================================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
LED_Init_JX(); // LED初始化
// 硬件定时器初始化【FRC1_SOURCE==0、NMI_SOURCE=1】
//--------------------------------------------------------------------------------------------
hw_timer_init(0, 1); // ①:初始化硬件定时器【参数1:中断源】【参数2:是否重复】
hw_timer_set_func(HW_Timer_INT); // ③:注册硬件定时器中断回调函数
hw_timer_arm(500000); // ④:设置定时器参数(单位us,参数必须<=1,677,721)
}
//=================================================================================================
串口调试助手
Project: HW_Timer
SDK version: 2.2.0(f28eaf2)
=================================================
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100--- HW_Timer_INT ---
--- HW_Timer_INT ---
--- HW_Timer_INT ---
--- HW_Timer_INT ---
--- HW_Timer_INT ---
--- HW_Timer_INT ---
注意:
- 如果使用NM中断源,且为自动填装的定时器,调用 hw_timer_arm时参数val必须大100
- 如果使用NM中断源,那么该定时器将为最高优先级,可打断其他ISR
- 如果使用FR1中断源,那么该定时器无法打断其他ISR
- hw_timer.c的接口不能跟PWM驱动接口函数同时使用,因为二者共用了同一个硬件定时器。
- 硬件中断定时器的回调函数定义,请勿添加 ICACHE_FLASH_ATTR宏
"D:\esp8266\doc\10_DHT11\app\user\user_main.c"
// 定时的回调函数
//==========================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
if(DHT11_Read_Data_Complete() == 0) // 读取DHT11温湿度值
{
//-------------------------------------------------
// DHT11_Data_Array[0] == 湿度_整数_部分
// DHT11_Data_Array[1] == 湿度_小数_部分
// DHT11_Data_Array[2] == 温度_整数_部分
// DHT11_Data_Array[3] == 温度_小数_部分
// DHT11_Data_Array[4] == 校验字节
// DHT11_Data_Array[5] == 【1:温度>=0】【0:温度<0】
//-------------------------------------------------
// 温度超过30℃,LED亮
//----------------------------------------------------
if(DHT11_Data_Array[5]==1 && DHT11_Data_Array[2]>=30)
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0); // LED亮
else
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // LED灭
// 串口输出温湿度
//---------------------------------------------------------------------------------
if(DHT11_Data_Array[5] == 1) // 温度 >= 0℃
{
os_printf("\r\n湿度 == %d.%d %RH\r\n",DHT11_Data_Array[0],DHT11_Data_Array[1]);
os_printf("\r\n温度 == %d.%d ℃\r\n", DHT11_Data_Array[2],DHT11_Data_Array[3]);
}
else // if(DHT11_Data_Array[5] == 0) // 温度 < 0℃
{
os_printf("\r\n湿度 == %d.%d %RH\r\n",DHT11_Data_Array[0],DHT11_Data_Array[1]);
os_printf("\r\n温度 == -%d.%d ℃\r\n",DHT11_Data_Array[2],DHT11_Data_Array[3]);
}
// OLED显示温湿度
//---------------------------------------------------------------------------------
DHT11_NUM_Char(); // DHT11数据值转成字符串
OLED_ShowString(0,2,DHT11_Data_Char[0]); // DHT11_Data_Char[0] == 【湿度字符串】
OLED_ShowString(0,6,DHT11_Data_Char[1]); // DHT11_Data_Char[1] == 【温度字符串】
}
}
//==========================================================================================
// 软件定时器初始化(ms毫秒)
//==========================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{
os_timer_disarm(&OS_Timer_1); // 关闭定时器
os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL); // 设置定时器
os_timer_arm(&OS_Timer_1, time_ms, time_repetitive); // 使能定时器
}
"D:\esp8266\doc\10_DHT11\app\driver\dht11.c"
#include "driver/dht11.h" // DHT11头文件
// 全局变量
//==================================================================================
// DHT11_Data_Array[0] == 湿度_整数_部分
// DHT11_Data_Array[1] == 湿度_小数_部分
// DHT11_Data_Array[2] == 温度_整数_部分
// DHT11_Data_Array[3] == 温度_小数_部分
// DHT11_Data_Array[4] == 校验字节
// DHT11_Data_Array[5] == 【1:温度>=0℃】【0:温度<0℃】
//-----------------------------------------------------
u8 DHT11_Data_Array[6] = {0}; // DHT11数据数组
u8 DHT11_Data_Char[2][10]={0}; // DHT11数据字符串【行:湿/温度】【列:数据字符串】
// DHT11_Data_Char[0] == 【湿度字符串】
// DHT11_Data_Char[1] == 【温度字符串】
//==================================================================================
// 毫秒延时函数
//=================================================
void ICACHE_FLASH_ATTR Dht11_delay_ms(u32 C_time)
{ for(;C_time>0;C_time--)
os_delay_us(1000);
}
//=================================================
// GPIO_5(DHT11信号线)设为输出模式,并输出参数对应的电平
//===========================================================================
void ICACHE_FLASH_ATTR DHT11_Signal_Output(u8 Value_Vol)
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5); // GPIO5设为IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(5),Value_Vol); // IO5设为输出=X
}
//===========================================================================
// GPIO_5(DHT11信号线)设为输入模式
//===========================================================================
void ICACHE_FLASH_ATTR DHT11_Signal_Input(void)
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5); // GPIO5设为IO口
GPIO_DIS_OUTPUT(GPIO_ID_PIN(5)); // GPIO5失能输出(输入)
}
//===========================================================================
// DHT11:输出起始信号->接收响应信号
//-----------------------------------------------------
// 返回值: 0 成功
// 1 失败:规定时间内未接收到响应信号
// 2 失败:响应信号的低电平时长超时
//===========================================================================
u8 ICACHE_FLASH_ATTR DHT11_Start_Signal_JX(void)
{
u8 C_delay_time = 0; // 延时计时
// IO5抬高
//--------------------------------------------------------
DHT11_Signal_Output(1); // DHT11信号线(IO5) == 输出高
Dht11_delay_ms(1);
// IO5拉低(25ms):起始信号
//---------------------------------------------
GPIO_OUTPUT_SET(GPIO_ID_PIN(5),0); // IO5 = 0
Dht11_delay_ms(25);
// IO5抬高【注:起始信号结束后的约13us,DHT11开始输出信号】
//---------------------------------------------------------
GPIO_OUTPUT_SET(GPIO_ID_PIN(5),1); // IO5 = 1
os_delay_us(5); // 延时5us
// 接收响应信号
//……………………………………………………………………………………
// IO5设为输入:接收DHT11数据
//-------------------------------------------------
DHT11_Signal_Input(); // DHT11信号线(IO5) = 输入
// 等待响应信号的低电平【最迟等50us】
//-------------------------------------------------------------
while( GPIO_INPUT_GET(GPIO_ID_PIN(5))==1 && C_delay_time<50 )
{
os_delay_us(1); // 1us计时
C_delay_time++;
}
// 响应信号超时未收到
//--------------------------------------------------
if(C_delay_time >= 50)
return 1; // 失败:规定时间内未接收到响应信号
C_delay_time = 0 ; // 低电平计时开始
// 响应信息的低电平时长计时【最多170us】
//-------------------------------------------------------------
while( GPIO_INPUT_GET(GPIO_ID_PIN(5))==0 && C_delay_time<170 )
{
os_delay_us(1);
C_delay_time++; // 低电平时长
}
// 响应信号的低电平时长超时
//------------------------------------------------
if(C_delay_time >= 170)
return 2; // 失败:响应信号的低电平时长超时
// 响应信号的低电平成功接收
//--------------------------
else
return 0; // 成功
}
//===========================================================================
// 读取DHT11一位数据
//--------------------------------
// 返回值: 0 数据=="0"
// 1 数据=="1"
//======================================================================
u8 ICACHE_FLASH_ATTR DHT11_Read_Bit(void)
{
u8 C_delay_time = 0; // 延时计时
// 等待响应信息的低电平【最迟等150us】
//-------------------------------------------------------------
while( GPIO_INPUT_GET(GPIO_ID_PIN(5))==1 && C_delay_time<150 )
{
os_delay_us(1); // 1us计时
C_delay_time++;
}
C_delay_time = 0 ; // 低电平计时开始
// 数据位的低电平时长计时【最多200us】
//-------------------------------------------------------------
while( GPIO_INPUT_GET(GPIO_ID_PIN(5))==0 && C_delay_time<120 )
{
os_delay_us(1);
C_delay_time++; // 低电平时长
}
// 数据位的低电平结束后,是数据位的高电平
// 数据"0"的高电平时长 == [23~27us]
// 数据"1"的高电平时长 == [68~74us]
//------------------------------------------------
os_delay_us(45); // 跳过数据"0"的高电平部分
// 延时45us后,检测信号线电平
// 如果此时信号线电平==1 => 数据=="1"
// 如果此时信号线电平==0 => 数据=="0"
//-------------------------------------
return GPIO_INPUT_GET(GPIO_ID_PIN(5));
}
//======================================================================
// 读取DHT11一个字节
//======================================================================
u8 ICACHE_FLASH_ATTR DHT11_Read_Byte(void)
{
u8 C_Bit = 0; // 位计数
u8 T_DHT11_Byte_Data = 0; // DHT11字节数据
for(; C_Bit<8; C_Bit++) // 读取DHT11一个字节
{
T_DHT11_Byte_Data <<= 1;
T_DHT11_Byte_Data |= DHT11_Read_Bit(); // 一位一位的读取
}
return T_DHT11_Byte_Data; // 返回读取字节
}
//======================================================================
// 完整的读取DHT11数据
//-----------------------------------------------
// 返回值: 0 DHT11数据读取成功
// 1 结束信号的低电平时长超时
// 2 启动DHT11传输_失败
// 3 校验错误
//==============================================================================
u8 ICACHE_FLASH_ATTR DHT11_Read_Data_Complete(void)
{
u8 C_delay_time = 0; // 延时计时
// 启动DHT11传输_成功
//------------------------------------------------------------------------
if(DHT11_Start_Signal_JX() == 0) // DHT11:输出起始信号->接收响应信号
{
DHT11_Data_Array[0] = DHT11_Read_Byte(); // 湿度_整数_部分
DHT11_Data_Array[1] = DHT11_Read_Byte(); // 湿度_小数_部分
DHT11_Data_Array[2] = DHT11_Read_Byte(); // 温度_整数_部分
DHT11_Data_Array[3] = DHT11_Read_Byte(); // 温度_小数_部分
DHT11_Data_Array[4] = DHT11_Read_Byte(); // 校验字节
// 如果此时是最后一位数据的高电平,则等待它结束
//-----------------------------------------------------------
while(GPIO_INPUT_GET(GPIO_ID_PIN(5))==1 && C_delay_time<100)
{
os_delay_us(1); // 1us计时
C_delay_time++;
}
C_delay_time = 0 ; // 低电平计时开始
// 结束信号的低电平时长计时
//-----------------------------------------------------------
while(GPIO_INPUT_GET(GPIO_ID_PIN(5))==0 && C_delay_time<100)
{
os_delay_us(1); // 1us计时
C_delay_time++;
}
//-----------------------------------------------------------
if(C_delay_time >= 100)
return 1; // 返回1,表示:结束信号的低电平时长超时
// 数据校验
//-----------------------------------------------
if( DHT11_Data_Array[4] ==
DHT11_Data_Array[0] + DHT11_Data_Array[1] +
DHT11_Data_Array[2] + DHT11_Data_Array[3] )
{
// 读取DHT11数据结束,ESP8266接管DHT11信号线
//-----------------------------------------------------------
//os_delay_us(10);
//DHT11_Signal_Output(1); // DHT11信号线输出高(ESP8266驱动)
// 判断温度是否为 0℃以上
//----------------------------------------------
if((DHT11_Data_Array[3]&0x80) == 0)
{
DHT11_Data_Array[5] = 1; // >=0℃
}
else
{
DHT11_Data_Array[5] = 0; // <0℃
DHT11_Data_Array[3] &= 0x7F; // 更正温度小数部分
}
return 0; // 返回0,表示:温湿度读取成功
}
else return 3; // 返回3,表示:校验错误
}
//-----------------------------------------------------
else return 2; // 返回2,表示:启动DHT11传输,失败
}
//==============================================================================
// DHT11数据值转成字符串
//======================================================================
void ICACHE_FLASH_ATTR DHT11_NUM_Char(void)
{
u8 C_char = 0; // 字符计数
// 湿度数据字符串
//…………………………………………………………………………………………
if(DHT11_Data_Array[0]/100) // 湿度整数的百位
DHT11_Data_Char[0][C_char++] = DHT11_Data_Array[0]/100 + 48;
if((DHT11_Data_Array[0]%100)/10) // 湿度整数的十位
DHT11_Data_Char[0][C_char++] = (DHT11_Data_Array[0]%100)/10 + 48;
// 湿度整数的个位
//---------------------------------------------------------
DHT11_Data_Char[0][C_char++] = DHT11_Data_Array[0]%10 + 48;
DHT11_Data_Char[0][C_char++] = '.'; // 小数点
// 湿度整数的小数
//---------------------------------------------------------
DHT11_Data_Char[0][C_char++] = DHT11_Data_Array[1]%10 + 48;
DHT11_Data_Char[0][C_char++] = ' '; // ' '
DHT11_Data_Char[0][C_char++] = '%'; // '%'
DHT11_Data_Char[0][C_char++] = 'R'; // 'R'
DHT11_Data_Char[0][C_char++] = 'H'; // 'H'
DHT11_Data_Char[0][C_char] = 0 ; // 添0
//…………………………………………………………………………………………
C_char = 0; // 重置
// 温度数据字符串
//…………………………………………………………………………………………
if(DHT11_Data_Array[5]==0) // 温度 < 0℃
DHT11_Data_Char[1][C_char++] = '-';
if(DHT11_Data_Array[2]/100) // 湿度整数的百位
DHT11_Data_Char[1][C_char++] = DHT11_Data_Array[2]/100 + 48;
if((DHT11_Data_Array[2]%100)/10) // 湿度整数的十位
DHT11_Data_Char[1][C_char++] = (DHT11_Data_Array[2]%100)/10 + 48;
// 湿度整数的个位
//---------------------------------------------------------
DHT11_Data_Char[1][C_char++] = DHT11_Data_Array[2]%10 + 48;
DHT11_Data_Char[1][C_char++] = '.'; // 小数点
// 湿度整数的小数
//---------------------------------------------------------
DHT11_Data_Char[1][C_char++] = DHT11_Data_Array[3]%10 + 48;
DHT11_Data_Char[1][C_char++] = ' '; // ' '
DHT11_Data_Char[1][C_char++] = 'C'; // 'C'
DHT11_Data_Char[1][C_char] = 0 ; // 添0
//…………………………………………………………………………………………
}
//======================================================================
串口监视器
湿度 == 63.0 %R H
温度 == 11.4 ℃
// 任务执行函数(形参:类型必须为【os_event_t *】) // 第③步:创建任务函数
//======================================================================================
void Func_Task_1(os_event_t * Task_message) // Task_message = Pointer_Task_1
{
// Task_message->sig=消息类型、Task_message->par=消息参数 // 第⑥步:编写任务函数(根据消息类型/消息参数实现相应功能)
//--------------------------------------------------------------------------------
os_printf("消息类型=%d,消息参数=%c\r\n",Task_message->sig, Task_message->par);
}
//======================================================================================
// user_init:entry of user application, init user function here
//==============================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
u8 C_Task = 0 ; // 调用任务计数
u8 Message_Type = 1; // 消息类型
u8 Message_Para = 'A'; // 消息参数
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
// 给任务1分配空间(任务1空间 = 1个队列空间 * 队列数) // 第②步:为任务分配内存
//-------------------------------------------------------------------------------
Pointer_Task_1=(os_event_t*)os_malloc((sizeof(os_event_t))*MESSAGE_QUEUE_LEN);
// 创建任务(参数1=任务执行函数 / 参数2=任务等级 / 参数3=任务空间指针 / 参数4=消息队列深度) // 第④步:创建任务
//-----------------------------------------------------------------------------------------
system_os_task(Func_Task_1, USER_TASK_PRIO_0, Pointer_Task_1, MESSAGE_QUEUE_LEN);
// 调用4次任务
//--------------------------------
for(C_Task=1; C_Task<=4; C_Task++)
{
system_soft_wdt_feed(); // 喂狗,防止复位
delay_ms(1000); // 延时1秒
os_printf("\r\n安排任务:Task == %d\r\n",C_Task);
// 调用任务(参数1=任务等级 / 参数2=消息类型 / 参数3=消息参数)
// 注意:参数3必须为无符号整数,否则需要强制类型转换
//---------------------------------------------------------------
system_os_post(USER_TASK_PRIO_0, Message_Type++, Message_Para++); // 第⑤步:给系统安排任务
}
os_printf("\r\n------------------ user_init OVER ----------------\r\n\r\n");
}
//==============================================================================
串口调试
=================================================
Project: Task
SDK version: 2.2.0(f28eaf2)
=================================================安排任务:Task == 1
安排任务:Task == 2
安排任务:Task == 3
安排任务:Task == 4
------------------ user_init OVER ----------------
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
消息类型=1,消息参数=A
消息类型=2,消息参数=B
·用户最多设置3个任务,优先级:2>1>0
·调用任务时需给出任务参数(参数1=任务等级/参数2=消息类型/参数3=消息参数)
·不论系统是否还有未完成的任务,用户都可以继续安排任务(任务可叠加),当系统空闲时会依次执行任务函数。
注:任务虽然可以叠加,但是叠加次数不能超过设定值(消息队列深度)。超过设定值(消息队列深度)的任务将被丢弃。
"D:\esp8266\doc\12_Flash\app\user\user_main.c"
void ICACHE_FLASH_ATTR user_init(void)
{
u8 C_loop = 0;
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
// 向【0x77 000】地址起,写入16个数据(每个数据占4字节)
//…………………………………………………………………………………………………
spi_flash_erase_sector(0x77); // 擦除0x77扇区 参数==【扇区编号】
// 向Flash写数据(参数1=【字节地址】、参数2=写入数据的指针、参数3=数据长度)
//------------------------------------------------------------------------
spi_flash_write(0x77*4096, (uint32 *)A_W_Data, sizeof(A_W_Data));
os_printf("\r\n---------- Write Flash Data OVER ----------\r\n");
//…………………………………………………………………………………………………
// 从【0x77 000】地址起,读出16个数据(每个数据占4字节)
//---------------------------------------------------------------------
spi_flash_read(0x77*4096, (uint32 *)A_R_Data, sizeof(A_W_Data));
// 串口打印读出的数据
//-----------------------------------------------------
for(C_loop=0; C_loop<16; C_loop++)
{
os_printf("Read Data = %d \r\n",A_R_Data[C_loop]);
delay_ms(10);
}
os_printf("\r\n\r\n------------ user_init OVER ------------\r\n\r\n");
}
串口调试
=================================================
Project: Flash
SDK version: 2.2.0(f28eaf2)
=================================================---------- Write Flash Data OVER ----------
Read Data = 1
Read Data = 2
Read Data = 3
Read Data = 4
Read Data = 5
Read Data = 6
Read Data = 7
Read Data = 8
Read Data = 9
Read Data = 10
Read Data = 11
Read Data = 12
Read Data = 13
Read Data = 14
Read Data = 15
Read Data = 16
------------ user_init OVER ------------mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
注意:
- 读/写 Flash的地址,不能和系统程序区冲突。可以放在【0x70 000】地址后
- Flash读写,必须【4字节】对齐
- 向 Flash某扇区写数据前,须先将此扇区擦除。 Flash擦除函数的参数==【扇区编号】【字节地址】
- 读/写 Flash数据函数的参数=【字节地址】!【扇区编号】
// 头文件引用
//==================================================================================
#include "user_config.h" // 用户配置
#include "driver/uart.h" // 串口
#include "driver/oled.h" // OLED
//#include "at_custom.h"
#include "c_types.h" // 变量类型
#include "eagle_soc.h" // GPIO函数、宏定义
//#include "espconn.h"
//#include "espnow.h"
#include "ets_sys.h" // 回调函数
//#include "gpio.h"
//#include "ip_addr.h"
//#include "mem.h"
#include "os_type.h" // os_XXX
#include "osapi.h" // os_XXX、软件定时器
//#include "ping.h"
//#include "pwm.h"
//#include "queue.h"
//#include "smartconfig.h"
//#include "sntp.h"
//#include "spi_flash.h"
//#include "upgrade.h"
#include "user_interface.h" // 系统接口、system_param_xxx接口、WIFI、RateContro
//==================================================================================
// 宏定义
//==================================================================================
#define ProjectName "AP_Mode" // 工程名宏定义
#define ESP8266_AP_SSID "ESP8266_yang" // 创建的WIFI名
#define ESP8266_AP_PASS "y123456789" // 创建的WIFI密码
//==================================================================================
// 全局变量
//==================================================================================
os_timer_t OS_Timer_1; // 软件定时器
//==================================================================================
// 毫秒延时函数
//===========================================
void ICACHE_FLASH_ATTR delay_ms(u32 C_time)
{ for(;C_time>0;C_time--)
os_delay_us(1000);
}
//===========================================
// 初始化ESP8266_AP模式
//============================================================================================
void ICACHE_FLASH_ATTR ESP8266_AP_Init_JX()
{
struct softap_config AP_Config; // AP参数结构体
wifi_set_opmode(0x02); // 设置为AP模式,并保存到Flash
// 结构体赋值(注意:【服务集标识符/密码】须设为字符串形式)
//--------------------------------------------------------------------------------------
os_memset(&AP_Config, 0, sizeof(struct softap_config)); // AP参数结构体 = 0
os_strcpy(AP_Config.ssid,ESP8266_AP_SSID); // 设置SSID(将字符串复制到ssid数组)
os_strcpy(AP_Config.password,ESP8266_AP_PASS); // 设置密码(将字符串复制到password数组)
AP_Config.ssid_len=os_strlen(ESP8266_AP_SSID); // 设置ssid长度(和SSID的长度一致)
AP_Config.channel=1; // 通道号1~13
AP_Config.authmode=AUTH_WPA2_PSK; // 设置加密模式
AP_Config.ssid_hidden=0; // 不隐藏SSID
AP_Config.max_connection=4; // 最大连接数
AP_Config.beacon_interval=100; // 信标间隔时槽100~60000 ms
wifi_softap_set_config(&AP_Config); // 设置soft-AP,并保存到Flash
}
//============================================================================================
// 定时的回调函数
//=====================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
struct ip_info ST_ESP8266_IP; // IP信息结构体
u8 ESP8266_IP[4]; // 点分十进制形式保存IP
// 查询并打印ESP8266的工作模式
//---------------------------------------------------------------------
switch(wifi_get_opmode()) // 输出工作模式
{
case 0x01: os_printf("\nESP8266_Mode = Station\n"); break;
case 0x02: os_printf("\nESP8266_Mode = SoftAP\n"); break;
case 0x03: os_printf("\nESP8266_Mode = Station+SoftAP\n"); break;
}
// 获取ESP8266_AP模式下的IP地址
//【AP模式下,如果开启DHCP(默认),并且未设置IP相关参数,ESP8266的IP地址=192.168.4.1】
//-----------------------------------------------------------------------------------
wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP); // 参数2:IP信息结构体指针
// ESP8266_AP_IP.ip.addr==32位二进制IP地址,将它转换为点分十进制的形式
//------------------------------------------------------------------------------------------
ESP8266_IP[0] = ST_ESP8266_IP.ip.addr; // 点分十进制IP的第一个数 <==> addr低八位
ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8; // 点分十进制IP的第二个数 <==> addr次低八位
ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16; // 点分十进制IP的第三个数 <==> addr次高八位
ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24; // 点分十进制IP的第四个数 <==> addr高八位
// 打印ESP8266的IP地址
//-----------------------------------------------------------------------------------------------
os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
OLED_ShowIP(24,2,ESP8266_IP); // 显示ESP8266的IP地址
// 查询并打印接入此WIFI的设备数量
//-----------------------------------------------------------------------------------------
os_printf("Number of devices connected to this WIFI = %d\n",wifi_softap_get_station_num());
}
//=====================================================================================================
// 软件定时器初始化(ms毫秒)
//=====================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{
os_timer_disarm(&OS_Timer_1); // 关闭定时器
os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL); // 设置定时器
os_timer_arm(&OS_Timer_1, time_ms, time_repetitive); // 使能定时器
}
//=====================================================================================
// user_init:entry of user application, init user function here
//==================================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
// ESP8266_AP_SSID
os_printf("\t ESP8266_AP_SSID:\t%s", ESP8266_AP_SSID);
// ESP8266_AP_PASS
os_printf("\t ESP8266_AP_PASS:\t%s", ESP8266_AP_PASS);
// OLED初始化
//---------------------
OLED_Init(); // |
OLED_ShowString(0,0,"ESP8266 = AP"); // |
OLED_ShowString(0,2,"IP:"); // |
//---------------------
ESP8266_AP_Init_JX(); // 设置ESP8266_AP模式相关参数
OS_Timer_1_Init_JX(1000,1); // 1秒软件定时
// while(1) system_soft_wdt_feed(); // 死循环,测试用
os_printf("\r\n-------------------- user_init OVER --------------------\r\n");
}
//==================================================================================
手机可以收到wifi连接wifi输入密码
=================================================
Project: AP_Mode
SDK version: 2.2.0(f28eaf2) ESP8266_AP_SSID: ESP8266_yang ESP8266_AP_PASS: y123456789
=================================================-------------------- user_init OVER --------------------
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100ESP8266_Mode = SoftAP
ESP8266_IP = 192.168.4.1
Number of devices connected to this WIFI = 0
"D:\esp8266\doc\14_AP_UDP_Server\app\user\user_main.c"
// 头文件引用
//==================================================================================
#include "user_config.h" // 用户配置
#include "driver/uart.h" // 串口
#include "driver/oled.h" // OLED
//#include "at_custom.h"
#include "c_types.h" // 变量类型
#include "eagle_soc.h" // GPIO函数、宏定义
#include "ip_addr.h" // 被"espconn.h"使用。在"espconn.h"开头#include"ip_addr.h"或#include"ip_addr.h"放在"espconn.h"之前
#include "espconn.h" // TCP/UDP接口
//#include "espnow.h"
#include "ets_sys.h" // 回调函数
//#include "gpio.h"
#include "mem.h" // 内存申请等函数
#include "os_type.h" // os_XXX
#include "osapi.h" // os_XXX、软件定时器
//#include "ping.h"
//#include "pwm.h"
//#include "queue.h"
//#include "smartconfig.h"
//#include "sntp.h"
//#include "spi_flash.h"
//#include "upgrade.h"
#include "user_interface.h" // 系统接口、system_param_xxx接口、WIFI、RateContro
//==================================================================================
// 宏定义
//==================================================================================
#define ProjectName "AP_UDP_Server" // 工程名宏定义
#define ESP8266_AP_SSID "ESP8266_JX" // 创建的WIFI名
#define ESP8266_AP_PASS "y123456789" // 创建的WIFI密码
#define LED_ON GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0) // LED亮
#define LED_OFF GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1) // LED灭
//==================================================================================
// 全局变量
//==================================================================================
os_timer_t OS_Timer_1; // 软件定时器
//struct espconn ST_NetCon; // 注:必须定义为全局变量,内核将会使用此变量(内存)
//==================================================================================
// 毫秒延时函数
//===========================================
void ICACHE_FLASH_ATTR delay_ms(u32 C_time)
{ for(;C_time>0;C_time--)
os_delay_us(1000);
}
//===========================================
// 初始化ESP8266_AP模式
//============================================================================================
void ICACHE_FLASH_ATTR ESP8266_AP_Init_JX()
{
struct softap_config AP_Config; // AP参数结构体
wifi_set_opmode(0x02); // 设置为AP模式,并保存到Flash
// 结构体赋值(注意:【服务集标识符/密码】须设为字符串形式)
//--------------------------------------------------------------------------------------
os_memset(&AP_Config, 0, sizeof(struct softap_config)); // AP参数结构体 = 0
os_strcpy(AP_Config.ssid,ESP8266_AP_SSID); // 设置SSID(将字符串复制到ssid数组)
os_strcpy(AP_Config.password,ESP8266_AP_PASS); // 设置密码(将字符串复制到password数组)
AP_Config.ssid_len=os_strlen(ESP8266_AP_SSID); // 设置ssid长度(和SSID的长度一致)
AP_Config.channel=1; // 通道号1~13
AP_Config.authmode=AUTH_WPA2_PSK; // 设置加密模式
AP_Config.ssid_hidden=0; // 不隐藏SSID
AP_Config.max_connection=4; // 最大连接数
AP_Config.beacon_interval=100; // 信标间隔时槽100~60000 ms
wifi_softap_set_config(&AP_Config); // 设置soft-AP,并保存到Flash
}
//============================================================================================
// 成功发送网络数据的回调函数
//==========================================================
void ICACHE_FLASH_ATTR ESP8266_WIFI_Send_Cb_JX(void *arg)
{
os_printf("\nESP8266_WIFI_Send_OK\n");
}
//==========================================================
// 成功接收网络数据的回调函数【参数1:网络传输结构体espconn指针、参数2:网络传输数据指针、参数3:数据长度】
//=========================================================================================================
void ICACHE_FLASH_ATTR ESP8266_WIFI_Recv_Cb_JX(void * arg, char * pdata, unsigned short len)
{
struct espconn * T_arg = arg; // 缓存网络连接结构体指针
remot_info * P_port_info = NULL; // 远端连接信息结构体指针
// 根据数据设置LED的亮/灭
//-------------------------------------------------------------------------------
if(pdata[0] == 'k' || pdata[0] == 'K') LED_ON; // 首字母为'k'/'K',灯亮
else if(pdata[0] == 'g' || pdata[0] == 'G') LED_OFF; // 首字母为'g'/'G',灯灭
os_printf("\nESP8266_Receive_Data = %s\n",pdata); // 串口打印接收到的数据
// 获取远端信息【UDP通信是无连接的,向远端主机回应时需获取对方的IP/端口信息】
//------------------------------------------------------------------------------------
if(espconn_get_connection_info(T_arg, &P_port_info, 0)==ESPCONN_OK) // 获取远端信息
{
T_arg->proto.udp->remote_port = P_port_info->remote_port; // 获取对方端口号
T_arg->proto.udp->remote_ip[0] = P_port_info->remote_ip[0]; // 获取对方IP地址
T_arg->proto.udp->remote_ip[1] = P_port_info->remote_ip[1];
T_arg->proto.udp->remote_ip[2] = P_port_info->remote_ip[2];
T_arg->proto.udp->remote_ip[3] = P_port_info->remote_ip[3];
//os_memcpy(T_arg->proto.udp->remote_ip,P_port_info->remote_ip,4); // 内存拷贝
}
//--------------------------------------------------------------------
OLED_ShowIP(24,6,T_arg->proto.udp->remote_ip); // 显示远端主机IP地址
//--------------------------------------------------------------------
espconn_send(T_arg,"ESP8266_WIFI_Recv_OK",os_strlen("ESP8266_WIFI_Recv_OK")); // 向对方发送应答
}
//=========================================================================================================
// ①:定义espconn型结构体(网络连接结构体)
//------------------------------------------------------------------------------
struct espconn ST_NetCon; // 注:必须定义为全局变量,内核将会使用此变量(内存)
//esp_udp ST_UDP; // UDP通信结构体
// 初始化网络连接(UDP通信)
//=================================================================================================
void ICACHE_FLASH_ATTR ESP8266_NetCon_Init_JX()
{
// ②:结构体赋值
//…………………………………………………………………………………………………
ST_NetCon.type = ESPCONN_UDP; // 通信协议:UDP
// ST_NetCon.proto.udp只是一个指针,不是真正的esp_udp型结构体变量
//-------------------------------------------------------------------------
ST_NetCon.proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp)); // 申请内存
//ST_NetCon.proto.udp = &ST_UDP;
// 此处无需设置目标IP/端口(ESP8266作为Server,不需要预先知道Client的IP/端口)
//--------------------------------------------------------------------------
//ST_NetCon.proto.udp->local_port = espconn_port(); // 获取8266可用端口
ST_NetCon.proto.udp->local_port = 8266 ; // 设置本地端口
//ST_NetCon.proto.udp->remote_port = 8888; // 设置目标端口
//ST_NetCon.proto.udp->remote_ip[0] = 192; // 设置目标IP地址
//ST_NetCon.proto.udp->remote_ip[1] = 168;
//ST_NetCon.proto.udp->remote_ip[2] = 4;
//ST_NetCon.proto.udp->remote_ip[3] = 2;
//…………………………………………………………………………………………………
// ③:注册/定义回调函数
//-------------------------------------------------------------------------------------------
espconn_regist_sentcb(&ST_NetCon,ESP8266_WIFI_Send_Cb_JX); // 注册网络数据发送成功的回调函数
espconn_regist_recvcb(&ST_NetCon,ESP8266_WIFI_Recv_Cb_JX); // 注册网络数据接收成功的回调函数
// ④:调用UDP初始化API
//----------------------------------------------
espconn_create(&ST_NetCon); // 初始化UDP通信
}
//=================================================================================================
// 定时的回调函数(查询ESP8266的IP地址,并初始化网络连接)
//=============================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
struct ip_info ST_ESP8266_IP; // IP信息结构体
u8 ESP8266_IP[4]; // 点分十进制形式保存IP
wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP); // 查询AP模式下ESP8266的IP地址
if(ST_ESP8266_IP.ip.addr != 0) // ESP8266成功获取到IP地址
{
ESP8266_IP[0] = ST_ESP8266_IP.ip.addr; // 点分十进制IP的第一个数 <==> addr低八位
ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8; // 点分十进制IP的第二个数 <==> addr次低八位
ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16; // 点分十进制IP的第三个数 <==> addr次高八位
ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24; // 点分十进制IP的第四个数 <==> addr高八位
// 打印并显示ESP8266的IP地址
//-----------------------------------------------------------------------------------------------
os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
OLED_ShowIP(24,2,ESP8266_IP); // OLED显示ESP8266的IP地址
//-----------------------------------------------------------------------------------------------
os_timer_disarm(&OS_Timer_1); // 关闭定时器
ESP8266_NetCon_Init_JX(); // 初始化网络连接(UDP通信)
}
}
//=============================================================================================================
// 软件定时器初始化(ms毫秒)
//=====================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{
os_timer_disarm(&OS_Timer_1); // 关闭定时器
os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL); // 设置定时器
os_timer_arm(&OS_Timer_1, time_ms, time_repetitive); // 使能定时器
}
//=====================================================================================
// LED初始化
//=============================================================================
void ICACHE_FLASH_ATTR LED_Init_JX(void)
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO4设为IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // IO4 = 1
}
//=============================================================================
// user_init:entry of user application, init user function here
//==============================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
// OLED显示初始化
//--------------------------------------------------------
OLED_Init(); // OLED初始化
OLED_ShowString(0,0,"ESP8266 = AP"); // ESP8266模式
OLED_ShowString(0,2,"IP:"); // ESP8266_IP地址
OLED_ShowString(0,4,"Remote = STA"); // 远端主机模式
OLED_ShowString(0,6,"IP:"); // 远端主机IP地址
//--------------------------------------------------------
LED_Init_JX(); // LED初始化
ESP8266_AP_Init_JX(); // 初始化ESP8266_AP模式
OS_Timer_1_Init_JX(1000,1); // 1秒软件定时
}
=================================================
Project: AP_UDP_Server
SDK version: 2.2.0(f28eaf2)
=================================================
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
ESP8266_IP = 192.168.4.1
add 1
aid 1
station: a4:4b:d5:dd:95:cc join, AID = 1
打开网tcp调试助手,新建UDP参数如下所示
发送udp后串口调试显示如下
ESP8266_Receive_Data = Test222ESP8266_WIFI_Send_OK
oled模块显示ip192.168.31.4.2
发送k字符led亮
ESP8266_Receive_Data = k
ESP8266_WIFI_Send_OK
发送g字符led灭
ESP8266_Receive_Data = g
ESP8266_WIFI_Send_OK
"D:\esp8266\doc\15_AP_UDP_Client\app\user\user_main.c"
// 定义espconn型结构体
//-----------------------------------------------
//struct espconn ST_NetCon; // 网络连接结构体
// 初始化网络连接(UDP通信)
//=============================================================================================================
void ICACHE_FLASH_ATTR ESP8266_NetCon_Init_JX()
{
// 结构体赋值
//--------------------------------------------------------------------------
ST_NetCon.type = ESPCONN_UDP; // 设置通信协议为UDP
ST_NetCon.proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp)); // 开辟内存
// 此处需要设置目标IP/端口(ESP8266作为Client,需要预先知道Server的IP/端口)
//--------------------------------------------------------------------------
ST_NetCon.proto.udp->local_port = 8266 ; // 设置本地端口
ST_NetCon.proto.udp->remote_port = 8888; // 设置目标端口
ST_NetCon.proto.udp->remote_ip[0] = 192; // 设置目标IP地址
ST_NetCon.proto.udp->remote_ip[1] = 168;
ST_NetCon.proto.udp->remote_ip[2] = 4;
ST_NetCon.proto.udp->remote_ip[3] = 2;
//u8 remote_ip[4] = {192,168,4,2}; // 目标IP地址
//os_memcpy(ST_NetCon.proto.udp->remote_ip,remote_ip,4); // 拷贝内存
espconn_regist_sentcb(&ST_NetCon,ESP8266_WIFI_Send_Cb_JX); // 注册网络数据发送成功的回调函数
espconn_regist_recvcb(&ST_NetCon,ESP8266_WIFI_Recv_Cb_JX); // 注册网络数据接收成功的回调函数
espconn_create(&ST_NetCon); // 初始化UDP通信
espconn_send(&ST_NetCon,"Hello,I am ESP8266",os_strlen("Hello,I am ESP8266")); // 主动向Server发起通信
}
//=============================================================================================================
// 定时的回调函数(查询ESP8266的IP地址,并初始化网络连接)
//==============================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
struct ip_info ST_ESP8266_IP; // IP信息结构体
u8 ESP8266_IP[4]; // 点分十进制形式保存IP
wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP); // 查询AP模式下ESP8266的IP地址
if(ST_ESP8266_IP.ip.addr != 0) // ESP8266成功获取到IP地址
{
ESP8266_IP[0] = ST_ESP8266_IP.ip.addr; // 点分十进制IP的第一个数 <==> addr低八位
ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8; // 点分十进制IP的第二个数 <==> addr次低八位
ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16; // 点分十进制IP的第三个数 <==> addr次高八位
ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24; // 点分十进制IP的第四个数 <==> addr高八位
// 显示ESP8266的IP地址
//-----------------------------------------------------------------------------------------------
os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
OLED_ShowIP(24,2,ESP8266_IP); // OLED显示ESP8266的IP地址
//-----------------------------------------------------------------------------------------------
os_timer_disarm(&OS_Timer_1); // 关闭定时器
ESP8266_NetCon_Init_JX(); // 初始化网络连接(UDP通信)
}
}
//==============================================================================================================
// 软件定时器初始化(ms毫秒)
//=====================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{
os_timer_disarm(&OS_Timer_1); // 关闭定时器
os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL); // 设置定时器
os_timer_arm(&OS_Timer_1, time_ms, time_repetitive); // 使能定时器
}
//=====================================================================================
// LED初始化
//=============================================================================
void ICACHE_FLASH_ATTR LED_Init_JX(void)
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO4设为IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // IO4 = 1
}
//=============================================================================
// user_init:entry of user application, init user function here
//=============================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
// OLED显示初始化
//--------------------------------------------------------
OLED_Init(); // OLED初始化
OLED_ShowString(0,0,"ESP8266 = AP"); // ESP8266模式
OLED_ShowString(0,2,"IP:"); // ESP8266_IP地址
OLED_ShowString(0,4,"Remote = STA"); // 远端主机模式
OLED_ShowString(0,6,"IP:"); // 远端主机IP地址
//--------------------------------------------------------
LED_Init_JX(); // LED初始化
ESP8266_AP_Init_JX(); // 初始化ESP8266_AP模式
OS_Timer_1_Init_JX(30000,0); // 30秒定时(一次)
}
打开网络调试助手,新建udp ip192.168.4.2断开8888,启动
打开串口调试,连接端口
点rest串口调试显示
=================================================
Project: AP_UDP_Client
SDK version: 2.2.0(f28eaf2)
=================================================
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
add 1
aid 1
station: 40:a5:ef:f4:6f:6d join, AID = 1
ESP8266_IP = 192.168.4.1
等30秒,网络调试助手显示如下,会自动给网络调试发送一句话
【2021-01-15 12:02:38:启动成功,192.168.4.2:8888】
【2021-01-15 12:05:31收到数据,192.168.4.1:8266 Len:18】:Hello,I am ESP8266
"D:\esp8266\doc\16_AP_TCP_Server\app\user\user_main.c"
// TCP连接断开成功的回调函数
//================================================================
void ICACHE_FLASH_ATTR ESP8266_TCP_Disconnect_Cb_JX(void *arg)
{
os_printf("\nESP8266_TCP_Disconnect_OK\n");
}
//================================================================
// TCP连接建立成功的回调函数
//====================================================================================================================
void ICACHE_FLASH_ATTR ESP8266_TCP_Connect_Cb_JX(void *arg)
{
espconn_regist_sentcb((struct espconn *)arg, ESP8266_WIFI_Send_Cb_JX); // 注册网络数据发送成功的回调函数
espconn_regist_recvcb((struct espconn *)arg, ESP8266_WIFI_Recv_Cb_JX); // 注册网络数据接收成功的回调函数
espconn_regist_disconcb((struct espconn *)arg,ESP8266_TCP_Disconnect_Cb_JX); // 注册成功断开TCP连接的回调函数
os_printf("\n--------------- ESP8266_TCP_Connect_OK ---------------\n");
}
//====================================================================================================================
// TCP连接异常断开时的回调函数
//====================================================================
void ICACHE_FLASH_ATTR ESP8266_TCP_Break_Cb_JX(void *arg,sint8 err)
{
os_printf("\nESP8266_TCP_Break\n");
}
//====================================================================
// 定义espconn型结构体
//-----------------------------------------------
struct espconn ST_NetCon; // 网络连接结构体
// 初始化网络连接(TCP通信)
//=============================================================================================================
void ICACHE_FLASH_ATTR ESP8266_NetCon_Init_JX()
{
// 结构体赋值
//--------------------------------------------------------------------------
ST_NetCon.type = ESPCONN_TCP ; // 通信协议:TCP
ST_NetCon.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); // 申请内存
// 此处无需设置目标IP/端口(ESP8266作为Server,不需要预先知道Client的IP/端口)
//--------------------------------------------------------------------------
ST_NetCon.proto.tcp->local_port = 8266 ; // 设置本地端口
//ST_NetCon.proto.tcp->remote_port = 8888; // 设置目标端口
//ST_NetCon.proto.tcp->remote_ip[0] = 192; // 设置目标IP地址
//ST_NetCon.proto.tcp->remote_ip[1] = 168;
//ST_NetCon.proto.tcp->remote_ip[2] = 4;
//ST_NetCon.proto.tcp->remote_ip[3] = 2;
// 注册连接成功回调函数、异常断开回调函数
//--------------------------------------------------------------------------------------------------
espconn_regist_connectcb(&ST_NetCon, ESP8266_TCP_Connect_Cb_JX); // 注册TCP连接成功建立的回调函数
espconn_regist_reconcb(&ST_NetCon, ESP8266_TCP_Break_Cb_JX); // 注册TCP连接异常断开的回调函数
// 创建TCP_server,建立侦听
//----------------------------------------------------------
espconn_accept(&ST_NetCon); // 创建TCP_server,建立侦听
// 请在 espconn_accept 之后,连接未建立之前,调用本接口
// 如果超时时间设置为 0,ESP8266_TCP_server将始终不会断开已经不与它通信的TCP_client,不建议这样使用。
//---------------------------------------------------------------------------------------------------
espconn_regist_time(&ST_NetCon, 300, 0); //设置超时断开时间。单位=秒,最大值=7200
}
//=============================================================================================================
// 软件定时的回调函数
//=============================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
struct ip_info ST_ESP8266_IP; // IP信息结构体
u8 ESP8266_IP[4]; // 点分十进制形式保存IP
wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP); // 查询AP模式下ESP8266的IP地址
if(ST_ESP8266_IP.ip.addr != 0 ) // ESP8266成功获取到IP地址
{
ESP8266_IP[0] = ST_ESP8266_IP.ip.addr; // 点分十进制IP的第一个数 <==> addr低八位
ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8; // 点分十进制IP的第二个数 <==> addr次低八位
ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16; // 点分十进制IP的第三个数 <==> addr次高八位
ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24; // 点分十进制IP的第四个数 <==> addr高八位
// 显示ESP8266的IP地址
//-----------------------------------------------------------------------------------------------
os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
OLED_ShowIP(24,2,ESP8266_IP); // OLED显示ESP8266的IP地址
//-----------------------------------------------------------------------------------------------
os_timer_disarm(&OS_Timer_1); // 关闭定时器
ESP8266_NetCon_Init_JX(); // 初始化网络连接(TCP通信)
}
}
//=============================================================================================================
// 软件定时器初始化(ms毫秒)
//=====================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{
os_timer_disarm(&OS_Timer_1); // 关闭定时器
os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL); // 设置定时器
os_timer_arm(&OS_Timer_1, time_ms, time_repetitive); // 使能定时器
}
//=====================================================================================
// LED初始化
//=============================================================================
void ICACHE_FLASH_ATTR LED_Init_JX(void)
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO4设为IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // IO4 = 1
}
//=============================================================================
// user_init:entry of user application, init user function here
//=============================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
// OLED显示初始化
//--------------------------------------------------------
OLED_Init(); // OLED初始化
OLED_ShowString(0,0,"ESP8266 = AP"); // ESP8266模式
OLED_ShowString(0,2,"IP:"); // ESP8266_IP地址
OLED_ShowString(0,4,"Remote = STA"); // 远端主机模式
OLED_ShowString(0,6,"IP:"); // 远端主机IP地址
//--------------------------------------------------------
LED_Init_JX(); // LED初始化
ESP8266_AP_Init_JX(); // 初始化ESP8266_AP模式
OS_Timer_1_Init_JX(1000,1); // 1秒定时(重复)
}
//=============================================================================
带网络调试助手
选择新建TCP client→IP:192.168.4.1→端口8266→连接
网络调试
【2021-01-15 12:56:51:已连接】
【2021-01-15 12:58:15收到数据 Len:20】:ESP8266_WIFI_Recv_OK
串口调试
=================================================
Project: AP_TCP_Server
SDK version: 2.2.0(f28eaf2)
=================================================
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
ESP8266_IP = 192.168.4.1
add 1
aid 1
station: 40:a5:ef:f4:6f:6d join, AID = 1--------------- ESP8266_TCP_Connect_OK ---------------
ESP8266_Receive_Data = Test
ESP8266_WIFI_Send_OK
// 成功接收网络数据的回调函数【参数1:网络传输结构体espconn指针、参数2:网络传输数据指针、参数3:数据长度】
//=========================================================================================================
void ICACHE_FLASH_ATTR ESP8266_WIFI_Recv_Cb_JX(void * arg, char * pdata, unsigned short len)
{
struct espconn * T_arg = arg; // 缓存网络连接结构体指针
// 根据数据设置LED的亮/灭
//-------------------------------------------------------------------------------
if(pdata[0] == 'k' || pdata[0] == 'K') LED_ON; // 首字母为'k'/'K',灯亮
else if(pdata[0] == 'g' || pdata[0] == 'G') LED_OFF; // 首字母为'g'/'G',灯灭
os_printf("\nESP8266_Receive_Data = %s\n",pdata); // 串口打印接收到的数据
/*
// 获取远端信息
//------------------------------------------------------------------------------------
remot_info * P_port_info = NULL; // 定义远端连接信息指针
if(espconn_get_connection_info(T_arg, &P_port_info, 0)==ESPCONN_OK) // 获取远端信息
{
T_arg->proto.tcp->remote_port = P_port_info->remote_port; // 获取对方端口号
T_arg->proto.tcp->remote_ip[0] = P_port_info->remote_ip[0]; // 获取对方的IP地址
T_arg->proto.tcp->remote_ip[1] = P_port_info->remote_ip[1];
T_arg->proto.tcp->remote_ip[2] = P_port_info->remote_ip[2];
T_arg->proto.tcp->remote_ip[3] = P_port_info->remote_ip[3];
//os_memcpy(T_arg->proto.tcp->remote_ip,P_port_info->remote_ip,4); // 内存拷贝
}
*/
//--------------------------------------------------------------------
OLED_ShowIP(24,6,T_arg->proto.tcp->remote_ip); // 显示远端主机IP地址
//--------------------------------------------------------------------
//【TCP通信是面向连接的,向远端主机回应时可直接使用T_arg结构体指针指向的IP信息】
//-----------------------------------------------------------------------------------------------
espconn_send(T_arg,"ESP8266_WIFI_Recv_OK",os_strlen("ESP8266_WIFI_Recv_OK")); // 向对方发送应答
}
//=========================================================================================================
// TCP连接断开成功的回调函数
//================================================================
void ICACHE_FLASH_ATTR ESP8266_TCP_Disconnect_Cb_JX(void *arg)
{
os_printf("\nESP8266_TCP_Disconnect_OK\n");
}
//================================================================
// TCP连接建立成功的回调函数
//====================================================================================================================
void ICACHE_FLASH_ATTR ESP8266_TCP_Connect_Cb_JX(void *arg)
{
espconn_regist_sentcb((struct espconn *)arg, ESP8266_WIFI_Send_Cb_JX); // 注册网络数据发送成功的回调函数
espconn_regist_recvcb((struct espconn *)arg, ESP8266_WIFI_Recv_Cb_JX); // 注册网络数据接收成功的回调函数
espconn_regist_disconcb((struct espconn *)arg,ESP8266_TCP_Disconnect_Cb_JX); // 注册成功断开TCP连接的回调函数
espconn_send((struct espconn *)arg,"Hello,I am ESP8266",os_strlen("Hello,I am ESP8266")); // 向Server发起通信
os_printf("\n--------------- ESP8266_TCP_Connect_OK ---------------\n");
}
//====================================================================================================================
// TCP连接异常断开时的回调函数
//====================================================================
void ICACHE_FLASH_ATTR ESP8266_TCP_Break_Cb_JX(void *arg,sint8 err)
{
os_printf("\nESP8266_TCP_Break\n");
espconn_connect(&ST_NetCon); // 连接TCP-server
}
//====================================================================
// 定义espconn型结构体
//-----------------------------------------------
//struct espconn ST_NetCon; // 网络连接结构体
// 初始化网络连接(TCP通信)
//========================================================================================================
void ICACHE_FLASH_ATTR ESP8266_NetCon_Init_JX()
{
// 结构体赋值
//--------------------------------------------------------------------------
ST_NetCon.type = ESPCONN_TCP ; // 设置为TCP协议
ST_NetCon.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); // 开辟内存
// 此处需要设置目标IP/端口(ESP8266作为Client,需要预先知道Server的IP/端口)
//-------------------------------------------------------------------------
ST_NetCon.proto.tcp->local_port = 8266 ; // 设置本地端口
ST_NetCon.proto.tcp->remote_port = 8888; // 设置目标端口
ST_NetCon.proto.tcp->remote_ip[0] = 192; // 设置目标IP地址
ST_NetCon.proto.tcp->remote_ip[1] = 168;
ST_NetCon.proto.tcp->remote_ip[2] = 4;
ST_NetCon.proto.tcp->remote_ip[3] = 2;
//u8 remote_ip[4] = {192,168,4,2}; // 目标ip地址
//os_memcpy(ST_NetCon.proto.udp->remote_ip,remote_ip,4); // 拷贝内存
// 注册连接成功回调函数、异常断开回调函数
//--------------------------------------------------------------------------------------------------
espconn_regist_connectcb(&ST_NetCon, ESP8266_TCP_Connect_Cb_JX); // 注册TCP连接成功建立的回调函数
espconn_regist_reconcb(&ST_NetCon, ESP8266_TCP_Break_Cb_JX); // 注册TCP连接异常断开的回调函数
// 连接 TCP server
//----------------------------------------------------------
espconn_connect(&ST_NetCon); // 连接TCP-server
}
//========================================================================================================
// 软件定时的回调函数
//==========================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
struct ip_info ST_ESP8266_IP; // IP信息结构体
u8 ESP8266_IP[4]; // 点分十进制形式保存IP
wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP); // 查询AP模式下ESP8266的IP地址
if(ST_ESP8266_IP.ip.addr!=0 ) // ESP8266成功获取到IP地址
{
ESP8266_IP[0] = ST_ESP8266_IP.ip.addr; // 点分十进制IP的第一个数 <==> addr低八位
ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8; // 点分十进制IP的第二个数 <==> addr次低八位
ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16; // 点分十进制IP的第三个数 <==> addr次高八位
ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24; // 点分十进制IP的第四个数 <==> addr高八位
// 显示ESP8266的IP地址
//-----------------------------------------------------------------------------------------------
os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
OLED_ShowIP(24,2,ESP8266_IP); // OLED显示ESP8266的IP地址
//-----------------------------------------------------------------------------------------------
os_timer_disarm(&OS_Timer_1); // 关闭定时器
ESP8266_NetCon_Init_JX(); // 初始化网络连接(TCP通信)
}
}
//==========================================================================================================
打开串口调试启动,8266rest重置
打开网络调试助手→新建 TCP server →端口8888→连接
等一会
网络调试显示
【2021-01-15 13:11:36:启动成功,端口号:8888】
【2021-01-15 13:12:08:客户端1上线,192.168.4.1:8266】
【2021-01-15 13:12:08收到数据,192.168.4.1:8266 Len:18】:Hello,I am ESP8266
串口通讯显示
Project: AP_TCP_Client
SDK version: 2.2.0(f28eaf2)
=================================================
mode : softAP(e2:98:06:0f:04:3a)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
ESP8266_IP = 192.168.4.1
add 1
aid 1
station: 40:a5:ef:f4:6f:6d join, AID = 1--------------- ESP8266_TCP_Connect_OK ---------------
ESP8266_WIFI_Send_OK
// 宏定义
//==================================================================================
#define ProjectName "STA_Mode" // 工程名宏定义
#define ESP8266_STA_SSID "yang1234" // 接入的WIFI名
#define ESP8266_STA_PASS "y123456789" // 接入的WIFI密码
#define LED_ON GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0) // LED亮
#define LED_OFF GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1) // LED灭
//==================================================================================
// 全局变量
//==================================================================================
os_timer_t OS_Timer_1; // 软件定时器
//==================================================================================
// 毫秒延时函数
//===========================================
void ICACHE_FLASH_ATTR delay_ms(u32 C_time)
{ for(;C_time>0;C_time--)
os_delay_us(1000);
}
//===========================================
// ESP8266_STA初始化
//==============================================================================
void ICACHE_FLASH_ATTR ESP8266_STA_Init_JX()
{
struct station_config STA_Config; // STA参数结构体
struct ip_info ST_ESP8266_IP; // STA信息结构体
// 设置ESP8266的工作模式
//------------------------------------------------------------------------
wifi_set_opmode(0x01); // 设置为STA模式,并保存到Flash
// 设置STA模式下的IP地址【ESP8266默认开启DHCP Client,接入WIFI时会自动分配IP地址】
//--------------------------------------------------------------------------------
wifi_station_dhcpc_stop(); // 关闭 DHCP Client
IP4_ADDR(&ST_ESP8266_IP.ip,192,168,31,145); // 配置IP地址
IP4_ADDR(&ST_ESP8266_IP.netmask,255,255,255,0); // 配置子网掩码
IP4_ADDR(&ST_ESP8266_IP.gw,192,168,31,1); // 配置网关地址
wifi_set_ip_info(STATION_IF,&ST_ESP8266_IP); // 设置STA模式下的IP地址
// 结构体赋值,配置STA模式参数
//-------------------------------------------------------------------------------
os_memset(&STA_Config, 0, sizeof(struct station_config)); // STA参数结构体 = 0
os_strcpy(STA_Config.ssid,ESP8266_STA_SSID); // 设置WIFI名
os_strcpy(STA_Config.password,ESP8266_STA_PASS); // 设置WIFI密码
wifi_station_set_config(&STA_Config); // 设置STA参数,并保存到Flash
// 此API不能在user_init初始化中调用
// 如果user_init中调用wifi_station_set_config(...)的话,内核会自动将ESP8266接入WIFI
//----------------------------------------------------------------------------------
// wifi_station_connect(); // ESP8266连接WIFI
}
//=========================================================================================
// 软件定时的回调函数
//========================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
u8 C_LED_Flash = 0; // LED闪烁计次
u8 S_WIFI_STA_Connect; // WIFI接入状态标志
struct ip_info ST_ESP8266_IP; // ESP8266的IP信息
u8 ESP8266_IP[4]; // ESP8266的IP地址
// 查询STA接入WIFI状态
//-----------------------------------------------------
S_WIFI_STA_Connect = wifi_station_get_connect_status();
//---------------------------------------------------
// Station连接状态表
// 0 == STATION_IDLE -------------- STATION闲置
// 1 == STATION_CONNECTING -------- 正在连接WIFI
// 2 == STATION_WRONG_PASSWORD ---- WIFI密码错误
// 3 == STATION_NO_AP_FOUND ------- 未发现指定WIFI
// 4 == STATION_CONNECT_FAIL ------ 连接失败
// 5 == STATION_GOT_IP ------------ 获得IP,连接成功
//---------------------------------------------------
switch(S_WIFI_STA_Connect)
{
case 0 : os_printf("\nSTATION_IDLE\n"); break;
case 1 : os_printf("\nSTATION_CONNECTING\n"); break;
case 2 : os_printf("\nSTATION_WRONG_PASSWORD\n"); break;
case 3 : os_printf("\nSTATION_NO_AP_FOUND\n"); break;
case 4 : os_printf("\nSTATION_CONNECT_FAIL\n"); break;
case 5 : os_printf("\nSTATION_GOT_IP\n"); break;
}
// 成功接入WIFI【STA模式下,如果开启DHCP(默认),则ESO8266的IP地址由WIFI路由器自动分配】
//----------------------------------------------------------------------------------------
if( S_WIFI_STA_Connect == STATION_GOT_IP ) // 判断是否获取IP
{
// 获取ESP8266_Station模式下的IP地址
// DHCP-Client默认开启,ESP8266接入WIFI后,由路由器分配IP地址,IP地址不确定
//--------------------------------------------------------------------------
wifi_get_ip_info(STATION_IF,&ST_ESP8266_IP); // 参数2:IP信息结构体指针
// ESP8266_AP_IP.ip.addr是32位二进制代码,转换为点分十进制形式
//----------------------------------------------------------------------------
ESP8266_IP[0] = ST_ESP8266_IP.ip.addr; // IP地址高八位 == addr低八位
ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8; // IP地址次高八位 == addr次低八位
ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16; // IP地址次低八位 == addr次高八位
ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24; // IP地址低八位 == addr高八位
// 显示ESP8266的IP地址
//-----------------------------------------------------------------------------------------------
os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
OLED_ShowIP(24,2,ESP8266_IP); // OLED显示ESP8266的IP地址
//-----------------------------------------------------------------------------------------------
// 接入WIFI成功后,LED快闪3次
//----------------------------------------------------
for(; C_LED_Flash<=5; C_LED_Flash++)
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),(C_LED_Flash%2));
delay_ms(100);
}
os_timer_disarm(&OS_Timer_1); // 关闭定时器
}
}
串口调试
=================================================
Project: STA_Mode
SDK version: 2.2.0(f28eaf2)
=================================================
mode : sta(e0:98:06:0f:04:3a)
add if0STATION_CONNECTING
STATION_CONNECTING
scandone
state: 0 -> 2 (b0)STATION_CONNECTING
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 13
cntconnected with yang1234, channel 6
ip:192.168.31.145,mask:255.255.255.0,gw:192.168.31.1STATION_GOT_IP
ESP8266_IP = 192.168.31.145
pm open,type:2 0
D:\esp8266\doc\19_STA_UDP_Server
网络助手选新建udp
本地→ip:本机ip192.168.31.84→端口:8888
发送→ip:192.168.31.131(开发板ip)→端口8266
发送k灯亮,发送g灯灭
串口调试
=================================================
Project: STA_UDP_Server
SDK version: 2.2.0(f28eaf2)
=================================================
mode : sta(e0:98:06:0f:04:3a)
add if0
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 13
cntconnected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1
ESP8266_IP = 192.168.31.131
pm open,type:2 0ESP8266_Receive_Data = Test
ESP8266_WIFI_Send_OK
ESP8266_Receive_Data = k
ESP8266_WIFI_Send_OK
ESP8266_Receive_Data = g
ESP8266_WIFI_Send_OK
网络调试
【2021-01-15 15:38:22:启动成功,192.168.31.84:8888】
【2021-01-15 15:38:31收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 15:38:38收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 15:38:42收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
"D:\esp8266\doc\20_STA_UDP_Client\app\user\user_main.c"
程序上传后,
1.打开网络助手,建立udp→ip(192.168.31.84)→端口号(8888)→启动
2.打开串口调式连接开发板(会自动给192.168.31.84发送一条消息)
网络调试
【2021-01-15 15:50:05:启动成功,192.168.31.84:8888】
【2021-01-15 15:50:17收到数据,192.168.31.131:8266 Len:18】:Hello,I am ESP8266
【2021-01-15 15:53:11收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 15:53:14收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
串口调试
=================================================
Project: STA_UDP_Client
SDK version: 2.2.0(f28eaf2)
=================================================
mode : sta(e0:98:06:0f:04:3a)
add if0
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 13
cntconnected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1
ESP8266_IP = 192.168.31.131ESP8266_WIFI_Send_OK
pm open,type:2 0ESP8266_Receive_Data = k
ESP8266_WIFI_Send_OK
ESP8266_Receive_Data = g
ESP8266_WIFI_Send_OK
"D:\esp8266\doc\21_STA_TCP_Server\app\user\user_main.c"
上传后
打开调试→连上串口→复位8266
打开网络调试→新建tcp client→ip(二四篇66IP192.168.31.131)→端口号(8266)
网络调试内容
【2021-01-15 16:04:07:已连接】
【2021-01-15 16:04:09收到数据 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 16:04:17收到数据 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 16:04:21收到数据 Len:20】:ESP8266_WIFI_Recv_OK
串口调试内容
connected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1
ESP8266_IP = 192.168.31.131--------------- ESP8266_TCP_Connect_OK ---------------
pm open,type:2 0ESP8266_Receive_Data = Test
ESP8266_WIFI_Send_OK
ESP8266_Receive_Data = k
ESP8266_WIFI_Send_OK
ESP8266_Receive_Data = g
ESP8266_WIFI_Send_OK
"D:\esp8266\doc\22_STA_TCP_Client\app\user\user_main.c"
修改wifi和密码和本机ip地址
上传
打开网络调试新建tcp server→ip(8888本机)
打开串口调试→连接串口→复位→自动发送Hello,I am ESP8266
客户端列表会多个开发板ip(192.168.31.131)和端口号(8266)
选择客户端列表,可以发送消息了
网络调试内容
【2021-01-15 16:19:43:客户端1上线,192.168.31.131:8266】
【2021-01-15 16:19:43收到数据,192.168.31.131:8266 Len:18】:Hello,I am ESP8266
【2021-01-15 16:19:57收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 16:20:02收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
【2021-01-15 16:20:04收到数据,192.168.31.131:8266 Len:20】:ESP8266_WIFI_Recv_OK
串口调试内容
connected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1
ESP8266_IP = 192.168.31.131--------------- ESP8266_TCP_Connect_OK ---------------
ESP8266_WIFI_Send_OK
pm open,type:2 0ESP8266_Receive_Data = Test
ESP8266_WIFI_Send_OK
ESP8266_Receive_Data = k
ESP8266_WIFI_Send_OK
ESP8266_Receive_Data = g
ESP8266_WIFI_Send_OK
获取瑞生网ip
上传后
点击串口调试,获取到ip地址
串口调试内容
connected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1ESP8266_IP = 192.168.31.131
---- DomainName Analyse Succeed ----
IP_Server = 8.129.233.140
--------------- ESP8266_TCP_Connect_OK ---------------
pm open,type:2 0ESP8266_TCP_Disconnect_OK
推荐使用域名的方式来访问互联网上的服务器工
①:服务器就是计算机,它有可能坏,有可能报废,有可能移动位置,∴地址可能会改变
②:如果服务器的地址改变了,那么,烧录到芯片中的P地址就是错的,需要重新烧录,大批量时十分麻烦
③域名是不会轻易改变的,只需要知道域名,就能获取服务器的P地址
"D:\esp8266\doc\24_HTTP\app\user\user_main.c"
上传后打开串口调试
串口调试内容
connected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1ESP8266_IP = 192.168.31.131
---- DomainName Analyse Succeed ----
IP_Server = 8.129.233.140
--------------- ESP8266_TCP_Connect_OK ---------------
ESP8266_WIFI_Send_OK
ESP8266_Receive_Data = HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Fri, 15 Jan 2021 08:50:27 GMT
Content-Type: text/html
Content-Length: 162
Connection: close
Location: https://www.rationmcu.com/elecjc/2397.html
Strict-Transport-Security: max-age=31536000<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
"D:\esp8266\doc\25_SNTP\app\user\user_main.c"
上传后打开串口调试
调试后信息
connected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1----------------------------------------------------
SNTP_TimeStamp = 1610729955SNTP_InternetTime = Fri Jan 15 16:59:15 2021
------------------------------------------------------------------------------------------------------------
SNTP_TimeStamp = 1610729956SNTP_InternetTime = Fri Jan 15 16:59:16 2021
oled模块自动获取当前网络时间,获取温湿度
"D:\esp8266\doc\27_JSON_C_FuncLib\app\user\user_main.c"
串口调试信息
JSON_Tree_Format:
{
"Shanghai":
{
"temp": "%s",
"humid": "%s"
},
"Shenzhen":
{
"temp": "%s",
"humid": %s
},
"result": "%s"
}
-------------------- 创建JSON树 -------------------
{
"Shanghai":
{
"temp": "30℃",
"humid": "30%RH"
},
"Shenzhen":
{
"temp": "35℃",
"humid": 50
},
"result": "Shenzhen is too hot!"
}
-------------------- 创建JSON树 --------------------------------------- 解析JSON树 -------------------
Shanghai:
temp:30℃
humid:30%RH
Shenzhen:
temp:35℃
humid:50
result:Shenzhen is too hot!-------------------- 解析JSON树 -------------------
mode : sta(e0:98:06:0f:04:3a)
add if0
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 13
cntconnected with yang1234, channel 6
dhcp client start...
ip:192.168.31.131,mask:255.255.255.0,gw:192.168.31.1
pm open,type:2 0
"D:\esp8266\doc\32_IIC_OLED\app\user\user_main.c"
void ICACHE_FLASH_ATTR user_init(void)
{
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
//--------------------------------
OLED_Init(); // OLED初始化
// OLED显示字符串
//-------------------------------------------------------------------------------------------------------------------------
OLED_ShowString(0,0,"Project="); // 从(0,0)开始显示
OLED_ShowString(64,0,"IIC_OLED"); // 从(64,0)开始显示 // 因为,【Project=】一共8个字符,横向上占用【64】个点
//-------------------------------------------------------------------------------------------------------------------------
// OLED显示【点分十进制_IP地址】
//-------------------------------------------------------------------------------------------------------------------------
u8 IP_Address[4];
IP_Address[0] = 192;
IP_Address[1] = 168;
IP_Address[2] = 4;
IP_Address[3] = 1;
// u8 IP_Address[4] = { 192,168,4,1 }; // 数组形式表示【点分十进制_IP地址】
OLED_ShowString(0,2,"IP:"); // 从(0,2)开始显示 // 因为【Project=IIC_OLED】在纵向上占用了【2】页(2*8个点)
OLED_ShowIP(24, 2, IP_Address); // 从(24,2)开始显示 // 因为,【IP:】一共3个字符,横向上占用【24】个点
//-------------------------------------------------------------------------------------------------------------------------
OLED_ShowString(0,4,"0123456789ABCDEFGHIJKLMN"); // 从(0,4)开始显示
// 因为【Project=IIC_OLED】【IP:192.168.4.1】在纵向上占用了【4】页(4*8个点)
}
27.对应33_SmartConfig_WeChat(微信配网)
8266配网的方式有很多,【网页配网】、【APP配网】、【微信配网】
如果想使用微信配网,调用配网函数之前,必须【#include"smartconfig.h"】
实现原理:
①: Smartconfig过程中,ESP8266开 sniffer启模式,监听它可以接收到的所有的网络数据(不论数据是否打算发送给8266)
②:用户通过【手机/电脑】广播发送【加密的SSD和 Password】信息
③:EP8266抓取并解密空中【SSID和password】信息,从而连接到wiFl
reconnect---- S_WIFI_STA_Connect=3-----------
---- ESP8266 Can't Connect to WIFI-----------
SC version: V2.5.4
scandone
scandone
scandone------ smartconfig_done ------
SC_STATUS_FIND_CHANNEL
---- Please Use WeChat to SmartConfig ------
连接wifi后打开文件,从安信可公众号配网
温湿度计加智能配网
因为在arduino烧录过,在flash_download_tools_v3.6.3一直烧录失败,开始按如下配置下载限选,发现下载成功后,WIFI模块不可用,发送AT命令没有任何反馈。
端口在74800波段显示如下:
load 0x40100000, len 25180, room 16
tail 12
chksum 0x90
ho 0 tail 12 room 4
load 0x3ffe8000, len 884, room 12
tail 8
chksum 0xfb
load 0x3ffe8380, len 2388, room 0
tail 4
chksum 0xe7
csum 0xe7
rf_cal[0] !=0x05,is 0xFFets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x40100000, len 25180, room 16
tail 12
chksum 0x90
ho 0 tail 12 room 4
load 0x3ffe8000, len 884, room 12
tail 8
chksum 0xfb
load 0x3ffe8380, len 2388, room 0
重新下载了如下合成的固件(4M Bytes大小):
出厂默认 AT 固件
网址:https://docs.ai-thinker.com/_export/xhtml/esp8266/sdk
直接下载地址: ai-thinker_esp8266_at_firmware_dout_v1.5.4.1-a_20171130.rar
天翼云下载地址:https://cloud.189.cn/t/bq2Urq2QBZry
烧录32位的即可,
发现开发板可以用了,哈哈
本文作者: 永生
本文链接: https://yys.zone/detail/?id=194
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
评论列表 (0 条评论)