文章目錄
- 前言
- 一、學(xué)習(xí)目的
- 二、代碼記錄
前言
? ? ? ? 將數(shù)據(jù)通過(guò)藍(lán)牙發(fā)送到手機(jī)上,是學(xué)生學(xué)習(xí)單片機(jī)的必備技能之一,它可以將手機(jī)作為簡(jiǎn)單的上位機(jī),從而使數(shù)據(jù)直觀地展現(xiàn)出來(lái)。
? ? ? ?藍(lán)牙的初始化、藍(lán)牙接受數(shù)據(jù)以及藍(lán)牙簡(jiǎn)單應(yīng)用的介紹和代碼記錄,可以看一看下面的文章,這次就主要記錄一下藍(lán)牙發(fā)送數(shù)據(jù)的學(xué)習(xí)。
HC-05藍(lán)牙模塊的使用_hc05藍(lán)牙調(diào)試助手_KAIs32的博客-CSDN博客
STM32學(xué)習(xí)記錄——使用藍(lán)牙點(diǎn)亮LED_stm32藍(lán)牙點(diǎn)燈_KAIs32的博客-CSDN博客
Arduino學(xué)習(xí)記錄——藍(lán)牙控制舵機(jī)(含LED指示燈)_arduino藍(lán)牙控制舵機(jī)_KAIs32的博客-CSDN博客
一、學(xué)習(xí)目的
? ? ? ?我主要是想通過(guò)藍(lán)牙發(fā)送數(shù)據(jù),將單片機(jī)上煙霧傳感器、光敏傳感器、火焰?zhèn)鞲衅鞯饶K檢測(cè)到的數(shù)據(jù)實(shí)時(shí)顯示在手機(jī)上,達(dá)到實(shí)時(shí)監(jiān)控的目的。
? ? ? ?至于傳感器的初始化,這里就不重復(fù)記錄了,可以看看下面的文章進(jìn)行復(fù)習(xí)。
STM32學(xué)習(xí)記錄——光敏傳感器的使用_stm32光敏傳感器_KAIs32的博客-CSDN博客
STM32學(xué)習(xí)記錄——煙霧傳感器的使用_mq2煙霧傳感器stm32代碼_KAIs32的博客-CSDN博客
二、代碼記錄
首先是各個(gè)傳感器的初始化,我統(tǒng)一寫在了同一個(gè).c文件里。
adc.h
#ifndef __ADC_H
#define __ADC_H
#include "stm32f10x.h"
void ADC_Pin_Init(void); //傳感器引腳、ADC初始化
float ADC_Trans(void); //煙霧傳感器獲取數(shù)據(jù)
#endif
adc.c
#include "adc.h"
#include "sys.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_adc.h"
void ADC_Pin_Init(void) //傳感器引腳、ADC初始化
{
GPIO_InitTypeDef GPIO_InitStruct;
ADC_InitTypeDef ADC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; //煙霧傳感器
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; //光敏傳感器
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; //火焰?zhèn)鞲衅? GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
ADC_InitStruct.ADC_NbrOfChannel = 1;
ADC_InitStruct.ADC_ScanConvMode = DISABLE;
ADC_Init(ADC1,&ADC_InitStruct);
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_239Cycles5);
ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
ADC_Cmd(ADC1,ENABLE);
}
float ADC_Trans (void) //煙霧傳感器獲取數(shù)據(jù)
{
float adc_value = 0;
u8 i = 0;
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);
for(i = 0; i < 50; i++)
{
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
adc_value = adc_value + ADC_GetConversionValue(ADC1);
}
return adc_value / 50;
}
接下來(lái)就是藍(lán)牙模塊初始化的代碼
hc05.h
#ifndef __HC05_H
#define __HC05_H
#include "sys.h"
void My_USART2_Init(void); //串口初始化函數(shù)
//void USART2_IRQHandler(void); //接受數(shù)據(jù)函數(shù)(這里不用,可以注釋掉)
void Bluetooth_SendData(char* data); //發(fā)送數(shù)據(jù)函數(shù)
#endif
hc05.c
代碼中有注釋,可以看一看
#include "hc05.h"
#include "usart.h"
//u8 res;
void My_USART2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART_InitStrue;
NVIC_InitTypeDef NVIC_InitStrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
//初始化RXD、TXD兩個(gè)引腳
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStrue);
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStrue);
//設(shè)置串口參數(shù)
USART_InitStrue.USART_BaudRate=9600;
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
USART_InitStrue.USART_Parity=USART_Parity_No;
USART_InitStrue.USART_StopBits=USART_StopBits_1;
USART_InitStrue.USART_WordLength=USART_WordLength_8b;
USART_Init(USART2,&USART_InitStrue);
USART_Cmd(USART2,ENABLE);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
//優(yōu)先級(jí)設(shè)置
NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStrue);
}
//void USART2_IRQHandler(void)
//{
// if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
// {
// res= USART_ReceiveData(USART2);
USART_SendData(USART2,res);
// }
//}
void Bluetooth_SendData(char* data)
{
while (*data)
{
USART_SendData(USART2, *data++);
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}
}
最后是主函數(shù)
main.c文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-722252.html
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "adc.h"
#include "hc05.h"
#define BUFFER_SIZE 100
char buffer[BUFFER_SIZE];
int main(void)
{
float ad = 0;
My_USART2_Init();
delay_init();
uart_init(115200);
ADC_Pin_Init();
while(1)
{
if( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0 && 0 == GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0))
{
ad = ADC_Trans();
snprintf(buffer, BUFFER_SIZE, "ad0 Data: %f\r\nfire\r\nbright\r\n", ad);
Bluetooth_SendData(buffer);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
delay_ms(1000);
}
else if( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1 && 0 == GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0))
{
ad = ADC_Trans();
snprintf(buffer, BUFFER_SIZE, "ad0 Data: %f\r\nfire\r\ndarkness\r\n", ad);
Bluetooth_SendData(buffer);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
delay_ms(1000);
}
else if( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1 && 1 == GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0))
{
ad = ADC_Trans();
snprintf(buffer, BUFFER_SIZE, "ad0 Data: %f\r\nfireless\r\ndarkness\r\n", ad);
Bluetooth_SendData(buffer);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
delay_ms(1000);
}
else if( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0 && 1 == GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0))
{
ad = ADC_Trans();
snprintf(buffer, BUFFER_SIZE, "ad0 Data: %f\r\nfireless\r\nbright\r\n", ad);
Bluetooth_SendData(buffer);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
delay_ms(1000);
}
delay_ms(100);
}
}
? ? ? ? 主函數(shù)比較復(fù)雜,實(shí)現(xiàn)的功能主要是實(shí)時(shí)顯示煙霧濃度、是否有光和是否有火,可以在這個(gè)基礎(chǔ)上進(jìn)行修改和刪減。由于是寫記錄時(shí)稍加修改后的代碼,可能有一定的小問(wèn)題,如果遇到問(wèn)題或者需要源碼可以評(píng)論交流一下。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-722252.html
到了這里,關(guān)于STM32學(xué)習(xí)記錄——藍(lán)牙發(fā)送數(shù)據(jù)(手機(jī)顯示傳感器數(shù)據(jù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!