基于STM32单片机的水位浑浊度检测设计
  • 1、项目简介
  • 1.1 系统构成
  • 1.2 系统功能
  • 2、部分电路设计
  • 2.1 stm32f103c8t6单片机最小系统电路设计
  • 2.2 OLED液晶显示电路设计
  • 2.2 蜂鸣器报警电路设计
  • 2.3 浑浊度检测传感器(TSW-30)
  • 3、部分代码展示
  • 3.1 OLED的初始化
  • 3.2 TSW-30浑浊度传感器初始化
  • 3.3 获取水位传感器电压值

1、项目简介

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单片机最小系统电路由复位电路、时钟电路和电源电路。拥有这三部分电路后,单片机即可正常工作。

单片机最小系统原理图如下图所示:

毕业设计|基于STM32单片机的水位浑浊度检测设计_单片机

实物图:

毕业设计|基于STM32单片机的水位浑浊度检测设计_课程设计_02

2.2 OLED液晶显示电路设计

IIC-OLED模块是一种高品质、高性能的显示屏,采用了有机发光二极管(OLED)技术,通过四个针脚控制电源和信号来实现对显示内容的控制。该模块具有以下特点:

  • 低功耗:OLED技术具有自发光特性,因此相比其他类型的显示屏,该模块具有更低的功耗,延长了电池寿命。
  • 高可靠性:该模块采用了高品质的材料和工艺,严格把控生产流程,保证了产品的稳定性和可靠性,适用于各种环境下的使用。
  • 简单易用:该模块通过四个针脚进行控制,接口简单,易于集成到各种设备中。

OLED的定义和优势:

  • OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
  • LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术,OLED的尺寸还难以大型化,但是分辨率确可以做到很高。

电路设计

毕业设计|基于STM32单片机的水位浑浊度检测设计_毕业设计_03

OLED模块实物图:


2.2 蜂鸣器报警电路设计

  • 蜂鸣器是一种将电信号转换成声音信号的器件。按驱动方式分类,可以分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器内部自带震荡源,通直流电就能发声。无源蜂鸣器内部不带震荡源,需要控制震荡脉冲的频率,就能发出不同频率声音。

  • 电路图如下:
  • 毕业设计|基于STM32单片机的水位浑浊度检测设计_单片机_04


  • 蜂鸣器实物图
  • 毕业设计|基于STM32单片机的水位浑浊度检测设计_单片机_05

2.3 浑浊度检测传感器(TSW-30)

  • TS 浊度传感器是 GE 公司开发的一种专门用于家电产品的低成本传感器,该模块价格低廉、使用方便、测量精度高可以用于洗衣机、洗碗机等产品的水污浊程度的测量;也可以用于工业现场控制,环境污水采集等需要浊度检测控制的场合。
  • 这款浊度传感器利用光学原理,通过溶液中的透光率和散射率来综合判断浊度情况。传感器内部是一个红外线对管,当光线穿过一定量的水时,光线的透过量取决于该水的污浊程度,水越污浊,透过的光就越少。光接收端把透过的光强度转换为对应的电流大小,透过的光多,电流大,反之透过的光少,电流小。浊度传感器模块将传感器输出的电流信号转换为电压信号,通过单片机进行AD 转换数据处理。
  • 该款模块具有模拟量和数字量输出接口。模拟量可通过单片机 A/D 转换器进行采样处理,以获知当前水的污浊度。数字量可通过模块上的电位器调节触发阈值,当浊度达到设置好的阈值后,D1 指示灯会被点亮,传感器模块输出由高电平变成低电平,单片机通过监测电平的变化,判断水的浊度是否超标,从而预警或者联动其他设备。

电路图:

毕业设计|基于STM32单片机的水位浑浊度检测设计_课程设计_06

  • 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);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.

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);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

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;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.