Tienes pocas opciones:
Nota: Los enlaces proporcionados son solo los primeros que aparecen. La mayoría de ellos son caros en comparación con otros sitios. eBay comprarlo ahora puede ser bastante barato para la mayoría de estos artículos. Compruebe también otros lugares, incluido Sparkfun .
- Sensor ultrasónico de ping . Esto no es ideal de ninguna manera, pero son fáciles de usar. Simplemente agregue uno con un gabinete. No es ideal porque no será lo suficientemente preciso como para saber cuándo está vacío. Puede ser un poco más / menos sensible. Sin embargo, el peso sería más difícil si cambiara.
- Sensor de color (preferible, pero cuesta más) . Mencionaste esto y esta es probablemente la mejor idea. Le dará valores analógicos (para leer con Arduino) para rojo, verde y azul. [Suponiendo que cuanto mayor sea el contenido de ese color, mayor será el voltaje,] el blanco debería ser prácticamente todo al 100% y el marrón, me imagino que la mayoría de ellos sería del 30-40%. (Más tarde, si no comprende esto, omita esta parte)
Voy a entrar en más detalles sobre el sensor de color:
Los colores se leen con tres valores aquí: rojo, verde y azul. Hay tres sensores en el tablero. Uno filtra todo excepto el rojo, otro azul y el otro verde. Los sensores en el tablero detectan la cantidad de luz entrante y luego la convierten a un voltaje: entre 5V ("100% rojo / verde / azul") o 0V ("0% rojo / verde / azul"). Esto puede ser convertido en un número por el Arduino (0-1024 en un pin analógico).
Un problema con la iluminación:
este sensor, por lo que puedo decir, tiene un LED que siempre está encendido. Querrá desoldar eso o cubrirlo, a menos que desee un soporte de papel higiénico iluminado. Ahora espera ... tu sensor pensará que cuando está oscuro, es marrón. No hay problema ... aquí hay algo en lo que debes pensar.
Use un selector de color como el que estoy usando y seleccione un marrón . A la izquierda de este, puede controlar el "brillo simulado". Además de eso está la forma hexadecimal de RGB. Querrás convertir eso a valores estándar con esta calculadora .
En marrón, el color azul es casi inexistente. Deberíamos ignorar ese color, a menos que desee una forma de verificar que sea marrón. Yo diría que siempre debe ser inferior al 40% para casi cualquier tono de marrón.
Por lo que puedo decir con una muestra de tono marrón, el rojo es casi 2 veces el verde. Esa proporción puede variar, pero debe verificar que sea algo existente. Para blanco / gris / negro, todos los colores son proporcionales 1: 1: 1. Puede usar esto para detectar si está oscuro o marrón.
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
}
Primero, verifica que el azul sea inferior al 25%. Luego, verifica que el rojo y el verde son iguales ... más o menos el 20%. (es decir, rojo = 100 verde = 80, rojo = 110 verde = 90, etc.). Si eso es cierto, puedes establecer que es marrón. Luego, un LED se enciende durante cinco segundos.
Puede modificar el LED para que sea un timbre si lo desea. Es posible que tenga que ajustar la declaración if para verificar que el azul sea inferior a 256/1024 (1024 = resolución del pin analógico) si no funciona con mucha luz o funciona con luz oscura. Como el código luego verifica que el rojo es aproximadamente 2 veces el verde, cualquier tono de blanco no debería pasar esa declaración if. También es posible que tenga que ajustar minRed
y maxRed
para estar más lejos (si no detecta marrón) o más cerca (si detecta marrón cuando está blanco). Realmente no puedo probar este código sin sensor de color.
Nota: estos pueden ser un poco inquietos. En su lugar, recomendaría un LED para que toda la casa no se despierte en medio de la noche solo por el bajo nivel de papel higiénico. Además, si obstruye el sensor ... Si no estuviera en el baño, recomendaría una cámara y haga que tome una foto cada vez que esté muy baja con un interruptor de láminas como la respuesta de @ jfpolipret ... pero ... (sin juego de palabras) :)