项目介绍
本论文是在研究和设计一套基于STM32单片机的智能水质监测系统,本系统主要包括监测模块、无线通信模块、报警模块、显示模块、电源模块等。当监测到的水质相关参数(如水温、水位、浑浊度、电导率、PH值等)与设定阈值不符时,则STM32的智能水质监测系统发出对应报警,并通过无线通信上传至手机APP,通过探索系统设计的技术路线、关键技术和实现方法,能够提供准确的水质监测方法,确保水资源的质量和安全,同时进行水质监测,进行查看使工作人员快速的处理污染,从而减少环境污染风险。
功能介绍
设计一个以单片机为主控芯片的智能水质监测系统。该系统主要包括控制模块、监测模块、无线通信模块、报警模块、显示模块、电源模块等。当监测到的水质相关参数(如水温、水位、浑浊度、电导率、PH值等)与设定阈值不符时,则系统发出相应报警,并通过无线通信模块将实时监测到的数据上传到手机端显示对象信息。
(1)监测采集水质相关参数(水温、水位、浑浊度、电导率、PH值);
(2)无线传输水质参数至手机端APP;
(3)显示相应参数及报警状态;
(4)报警提醒;
所用模块
系统原理图
实物图
部分代码
#include “App_SysInclude.h”
static Timer *AppSecondTimer_Handle;
static const char NetProtocolBuffer[] = {
“\r\nPH值: %d\r\n水质: %d\r\n
水位: %d\r\n浑浊度: %d\r\n”
};
/* 阈值 /
struct {
uint16_t usTurbidity;
uint16_t usWarterLine;
/ 下限阈值 /
int16_t isPH_L;
/ 上限阈值 */
int16_t isPH_H;
} threshold = {
.usTurbidity = 1000,
.usWarterLine = 500,
.isPH_L = 3,
.isPH_H = 11
};
static struct {
/* 浑浊度 /
uint16_t usTurbidity;
/ 水位 /
uint16_t usWarterLine;
/ PH /
int16_t isPH;
/ 水质 */
int16_t iWaterQuality;
} globalParam = {
.usTurbidity = 0,
.usWarterLine = 0,
.isPH = 0,
.iWaterQuality = 0
};
/******************************************************************
-
Name : adc_turbidity_Init
-
Description : 浑浊度传感器初始化
-
Input :
-
Output :
-
Return :
********************************************************************/
static void adc_turbidity_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStructure.GPIO_Pin = TURBIDITY_ADC_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(TURBIDITY_GPIO_TYPE, &GPIO_InitStructure);ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
/******************************************************************
-
Name : get_turbidity_value
-
Description : 读取浑浊度传感器数值
-
Input :
-
Output :
-
Return :
********************************************************************/
static uint16_t get_turbidity_value(void)
{
// 设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, TURBIDITY_ADC_Channel, 1, ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));return ~ADC_GetConversionValue(ADC1) & 0x0FFF;
}
/******************************************************************
-
Name : adc_ph_Init
-
Description : ph传感器初始化
-
Input :
-
Output :
-
Return :
********************************************************************/
static void adc_ph_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);GPIO_InitStructure.GPIO_Pin = PH_VAL_ADC_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(PH_VAL_GPIO_TYPE, &GPIO_InitStructure);
ADC_DeInit(ADC1);ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);while (ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1));
}
/******************************************************************
-
Name : get_ph_value
-
Description : 读取ph值
-
Input :
-
Output :
-
Return :
********************************************************************/
static int16_t get_ph_value(void)
{
uint16_t usValue;// 设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, PH_VAL_ADC_Channel, 1, ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));usValue = ADC_GetConversionValue(ADC1);
return (int32_t)(-5.7541 * ((float)usValue * 3.3 / 4096) + 16.654);
}
/******************************************************************
-
Name : sencond_process
-
Description :
-
Input :
-
Output :
-
Return :
********************************************************************/
static void sencond_process(void *arg)
{
static uint8_t globalCnt = 0;
static uint8_t ucStep = 0;
float fWQValue = 0;switch(ucStep)
{
case 0:
globalParam.usWarterLine = (~get_voice_value() & 0xFFF);
ucStep ++;
break;
case 1:
globalParam.usTurbidity = get_turbidity_value();
ucStep ++;
break;
case 2:
globalParam.isPH = get_ph_value();
ucStep ++;
break;
case 3:
/* 计算电导水质 */
fWQValue = get_smoke_value() * 3.3 / 4096;
fWQValue = (133.42 * fWQValue * fWQValue * fWQValue - 255.86 * fWQValue * fWQValue + 857.39 * fWQValue) * 0.5;
globalParam.iWaterQuality = (int16_t)fWQValue;
ucStep = 0;
break;
default:
ucStep = 0;
break;
}if(globalParam.usTurbidity > threshold.usTurbidity) {
GPIO_SetBits(RELAY_LEVEL_GPIO_TYPE,RELAY_LEVEL_GPIO_PIN);
} else {
GPIO_ResetBits(RELAY_LEVEL_GPIO_TYPE,RELAY_LEVEL_GPIO_PIN);
}if(globalParam.usWarterLine < threshold.usWarterLine) {
GPIO_SetBits(RELAY_LEVEL2_GPIO_TYPE,RELAY_LEVEL2_GPIO_PIN);
} else {
GPIO_ResetBits(RELAY_LEVEL2_GPIO_TYPE,RELAY_LEVEL2_GPIO_PIN);
}if(globalParam.isPH < threshold.isPH_L || globalParam.isPH > threshold.isPH_H) {
Buzzer_Config(ENABLE);
} else {
Buzzer_Config(DISABLE);
}if(globalCnt >= 12)
{
if(globalParam.isPH >= 0) {
OLED_8X16_PRINTF(0,0,“PH: %03d”,globalParam.isPH);
} else {
OLED_8X16_PRINTF(0,0,“PH: %03d”,globalParam.isPH);
}
if(globalParam.iWaterQuality >= 0) {
OLED_8X16_PRINTF(2,0,“WQ: %05d”,globalParam.iWaterQuality);
} else {
OLED_8X16_PRINTF(2,0,“WQ: %05d”,globalParam.iWaterQuality);
}
OLED_8X16_PRINTF(4,0,“WL: %05d”,globalParam.usWarterLine);
OLED_8X16_PRINTF(6,0,“TUR: %05d”,globalParam.usTurbidity);moudle_esp8266_tcpserver_printf(NetProtocolBuffer,globalParam.isPH,globalParam.iWaterQuality, \ globalParam.usWarterLine,globalParam.usTurbidity); globalCnt = 0;
}
globalCnt ++;
}
资料下载链接
「实物制作资料 分享.rar」,来自夸克网盘分享。
夸克网盘无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
/7b80346jCs