任何有孩子的人都知道他们永远不会帮助厕纸。任何人都知道如何跟踪低声或低声并发出警报声吗?我只是不知道使用哪种传感器会有所帮助。
我想到的一些是:按重量,通过反射(纸张的颜色)或某些激光绊线-完全在卷轴上。我不介意构建它,只是我不知道哪个传感器。有人知道该使用哪个吗?
任何有孩子的人都知道他们永远不会帮助厕纸。任何人都知道如何跟踪低声或低声并发出警报声吗?我只是不知道使用哪种传感器会有所帮助。
我想到的一些是:按重量,通过反射(纸张的颜色)或某些激光绊线-完全在卷轴上。我不介意构建它,只是我不知道哪个传感器。有人知道该使用哪个吗?
Answers:
一次提起几卷并悬挂一卷即可使用。将其他两个放在保姆可及范围内的短垂直杆上。保姆可以在需要时再滚一次。
机械感觉杆子底部的架子上没有重量。移除最后一卷时触发警报。没有人会陷入困境。
要感应重量,请使用力敏电阻,例如FSR 400(请参见数据表)。或者,您可以使用轻巧的螺旋弹簧通过一个微动开关将卫生纸放在上面,当两个纸卷都被取出时,微动开关就会松开。另一种选择是红外光束中断检测器,在该电路中,当最后一卷纸被取走时电路就完成了。
我相信jfpoilpret和jmathew提出的簧片传感器概念最容易实现。我已经绘制了一个示意图,说明了它的外观。
您可以通过调节下部触点的高度来调节灵敏度。
这实际上只会使您处于“低”状态,而不必处于困境。除非您想在还剩下几张纸的情况下更换纸卷,否则在我看来这不是一个令人满意的解决方案。我宁愿有一个“ out”指示器,并有一个可听见的蜂鸣器,以提示/羞耻用户更换纸卷。
可以使用独立的电子设备(无需arduino)完成此设计。但是,如果您想游戏化滚动的变化,则可以使用arduino。
还要注意基于颜色的光学传感器,尽管用于此目的的绝大多数纸板管都是棕色的,但我也看到了白色的使用。
使用放射线检测器检测纸卷上剩余的纸张量。在卷轴杆的中间放置一些放射性物质,并将辐射探测器放置在其他位置(如果需要,可以将其安装在卷纸支架固定表面的另一侧;辐射传感器非常灵活) ,然后测量辐射量以确定卷筒上剩余多少纸张。
或者,您可以使用一个电子控制的厕纸分配器(按一下按钮来分配预编程长度的厕纸),并让arduino跟踪已分配的数量。
或者,将旋转编码器连接到线轴杆的侧面(确保其正确安装,而不会在纸卷内部滑动),并计数纸卷的旋转以确定已使用了多少。
当然,使用这些方法中的任何一种,您都必须根据卫生纸的确切类型/品牌/材料/等进行测试并收集数据。
特别是对于第二和第三种想法,我建议定期从系统中获取数据,以跟踪卷筒的典型长度,以便您可以针对任何重大变化来调整程序。即使在一种厕纸中,我也可以想象到卷纸长度会有一些变化。
为了获得更多乐趣,您可以对检测器进行检测以收集时间序列数据,以便稍后将其上载到计算机并制作“随时间推移使用厕纸”的图形或其他内容。
我为Arduino建立了一个反射转速表,可能会解决您的问题。基本电路非常简单:
我周围有一个光敏电阻,对红光反应良好,另外一个来自Radio Shack。这对旧电视遥控器LED的IR输出非常敏感。为了您的目的,绿线将连接到Arduino的Analog Pin 0,您只需要定期采样,而无需设置Interupt驱动的草图。了解白皮书和灰辊之间反射信号差异的诀窍是,光敏晶体管的光敏度会随着w对GND电阻的增加而增加,但暗电压也会上升。通过从距离探测器几英寸远的黑暗和明亮物体上检查AtoD值,我凭经验得出了5和3兆欧的值。相同的步骤应适用于检测灰色与白色。尽管看起来有些完全不同的某些东西在IR中具有相同的反射率。这是完成的红灯转速表的图片:
使传感器板足够小,以适合您的出纸器背面,应该很简单。红外版本甚至更小,但埋在家用离心机中的深度太深,无法获得今天的照片。
我认为可以使用的另一个体面且便宜的选择是接近传感器,例如电话上的传感器或固定场红外传感器。这些传感器非常精确,可以通过将传感器安装到放置卫生纸的支架或墙壁上,轻松地“看”卫生纸的背面。我在帖子中看到的所有其他想法都不太准确,或者对厕纸有干扰,从长远来看,我觉得这可能会造成污染。接近传感器不仅价格便宜,而且易于使用,如果校准良好,它们可以提供非常高的准确性和可靠性。这种型号的自动小便器已经广泛使用。例如,在手机上:当您的手或脸靠近屏幕时,手机将准确地提供2.0英寸或无穷远的距离。
短距离超声波距离传感器可能是一种有效的(而且相当便宜)的选择。您可以将发射器+传感器组合安装在芯片上。不同的传感器可能以不同的方式工作(请始终检查数据表)。但是,公共输出使用脉冲的长度来指示所感测的距离。您可以使用pulseIn()
函数在Arduino中进行处理。
在安装方面,您可能将其安装在厕纸的正后方,并指向卷轴的中心。读数通常很不稳定,因此您需要进行多次测量并取平均值(或使用简单的移动平均值)。通过一些校准,您可以确定代表空阀芯的距离。
当您在相当长的一段时间(例如一分钟或更长时间)内反复检测到该距离时,您会响起警报。
基于反射率的传感器可能是另一种可能性,尽管我想知道您是否会很难找到一种能够在厕纸上正常工作的传感器(取决于您所选择的品牌的柔软程度!)。
我想到的一个主意就是这样:
因此,只要磁体和簧片触点之间的距离在某个极限以下,开关就会闭合电路。绘制纸卷时,该距离将减小。
请注意,除了簧片触点之外,您还可以使用霍尔效应传感器,原理保持不变,只是技术和特性会发生变化。
此处的困难将是找到簧片触点的正确灵敏度(或磁体的力),以便当簧片触点与磁体之间的距离足够小时,簧片触点会闭合,以避免过早触发警报)。
最简单但最好的解决方案是使用由一个IR LED和一个光电晶体管组成的光电耦合器。您使LED朝着卷筒变亮,LED在与“手柄”相连的卷筒内。卸下纸板卷后,光电晶体管会从LED发出红外光,并在Arduino上触发换针中断,然后可以通过多种方式(光,短信,推特,警报…)向您发出警报。
该设计确实便宜,易于构建且快速。尽管您仍然需要做一件事:当没有更多的厕纸时,您实际上需要卸下纸板卷;-)
否则,对于备用卷的相同解决方案甚至是一个更好的主意:-)
这里的许多选项似乎过于复杂和干扰。
实施的另一种方法是稍微便宜一点(但很有趣),但又不打扰且易于安装,它是制造一种便宜的颜色传感器并将其安装在卷筒后面的墙上。当您检测到纸卷的颜色(或没有TP的颜色)时,它的颜色很低。
您也可以花8美元购买一个。
您可以通过利用TP的薄度和仅剩几张纸时看起来有点暗的事实来调整阈值。
如有必要,可以在安装了新卷筒且浴室灯亮起后按按钮进行校准。
您将不得不根据浴室的具体情况进行一些调整。如果增加了一些额外的复杂性,并通过与浴室照明灯开关相连的交流电源插座为它供电,则只有在浴室照明灯打开时才能打开它的电源,这会过滤掉许多不可靠的数据。
这非常容易安装,并且无需修改卷筒本身。您可以使用双面胶带将传感器粘贴到墙上,也可以将其放在卷筒下方朝上(或顶部朝下)的小架子上。
在分配器的一侧,线轴上方安装一个小的IR LED。将红外光电传感器安装在分配器的另一侧。当传感器看到LED指示灯时,滚动声低。也可以用便宜的激光来完成(例如,一侧的现成激光指示器,另一侧的是光电传感器;但不要伤到眼睛!)
这也很容易安装(例如,将热胶粘到点胶机上),并且无需修改卷筒,尽管传感器的位置可能使它们在更换卷筒时容易损坏。
我也非常喜欢这里的干簧传感器和距离传感器(顺便说一句:10美元可为您提供出色的短距离距离传感器)选项。
注意:给出的链接只是第一个出现的链接。与其他网站相比,大多数网站价格昂贵。eBay立即购买对于这些商品中的大多数而言可能是相当便宜的。也检查其他地方,包括Sparkfun。
我将更详细地介绍颜色传感器:
颜色在此处使用三个值读取:红色,绿色和蓝色。板上有三个传感器。一个过滤掉除红色,另一个蓝色和另一个绿色以外的所有内容。板上的传感器检测入射光量,然后将其转换为电压:介于5V(“ 100%红/绿/蓝”)或0V(“ 0%红/绿/蓝”)之间。然后可以将其转换为Arduino的数字(模拟引脚上为0-1024)。
照明问题:据 我所知,该传感器的LED一直亮着。您需要将其拆焊或遮盖,除非您需要发光的厕纸架。现在等等...您的传感器会认为在黑暗中它是棕色。没问题...这是您需要考虑的事情。
使用我正在使用的颜色选择器,然后选择一个棕色。在此图标的左侧,您可以控制“模拟亮度”。除此之外,还有RGB的十六进制形式。您将需要使用此计算器将其转换为标准值。
在棕色中,几乎不存在蓝色。我们应该忽略该颜色,除非您想要一种方法来仔细检查它是否为棕色。我会说,几乎任何褐色阴影都应始终低于40%。
从我可以看到的褐色示例阴影中,红色几乎是绿色的2倍。这个比例可能会有所不同,但你应该确认它是有些存在。对于白色/灰色/黑色,所有颜色均按1:1:1比例。您可以使用它来检测它是否黑暗或棕色。
int rPin = A0; //Red Pin
int gPin = A1; //Green Pin
int bPin = A2; //Blue Pin
int ledPin = 13; //I made this code with a LED, not a speaker
boolean testTwice = false;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
int rValue = analogRead(rPin);
int gValue = analogRead(gPin);
int bValue = analogRead(bPin);
if (bPin < 256) { //If this is false, either something is in the way or it's white. Going to verify that something's not in the way...
int minRed = rPin * 0.4; //A little under a half for padding... this values may need to be adjusted. Adjust this one and the one below farther apart for less sensitive.
int maxRed = rPin * 0.6; //A little over a half for padding... this values may need to be adjusted.
if (gPin < maxRed && gPin > minRed) { //Verifys that red between minRed and maxRed
digitalWrite(ledPin, HIGH);
delay(5000);
digitalWrite(ledPin, LOW);
}
}
delay(5000); // No need to waste power... you might want to add an actutal sleep function if on battery power
}
首先,它验证蓝色是否小于25%。然后,它验证红色和绿色相等...付出或接受20%。(例如,红色= 100绿色= 80,红色= 110绿色= 90,依此类推)。如果是这样,您几乎可以确定它是棕色的。然后,LED点亮五秒钟。
您可以根据需要将LED修改为蜂鸣器。如果蓝色在很多光线下或暗处工作,则可能需要调整if语句,以验证蓝色小于256/1024(1024 =模拟引脚的分辨率)。由于代码稍后会验证红色大约是绿色的2倍,因此任何白色阴影都不应通过if语句。您可能还需要调整minRed
和并maxRed
使其更远(如果未检测到棕色)或接近(如果在白色时检测到棕色)。没有颜色传感器,我真的无法测试此代码。
注意:这些可能有些烦躁。我建议改用LED,这样一来,由于卫生纸不足,整个房子不会在半夜醒来。另外,如果您完全阻碍了传感器...如果它不在浴室,我会推荐一台相机,并在每次拍得很低时用@jfpolipret的答案这样的簧片开关拍照。但是...(无双关语):)
听起来像一个很酷的项目,这是我的2克拉:
对准相机从侧面拍摄纸卷照片,这可能是真正找出剩余纸张的唯一方法。(编辑:您可以将树莓派与csi相机配合使用,并创建与张数相对应的输出信号,并将该信号馈送到arduino吗?!)
为了进行估算,计算滚动的旋转数可能也足够,但是您需要更好地固定滚动,以免滑动。或者,您可以像在自行车上一样使用磁铁,但随后需要将它们直接附着到卷筒上。
(编辑:另一个想法,通过测量盖子的角度来确保卷的厚度)
这样做的另一种方式是,如果您只是想找乐子,那就是将金属棒放在卷筒内,将金属板放在外侧,然后测量电容,该电容应随剩余TP的变化而变化。纸的介电常数。
但这肯定会走“风景路线”。仍然,Arduino可以很容易地测量电容,甚至可能足够灵敏,并且不会妨碍使用,因为它只是卷筒后面的金属板和卷筒中的金属杆。您甚至可以改造现有的支架,而不会引起注意。
一种更简单的方法是将一根棍子连接到电位计的杆上,该杆由卷筒顶部支撑。TP少了,轴降低了,转动了底池。可能需要较长的杆才能获得杠杆作用,因为在不妨碍抽拉厕纸的功能的情况下,您不能用力按压。
正如AJMansfield所建议的,放射性实际上是用于测量工业环境中物体的厚度。如果您真的想发疯,也许您可以使用一种能量极低的放射源,例如一罐怪异的品尝盐替代品,该替代品比本底水平高一点点,并且在很长一段时间内平均水平(厕纸从一小时起就不会有太大变化)到一小时),因此这实际上可能是一种合理且昂贵的处理方式。
红外光束中断传感器也不错,如果将其正确放置,则可以阻挡更多的光线,从而使卷筒更加饱满,而不仅仅是发出信号或打开或关闭信号。
编辑:电容性方法的概念工作证明。只需要一根arduino和2条硬线。精确到八分之一英寸,并带有很多噪音。非常确定您可以可靠地获得至少1英寸的精度。测量时间约为一分钟。它对周围的环境非常敏感。您必须确保脚内的任何金属都停留在原处或使用屏蔽。
float difference;
unsigned long i;
unsigned long j;
unsigned int temp;
volatile unsigned char blah;
void setup()
{
pinMode(5,OUTPUT);
Serial.begin(9600);
}
void loop()
{
difference =0;
Serial.print("Measuring: ");
for(i=0;i<100;i++)
{
for(j=0;j<5000;j++)
{
digitalWrite(5,LOW);
temp=analogRead(A0);
digitalWrite(5,HIGH);
temp = analogRead(A0)-temp;
if(temp<1024)
{
difference += temp;
}
}
//Random delay every 5000 samples helps avoid problems with interference by staggering the samples to cancel aliasing.
delay(random(1,50));
Serial.print("|");
}
Serial.print("\n");
Serial.print("Value: ");
Serial.print(difference/500000);
Serial.print("\nMeasurement Complete. Press Enter to begin another test.\n");
while(!Serial.available())
{
blah = 20;
}
Serial.read();
}