首页 > 其他分享 >ESP8266

ESP8266

时间:2025-01-18 13:31:25浏览次数:3  
标签:return ESP8266 temp int else char printf

XCOSnTh平台的获取如下 

XCOSnTh-MCU-Lib-CSDN博客https://blog.csdn.net/stars_A_B_C/article/details/145224971?spm=1001.2014.3001.5501https://blog.csdn.net/stars_A_B_C/article/details/145224971?spm=1001.2014.3001.5501https://blog.csdn.net/stars_A_B_C/article/details/145224971?spm=1001.2014.3001.5501接口规约

static void (*ESP8266USARTSend)(unsigned char ch)=0;
static int (*ESP8266POP)(void)=0;
static void (*ESP8266RxByte)(int(*printf)(const char* format, ...),unsigned char byte)=0;
static void XCESP8266InitExe(AutoCallObj obj,void *cThis)
{//ESP8266自动初始化:适配接口..............................................................................
	ESP8266USARTSend=ShellRegisterFormFind("ESP8266","USARTSend");
	ESP8266POP=ShellRegisterFormFind("ESP8266","Pop");
	ESP8266RxByte=ShellRegisterFormFind("ESP8266","RxByte");
}
AutoCall_InitDef(0,XCESP8266Init,XCESP8266InitExe,"");

接口头文件

#ifndef  __BSP_ESP8266_H
#define	 __BSP_ESP8266_H
#include "at32f435_437.h"
/******************************** ESP8266 连接引脚定义 ***********************************/
#define      macESP8266_RST_CLK                               CRM_GPIOA_PERIPH_CLOCK   
#define      macESP8266_RST_PORT                              GPIOA
#define      macESP8266_RST_PIN                               GPIO_PINS_5
#define      macESP8266_USART_BAUD_RATE                       115200
#define      macESP8266_TX_PIN_MUX_NUM                        GPIO_MUX_8
#define      macESP8266_RX_PIN_MUX_NUM                        GPIO_MUX_8
#define      macESP8266_TX_PIN_SOURCE                         GPIO_PINS_SOURCE9
#define      macESP8266_RX_PIN_SOURCE                         GPIO_PINS_SOURCE8
#define      macESP8266_USARTx                                UART5
#define      macESP8266_USART_CLK                             CRM_UART5_PERIPH_CLOCK
#define      macESP8266_USART_GPIO_CLK                        CRM_GPIOB_PERIPH_CLOCK   
#define      macESP8266_USART_TX_PORT                         GPIOB   
#define      macESP8266_USART_TX_PIN                          GPIO_PINS_9
#define      macESP8266_USART_RX_PORT                         GPIOB
#define      macESP8266_USART_RX_PIN                          GPIO_PINS_8
#define      macESP8266_USART_IRQ                             UART5_IRQn
#define      macESP8266_USART_INT_FUN                         UART5_IRQHandler
#endif


接口的实现

#include "esp8266serial.h"
static void ESP8266_GPIO_Config ( void )
{//连接esp8266的io配置
  gpio_init_type gpio_init_struct;

	/* 配置 RST 引脚*/	
  crm_periph_clock_enable(macESP8266_RST_CLK, TRUE);
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;	
  gpio_init_struct.gpio_pins = macESP8266_RST_PIN;
  gpio_init(macESP8266_RST_PORT, &gpio_init_struct);											    

}
static void ESP8266_USART_Config ( void )
{//esp8266的串口配置
  gpio_init_type gpio_init_struct;
  
	crm_periph_clock_enable(macESP8266_USART_CLK, TRUE);
	crm_periph_clock_enable(macESP8266_USART_GPIO_CLK, TRUE);
  gpio_default_para_init(&gpio_init_struct);
	
  gpio_pin_mux_config(macESP8266_USART_TX_PORT, macESP8266_TX_PIN_SOURCE, macESP8266_TX_PIN_MUX_NUM);
	gpio_pin_mux_config(macESP8266_USART_RX_PORT, macESP8266_RX_PIN_SOURCE, macESP8266_RX_PIN_MUX_NUM);
	
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  gpio_init_struct.gpio_pins = macESP8266_USART_TX_PIN;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(macESP8266_USART_TX_PORT, &gpio_init_struct);

  gpio_init_struct.gpio_pins = macESP8266_USART_RX_PIN;
  gpio_init(macESP8266_USART_RX_PORT, &gpio_init_struct); 
	

  usart_init(macESP8266_USARTx, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
	usart_parity_selection_config(macESP8266_USARTx,USART_PARITY_NONE);
	
	nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  nvic_irq_enable(macESP8266_USART_IRQ, 0,0);

  usart_transmitter_enable(macESP8266_USARTx, TRUE);
  usart_receiver_enable(macESP8266_USARTx, TRUE);
  	
	usart_interrupt_enable(macESP8266_USARTx,USART_RDBF_INT, TRUE);//使能接收中断
	//usart_interrupt_enable(macESP8266_USARTx,USART_IDLE_INT, TRUE);//使能接收空闲中断

  usart_enable(macESP8266_USARTx, TRUE);
	
}
#include"XCOSnTh.h"
static void ESP8266InitExe(AutoCallObj obj,void *cThis)
{//ESP8266自动初始化
	ESP8266_GPIO_Config (); 
  ESP8266_USART_Config (); 
	gpio_bits_set ( macESP8266_RST_PORT, macESP8266_RST_PIN );
}
AutoCall_InitDef(0,ESP8266Init,ESP8266InitExe,"");

XCDefinieFIFO(esp8266,1024);
void macESP8266_USART_INT_FUN ( void )
{	//串口接收中断
	uint8_t uc;	
  if(usart_flag_get(macESP8266_USARTx, USART_RDBF_FLAG) != RESET)
  {
		uc = usart_data_receive( macESP8266_USARTx ); 
		esp8266_push(uc);//将接收的数据放入到队列中
  }
	
	if ( usart_flag_get(macESP8266_USARTx, USART_IDLEF_FLAG) == SET )                                      
	{
		uc = usart_data_receive( macESP8266_USARTx ); 
		esp8266_push(uc);//将接收的数据放入到队列中
  }	 
}
static int ESP8266pop()
{
	return esp8266_pop();
}
RegisterItemDef(ESP8266, Pop, "ESP8266串口接收", ESP8266pop);//【必须实现】
static void ESP8266Send(unsigned char ch)
{
	usart_data_transmit(macESP8266_USARTx,ch);
	while( usart_flag_get(macESP8266_USARTx, USART_TDBE_FLAG) == RESET );//等待发送完成
}
RegisterItemDef(ESP8266, USARTSend, "ESP8266串口发送", ESP8266Send);//【必须实现】
static void ESP8266RxByte(int(*printf)(const char* format, ...),unsigned char byte)
{//捕捉透传数据:无需存入FIFO这个函数不是在中断中被调用的,可直接处理数据
	//数据分析
	//开关灯、设置PWM等程序
	printf("%c",byte);
}
RegisterItemDef(ESP8266, RxByte, "ESP8266t透传接收的数据", ESP8266RxByte);//【必须实现】

头文件

#ifndef  ESP8266_H
#define	 ESP8266_H
/*ESP8266发送数据/发送透传数据*/
extern void ESP8266Transmit(int(*printf)(const char* format, ...),char *str);
/*退出透传模式*/
extern int ESP8266Exit(int(*printf)(const char* format, ...),int t);
/*模块复位*/
extern int AT_RST(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);
/*扫描wifi*/
extern int AT_CWLAP(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);//扫描当前可用的wifi
/*连接wifi*/
extern int AT_CWJAP_Connect(int(*printf)(const char* format, ...),char *wifiName/*名字*/,char *pwd/*密码*/,char **result,unsigned int nop_timeout);
/*查询wifi的连接状态*/
extern int AT_CWJAP_Query(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);
/*查看当前的IP地址*/
extern int AT_CIFSR(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);
/*查看模块的当前的工作模式:AP,station,AP+station*/
extern int AT_CWMODE_Query(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);
/*设置模块的工作模式:AP,station,AP+station*/
extern int AT_CWMODE(int(*printf)(const char* format, ...),int mode,char **result,unsigned int nop_timeout);
/*mode=1多路连接模式 mode=0单路连接模式*/
extern int AT_CIPMUX(int(*printf)(const char* format, ...),int mode,char **result,unsigned int nop_timeout);
/*创建服务器*/
extern int AT_CIPSERVER(int(*printf)(const char* format, ...),int mode,unsigned short port,char **result,unsigned int nop_timeout);
/*查看当前的连接状态,如果有tcp连接就会展示出来*/
extern int AT_CIPSTATUS(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);
/*连接服务器*/
extern int AT_CIPSTART(int(*printf)(const char* format, ...),char *tcpudp/*连接类型*/,char *ip/*服务器的ip*/,unsigned short port/*服务器的端口*/,char **result,unsigned int nop_timeout);
/*设置传输模式:1透传模式,0普通模式*/
extern int AT_CIPMODE(int(*printf)(const char* format, ...),int mode,char **result,unsigned int nop_timeout);
/*发送数据/进入透传模式*/
extern int AT_CIPSEND(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout);
/*完整的流程之连接服务器*/
extern void ESP8266connect(int(*printf)(const char* format, ...),char *wifiname,char *pwd,char *tcpudpType,char *serverIP,unsigned short servsrPort);
/*完整的流程之进入透传模式*/
extern void ESP8266EntryTransmit(int(*printf)(const char* format, ...));
#endif


 ESP8266程序

#include "esp8266.h"
#include "stdlib.h"
#include "stdio.h"
#include"XCOSnTh.h"
static char ESP8266Buff[1024];
static int ESP8266RxCount=0;
static char ESP8266CMD[1024];
static char ESP8266RxFlag=0;
/*
//手机开热点(此时wifi和网络可正常使用),模块自动连接手机的热点,然后与模块通信
重要说明:模块与服务器建立连接以后,工作在透传模式,如果网络不稳定,会自动连接,以保持连接状态
与模块相关的命令
AT+GMR:查看模块的固件版本信息
AT+RST:重启模块
AT+RESTORE:恢复出厂设置
AT+CWMODE?:查询当前工作模式
AT+CWMODE:设置模块的工作模式
与wifi连接相关的命令
AT+CWLAP:扫描可用的wifi(扫描当前可用的 AP)
AT+CWQAP:断开与wifi的连接(断开与 AP 的连接)
AT+CWJAP:链接wifi(连接 AP)
AT+CWJAP?:查看模块与wifi的连接情况
AT+CIFSR: 查询本地IP地址
AT_CWMODE?:查看模块的工作模式
AT+CWMODE:设置模块的工作模式:AP,station,AP+station
与tcp相关的命令
AT+CIPMUX:mode=1多路连接模式 mode=0单路连接模式-【注:在做服务器的时候,需要使用多路连接】
AT+CIPSERVER:创建服务器
AT+CIPSTATUS:查看当前的连接状态,如果有tcp连接就会展示出来
AT+CIPSTART:连接服务器
AT+CIPMODE:进入透传模式 AT+CIPMODE=0表示普通模式,AT+CIPMODE=1表示透传模式
AT+CIPSEND:发送数据
======================================================================================================
1.station模式:连接其他热点
AT+CWMODE=1
AT+RST   //重启生效配置
AT+CWLAP //查询当前WIFI
AT+CWJAP="WIFI名","WIFI密码"//连接WIFI
AT+CIFSR  //查询IP
AT+CIPMUX=1  //建立多连接
AT+CIPSERVER=1,8080  //建立服务号为8080


2.AP模式:自身创建热点
AT+CWMODE=2
AT+RST   //重启生效配置
AT+CWSAP_DEF="名字","密码",5,4 //配置WIFI名和密码
AT+CIFSR  //查询IP
AT+CIPMUX=1  //建立多连接
AT+CIPSERVER=1,8080  //建立服务号为8080

3.AP+station模式
AT+CWMODE=3
AT+RST   //重启生效配置
AT+CWLAP //查询当前WIFI
AT+CWJAP="WIFI名","WIFI密码"//连接WIFI
AT+CIFSR  //查询IP
AT+CIPMUX=1  //建立多连接
AT+CIPSERVER=1,8080  //建立服务号为8080
*/
static void (*ESP8266USARTSend)(unsigned char ch)=0;
static int (*ESP8266POP)(void)=0;
static void (*ESP8266RxByte)(int(*printf)(const char* format, ...),unsigned char byte)=0;
static void XCESP8266InitExe(AutoCallObj obj,void *cThis)
{//ESP8266自动初始化:适配接口..............................................................................
	ESP8266USARTSend=ShellRegisterFormFind("ESP8266","USARTSend");
	ESP8266POP=ShellRegisterFormFind("ESP8266","Pop");
	ESP8266RxByte=ShellRegisterFormFind("ESP8266","RxByte");
}
AutoCall_InitDef(0,XCESP8266Init,XCESP8266InitExe,"");

/*********************************************************************************************************************/
/*********************************************************************************************************************/
/*********************************************************************************************************************/

static void ESP8266RxReset()
{
	ESP8266RxCount=0;
}
static char* ESP8266RxProcess(int (*pop)(void),int(*printf)(const char* format, ...))
{
	int value=0;
	static char d1=0,d2=0,d3=0,d4=0,d5=0,d6=0,d7=0,d8=0,d9=0;
	if(pop)
	{
		value=pop();
		if(value>=0)
		{
			if(ESP8266RxCount<sizeof(ESP8266Buff))
			{
				ESP8266Buff[ESP8266RxCount++]=value;
			}
			d1=d2;d2=d3;d3=d4;d4=d5;d5=d6;d6=d7;d7=d8;d8=d9;d9=value;
			if((d4=='\r')&&
				(d5=='\n')&&
				(d6=='O')&&
				(d7=='K')&&
				(d8=='\r')&&
				(d9=='\n')
				)/*一条json里面不能有换行*/
			{
				if(ESP8266RxCount<sizeof(ESP8266Buff))
				{
					ESP8266Buff[ESP8266RxCount++]=0;
				}
				ESP8266RxCount=0;
				if(printf)printf("\r\n【XC:OK】\r\n");
				return ESP8266Buff;
			}
			else if((d1=='\r')&&
				(d2=='\n')&&
				(d3=='E')&&
				(d4=='R')&&
				(d5=='R')&&
				(d6=='O')&&
				(d7=='R')&&
				(d8=='\r')&&
				(d9=='\n')
			)
			{
				if(printf)printf("\r\n【XC:ERROR】\r\n");
				if(ESP8266RxCount<sizeof(ESP8266Buff))
				{
					ESP8266Buff[ESP8266RxCount++]=0;
				}
				if(printf)printf("\r\n%s",ESP8266Buff);
				ESP8266RxCount=0;
				return(char*)0xFFFFFFFF;
			}
		}
	}
	return 0;
}
static void ESP8266SendCMD(char *cmd,void (*usartSend)(unsigned char ch))
{
	while(*cmd)
	{
		if(usartSend)
		{
			usartSend(*cmd++);
		}
	}
}
void ESP8266Transmit(int(*printf)(const char* format, ...),char *str)
{
	if(ESP8266USARTSend)
	{
		ESP8266SendCMD(str,ESP8266USARTSend);
		printf("\r\n");
	}
	else
	{
		printf("\r\n接口未实现");
	}
}
static void ESP8266Exe(AutoCallObj obj,void *cThis)
{//自动轮询:调试代码..............................................................................
	#if(1)
	#if(0)
	if(ESP8266POP)
	{
		int value=ESP8266POP();
		if(value>=0)
		{
			obj->printf("%c",value);
			{//debug调试看实际收到的数据
				static int i=0;
				if(i<sizeof(ESP8266Buff))
				{
					ESP8266Buff[i++]=value;
				}
			}
		}
	}
	#else
	if(ESP8266POP)
	{
		if(ESP8266RxFlag==0)
		{//命令模式的接收数据处理
			char *result=0;
			result=ESP8266RxProcess(ESP8266POP,obj->printf);
			if((result!=0)&&(result!=(char*)0xFFFFFFFF))
			{
				obj->printf("%s",result);
			}
		}
		else
		{//透传接收的数据处理
			int value=ESP8266POP();
			if(value>=0)
			{
				if(ESP8266RxByte)
				{
					ESP8266RxByte(obj->printf,value);
				}
			}
		}
	}
	#endif
	#endif
}
AutoCall_WhileDef(0,esp8266exe,ESP8266Exe,"");
static int CmdProcess_esp8266(CmdObj obj, char* str, int len)
{//调试代码
	int i=0;
	str[len++]='\r';
	str[len++]='\n';
	str[len]=0;;
	ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
	ESP8266Transmit(obj->printf,str);
	return 1;
}
CmdDef(esp,0,CmdProcess_esp8266,"");
static int CmdProcess_esp8266s(CmdObj obj, char* str, int len)
{//调试代码
	int i=0;
	str[len]=0;;
	ESP8266Transmit(obj->printf,str);
	return 1;
}
CmdDef(esps,0,CmdProcess_esp8266s,"");
/*********************************************************************************************************************/
/*********************************************************************************************************************/
/*********************************************************************************************************************/
int ESP8266Exit(int(*printf)(const char* format, ...),int t)
{//退出透传模式
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		ESP8266SendCMD("+++",ESP8266USARTSend);//发送命令
		while(t--){__nop();__nop();};
		unsigned int nop_timeout=10000000;
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		ESP8266SendCMD("AT+GMR\r\n",ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				printf("\r\n....");
				return 0;
			}
			else
			{//退出透传成功
				ESP8266RxFlag=0;
				printf("\r\nok exit");
				return 1;
			}
		}
	}
	else
	{
		return -2;//接口未实现
	}
}
static int CmdProcess_esp_exit(CmdObj obj, char* str, int len)
{
	if(ESP8266Exit(obj->printf,10000000)==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_exit,0,CmdProcess_esp_exit,"<退出透传>");
/*********************************************************************************************************************/
/*********************************************************************************************************************/
/*********************************************************************************************************************/
int AT_RST(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)
{//模块复位
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		ESP8266SendCMD("AT+RST\r\n",ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				return 0;
			}
			else
			{//接收到ok
				*result=temp;
				return 1;
			}
		}
	}
	else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_rst(CmdObj obj, char* str, int len)
{
	char *p=0;
	int temp=AT_RST(obj->printf,&p,10000000);
	if(temp==1)
	{
		obj->printf("\r\n%s",p);
	}
	else if(temp==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_rst,0,CmdProcess_esp_rst,"模块复位");
int AT_CWLAP(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)//扫描当前可用的wifi
{//扫描wifi
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		ESP8266SendCMD("AT+CWLAP\r\n",ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				return 0;
			}
			else
			{//接收到ok
				*result=temp;
				return 1;
			}
		}
	}
	else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cwlap(CmdObj obj, char* str, int len)
{
	char *p=0;
	int temp=AT_CWLAP(obj->printf,&p,10000000);
	if(temp==1)
	{
		obj->printf("\r\n%s",p);
	}
	else if(temp==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_wifiscan,0,CmdProcess_esp_cwlap,"扫描周围的WIFI");
int AT_CWJAP_Connect(int(*printf)(const char* format, ...),char *wifiName/*名字*/,char *pwd/*密码*/,char **result,unsigned int nop_timeout)
{//连接wifi
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		sprintf(ESP8266CMD,"AT+CWJAP=\"%s\",\"%s\"\r\n",wifiName,pwd);
		ESP8266SendCMD(ESP8266CMD,ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				return 0;
			}
			else
			{//接收到ok
				*result=temp;
				return 1;
			}
		}
	}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cwjap_c(CmdObj obj, char* str, int len)
{
	int temp;
	char *p=0,*p1=str,*p2;
	int i=0;
	str[len]=0;
	for(i=0;i<len;i++)
	{
		if(str[i]==' ')
		{
			str[i]=0;
			p2=&str[i+1];
			break;
		}
	}
	//temp=AT_CWJAP_Connect(obj->printf,"ChinaNet-gYUP","g6hv5gbx",&p,100000000);
	temp=AT_CWJAP_Connect(obj->printf,p1,p2,&p,100000000);
	if(temp==1)
	{
		obj->printf("\r\n%s",p);
	}
	else if(temp==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_wificonnect,0,CmdProcess_esp_cwjap_c,"连接WIFI");
int AT_CWJAP_Query(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)
{//查看当前wifi连接的状态
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		ESP8266SendCMD("AT+CWJAP?\r\n",ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				return 0;
			}
			else
			{//接收到ok
				*result=temp;
				return 1;
			}
		}
	}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cwjap_q(CmdObj obj, char* str, int len)
{
	char *p=0;
	int  temp;
	temp=AT_CWJAP_Query(obj->printf,&p,100000000);
	if(temp==1)
	{
		obj->printf("\r\n%s",p);
	}
	else if(temp==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_wifistate,0,CmdProcess_esp_cwjap_q,"查看当前wifi状态");
int AT_CIFSR(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)
{//查看当前的ip地址和mac值
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		ESP8266SendCMD("AT+CIFSR\r\n",ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				return 0;
			}
			else
			{//接收到ok
				*result=temp;
				return 1;
			}
		}
	}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cifsr(CmdObj obj, char* str, int len)
{
	char *p=0;
	int temp=AT_CIFSR(obj->printf,&p,100000000);
	if(temp==1)
	{
		obj->printf("\r\n%s",p);
	}
	else if(temp==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_ip,0,CmdProcess_esp_cifsr,"查看当前IP");
int AT_CWMODE_Query(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)
{//查看模块的当前工作模式
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		ESP8266SendCMD("AT+CWMODE?\r\n",ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				return 0;
			}
			else
			{//接收到ok
				*result=temp;
				return 1;
			}
		}
	}else{return -2;/*接口未实现*/}
}


static int CmdProcess_esp_cwmode_q(CmdObj obj, char* str, int len)
{
	char *p=0;
	int temp=AT_CWMODE_Query(obj->printf,&p,100000000); 
	if(temp==1)
	{
		obj->printf("\r\n%s",p);
	}
	else if(temp==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_mode_q,0,CmdProcess_esp_cwmode_q,"查看模块的工作模式");
int AT_CWMODE(int(*printf)(const char* format, ...),int mode,char **result,unsigned int nop_timeout)
{//设置模块的工作模式:AP,station,AP+station
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		sprintf(ESP8266CMD,"AT+CWMODE=%d\r\n",mode);
		ESP8266SendCMD(ESP8266CMD,ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				return 0;
			}
			else
			{//接收到ok
				*result=temp;
				return 1;
			}
		}
	}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cwmode(CmdObj obj, char* str, int len)
{
	char *p=0;
	int mode;
	int temp;
	str[len]=0;
	mode=atoi(str);
	temp=AT_CWMODE(obj->printf,mode,&p,100000000);
	if(temp==1)
	{
		obj->printf("\r\n%s",p);
	}
	else if(temp==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_mode,0,CmdProcess_esp_cwmode,"设置模块的工作模式ap,station,ap+station");
int AT_CIPMUX(int(*printf)(const char* format, ...),int mode,char **result,unsigned int nop_timeout)
{//mode=1多路连接模式 mode=0单路连接模式
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		sprintf(ESP8266CMD,"AT+CIPMUX=%d\r\n",mode);
		ESP8266SendCMD(ESP8266CMD,ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				return 0;
			}
			else
			{//接收到ok
				*result=temp;
				return 1;
			}
		}
	}else{return -2;/*接口未实现*/}
}

static int CmdProcess_esp_cipmux(CmdObj obj, char* str, int len)
{
	char *p=0;
	int mode;
	int temp;
	str[len]=0;
	mode=atoi(str);
	temp=AT_CIPMUX(obj->printf,mode,&p,100000000);
	if(temp==1)
	{
		obj->printf("\r\n%s",p);
	}
	else if(temp==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_mux,0,CmdProcess_esp_cipmux,"设置单路或多路连接");
int AT_CIPSERVER(int(*printf)(const char* format, ...),int mode,unsigned short port,char **result,unsigned int nop_timeout)
{//创建服务器
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		if(port!=0)
		{
			sprintf(ESP8266CMD,"AT+CIPSERVER=%d,%d\r\n",mode,port);
		}
		else
		{
			sprintf(ESP8266CMD,"AT+CIPSERVER=%d\r\n",mode);
		}
		ESP8266SendCMD(ESP8266CMD,ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				return 0;
			}
			else
			{//接收到ok
				*result=temp;
				return 1;
			}
		}
	}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cipserver(CmdObj obj, char* str, int len)
{
	char *p=0,*p1=str,*p2;
	int i=0;
	int temp;
	str[len]=0;
	for(i=0;i<len;i++)
	{
		if(str[i]==' ')
		{
			str[i]=0;
			p2=&str[i+1];
			break;
		}
	}
	temp=AT_CIPSERVER(obj->printf,atoi(p1),atoi(p2),&p,100000000);
	if(temp==1)
	{
		obj->printf("\r\n%s",p);
	}
	else if(temp==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_server,0,CmdProcess_esp_cipserver,"创建服务器");
int AT_CIPSTATUS(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)
{//查看当前的连接状态,如果有tcp连接就会展示出来
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		ESP8266SendCMD("AT+CIPSTATUS\r\n",ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				return 0;
			}
			else
			{//接收到ok
				*result=temp;
				return 1;
			}
		}
	}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cipstatus(CmdObj obj, char* str, int len)
{
	char *p=0;
	int temp;
	temp=AT_CIPSTATUS(obj->printf,&p,10000000);
	if(temp==1)
	{
		obj->printf("\r\n%s",p);
	}
	else if(temp==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_netstate,0,CmdProcess_esp_cipstatus,"查看当前的连接状态");
int AT_CIPSTART(int(*printf)(const char* format, ...),char *tcpudp/*连接类型*/,char *ip/*服务器的ip*/,unsigned short port/*服务器的端口*/,char **result,unsigned int nop_timeout)
{//连接服务器
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		sprintf(ESP8266CMD,"AT+CIPSTART=\"%s\",\"%s\",%d\r\n",tcpudp,ip,port);
		ESP8266SendCMD(ESP8266CMD,ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				return 0;
			}
			else
			{//接收到ok
				*result=temp;
				return 1;
			}
		}
	}else{return -2;/*接口未实现*/}
}
static int CmdProcess_cipstart(CmdObj obj, char* str, int len)
{
	char *p=0,*p1=str,*p2,*p3=0;
	int i=0,j=0;
	int temp;
	str[len]=0;
	for(i=0;i<len;i++)
	{
		if(str[i]==' ')
		{
			str[i]=0;
			if(j==0)
			{
				j=1;
				p2=&str[i+1];
			}
			else if(j==1)
			{
				j=2;
				p3=&str[i+1];
			}
		}
	}
	//temp=AT_CWJAP_Connect(obj->printf,"ChinaNet-gYUP","g6hv5gbx",&p,100000000);
	temp=AT_CIPSTART(obj->printf,p1,p2,atoi(p3),&p,100000000);
	if(temp==1)
	{
		obj->printf("\r\n%s",p);
	}
	else if(temp==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_netconnect,0,CmdProcess_cipstart,"连接服务器");

int AT_CIPMODE(int(*printf)(const char* format, ...),int mode,char **result,unsigned int nop_timeout)
{//设置传输模式:1透传模式,0普通模式
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		sprintf(ESP8266CMD,"AT+CIPMODE=%d\r\n",mode);
		ESP8266SendCMD(ESP8266CMD,ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				return 0;
			}
			else
			{//接收到ok
				*result=temp;
				return 1;
			}
		}
	}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cipmode(CmdObj obj, char* str, int len)
{
	char *p=0;
	int mode;
	int temp;
	str[len]=0;
	mode=atoi(str);
	temp=AT_CIPMODE(obj->printf,mode,&p,100000000);
	if(temp==1)
	{
		obj->printf("\r\n%s",p);
	}
	else if(temp==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_netmode,0,CmdProcess_esp_cipmode,"设置传输模式,0为普通模式,1为透传模式");
int AT_CIPSEND(int(*printf)(const char* format, ...),char **result,unsigned int nop_timeout)
{//发送数据
	if((ESP8266POP!=0)&&(ESP8266USARTSend!=0))
	{
		char *temp=0;
		ESP8266RxReset();//每次发送命令前都要清除一次保证接收的数据是正确的
		ESP8266SendCMD("AT+CIPSEND\r\n",ESP8266USARTSend);//发送命令
		while(1)
		{
			temp=ESP8266RxProcess(ESP8266POP,printf);//接收数据
			if(temp==0)
			{//接收中
				nop_timeout--;
				if(nop_timeout==0)
				{
					printf("\r\ntime out nop");
					return -1;//超时
				}
			}//暂未收到返回
			else if(temp==(char*)0xFFFFFFFF)//收到错误的返回
			{//接收到error
				return 0;
			}
			else
			{//接收到ok
				ESP8266RxFlag=1;
				*result=temp;
				return 1;
			}
		}
	}else{return -2;/*接口未实现*/}
}
static int CmdProcess_esp_cipsend(CmdObj obj, char* str, int len)
{
	char *p=0;
	int temp=AT_CIPSEND(obj->printf,&p,10000000);
	if(temp==1)
	{
		obj->printf("\r\n%s",p);
	}
	else if(temp==-2)
	{
		obj->printf("\r\n接口未实现");
	}
	return 1;
}
CmdDef(esp_send,0,CmdProcess_esp_cipsend,"发送数据");
/*********************************************************************************************************************/
/*********************************************************************************************************************/
/*********************************************************************************************************************/
void ESP8266connect(int(*printf)(const char* format, ...),char *wifiname,char *pwd,char *tcpudpType,char *serverIP,unsigned short servsrPort)
{//完整的流程之连接服务器
	char *result=0;
	int temp;
	ESP8266Exit(printf,10000000);//退出透传模式
	{//复位
		while(1)
		{
			temp=AT_RST(printf,&result,10000000);
			if(temp==-1)
			{//超时
				continue;//继续连接wifi
			}
			else if(temp==0)
			{//收到ERROR:需要检查程序
			}
			else if(temp==1)
			{//收到OK
				printf("\r\n退出透传模式成功");
				break;
			}
			else if(temp==-2)
			{
				printf("\r\n接口未实现");
				break;
			}
			else{/*没有这种情况*/}
		}
	}
	{//连接wifi
		while(1)
		{
			temp=AT_CWJAP_Connect(printf,wifiname,pwd,&result,10000000);
			if(temp==-1)
			{//超时
				continue;//继续连接wifi
			}
			else if(temp==0)
			{//收到ERROR:需要检查程序
			}
			else if(temp==1)
			{//收到OK
				printf("\r\nwifi连接成功");
				break;
			}
			else if(temp==-2)
			{
				printf("\r\n接口未实现");
				break;
			}
			else{/*没有这种情况*/}
		}
	}
	{//设置模块看的工作 模式为1:station
		while(1)
		{
			temp=AT_CWMODE(printf,1,&result,10000000);
			if(temp==-1)
			{//超时
				continue;//继续连接wifi
			}
			else if(temp==0)
			{//收到ERROR:需要检查程序
			}
			else if(temp==1)
			{//收到OK
				printf("\r\n设置工作模式成功");
				break;
			}
			else if(temp==-2)
			{
				printf("\r\n接口未实现");
				break;
			}
			else{/*没有这种情况*/}
		}
	}
	{//设置多路复用:单路
		while(1)
		{
			temp=AT_CIPMUX(printf,0,&result,10000000);
			if(temp==-1)
			{//超时
				continue;//继续连接wifi
			}
			else if(temp==0)
			{//收到ERROR:需要检查程序
			}
			else if(temp==1)
			{//收到OK
				printf("\r\n设置单路成功");
				break;
			}
			else if(temp==-2)
			{
				printf("\r\n接口未实现");
				break;
			}
			else{/*没有这种情况*/}
		}
	}
	{//连接服务器
		while(1)
		{
			temp=AT_CIPSTART(printf,tcpudpType,serverIP,servsrPort,&result,10000000);
			if(temp==-1)
			{//超时
				continue;//继续连接wifi
			}
			else if(temp==0)
			{//收到ERROR:需要检查程序
			}
			else if(temp==1)
			{//收到OK
				printf("\r\n连接服务器成功");
				break;
			}
			else if(temp==-2)
			{
				printf("\r\n接口未实现");
				break;
			}
			else{/*没有这种情况*/}
		}
	}
	{//设置传输模式为透传模式
		while(1)
		{
			temp=AT_CIPMODE(printf,1,&result,10000000);
			if(temp==-1)
			{//超时
				continue;//继续连接wifi
			}
			else if(temp==0)
			{//收到ERROR:需要检查程序
			}
			else if(temp==1)
			{//收到OK
				printf("\r\n设置透传成功");
				break;
			}
			else if(temp==-2)
			{
				printf("\r\n接口未实现");
				break;
			}
			else{/*没有这种情况*/}
		}
	}
	{//进入透传模式
		while(1)
		{
			temp=AT_CIPSEND(printf,&result,10000000);
			if(temp==-1)
			{//超时
				continue;//继续连接wifi
			}
			else if(temp==0)
			{//收到ERROR:需要检查程序
			}
			else if(temp==1)
			{//收到OK
				printf("\r\n已经进入透传模式");
				break;
			}
			else if(temp==-2)
			{
				printf("\r\n接口未实现");
				break;
			}
			else{/*没有这种情况*/}
		}
	}
}
static int CmdProcess_esp_connect(CmdObj obj, char* str, int len)
{
	 ESP8266connect(obj->printf,"ChinaNet-gYUP","g6hv5gbx","TCP","192.168.1.8",777);
	return 1;
}
CmdDef(espconnect,0,CmdProcess_esp_connect,"连接服务器");
void ESP8266EntryTransmit(int(*printf)(const char* format, ...))
{//完整的流程之进入透传模式
	int temp;
	char *result=0;
	{//设置传输模式为透传模式
		while(1)
		{
			temp=AT_CIPMODE(printf,1,&result,10000000);
			if(temp==-1)
			{//超时
				continue;//继续连接wifi
			}
			else if(temp==0)
			{//收到ERROR:需要检查程序
			}
			else if(temp==1)
			{//收到OK
				printf("\r\n设置透传成功");
				break;
			}
			else if(temp==-2)
			{
				printf("\r\n接口未实现");
				break;
			}
			else{/*没有这种情况*/}
		}
	}
	{//进入透传模式
		while(1)
		{
			temp=AT_CIPSEND(printf,&result,10000000);
			if(temp==-1)
			{//超时
				continue;//继续连接wifi
			}
			else if(temp==0)
			{//收到ERROR:需要检查程序
			}
			else if(temp==1)
			{//收到OK
				printf("\r\n已经进入透传模式");
				break;
			}
			else if(temp==-2)
			{
				printf("\r\n接口未实现");
				break;
			}
			else{/*没有这种情况*/}
		}
	}
}
static int CmdProcess_esp_entryTransmit(CmdObj obj, char* str, int len)
{
	ESP8266EntryTransmit(obj->printf);
	return 1;
}
CmdDef(espet,0,CmdProcess_esp_entryTransmit,"espet是esp entry Transmit缩写");

标签:return,ESP8266,temp,int,else,char,printf
From: https://blog.csdn.net/stars_A_B_C/article/details/145226054

相关文章

  • 【花雕学编程】Arduino动手做(246)---ESP8266 NodeMCU V3 Web Server
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......
  • 【花雕学编程】Arduino动手做(246)---设置ESP8266 V3 通过串口输出软AP的IP、MAC和WiFi
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......
  • RTOS_SDK-ESP8266环境搭建+独立按键
    本文针对ESP8266的RTOS_SDK开发编译流程出现的报错进行了一些解决,并且完成了按键控制LED功能环境准备硬件环境准备esp8266(焊接排针)独立按键杜邦线软件环境准备参考这位大佬:环境搭建教程ESP8266_RTOS_SDKAiThinkerIDE_V1.5.2注意事项出现mintty.exe报错......
  • ESP8266及继电器电路图解析
    ESP8266及继电器介绍ESP8266概述:ESP8266是一款低成本、低功耗的Wi-Fi芯片,由乐鑫信息科技(EspressifSystems)开发。它集成了TCP/IP协议栈,能够实现串口与Wi-Fi之间的转换,广泛应用于物联网(IoT)领域,如智能家居、智能穿戴、工业控制等。特点:低功耗:在睡眠模式下功耗极低,适合......
  • ESP8266 wifi模块+CH340烧录板安装使用运行教程
    硬件准备ESP8266-01S 模块USB转TTL烧录板(CH340)LED灯(建议使用3.3VLED)220Ω电阻(LED限流)面包板和跳线若干 我的是这样的不用接线,其他的参考ESP8266-01S引脚定义:VCC---3.3VGND---GNDTX---USB转TTL的RXRX---USB转TTL的TXCH_PD(EN)-......
  • 【保姆级】免踩坑,快速在Arduino IDE搭建esp8266/esp32开发环境
    1.安装ArduinoIDE首先安装好ArduinoIDE推荐下载一个1.8.x的经典稳定版本入手开发,再下载一个最新的2.x版本的zip版本体验跳转、调试、快速编译等全新体验下载ArduinoIDEArduino官网下载2.添加附加开发板地址打开ArduinoIDE的菜单>文件>首选项,在附加开发板管理......
  • 38 基于单片机的宠物喂食(ESP8266、红外、电机)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STC89C52单片机,采用L298N驱动连接P2.3和P2.4口进行电机驱动,然后串口连接P3.0和P3.1模拟ESP8266,红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.2口,MPX4117重量传感器连接ADC0832数模......
  • 38 基于单片机的宠物喂食(ESP8266、红外、电机)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STC89C52单片机,采用L298N驱动连接P2.3和P2.4口进行电机驱动,然后串口连接P3.0和P3.1模拟ESP8266,红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.2口,MPX4117重量传感器连接ADC0832数模......
  • 38 基于单片机的宠物喂食(ESP8266、红外、电机)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STC89C52单片机,采用L298N驱动连接P2.3和P2.4口进行电机驱动,然后串口连接P3.0和P3.1模拟ESP8266,红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.2口,MPX4117重量传感器连接ADC0832数模......
  • 38 基于单片机的宠物喂食(ESP8266、红外、电机)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STC89C52单片机,采用L298N驱动连接P2.3和P2.4口进行电机驱动,然后串口连接P3.0和P3.1模拟ESP8266,红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.2口,MPX4117重量传感器连接ADC0832数模......