基于单片机设计的家用自来水水质监测装置

一、前言

本文介绍基于单片机设计的家用自来水水质监测装置。利用STM32F103ZET6作为主控芯片,结合水质传感器和ADC模块,实现对自来水水质的检测和监测功能。通过0.96寸OLED显示屏,将采集到的水质数据以直观的方式展示给用户。

随着人们对健康意识的提高和环境保护的重视,水质安全已经成为人们生活中一个重要的议题。自来水作为我们日常生活中最主要的饮用水来源之一,其水质的安全与否直接关系到我们的健康。

本设计采用了先进的STM32F103ZET6主控芯片,具备强大的处理能力和丰富的外设接口。通过水质传感器,可以实时采集与水质相关的模拟信号。然后,通过ADC模块将模拟数据转换为数字信号,再经过算法处理得到相应的水质参数。最后,将结果通过0.96寸OLED显示屏进行展示,用户可以清晰地了解自来水的水质状况。

该装置特点:易于携带、操作简单、实时性好、精度高。用户只需将传感器浸入自来水中,即可获取到水质参数,并通过显示屏直观地了解水质状况,为家庭提供了一个简单方便的水质监测解决方案。

image-20230814161901679

image-20230814161608644

二、硬件选型

【1】主控芯片:STM32F103ZET6,这是一款基于ARM Cortex-M3内核的高性能微控制器。具有丰富的外设接口和较大的存储容量,适合用于处理水质传感器的数据采集和处理。

【2】水质传感器:自来水水质监测的传感器。

【3】显示屏:选择0.96寸OLED显示屏,可以在小尺寸的装置上显示采集到的水质数据。OLED显示屏具有高对比度、低功耗和快速刷新的特点,适合嵌入式应用。

三、常见的水质传感器

以下是一些常见的水质传感器类型,可用于家用自来水水质监测装置:

【1】pH传感器:用于测量水的酸碱度,即pH值。pH传感器通常基于玻璃电极原理,可以提供准确的pH值。

【2】溶解氧传感器:用于测量水中的溶解氧含量。溶解氧传感器可以采用膜式传感器或电极式传感器,根据测量原理的不同,提供溶解氧浓度的准确值。

【3】浊度传感器:用于测量水中的悬浮颗粒物的浓度或水的浊度。浊度传感器可以采用光散射原理或光吸收原理进行测量。

【4】电导率传感器:用于测量水中的电导率,即水的导电性。电导率传感器可以提供水中的总溶解固体(TDS)值或盐度值。

四、家用自来水的水质标准

以下是常见水质指标和标准参考:

【1】pH值:pH值表示水的酸碱度,一般应在6.5-8.5之间。

【2】浑浊度:浑浊度表示水中悬浮颗粒物的浓度,常用浊度单位为NTU(涡轮比色法浊度单位)。根据国际标准,家用自来水的浑浊度应小于1 NTU。

【4】溶解氧:溶解氧表示水中溶解的氧气含量,通常以毫克/升(mg/L)为单位。对于家用自来水,溶解氧的标准范围可以在5-8 mg/L之间。

【5】铁和锰:铁和锰是常见的金属元素,高浓度的铁和锰会给水带来颜色和异味。根据标准,家用自来水中的铁含量应小于0.3 mg/L,锰含量应小于0.1 mg/L。

【6】氟化物:氟化物是一种有益的微量元素,但高浓度的氟化物对人体有害。一般而言,家用自来水中的氟化物含量应小于1.5 mg/L。

【7】各种有害物质:家用自来水应符合国家或地区的相关法规和标准,以确保其不含有害物质,如重金属、有机污染物、农药残留等。

五、硬件代码

5.1 采集数据显示

