首页 > 其他分享 >AT32实现的esp8266 TLink上报下发

AT32实现的esp8266 TLink上报下发

时间:2024-06-10 21:32:34浏览次数:20  
标签:ESP12 TLink esp8266 char WaitResponse AT32 timer1 printf Recv

本文采用芯片at32f435,由两部分组成,Tlink平台相关设置,设备代码相关。硬件相关可以理解成WiFi模块连接的串口,本文函数名是uart2但是实际上用的是Com3,可能是老师也是移植的原因。

AT指令含义相关请在at指令技术文档查询或相关经验帖查看,关键词"esp8266 AT指令",这里不再赘述,请根据实际情况调整。

平台设置

TLINK平台主界面。(第一张图)用户头像下边的编辑图标可以新增传感器(第二张图),同时注意在这个页面给自己定位GPS。

注意这里的序列号,还有设备传感器的顺序,如果你打印之后顺序不对,调整代码的上报下发的数据信息前后位置即可,比如原先是"#a,b,c#",调整成“#b,a,c#”。至于顺序怎么调整的问题,可以观察传感器右边的那个“实时曲线”和“历史查询”,我就是发现ADC的值为0、1(正常范围是0~4096)而进行调整的,查询LED历史值确定了哪个对应哪个。我尝试调整云平台的排序顺序但是失败了,这里建议不要设置传感器顺序。

鼠标移植左侧,可以看到我们当前位于“监控中心”,接下来我们点击“设备管理”

点击“设置连接”,编辑协议,注意这里是设备传给平台的。同时观察本页面可以看到“IP”、“端口号”、“序列号”。以及右下角的“收发指令”,点击展开,这里可以看到设备发给平台的内容。

点击“所有传感器”,这里是平台发给设备的,你需要写对应的解析数据包代码,填写后注意点击写入指令,我的格式是“[id=001,switch=1]”,id1是设备1,switch1是开,0是关。ADC这里只是在云平台查看不下发,故不填写。

点击“开发者中心”

平台提供心跳包,我们可以用来判断设备当前是否与平台还有联系,设备发“Q”后,平台发“A”。

代码

为提高各位的移植成功率,我对代码进行了简单的"提炼"。不多说,上代码。

//20ms定时器
{
    //1s
	if(++timer1_counter1>=50)
	{
		timer1_counter1=0;
		timer1_counter2++;//注意这个时标
        //这里是55s,为什么呢,因为总有地方拖慢了定时器,我找不到原因
		if(++timer1_counter3>=55)
		{
			timer1_counter3=0;
			uart2SendStr("Q");
			if(ESP12_WaitResponse("A", 10000) != 1)
			{
				WIFI_LOGO=HIDE;esp32Status1=0;
			}
		}
	}
	// 2s
	if(++timer1_num>=100)
	{
		timer1_num=0;
        //有网才上报,没网不鸟他
		if(WIFI_LOGO==SHOW && esp32Status1==ESP_STAET_TLINK){
			machine.adc=analogRead();
			machine.led3_status=gpio_output_data_bit_read(LED3_GPIO,LED3_PIN)==0?1:0;
			machine.led4_status=gpio_output_data_bit_read(LED4_GPIO,LED4_PIN)==0?1:0;
			printf("\n\rTimer1Callback:");
			sprintf(TlinkCommandStr, "#%d,%d,%d#",machine.led3_status,machine.led4_status,machine.adc);
			//printf(TlinkCommandStr);
			uart2SendStr(TlinkCommandStr);
		}
	}


}

主函数,我用了Freertos,这里小改一波

int main()
{
    esp32Init();
    //没用freertos的同学请解除初始化注释
    //	char testStr[] =  "tlink的机器序列号";
//	comSendBuf(COM3, "+++", 3);
//	delay_ms(1000);
//	ESP12_SendAT("AT");
//	if (ESP12_WaitResponse("OK", 5000) != 1)
//	{
//		printf("\r\n AT fail!\r\n");
//		delay_ms(1000);
//	}	
//	ESP12_SendAT("ATE0");
//	if (ESP12_WaitResponse("OK", 500) != 1)
//	{
//		printf("\r\n ATE0 fail\r\n");
//	}	
//	
//	ESP12_SendAT("AT+CWMODE=1");
//	if (ESP12_WaitResponse("OK", 500) != 1)
//	{
//		printf("\r\n CWMODE fail\r\n");
//	}
//	ESP12_SendAT("AT+CWJAP=\"wifi\",\"12345678\"");
//	if (ESP12_WaitResponse("OK", 5000) != 1)
//	{
//		printf("\r\n CWJAP fail\r\n");
//		delay_ms(1000);
//	}
//	ESP12_SendAT("AT+CIPSTART=\"TCP\",\"tcp.tlink.io\",8647");
//	if (ESP12_WaitResponse("OK", 5000) != 1)
//	{
//		printf("\r\n CIPSTART fail\r\n");
//	}
//	
//	ESP12_SendAT("AT+CIPMODE=1");
//	if (ESP12_WaitResponse("OK", 1000) != 1)
//	{
//		printf("\r\n CIPMODE fail\r\n");
//	}
//	
//	ESP12_SendAT("AT+CIPSEND");
//	if (ESP12_WaitResponse("OK", 1000) != 1)
//	{
//		printf("\r\n CIPMODE fail\r\n");
//	}
//	printf("\r\n server connected!\r\n");
//	comSendBuf(COM3, testStr, strlen(testStr));
//	delay_ms(4000);
    while(1)
    {
        Esp12FrameScan();
        vTaskDelay(10); //没用freertos的同学请注释这一行
    }
}
//代码原先滴样子,看不懂的看下一节代码


typedef struct {
    int adc;
    bool led3_status;
    bool led4_status;
} StateMachine;
StateMachine machine;
char commandParse(char * comd,char * id,char * value)
{
	char idStr[4] = "001";
	char *p = NULL;
	int ret = 0;
	int pos = 0;
	p = strstr(comd,"id=");
	if(p ==  NULL) return -1;
	strncpy(idStr,p+strlen("id="),3);
	*id = atoi(idStr);
	
	memset(idStr,0,sizeof(idStr));
	
	p = strstr(comd,"switch=");
	if(p == NULL) return -1;
	strncpy(idStr,p+strlen("switch="),1);
	*value = atoi(idStr);
	return 0;
}
#define ESP_TLINK_CONNECTED 1
#define ESP_TLINK_INIT 2
#define ESP_GET_WEATHER 3
#define ESP_GET_TIME 4
unsigned char timer1_counter1,timer1_counter2,timer1_counter3=0;
unsigned char esp32Status1=0;
void Esp12FrameScan()
{
	static unsigned char failnum=0x00;
	static int adcValue1=0;
	static unsigned char airCtrl=0,lightCtrl=0;
	static char Recv_Buf[20],Recv_len=0,Recv_CommandFlag=0;
	char TlinkCommandStr[20],DeviceID,DeviceLight,ret;

	unsigned char getChar=0;
	static unsigned char state=0;
	char testStr[] =  "机器序列号";
	
	if(esp32Status1 == ESP_TLINK_CONNECTED){
		if(comGetChar(COM3,&getChar))
		{	
			if(timer1_counter2>=60)
			{
				timer1_counter2=0;
				esp32Status1=0;
				WIFI_LOGO=HIDE;
				return;
			}else{
			
				if(getChar=='A')
				{					
					timer1_counter2=0;
					WIFI_LOGO=SHOW;
					return;
				}
			}
			
			switch(state)
			{
				case 0:
					if(getChar == '['){ state=1;}//WIFI_LOGO=SHOW;timer1_counter2=0;}
					Recv_len=0;
					break;
				case 1:
					if(getChar == ']') 
					{
						state=0;
						Recv_CommandFlag=1;
						//WIFI_LOGO=SHOW;
					}
					else
					{
						*(Recv_Buf+Recv_len) = getChar;
						Recv_len++;
						if(Recv_len>17)
						{
							Recv_CommandFlag=0;
							state=0;
						}
					}
					break;
				default:
					break;
			}
		}
	}else{
		comSendBuf(COM3, "+++", 3);
		vTaskDelay(500);
		ESP12_SendAT("AT");
		if (ESP12_WaitResponse("OK", 500) != 1)
		{
			printf("\r\n AT fail!\r\n");
			failnum|=(1<<0);
			vTaskDelay(1000);
		}	
		ESP12_SendAT("ATE0");
		if (ESP12_WaitResponse("OK", 500) != 1)
		{
			printf("\r\n ATE0 fail\r\n");
			failnum|=(1<<1);vTaskDelay(1000);
		}	
		
		ESP12_SendAT("AT+CWMODE=1");
		if (ESP12_WaitResponse("OK", 500) != 1)
		{
			printf("\r\n CWMODE fail\r\n");
			failnum|=(1<<2);vTaskDelay(1000);
		}
		ESP12_SendAT("AT+CWJAP=\"wifi\",\"12345677\"");
		if (ESP12_WaitResponse("OK", 5000) != 1)
		{
			printf("\r\n CWJAP fail\r\n");
			failnum|=(1<<3);
			vTaskDelay(1000);
		}
		ESP12_SendAT("AT+CIPSTART=\"TCP\",\"tcp.tlink.io\",8647");
		if (ESP12_WaitResponse("OK", 5000) != 1)
		{
			printf("\r\n CIPSTART fail\r\n");
			failnum|=(1<<4);vTaskDelay(1000);
		}
		
		ESP12_SendAT("AT+CIPMODE=1");
		if (ESP12_WaitResponse("OK", 5000) != 1)
		{
			printf("\r\n CIPMODE fail\r\n");
			failnum|=(1<<5);vTaskDelay(1000);
		}
		
		ESP12_SendAT("AT+CIPSEND");
		if (ESP12_WaitResponse("OK", 1000) != 1)
		{
			printf("\r\n CIPMODE fail\r\n");vTaskDelay(1000);
			failnum|=(1<<6);
		}
		
		comSendBuf(COM3, testStr, strlen(testStr));
		vTaskDelay(400);
		if(failnum==0){
			uart2SendStr("Q");
		}
		if ((failnum&(1<<3)&&failnum&(1<<4))||(ESP12_WaitResponse("A", 10000) != 1))
		{
			WIFI_LOGO=HIDE;
			failnum=0;
			return;
			//vTaskDelay(1000);
		}else{
			printf("\r\n server connected!\r\n");
			esp32Status1=ESP_STAET_TLINK;
			WIFI_LOGO=SHOW;
		}
	}
	if(Recv_CommandFlag == 1)
	{
		Recv_CommandFlag = 0;
		airCtrl=gpio_output_data_bit_read(LED3_GPIO,LED3_PIN)==0?1:0;
		lightCtrl=gpio_output_data_bit_read(LED4_GPIO,LED4_PIN)==0?1:0;
		printf("Esp12FrameScanREV:");
		printf("%s",Recv_Buf);
		ret = commandParse(Recv_Buf,&DeviceID,&DeviceLight);
		if(ret == 0)
		{
			switch(DeviceID)
			{
				case 001:
						switch(DeviceLight)
						{
							case 0:
								at32_led_off(LED3);
								airCtrl=0;
								break;
							case 1:
								at32_led_on(LED3);
								airCtrl=1;
								break;
							default:
								break;
						}
						adcValue1 = analogRead();
						printf("Esp12FrameScan:");
						sprintf((char *)TlinkCommandStr, "#%d,%d,%d#",airCtrl,lightCtrl,adcValue1);
						printf("The upload string is %s",TlinkCommandStr);
						uart2SendStr(TlinkCommandStr);
				break;
				case 002:
						switch(DeviceLight)
						{
							case 0:
								at32_led_off(LED4);
								lightCtrl=0;
								break;
							case 1:
								at32_led_on(LED4);
								lightCtrl=1;
								break;
							default:
								break;
						}
						adcValue1 = analogRead();printf("Esp12FrameScan:");
						sprintf((char *)TlinkCommandStr, "#%d,%d,%d#",airCtrl,lightCtrl,adcValue1);
						printf("The upload string is %s",TlinkCommandStr);
						uart2SendStr(TlinkCommandStr);
				break;
			}
		}	
	}
}

代码大致结构

读串口字节;
有字节说明wifi连着,如果是"A",counter2时标赶紧清了,不然到一定数量就是断网
if(符合帧结构)
{
    先录下来;
    flag=1;
}
else{
    //这里面滴内容是用了freertos的同学看的;
}
if(flag==1)
{
    解析包;
    立刻上报一次;
}

麻烦看到最后的同学点个赞鼓励一下呗。

