0 前言
🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 STM32与云平台的水质检测系统(源码+硬件+论文)
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:4分
🧿 项目分享:见文末!
1 主要功能
- 1.利用ds18b20检测水温
- 2.利用浊度传感器检测浊度
- 3.利用ph传感器检测ph值
- 4.显示在oled,超过阈值蜂鸣器报警
- 5.利用esp8266无线模块上传onenet云端,电脑网页查看数据,手机app查看数据。
2 硬件设计(原理图)
3 核心软件设计
关键代码
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "led.h"
#include "beep.h"
#include "usart.h"
#include "adc.h"
#include "ds18b20.h"
#include "temp.h"
#include "USART2.h"
#include "send8266.h"
#include "onenet.h"
#include "timer.h"
#include <string.h>
#include <stdio.h>
#define ARRY_LENGTH 10
#define median_filtering_length 3
extern u8 send_flag;
u8 ph1,hui1,temperature1;
u8 time[15];
float num[2];
float getPHvalue(void);
u16 median_filtering(void);
void display(void);
u8 key;
int main(void)
{
short temperature,ph; //�¶�ֵ
float hui;
unsigned short timeCount = 0; //���ͼ������
delay_init(); //��ʱ������ʼ��
NVIC_Configuration();//����NVIC�жϷ���2:2λ��ռ���ȼ���2λ��Ӧ���ȼ�
Adc_Init(); //AD��ʼ��
uart_init(9600); //���ڳ�ʼ��
Usart2_Init(115200); //����2������SEND8266�� PA2-TX PA3-RX
SEND8266_Init();
TIM4_Int_Init(49999,7199); //10Khz�ļ���Ƶ�ʣ�������30000Ϊ3s
OLED_Init(); //��ʼ��OLED
OLED_Clear(); //Clear screen
BEEP_Init();
LED_Init();
/* while(DS18B20_Init()) //DS18B20��ʼ��
{
OLED_ShowString(0,0,"DS18B20 Error",24); //��ʼ��ʧ�ܣ��������
delay_ms(200); //��ʱ�ȴ������ȶ�
}
OLED_Clear(); //����
*/
while(1)
{
display();
OLED_ShowString(0,0,"TE: . C",16);
temperature=DS18B20_Get_Temp(); //�ɼ��¶�
if(temperature<0)
{
OLED_ShowChar(22,0,'-',16); //��ʾ����
temperature=-temperature;
}
else
OLED_ShowChar(22,0,' ',16); //ȥ������
OLED_ShowNum(32,0,temperature/10,2,16); //��ʾ�¶�
OLED_ShowNum(54,0,temperature%10,1,16); //��ʾ�¶�
printf("�¶ȣ�%d.%d C \r\n",temperature/10,temperature%10);
temperature=temperature/10;
ph=getPHvalue();
if( temperature > 42 ) ph += 5;
else if(temperature > 28)
{
ph += 5*(temperature - 28)/14;
}
OLED_ShowString(69,2,"PH: ",16);
OLED_ShowString(109,2,".",16);
OLED_ShowNum(92,2,ph/100,2,16); //��ʾPH
OLED_ShowNum(112,2,ph%100,2,16);
printf("PHֵ��%d.%d \r\n",ph/100,ph%100);
ph=ph/100;
hui=median_filtering();
hui=hui*(3.3/4096);
hui = hui*100/3.3;
hui = hui*1.66-8;
if(hui > 100) hui = 99;
if(hui <0) hui=0;
OLED_ShowString(0,2,"TU: %",16);
OLED_ShowNum(32,2,hui,2,16); //��ʾ���Ƕ�
printf("���Ƕȣ�%d \r\n",(int)hui);
if(temperature<=0|temperature>=31|ph>=9|ph<5|hui<=37)
{
BEEP=1;
}
else
BEEP=0;
ph1=(u8)ph;
hui1=(u8)hui;
temperature1=(u8)temperature;
if(send_flag==1)
{
printf("OneNet_GetData\r\n");
OneNet_GetData();
send_flag = 0;
SEND8266_Clear();
}
if(++timeCount >= 5)
{
printf("OneNet_SendData\r\n");
OneNet_SendData();
timeCount = 0;
SEND8266_Clear();
}
SEND8266_GetData(0);
}
}
float getPHvalue(){
float PH_VALUE = 0;
int pv[ARRY_LENGTH];
int i,k;
for(i = 0; i < ARRY_LENGTH; i++ ){
pv[i] = Get_Adc_Average(7,5);
delay_ms(1);
}
for(i = 0; i < ARRY_LENGTH; i++){
for(k = i; k < ARRY_LENGTH; k++ ){
if( pv[i] < pv[k] ){
int tmp = pv[i];
pv[i] = pv[k];
pv[k] = tmp;
}
}
}
PH_VALUE = pv[ARRY_LENGTH/2];
PH_VALUE = PH_VALUE*(3.3/4096);
PH_VALUE = -5.7541*PH_VALUE + 16.654;
PH_VALUE = PH_VALUE*100;
if(PH_VALUE > 1400){
PH_VALUE = 1400;
}
if( PH_VALUE < 0 ){
PH_VALUE = 0;
}
return PH_VALUE;
}
u16 median_filtering(){
int senseV[median_filtering_length];
int i,k;
for(i = 0; i < median_filtering_length; i++){
senseV[i] = Get_Adc_Average(6,5);
delay_ms(3);
}
for(i = 0; i < median_filtering_length; i++ ){
for(k = i; k <median_filtering_length; k++ ){
if(senseV[i] > senseV[k]){
int tmp = senseV[i];
senseV[i] = senseV[k];
senseV[k] = tmp;
}
}
}
return senseV[median_filtering_length/2];
}
void display()
{
}
4 实现效果
5 最后
包含内容
🧿 项目分享:见文末!
**项目分享: ** https://blog.csdn.net/m0_984093