Jede Pflanze braucht Wasser. Im Haus regnet es bekanntlich nicht. Wenn man keinen grünen Daumen hat, kommt es schon vor, dass sie kein Wasser bekommen. Es gibt zwei Arten von Sensoren die günstig zum messen der Bodenfeuchte sind. Der erste ist ein resistiver. Hier wird der Widerstand des Bodens gemessen. Dabei kommt Metall direkt mit Wasser in Kontakt. Die andere Variante habe ich hier im Einsatz…
Der Sensor
Als Sensor verwende ich einen kapazitiven. In dieser Variante kommt kein Metall mit Wasser in kontakt. Dadurch entsteht keine elektrolyse und der Sensor sollte einige tage halten.
Dieser ist mit Isolierband abgeklebt, weil dort starke Kratzer sind und das Metall sichtbar war.
Am VCC Pin kann 3.3V oder 5V benutzt werden.
Der Signal Pin liefert immer max 3V. Somit auch wunderbar mit 3.3V Logik zu nutzen.
Im Betrieb habe ich 4.2mA gemessen. Für dauerhaften Batteriebetrieb leider nicht so gut geeignet. Deshalb schalte ich den Sensor nur für die Messung ein. Hier muss man aber bis zu 150ms warten, bis der Sensor einsatzbereit ist.
Den Messbereich habe ich mit einem Glas Wasser ermittelt. Hier habe ich den Wert für komplett im Wasser und trocken aufgezeichnet.
Bauteile
- Arduino Pro Mini 3.3V
- EasyPCB (v10)
- NRF24L01
- Capacitive Moisture Sensor
Programm
Das Programm ist für MySensors gebaut. Die Messungen erfolgt analog.
- Sensor per Power Pin einschalten
- Analog Referenz umschalten
- 150ms warten
- Analog Pin des Sensors Messen
- Wert auf 0..100% skalieren
- Wert bei Änderung verschicken
#define PIN_PWR_PLANT 5
#define PIN_SENSE_PLANT A1
#define CHILD_ID_PLANT 1
MyMessage msg_pflanze(CHILD_ID_PLANT, V_LEVEL);
void presentation_pflanze()
{
present(CHILD_ID_PLANT, S_MOISTURE);
}
void setup_pflanze()
{
pinMode(PIN_PWR_PLANT, OUTPUT);
digitalWrite(PIN_PWR_PLANT, LOW);
}
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
float last_plant = -1.0;
void loop_pflanze()
{
// Sensor einschalten
analogReference(DEFAULT);
digitalWrite(PIN_PWR_PLANT, HIGH);
analogRead(PIN_SENSE_PLANT); // erste Messung zur Umschaltung auf DEFAULT source
wait(150);
uint16_t raw = analogRead(PIN_SENSE_PLANT);
raw += analogRead(PIN_SENSE_PLANT);
raw += analogRead(PIN_SENSE_PLANT);
raw += analogRead(PIN_SENSE_PLANT);
raw += analogRead(PIN_SENSE_PLANT);
raw /= 5;
//float plant = (float)raw / 10.23*1.0; //korrektur 3.3v messung
float plant = mapfloat((float)raw, 834.0, 474.0, 0.0, 100.0);
plant = constrain(plant, 0.0, 100.0);
#ifndef SENSOR_POWER_ALLTIME
digitalWrite(PIN_PWR_PLANT, LOW);
#endif // SERIAL_DEBUG
#ifdef SERIAL_DEBUG
Serial.print(F("Plant Raw: "));
Serial.print(raw);
Serial.print(F(" - Level: "));
Serial.println(plant);
#endif
if (abs(last_plant - plant) > 0.25)
{
if (send(msg_pflanze.set(plant, 1)))
last_plant = plant;
}
}
Pumpe
Nur messen und benachrichtigen füttert immer noch nicht die Pflanze. In diesem Fall habe ich noch eine Pumpe dazu gebaut. Diese Relais hat zwei separate Stromversorgungen. So kann das Relais und die Pumpe mit der Blockbatterie gespeist werden. Die Blockbatterie hat nur noch 7,5V. Das Relais hat das verkraftet und es war genug für die 12V Pumpe um etwas Wasser zu pumpen.
Relais für die Pumpe