Technisches Protokoll vom 5. November 2022
Erdfeuchtigkeitssensor-Workshop

Fertigstellungsstand ESP8266
- µPython-Firmware war schon vor Kursbeginn eingespielt
- Die Python-Sensor-Ausleseskripte können auf das Gerät eingespielt werden
- Aktuelle Skriptsammlung: Das Gerät liefert im Sekundenintervall den Messwert eines Analogeinangs über die via USB weitervermittelte serielle Schnittstelle aus
Fertigstellungsstand Arduino
- Eigene Firmwares können (kompiliert und) eingespielt werden
- Aktuelle Firmware: Das Gerät liefert im Sekundenintervall die Messwerte der sechs Analogeingänge über die via USB weitervermittelte serielle Schnittstelle aus.
- Über einem Schwellwert von 475 (500 genauso geeignet) wird pro Sensor (=Analogeingang) eine LED (weiß, weil es bei rot/grün keinen Konsens bzgl. Semiotik gab) über einen 1kOhm-Widerstand zum Leuchten gebracht. (Jedoch auf dem Steckbrett bislang nur zwei LEDs beschaltet)
- Die LEDs leuchten aber nur, wenn ein Taster gedrückt wird. Wenn man gleichzeitig den Sensor mit der Hand (=feucht) umschließt, erlischt das Licht, da der Schwellwert unterschritten wird.
Allgemein aufgetretene Probleme
- Nur eines der Notebooks hatte einen HDMI-Ausgang (alle anderen: DisplayPort), weswegen sich Projektor/Fernseher nur bedingt für ein gemeinsames Arbeiten ansteuern ließen
- Einer der Sensoren war am Ende (vllt. schon vorher?) defekt und hat immer nur den "Schlechtwert" (hoher Wert = trockene Erde) geliefert.
Aufgetretene Probleme beim ESP
- Installation des Visual-Studio-Code-Plugins war etwas hakelig, u. a., weil die Python-Abhängigkeiten nicht installiert werden konnten. (Verwechslung zwischen Python2 und Python3; Installation ins User-Verzeichnis, jedoch dieses nicht in PATH und daher nicht auf Standardkonsole bequem aufrufbar.
- Vorerst(?) nur ein Analog-Input pro Gerät ausgewertet.
- Die kleine Version (Nicht-Entwicklerboard ESP32) hat keine USB-Schnittstelle, erwartet 3,3 V Spannungseingang und hat eine spezielle serielle Programmierschnittstelle -> vorerst nicht verwendet, insbesondere wg. des letzten Aspekts.
Aufgetretene Probleme beim Arduino
- Installation der Arduino-IDE auf einem Ubuntu?-Livesystem-Rechner hat planmäßig liblistserialsj installiert, dieses jedoch nicht die Abhängigkeit libserialport. Dadurch kam eine kryptische Fehlermeldung, welche durch Analyse mit ldd und objdump erschlossen werden konnte. (Alle anderen Rechner (ebenfalls Linux-Distributionen) hatten keine Probleme mit der Installation der Arduino-IDE)
- Der "schlecht"-Wert (hoher Wert am Analogeingang = trockene Erde) ist gleichzeitig der Default-Wert des offenen Analogeingangs, dadurch muss für die Sammelmeldeeigenschaft die Anzahl der angeschlossenen Sensoren vorher bekannt sein
		Mögl. Lösung: Pulldown-Widerstand für jeden Analogeingang?
- Analogeingang am Arduino instabil, teils durch Anhauchen mit Atem der Buchsenreihe (!) Schwankung zwischen 600 und 300 (zum Vergleich: Regulärer Betrieb der kapazitiven Erdfeuchtigkeitssensoren liefert 550 für trocken und 350 für nass=ins Wasserglas getunkt)
		Mögl. Lösung: ADC nutzen?
		Anmerkung: Auch bei anderen Geräten, z. B. BeagleBone, ist der Analogeingang instabil; Nutzung ADC ist grundsätzlich nicht nur für Arduino sinnvoll.

Arbeitsbedarf (persönliche Auswahl offener Punkte, insgesamt ggf. noch mehr Arbeitsbedarf)
- WLAN-Zugang im Beet sicherstellen
- Server zur Datenaufnahme vorbereiten, Ausgabe per HTTP?
- Mechanik bauen, Kabel crimpen, Installation vor Ort
- DHT 022 (Temperatur/Luftfeuchtigkeit) auslesen
- Arduino: Datenverbindung innerhalb des Gartens aufbauen, eine von folgenden Varianten:
	a) purer Sammelmelderdraht mit Status 1 oder 0
	b) selbstgebasteltes serielles Protokoll
	c) RS485
	d) CAN-Bus (Module MCP2515 liegen bereits vor, Bibliothek autowp/arduino-mcp2515 nutzen)
	e) Funkverbindung mit Modul HopeRF RFM69(HCW?) 
- ESP: Dateneingabe von Arduino und/oder von mehreren Sensoren
- ESP: Datenverbindung ins Netz aufbauen und Daten zum Server schicken
- [Ggf. kann auch ein Raspberry Pi die Verbindung ins Internet herstellen, jedoch verbraucht er mehr Strom]
Firmware für Arduino, Stand 5. November
void setup() {
	Serial.begin(9600);               // Start der seriellen Kommunikation
	pinMode(4, OUTPUT); // Anzeige für Sensor 1
	pinMode(5, OUTPUT); // f. Sensor 2
	pinMode(6, OUTPUT);
	pinMode(7, OUTPUT);
	pinMode(8, OUTPUT);
	pinMode(9, OUTPUT); // f. Sensor 6
	pinMode(2, INPUT_PULLUP); // f. Taster
}

void loop() {
	// Auslesen der aktuellen Sensorwerte, bis zu 6 Sensoren (Capacitive Soil
	// Moisture Sensor v1.2 (Schwingkreis))
	int sensorwert[6];
	sensorwert[0] = analogRead(A0);
	sensorwert[1] = analogRead(A1);
	sensorwert[2] = analogRead(A2);
	sensorwert[3] = analogRead(A3);
	sensorwert[4] = analogRead(A4);
	sensorwert[5] = analogRead(A5);
	
	bool led_ein = (digitalRead(2) == LOW);
	
	for (int i = 0; i < 6; i++) { // i = 0,1,2,3,4,5
		Serial.print("S");
		Serial.print((char)(0x31+i)); // ASCII: (0x30 = '0'), 0x31 = '1', 0x32 = '2', ...
		Serial.print(": ");
		Serial.print(sensorwert[i]);
		Serial.print(" ");
		if (sensorwert[i] > 475 & led_ein) // falls Boden trocken und Taster gedrückt
			digitalWrite(4+i, HIGH); // für Sensor "i+1" die LED einschalten
		else
			digitalWrite(4+i, LOW); // ansonsten die LED ausschalten
	}
	Serial.println();
	delay(1000);
}