【防霉行动】晒一晒我的自制热水器!
1.第一步。买一个25L的大塑料桶,非常常见,十多元一
个,先在上面开一个大洞,方便伸进去手操作,也做加水口和搅拌口(经过后来的使用,个人觉得这个桶大小够用了。)
2. 在底部开一个洞洞(洞洞大小与下一步里的接头相匹配),准备安放出水管
3.买来接头,外径与桶底部的洞一般大,注意要上下两个密封圈。这些东西卖太阳能的地方都有卖,五金店似乎也有。几元钱一个。
4. 装起来的效果,上面是紧在桶底的,下面是丝是安装莲蓬头的软管的。
5.接头尾部接上莲蓬头,样子有了吧。
7.把接头旋到桶底开好的洞里面去,然后把另外一个头从桶里面上紧,这样就不会漏水了。
8.来个POSS
9.下面做好了,现在在脑袋上开俩洞,准备装加热设备。。。其实就是热得快!
10.两根热得快可以提供2000W的功率,一般20分钟即可把水加热的洗澡温度
11.热得快插头去掉,并联到一根电源线上
12.把热得快装到咱的桶上,可以用哥俩好固定一下
15.往里面看看。。。
16.下面是感温探头了,用的是美信的18B20,我们都知道这东西怕水,放在桶外又不能精确地检测温度。这里我用了个大小合适的电容,挖空它的内脏!剩下个铝壳,里面填满导热硅脂,18B20丢里面,引出三根线,口处用哥俩好封住,牢牢地,一点水都不进,传热还非常好。
17.封的牢牢的。(手机拍的,不是很清楚)
18.热水器的大脑,可以显示当前水温,三个按键用来设定洗澡水的温度,到了温度滴滴叫,提示可以洗澡了。(本来是想控制继电器来关断加热的,后来没找到继电器,再说宿舍一直有人,便只用了个蜂鸣器,简单。。。)
19.本人菜鸟一个,那焊得,也就是连起来,别笑话我。。。
20.最后组装完成了,放在高处,用绳子捆捞,通电试验,悲剧了,上面水热,下面水冷。。。 怎么办?搅拌!拿个小破电扇拆下来的电机加几根电线(我们几个舍友论证了好久才确定的这种方法,开始提议用电机加轴加个自制叶片,这样太麻烦,后来经过试验,只用几根电线绕成螺旋形就足够了),就这么拌!莲蓬头平常放在高处,洗澡时拿下来放在座上,这样连阀门都省下啦,前提是你要够高,伸手能够到液面以上喽。。
虽然咱的热水器廉价,但是也不能忽略了它的安全性,我的做法是用一个总插排,把用电的都插在这个插排上,烧完水后把插排电源断掉,什么防电墙漏电保护通通过时啦,,, 天呐,没有比这更安全的热水器了!!!!到现在用了半年了,一直没出现过任何问题。
各位童鞋冲动了没,是不是很想做一个,在这里提前祝大家制作成功。
最后,你们先看着,我洗澡去了。。。
关键词: 防霉 行动 一晒 我的 自制 热水器 一个
这是我的程序,当时是为了做一个小冰箱的温控器做的,移到这上面来用了,对于单片机我是个初学者,程序不太简洁,也希望高手能给出建议,相互学习。
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
//相比以前的函数解决了显示不了百位,不能直接显示负号等
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
// 0 1 2 3
0x66,0x6d,0x7d,0x07,
// 4 5 6 7
0x7f,0x6f,0x40
//8 9 -
};
void display(uchar , uchar ,uchar ,uchar );
void delay_led(uint z);
void init_led();
uchar wei_3,v,wei_4,wei_5,wei_6,FWD,flag;
int shuju,a; //得到的温度值
uchar temp[2]={0,0}; //存放DS18B20的温度寄存器值
uint value = 0;
sbit DQ=P1^0; //数据线
sbit key=P1^1; //被控开关
sbit key1=P3^4; //温度加
sbit key2=P3^5; //温度减
sbit d1=P1^2; //设置指示灯
sbit we1=P1^4;
sbit we2=P1^5;
sbit we3=P1^6;
sbit we4=P1^7;
void ow_reset(void);
void tmstart (void);
void Read_Temperature(void);
void write_byte(char);
uint read_byte(void);
void delay_18B20(uint);
/*******主函数**********/
void main()
{
init_led();//初始化子程序
tmstart ();//18b20初始化
delay_18B20(50); /*等待转换结束*/
while(1)
{
Read_Temperature();
delay_18B20(50);
tmstart();
delay_18B20(50); /*等待转换结束*/
if(FWD==0) //当温度为正值时
{
if(shuju>a+5)//判断温度是否超过设定值若超过,则开始制冷,k=0时开始制冷
key=0;
if(shuju<a-5)
key=1; //shuju低于设定温度时,停止制冷,k=1停止制冷
}
if(FWD==1) //当温度为负值时
{
if(abs(a)>a)
{
if(shuju>abs(a)+5)//数据大于设定温度,说明当前温度低,停止制冷,k=1停止制冷
key=1;
if(shuju<abs(a)-5)//数据小于设定温度,说明当前温度高,开始制冷,k=0开始制冷
key=0;
}
else
key=1;
}
display(wei_3,wei_4,wei_5,wei_6);
}
}
void exter0() interrupt 2
{
flag=!flag;
// while(1);
}
/******延时函数*********/
void delay_led(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******led初始化函数******/
void init_led()
{
key=1;
FWD=0;
a=40;
EA=1;//开总中断
EX1=1;//开中断1
IT1=1;//选择中断方式为下降沿触发
}
/********显示函数*********/
void display(uchar wei_3, uchar wei_4,uchar wei_5,uchar wei_6)
{
wei_3=shuju/1000%100%10;
wei_4=shuju/100%1000%100%10;
wei_5=shuju/10%10000%1000%100%10;
wei_6=shuju/1%100000%10000%1000%100%10;
if (FWD==1)//此处用双等号!
wei_3=10;
P0=table[wei_3];
we1=0;
delay_led(5);
we1=1;
P0=table[wei_4];
we2=0;
delay_led(5);
we2=1;
P0=table[wei_5]+0x80; //小数点显示+80H即可
we3=0;
delay_led(5);
we3=1;
P0=table[wei_6];
we4=0;
delay_led(5);
we4=1;
}
//========18b20程序=================*/
void delay_18B20(uint seconds) //延时
{
for(;seconds>0;seconds--);
}
/******************************************
18b20程序
******************************************/
//===============复位 ===========
void ow_reset(void)
{
uchar presence;
DQ = 0; //pull DQ line low
delay_18B20(44); //至少480微秒, leave it low for 501us
DQ = 1; // allow line to return high?
delay_18B20(3); // wait for presence18b20 36us
presence = DQ; // get presence signal // 0= DS18B20 ready, 1= busy
//if(!presence)P1_0=0;
delay_18B20(12); // wait for end of timeslot
}
//=========从总线上读取一个字节========
uint read_byte(void)
{
uchar i;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0; // pull DQ low to start timeslot
_nop_();_nop_();_nop_();_nop_();
DQ = 1; // then return high
if(DQ)
{
value|=0x80;
}
delay_18B20(4); // wait for rest of timeslot
}
return(value);
}
//===========向18B20写一个字节=================
void write_byte(char val)
{
uchar i,j;
for (i=8; i>0; i--) // writes byte, one bit at a time
{
DQ = 0; // pull DQ low to start timeslot
j++; /*延时4us*/
DQ = val&0x01;
delay_18B20(8); // hold value for remainder of timeslot
DQ = 1;
j++;
val>>=1;
}
}
//============读取温度============
void Read_Temperature(void)
{
uint k,i;
int temple; /*存放读取的温度值 将其除以16即为得到的值*/
ow_reset();
k++; //延时4us
write_byte(0xCC); //Sk_nop_();ip ROM
k++; //延时4us
write_byte(0xBE); // read register
k++;k++; //延时8us
temp[0]=read_byte(); //读取低字节
temp[1]=read_byte(); //读取高字节
i=temp[1];
i<<=8; /*把b放到高八位上去*/
/*将a放到底八位上去*/
i=i|temp[0];
if(flag==1)//如果按下设置键
{
d1=0;
if(key1==0)//如果加温键被按下
{
delay_led(5);
if(key1==0)//消抖,再次判断
{
a=a+10;//步长为1度
while(!key1);//判断键盘松开
}
}
if(key2==0)//如果减温键被按下
{
delay_led(5);
if(key2==0)//再次判断,消抖
{
a=a-10;
while(!key2);
}
}
i=a*16/10;//显示当前设置的温度
}
else
d1=1;
if( i>6348)
{
temple=65536-i; //如果为负温则去除其补码
FWD=1; /*表示温度为负数*/
}
else
{
temple=i;
FWD=0;
/*表示温度为正数*/
}
shuju=temple*10/16;
}
//=======初始化============
void tmstart (void)
{
ow_reset(); //复位
delay_18B20(1); //延时
write_byte(0xCC); //跳过序列号命令,对所有器件有效
write_byte(0x44); //发转换命令 44H,
}
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |