2019-10-05 22:13:42 lai1170137052 阅读数 148
  • 温度传感器DS18B20-第2季第1部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第1个课程,主要讲解单片机系统中常用的温度传感器DS18B20。本课程的目标是让大家进一步掌握时序的分析和编程实现,学会移植和调试DS18B20的程序,能够读取温度。

    2182 人正在学习 去看看 朱有鹏

由于家里有个小需求,就是每次家里抽水爸妈都要跑三楼去看是否抽满,比较辛苦,于是寻思着搞一个水位自动控制器。

水位控制器探测水位实现方式有很多,有浮球式,分级检测电位,超声波,液压传感器,激光等等。采用什么样的探测器,需根据具体情况,具体要求来。刚开始我选择采用超声波,单片机用最简单的stc89c52即可满足要求,液晶用1602显示,超声波探头用网线连接到楼下,其实只用了网线的四根线,成品图如下:

分10级显示水位,led分8个表示水位高度,原理大致是,主程序通过每隔0.5s驱动超声波发射一次探测水位,将返回的数值进行相应的显示,非常简单。

成品功能是是实现了,但是运行个一两天发现超声波探头不行了,乱显示,一查原因是由于超声波模块需要放在楼顶水塔里面,虽然是安装在顶部,不会直接接触到水,但是长时间放在密闭的水塔里,水汽非常大,超声波前面的网格上会聚集很多小水珠,这时候超声波误以为障碍物就在眼前,导致探测错误。

 

寻思着能否把超声波模块放在一个盒子里面,这样就水汽不会影响了超声波,但是如果装在盒子里面,又会挡住超声波发射,唉,还是forget it吧,直接放弃这种方式,虽然是简单,只要安装一个探头就行,但是不满足目前需求,容易坏和出问题,爸妈也不会修。

于是决定采用分级探测电位方式来实现。

原理更加简单,用一根水管钻8个洞,每个洞前面焊接一个不锈钢铁片,最后一个接电源地,其他的接单片机七个引脚。由于长时间泡在水里,常规铁片不行,必须是不锈钢的。刚开始是直接将7个不锈钢片接在P1口,后来发现检测电位时,水位接触了铁片根本不导通,单片机检测不到低电平。这是由于水的电阻非常大,量了一下,大概0.7-09M欧,导通电流非常小。怎么办呢,其实也非常简单,用一个三极管放大信号就行,我采用的是8550 PNP型管子,三极管发射极接vcc,集电极接单片机引脚,基极接不锈钢片,最低的那根不锈钢片接地,一旦接触到其中的某个三极管基极即可导通三极管,单片机脚位即可检测到高电平。使用了几天,发现非常稳定,效果非常好,成品长这样:

画了pcb与原理图,花了点钱打了一块板子,线材直接用网线,效果非常好,抗干扰性强,电源直接买了个5v的路由器的电源,液晶用12864,大一点,爸妈能看清楚,主要是能显示中文,因为之前用1602只能显示英文,一些提示信息爸妈不知道啥意思,还能画图,我这次用了10张位图来显示水位,类似手机电量的那种,直观,水位多少一目了然。由于需要外接继电器,led灯,按键等等,12864只能用串口方式了,并口方式不采用其他元件搭配使用的话就不够了,我比较懒,就用串口了,节省引脚,这次接液晶只用了三个引脚就达到了要求,单片机还空了几个引脚没有用的。

原理也超级简单,就是用单片机定时器0每隔一秒检测P1口的7个脚是否是高电平,检测到多少个,显示几级水位。唯一一点需要说下的是,探测水管一头接在顶部,为了垂直,底部我吊了一个红砖碎块,液面在楼顶,每当风起 或者抽水的时候液面会有轻微的抖动,尤其在抽水的时候,液面抖动非常厉害,在水位快低于最低要求的水位时,我设置的是自动模式下是低于50%就抽水,液面上一级是70%,实际水位是70%,由于液面有抖动,一下是50%,一下又70%,有时候还会到90%,导致继电器误动作了,为了解决这个问题,我采用了延时检测加判断进入最低液面的次数来解决,发现非常的稳定,部分源码如下,因为其他的也没有什么好说的:

#include <reg52.h>
#include <string.h>
#include <delay.h>
#include <lcd12864.h>
#include <relay.h>
#include <buzzer.h>
#include <led.h>
#include <sensor.h>

