基于STM32单片机的水位浑浊度检测设计
1、项目简介
- 演示视频,视频简介中包含资料
- https://www.bilibili.com/video/BV1nH4y1z7g7
1.1 系统构成
本设计由STM32单片机+蜂鸣器报警电路+OLED显示电路+水位监测电路+TSW-30浑浊度监测电路+电源电路组成。
1.2 系统功能
- 1、 通过stm32单片机,实时水位、浑浊度数据,并将数据实时显示在OLED液晶显示屏上。
- 2、水位超过设置的阈值,蜂鸣器报警
- 3、浑浊度超过设置的阈值,蜂鸣器报警
2、部分电路设计
2.1 stm32f103c8t6单片机最小系统电路设计
STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装。
具体参数为:
- 64K x 8bit的Flash
- 20K x 8bit的SRAM
- 37个GPIO,分别为PA0-PA15、PB0-PB15、PC13-PC15、PD0-PD1
- 2个12bit ADC合计12路通道,外部通道:PA0到PA7以及PB0到PB1
- 内部通道:温度传感器通道ADC_Channel_16和内部参考电压通道ADC_Channel_17
- 4个16bit定时器/计数器,分别为TIM1、TIM2、TIM3、TIM4
- 2个看门狗定时器(独立看门狗IWDG、窗口看门狗WWDG)
- 1个24bit向下计数的滴答定时器systick
- 2个IIC,2个SPI,3个USART,1个CAN
- 内部8MHz时钟HSI最高可倍频到64MHz,外部8MHz时钟HSE最高可倍频到72MHz
Cortex-M3是ARM公司推出的基于ARMv7架构的MCU内核,ST公司在此内核的基础上完成了USART、DMA、GPIO等外围电路的设计。
STM32单片机最小系统电路由复位电路、时钟电路和电源电路。拥有这三部分电路后,单片机即可正常工作。
单片机最小系统原理图如下图所示:
实物图:
2.2 OLED液晶显示电路设计
IIC-OLED模块是一种高品质、高性能的显示屏,采用了有机发光二极管(OLED)技术,通过四个针脚控制电源和信号来实现对显示内容的控制。该模块具有以下特点:
- 低功耗:OLED技术具有自发光特性,因此相比其他类型的显示屏,该模块具有更低的功耗,延长了电池寿命。
- 高可靠性:该模块采用了高品质的材料和工艺,严格把控生产流程,保证了产品的稳定性和可靠性,适用于各种环境下的使用。
- 简单易用:该模块通过四个针脚进行控制,接口简单,易于集成到各种设备中。
OLED的定义和优势:
- OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
- LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术,OLED的尺寸还难以大型化,但是分辨率确可以做到很高。
电路设计
OLED模块实物图:
2.2 蜂鸣器报警电路设计
-
蜂鸣器是一种将电信号转换成声音信号的器件。按驱动方式分类,可以分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器内部自带震荡源,通直流电就能发声。无源蜂鸣器内部不带震荡源,需要控制震荡脉冲的频率,就能发出不同频率声音。
-
电路图如下:
-
蜂鸣器实物图
2.3 浑浊度检测传感器(TSW-30)
-
TS 浊度传感器是 GE 公司开发的一种专门用于家电产品的低成本传感器,该模块价格低廉、使用方便、测量精度高可以用于洗衣机、洗碗机等产品的水污浊程度的测量;也可以用于工业现场控制,环境污水采集等需要浊度检测控制的场合。
-
这款浊度传感器利用光学原理,通过溶液中的透光率和散射率来综合判断浊度情况。传感器内部是一个红外线对管,当光线穿过一定量的水时,光线的透过量取决于该水的污浊程度,水越污浊,透过的光就越少。光接收端把透过的光强度转换为对应的电流大小,透过的光多,电流大,反之透过的光少,电流小。浊度传感器模块将传感器输出的电流信号转换为电压信号,通过单片机进行AD 转换数据处理。
-
该款模块具有模拟量和数字量输出接口。模拟量可通过单片机 A/D 转换器进行采样处理,以获知当前水的污浊度。数字量可通过模块上的电位器调节触发阈值,当浊度达到设置好的阈值后,D1 指示灯会被点亮,传感器模块输出由高电平变成低电平,单片机通过监测电平的变化,判断水的浊度是否超标,从而预警或者联动其他设备。
电路图:
- TS-300B浑浊度模块实物图:
3、部分代码展示
3.1 OLED的初始化
//OLED的初始化
void OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能A端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PA0,1
GPIO_SetBits(GPIOB,GPIO_Pin_6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PA2
GPIO_SetBits(GPIOB,GPIO_Pin_7);
// OLED_RES_Clr();
// delay_ms(200);
// OLED_RES_Set();
OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness
OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
OLED_WR_Byte(0x00,OLED_CMD);//-not offset
OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
OLED_WR_Byte(0x12,OLED_CMD);
OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
OLED_WR_Byte(0x30,OLED_CMD);//Set VCOM Deselect Level
OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
OLED_WR_Byte(0x02,OLED_CMD);//
OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
OLED_Clear();
OLED_WR_Byte(0xAF,OLED_CMD);
}
3.2 TSW-30浑浊度传感器初始化
void TSW30Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); //使能ADC1通道时钟
//PA0 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
3.3 获取水位传感器电压值
//读取水位传感器的电压值
float WaterGetValueV(void)
{
uint16_t value = 0;
float water_v = 0;
value = Get_Adc_Average(WATER_ADC_CH1,WATER_READ_TIMES); //读取ADC值
water_v = (float)value * (3.3 / 4096);
return water_v;
}