#include "stm32f10x.h"
#include "oled.h"// 定义ADC采集通道和引脚
#define ADC_CHANNEL   0   // 假设使用ADC1的通道0
#define ADC_PIN       GPIO_Pin_0
#define ADC_PORT      GPIOA// 定义OLED屏幕相关参数
#define OLED_WIDTH    128
#define OLED_HEIGHT   64// 全局变量
uint16_t adc_value = 0;   // ADC采集到的数值// 函数声明
void ADC_Configuration(void);
void OLED_Init(void);int main(void)
{// 初始化ADC和OLEDADC_Configuration();OLED_Init();while (1){// 启动ADC转换ADC_SoftwareStartConvCmd(ADC1, ENABLE);// 等待ADC转换完成while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);// 读取ADC转换结果adc_value = ADC_GetConversionValue(ADC1);// 在OLED上显示ADC采集的数值char str[10];sprintf(str, "%4d", adc_value);OLED_ShowString(0, 0, str);  // 在坐标(0, 0)位置显示字符串// 延时一段时间for (uint32_t i = 0; i < 100000; i++);}
}// ADC配置函数
void ADC_Configuration(void)
{ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;// 使能ADC1和GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);// 配置ADC引脚为模拟输入GPIO_InitStructure.GPIO_Pin = ADC_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(ADC_PORT, &GPIO_InitStructure);// ADC配置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通道ADC_RegularChannelConfig(ADC1, ADC_CHANNEL, 1, ADC_SampleTime_13Cycles5);// 使能ADCADC_Cmd(ADC1, ENABLE);// 开启ADC校准ADC_ResetCalibration(ADC1);while (ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1));// 设置ADC转换序列ADC_RegularChannelConfig(ADC1, ADC_CHANNEL, 1, ADC_SampleTime_13Cycles5);
}// OLED屏幕初始化函数
void OLED_Init(void)
{// 初始化OLED屏幕OLED_Init();OLED_Clear();
}

5.2 oled.h

#ifndef __OLED_H__
#define __OLED_H__#include "stm32f10x.h"#define OLED_WIDTH      128
#define OLED_HEIGHT     64void OLED_Init(void);
void OLED_Clear(void);
void OLED_WriteByte(uint8_t data, uint8_t cmd);
void OLED_SetPos(uint8_t x, uint8_t y);
void OLED_ShowChar(uint8_t x, uint8_t y, char ch);
void OLED_ShowString(uint8_t x, uint8_t y, const char* str);#endif /* __OLED_H__ */

5.3 oled.c