unsigned int percent = 0;// 当前水位与最高水位的百分比
unsigned int buzzer_count = 0;// 用于抽水时蜂鸣器叫计数
unsigned int buzzer_warning_count = 0;// 用于报警蜂鸣器叫计数
unsigned int buzzer_high_warning_max_count = 0;// 用于记录超高报警提示次数
unsigned int buzzer_high_warning_count = 0;// 用于水位超高时报警蜂鸣器叫计数
unsigned int buzzer_low_warning_count = 0;// 用于水位超低时报警蜂鸣器叫计数
unsigned int auto_high = 90;// 设定自动模式最高水位百分比
unsigned int auto_low = 50;// 设定自动模式最低水位百分比
unsigned int manual_high = 90;// 设定手动模式最高水位百分比
unsigned int manual_low = 10;// 设定手动模式最低水位百分比
unsigned int low_count = 0;// 自动模式下,进入低于最低水位次数,防止液面抖动
unsigned int high_count = 0;// 自动模式下,进入低于最高水位次数,防止液面抖动


// 初始化
void init_sensor() 
{
		P2 = 0x00;// p2口初始化为低电平
		check = 1;// 是否检测楼下水池水位开关,高电平不检查
		has_water = 0;// 楼下是否有水标志
		mode = 1;// 是否是自动抽水模式,0-是;1-否,默认不开启
}

// 计算当前水位的百分比
void calculate_percent() 
{
		unsigned char current = P2;
        unsigned int delayms = 500;// 延时检测时间,11.0592M晶振下
		is_warning = 0;// 初始化报警状态
		warning_type = 0;// 初始化报警类型
	
		// 计算百分比
		if(s7 == 0) {
            delaynms(delayms);// 延时检测,防止液面抖动
            if(s7 == 0) {// 如果真的等于0
                percent = 0;
            }
		}
		if(s7 == 1) {
            delaynms(delayms);// 延时检测,防止液面抖动
            if(s7 == 1) {
                percent = 10;
            }
		} 
		if(s6 == 1) {
            delaynms(delayms);// 延时检测,防止液面抖动
            if(s6 == 1) {
                percent = 20;
            }
		}
		if(s5 == 1) {
            delaynms(delayms);// 延时检测,防止液面抖动
            if(s5 == 1) {
                percent = 30;
            }
		}
		if(s4 == 1) {
            delaynms(delayms);// 延时检测,防止液面抖动
            if(s4 == 1) {
                percent = 50;
            }
		}
		if(s3 == 1) {
            delaynms(delayms);// 延时检测,防止液面抖动
            if(s3 == 1) {
                percent = 70;
            }
		}
		if(s2 == 1) {
            delaynms(delayms);// 延时检测,防止液面抖动
            if(s2 == 1) {
                percent = 90;
            }
		}
		if(s1 == 1) {
            delaynms(delayms);// 延时检测,防止液面抖动
            if(s1 == 1) {
                percent = 100;
            }
		}
	
		// 计算百分比
//		if(current == 0x80) {
//			percent = 100;
//		} else if(current == 0xc0) {
//			percent = 90;
//		}  else if(current == 0xe0) {
//			percent = 70;
//		} else if(current == 0xf0) {
//			percent = 50;
//		} else if(current == 0xf8) {
//			percent = 30;
//		} else if(current == 0xfc) {
//			percent = 20;
//		} else if(current == 0xfe) {
//			percent = 10;
//		} else if(current == 0xff) {
//			percent = 0;
//		} else {
//			// 探测器异常
//			percent = 0;
//			is_warning = 1;
//			warning_type = 1;
//			if(buzzer_warning_count++ >= 20)// 1s * 20 约20s
//			{
//				buzzer_warning_count = 0;
//				buzzer_warning_tips();// 蜂鸣器报警叫5声,led闪烁
//			}
//			relay_stop();// 如果在抽水过程中出异常,关闭继电器
//		}
		
			// 如果没有报警且开启了自动抽水模式
			if(mode == 0) {
				if(is_warning == 0) {
						if(percent <= auto_low) {// 如果低于设定的最低水位
                            if(low_count++ >= 10) {// 如果进来10次,说明水位是真的到了最低水位,防止液面抖动触发继电器情况
                            
                                // 是否需要检测楼下水位,为了没有安装楼下水位探测器也能正常使用的情况
                                if(check == 0) {// 需要
                                        if(has_water == 1) {// 有水
                                                relay_start();// 开启继电器
                                                // low_count = 0;
                                        } else {
                                                is_warning = 1;
                                                warning_type = 2;// 开启液晶显示缺水错误提示
                                                relay_stop();// 如果在抽水过程中没有水了,关闭继电器
                                                    
    //											if(buzzer_warning_count++ >= 20)// 1s * 20 约20s
    //											{
    //												buzzer_warning_count = 0;
    //												buzzer_warning_tips();// 蜂鸣器报警叫5声,led闪烁
    //											}
                                        }
                                } else {//不需要检测楼下水位
                                        relay_start();// 开启继电器
                                }
                            }
						} else {
                            low_count = 0;
                        }
						if(percent >= auto_high) {
                             if(high_count++ >= 3) {// 如果进来3次,说明水位是真的到了最低水位,防止液面抖动触发继电器情况
                                relay_stop();// 关闭继电器
                                high_count = 0;
                             }
						} else {
                           high_count = 0; 
                        }
						
						// 如果继电器已开启
						if(relay_open_flag == 1 && is_warning == 0) {
									if(buzzer_count++ >= 5)// 每1s进来一次,5s
									{
												buzzer_count = 0;
												buzzer_nms(300);// 蜂鸣器叫300ms左右,提示正在抽水
									}
									relay_led = 0;// 继电器抽水提示led灯闪烁
									delaynms(100);
									relay_led = 1;
						}
				} 
			} else {// 手动模式下
						relay_stop();// 如果突然变为手动模式,若开启继电器,关闭继电器
						
						if(percent <= manual_low) {// 如果低于设定的最低水位,提示抽水
								if(buzzer_low_warning_count++ >= 5*60)// 每1s进来一次,5*60s=5min
								{
											buzzer_low_warning_count = 0;
											buzzer_warning_tips();// 蜂鸣器报警叫5声,led闪烁
								}
						}
						if(percent >= manual_high) {// 如果低于设定的最高水位,提示关水
								if(buzzer_high_warning_count++ >= 5)// 每1s进来一次,5s
								{
											buzzer_high_warning_count = 0;
											if(buzzer_high_warning_max_count++ < 5) {// 如果超过提醒次数,则不再提醒
													buzzer_warning_tips();// 蜂鸣器报警叫5声,led闪烁
											}
											if(buzzer_high_warning_max_count > 10) {// 防止数据溢出
													buzzer_high_warning_max_count = 10;
											}
								}
						} else {
								buzzer_high_warning_max_count = 0;// 恢复报警次数
						}
			}
}


