您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > ESPUSH蘑菇云ESP8266教程之打造自己的AT固件
蘑菇云ESP8266开发课堂提高篇创建自己的超强AT固件使用串口AT命令实现继电器开关效果:AT+RELAY=1AT+RELAY=0AT+RELAY?1,//查询指令2,voidICACHE_FLASH_ATTRat_QueryRelay(uint8_tid){3,uint8_tstate=0x1&GPIO_INPUT_GET(RELAY_PIN);4,if(state){5,at_response(ON);6,}else{7,at_response(OFF);8,}9,//AT固件的惯例是,输出OK或ERROR字符串结尾,方便外接MCU判断指令边界。10,at_response_ok();11,}12,13,//Setup指令,参数pPara为类似于=param,14,voidICACHE_FLASH_ATTRat_setupRelay(uint8_tid,char*pPara){15,//++pPara略过第一个“=”字符16,if(atoi(++pPara)){17,//如果参数不为0,控制输出高电平,否则输出低电平。18,gpio_output_set(RELAY_BIT,0,RELAY_BIT,0);19,}else{20,gpio_output_set(0,RELAY_BIT,RELAY_BIT,0);21,}22,at_response_ok();23,}24,25,//射频参数初始化,请留空26,voiduser_rf_pre_init(void){}27,28,//指令定义区,必须定义为全局变量或static变量。29,at_funcationTypeat_custom_cmd[]={30,{+RELAY,5,NULL,at_QueryRelay,at_setupRelay,NULL},31,};32,33,voiduser_init(void){34,at_init();35,at_port_print(\r\nready\r\n);36,//注册自定义指令37,at_cmd_array_regist(&at_custom_cmd[0],sizeof(at_custom_cmd)/sizeof(at_custom_cmd[0]));38,//GPIO控制口功能定义。39,PIN_FUNC_SELECT(RELAY_IO_NAME,RELAY_GPIO_FUNC);使用串口AT命令实现三色灯控制打开文档中,pwm章节代码:#includeosapi.h#includeat_custom.h//切记务必包含at_custom.h#includeeagle_soc.h#includepwm.hvoidICACHE_FLASH_ATTRcolor_change(uint32duty,uint8channel){//如果Value==0,调整最低为1if(!duty){duty=1;}pwm_set_duty(duty,channel);pwm_start();//按惯例,AT指令输出OKat_response_ok();}voidICACHE_FLASH_ATTRat_setupGreen(uint8_tid,char*pPara){color_change(atoi(++pPara),0);//绿灯在channel2}voidICACHE_FLASH_ATTRat_setupBlue(uint8_tid,char*pPara){color_change(atoi(++pPara),2);//绿灯在channel2}voidICACHE_FLASH_ATTRat_setupRed(uint8_tid,char*pPara){color_change(atoi(++pPara),1);//绿灯在channel2}//射频参数初始化,请留空voiduser_rf_pre_init(void){}voiduser_init(void){at_init();at_port_print(\r\nready\r\n);//指令定义区,必须定义为全局变量或static变量。staticat_funcationTypeat_custom_cmd[]={{+RED,4,NULL,NULL,at_setupRed,NULL},{+BLUE,5,NULL,NULL,at_setupBlue,NULL},{+GREEN,6,NULL,NULL,at_setupGreen,NULL},};//注册自定义指令at_cmd_array_regist(&at_custom_cmd[0],sizeof(at_custom_cmd)/sizeof(at_custom_cmd[0]));//初始化彩灯控制,第一路为绿色,GPIO12,第二路为红色14,第三路为蓝色13uint32io_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,最低亮度u32duty[3]={1,1,1};//设置彩灯pwm周期为1000pwm_init(1000,duty,3,io_info);pwm_start();}编译:1,老规矩,AT固件需要增加编译参数2,此处使用了pwm库函数,需要在app\makefile文件LINKFLAGS_eagle.app.v6处新增-lpwm,修改完后如下所示:使用串口AT命令实现温湿度传感器的读取蘑菇云专属开发板中的温湿度传感器使用了dht11,所以需要包含dht11的驱动文件,这里我们新增一个源文件处理这种情况。将dht.c与dht.h,分别置于user目录与include目录即告完成。完成后如下图所示:代码释义:#includeosapi.h#includeat_custom.h#includedht.h//务必包含此头文件#defineAT_DBG(fmt,...)do{\staticchar__debug_str__[128]={0};\os_sprintf(__debug_str__,fmt,##__VA_ARGS__);\at_response(__debug_str__);\}while(0)voidICACHE_FLASH_ATTRat_queryDHT(uint8_tid){structsensor_reading*dhtValue=readDHT(0);if(!dhtValue-success){at_response_error();}else{AT_DBG(TEMPERATURE:[%d],HUMIDITY:[%d]\r\n,dhtValue-temperature,dhtValue-humidity);at_response_ok();}}//代码入口区voiduser_rf_pre_init(void){}voiduser_init(void){staticat_funcationTypeat_custom_cmd[]={{+RELAY,6,NULL,at_queryDHT,NULL,NULL},};at_init();at_port_print(\r\nready\r\n);//注册自定义指令at_cmd_array_regist(&at_custom_cmd[0],sizeof(at_custom_cmd)/sizeof(at_funcationType));//初始化DHT11传感器,每5秒重新读取一次温湿度数据。DHTInit(SENSOR_DHT11,5000);}编译:老规矩,AT固件要配置编译参数。测试:第一次还没到5秒时,error,第二次遂正常。使用红外传感器感应人体活动,控制指示灯开关#includeets_sys.h//必须包含此头文件。#includeosapi.h#includeat_custom.h#includeeagle_soc.h//GPIO管脚定义头文件#includegpio.h//GPIO操作,包含此头文件//以下中断处理函数不得加宏前缀ICACHE_FLASH_ATTRstaticvoidkey_intr_handler(void*intrarg){//GPIO中断处理函数,参考文档GPIO中断处理函数这一章节uint32gpio_status;gpio_status=GPIO_REG_READ(GPIO_STATUS_ADDRESS);//clearinterruptstatusGPIO_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);}voidICACHE_FLASH_ATTRir_init(){//配置中断处理函数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_setgpio_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(\r\nready\r\n);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);}使用定时器实现指示灯闪烁#includeos_type.h//定时器变量在此头文件中#includeosapi.h#includeat_custom.h#includeeagle_soc.h#includegpio.h//LED操作GPIO//状态机,控制LED亮与灭staticuint8_tled_state;voidICACHE_FLASH_ATTRcolor_flasher(void*timerarg){if(led_state){//控制3路输出高电平gpio_output_set(BIT12|BIT13|BIT14,0,BIT12|BIT13|BIT14,0);led_state=0;}else{//控制3路GPIO输出低电平。gpio_output_set(0,BIT12|BIT13|BIT14,BIT12|BIT13|BIT14,0);led_sta
本文标题:ESPUSH蘑菇云ESP8266教程之打造自己的AT固件
链接地址:https://www.777doc.com/doc-2872448 .html