基于单片机的太阳能热水器控制器设计

一、项目介绍

随着环保意识的逐渐增强,太阳能热水器作为一种清洁能源应用得越来越广泛。然而,传统的太阳能热水器控制器通常采用机械式或电子式温控器,存在精度低、控制不稳定等问题。为了解决这些问题,本项目基于单片机技术设计了一款太阳能热水器控制器,主控芯片采用STC89C52。该控制器可以实现对太阳能热水器的水温、水位等参数进行准确、稳定的控制,提高了太阳能热水器的能源利用效率和使用寿命,同时也符合节能环保的社会需求。

image-20230801105049392

二、系统构架

2.1 系统设计

本系统采用主从结构,由STC89C52单片机作为主控芯片,负责控制整个太阳能热水器的运行。系统包括传感器模块、驱动模块和用户界面模块。

传感器模块包括温度传感器和光照传感器,用于实时监测水温和太阳辐射强度。驱动模块包括电磁阀和水泵,用于控制水流和热水的循环。用户界面模块包括液晶显示屏和按键,用于显示当前状态和提供用户交互。

2.2 功能设计

本设计的太阳能热水器控制器功能:

  • 温度控制:通过温度传感器实时监测水温,并根据设定的阈值控制电磁阀和水泵,以保持热水器水温在设定范围内。
  • 光照控制:通过光照传感器实时监测太阳辐射强度,判断当前是否有足够的太阳能供给,若不足,则停止水泵运行,以节约能源。
  • 时间控制:设置定时计划,控制热水器在指定时间段内工作或停止工作。
  • 用户交互:通过液晶显示屏显示当前温度、工作状态等信息,并通过按键设定参数和操作热水器。

2.3 硬件设计

硬件设计包括电路连接和外围模块选择。主控芯片STC89C52与传感器模块、驱动模块和用户界面模块通过IO口进行连接。温度传感器采用DS18B20数字温度传感器,光照传感器采用光敏电阻。

2.4 软件设计

软件设计主要包括系统初始化、传感器数据采集、控制算法和用户交互等部分。系统初始化包括IO口配置、定时器设置等。传感器数据采集通过相应的接口获取温度和光照传感器数据。控制算法根据采集到的数据进行温度和光照控制,并控制电磁阀和水泵的开关。用户交互通过液晶显示屏和按键实现,用户可以通过按键设置参数和操作热水器。

2.5 设计思路

本项目的控制器主要包括传感器模块、控制模块和显示模块三部分。其中,传感器模块用于实时检测太阳能热水器的水温、水位等参数;控制模块将传感器采集到的数据进行处理,并通过控制水泵、电磁阀等执行器来实现对太阳能热水器的水温、水位等参数进行准确、稳定的控制;显示模块则用于显示当前的水温、水位等参数。

具体的设计流程如下:

【1】确定硬件平台:采用STC89C52单片机作为主控芯片,搭建传感器模块和执行器模块,通过串口通信与PC机连接。

【2】确定传感器类型:选择DS18B20温度传感器和液位传感器作为检测太阳能热水器水温、水位的传感器。

【3】确定控制策略:根据太阳能热水器的实际情况,设计PID控制算法,通过控制水泵、电磁阀等执行器来实现对太阳能热水器的水温、水位等参数进行准确、稳定的控制。

【4】编写程序:根据硬件平台和控制策略,编写程序实现数据采集、处理和控制等功能。

【5】调试测试:将设计好的控制器与太阳能热水器进行连接测试,检查数据采集、处理和控制等功能是否正常。

2.6 实现效果

本项目设计的太阳能热水器控制器实现了对太阳能热水器的水温、水位等参数进行准确、稳定的控制。

控制器的特点:

【1】精度高:采用PID控制算法,能够对太阳能热水器的水温、水位等参数进行精确控制。

【2】控制稳定:通过控制水泵、电磁阀等执行器来实现对太阳能热水器的水温、水位等参数进行稳定控制。

【3】显示直观:通过显示模块可以直观地显示当前的水温、水位等参数。

三、代码实现

3.1 DS18B20读取温度

以下是基于STC89C52单片机和DS18B20温度传感器实现读取温度值并打印到串口的示例:

