一、目录
二、前言
随着物联网技术的不断发展,人们对智能化控制的需求也越来越高。在日常生活中,我们常常遇到需要遥控操作的场景,如遥控车、遥控飞机等。除此之外,我们还可以利用物联网技术进行远程控制,如控制家里的电器、遥控浇花等。本文是一篇介绍如何利用蓝牙技术控制水泵的文章。蓝泵应用到的硬件有stm32f103c8t6最小系统板、继电器、水泵HC-05蓝牙模块,蓝泵的功能是通过蓝牙调试器app给stm32发送指令,控制继电器的开关,进而控制水泵。该系统可以用于遥控浇花,温室绿植,前景广阔。
三、正文
(一)stm32f103c8t6最小系统板
STM32F103C8T6最小系统板是一款基于ST公司的STM32F103C8T6芯片的开发板。其设计简单、体积小、使用方便,是学习和开发STM32F103C8T6的理想选择。此款开发板就可以完成“蓝泵”系统的设计,以下是其主要优点:
-
价格实惠:相比于其他开发板,STM32F103C8T6最小系统板的价格较为实惠。这使得它成为学习STM32F103C8T6芯片的理想选择。
-
强大的处理能力:STM32F103C8T6芯片采用Cortex-M3内核,运行速度快,处理能力强,可开发出高效的嵌入式应用程序。
-
丰富的资源:STM32F103C8T6最小系统板提供了丰富的资源,包括GPIO口、串口、定时器、ADC等,方便开发者进行各种实验和项目。
-
易于开发:STM32F103C8T6最小系统板支持多种开发环境,包括Keil、IAR、MDK等,开发者可以根据自己的喜好和需要选择合适的开发环境进行开发。
-
硬件丰富:STM32F103C8T6最小系统板上集成了丰富的硬件资源,包括LED指示灯、按键、晶振等,方便开发者进行各种实验和项目。
-
代码丰富:STM32F103C8T6最小系统板可以很容易地从互联网上获取丰富的开源代码和资料,方便开发者学习和使用。
(二)继电器
1路5V继电器模块适用于各种控制电路中,可以用于控制灯光、电机、电磁阀等设备的开关。它的使用方法如下:
1.将模块的VCC引脚连到5V电源,GND引脚连到地线,IN引脚连到控制信号引脚。
2.将需要控制的设备的正极接到模块的COM引脚,负极接到NO(常开)引脚。当控制信号接通时,继电器会吸合,将NO引脚与COM引脚相连,设备开始工作;当控制信号断开时,继电器失去吸合电流,NO引脚与COM引脚分离,设备停止工作。
3.如果需要控制的设备的正负极接反了,可以将设备的正极接到NC(常闭)引脚,负极接到COM引脚。在这种情况下,当控制信号接通时,继电器失去吸合电流,NC引脚与COM引脚相连,设备开始工作;当控制信号断开时,继电器会吸合,NC引脚与COM引脚分离,设备停止工作。
4.模块带有指示灯,可根据指示灯状态来判断继电器是否吸合。
注意事项:
1.模块的VCC和GND引脚必须正确接入,接反会导致继电器无法工作或烧坏。
2.控制信号的电压范围为0V-5V,大于5V会损坏模块。
3.模块的继电器开关容量最大为10A,超出容量可能导致继电器失效或损坏。
4.使用前请确保继电器模块与要控制的设备电路之间的电源电压相同。
(三)水泵
直流电机3V小水泵的工作电压为2.5~6V,红色线连接电源正极,黑色线连接电源负极,对应的继电器:黑色——COM、红色——NO。
注:在水泵与继电器相连的红色正极线之间需要外加电源,正极连接继电器的一端,负极水泵一端相连。外加电源的电压需要大于继电器VCC电源电压,继电器的原理是小电压驱动大电压。
(四)蓝牙模块
蓝牙模块需要HC-05蓝牙模块、蓝牙调试助手app等知识,可以参考下面链接里的内容。
https://mp.csdn.net/mp_blog/creation/editor/131792244
(五)本系统应用的程序代码
1.继电器
#include "jdq.h"
#include <stm32f10x.h>
void relay_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_SetBits(GPIOA,GPIO_Pin_7);
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void relay_off(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_7);
}
void relay_on(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
}
#ifndef __JDQ_H
#define __JDQ_H
#include "sys.h"
void relay_init(void);
void relay_on(void);
void relay_off(void);
#endif
2.蓝牙
#include "USART.H"
#include "motor.h"
#include <stdio.h>
#include <string.h>
#include "usart.h"
#include "stdarg.h"
#include "systick.h"
#if SYSTEM_SUPPORT_OS
#include "includes.h"
#endif
struct __FILE
{
int handle;
};
void _sys_exit(int x)
{
x=x;
}
int fpuct(int ch,FILE *f)
{
while(SET!=USART_GetFlagStatus(USART3,USART_FLAG_TC));
USART_SendData(USART3,ch);
return ch;
}
void Usart3_Init(u32 baud)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate=baud;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART3,&USART_InitStructure);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
USART_ClearFlag(USART3,USART_FLAG_TC);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART3, ENABLE);
MotorInit();
}
#if EN_USART3_RX
u8 USART_RX_BUF[USART_REC_LEN];
u16 USART_RX_STA=0;
extern int g_USART3_FLAG ;
extern int Mode;
void USART3_IRQHandler(void)
{
u8 Res;
#if SYSTEM_SUPPORT_OS
OSIntEnter();
#endif
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
Res = USART_ReceiveData(USART3);
if(Res == 'A') g_USART3_FLAG = 1;//打开
if(Res == 'B') g_USART3_FLAG = 2;//关闭
}
#if SYSTEM_SUPPORT_OS
OSIntExit();
#endif
}
#endif
int k;
void UsartPrintf(USART_TypeDef * USARTx,char * fmt ,...)
{
unsigned char UsartPrintBuf[256];
va_list ap;
unsigned char *pStr = UsartPrintBuf;
va_start(ap,fmt);
vsprintf((char *)UsartPrintBuf,fmt,ap);
va_end(ap);
while(*pStr != 0)
{
USART_SendData(USARTx,*pStr++);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) == RESET);
}
for(k=1;k<=3;k++)
{
delay_ms(1000);
}
}
#ifndef _USART_H
#define _USART_H
#include "stm32f10x.h"
#include "motor.h"
#include <stdio.h>
#include <string.h>
#define USART_REC_LEN 200
#define EN_USART3_RX 1
void Usart3_Init(u32 baud);
void parse_cmd(void);
void USART3_IRQHandler(void);
void usart3_putc(char ch);
void usart3_puts(const char *s);
int fpuct(int ch,FILE *f);
void _sys_exit(int x);
void UsartPrintf(USART_TypeDef * USARTx,char * fmt ,...);
extern int g_USART3_FLAG ;
extern u8 USART_RX_BUF[USART_REC_LEN];
extern u16 USART_RX_STA;
#endif
3.主函数
#include "stm32f10x.h" // Device header
#include "PWM.h"
#include "motor.h"
#include "systick.h"
#include "PWM.H"
#include "USART.H"
u8 i;
u8 flag;
int g_USART3_FLAG = 0 ;
int Mode = 0;
int Mode2 = 0;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
TIM3_PWM_Init(899,0);
MotorInit();
Usart3_Init(9600);
while (1)
{
if(g_USART3_FLAG == 1)
{
Turnfront();
delay_ms(500);
}
if(g_USART3_FLAG == 2)
{
Turnback();
delay_ms(500);
}
}
}
(六)本项目电路连接方式
1、继电器NO——水泵正极
2、继电器COM——水泵负极
3、继电器IN——最小系统板A7
4、继电器VCC——最小系统板3.3V
5、继电器GND——最小系统板GND
6、USB转TTL CH340模块与HC-05蓝牙模块:VCC——VCC、GND——GND、TXD——RXD、RXD——TXD(交叉连接)
7、HC-05蓝牙模块与最小系统板:VCC——3.3V、GND——G、TXD——B11、RXD——B10
(七)功能实现
通过蓝牙调试器发送字母“A”水泵工作,发送字母“B”水泵停止工作。
四、总结
本文主要介绍了如何利用蓝牙技术来控制水泵,在程序编写时需要注意相应的引脚。通过对硬件和软件的介绍,解了蓝泵系统的工作原理和具体实现。蓝泵系统的功能十分实用,可以用于遥控浇花、控制温室绿植等方面。同时,本文的学习还可以让读者对物联网技术有更深刻的理解,为今后的智能化控制提供更多的思路和帮助。