超声波水位控制器是一种无需物理接触就能检测水箱内水位的装置,并以无线GSM模式将数据发送到远处的LED指示灯。
在这篇文章中,我们将使用Arduino构建一个基于超声波的太阳能无线水位指示器,Arduino将以2.4 GHz的无线频率发射和接收。我们将用超声波代替传统的电极法来检测水箱的水位。
概述
如果你有自己的房子,甚至是租来的房子,水位指示器是必备的小玩意。一个水位表显示你的房子的一个重要数据,这个数据和你的电能表读数一样重要,那就是,还有多少水?这样我们就可以跟踪水的消耗情况,而且我们不需要爬到楼上的水箱去查看还剩多少水,也不会再突然停止水龙头里的水。
我们生活在2018(在本文的写作的时间),我们可以沟通立即在世界任何地方,我们推出了一款电动赛车空间,我们发射卫星和火星探测车,我们甚至可以人类降落在月球上,仍然没有合适的商业产品检测多少水留在我们的水箱吗?
我们可以找到水水平指标是五年级学生为学校的科学展览制作的。为什么这样简单的项目没有进入我们的日常生活?答案是水箱水位指示器并不是一个五年级学生就能做的简单项目。有很多实际考虑在我们设计之前。
•没有人愿意在水箱上钻一个洞,以放置电极,这样以后可能会漏水。
•没有人想在水箱附近运行230 / 120 VAC电线。
•没人愿意每个月更换电池。
•没有人想在房间上挂额外的长电线来显示水位,因为在建造房子时没有预先计划。
•没有人愿意使用混合了金属腐蚀电极的水。
•在清洗水箱(内部)时,没有人想要拆除水位指示器设置。
上面提到的一些原因可能看起来很傻,但是,你会发现带有这些缺点的商业产品并不令人满意。这就是为什么这些产品在普通家庭中的渗透率非常低*。
*在印度市场。
在考虑了这些要点后,我们设计了一个实用的水位指示器,消除了上述缺点。
我们的设计:
•采用超声波传感器测量水位,无腐蚀问题。
•2.4 GHz无线水位实时指示。
•良好的无线信号强度,足以满足2层楼高的建筑。
•太阳能供电,无需交流电源或更换电池。
•注油时水箱满/溢出报警。
让我们来研究电路的细节:
发送器:
的无线发射机电路它被放置在水箱上,每5秒24小时发送一次水位数据。变送器由Arduino纳米、超声波传感器HC-SR04、nRF24L01模块组成,nRF24L01模块将变送器与接收器在2.4 GHz无线连接。
一个输出电流为300mA的9v到12v的太阳能电池板将为发射机电路供电。电池管理电路板将为锂离子电池充电,这样即使在没有阳光的情况下我们也可以监测水位。
让我们来探讨一下如何将超声波传感器放置在水箱:
请注意,你必须使用你的创造力堆砌电路,并防止雨水和阳光的直接照射。
在水箱的盖子上剪一个小洞,用来放置超声波传感器,然后用你能找到的某种粘合剂把它密封起来。
现在测量水箱从底部到盖子的全部高度,以米为单位。现在测量水罐的高度,如上图所示,并写下米。
您需要在代码中输入这两个值。
发射机原理图:
注意:nRF24L01使用3.3V作为Vcc,不连接Arduino的5V输出。
发射机电源:
确保你的太阳能电池板的输出功率,即输出(伏特x电流)大于3瓦。的太阳能电池板应该是9V到12V。
推荐12V和300mA面板,您可以很容易地在市场上找到。电池应在3.7V 1000 mAh左右。
5V 18650锂离子充电模块:
下图显示了一个标准18650充电器电路
输入可以是USB(未使用)或外部LM7805 IC 5V .确保得到正确的模块如上所示TP4056具有低电池截止和短路保护。
这个的输出应该馈送到XL6009的输入,它会升压到更高的电压,使用一个小的螺丝刀XL6009的输出应该被Arduino调整到9V。
XL6009直流到直流升压变换器示意图:
这就是发射机的硬件。
发射机的代码:
// ----------- 程序由R.GIRISH / Homemade-circuits。com ----------- //
# include < RF24.h >
# include < SPI.h >
RF24电台(9、10);
Const字节地址[6]= "00001";
Const int trigger = 3;
Const int echo = 2;
const char text_0[] = "停止";
const char text_1[] = "完整";
Const char text_2[] = "3/4";
const char text_3[] = "一半";
const char text_4[] = "LOW";
Float full = 0;
Float three_fourth = 0;
浮动一半= 0;
浮点四分之一= 0;
长时间;
float distanceCM = 0;
float distanceM = 0;
float resultCM = 0;
float resultM = 0;
浮动actual_distance = 0;
Float compensation_distance = 0;
// -------更改此-------//
浮子water_hold_capacity = 1.0;//输入米。
Float full_height = 1.3;//输入米。
// ---------- -------------- //
无效的设置()
{
Serial.begin (9600);
pinMode(触发、输出);
pinMode(呼应,输入);
digitalWrite(触发、低);
radio.begin ();
radio.openWritingPipe(地址);
radio.setChannel (100);
radio.setDataRate (RF24_250KBPS);
radio.setPALevel (RF24_PA_MAX);
radio.stopListening ();
全= water_hold_capacity;
Three_fourth = water_hold_capacity * 0.75;
Half = water_hold_capacity * 0.50;
Quarter = water_hold_capacity * 0.25;
}
无效循环()
{
延迟(5000);
digitalWrite(触发、高);
delayMicroseconds (10);
digitalWrite(触发、低);
Time = pulseIn(echo, HIGH);
distanceCM =时间* 0.034;
结果tcm = distanceCM / 2;
resultM = resultCM / 100;
系列。打印(“正常距离:”);
并同时resultM);
系列。println(“M”);
Compensation_distance = full_height - water_hold_capacity;
actual_distance = resultM - compensation_distance;
Actual_distance = water_hold_capacity - Actual_distance;
If (actual_distance < 0)
{
系列。打印(“水位:”);
系列。println(" 0.00 M (UP)");
}
其他的
{
系列。打印(“水位:”);
并同时actual_distance);
系列。println(“M(了)”);
}
以 ("============================");
If (actual_distance >= full)
{
收音机。写(&text_0 sizeof (text_0));
}
If (actual_distance > three_fourth && actual_distance <= full)
{
收音机。写(&text_1 sizeof (text_1));
}
If (actual_distance > half && actual_distance <= 3,4)
{
收音机。写(&text_2 sizeof (text_2));
}
If (actual_distance > quarter && actual_distance <= half)
{
收音机。写(&text_3 sizeof (text_3));
}
If (actual_distance <=四分之一)
{
收音机。写(&text_4 sizeof (text_4));
}
}
// ----------- 程序由R.GIRISH / Homemade-circuits。com ----------- //
在你测量的代码中更改以下值:
// -------更改此-------//
浮子water_hold_capacity = 1.0;//输入米。
Float full_height = 1.3;//输入米。
// ---------- -------------- //
这就是发射机。
接收方:
接收器可以显示5级。当加注水箱时,水箱达到绝对最大持水量时报警。100 - 75% -所有4个LED会发光,75 - 50% 3个LED会发光,50 - 25% 2个LED会发光,25%和更少的一个LED会发光。
接收器可以由9V电池供电或从智能手机充电器转USBmini-B电缆。
接收方代码:
// ----------- 程序由R.GIRISH / Homemade-circuits。com ----------- //
# include < RF24.h >
# include < SPI.h >
RF24电台(9、10);
Int I = 0;
Const字节地址[6]= "00001";
Const int buzzer = 6;
const int LED_full = 5;
const int LED_three_fourth = 4;
const int LED_half = 3;
const int LED_quarter = 2;
Char text[32] = "";
无效的设置()
{
pinMode(蜂鸣器、输出);
pinMode (LED_full、输出);
pinMode (LED_three_fourth、输出);
pinMode (LED_half、输出);
pinMode (LED_quarter、输出);
digitalWrite(蜂鸣器、高);
延迟(300);
digitalWrite(蜂鸣器、低);
digitalWrite (LED_full、高);
延迟(300);
digitalWrite (LED_three_fourth、高);
延迟(300);
digitalWrite (LED_half、高);
延迟(300);
digitalWrite (LED_quarter、高);
延迟(300);
digitalWrite (LED_full、低);
延迟(300);
digitalWrite (LED_three_fourth、低);
延迟(300);
digitalWrite (LED_half、低);
延迟(300);
digitalWrite (LED_quarter、低);
Serial.begin (9600);
radio.begin ();
收音机。openReadingPipe(0,地址);
radio.setChannel (100);
radio.setDataRate (RF24_250KBPS);
radio.setPALevel (RF24_PA_MAX);
radio.startListening ();
}
无效循环()
{
如果(radio.available ())
{
收音机。读(之外,sizeof(文本));
以(文本);
如果(文本[0]= = S & &文本[1]= = ' T ' & &文本[2]= = ' O ' & &文本[3]= =“P”)
{
digitalWrite (LED_full、高);
digitalWrite (LED_three_fourth、高);
digitalWrite (LED_half、高);
digitalWrite (LED_quarter、高);
For (i = 0;我< 50;我+ +)
{
digitalWrite(蜂鸣器、高);
延迟(50);
digitalWrite(蜂鸣器、低);
延迟(50);
}
}
如果(文本[0]= = F & &文本[1]= =“U”[2]= = & &文本“L”& &文本[3]= = ' L ')
{
digitalWrite (LED_full、高);
digitalWrite (LED_three_fourth、高);
digitalWrite (LED_half、高);
digitalWrite (LED_quarter、高);
}
如果(文本[0]= = ' 3 '[1 & &文本 ] == '/' && 文本[2]= = ' 4 ')
{
digitalWrite (LED_full、低);
digitalWrite (LED_three_fourth、高);
digitalWrite (LED_half、高);
digitalWrite (LED_quarter、高);
}
如果(文本[0]= = ' H ' & &文本[1]= = A & &文本[2]= =“L”& &文本[3]= = ' F ')
{
digitalWrite (LED_full、低);
digitalWrite (LED_three_fourth、低);
digitalWrite (LED_half、高);
digitalWrite (LED_quarter、高);
}
如果(文本[0]= =“L”& &文本[1]= = ' O ' & &文本[2]= = ' W ')
{
digitalWrite (LED_full、低);
digitalWrite (LED_three_fourth、低);
digitalWrite (LED_half、低);
digitalWrite (LED_quarter、高);
}
}
}
// ----------- 程序由R.GIRISH / Homemade-circuits。com ----------- //
收信人就这样结束了。
注意:如果没有发光的led,这意味着接收器不能从发射机得到信号。打开接收器电路后,应等待5秒钟才能收到发射器发出的信号。
作者原型:
发送器:
接收方:
如果您对这个太阳能超声波无线水位控制电路有任何疑问,请在评论中畅所欲言,您可以期待得到快速的回复。
超声波无线水位指示器和使用arduino螺线管的控制器。我有2个超过头部的水箱,请给我电路图和代码邮件idyousufh2@gmail.com
先生,这个项目的总成本大概是多少
可能低于1000卢比/-,你可以在网上商店搜索确认。
发送者和接收者之间的最大距离是多少?
不确定确切的距离,但由于它使用ISM波段上的无线电频率,距离可以显著地长:
https://en.wikipedia.org/wiki/ISM_band
感谢为用户提供友好的电路。我们没有电子方面的知识,是否可以购买你们生产的电路或PCB
我非常感谢你的兴趣,但是不再生产pcb或电路模块,所以在这方面没有帮助。
嗨,我需要2v输入太阳能板充电器,有什么建议吗
你可以试试这个:
//www.addme-blog.com/solar-wind-2-input-hybrid-battery/
Girish先生你好。
我叫尤努斯,来自澳大利亚。
我想请您为我们的项目设计和制作一个原型。
它是一个便携式油位检测手持单元,能够远程测量水平,从一个小开口说2英寸的钢管,直到深度说80-100米,测量精度0.1%最大。
最好使用超声波,但如果有一个强大的和便宜的版本,不是必要的。
如果您能抽出点时间的话,我们可以详细讨论。
感谢和问候
哈里斯。
先生,我喜欢这个项目,但有一件事我想知道的是,电机是否可以连接到自动加注头顶的油箱。
等待您的回复。
问候,
Mallik
嗨,Anand,是的,这是可能的,通过配置一个设置复位继电器电路与上绿色LED,下红色LED。
先生美好的一天。你能帮我设计一个不用arduino,用超声波传感器来测量水槽中液体体积的电路吗?必须是直流供电,先生,谢谢
嗨,Mark,对不起,目前我们没有上述概念的非arduino版本……
嗨Swagatam,
这是拉玛那,来自泰米尔纳德邦的胡瑟。我对你们的超声波水位控制器印象非常深刻。但我的怀疑是是否2no。(发射器和接收器各一个,或者一个就足够了)。此外,如果你能澄清这个项目的总零件清单,这将是非常有帮助的。请分享你的回应。
提前感谢,请继续创新新的项目。
问候,
拉玛
谢谢拉玛纳,我很高兴你喜欢这个概念。
是的,你需要两个独立的Arduino板,如发射机/接收机设置所示。各部分将完全如两张图所示。
嗨Swagatam,
我是Anupam Dasgupta,来自阿萨姆邦Dhubri。这个项目非常好,在我的脑海中,我实际上是在为我的头顶水箱寻找这样一个项目。虽然代码中一切都很好,但有一件事我还是搞不懂。从发射器部分发送的消息是:
text_0[] =“停止”;
text_1[] = "完整";
text_2[] = " 3/4”;
text_3[] =“一半”;
text_4[] =“低”;
但是,在接收者部分,显示将要接收的消息;
如果(文本[0]= = S & &文本[1]= = ' T ' & &文本[2]= = ' O ' & &文本[3]= =“P”)、
请你解释一下好吗?
与问候。
你好Anupam,很抱歉我不能提供任何建议,因为我的Arduino编码知识目前还不是很好。
先生,如果它只是用电池作为电源,而不是太阳能,那它的设计是什么?因为我想设计一种便携式设备,可以用超声波传感器测量罐内液体的体积。希望你能帮助我,谢谢!
注意,如图2所示,你可以使用9V电池代替太阳能电池板....
先生,9V电池连接发射机和接收器吗?如果我不使用led,设计应该是什么?就像超声波传感器表示体积传感器一样。希望得到您的回复,谢谢!
是的,因为这些设备是远程操作的,所以电源需要分开。
接收端的文本[0]是字符串文本[]中的第一个字符。
接收方必须解析传入的(接收到的)字符串,以确定5个可能的字符串中哪一个已经接收到。传入字符串在循环的顶部读取,然后由连续的if()语句计算以找到匹配。
if()测试的序列应该是if(){…}else if{…}else if{…},因为没有消息可以匹配多个情况。此外,只需要计算消息的第一个字符,因为每条消息都是唯一的。类似这样:if (text[0] == ' S '){…}else if…
本项目能否在接收端增加一个LCD显示屏,显示日期、时间、电机状态和水位(百分比如5%、10% .......)100%)。
抱歉,我的arduino编码不好,无法帮助您,但以下链接中有一些信息,您可以参考并自行尝试操作:
//www.addme-blog.com/introduction-i2c-lcd-adapter-module/
188app彩票
我按照电路设计上传了代码。然而,当我打开串行监视器时,我只得到问号:?????????
在监视器中,我设置波特率为9600,这与代码中相同。我哪里做错了?
我检查了我的Arduino ID中的代码,它正在完美地编译:
完成编译!
Sketch使用5998字节(18%)的程序存储空间。最大长度为32256字节。
全局变量使用369字节(18%)的动态内存,为局部变量留下1679字节。最大值为2048字节。
解决:我建立电路没有蜂鸣器和led。现在,我在串行监视器中得到正常的输出。
很高兴解决了!
LED灯应该一直亮着,还是只有在加油的时候才亮着?
当我使用串行监视器作为接收器时,我又得到了问号。
你可以让它一直开着,这样你就可以不断地得到关于液体液位的信息。我不是Arduino专家,所以我不能解决这个问题!
这也适用于小于1米的管道吗?
我正在用Dopper瓶测试,大小设置如下:
浮子water_hold_capacity = 0.14;//最高可达14厘米的水
浮动full_height = 0.19;// Dopper瓶的最大尺寸
发射机在串行监视器中记录正确的测量值。
我的问题是,LED / LED从来没有打开(除了在启动Arduino)。
蜂鸣器正在工作,因为我在void setup()中添加了一个测试代码来检查它5秒。
我该如何更改这个瓶子的接收器代码?
对不起,关于代码修改我不知道。
超声波传感器HC-SR04将持续暴露在罐内非常潮湿的空气中。传感器能否在这种潮湿的环境中存活几个月以上?
我们可以在一个发射器上增加两个或更多接收器吗
是的,这是可能的
我可以在哪里购买
这些产品在市场上有吗?请分享联系方式。谢谢提前
是的,可通过亚马逊,易趣等
这个电路能在油箱满的时候用来控制电机吗?
如果是,那么如何连接。如果不是,那么请建议我一个相同的电路。
问候,
答:马利克
是的,这是可能的!将“FULL”绿色LED负极引脚从地面上断开,并连接到继电器驱动级的底座上:
//www.addme-blog.com/wp-content/uploads/2012/01/Relaydriver.png
别工作,这只是草图。帮助我! !
本设计经过了作者的测试,代码也得到了正确的编译。
先生,我用旧的bootloader上传了发射机代码,用的是新的接收器代码。模块不工作,LED也不闪烁。你能帮我解决这个问题吗?
Rajeev,很抱歉这个项目我不能帮你,因为这是外部作者写的,而且我对Arduino的了解不是很好。作者在提交之前已经测试了设计,所以它应该是一个工作设计。你可以尝试Arduinio IDE软件上传代码,bootloader软件我不确定。
先生,
我如何使用继电器控制电机?你能提供给我做这件事的电路吗?
你好,Rajeev,你可以这样做: