Masz kilka opcji:
Uwaga: podane linki są tylko pierwszymi, które się pojawią. Większość z nich jest drogie w porównaniu do innych witryn. eBay go kupić teraz może być dość tanie dla większości tych przedmiotów. Sprawdź także inne miejsca, w tym Sparkfun .
- Ultradźwiękowy czujnik ping . Nie jest to w żaden sposób idealne, ale są łatwe w użyciu. Wystarczy dodać jeden z załącznikiem. Nie jest idealny, ponieważ nie będzie wystarczająco dokładny, aby stwierdzić, kiedy dokładnie jest pusty. To może być trochę za bardzo / za wrażliwe. Ciężar byłby trudniejszy, gdyby w ogóle się zmienił.
- Czujnik koloru (preferowany, ale kosztuje więcej) . Wspomniałeś o tym i jest to prawdopodobnie najlepszy pomysł. Otrzymasz wartości analogowe (do odczytu z Arduino) dla czerwieni, zieleni i niebieskiego. [Zakładając, że im wyższa zawartość tego koloru, tym wyższe napięcie,] biel powinna być prawie w całości na 100%, a brązowa, wyobrażam sobie, że większość z nich wynosiłaby około 30-40%. (Więcej później, jeśli tego nie rozumiesz, pomiń tę część)
Przejdę bardziej szczegółowo do czujnika koloru:
Kolory są tutaj odczytywane z trzema wartościami: czerwoną, zieloną i niebieską. Na płycie znajdują się trzy czujniki. Jeden odfiltrowuje wszystko oprócz czerwonego, drugi niebieski, a drugi zielony. Czujniki na płycie wykrywają ilość przychodzącego światła, a następnie przekształcają je w napięcie: między 5 V („100% czerwony / zielony / niebieski”) lub 0 V („0% czerwony / zielony / niebieski”). Następnie Arduino może je przekonwertować na liczbę (0-1024 na pinie analogowym).
Problem z oświetleniem: z
tego, co mogę powiedzieć, ten czujnik ma diodę LED, która jest zawsze włączona. Będziesz chciał to wylutować lub przykryć, chyba że potrzebujesz podświetlanego uchwytu na papier toaletowy. Teraz poczekaj ... Twój czujnik pomyśli, że gdy jest ciemno, jest brązowy. Nie ma problemu ... oto coś, o czym możesz pomyśleć.
Użyj próbnika kolorów, tak jak ja, i wybierz kolor brązowy . Po lewej stronie możesz kontrolować „symulowaną jasność”. Poza tym jest to szesnastkowa forma RGB. Będziesz chciał przekonwertować to na standardowe wartości za pomocą tego kalkulatora .
W kolorze brązowym kolor niebieski prawie nie istnieje. Powinniśmy zignorować ten kolor, chyba że chcesz podwójnie sprawdzić, czy jest brązowy. Powiedziałbym, że zawsze powinno być poniżej 40% dla prawie każdego odcienia brązu.
Z tego, co mogę powiedzieć na przykładowym odcieniu brązu, czerwień jest prawie dwa razy większa niż zieleń. Że stosunek ten może się różnić, ale należy upewnić się, że jest to nieco istnieje. W przypadku bieli / szarości / czerni wszystkie kolory są proporcjonalne 1: 1: 1. Możesz użyć tego do wykrycia, czy jest ciemno, czy jest brązowo.
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
}
Najpierw sprawdza, czy niebieski ma mniej niż 25%. Następnie sprawdza, czy czerwony i zielony są równe ... daj lub weź 20%. (tj. czerwony = 100 zielony = 80, czerwony = 110 zielony = 90 itp.). Jeśli to prawda, możesz prawie stwierdzić, że jest brązowy. Następnie dioda LED włącza się na pięć sekund.
Jeśli chcesz, możesz zmodyfikować diodę LED tak, aby była brzęczykiem. Być może będziesz musiał dostosować instrukcję if, sprawdzając, czy niebieski jest mniejszy niż 256/1024 (1024 = rozdzielczość analogowego pinu), jeśli nie działa w dużym świetle lub działa w ciemnym świetle. Ponieważ kod później weryfikuje, że czerwony jest około 2x zielony, żaden odcień bieli nie powinien przejść tego wyrażenia if. Konieczne może być również dostosowanie minRed
i maxRed
bycie dalej (jeśli nie wykrywa brązu) lub bliżej (jeśli wykrywa brąz, gdy jest biały). Naprawdę nie mogę przetestować tego kodu bez czujnika koloru.
Uwaga: mogą być trochę niespokojne. Poleciłbym zamiast tego diodę LED, aby cały dom nie obudził się w środku nocy tylko z powodu niskiego papieru toaletowego. Ponadto, jeśli w ogóle przeszkadzasz czujnikowi ... Gdyby nie było go w łazience, poleciłbym kamerę i niech zrobi zdjęcie za każdym razem, gdy robi się bardzo nisko, za pomocą przełącznika kontaktronowego, takiego jak odpowiedź @ jfpolipret ... ale ... (bez zamierzonej gry słów) :)