#include <reg52.h>
#include <intrins.h>#define DQ P3_7typedef unsigned char uchar;
typedef unsigned int uint;sbit LED=P1^0;void Delay1ms(uint);
void Delay10us(uint);
uchar Init_DS18B20();
void Write_DS18B20(uchar dat);
uchar Read_DS18B20();
int Get_Temp();void main()
{uchar temp;int temperature;TMOD = 0x20; //定时器1工作在方式2TH1 = 0xfd; //波特率9600TL1 = 0xfd;PCON = 0x00; //波特率不加倍SCON = 0x50; //串口方式1,允许接收TR1 = 1; //定时器1开始计时ES = 1; //允许串口中断while(1){temp = Get_Temp();temperature = (int)temp * 0.0625 * 100; //将温度值转换为实际温度,单位为°Cprintf("Temperature: %d.%dC \r\n", temperature / 100, temperature % 100);Delay1ms(500); //每隔500ms读取一次温度值并打印到串口}
}void Delay1ms(uint cnt)
{uint i, j;for (i = 0; i < cnt; i++){for (j = 0; j < 110; j++);}
}void Delay10us(uint cnt)
{while(cnt--);
}uchar Init_DS18B20()
{uchar i;DQ = 1;Delay10us(5);DQ = 0;Delay10us(80);DQ = 1;Delay10us(5);i = DQ;Delay10us(20);return i;
}void Write_DS18B20(uchar dat)
{uchar i;for (i = 0; i < 8; i++){DQ = 0;_nop_();DQ = dat & 0x01;Delay10us(5);DQ = 1;dat >>= 1;}
}uchar Read_DS18B20()
{uchar i, j, dat = 0;for (i = 0; i < 8; i++){DQ = 0;_nop_();DQ = 1;_nop_();j = DQ;Delay10us(5);dat = (j << 7) | (dat >> 1);}return dat;
}int Get_Temp()
{uchar TL, TH;int temp;Init_DS18B20();Write_DS18B20(0xcc);Write_DS18B20(0x44);Delay1ms(750);Init_DS18B20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);TL = Read_DS18B20();TH = Read_DS18B20();temp = TH;temp <<= 8;temp |= TL;return temp;
}void UART_Isr() interrupt 4
{if (RI == 1){RI = 0;}if (TI == 1){TI = 0;}
}

代码中使用了定时器和串口中断,要注意DS18B20的引脚连接和串口通信的波特率设置。

3.2 PID算法控制温度

以下是使用STC89C52单片机和DS18B20温度传感器通过PID算法实现热水器恒温控制的代码:

