Ich wende mich heute zum 3. Mal als Laie an die Erfahrenen hier im Forum.
Dank eurer Hilfe habe ich mein "Tomatenhaus- Projekt" fertigstellen können.
Es dient "nur" zum Lernen ARDUINO, damit ich nicht einroste. Die Fertigstellung steht im Wettbewerb mit dem Reifegrad der Tomaten und ich glaube, ich bin auf der Zielgerade angekommen. Wäre da nicht:
Ich habe zwei Funktionen definiert: "TuerAuf" und "TuerZu".
In Abhängigkeit von Temperatur (außen), Uhrzeit (nachts/ tagsüber) und/oder Regen wird TuerAuf oder TuerZu aufgerufen.
Ich habe das - aus VB kommend - mit if bzw. While aufgerufen.
Blöd nur, dass die Funktionen immer wieder aufgerufen werden.
In der Ausführung des Programms wird z.B. nach Anfahren der HOME Position (nur 1x ausgeführt) die Tür geöffnet. Das Programm wird wieder neu durchlaufen und die Tür wird wieder geöffnet. Und das Nervt. Beim Schreiben kommt mir gerade die Idee, einen Zähler n einzubauen. Wenn n == 1, dann weiter oder so? Oder könnte per WHILE das Problem ohne Zähler gelöst werden?
Hier der SKETCHTEIL, bei dem das Problem auftritt:
if (rainDigital == 1) {
TuerAuf();
} else {
TuerZu();
}
Beim Sketchteil
if (rainDigital == 1) {
lcd.print("Kein Regen");
} else {
lcd.print("Regen");
}
zeigt das Display auch nicht Regen an, wenn kein Regen fällt!!! Warum gerade hier?
#include <AccelStepper.h>
#include <LiquidCrystal_I2C.h>
// LCD-Objekt erstellen
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 rtc;
const int rainDigitalPin = 13;
const int rainAnalogPin = A0;
const int rainSensorPowerPin = A1;
#define TEMP_PIN 13
OneWire oneWire(TEMP_PIN);
DallasTemperature sensors(&oneWire);
int doorPosition = 0;
float temperature = 0;
bool isRaining = false;
const int stepPin = 5;
const int dirPin = 4;
const int enablePin = 6;
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
#define ST01 7
#define ST02 8
#define RAIN_PIN A0 // Regensensor
#define TEMP_PIN A2 // Temperatursensor
#define FEUCHTE_PIN_1 A3 // Feuchtigkeitssensor 1
#define FEUCHTE_PIN_2 A4 // Feuchtigkeitssensor 2
#define FEUCHTE_PIN_3 A5 // Feuchtigkeitssensor 3
#define FEUCHTE_PIN_4 A6 // Feuchtigkeitssensor 4
#define FEUCHTE_PIN_5 A7 // Feuchtigkeitssensor 5
#define FEUCHTE_PIN_6 A8 // Feuchtigkeitssensor 6
#define PUMP_PIN_1 20 // Pumpe 1
#define PUMP_PIN_2 21 // Pumpe 2
#define PUMP_PIN_3 22 // Pumpe 3
#define PUMP_PIN_4 23 // Pumpe 4
#define PUMP_PIN_5 24 // Pumpe 5
#define PUMP_PIN_6 25 // Pumpe 6
#define FEUCHTE_THRESHOLD_LOW 30 // Schwellwert für niedrige Bodenfeuchte in Prozent
#define FEUCHTE_THRESHOLD_HIGH 80 // Schwellwert für hohe Bodenfeuchte in Prozent
#define START_HOUR 8 // Startstunde des Programms
#define END_HOUR 19 // Endstunde des Programms \
void setup() {
pinMode(ST01, INPUT_PULLUP);
pinMode(ST02, INPUT_PULLUP);
pinMode(enablePin, OUTPUT);
pinMode(rainDigitalPin, INPUT);
pinMode(rainAnalogPin, INPUT);
pinMode(rainSensorPowerPin, OUTPUT);
Serial.begin(9600);
Wire.begin();
rtc.begin();
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
digitalWrite(enablePin, LOW);
stepper.setMaxSpeed(1700);
stepper.setSpeed(1000);
stepper.setAcceleration(700);
stepper.moveTo(-100000);
while (digitalRead(ST01)) {
stepper.run();
}
stepper.setCurrentPosition(0);
digitalWrite(enablePin, HIGH);
digitalWrite(enablePin, LOW);
stepper.moveTo(stepper.currentPosition() + 600); // 600 ist in meinem Fall der ermittelte Abstand (in STEPS) vom Taster, um ihn mechanisch zu entlasten!
stepper.runToPosition();
stepper.setCurrentPosition(0);
digitalWrite(enablePin, HIGH);
pinMode(FEUCHTE_PIN_1, INPUT);
pinMode(FEUCHTE_PIN_2, INPUT);
pinMode(FEUCHTE_PIN_3, INPUT);
pinMode(FEUCHTE_PIN_4, INPUT);
pinMode(FEUCHTE_PIN_5, INPUT);
pinMode(FEUCHTE_PIN_6, INPUT);
pinMode(PUMP_PIN_1, OUTPUT);
pinMode(PUMP_PIN_2, OUTPUT);
pinMode(PUMP_PIN_3, OUTPUT);
pinMode(PUMP_PIN_4, OUTPUT);
pinMode(PUMP_PIN_5, OUTPUT);
pinMode(PUMP_PIN_6, OUTPUT);
if (!rtc.begin()) {
lcd.print("RTC nicht gefunden!");
while (1)
;
}
}
void TuerZu() {
// Zur "Home" Position fahren
digitalWrite(enablePin, LOW);
stepper.setMaxSpeed(1700);
stepper.setSpeed(1000);
stepper.setAcceleration(700);
stepper.moveTo(-180000);
while (digitalRead(ST01)) {
stepper.run();
}
stepper.setCurrentPosition(0);
digitalWrite(enablePin, HIGH);
digitalWrite(enablePin, LOW);
stepper.moveTo(stepper.currentPosition() + 600);
stepper.runToPosition();
stepper.setCurrentPosition(0);
digitalWrite(enablePin, HIGH);
}
void TuerAuf() {
digitalWrite(enablePin, LOW);
stepper.setMaxSpeed(1700);
stepper.setSpeed(1000);
stepper.setAcceleration(700);
stepper.moveTo(180000);
while (digitalRead(ST02)) {
stepper.run();
}
stepper.setCurrentPosition(0);
digitalWrite(enablePin, HIGH);
digitalWrite(enablePin, LOW);
stepper.moveTo(stepper.currentPosition() - 600);
stepper.runToPosition();
stepper.setCurrentPosition(0);
digitalWrite(enablePin, HIGH);
}
void loop() {
DateTime now = rtc.now();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Uhrzeit: ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
lcd.setCursor(0, 1);
lcd.print("Datum: ");
lcd.print(now.day(), DEC);
lcd.print('.');
lcd.print(now.month(), DEC);
lcd.print('.');
lcd.print(now.year(), DEC);
if (now.hour() >= START_HOUR && now.hour() < END_HOUR) {
digitalWrite(rainSensorPowerPin, HIGH);
delay(100);
int rainDigital = digitalRead(rainDigitalPin);
int rainAnalog = analogRead(rainAnalogPin);
lcd.init();
lcd.backlight();
Serial.print("Analog Value: ");
Serial.print(rainAnalog);
Serial.print("\t Digital Value: ");
Serial.println(rainDigital); // 0 = Regen / 1 = kein Regen
if (rainDigital == 1) {
lcd.print("Kein Regen");
} else {
lcd.print("Regen");
}
if (rainDigital == 1) {
TuerAuf();
} else {
TuerZu();
}
/* Dasselbe - auch bei WHILE
if (rainDigital == 1) {
TuerAuf();
}
if (rainDigital == 0) {
TuerZu();
}
*/
delay(500);
digitalWrite(rainSensorPowerPin, LOW);
delay(2000);
int feuchte_1 = map(analogRead(FEUCHTE_PIN_1), 0, 700, 100, 0); // Umrechnung von ADC-Wert zu Prozent
int feuchte_2 = map(analogRead(FEUCHTE_PIN_2), 0, 700, 100, 0); // Umrechnung von ADC-Wert zu Prozent
int feuchte_3 = map(analogRead(FEUCHTE_PIN_3), 0, 700, 100, 0); // Umrechnung von ADC-Wert zu Prozent
int feuchte_4 = map(analogRead(FEUCHTE_PIN_4), 0, 700, 100, 0); // Umrechnung von ADC-Wert zu Prozent
int feuchte_5 = map(analogRead(FEUCHTE_PIN_5), 0, 700, 100, 0); // Umrechnung von ADC-Wert zu Prozent
int feuchte_6 = map(analogRead(FEUCHTE_PIN_6), 0, 700, 100, 0); // Umrechnung von ADC-Wert zu Prozent
if (feuchte_1 < FEUCHTE_THRESHOLD_LOW) {
// Schalte Pumpe 1 ein, wenn die Bodenfeuchte zu niedrig ist
digitalWrite(PUMP_PIN_1, HIGH);
} else if (feuchte_1 > FEUCHTE_THRESHOLD_HIGH) {
// Schalte Pumpe 1 aus, wenn die Bodenfeuchte hoch genug ist
digitalWrite(PUMP_PIN_1, LOW);
}
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("F1: ");
lcd.print(feuchte_1);
lcd.setCursor(10, 0);
lcd.print("F2: ");
lcd.print(feuchte_2);
lcd.setCursor(0, 1);
lcd.print("F3: ");
lcd.print(feuchte_3);
lcd.setCursor(10, 1);
lcd.print("F4: ");
lcd.print(feuchte_4);
lcd.setCursor(0, 2);
lcd.print("F5: ");
lcd.print(feuchte_5);
lcd.setCursor(10, 2);
lcd.print("F6: ");
lcd.print(feuchte_6);
lcd.backlight();
delay(5000);
if (feuchte_2 < FEUCHTE_THRESHOLD_LOW) {
digitalWrite(PUMP_PIN_2, HIGH);
} else if (feuchte_2 > FEUCHTE_THRESHOLD_HIGH) {
digitalWrite(PUMP_PIN_2, LOW);
}
if (feuchte_3 < FEUCHTE_THRESHOLD_LOW) {
digitalWrite(PUMP_PIN_3, HIGH);
} else if (feuchte_3 > FEUCHTE_THRESHOLD_HIGH) {
digitalWrite(PUMP_PIN_3, LOW);
}
if (feuchte_4 < FEUCHTE_THRESHOLD_LOW) {
digitalWrite(PUMP_PIN_4, HIGH);
} else if (feuchte_4 > FEUCHTE_THRESHOLD_HIGH) {
digitalWrite(PUMP_PIN_4, LOW);
}
if (feuchte_5 < FEUCHTE_THRESHOLD_LOW) {
digitalWrite(PUMP_PIN_5, HIGH);
} else if (feuchte_5 > FEUCHTE_THRESHOLD_HIGH) {
digitalWrite(PUMP_PIN_5, LOW);
}
if (feuchte_6 < FEUCHTE_THRESHOLD_LOW) {
digitalWrite(PUMP_PIN_6, HIGH);
} else if (feuchte_6 > FEUCHTE_THRESHOLD_HIGH) {
digitalWrite(PUMP_PIN_6, LOW);
}
}
}