#include "OLED.h"const uint8_t OLED_GRAM[128][8] = {0};  // OLED显示缓存void OLED_Init(void)
{// ... 初始化OLED屏幕的相关操作 ...
}void OLED_Clear(void)
{// 清空OLED显示缓存(全黑)memset((void*)OLED_GRAM, 0x00, sizeof(OLED_GRAM));// 更新OLED屏幕显示OLED_SetPos(0, 0);for (uint8_t i = 0; i < 8; i++){OLED_WriteByte(0xb0 + i, 0x00);  // 设置页地址(0-7)OLED_WriteByte(0x00, 0x00);  // 设置列地址低4位(0-3)OLED_WriteByte(0x10, 0x00);  // 设置列地址高4位(4-7)for (uint8_t j = 0; j < 128; j++){OLED_WriteByte(0x00, 0x40);  // 写入数据,全黑}}
}void OLED_WriteByte(uint8_t data, uint8_t cmd)
{// ... 将数据写入OLED屏幕的具体操作 ...
}void OLED_SetPos(uint8_t x, uint8_t y)
{// ... 设置OLED屏幕显示位置的具体操作 ...
}void OLED_ShowChar(uint8_t x, uint8_t y, char ch)
{uint8_t c = ch - ' ';  // 获取字库中的字模if (x >= OLED_WIDTH || y >= OLED_HEIGHT) return;for (uint8_t i = 0; i < 6; i++){uint8_t line = cFont6x8[c][i];for (uint8_t j = 0; j < 8; j++){if (line & 0x01){OLED_GRAM[y + j][x + i] = 1;}else{OLED_GRAM[y + j][x + i] = 0;}line >>= 1;}}// 更新OLED屏幕显示OLED_SetPos(x, y / 8);for (uint8_t i = 0; i < 8; i++){OLED_WriteByte(0xb0 + (y / 8) + i, 0x00);  // 设置页地址OLED_WriteByte((x & 0x0f), 0x00);  // 设置列地址低4位OLED_WriteByte((x >> 4) | 0x10, 0x00);  // 设置列地址高4位for (uint8_t j = 0; j < 128; j++){OLED_WriteByte(OLED_GRAM[y + i][j], 0x40);  // 写入数据}}
}void OLED_ShowString(uint8_t x, uint8_t y, const char* str)
{while (*str != '\0'){OLED_ShowChar(x, y, *str++);x += 6;if (x >= OLED_WIDTH){x = 0;y += 8;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/111121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DVWA-JavaScript Attacks

JavaScript Attacks JavaScript Attack即JS攻击&#xff0c;攻击者可以利用JavaScript实施攻击。 Low 等级 核心源码&#xff0c;用的是dom语法这是在前端使用的和后端无关&#xff0c;然后获取属性为phrase的值然后来个rot13和MD5双重加密在复制给token属性。 <script&…

2 spring 识别自定义实现BeanFactoryPostProcessor 的接口

如果自定义实现了BeanFactoryPostProcessor接口&#xff0c;那么想让spring识别到的话&#xff0c;有两种方式&#xff1a; 1 定义在spring的配置文件中&#xff0c;让spring自动识别 2 调用具体的addBeanFactoryPostProcessor方法 方法1 的代码实现 定义实现BeanFactoryPo…

零代码编程:用ChatGPT批量下载谷歌podcast上的播客音频

谷歌podcast有很多播客音频&#xff0c;如何批量下载到电脑呢&#xff1f; 以这个播客为例&#xff1a; https://podcasts.google.com/feed/aHR0cHM6Ly9oYWRhcnNoZW1lc2guY29tL2ZlZWQvcG9kY2FzdC8?saX&ved0CAkQlvsGahcKEwi4uauWsvKBAxUAAAAAHQAAAAAQAg 查看网页源代码&a…

Linux程序调试器——gdb的使用

gdb的概述 GDB 全称“GNU symbolic debugger”&#xff0c;从名称上不难看出&#xff0c;它诞生于 GNU 计划&#xff08;同时诞生的还有 GCC、Emacs 等&#xff09;&#xff0c;是 Linux 下常用的程序调试器。发展至今&#xff0c;GDB 已经迭代了诸多个版本&#xff0c;当下的…

Leetcode.4 寻找两个正序数组的中位数

题目链接 Leetcode.4 寻找两个正序数组的中位数 hard 题目描述 给定两个大小分别为 m m m 和 n n n 的正序&#xff08;从小到大&#xff09;数组 n u m s 1 nums1 nums1 和 n u m s 2 nums2 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O…

【AIGC核心技术剖析】用于 3D 生成的多视图扩散模型

MVDream是一种多视图扩散模型,能够从给定的文本提示生成一致的多视图图像。多视图扩散模型从二维和三维数据中学习,可以实现二维扩散模型的泛化和三维渲染的一致性。我们证明了这样的多视图先验可以作为可推广的 2D 先验,与 3D 表示无关。它可以通过分数蒸馏取样应用于 2D 生…

一张图理解MITRE ATTCK框架

看到一张好图&#xff0c;能对MITRE ATT&CK框架做很好的概述&#xff1a; 可以与笔者之前写过的MITRE文章&#xff08;https://blog.csdn.net/ybdesire/category_12472912.html&#xff09;一起阅读&#xff0c;就能更好的理解MITRE。 参考&#xff1a; 吴沛颖.网络威胁情…

【深度学习实验】循环神经网络(四):基于 LSTM 的语言模型训练

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. RNN与梯度裁剪 2. LSTM模型 3. 训练函数 a. train_epoch b. train 4. 文本预测 5. GPU判断函数 6. 训练与测试 7. 代码整合 经验是智慧之父&#xff0c;记忆…

pdf转二维码怎么做?pdf二维码制作简单技巧

pdf是一种很常见的文件储存格式&#xff0c;一般通知、发票、简历都会保存为这种格式来使用&#xff0c;那么需要将pdf格式文件做成二维码&#xff0c;该用什么方式来制作呢&#xff1f;下面给大家分享一个pdf转二维码的在线工具&#xff0c;可以通过上传文件一键生成二维码&am…

pytorch 入门(二)

本文为&#x1f517;小白入门Pytorch内部限免文章 &#x1f368; 本文为&#x1f517;小白入门Pytorch中的学习记录博客&#x1f366; 参考文章&#xff1a;【小白入门Pytorch】教案二&#x1f356; 原作者&#xff1a;K同学啊 目录 一、神经网络的组成部分1. 神经元2. 神经网络…

世界粮食日:宏工科技有对策,赋能食品生产高效可持续发展

10月16日是世界粮食日。随着全球人口的增长&#xff0c;人们对高品质食品的需求也越来越大&#xff0c;如何实现“更好生产、更好营养”成为了食品生产与供应的重要话题。15年来&#xff0c;宏工科技专注物料处理自动化领域&#xff0c;提供食品物料处理一站式解决方案以提高生…

智能水印相机微信小程序源码

相信大家日常在生活中或者工作中都有使用过水印相机来拍照记录吧&#xff0c;但是又要在手机上面多下载一个APP。 那么小编今天给大家带来一款智能水印相机&#xff0c;拍照自动添加时间、地点、经纬度等水印文字&#xff0c;可用于工作考勤、学习打卡、工作取证等&#xff0c…

Spring5学习笔记之整合MyBatis

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…

[资源推荐] 飞书画板模板

今天做PPT&#xff0c;尝试了一些AI工具之后&#xff0c;感觉反而降低了做PPT的效率&#xff0c;因为和想实现的效果还是差很多…然后我本人不到万不得已不做PPT&#xff0c;都是用notion这类在线文档来作展示&#xff0c;今天必须得做ppt&#xff0c;但是不想在ppt里面画图&am…

行列转换:MySQL中的数据变形魔法

行转列 使用CASE函数聚合函数 SELECTMAX(CASE WHEN salesperson John THEN sales_amount END) AS John_Sales,MAX(CASE WHEN salesperson Alice THEN sales_amount END) AS Alice_Sales FROM sales_data;列转行 使用UNIO连接每列数据 SELECT product_id,store1 store,sto…

macOS Sonoma 14.1RC(23B73)发布

黑果魏叔10 月 18 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.1 RC更新&#xff08;内部版本号&#xff1a;23B73&#xff09;&#xff0c;本次更新距离上次发布隔了 7 天。 macOS Sonoma 14.1RC&#xff08;23B73&#xff09;的更新内容主要包括以下方面&…

办鹿uniapp小程序(一)

一、项目初始化 1. appid 》 公司给你 wxc82730a0fc15e28a 2. 开发者身份 》 公司给你添加 小程序官网&#xff1a;小程序 管理》成员管理》项目成员 1、 uniapp ui组件 &#xff08;uView&#xff09; 如果采用npm安装方式在 小程序端不生效 1.1 采用插件的形式安装&#xf…

【Qt控件之QListWidget】介绍及使用,利用QListWidget、QToolButton、和布局控件实现抽屉式组合控件

概述 QListWidget类提供了基于项目的列表小部件。 QListWidget是一个方便的类&#xff0c;类似于QListView提供的列表视图&#xff0c;但使用经典的基于项目的接口来添加和删除项目。QListWidget使用内部模型来管理列表中的每个QListWidgetItem。 对于更灵活的列表视图小部件…

Unity游戏开发中ngui和ugui区别与优缺点详解

Unity3D是一款跨平台的游戏开发引擎&#xff0c;它支持多种平台&#xff0c;包括PC、移动设备和主机。在Unity3D中&#xff0c;UI系统是游戏开发中非常重要的一部分&#xff0c;它负责游戏中的用户界面的显示和交互。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;…

【01】LVGL-CodeBlock模拟器安装 | LVGL工程下载 | PC端模拟LVGL步骤

LVGL模拟器 1.LVGL模拟器介绍2.Windows环境搭建CodeBlock及获取LVGL工程3.PC端模拟LVGL4.总结 1.LVGL模拟器介绍 LVGL模拟器&#xff1a;使用PC端软件模拟LVGL运行&#xff0c;而不需要任何嵌入式硬件。优点&#xff1a;便于学习、跨平台协同开发 2.Windows环境搭建CodeBlock及…