- temperature = AHT10_Read_Temperature();
- humidity = AHT10_Read_Humidity();
- lcd_set_color(BLACK,GREEN);
- lcd_show_string(30, 192, 16,"Temperature : %5d", (int)(temperature));
- lcd_show_string(30, 208, 16,"Humidity : %5d", (int)(humidity));
为了更好的实现控制,这里不使用延时函数,而是采用定时器实现内部时钟,采用的是定时器2实现中断计数的功能。
然后通过时间差实现1s采集和更新一次数据的功能。计算时间差的函数如下
- u32 get_tDiff(u32 lt)
- {
- return timer_cnt-lt;
- }
timer_cnt为全局变量,用于定时器的计数,形成系统时钟。
- void TIM2_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM2中断是否发生。
- {
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除TIM2的中断挂起位。
- timer_cnt++;
- }
- }
BLE模块的数据主要是通过串口实现的 ,只要向串口发送数据,手机端就可以收到相关的数据了。
串口的配置这里就不再赘述了,官网提供个代码已经实现了,只需要简单的复制就行了。
这里是将温湿度数据转换为json格式的数据,发送到手机上,然后在手机端进行解析,将温湿度数据显示在手机上。
实现的代码如下所示。
- if(get_tDiff(last_time0)>1000){
- last_time0=timer_cnt;
- temperature = AHT10_Read_Temperature();
- humidity = AHT10_Read_Humidity();
- lcd_set_color(BLACK,GREEN);
- lcd_show_string(30, 192, 16,"Temperature : %5d", (int)(temperature));
- lcd_show_string(30, 208, 16,"Humidity : %5d", (int)(humidity));
- sprintf(s_Str,"{"t":%d,"h":%d}",(int)(temperature),(int)(humidity));
- while(uartWriteBLEstr(s_Str)==RESET);
- }
为了能够更好的控制小车,这里使用的是PWM来控制,PWM的占空比可以通过手机端进行操作。
其初始化代码如下所示,pwm.h
- /*
- * pwm.h
- *
- * Created on: Jun 8, 2022
- * Author: flying
- */
- #ifndef USER_PWM_H_
- #define USER_PWM_H_
- void initPwm(void);
- #endif /* USER_PWM_H_ */
pwm.c,配置的定时器3的1和2通道,分别对PB0和PB1输出PWM信号,并通过驱动电路实现小车的控制。
PWM的周期为1ms,默认的占用比为50%;
- #include "pwm.h"
- void initPwm(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure={0};
- TIM_OCInitTypeDef TIM_OCInitStructure={0};
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure={0};
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE );
- RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init( GPIOB, &GPIO_InitStructure );
- TIM_TimeBaseInitStructure.TIM_Period = 1000-1;
- TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1;
- TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure);
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = 0;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- TIM_OC3Init( TIM3, &TIM_OCInitStructure );
- TIM_OC4Init( TIM3, &TIM_OCInitStructure );
- TIM_CtrlPWMOutputs(TIM3, ENABLE );
- TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Disable );
- TIM_OC4PreloadConfig( TIM3, TIM_OCPreload_Disable );
- TIM_ARRPreloadConfig( TIM3, ENABLE );
- TIM_Cmd( TIM3, ENABLE );
- }
下面开始对小车的控制方式进行设计,分别涉及到前进、后退、左转和右转、停止三个功能。
其实现函数如下所示。
- uint16_t speed=500;
- void foward(void)
- {
- GPIO_WriteBit(GPIOE, GPIO_Pin_13,Bit_RESET);
- GPIO_WriteBit(GPIOE, GPIO_Pin_15,Bit_RESET);
- TIM_SetCompare3(TIM3, speed);
- TIM_SetCompare4(TIM3, speed);
- }
- void back(void)
- {
- GPIO_WriteBit(GPIOE, GPIO_Pin_13,Bit_SET);
- GPIO_WriteBit(GPIOE, GPIO_Pin_15,Bit_SET);
- TIM_SetCompare3(TIM3, 0);
- TIM_SetCompare4(TIM3, 0);
- }
- void left(void)
- {
- GPIO_WriteBit(GPIOE, GPIO_Pin_13,Bit_RESET);
- GPIO_WriteBit(GPIOE, GPIO_Pin_15,Bit_RESET);
- TIM_SetCompare3(TIM3, 0);
- TIM_SetCompare4(TIM3, speed);
- }
- void right(void)
- {
- GPIO_WriteBit(GPIOE, GPIO_Pin_13,Bit_RESET);
- GPIO_WriteBit(GPIOE, GPIO_Pin_15,Bit_RESET);
- TIM_SetCompare3(TIM3, speed);
- TIM_SetCompare4(TIM3, 0);
- }
- void stop(void)
- { GPIO_WriteBit(GPIOE, GPIO_Pin_13,Bit_RESET);
- GPIO_WriteBit(GPIOE, GPIO_Pin_15,Bit_RESET);
- TIM_SetCompare3(TIM3, 0);
- TIM_SetCompare4(TIM3, 0);
- }
小车部分的实现图片。
然后再开始设计BLE的控制程序,这个代码参考的是沁恒的BLE程序,下载链接如下所示。
https://www.wch.cn/downloads/WCHBleLib_MultiOS_ZIP.html
只需要简单修改几个代码就可以,然后是修改发送的功能,
在安卓里面定义显示温湿度的TextView和控制按键Button
然后修改MainActivity.java的功能
这里显示温湿度的代码在private void updateValueTextView(final byte[] data) 中,修改代码为
- JSONObject jb = new JSONObject(new String(data));
- double tt =jb.getDouble("t");
- tv_tt.setText(""+tt +" ℃");
- tt =jb.getDouble("h");
- tv_temp.setText(""+tt +" %");
这样温湿度数据就会显示了。
下面实现发送的代码。前面根据xml文件的ID,将实例化该空间。
因为代码重复性太大,这里就拿左转命令来介绍,当发送‘A’的时候小车实现前进,
在APP实现的代码
- btn_qian.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (!checkBtEnabled()) {
- showToast("请先打开蓝牙");
- return;
- }
- try {
- byte[] bytes = new byte[0];
- bytes = "A".getBytes("utf-8");
- write(SendType.TYPE_SINGLE, bytes, 0);
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- }
- });
在单片机里面实现控制的方式就是
- if(buffer[0]=='A'){
- foward();
- }
- buffer[0]=0;
设计的APP界面如下所示。
源代码如下所示
code.rar
(22.61 KB, 下载次数: 22)
因为视频上传不了,所以放两张操作图片吧。