涂鸦模组开发_压力传感器HX711——3. 涂鸦模组数据通信

  • 概述
  • 视频演示
  • 资料下载
  • 涂鸦智能
  • 涂鸦调试文件下载
  • STM32CUBEMX配置读取模块信息
  • 读取代码配置
  • 串口打印数据实例
  • 匹配心跳检测通信协议
  • 匹配查询MCU的版本号通信协议
  • 匹配查询产品信息请求通信协议
  • 手机连接涂鸦
  • 最后

概述

涂鸦智能 (NYSE:TUYA) 是一家致力于让生活更智能的领先技术公司,涂鸦提供能够智连万物的云平台,打造互联互通的开发标准,连接品牌、OEM 厂商、开发者、零售商和各行业的智能化需求,涂鸦的解决方案赋能并提升合作伙伴和客户的产品价值,同时通过技术应用使消费者的生活更加便利,涂鸦智能的智慧商业 SaaS 为丰富的垂直行业提供智能解决方案。涂鸦智能领先业界的技术,符合严格的数据保护标准和安全性。
压力传感器是工业实践中最为常用的一种传感器,其广泛应用于各种工业自控环境,涉及水利水电、铁路交通、智能建筑、生产自控、航空航天、军工、石化、油井、电力、船舶、机床、管道等众多行业。
同时压力传感器可以应用于电子称重系统或者久坐系统,实现了称重显示、超限报警、校准、适应各种工作环境、远程实时监控等多种功能,可以广泛应用于各种称重场景。
本章主要是配置涂鸦模组进行数据通信。

视频演示

听不到声音的请点击跳转进行观看。
https://www.bilibili.com/video/BV1vi4y1y7nL/

涂鸦模组开发(压力传感器HX711)——3. 涂鸦模组数据通信(1)

https://www.bilibili.com/video/BV1Ni4y1C7Hy/?spm_id_from=333.788

涂鸦模组开发(压力传感器HX711)——3. 涂鸦模组数据通信(2)

资料下载

https://download.csdn.net/download/qq_24312945/84796130

涂鸦智能

想更多了解涂鸦智能化开发方案,获取相关技术资料或开发物料,可点击下方报名参加,同时有30元优惠券。。
https://t.tuya.com/AY1D3R9jGr

涂鸦调试文件下载

在涂鸦平台下载资料。

涂鸦模块(BT3L Bluetooth 模组)与串口模块接线方式。

涂鸦模块BT3L Bluetooth 模组) 串口模块
VCC VCC
RX TX
TX RX
GND GND

打开下载的涂鸦模组调试助手,进行串口调试。

在这可以查看到通讯协议(基础协议)指令收发。

STM32CUBEMX配置读取模块信息

配置串口3读取涂鸦模块的数据。,由于涂鸦模块使用的是9600的波特率,故配置为9600。

配置DMA进行数据接收。

开启中断。

stm32f103与涂鸦接线方式。

开发板 涂鸦模块
VCC VCC
PB10(TX) RX
PB11(RX) TX
GND GND

读取代码配置

/* USER CODE BEGIN PV */
#define BUFFERSIZE 255//可以接收的最大字符个数
uint8_t ReceiveBuff[BUFFERSIZE]; //接收缓冲区
uint8_t recv_end_flag = 0,Rx_len;//接收完成中断标志,接收到字符长度
/* USER CODE END PV */

开启串口IDLE中断。

  /* USER CODE BEGIN 2 */__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);//使能串口3 IDLE中断HAL_UART_Receive_DMA(&huart3,ReceiveBuff,BUFFERSIZE);//开启DMA接收/* USER CODE END 2 */

定义接收函数。

/* USER CODE BEGIN PFP */
void uart3_data(void);
/* USER CODE END PFP */

串口DMA接收数据,然后通过串口1进行打印数据。

/* USER CODE BEGIN 4 */
void uart3_data(void)
{if(recv_end_flag ==1)//接收完成标志{
HAL_UART_Transmit(&huart1,(uint8_t*)ReceiveBuff,Rx_len,0xFFFF); for(int i = 0; i < Rx_len ; i++) //清空接收缓存区ReceiveBuff[i]=0;//置0Rx_len=0;//接收数据长度清零recv_end_flag=0;//接收标志位清零//开启下一次接收HAL_UART_Receive_DMA(&huart3,(uint8_t*)ReceiveBuff,BUFFERSIZE);}
}/* USER CODE END 4 */

#include "stm32f1xx_it.c"文件中断外部变量引用。

