Pflanzensensor - Kapazitiv

Wie baue ich einen Sensor der die Bodenfeuchte misst.
Hermann | 7. April 2019

sensor

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…

sensor

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.

pinout

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.

kaisercad

Bauteile

  • Arduino Pro Mini 3.3V
  • EasyPCB (v10)
  • NRF24L01
  • Capacitive Moisture Sensor

Programm

Das Programm ist für MySensors gebaut. Die Messungen erfolgt analog.

  1. Sensor per Power Pin einschalten
  2. Analog Referenz umschalten
  3. 150ms warten
  4. Analog Pin des Sensors Messen
  5. Wert auf 0..100% skalieren
  6. 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.

Pumpe
Relais für die Pumpe

Planze