“蓝泵“ - 基于STM32的蓝牙遥控水泵

一、目录

目录

前言

正文

总结


二、前言

        随着物联网技术的不断发展,人们对智能化控制的需求也越来越高。在日常生活中,我们常常遇到需要遥控操作的场景,如遥控车、遥控飞机等。除此之外,我们还可以利用物联网技术进行远程控制,如控制家里的电器、遥控浇花等。本文是一篇介绍如何利用蓝牙技术控制水泵的文章。蓝泵应用到的硬件有stm32f103c8t6最小系统板、继电器、水泵HC-05蓝牙模块,蓝泵的功能是通过蓝牙调试器app给stm32发送指令,控制继电器的开关,进而控制水泵。该系统可以用于遥控浇花,温室绿植,前景广阔。


三、正文

(一)stm32f103c8t6最小系统板

        STM32F103C8T6最小系统板是一款基于ST公司的STM32F103C8T6芯片的开发板。其设计简单、体积小、使用方便,是学习和开发STM32F103C8T6的理想选择。此款开发板就可以完成“蓝泵”系统的设计,以下是其主要优点:

  1. 价格实惠:相比于其他开发板,STM32F103C8T6最小系统板的价格较为实惠。这使得它成为学习STM32F103C8T6芯片的理想选择。

  2. 强大的处理能力:STM32F103C8T6芯片采用Cortex-M3内核,运行速度快,处理能力强,可开发出高效的嵌入式应用程序。

  3. 丰富的资源:STM32F103C8T6最小系统板提供了丰富的资源,包括GPIO口、串口、定时器、ADC等,方便开发者进行各种实验和项目。

  4. 易于开发:STM32F103C8T6最小系统板支持多种开发环境,包括Keil、IAR、MDK等,开发者可以根据自己的喜好和需要选择合适的开发环境进行开发。

  5. 硬件丰富:STM32F103C8T6最小系统板上集成了丰富的硬件资源,包括LED指示灯、按键、晶振等,方便开发者进行各种实验和项目。

  6. 代码丰富:STM32F103C8T6最小系统板可以很容易地从互联网上获取丰富的开源代码和资料,方便开发者学习和使用。

(二)继电器

         1路5V继电器模块适用于各种控制电路中,可以用于控制灯光、电机、电磁阀等设备的开关。它的使用方法如下:

        1.将模块的VCC引脚连到5V电源,GND引脚连到地线,IN引脚连到控制信号引脚。

        2.将需要控制的设备的正极接到模块的COM引脚,负极接到NO(常开)引脚。当控制信号接通时,继电器会吸合,将NO引脚与COM引脚相连,设备开始工作;当控制信号断开时,继电器失去吸合电流,NO引脚与COM引脚分离,设备停止工作。

        3.如果需要控制的设备的正负极接反了,可以将设备的正极接到NC(常闭)引脚,负极接到COM引脚。在这种情况下,当控制信号接通时,继电器失去吸合电流,NC引脚与COM引脚相连,设备开始工作;当控制信号断开时,继电器会吸合,NC引脚与COM引脚分离,设备停止工作。

        4.模块带有指示灯,可根据指示灯状态来判断继电器是否吸合。

1dfd2645af314b4a80ebf724a9776e2a.webpbec86d2e017346e18afe745644923ff3.webp

注意事项:

        1.模块的VCC和GND引脚必须正确接入,接反会导致继电器无法工作或烧坏。

        2.控制信号的电压范围为0V-5V,大于5V会损坏模块。

        3.模块的继电器开关容量最大为10A,超出容量可能导致继电器失效或损坏。

        4.使用前请确保继电器模块与要控制的设备电路之间的电源电压相同。

(三)水泵

        直流电机3V小水泵的工作电压为2.5~6V,红色线连接电源正极,黑色线连接电源负极,对应的继电器:黑色——COM、红色——NO。

b6dc95074d094ff78b50a9709a361805.webp

注:在水泵与继电器相连的红色正极线之间需要外加电源,正极连接继电器的一端,负极水泵一端相连。外加电源的电压需要大于继电器VCC电源电压,继电器的原理是小电压驱动大电压。

511b7eeb91a049778c7bbf478689cc5d.jpeg

(四)蓝牙模块

        蓝牙模块需要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”水泵停止工作。


四、总结

        本文主要介绍了如何利用蓝牙技术来控制水泵,在程序编写时需要注意相应的引脚。通过对硬件和软件的介绍,解了蓝泵系统的工作原理和具体实现。蓝泵系统的功能十分实用,可以用于遥控浇花、控制温室绿植等方面。同时,本文的学习还可以让读者对物联网技术有更深刻的理解,为今后的智能化控制提供更多的思路和帮助。

  • 7
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要控制STM32F103C8T6上的继电器来点亮LED,你需要连接继电器模块32F103C8T6的GPIO脚上,并编写相应的代码来制GPIO引脚的输出状态。 以下是一个简单的示例代码,演示如何使用GPIO引脚控制继电器来点亮LED: ```c #include "stm32f10x.h" #define LED_PIN GPIO_Pin_13 // LED连接到GPIO引脚13 #define RELAY_PIN GPIO_Pin_12 // 继电器连接到GPIO引脚12 void GPIO_Configuration(void); int main(void) { GPIO_Configuration(); while (1) { // 将GPIO引脚12设置为高电平,以使继电器吸合 GPIO_SetBits(GPIOB, RELAY_PIN); // 延时一段时间,让LED亮起来 for (int i = 0; i < 1000000; i++); // 将GPIO引脚12设置为低电平,以使继电器断开 GPIO_ResetBits(GPIOB, RELAY_PIN); // 延时一段时间,让LED熄灭 for (int i = 0; i < 1000000; i++); } } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 配置LED引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = LED_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 配置继电器引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = RELAY_PIN; GPIO_Init(GPIOB, &GPIO_InitStructure); } ``` 在这个示例中,我们使用了GPIO引脚13来连接LED,GPIO引脚12来连接继电器。在主循环中,我们首先将GPIO引脚12设置为高电平,以使继电器吸合,从而点亮LED。然后延时一段时间,再将GPIO引脚12设置为低电平,以使继电器断开,从而熄灭LED。循环不断地执行这两个步骤,让LED闪烁起来。 请注意,此示例代码假设你已经正确配置了STM32F103C8T6的系统时钟和GPIO引脚的时钟。你需要根据实际情况进行适当的修改和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器人天笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值