这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【防霉行动】晒一晒我的自制热水器!

共34条 1/4 1 2 3 4 跳转至

【防霉行动】晒一晒我的自制热水器!

院士
2011-03-02 21:19:28     打赏
    毕业已经有半年了,可还是住单位的宿舍,条件不咋地,特别是没有洗澡的设备让人很纠结,大冷的天,出去洗澡那可就痛苦了,咋办,发挥一下咱们DIY的精神,自己做一个吧。这就把我前些日子做的“高档”热水器发上来跟大家一起分享一下。我估计大多数的童鞋的宿舍里都没有热水器吧,那我们一起来做一个吧。 废话不多说了,先大体介绍一下我的思路,我是用一个置于高处的水箱盛水,用两根热得快提供2000W的功率来烧水,18B20做水温检测,配合51单片机和数码管来显示和设定温度,当水温达到设定温度蜂鸣器会报警,切断电源,然后你就可以舒服的洗一个热水澡了。 本着少花钱多办事的原则,我采用了很多常见又廉价的材料,充分发挥废物利用,整体花费在五六十元左右,五六十元的热水器呀,太超值了。。。。

1.第一步。买一个25L的大塑料桶,非常常见,十多元一
个,先在上面开一个大洞,方便伸进去手操作,也做加水口和搅拌口(经过后来的使用,个人觉得这个桶大小够用了。)





2. 在底部开一个洞洞(洞洞大小与下一步里的接头相匹配),准备安放出水管



3.买来接头,外径与桶底部的洞一般大,注意要上下两个密封圈。这些东西卖太阳能的地方都有卖,五金店似乎也有。几元钱一个。



4.       装起来的效果,上面是紧在桶底的,下面是丝是安装莲蓬头的软管的。



5.接头尾部接上莲蓬头,样子有了吧。






7.把接头旋到桶底开好的洞里面去,然后把另外一个头从桶里面上紧,这样就不会漏水了。




8.来个POSS




9.下面做好了,现在在脑袋上开俩洞,准备装加热设备。。。其实就是热得快!







10.两根热得快可以提供2000W的功率,一般20分钟即可把水加热的洗澡温度




11.热得快插头去掉,并联到一根电源线上




12.把热得快装到咱的桶上,可以用哥俩好固定一下




15.往里面看看。。。




16.下面是感温探头了,用的是美信的18B20,我们都知道这东西怕水,放在桶外又不能精确地检测温度。这里我用了个大小合适的电容,挖空它的内脏!剩下个铝壳,里面填满导热硅脂,18B20丢里面,引出三根线,口处用哥俩好封住,牢牢地,一点水都不进,传热还非常好。




17.封的牢牢的。(手机拍的,不是很清楚)




18.热水器的大脑,可以显示当前水温,三个按键用来设定洗澡水的温度,到了温度滴滴叫,提示可以洗澡了。(本来是想控制继电器来关断加热的,后来没找到继电器,再说宿舍一直有人,便只用了个蜂鸣器,简单。。。)




19.本人菜鸟一个,那焊得,也就是连起来,别笑话我。。。





20.最后组装完成了,放在高处,用绳子捆捞,通电试验,悲剧了,上面水热,下面水冷。。。  怎么办?搅拌!拿个小破电扇拆下来的电机加几根电线(我们几个舍友论证了好久才确定的这种方法,开始提议用电机加轴加个自制叶片,这样太麻烦,后来经过试验,只用几根电线绕成螺旋形就足够了),就这么拌!莲蓬头平常放在高处,洗澡时拿下来放在座上,这样连阀门都省下啦,前提是你要够高,伸手能够到液面以上喽。。



虽然咱的热水器廉价,但是也不能忽略了它的安全性,我的做法是用一个总插排,把用电的都插在这个插排上,烧完水后把插排电源断掉,什么防电墙漏电保护通通过时啦,,,  天呐,没有比这更安全的热水器了!!!!到现在用了半年了,一直没出现过任何问题。

各位童鞋冲动了没,是不是很想做一个,在这里提前祝大家制作成功。

最后,你们先看着,我洗澡去了。。。



关键词: 防霉     行动     一晒     我的     自制     热水器     一个    

院士
2011-03-02 21:20:51     打赏
2楼
我滴个神,第一次上传图片,乱了。。。

院士
2011-03-02 21:27:22     打赏
3楼

这是我的程序,当时是为了做一个小冰箱的温控器做的,移到这上面来用了,对于单片机我是个初学者,程序不太简洁,也希望高手能给出建议,相互学习。

#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,
}


院士
2011-03-03 08:23:05     打赏
4楼
这的确给力!!!

这是真正的DIY~~~


楼主,用了我10分钟才给你调好,看着眼晕,O(∩_∩)O哈哈~

院士
2011-03-03 10:14:41     打赏
5楼

感谢管理员,也同情我自己,我用了一个多小时才发完呐,之前发过一次,验证码错误,什么都没了,杯具了。。。我又在word上编辑好了再一点点发上来的,不过看到我的帖子被评为精华,我出的力值了!


院士
2011-03-03 10:28:54     打赏
6楼
发帖前一定要备份,尤其是这样的长帖~~~

高工
2011-03-03 10:59:45     打赏
7楼

楼主辛苦了,致敬!这个热水器,超实用的DIY,尤其那个搅拌器,创意非常好,哈哈,其实很多东西,我们没有必要非得用自动的,手动的更实惠更安全呢。看到那里时,我突然想起来一个笑话,如何检测生产线上的香皂盒里没装香皂,拿风扇吹。再赞一个,哈哈。


专家
2011-03-03 11:07:46     打赏
8楼
可以先写几个字,然后再在内容里面编辑修改就行

工程师
2011-03-03 12:07:53     打赏
9楼

向楼主致敬!!!呵呵


助工
2011-03-03 12:48:05     打赏
10楼
真是好东东啊!

共34条 1/4 1 2 3 4 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]