У вас есть несколько вариантов:
Примечание. Указанные ссылки являются только первыми. Большинство из них дорогие по сравнению с другими сайтами. eBay купить его сейчас может быть довольно дешево для большинства из этих предметов. Проверьте и другие места, в том числе Sparkfun .
- Ультразвуковой датчик пинга . Это не идеально, но они просты в использовании. Просто добавьте один с приложением. Это не идеально, потому что он не будет достаточно точным, чтобы точно сказать, когда он пуст. Это может быть немного более / менее чувствительным. Вес будет тяжелее, если он вообще сдвинется.
- Цветной сенсор (желательно, но стоит дороже) . Вы упомянули об этом, и это, вероятно, лучшая идея. Это даст вам аналоговые значения (для чтения с Arduino) для красного, зеленого и синего. [Предполагая, что чем выше содержание этого цвета, тем выше напряжение], белый цвет должен быть в значительной степени равен 100%, а коричневый - я бы предположил, что большинство из них будет составлять около 30-40%. (Более подробно, если вы этого не понимаете, пропустите эту часть)
Я собираюсь более подробно остановиться на датчике цвета:
Цвета здесь читаются с тремя значениями: красный, зеленый и синий. На плате три датчика. Один отфильтровывает все, кроме красного, другой синий и другой зеленый. Датчики на плате определяют количество поступающего света и затем преобразуют его в напряжение: между 5 В («100% красный / зеленый / синий») или 0 В («0% красный / зеленый / синий»). Это может быть преобразовано в число с помощью Arduino (0-1024 на аналоговом выводе).
Проблема с освещением:
этот датчик, насколько я могу судить, имеет светодиод, который всегда включен. Вы захотите либо расплавить это, либо накрыть, если вы не хотите держатель для туалетной бумаги с подсветкой. Теперь подождите ... ваш датчик будет думать, что в темноте он коричневый. Нет проблем ... вот о чем вы можете подумать.
Используйте палитру цветов, как я использую, и выберите коричневый . Слева от этого вы можете управлять «имитацией яркости». Кроме того, это шестнадцатеричная форма 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 и т. д.). Если это правда, вы можете установить, что он коричневый. Затем светодиод включается на пять секунд.
Вы можете изменить светодиод, чтобы он был зуммер, если хотите. Возможно, вам придется скорректировать оператор if, убедившись, что синий цвет меньше 256/1024 (1024 = разрешение аналогового вывода), если он не работает при большом освещении или работает в темном свете. Поскольку код позже проверяет, что красный цвет примерно в 2 раза больше зеленого, любой оттенок белого не должен проходить это выражение if. Возможно, вам также придется настроить minRed
и, maxRed
чтобы быть дальше (если не обнаруживает коричневый) или ближе (если обнаруживает коричневый, когда он белый). Я не могу проверить этот код без датчика цвета.
Примечание: это может быть немного беспокойным. Я бы порекомендовал светодиод вместо этого, чтобы весь дом не проснулся среди ночи только из-за низкого уровня туалетной бумаги. Кроме того, если вы вообще загораживаете датчик ... Если бы его не было в ванной, я бы порекомендовал камеру, чтобы она делала снимок каждый раз, когда он становится очень низким, с герконом, как в ответе @ jfpolipret ... но ... (не каламбур) :)