有问题在评论区说一下,谢谢。

标签:ESP12,TLink,esp8266,char,WaitResponse,AT32,timer1,printf,Recv
From: https://blog.csdn.net/m0_64089565/article/details/139581311

相关文章

  • 基于 ESP8266 的模块的引脚资源
    参考资料:0.ESP8266、ESP32引脚图https://blog.csdn.net/qq_45355603/article/details/1256062071.【NodeMcu-ESP8266】引脚使用参考指南——推荐收藏:https://blog.csdn.net/qq_15776011/article/details/137050657 ESP-01S 2.ESP12......
  • ESP8266 01sWiFi模块保姆级教程 烧录和联网,连接华为云
    前言写在前面。这个esp01s联网真的是折磨人啊,浪费了我三四天的时间,网上各种教程叫天天不灵,叫地地不灵,所以才有了这篇教程,致力于帮助像我一样的小白少踩坑,我可以说是把能踩的坑都塌了一遍。烧录部分首先强烈建议小白玩家不要用网上任何一种接线方式和手动上电的方式(这里真的......
  • 如何将onnx稳定的转换为tensorflow, 甚至转换为tflite(float32/int8)
    做模型部署边缘设备的时候,我们经常会遇到特定格式的要求。但常见的onnx2tf很多时候都不能满足我们的要求。因此,记录一下我的操作过程。1.环境:(linux18.04)#NameVersionBuildChannel_libgcc_mutex0.1......
  • ESP8266 连接阿里云物联网平台
    项目代码1#include<ESP8266WiFi.h>2#include<PubSubClient.h>3#include"DHT.h"456/*配置WIFI7*/8#defineWIFI_SSID"*****"//WIFI名称9#defineWIFI_PASSWD"*****"//WIFI密码10......
  • ESP8266模块上传温湿度传感器的数据到云平台(乐为物联)
    ESP8266相关AT指令AT:检测模块是否正常工作,返回“OK”表示正常。AT+RST:重启模块。AT+CWMODE=:设置Wi-Fi模式,可以是以下几种:1:Station模式,连接到一个Wi-Fi网络。2:SoftAP模式,创建一个Wi-Fi热点。3:SoftAP+Station模式,同时作为热点和连接到一个Wi-Fi网络。AT+CWJAP="",""......
  • 用ESP8266-NodeMCU开发板显示一下我的QQ头像
    诶,说好的自己写esp8266的开发板固件的我回来了。20年说好的,今天回来还愿了ESP8266串口WiFi模块-WiFi杀手今天我们把OLED显示屏也接上,我此次买的是4脚的OLED(128*64),不支持彩色显示的。NodeMCU开发板NodeMCU是一个开源的IoT物联网硬件开发板,由于它支持WIFI功能且使用方法十......
  • 文件系统(四):FAT32文件系统实现原理
    FAT32是从FAT12、FAT16发展而来,目前主要应用在移动存储设备中,比如SD卡、TF卡。隐藏的FAT文件系统现在也有被大量使用在UEFI启动分区中。为使文章简单易读,下面内容特意隐藏了很多实现细节,关于分区、格式化等相关的内容,可以查看之前的文章:文件系统(一):存储介质、原理与架构文件系......
  • esp8266-01 使用介绍
    一、直接使用接线esp8266USB转TTl说明TXRX------RXTX------EN3.3V  AT命令需要拉高------3V33.3V------IO0不接IO0接地进入烧录模式GNDGND------二、固件烧写前提说明一般是模块固件损坏或者买回来里面可能被别人刷过固件需要擦除或者......
  • ESP8266串口WiFi模块 - WiFi杀手
    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`ESP8266串口WiFi模块-WiFi杀手日期:2020-2-3阿珏折腾代码浏览:2635次评论:21条前段时间买了个ESP8266,准备拿来耍耍。实际吃灰数月,然后就拖到......
  • FAT32与NTFS的区别
    FAT32与NTFS的区别FAT32是较旧的文件系统,而NTFS是较新的文件系统。NTFS支持更大的文件和分区,提供了更好的安全功能,如文件加密和访问权限。NTFS支持高级功能,如磁盘配额和文件压缩,而FAT32不提供这些选项。FAT32主要用于小型磁盘,如U盘和存储卡,而NTFS用于大中型空间容量的......