// 根据探测到的距离,计算水位,返回是否超出范围:1-超出;0-没有超出
void calculate_water_level() 
{
		calculate_percent();// 计算水位百分比
		lcd_show_percent();// 液晶显示水位
		led_show_percent();// led显示水位
}



本人是一名程序员,大学学的电子,工作后不搞电子好多年了,通过这次,也复习了下电子方面的内容,成品完成后,也有点小小的成就感,最终帮爸妈解决了抽水问题,只要楼下不缺水,他们基本就不用管水了。

好了,分享就到这吧。

 

 

 

2020-01-04 22:05:57 weixin_45380951 阅读数 12
  • 温度传感器DS18B20-第2季第1部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第1个课程,主要讲解单片机系统中常用的温度传感器DS18B20。本课程的目标是让大家进一步掌握时序的分析和编程实现,学会移植和调试DS18B20的程序,能够读取温度。

    2182 人正在学习 去看看 朱有鹏

Water Sensor水位传感器

水位传感器长这样
在这里插入图片描述

优点

简单易用、小巧轻便、性价比高

特点

1、水量到模拟量的转换
2、可塑性强,本传感器输出为基础模拟值
3、低功耗,灵敏度高
4、可直接与魏处理器或其他逻辑电路相连接,适合各种开发板和控制器(如:Arduino控制器、STC单片机、AVR单片机等)

规格参数

工作温度:10摄氏度-30摄氏度
工作湿度:10%-90%无凝结

利用ads1115数模转换器做一个转接到树莓派上检测水位
2019-10-11 17:26:55 qq_42377696 阅读数 118
  • 温度传感器DS18B20-第2季第1部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第1个课程,主要讲解单片机系统中常用的温度传感器DS18B20。本课程的目标是让大家进一步掌握时序的分析和编程实现,学会移植和调试DS18B20的程序,能够读取温度。

    2182 人正在学习 去看看 朱有鹏

该系统以AT89C51作为核心控制部件,外加传感器,一片A/D转换芯片和数码管来完成系统的预期任务,即液位的检测、显示和超限报警。传感器实现液位信号到电压信号的转换,再由8位A/D转换芯片ADC0809将模拟信号转换为数字信号,实现液位信息的输入,AT89C51从ADC0809读取液位信息后进行数据处理和超限判断,随后将处理过的数据输出到数码管显示,设置最高液位和最低液位,若液位超限则由单片机报警。

#include <reg51.h>
unsigned char code table[]={0xde,0x91,0xcd,0xd5,0x93,0x2b,0x5f,0xd4,0xdf,0xd1};
sbit sw6=P1^5;//水位6
sbit sw5=P1^4;//水位5
sbit sw4=P1^3;//水位4
sbit sw3=P1^2;//水位3
sbit sw2=P1^1;//水位2
sbit sw1=P1^0;//水位1
sbit beep=P1^6;//蜂鸣器
sbit dianji=P1^7;//电机
sbit LED=P2^6;//电机指示灯
sbit red=P2^3;//red
sbit green=P2^4;//green
sbit yellow=P2^5;//yellow

