ESPUSH 蘑菇云 ESP8266教程 之 打造自己的AT固件_第1页
ESPUSH 蘑菇云 ESP8266教程 之 打造自己的AT固件_第2页
ESPUSH 蘑菇云 ESP8266教程 之 打造自己的AT固件_第3页
ESPUSH 蘑菇云 ESP8266教程 之 打造自己的AT固件_第4页
ESPUSH 蘑菇云 ESP8266教程 之 打造自己的AT固件_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——ESPUSH蘑菇云ESP8266教程之打造自己的AT固件蘑菇云ESP8266开发课堂提高篇创立自己的超强AT固件

使用串口AT命令实现继电器开关

效果:AT+RELAY=1AT+RELAY=0AT+RELAY?

1,//查询指令

2,voidICACHE_FLASH_ATTRat_QueryRelay(uint8_tid){3,uint8_tstate=0x14,if(state){5,7,8,}

9,//AT固件的惯例是,输出OK或ERROR字符串结尾,便利外接MCU判断指令边界。10,11,}12,

13,//Setup指令,参数pPara为类似于=param,

14,voidICACHE_FLASH_ATTRat_setupRelay(uint8_tid,char*pPara){15,16,17,

//++pPara略过第一个“=〞字符if(atoi(++pPara)){

//假使参数不为0,控制输出高电平,否则输出低电平。at_response_ok();at_response(\);at_response(\);

6,}else{

18,19,20,21,22,23,}24,

}

gpio_output_set(RELAY_BIT,0,RELAY_BIT,0);gpio_output_set(0,RELAY_BIT,RELAY_BIT,0);

}else{

at_response_ok();

25,//射频参数初始化,请留空26,voiduser_rf_pre_init(void){}27,

28,//指令定义区,必需定义为全局变量或static变量。29,at_funcationTypeat_custom_cmd[]={30,31,};32,

33,voiduser_init(void){34,at_init();

35,at_port_print(\);36,//注册自定义指令

37,at_cmd_array_regist(38,//GPIO控制口功能定义。39,

PIN_FUNC_SELECT(RELAY_IO_NAME,RELAY_GPIO_FUNC);{\,5,NULL,at_QueryRelay,at_setupRelay,NULL},

使用串口AT命令实现三色灯控制

开启文档中,pwm章节

代码:

#include#include#include#include

voidICACHE_FLASH_ATTRcolor_change(uint32duty,uint8channel){}

voidICACHE_FLASH_ATTRat_setupGreen(uint8_tid,char*pPara){}

voidICACHE_FLASH_ATTRat_setupBlue(uint8_tid,char*pPara){

color_change(atoi(++pPara),2);//绿灯在channel2color_change(atoi(++pPara),0);//绿灯在channel2//假使Value==0,调整最低为1if(!duty){}

pwm_set_duty(duty,channel);pwm_start();

//按惯例,AT指令输出OKat_response_ok();

duty=1;

//切记务必包含at_custom.h

}

voidICACHE_FLASH_ATTRat_setupRed(uint8_tid,char*pPara){}

//射频参数初始化,请留空voiduser_rf_pre_init(void){}

voiduser_init(void){at_init();

at_port_print(\);

//指令定义区,必需定义为全局变量或static变量。staticat_funcationTypeat_custom_cmd[]={

{\,4,NULL,NULL,at_setupRed,NULL},{\,5,NULL,NULL,at_setupBlue,NULL},{\,6,NULL,NULL,at_setupGreen,NULL},color_change(atoi(++pPara),1);//绿灯在channel2

};

//注册自定义指令

at_cmd_array_regist(

//初始化彩灯控制,第一路为绿色,GPIO12,其次路为红色14,第三路为蓝色13}

//初始化彩灯亮度为1,最低亮度u32duty[3]={1,1,1};//设置彩灯pwm周期为1000

pwm_init(1000,duty,3,io_info);pwm_start();

uint32io_info[][3]={

{PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12,12},{PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14,14},{PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13,13},};

编译:

1,老规矩,AT固件需要增加编译参数

2,此处使用了pwm库函数,需要在app\\makefile文件LINKFLAGS_eagle.app.v6处新增

-lpwm,修改完后如下所示:

使用串口AT命令实现温湿度传感器的读取

蘑菇云专属开发板中的温湿度传感器使用了dht11,所以需要包含dht11的驱动文件,这里我们新增一个源文件处理这种状况。将dht.c与dht.h,分别置于user目录与include目录即告完成。完成后如下图所示:

代码释义:

#include#include

#include\//务必包含此头文件

#defineAT_DBG(fmt,...)do{\\

voidICACHE_FLASH_ATTRat_queryDHT(uint8_tid){

structsensor_reading*dhtValue=readDHT(0);if(!dhtValue->success){

at_response_error();

AT_DBG(\[%d],HUMIDITY:[%d]\\r\\n\,dhtValue->temperature,}else{

staticchar__debug_str__[128]={0};at_response(__debug_str__);

\\

\\

\\

os_sprintf(__debug_str__,fmt,##__VA_ARGS__);

}while(0)

dhtValue->humidity);}

//代码入口区

voiduser_rf_pre_init(void){}voiduser_init(void){

staticat_funcationTypeat_custom_cmd[]={

{\,6,NULL,at_queryDHT,NULL,NULL},};

at_init();

at_port_print(\);//注册自定义指令

at_cmd_array_regist(//初始化DHT11传感器,每5秒重新读取一次温湿度数据。DHTInit(SENSOR_DHT11,5000);}

}

at_response_ok();

编译:

老规矩,AT固件要配置编译参数。测试:

第一次还没到5秒时,error,其次次遂正常。

使用红外传感器感应人体活动,控制指示灯开关

#include//必需包含此头文件。#include#include

#include//GPIO管脚定义头文件#include

//以下中断处理函数不得加宏前缀ICACHE_FLASH_ATTRstaticvoidkey_intr_handler(void*intrarg){}

voidICACHE_FLASH_ATTRir_init(){

//配置中断处理函数

//GPIO中断处理函数,参考文档GPIO中断处理函数这一章节uint32gpio_status;

gpio_status=GPIO_REG_READ(GPIO_STATUS_ADDRESS);//clearinterruptstatus

GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS,gpio_status);//开灯,0.05秒,即50毫秒,然后灭

gpio_output_set(BIT12|BIT13|BIT14,0,BIT12|BIT13|BIT14,0);os_delay_us(1000*50);

gpio_output_set(0,BIT12|BIT13|BIT14,BIT12|BIT13|BIT14,0);

//GPIO操作,包含此头文件

ETS_GPIO_INTR_ATTACH(key_intr_handler,NULL);//临时关闭中断,相当于进入临界区ETS_GPIO_INTR_DISABLE();//配置IO0为GPIO使用

PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U,FUNC_GPIO0);//配置IO0为输入模式

gpio_output_set(0,0,0,BIT0);

//enableinterrupt,参考文档gpio_pin_intr_state_set

gpio_pin_intr_state_set(GPIO_ID_PIN(0),GPIO_PIN_INTR_NEGEDGE);//再次开启中断,相当于退出临界区ETS_GPIO_INTR_ENABLE();}

voidICACHE_FLASH_ATTRuser_rf_pre_init(void){}voidICACHE_FLASH_ATTRuser_init(void){at_init();

at_port_print(\);ir_init();//灭灯

//管脚功能选择,此处使用对应的GPIO口

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);//向对应IO口输出低电平,关闭3陆彩灯

gpio_output_set(0,BIT12|BIT13|BIT14,BIT12|BIT13|BIT14,0);}

使用定时器实现指示灯闪烁

#include//定时器变量在此头文件中#include#include

#include#include

//状态机,控制LED亮与灭staticuint8_tled_state;

voidICACHE_FLASH_ATTRcolor_flasher(void*timerarg){}

voidICACHE_FLASH_ATTRuser_rf_pre_init(void){}voidICACHE_FLASH_ATTRuser_init(void){//指令定义区,必需定义为全局变量或static变量。at_init();

at_port_print(\);//管脚功能选择,此处使用对应的GPIO口

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);//向对应IO口输出低电平,关闭3陆彩灯

gpio_output_set(0,BIT12|BIT13|BIT14,BIT12|BIT13|BIT14,0);

//首先定义定时器变量,此处定义为static便利一些staticos_timer_ttimer;//首先初始化timer变量

os_timer_disarm(//配置timer回调函数与参数

if(led_state){

//控制3路输出高电平

gpio_output_set(BIT12|BIT13|BIT14,0,BIT12|BIT13|BIT14,0);led_state=0;

//LED操作GPIO

}else{}

//控制3路GPIO输出低电平。

gpio_output_set(0,BIT12|BIT13|BIT14,BIT12|BIT13|BIT14,0);led_state=1;

os_timer_setfn(//设置每秒调用一次,且重复,即循环os_timer_arm(//初始化LED灭led_state=0;}

使用AT固件,连接云平台

1,下载SDK,地址/webv2/down_roms/espush_sdk/2,创立新的AT工程,命名为espush_at_01

3,将下载的sdk解压,libespush.a放到lib目录,espush.h放到app\\include目录4,user_main.c第一行参与#include\,代码中使用espush_register,即可连入

云平台。

5,修改app/Makefile文件段,参与-lespush,如pwm章节。6,编译烧录即可,注意老规矩,AT固件的编译参数配置。7,烧录完成后连入串口,使用AT+CWJAP等指令配置网络。

8,完成后下载App/webv2/down_apk/进行远程GPIO控制,先试试

GPIO5(继电器)?

使用串口AT指令接受按键输入

按键需要响应GPIO事件,官方的driver_lib目录下提供了key.c文件以驱动一般的按钮。1,在app下新建driver目录,并将key.c与key.h分别置于app下的driver与include\\driver

目录。

2,key.h有编译时的依靠bug,在key.h头部增加一行#include3,拷贝driver_lib\\driver的Makefile到app\\driver\\目录。4,并同时修改App\\Makefile文件:

Line51处,COMPONENTS_eagle.app.v6段,新增driver/libdriver.a,完成后如下:

Line24处,SUBDIRS段新增driver,完成后如下:

主文件代码如下:

#include#include#include#include#include\staticuint8_tled_state;

staticvoidICACHE_FLASH_ATTRbtn_pressed(void){

if(led_state){

gpio_output_set(BIT12|BIT13|BIT14,0,BIT12|BIT13|BIT14,0);

}

}

led_state=0;

gpio_output_set(0,BIT12|BIT13|BIT14,BIT12|BIT13|BIT14,0);led_state=1;

}else{

at_response_ok();

voidICACHE_FLASH_ATTRuser_rf_pre_init(void){}voidICACHE_FLASH_ATTRuser_init(void){at_init();

at_port_print(\);

staticstructkeys_paramkeys;

//1代表1个按钮,可同时驱动多个,只需定义多个数组元素即可。staticstructsingle_key_param*keys_param[1];//定义IO2为按钮,并定义按钮短按与长按的回调函数

keys_param[0]=key_init_single(2,PERIPHS_IO_MUX_GPIO2_U,FUNC_GPIO2,

NULL,btn_pressed);

//按钮数量1

keys.key_num=1;//按钮参数

keys.single_key=keys_param;//初始化按钮

key_init(//灭灯

//管脚功能选择,此处使用对应的GPIO口

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);//向对应IO口输出低电平,关闭3陆彩灯

gpio_output_set(0,BIT12|BIT13|BIT14,BIT12|BIT13|BIT14,0);//初始化LED状态机为熄灭状态led_state=0;}

使用串口AT指令控制GPIO16口的板载LED

ESP8266的GPIO16与其他IO口不同,需要区别对待。同样,官方的driver_lib目录下提供了gpio16.c文件以驱动GPIO16。以下步骤与上节课按钮驱动完全类同,照搬即可。5,在app下新建driver目录,并将gpio16.c与gpio16.h分别置于app下的driver与

include\\driver目录。

6,key.h有编译时的依靠bug,在key.h头部增加一行#include7,拷贝driver_lib的Makefile到app\\driver\\目录。8,并同时修改App\\Makefile文件:

Line51处,COMPONENTS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论