基于stm32f103c8t6与jdy23蓝牙模块实现手机app点亮灯

 

蓝牙模块:jdy23

1.介绍:

JDY-23 透传模块是基于蓝牙 5.0 协议标准,工作频段为 2.4GHZ 范围,调制方式为 GFSK,
最大发射功率为 4db,最大发射距离 60 米,采用进口原装芯片设计,支持用户通过 AT 命令
修改设备名、波特率等指令,方便快捷使用灵活。
JDY-23 蓝牙模块可以实现模块与手机数据传输,默认无需配置即可快速使用 BLE 蓝牙
进行产品应用。

2.硬件电路:

如透传不需要低功耗或在连接状态下不需要发断开指令,PWRC 引脚可以不接。 如不需要低功耗,不需要检测连接状态的话,只需要连接 VCC、GND、RXD、TXD 4 个引脚

3.AT指令的使用:

1.首先蓝牙模块直接和转串口模块链接 rx ==》tx  tx===》rx
2.使用电脑串口助手 打开串口 波特率9600
3.注意蓝牙模块需要在断开连接时才能进入AT调试模式
4.发送记得得加换行 勾选上串口助手发送的换行

4.模块使用:

1.与串口配置一模一样 直接使用串口配置即可 串口的rx tx 直接连接蓝牙模块
2.使用手机连接蓝牙 发送指令 手机app好像换行不了 所以程序代码的内容标志位符号得换成别的 
3.检查插线 最后换了根线 解决了只接不发问题 

5.实物接线:

stm32f103c8t6最小系统板 小灯泡 oled显示屏幕 蓝牙模块

蓝牙模块接PA9 PA10 tx rx互相接起来

oled SCL接PB8 SDA接PB9

灯泡接PA1

基于stm32f103c8t6与jdy23蓝牙模块实现手机app点亮灯_第1张图片

 手机使用蓝牙助手连接后 发送@LED_ON*# 为开灯 @LED_OFF*#为关灯

6.实现代码

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "LED.h"
#include "string.h"
​
int main(void)
{
    OLED_Init();
    LED_Init();
    Serial_Init();
    
    OLED_ShowString(1, 1, "TxPacket");
    OLED_ShowString(3, 1, "RxPacket");
    
    while (1)
    {
        if (Serial_RxFlag == 1)
        {
            OLED_ShowString(4, 1, "                ");
            OLED_ShowString(4, 1, Serial_RxPacket);
            
            if (strcmp(Serial_RxPacket, "LED_ON") == 0) 
            {
                LED1_ON();
                Serial_SendString("LED_ON_OK\r\n");
                OLED_ShowString(2, 1, "                ");
                OLED_ShowString(2, 1, "LED_ON_OK");
            }
            else if (strcmp(Serial_RxPacket, "LED_OFF") == 0)
            {
                LED1_OFF();
                Serial_SendString("LED_OFF_OK\r\n");
                OLED_ShowString(2, 1, "                ");
                OLED_ShowString(2, 1, "LED_OFF_OK");
            }
            else
            {
                Serial_SendString("ERROR_COMMAND\r\n");
                OLED_ShowString(2, 1, "                ");
                OLED_ShowString(2, 1, "ERROR_COMMAND");
            }
​
​
            Serial_RxFlag = 0;
        }
    }
}

Serial.c

#include "stm32f10x.h"                  // Device header
#include 
#include 
​
char Serial_RxPacket[100];              //"@MSG\r\n"
uint8_t Serial_RxFlag;
​
void Serial_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_Init(USART1, &USART_InitStructure);
    
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
    
    USART_Cmd(USART1, ENABLE);
}
​
void Serial_SendByte(uint8_t Byte)
{
    USART_SendData(USART1, Byte);
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
​
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
    uint16_t i;
    for (i = 0; i < Length; i ++)
    {
        Serial_SendByte(Array[i]);
    }
}
​
void Serial_SendString(char *String)
{
    uint8_t i;
    for (i = 0; String[i] != '\0'; i ++)
    {
        Serial_SendByte(String[i]);
    }
}
​
uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
    uint32_t Result = 1;
    while (Y --)
    {
        Result *= X;
    }
    return Result;
}
​
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
    uint8_t i;
    for (i = 0; i < Length; i ++)
    {
        Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');
    }
}
​
int fputc(int ch, FILE *f)
{
    Serial_SendByte(ch);
    return ch;
}
​
void Serial_Printf(char *format, ...)
{
    char String[100];
    va_list arg;
    va_start(arg, format);
    vsprintf(String, format, arg);
    va_end(arg);
    Serial_SendString(String);
}
​
void USART1_IRQHandler(void)
{
    static uint8_t RxState = 0;
    static uint8_t pRxPacket = 0;
    if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
    {
        uint8_t RxData = USART_ReceiveData(USART1);
        
        if (RxState == 0)
        {
            if (RxData == '@' && Serial_RxFlag == 0)
            {
                RxState = 1;
                pRxPacket = 0;
            }
        }
        else if (RxState == 1)
        {
            if (RxData == '*')
            {
                RxState = 2;
            }
            else
            {
                Serial_RxPacket[pRxPacket] = RxData;
                pRxPacket ++;
            }
        }
        else if (RxState == 2)
        {
            if (RxData == '#')
            {
                RxState = 0;
                Serial_RxPacket[pRxPacket] = '\0';
                Serial_RxFlag = 1;
            }
        }
        
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}
​

有需要完全代码可联系我 一起学习交流!

github:Abear6666/stm32_blue: 基于stm32f103的蓝牙模块控制灯亮灭demo (github.com)

你可能感兴趣的:(学习中的实战项目,stm32,单片机,arm)