void delay02s(void)
{
  unsigned char i,j,k;
  for(i=100;i>0;i--)
  for(j=100;j>0;j--)
  for(k=248;k>0;k--);
}
        main()
                      {
                         P0=0;
                         while(1)
                         {  
                        if(sw6==0&&sw5==1&&sw4==1&&sw3==1&&sw2==1&&sw1==1)//水位6
                        {
                         dianji=0;
                         LED=0;red=0;green=0;yellow=0;
				                 beep=0;
                        P0=table[6];
                                delay02s();
                        }
                               
                        if(sw6==1&&sw5==0&&sw4==1&&sw3==1&&sw2==1&&sw1==1)//水位5
                        {
													      dianji=0;
                                LED=0;red=0;green=0;yellow=0;
													      beep=0;
                                P0=table[5];
                        }
                       
                        if(sw6==1&&sw5==1&&sw4==0&&sw3==1&&sw2==1&&sw1==1)//水位4
                        {
													      dianji=0;
                                LED=0;red=0;green=0;yellow=0;
													      beep=0;
                                P0=table[4];
                        }
                       
                        if(sw6==1&&sw5==1&&sw4==1&&sw3==0&&sw2==1&&sw1==1)//水位3
                        {         
													        dianji=0;
                                  LED=0;red=0;green=1;yellow=1;
													        beep=0;
                                  P0=table[3];
                        }
                     
                        if(sw6==1&&sw5==1&&sw4==1&&sw3==1&&sw2==0&&sw1==1)//水位2
                        {      
													      dianji=1;
                                LED=1;red=1;green=1;yellow=0;
													      beep=1;
                                P0=table[2];
                        }
                     
                        if(sw6==1&&sw5==1&&sw4==1&&sw3==1&&sw2==1&&sw1==0)//水位1
                        {
													      dianji=1;
                                LED=1;red=1;green=0;yellow=1;
													      beep=1;												
                        P0=table[1];
                        }
               }
         
}

啊

在这里插入图片描述

2019-04-07 01:40:41 huazhen1234 阅读数 1704
  • 温度传感器DS18B20-第2季第1部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第1个课程,主要讲解单片机系统中常用的温度传感器DS18B20。本课程的目标是让大家进一步掌握时序的分析和编程实现,学会移植和调试DS18B20的程序,能够读取温度。

    2182 人正在学习 去看看 朱有鹏

一、需求
1)检测鱼塘水位;水位过高闸门开启放水,水位过低关闭闸门。
2)检测是否有人靠近鱼塘,如果有人靠近,蜂鸣报警+短信报警,要区分路过和真正的靠近。

二、前期准备
1)单片机最小系统板:STM32F103C8T6
2)开发环境:MDK5.14
3)库函数:标准库V3.5
4)热释电红外传感器:HC-SR501
5)电机:5V电机
6)短信模块:SIM800C
7)水位传感器:光电式水位传感器
8)蜂鸣器

三、小项目效果图
在这里插入图片描述
四、驱动原理
1)电机驱动:驱动继电器控制电机转动;
2)蜂鸣器驱动:PWM
3)SIM800C驱动:USART
4)液位传感器驱动:IO
5)热释电红外传感器驱动:IO,TIM

欢迎加QQ:1002521871,验证:呵呵;讨论研究!
由于作者能力有限,有不妥之处欢迎指正,邮箱alex_hua@foxmail.com

2017-04-21 15:16:09 zhang_zhonghai 阅读数 223
  • 温度传感器DS18B20-第2季第1部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第1个课程,主要讲解单片机系统中常用的温度传感器DS18B20。本课程的目标是让大家进一步掌握时序的分析和编程实现,学会移植和调试DS18B20的程序,能够读取温度。

    2182 人正在学习 去看看 朱有鹏

技术小白在建议下决定在学习技术的工程中写写博客,希望各位大神不吝赐教!

首先就写写最近在做的毕设《基于51单片机的太阳能电加热辅助系统》。

这个系统主要实现的就是①实时监测水位,水温(使用传感器检测)。

                                            ②控制加热时间,加热温度,水位(按键控制)。【范围0-99】

                                            ③显示水位,水温,加热时间,设定水位,水温(LCD1602显示)。

                                            ④报警系统,水温到达预定值报警。

                                            ⑤水位低于最小值,自动加水。

                                            ⑥通过电磁继电器控制加热模块和加水模块(加热加水模块,电压220V)。

系统框图大致如下:



设计到这里大致的思路已经做好了,下一次我们再做元器件的选择和其他工作。















上位机开发介绍

阅读数 91

没有更多推荐了,返回首页