#include <reg52.h>
#include <intrins.h>#define uchar unsigned char
#define uint unsigned intsbit Relay = P1^0;  // 继电器控制引脚// 温度传感器DS18B20相关宏定义
sbit DQ = P2^7;     // DS18B20数据线引脚
#define DQ_OUT P2 &= 0x7F
#define DQ_IN  P2 |= 0x80// PID参数定义
float Kp = 1.0;     // PID比例系数
float Ki = 0.5;     // PID积分系数
float Kd = 0.2;     // PID微分系数// 温度控制参数定义
float setTemp = 40.0;    // 设定的目标温度
float curTemp = 0.0;     // 当前温度
float lastTemp = 0.0;    // 上一次的温度
float error = 0.0;       // 温度误差
float integral = 0.0;    // 积分项
float derivative = 0.0;  // 微分项
float output = 0.0;      // 控制输出// 延时函数
void delay(uint t) {while (t--);
}// DS18B20初始化
uchar Init_DS18B20() {uchar presence = 0;DQ_OUT;DQ = 0;delay(480);     // 延时480usDQ = 1;delay(60);      // 延时60usDQ_IN;presence = DQ;delay(420);     // 延时420usreturn presence;
}// DS18B20读取一个字节
uchar Read_DS18B20() {uchar i, j, dat = 0;for (i = 8; i > 0; i--) {DQ_OUT;DQ = 0;dat >>= 1;_nop_();_nop_();_nop_();DQ = 1;DQ_IN;if (DQ) {dat |= 0x80;}delay(120);     // 延时120us}return dat;
}// DS18B20写入一个字节
void Write_DS18B20(uchar dat) {uchar i;for (i = 8; i > 0; i--) {DQ_OUT;DQ = 0;DQ = dat & 0x01;delay(120);     // 延时120usDQ = 1;dat >>= 1;}
}// DS18B20温度转换
void Convert_DS18B20() {Init_DS18B20();Write_DS18B20(0xCC);    // 跳过ROM操作Write_DS18B20(0x44);    // 启动温度转换
}// 获取DS18B20温度值
float Get_DS18B20_Temp() {uchar TL, TH;int temp = 0;Init_DS18B20();Write_DS18B20(0xCC);    // 跳过ROM操作Write_DS18B20(0xBE);    // 发送读取命令TL = Read_DS18B20();    // 读取温度低字节TH = Read_DS18B20();    // 读取温度高字节temp = TH;temp <<= 8;temp |= TL;return (float)temp / 16.0;   // 返回温度值
}// PID控制算法
float PID_Control(float setValue, float currentValue) {error = setValue - currentValue;integral += error;derivative = currentValue - lastTemp;output = Kp * error + Ki * integral + Kd * derivative;lastTemp = currentValue;return output;
}void main() {while (1) {curTemp = Get_DS18B20_Temp();   // 获取当前温度output = PID_Control(setTemp, curTemp);   // PID控制计算if (output > 0) {Relay = 0;  // 继电器闭合,加热器工作} else {Relay = 1;  // 继电器断开,加热器停止工作}delay(1000); // 延时1s}
}

3.3 驱动BH1750光敏传感器

使用STC89C52单片机读取BH1750光敏传感器值通过串口打印的代码:

#include <reg52.h>
#include <intrins.h>#define uchar unsigned char
#define uint unsigned intsbit SDA = P2^7;    // IIC总线数据线引脚
sbit SCL = P2^6;    // IIC总线时钟线引脚// BH1750光敏传感器相关宏定义
#define BH1750_ADDR 0x23   // BH1750设备地址
#define BH1750_ON   0x01   // BH1750上电命令
#define BH1750_OFF  0x00   // BH1750下电命令
#define BH1750_CONTINUOUS_HIGH_RES_MODE  0x10   // BH1750连续高分辨率模式// 延时函数
void delay(uint t) {while (t--);
}// IIC总线起始信号
void I2C_Start() {SDA = 1;delay(1);SCL = 1;delay(1);SDA = 0;delay(1);SCL = 0;delay(1);
}// IIC总线停止信号
void I2C_Stop() {SDA = 0;delay(1);SCL = 1;delay(1);SDA = 1;delay(1);
}// IIC总线发送应答信号
void I2C_Ack() {SDA = 0;delay(1);SCL = 1;delay(1);SCL = 0;delay(1);SDA = 1;delay(1);
}// IIC总线发送不应答信号
void I2C_NAck() {SDA = 1;delay(1);SCL = 1;delay(1);SCL = 0;delay(1);
}// IIC总线接收应答信号
bit I2C_WaitAck() {bit ack;SDA = 1;delay(1);SCL = 1;delay(1);ack = SDA;SCL = 0;delay(1);return ack;
}// IIC总线发送一个字节
void I2C_WriteByte(uchar dat) {uchar i;for (i = 0; i < 8; i++) {SDA = (dat & 0x80) >> 7;dat <<= 1;delay(1);SCL = 1;delay(1);SCL = 0;delay(1);}
}// IIC总线读取一个字节
uchar I2C_ReadByte() {uchar i, dat = 0;SDA = 1;delay(1);for (i = 0; i < 8; i++) {SCL = 1;delay(1);dat = (dat << 1) | SDA;SCL = 0;delay(1);}return dat;
}// 初始化BH1750光敏传感器
void Init_BH1750() {I2C_Start();I2C_WriteByte(BH1750_ADDR);      // 发送设备地址I2C_WaitAck();I2C_WriteByte(BH1750_ON);        // 上电I2C_WaitAck();I2C_Stop();delay(5);
}// 启动BH1750测量
void Start_BH1750() {I2C_Start();I2C_WriteByte(BH1750_ADDR);                  // 发送设备地址I2C_WaitAck();I2C_WriteByte(BH1750_CONTINUOUS_HIGH_RES_MODE);   // 选择连续高分辨率模式I2C_WaitAck();I2C_Stop();delay(180);
}// 读取BH1750测量结果
uint Read_BH1750() {uint value;I2C_Start();I2C_WriteByte(BH1750_ADDR + 1);    // 发送设备地址,读模式I2C_WaitAck();value = ((uint)I2C_ReadByte() << 8) | (uint)I2C_ReadByte();   // 读取两个字节的数据I2C_NAck();I2C_Stop();return value;
}// 串口发送一个字符
void UART_SendChar(uchar chr) {SBUF = chr;while (!TI);TI = 0;
}// 串口发送字符串
void UART_SendString(const uchar *str) {while (*str) {UART_SendChar(*str++);}
}// 串口发送一个无符号整数
void UART_SendUInt(uint val) {uchar i, len;uchar buf[5];len = 0;do {buf[len++] = val % 10 + '0';val /= 10;} while (val);for (i = len; i > 0; i--) {UART_SendChar(buf[i-1]);}
}void main() {uint lightValue;Init_BH1750();  // 初始化BH1750光敏传感器// 串口初始化, 波特率9600TMOD = 0x20;TH1 = 0xFD;TL1 = 0xFD;SCON = 0x50;TR1 = 1;while (1) {Start_BH1750();         // 启动测量lightValue = Read_BH1750();   // 读取测量结果UART_SendString("Light value: ");UART_SendUInt(lightValue);UART_SendString("\r\n");delay(1000);   // 延时1s}
}

在程序中,初始化了BH1750光敏传感器,使用Start_BH1750()函数启动测量,通过Read_BH1750()函数读取测量结果,在串口上打印出来。串口的初始化设置为波特率9600,发送数据时使用UART_SendString()和UART_SendUInt()函数。

四、总结

本设计基于STC89C52单片机实现了一个功能完善的太阳能热水器控制器。该控制器具有温度控制、光照控制、时间控制和用户交互等功能,可以提高太阳能热水器的性能和便捷程度。通过合理的硬件选型和软件设计,使得系统能够准确、稳定地实现对太阳能热水器的控制,提高能源利用效率,并为用户提供便利的操作界面。未来可以进一步优化和拓展该控制器,如增加远程控制功能、与智能家居系统的连接等,以满足不同用户的需求。

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

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

相关文章

leetcode55.跳跃游戏 【贪心】

题目&#xff1a; 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例…

Rasa 多轮对话机器人

Rasa 开源机器人 目录 Rasa 开源机器人 1. 学习资料 2. Rasa 安装 2.1. rasa 简介 2.2. Rasa系统结构 ​编辑 2.3. 项目的基本流程 ​编辑 2.4. Rasa安装 2.5. 组件介绍 3. Rasa NLU 3.0. NLU 推理输出格式 3.1. 训练数据 ./data/nlu.yml 数据文件 3.2. ./confi…

css3对文字标签不同宽,不同高使用瀑布流对齐显示

<div class"wrapper" style"padding: 0;"><span class"wf-item task-tags text-center" v-for"(item,index) in data.categorys" :key"index">{{ item }}</span> </div>/* 名称瀑布流显示 */ .wrap…

【ES6】js中的__proto__和prototype

在JavaScript中&#xff0c;__proto__和prototype都是用于实现对象继承的关键概念。 1、proto __proto__是一个非标准的属性&#xff0c;用于设置或获取一个对象的原型。这个属性提供了直接访问对象内部原型对象的途径。对于浏览器中的宿主对象和大多数对象来说&#xff0c;可…

Ansible之变量

一&#xff09;Ansible变量介绍 我们在PlayBook⼀节中&#xff0c;将PlayBook类⽐成了Linux中的shell。 那么它作为⼀⻔Ansible特殊的语⾔&#xff0c;肯定要涉及到变量定义、控 制结构的使⽤等特性。 在这⼀节中主要讨论变量的定义和使⽤ 二&#xff09;变量命名规则 变量的…

【Windows 常用工具系列 11 -- 笔记本F5亮度调节关闭】

文章目录 笔记本 F 按键功能恢复 笔记本 F 按键功能恢复 使用笔记本在进行网页浏览时&#xff0c;本想使用F5刷新下网页&#xff0c;结果出现了亮度调节&#xff0c;如下图所示&#xff1a; 所以就在网上查询是否有解决这个问题的帖子&#xff0c;结果还真找到了&#xff1a;…

(数字图像处理MATLAB+Python)第十二章图像编码-第一、二节:图像编码基本理论和无损编码

文章目录 一&#xff1a;图像编码基本理论&#xff08;1&#xff09;图像压缩的必要性&#xff08;2&#xff09;图像压缩的可能性A&#xff1a;编码冗余B&#xff1a;像素间冗余C&#xff1a;心理视觉冗余 &#xff08;3&#xff09;图像压缩方法分类A&#xff1a;基于编码前后…

华为Mate 60系列安装谷歌服务框架,安装Play商店,Google

华为Mate 60 Pro悄悄的上架。但是却震撼市场的强势登场,Mate 60系列默认搭载的就是鸿蒙4.0。那么mate 60加上4.0是否可以安装谷歌服务框架呢&#xff1f;本机到手经过测试是可以安装的&#xff0c;但是在解决play非保护机制认证还通知这个问题上,他和鸿蒙3.0是不一样的。如果我…

(10)(10.8) 固件下载

文章目录 ​​​​​​​前言 10.8.1 固件 10.8.2 Bootloader 10.8.3 APM2.x Autopilot 10.8.4 许可证 10.8.5 安全 前言 固件服务器(firmware server)可提供所有飞行器的最新固件。其中包括&#xff1a; CopterPlaneRoverAntennaTrackerSub 本页提供了一些被视为&quo…

无锡布里渊——厘米级分布式光纤-锅炉安全监测解决方案

无锡布里渊——厘米级分布式光纤-锅炉安全监测解决方案 厘米级分布式光纤-锅炉安全监测解决方案 1、方案背景与产品简介&#xff1a; 1.1&#xff1a;背景简介&#xff1a; 锅炉作为一种把煤、石油或天燃气等化石燃料所储藏的化学能转换成水或水蒸气的热能的重要设备&#xff…

K8S:二进制部署K8S(两台master+负载均衡nginx+keepalived)

文章目录 一.常见的K8S部署方式1.Minikube2.Kubeadmin3.二进制安装部署 二.二进制搭建K8S(双台master)1.部署架构规划2.系统初始化配置3.部署 docker引擎4.部署 etcd 集群&#xff08;1&#xff09;etcd简介&#xff08;2&#xff09;准备签发证书环境&#xff08;3&#xff09…

Node.js 应用的御用品: Node.js 错误处理系统

开发中&#xff0c;有些开发者会积极寻求处理错误&#xff0c;力求减少开发时间&#xff0c;但也有些人完全忽略了错误的存在。正确处理错误不仅意味着能够轻松发现和纠正错误&#xff0c;而且还意味着能够为大型应用程序开发出稳健的代码库。 特别是对于 Node.js 开发人员&am…

【iOS】Category、Extension和关联对象

Category分类 Category 是 比继承更为简洁 的方法来对Class进行扩展,无需创建子类就可以为现有的类动态添加方法。 可以给项目内任何已经存在的类 添加 Category甚至可以是系统库/闭源库等只暴露了声明文件的类 添加 Category (看不到.m 文件的类)通过 Category 可以添加 实例…

zabbix配置钉钉告警、和故障自愈

钉钉告警python脚本 cat python20 #!/usr/bin/python3 #coding:utf-8 import requests,json,sys,os,datetime # 机器人的Webhook地址 webhook"钉钉" usersys.argv[1] textsys.argv[3] data{"msgtype": "text","text": {"conten…

uniapp集成windicss的流程

一、背景介绍 Windicss是一个基于Tailwind CSS 灵感的库,它更快、更兼容,使用 TypeScript 构建。Windicss的目标是为了解决与Tailwind CSS 类似的问题,提供一个可以快速上手开发的组件库,让开发者不再需要繁琐地编写 CSS 样式。Windicss包含了几乎所有的 CSS 样式,因此开发…

uniapp实现微信小程序全局可分享功能

uniapp实现微信小程序全局【发送给朋友】、【分享到朋友圈】、【复制链接】 主要使用 Vue.js 的 全局混入 1.创建一个全局分享的js文件。示例文件路径为&#xff1a;./utils/shareWx.js &#xff0c;在该文件中定义全局分享的内容&#xff1a; export default {data() {retur…

【C#项目实战】控制台游戏——勇士斗恶龙(1)

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;最近开始正式的步入学习游戏开发的正轨&#xff0c;想要通过写博客的方式来分享自己学到的知识和经验&#xff0c;这就是开设本专栏的目的。希望…

如何合并为pdf文件?合并为pdf文件的方法

在数字化时代&#xff0c;人们越来越依赖电子文档进行信息交流和存储。合并为PDF成为一种常见需求&#xff0c;它能将多个文档合而为一&#xff0c;方便共享和管理。无论是合并多个单页文档&#xff0c;还是将多页文档合并&#xff0c;操作都变得简单高效。那么。如何合并为pdf…

论文阅读《Nougat:Neural Optical Understanding for Academic Documents》

摘要 科学知识主要存储在书籍和科学期刊中&#xff0c;通常以PDF的形式。然而PDF格式会导致语义信息的损失&#xff0c;特别是对于数学表达式。我们提出了Nougat&#xff0c;这是一种视觉transformer模型&#xff0c;它执行OCR任务&#xff0c;用于将科学文档处理成标记语言&a…