/* USER CODE BEGIN 0 */
#define BUFFERSIZE 255//可接收的最大数据量
extern uint8_t recv_end_flag,Rx_len,bootfirst;
/* USER CODE END 0 */

串口3中断函数。

void USART3_IRQHandler(void)
{/* USER CODE BEGIN USART3_IRQn 0 *//* USER CODE END USART3_IRQn 0 */HAL_UART_IRQHandler(&huart3);/* USER CODE BEGIN USART3_IRQn 1 */uint32_t temp;if(USART3 == huart3.Instance)//判断是否为串口3中断{      if(RESET != __HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE))//如果为串口3{__HAL_UART_CLEAR_IDLEFLAG(&huart3);//清除中断标志HAL_UART_DMAStop(&huart3);//停止DMA接收temp  = __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);//获取DMA当前还有多少未填充Rx_len =  BUFFERSIZE - temp; //计算串口接收到的数据个数recv_end_flag = 1;}}/* USER CODE END USART3_IRQn 1 */
}

串口打印数据实例

匹配心跳检测通信协议

以心跳检测为例子,当涂鸦模块发送心跳检测给MCU时候,需要MCU上报信息给涂鸦模块,同时心跳检测数据第一次发送0x00,第二次发送0x01。

由于心跳检测发送的数据是固定的,故需要定义2个数组用来存放。

/* USER CODE BEGIN PV */
uint8_t wifi_first =0;//第一次开启 发送00  第二次发送01
const uint8_t Buff1[8]={0x55,0xAA,0x00,0x00,0x00,0x01,0x00,0x00};//心跳检测,第1次 0x55 aa 00 00 00 01 00 03
const uint8_t Buff2[8]={0x55,0xAA,0x00,0x00,0x00,0x01,0x01,0x01};//心跳检测,第2次 0x55 aa 00 00 00 01 01 04/* USER CODE END PV */

在之前的uart3_data()函数中添加检测代码,通过判断接收的数据来判断模块发送过来的指令。

void uart3_data(void)
{if(recv_end_flag ==1)//接收完成标志{HAL_UART_Transmit(&huart1,(uint8_t*)ReceiveBuff,Rx_len,0xFFFF);//向串口发送接收到的数据if(ReceiveBuff[0]==0x55&&ReceiveBuff[1]==0xAA)//判断帧头和版本{if(ReceiveBuff[3]==0x00)//判断是否为心跳检测{if(wifi_first==0)//第一次发送心跳数据{wifi_first=1;HAL_UART_Transmit(&huart3,(uint8_t*)Buff1,8,0xFFFF);    //心跳检测,向涂鸦模块发送HAL_UART_Transmit(&huart1,(uint8_t*)Buff1,8,0xFFFF);  //心跳检测,向串口发送,方便查看数据}                else{HAL_UART_Transmit(&huart3,(uint8_t*)Buff2,8,0xFFFF);   //心跳检测,向涂鸦模块发送HAL_UART_Transmit(&huart1,(uint8_t*)Buff2,8,0xFFFF);  //心跳检测,向串口发送,方便查看数据}}}        for(int i = 0; i < Rx_len ; i++) //清空接收缓存区ReceiveBuff[i]=0;//置0Rx_len=0;//接收数据长度清零recv_end_flag=0;//接收标志位清零//开启下一次接收HAL_UART_Receive_DMA(&huart3,(uint8_t*)ReceiveBuff,BUFFERSIZE);}
}

查看串口接收到的数据,可以看到心跳数据已经正常接收。

匹配查询MCU的版本号通信协议

同时可以看到,接收的数据中,夹着一个55 AA 00 E8 00 00 E7的数据。
通过查询文档,可以知道该指令是查询MCU的版本号。

在涂鸦模块调试助手中可以查看到该指令的通信协议。


由于MCU版本号为1.0.2和硬件版本号1.0.3,故需用2个数组进行存放该版本号,同时定义一个接收模块发送的查询MCU版本信息请求数组。

/* USER CODE BEGIN PV */
uint8_t mcu_version[3]={1,0,2};
uint8_t hardware_version[3]={1,0,3};
uint8_t Buff3[13]={0x55,0xAA,0x00,0xE8,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//接收模块发送的查询MCU版本信息请求
/* USER CODE END PV */

在之前的uart3_data()函数中添加检测代码,通过判断接收的数据来判断模块发送过来的指令。

void uart3_data(void)
{if(recv_end_flag ==1)//接收完成标志{HAL_UART_Transmit(&huart1,(uint8_t*)ReceiveBuff,Rx_len,0xFFFF);//向串口发送接收到的数据if(ReceiveBuff[0]==0x55&&ReceiveBuff[1]==0xAA)//判断帧头和版本{if(ReceiveBuff[3]==0x00)//判断是否为心跳检测{if(wifi_first==0)//第一次发送心跳数据{wifi_first=1;HAL_UART_Transmit(&huart3,(uint8_t*)Buff1,8,0xFFFF);    //心跳检测,向涂鸦模块发送HAL_UART_Transmit(&huart1,(uint8_t*)Buff1,8,0xFFFF);  //心跳检测,向串口发送,方便查看数据}                else{HAL_UART_Transmit(&huart3,(uint8_t*)Buff2,8,0xFFFF);   //心跳检测,向涂鸦模块发送HAL_UART_Transmit(&huart1,(uint8_t*)Buff2,8,0xFFFF);  //心跳检测,向串口发送,方便查看数据}}        else if(ReceiveBuff[3]==0xE8)//判断是否为接收模块发送的查询MCU版本信息请求{for(int i=0;i<3;i++){Buff3[6+i]=mcu_version[i];//将mcu版本放入数组中Buff3[9+i]=hardware_version[i];//将硬件版本放入数组中}Buff3[12]=0;for(int i=0;i<12;i++)//计算校验和{Buff3[12]=Buff3[12]+Buff3[i];}HAL_UART_Transmit(&huart3,(uint8_t*)Buff3,13,0xFFFF);   //接收模块发送的查询MCU版本信息请求,向涂鸦模块发送HAL_UART_Transmit(&huart1,(uint8_t*)Buff3,13,0xFFFF);   //接收模块发送的查询MCU版本信息请求,向串口发送,方便查看数据}}      for(int i = 0; i < Rx_len ; i++) //清空接收缓存区ReceiveBuff[i]=0;//置0Rx_len=0;//接收数据长度清零recv_end_flag=0;//接收标志位清零//开启下一次接收HAL_UART_Receive_DMA(&huart3,(uint8_t*)ReceiveBuff,BUFFERSIZE);}}

查看串口接收到的数据,可以看到查询MCU版本信息请求已经发送完毕。

匹配查询产品信息请求通信协议

同时可以看到,接收的数据中,夹着一个55 AA 00 01 00 00 00 的数据。
通过查询文档,可以知道该指令是查询产品信息请求。

故需要定义pid和初始化发送的数组,后期再将pid和mcu版本号放入数组中。

char pid[]="qhaft0y9";
uint8_t mcu_version[3]={1,0,2};
uint8_t Buff4[20]={0x55,0xAA,0x00,0x01,0x00,0x0D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x00,0x2E,0x00,0x00};//接收模块发送的查询产品信息请求
/* USER CODE END PV */

由于有时候模块会连着发几条指令过来,故需要对指令进行切割,然后逐条返回。

/* USER CODE BEGIN 4 */
void uart3_data(void)
{if(recv_end_flag ==1)//接收完成标志{HAL_UART_Transmit(&huart1,(uint8_t*)ReceiveBuff,Rx_len,0xFFFF);//向串口发送接收到的数据uint8_t Rx_flag=0;//接收数据的指令数uint8_t RX_BUFF_flag[BUFFERSIZE];if(Rx_len>=4){for(int i1=0;i1<Rx_len-2;i1++)//计算指令数量{if(ReceiveBuff[i1]==0x55&&ReceiveBuff[i1+1]==0xAA){RX_BUFF_flag[Rx_flag]=i1;//记录节点Rx_flag++;//指令数+1}        }uint8_t Tx_flag=0;//发送数据的指令数uint8_t RX_BUFF[BUFFERSIZE];/*复制ReceiveBuff数组到RX_BUFF数组*/
//方法1
//          for(int i1=0;i1<255;i1++)
//              RX_BUFF[i1]=ReceiveBuff[i1];
//
//方法2memcpy(RX_BUFF,ReceiveBuff,BUFFERSIZE);while(Tx_flag<Rx_flag){if(RX_BUFF[0]==0x55&&RX_BUFF[1]==0xAA)//判断帧头和版本{
//                  HAL_UART_Transmit(&huart1,&RX_BUFF[3],1,0xFFFF);//向串口发送接收到的数据if(RX_BUFF[3]==0x00)//判断是否为心跳检测{if(wifi_first==0)//第一次发送心跳数据{wifi_first=1;HAL_UART_Transmit(&huart3,(uint8_t*)Buff1,8,0xFFFF); //心跳检测,向涂鸦模块发送HAL_UART_Transmit(&huart1,(uint8_t*)Buff1,8,0xFFFF);  //心跳检测,向串口发送,方便查看数据}                else{HAL_UART_Transmit(&huart3,(uint8_t*)Buff2,8,0xFFFF);   //心跳检测,向涂鸦模块发送HAL_UART_Transmit(&huart1,(uint8_t*)Buff2,8,0xFFFF);  //心跳检测,向串口发送,方便查看数据}}else if(RX_BUFF[3]==0x01)//接收模块发送的查询产品信息请求{for(int i=0;i<8;i++)//放入pid{Buff4[i+6]=pid[i];}//mcu版本mcu_version->1.0.2Buff4[14]=mcu_version[0]+0x30;Buff4[16]=mcu_version[1]+0x30;Buff4[18]=mcu_version[2]+0x30;Buff4[19]=0;//校验和清理for(int i=0;i<19;i++)//计算校验和{Buff4[19]=Buff4[19]+Buff4[i];}HAL_UART_Transmit(&huart3,(uint8_t*)Buff4,20,0xFFFF);   //心跳检测,向涂鸦模块发送HAL_UART_Transmit(&huart1,(uint8_t*)Buff4,20,0xFFFF); //心跳检测,向涂鸦模块发送}            else if(RX_BUFF[3]==0xE8)//判断是否为接收模块发送的查询MCU版本信息请求{for(int i=0;i<3;i++){Buff3[6+i]=mcu_version[i];//将mcu版本放入数组中Buff3[9+i]=hardware_version[i];//将硬件版本放入数组中}Buff3[12]=0;for(int i=0;i<12;i++)//计算校验和{Buff3[12]=Buff3[12]+Buff3[i];}HAL_UART_Transmit(&huart3,(uint8_t*)Buff3,13,0xFFFF);   //接收模块发送的查询MCU版本信息请求,向涂鸦模块发送HAL_UART_Transmit(&huart1,(uint8_t*)Buff3,13,0xFFFF);   //接收模块发送的查询MCU版本信息请求,向串口发送,方便查看数据}}      memset(RX_BUFF, 0,BUFFERSIZE);   //清空数组if(Tx_flag<Rx_flag-1){//方法1
//                  for(int i1=0;i1<(Rx_len-RX_BUFF_flag[Tx_flag+1]);i1++)
//                      RX_BUFF[i1]=ReceiveBuff[i1+RX_BUFF_flag[Tx_flag+1]];//方法2memcpy(RX_BUFF,ReceiveBuff+RX_BUFF_flag[Tx_flag+1],(Rx_len-RX_BUFF_flag[Tx_flag+1]));           }        Tx_flag++;       }        }for(int i = 0; i < Rx_len ; i++) //清空接收缓存区ReceiveBuff[i]=0;//置0Rx_len=0;//接收数据长度清零recv_end_flag=0;//接收标志位清零//开启下一次接收HAL_UART_Receive_DMA(&huart3,(uint8_t*)ReceiveBuff,BUFFERSIZE);}}/* USER CODE END 4 */

手机连接涂鸦

在写完涂鸦模块的通讯协议(基础协议)之后,打开手机中的涂鸦智能,点击添加设备,然后APP会自动扫描出设备。

或者在右边的设备中寻找到对应的设备进行添加。

点击进入后就可以进行设备添加。

选择需要添加的设备。

添加成功后界面如下所示。

添加成功后,就可以进入该传感器的实际界面。

最后

以上的代码会在Q群里分享。QQ群:615061293。
或者关注微信公众号『记帖』,持续更新文章和学习资料,可加作者的微信交流学习!

涂鸦模组开发(压力传感器HX711)——3. 涂鸦模组数据通信相关推荐

  1. 涂鸦 Wi-Fi SDK开发系列教程——2. 涂鸦IoT平台介绍

    使用涂鸦Wi-Fi模组和涂鸦Wi-Fi&Bluetooth LE双模模组进行产品开发主要有三种不同的方式进行开发: 零代码开发:涂鸦提供可视化功能配置界面,无需任何编程经验,只需在线配置好产品 ...

  2. iMeta:青岛大学苏晓泉组开发跨平台可交互的微生物组分析套件PMS(全文翻译,PPT,视频)...

    Parallel-Meta Suite:跨平台可交互的微生物组快速分析套件 Parallel-Meta Suite: Interactive and rapid microbiome data ana ...

  3. NC | 中科院先进院戴磊组开发SEER-FISH成像技术解析微生物组空间结构

    合成所科研进展 2023年3月17日,中国科学院深圳先进技术研究院合成微生物组学研究中心.深圳合成生物学创新研究院戴磊课题组在Nature子刊 Nature Communications上发表了基于成 ...

  4. 涂鸦模组开发(压力传感器HX711)——4. 上报传感器数据给涂鸦模块

    涂鸦模组开发_压力传感器HX711--4. 上报传感器数据给涂鸦模块 概述 视频演示 资料下载 涂鸦智能 涂鸦功能修改 压力值上报 压力状态上报 增值服务 最后 概述 涂鸦智能 (NYSE:TUYA) ...

  5. 涂鸦模组开发(压力传感器HX711)——2. 压力传感器HX711

    涂鸦模组开发_压力传感器HX711--2. 压力传感器HX711 概述 视频教学 资料下载 涂鸦智能 硬件准备 选择芯片型号 配置时钟源 配置时钟树 串口配置 生成工程设置 代码生成设置 生成代码 串 ...

  6. 涂鸦模组开发(压力传感器HX711)——1. 模块准备

    涂鸦模组开发_压力传感器HX711--1. 模块准备 概述 视频教学 资料下载 采集模块 涂鸦产品创建 涂鸦产品信息查询 STM32F103主控 最后 概述 涂鸦智能 (NYSE:TUYA) 是一家致 ...

  7. 涂鸦模组开发(压力传感器HX711)

    涂鸦模组开发(压力传感器HX711) 概述 资料下载 涂鸦智能 视频教学 系统框架设计 压力传感器 信号处理 涂鸦蓝牙模块 软件设计 涂鸦模块开发 智慧生活App 开发文章 最后 概述 1999年我国 ...

  8. 涂鸦模组开发光照传感器

    涂鸦模组开发光照传感器(OPT3006) 概述 涂鸦智能 视频教学 系统框架设计 OPT3006 超薄环境光传感器 TYZS5 模组 特点 PCB绘制 涂鸦零代码开发 涂鸦模组开发文章 最后 概述 亮 ...

  9. 制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)

    实现的功能: l  APP控制月球灯 l  本地月球灯控制 l  APP控制"大白"颜色,实现各种颜色变身 l  门状态传感器状态APP显示 l  网络状态指示灯,连接服务器长亮, ...

最新文章

  1. mysql 图形化工具
  2. MxGraph从入门到精通之3:设置图形样式
  3. Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  4. 其中一个页签慢_渭南提升一个大专学历的有效方法
  5. 【转载保存】搜索引擎调研文档
  6. 【GRE协议】CentOS配置GRE隧道
  7. (19)FPGA面试题设计前端流程
  8. 【Spring】Spring boot 可以通过集成jolokia来使用HTTP形式访问mbean
  9. 如何从函数中获取指向并调用该函数的函数指针的地址?
  10. foobar2000隐藏桌面悬浮窗头像_多多情侣头像大全app-多多情侣头像大全软件v1.0.1...
  11. mysql的四个默认数据库是什么版本,MySQL5.7数据库字符集和排序规则有四个级别的默认设置:服务器,数据库,表和列。...
  12. 编码基本功:工作中,大多数人不会举一反三
  13. 平方方程应该都有整数解
  14. spring-第十八篇之spring AOP基于XML配置文件的管理方式
  15. 2022短视频去水印小程序带流量主/CPS/资源/工具/批量解析/修改MD5
  16. 同学留步,我想跟你聊聊成长中的苦难
  17. drupal7 php版本,为内置PHP 5.4服务器提供Drupal 7
  18. 坦克大战第一节——画出自己的坦克(新手篇)
  19. 计算机单位厘米 像素,300dpi的dpi是多少?是像素/英寸吗?还是像素/厘米?
  20. cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-buil windows下的解决方案

热门文章

  1. php有意思的小项目,推荐6个Github上超有意思的前端项目!
  2. asp.net正则表达式的使用
  3. el-form 验证规则里prop一次验证两个或多个值
  4. Maven基础(2):Maven详解
  5. phpmailer实现邮件发送
  6. 常见的网络问题-初级
  7. 【PPT+套图】iFeve沙龙
  8. 【毕业设计】基于的单片机的移动硬盘设计与实现 - stm32 嵌入式 物联网
  9. DirectX Gammer 设置
  10. 康拓排列的自我总结--以及全排列的递归非递归算法