文章目录
前言
本篇文章用于记录在进行32学习时的一些记录,以便个人回顾,个人能力有限,如有发现错误,欢迎各位大佬指点。一起加油!
链接在最后!!!
一、所用器件
(1)STM32F103ZET6
主控开发板
(2) MQ_烟雾传感器
通过ADC外设进行数据采集。
(3)声音传感器
通过外部中断来进行操作。
(5)sg90舵机
通过设置定时器输出PWM波来进行控制转动。
模拟舵机与数字舵机的区别
(5)DHT11 温湿度传感器
依据数据手册编写内部时序。
点这里看操作
(6)OLED显示屏
通过iic进行数据通信。
二、代码分析
1.接线
STM32 | DHT11 |
---|---|
PB11 | DO |
STM32 | MQ_气体检测 |
---|---|
PA4 | AO |
STM32 | 声音传感器 |
---|---|
PA1 | DO |
STM32 | OLED |
---|---|
PB0 | SCL |
PB1 | SDA |
STM32 | SG90舵机 |
---|---|
PB5 | DO |
PB4 | DO |
在进行使用的时候发现有一个舵机烧坏了,在这里把两个PWM输出口都说明了,但是只用了一个。
2.代码分析
main.c
int main()
{
//MQ2_Sensor 初始化
extern u16 ADC_Val;
// DHT11初始化
uint16_t i;
uint8_t k;
uint8_t kk;
uint8_t kkk;
uint8_t pwmval1;
initSysTick();
delay_ms(1500);
Adc_Init();
Sound_Init();
TIM3_PWM_Init(199, 7199);
OLED_Init(); //OLED初始籨?
OLED_Clear();
Oled_Show();
Usart1_Init(115200);
while(1)
{
/*******************************************************
声源检测
*******************************************************/
OLED_ShowString(74,6,"off");
/*******************************************************
气敏检测
*******************************************************/
ADC_Val_Disp(10,20); //气敏检测
// printf("t=%d,h=%d\r\n",t,h);
OLED_ShowString(74,0,"normality");
// OLED_ShowNum(72,0,ADC_Val/1000,4,4);
// OLED_ShowNum(85,0,(ADC_Val%1000)/100,4,4);
// OLED_ShowNum(97,0,(ADC_Val%100)/10,4,4);
// OLED_ShowNum(111,0,ADC_Val%10,4,4);
// delay_ms(1000);
/*******************************************************
温度检测
*******************************************************/
DHT11_UpdateData();
i = Rxbuff[0]+ Rxbuff[1]+Rxbuff[2]+ Rxbuff[3];
if(Rxbuff[4] ==i)
{
k=Rxbuff[2];
kk=Rxbuff[0];
kkk=Rxbuff[3];
OLED_ShowNum(74,2,k/10,3,3);
OLED_ShowNum(82,2,k%10,3,3);
OLED_ShowNum(98,2,kkk,3,3);
OLED_ShowNum(88,4,kk/10,3,3);
OLED_ShowNum(98,4,kkk%10,3,3);
}
delay_ms(2000);
}
}
DHT11.c
void DHT11_GPIO_Init(void); //DHT11_GPIO 输出函数
void DHT11_GPIO_Init1(void); //DHT11_GPIO 输入函数
void DHT11_Start(void); //DHT11 起始信号
void DHT11_ReceptionBuff(void); //DHT11 时序图编写的函数
void DHT11_UpdateData(void); //DHT11 初始化
MQ_Sensor.c
void Adc_Init(void); //初始化ADC
u16 Get_adcvalue(void); //得到数据(数字量)
void ADC_Val_Disp(u8 Page,u8 Colum); //得到数据(模拟量) 在主函数中 令其=ADC_Val
EXIC.c
void GPIo_Init(void); // GPIO初始化
void EXIC1_Init(void); // 设置外部中断
oled.c
static void OLED_IIC_Start(void); //iic起始信号
static void OLED_IIC_Stop(void); //iic停止信号
static unsigned char IIC_Wait_Ack(void); //iic应答信号
static void Write_IIC_Byte(unsigned char IIC_Byte); //iic写操作
static void Write_IIC_Command(unsigned char IIC_Command); //iic写指令
static void Write_IIC_Data(unsigned char IIC_Data); //iic写数据
void OLED_WR_Byte(unsigned char dat,unsigned char cmd); //oled写入一个字节
void OLED_Set_Pos(unsigned char x,unsigned char y); //设置数据写入的起始行,列
void OLED_Display_On(void); //oled开显示
void OLED_Display_Off(void); //oled关显示
void OLED_Clear(void); //oled清屏
void OLED_ShouChar(unsigned char x,unsigned char y,unsigned char chr); //oled写入一个字符
void OLED_Init(void); //oled初始化 (此函数为厂家提供的)
void OLED_ShowString(unsigned char x, unsigned char y,unsigned char *chr); //oled显示一个字符串
void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len ,unsigned char size); //oled显示一个数字
void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no); //oled显示 温湿度字符(使用了自定义的字库)
void OLED_ShowMQ(unsigned char x,unsigned char y,unsigned char no); //oled显示气体浓度字符 (使用了自定义的字库)
void OLED_ShowSound(unsigned char x,unsigned char y,unsigned char no); //oled显示声源检测 (使用自定义的字库)
timer.c
void TIM3_Int_Init(u16 arr,u16 psc); //配置定时器TIM3
void TIM3_PWM_Init(u16 arr,u16 psc); //定时器输出双路PWM波
3.注意事项
在使用时由于使用的杜邦线接线,所以会有接触不好的情况
如果出现显示不对的时候可以按复位键重新通信
4.实验现象
上电之后 ,oled显示 :气体浓度、当前温度、当前湿度、声源检测。
当检测到声音之后会控制舵机进行制动。
总结
由于时间关系有好多模块没有加上,而且这个项目比较简单,在代码的分析上只写了函数名,想要了解详细代码,可以私聊我发你邮箱。
另外,能力有限,在主函数的逻辑上还有许多欠佳的地方,欢迎大佬们指点。
链接:https://pan.baidu.com/s/1Mfc3eFAvvVRgMS9zAYk3dA
提取码:A0G4