Je hebt een paar opties:
Opmerking: de gegeven links zijn slechts de eerste die verschijnen. De meeste zijn prijzig in vergelijking met andere sites. eBay buy it now kan voor de meeste van deze items redelijk goedkoop zijn. Controleer ook andere plaatsen, waaronder Sparkfun.
- Ultrasone pingsensor. Dit is op geen enkele manier ideaal, maar ze zijn gemakkelijk te gebruiken. Voeg er gewoon een toe met een behuizing. Het is niet ideaal omdat het niet nauwkeurig genoeg zal zijn om te vertellen wanneer het precies leeg is. Het kan een beetje over / onder gevoelig zijn. Gewicht zou echter moeilijker zijn als het überhaupt verschuift.
- Kleurensensor (bij voorkeur, maar kost meer). U noemde dit en dit is waarschijnlijk het beste idee. Het geeft je analoge waarden (om te lezen met Arduino) voor rood, groen en blauw. [Ervan uitgaande dat hoe hoger de inhoud van die kleur, hoe hoger de spanning,] wit zou vrijwel alle 100% en bruin moeten zijn, zou ik me voorstellen dat de meeste ongeveer 30-40% zouden zijn. (Later meer, als u dit niet begrijpt, slaat u dit deel over)
Ik ga dieper in op de kleurensensor:
Kleuren worden hier gelezen met drie waarden: rood, groen en blauw. Er zijn drie sensoren op het bord. De een filtert alles behalve rood, een ander blauw en de ander groen. De sensoren op het bord detecteren de hoeveelheid binnenkomend licht en zetten dat vervolgens om naar een spanning: tussen 5V ("100% rood / groen / blauw") of 0V ("0% rood / groen / blauw"). Dit kan dan door de Arduino in een nummer worden omgezet (0-1024 op een analoge pin).
Een probleem met verlichting: Deze sensor heeft, voor zover ik kan zien, een LED die altijd aan is. U wilt dat desolderen of bedekken, tenzij u een verlichte toiletpapierhouder wilt. Wacht nu ... je sensor zal denken dat als het donker is, hij bruin is. Geen probleem ... hier is iets om over na te denken.
Gebruik een kleurenkiezer zoals ik die gebruik en selecteer een bruine. Aan de linkerkant van deze kunt u de "gesimuleerde helderheid" regelen. Behalve dat is de hexadecimale vorm van RGB. U wilt dat met deze rekenmachine converteren naar standaard -waarden.
In bruin is de kleur blauw bijna onbestaande. We moeten die kleur negeren, tenzij je een manier wilt om dubbel te controleren of hij bruin is. Ik zou zeggen dat het altijd onder de 40% moet zijn voor vrijwel elke bruine tint.
Van wat ik kan zien aan de hand van een voorbeeldtint bruin, is rood vrijwel 2x zo groen. Die verhouding kan variëren, maar u moet controleren of deze enigszins bestaat. Voor wit / grijs / zwart zijn alle kleuren proportioneel 1: 1: 1. U kunt dit gebruiken om te detecteren of het donker of bruin is.
int rPin = A0; // Rode pinint gPin = A1; // Groene Pinint bPin = A2; // Blauwe Pinint ledPin = 13; // Ik heb deze code gemaakt met een LED, niet met een speakerboolean testTwice = false; void setup () {pinMode (ledPin, OUTPUT); } void loop () {int rValue = analogRead (rPin); int gValue = analogRead (gPin); int bValue = analogRead (bPin); if (bPin < 256) {// Als dit niet waar is, staat er iets in de weg of is het wit. Ik ga verifiëren dat er iets niet in de weg zit ... int minRed = rPin * 0.4; // Iets minder dan de helft voor opvulling ... deze waarden moeten mogelijk worden aangepast. Pas deze en de onderstaande verder uit elkaar voor minder gevoelig. int maxRed = rPin * 0,6; // Iets meer dan de helft voor opvulling ... deze waarden moeten mogelijk worden aangepast. if (gPin < maxRed && gPin > minRed) {// Verifys dat rood tussen minRed en maxRed digitalWrite (ledPin, HIGH); vertraging (5000); digitalWrite (ledPin, LOW); }} vertraging (5000); // U hoeft geen stroom te verspillen ... misschien wilt u een actieve slaapfunctie toevoegen als de batterij werkt}
Ten eerste verifieert het dat het blauw minder is dan 25%. Vervolgens verifieert het dat rood en groen gelijk zijn ... geef of neem 20%. (d.w.z. rood = 100 groen = 80, rood = 110 groen = 90, etc.). Als dat waar is, kun je vrijwel vaststellen dat het bruin is. Vervolgens gaat een LED vijf seconden aan.
U kunt de LED wijzigen om een zoemer te laten zijn als u dat wilt. Mogelijk moet u de if-instructie aanpassen door te controleren of het blauw minder is dan 256/1024 (1024 = resolutie van analoge pin) als het niet werkt bij veel licht of bij donker licht. Aangezien de code later verifieert dat het rood ongeveer 2x zo groen is, mag elke witte tint die if-instructie niet doorgeven. Mogelijk moet u ook de minRed
en maxRed
aanpassen om verder (als bruin niet wordt gedetecteerd) of dichterbij te zijn (als bruin wordt gedetecteerd als het wit is). Ik kan deze code niet echt testen zonder kleursensor.
Opmerking: deze kunnen een beetje onrustig zijn. Ik zou in plaats daarvan een LED aanraden zodat het hele huis niet midden in de nacht wakker wordt, alleen vanwege het lage toiletpapier. En als je de sensor überhaupt blokkeert ... Als het niet in de badkamer was, zou ik een camera aanbevelen en elke keer dat het erg laag wordt een foto laten maken met een reed-schakelaar zoals het antwoord van @ jfpolipret ... maar ... (geen bedoelde woordspeling) :)