大家好下面我给大家介绍的是基于微信小程序开发的手机端平台通过蓝牙设备或者WIfi设备来实现无线控制和数据传输。如图这是我们微信小程序做的界面。 -
这里我制作的例程用了四种模式,如果大家想修改或自己做可以做更多自己喜欢的模式。
实物展示的视频如下
微信小程序控制Arduino
好了看了通过手机小程序就能够实现硬件底层的LED跑马灯有没有想要自己动手的冲动。
下面我来给大家详细的讲解介绍这个LED跑马灯如何制作的过程。包教包会,不会的找我^_^
一、准备工作 1、准备STM32cubumx软件(创建工程需要)这里提供官网的下载网址:https://www.st.com/content/st_com/zh/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html
2、准备一块STM32开发板我这里使用的是一块STM32F103C8T6最小核心板。如图所示
3、准备一台手机。这个是我们自己做的小程序,二维码如图,
二、具体操作 1、硬件底层工程的搭建。1)我们硬件需要串口驱动。
2)我们硬件需要输出IO口配置。
这里可以参考别人写的三篇关于STM32cubemx工程创建、IO配置、串口配置流程。
STM32cubemx工程创建 转自https://blog.csdn.net/qq_15117167/article/details/104495530
STM32cubemxGPIO配置 转自https://blog.csdn.net/qq_15117167/article/details/104497453
串口配置 转自 https://blog.csdn.net/qq_15117167/article/details/104500486
通过这三个链接大家可以将工程创建完成。这里我要提一下是为什么要用STM32cubemx这个软件,因为相对初学者而言,这个软件让人更容易理解和熟悉,基本上都是图形化界面设置。而普通的工程创建是比较繁琐的。相比初学者而言,使用STM32cubemx更容易让人理解底层。
2、微信小程序功能制作1)首先扫描微信小程序二维码弹出来的主界面如图
2)点击添加功能新建工程。如图所示
这里会弹出一个项目,我们填写一下项目名称点击确认。
3)在创建的工程里面添加元件。如图
这里我们添加了三个按键、一个开关、一个滑条。然后点击下一步
4)数据设置。如图所示
①这里第一个按键点击编辑弹出的设置框如图所示
这里我们在自定义数据下选择Str(字符串类型发送)在空白区域填写01作为第一个按键触发发送到下位机的数据。
由此类推,按照同样方式把按键2按照按键1的方式设置发送数据栏填写02作为第二个按键触发发送到下位机的数据。按键3设置发送数据为03。这样按键的设置就完成了。
②开关设置,如图所示
设置为发送使能,接收使能后保存。
③滑动条设置,如图所示
设置为发送使能,接收使能后保存。
5)通信设置,如图所示
①打开自己的手机蓝牙
②点击开始扫描按键
③点击FFE0下的扩展键
④设置读特征值
⑤设置写特征值
⑥点击完成
这样一来微信小程序的工作就做完了!现在需要的是把硬件和软件连接起来!
3、硬件驱动程序制作(这里我们使用的是MDK5)根据第一步骤,我们已经把最基础的IO外设和串口外设配置好了。接下来就是添加通信文件。
1)添加数据解析的.C和,H
analysis.c
#include "main.h"
#include "usart.h"
extern UART_HandleTypeDef huart1;
Ubuff Uart2;
uint8_t mode = 0;
//格式化发送
void wxxcx_send(char * addr,char * data)
{
uint8_t sendbuff[100];
sprintf((char *)&sendbuff[0],"{#%s:%s}",addr,data);
HAL_UART_Transmit(&huart1,sendbuff, strlen((char *)&sendbuff[0]), 100);
}
//非协议数据处理
void wxxcx_general_deal(char * data)
{
//自定义数据处理在这
if(strstr("01",data))
{
//处理数据
mode = 1;
}
else if(strstr("02",data))
{
mode = 2;
}
else if(strstr("03",data))
{
mode = 3;
}
}
//协议数据处理
uint16_t count = 0;
void wxxcx_protocol_deal(char * addr,char * ctent)
{
if(strcmp(addr,swicth0_ID)==0)
{
//处理数据
if(strcmp(ctent,"true")==0)
{
LED_Power = 1;
}
else
{
LED_Power = 0;
}
}
else if(strcmp(addr,sliders0_ID)==0)
{
//处理数据
switch(strlen(ctent))
{
case 1:
count = (ctent[0] - 0x30)*1;
break;
case 2:
count = (ctent[0] - 0x30)*10 + (ctent[1] - 0x30)*1;
break;
case 3:
count = 100;
break;
default:break;
}
mode = 4;
LED_slider = (count / 8) % 13;
}
}
//“我的硬件”数据解析函数
void wxxcx_analysis(uint8_t * sch)
{
char * pch=NULL,* addr=NULL,* ctent=NULL,temp = 0;
do{
if(strstr((char *)sch,"{#") && strstr((char *)sch,"}"))
{
temp = 1;
}
else
{
break;
}
pch = strtok((char *)sch, "{#:}");
if(strlen((char *)pch)==6){//验证地址长度
//printf("addr:%s\r\n", pch);
addr = pch;//拿到控件ID
pch = strtok(NULL, "{#:}");
//printf("ctentn:%s\r\n", pch);
ctent = pch;//拿到数据内容
wxxcx_protocol_deal(addr,ctent);//协议数据
sch = NULL;
}
}while(pch != NULL);
if(sch!=NULL && temp == 0){
wxxcx_general_deal((char *)sch);//自定义数据
}
}
void Handle_RecvUart2(void)
{
wxxcx_analysis(&Uart2.rcvbuf[0]);//解析数据
}
//解析
void DataUpack(void)
{
static uint16_t temp = 0;
if(Uart2.rcvNumber != 0)
{
temp = Uart2.rcvNumber;
HAL_Delay(20);
if(temp == Uart2.rcvNumber)
{
Uart2.rcv_Busy = 0xff;
Handle_RecvUart2();
Uart2.rcvNumber = 0;
Uart2.rcv_Busy = 0;
memset(Uart2.rcvbuf,0,USART_REC_LEN);
}
}
}
这个.C主要用到的是最后这个 DataUpack()函数,把这个函数放到main函数的while循环里就好。如图所示
analysis.h
#ifndef _ANALYSIS_H
#define _ANALYSIS_H
#include "main.h"
#define swicth0_ID "030200"
#define sliders0_ID "030300"
//#define swicth2_ID "000102"
#define USART_REC_LEN 100 //定义最大接收字节数 200
#define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收
#define USE_USART_DEFAULT 1 //使能串口默认 (1) 使用串口1 (0) 使用串口2
/* USER CODE BEGIN Includes */
typedef struct {
uint8_t rcvbuf[USART_REC_LEN];
uint16_t rcvNumber;//接收数量
uint8_t rcv_Busy; //当该标志位清零时,才允许接收数据
}Ubuff;//门锁同一时间只能干一件事情--包括收和发
extern Ubuff Uart2;
extern uint8_t mode ;
extern void wxxcx_analysis(uint8_t * sch);
extern void DataUpack(void);
#endif
这里面主要是使用了#define swicth0_ID "030200" #define sliders0_ID "030300",这两个ID。ID的值根据微信小程序里面设置的值来修改。比如说
这里开关的ID是“040200”,滑条的ID是“040300”,上面这里就要做对应的修改修改值为
#define swicth0_ID "040200"
#define sliders0_ID "040300"
2)串口中断接收增加代码如下
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
// HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
unsigned char temp;
if(__HAL_UART_GET_IT_SOURCE(&huart1,UART_IT_RXNE) != RESET)
{
temp = __HAL_UART_FLUSH_DRREGISTER(&huart1);
if(Uart2.rcv_Busy==0)
{
Uart2.rcvbuf[Uart2.rcvNumber] = temp;
if(Uart2.rcvNumber<USART_REC_LEN){
Uart2.rcvNumber++;
}
}
}
HAL_UART_IRQHandler(&huart1);
/* USER CODE END USART1_IRQn 1 */
}
这里要注意的是要#include “analysis.h”这个头文件要加进来不然会报错。最后会给你们一个完整的DEMO例程。
到这里解析的工作已经做完了,下面就是去实现控制LED灯了。
我们如何去控制LED灯呢?我们的解析函数都添加完毕了,我们要到解析函数里面去看这两个函数void wxxcx_general_deal(char * data)和void wxxcx_protocol_deal(char * addr,char * ctent)
wxxcx_general_deal(char * data)这里主要处理的是按键类的消息,void wxxcx_protocol_deal(char * addr,char * ctent)协议数据处理函数是处理其他控件的,比如开关滑块都是在这个函数里面处理。
这里我们来分析一下代码
//非协议数据处理
void wxxcx_general_deal(char * data)
{
//自定义数据处理在这
if(strstr("01",data))
{
//处理数据
mode = 1;
}
else if(strstr("02",data))
{
mode = 2;
}
else if(strstr("03",data))
{
mode = 3;
}
}
上面这里是按键数据处理函数,我们之前定义过了按键1是发送“01”、按键2是发送“02”、按键3是发送“03”。所以程序里面判断是接收到这个字符串没有,如果接收到了就给mode赋值,我这里是用了给mode赋值你们可以改变GPIO状态来点亮LED灯。
//协议数据处理
uint16_t count = 0;
void wxxcx_protocol_deal(char * addr,char * ctent)
{
if(strcmp(addr,swicth0_ID)==0)
{
//处理数据
if(strcmp(ctent,"true")==0)
{
LED_Power = 1;
}
else
{
LED_Power = 0;
}
}
else if(strcmp(addr,sliders0_ID)==0)
{
//处理数据
switch(strlen(ctent))
{
case 1:
count = (ctent[0] - 0x30)*1;
break;
case 2:
count = (ctent[0] - 0x30)*10 + (ctent[1] - 0x30)*1;
break;
case 3:
count = 100;
break;
default:break;
}
mode = 4;
LED_slider = (count / 8) % 13;
}
}
这里处理的是开关和滑块的协议数据,swicth0_ID和sliders0_ID我们也定义好了,但是切记一定要和微信小程序上面的一致。这里要重点关注一下。
这里面处理数据我添加的都是处理一些变量,然后变量用在了其他地方。实现简单的点灯的话,就不用这么麻烦,直接添加函数HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);就好了,这里LED1_GPIO_Port,LED1_Pin看你自己定义了。
好了具体的操作流程也说完了下面附上我的源码。不懂得有什么问题的可以加我们的QQ群讨论:635404055
谢谢大家支持!
软件源码链接:https://pan.baidu.com/s/17r17d6fPKucNf2Al1IB8HA 提取码:dd0v
作者:baidu_15176453