ok soweit so gut..
aber der Code...
kannst Du mir dabei helfen erst einmal einen Sensor und ein Relais anzusteuern ?
Wie gesagt ich bin Anfänger...
/*Werte vom Bodenfeuchtigkeitssensor:
0~300 Zu trockene Erde, giessen.
300~700 Erde in Ordnung, nicht giessen.
700~950 Erde nass.*/
//Inkludiere DHT-Sensor-Library:
//#include
//Temparatur & Feuchtigkeitssensor Pin sowie Sensortyp definieren
#define DHTPIN A4
#define DHTTYPE DHT22
//Pin für normalen Arduino (Mega) definieren
//DHT dht (DHTPIN, DHTTYPE);
const int MultiplexPinA = 8;
const int MultiplexPinB = 9;
const int MultiplexPinC = 10;
const int MultiplexPinD = 11;
//Magnetventile definieren (Digital-Pin 24-39)//
#define MV_1Pin 24
#define MV_2Pin 25
#define MV_3Pin 26
#define MV_4Pin 27
#define MV_5Pin 28
#define MV_6Pin 29
#define MV_7Pin 30
#define MV_8Pin 31
#define MV_9Pin 32
#define MV_10Pin 33
#define MV_11Pin 34
#define MV_12Pin 35
#define MV_13Pin 36
#define MV_14Pin 37
#define MV_15Pin 38
#define MV_16Pin 39
//Pumpe-Relais definieren (Digital-Pin 40)//
#define Pumpe 40
unsigned long MillisNow;
unsigned long MillisLast;
byte CurrSensor; //Counter for the loop
unsigned int FreqSensor[4]; //Actual read in frequencies of sensors
const byte Pins[] = { Pumpe, MV_1Pin, MV_2Pin, MV_3Pin, MV_4Pin, MV_5Pin, MV_6Pin, MV_7Pin, MV_8Pin, MV_9Pin, MV_10Pin, MV_11Pin, MV_12Pin, MV_13Pin, MV_14Pin, MV_15Pin, MV_16Pin};
byte MV_active = 16; //welches MV ist gerade an?
const unsigned int GIESSINTERVALL = 5000; //jedes MV bleibt fuer 30 Sekunden an, bevor es aus- und das naechste einschaltet
unsigned int intervall = 0;
unsigned long previousMillis = 0;
//Taster definieren (Digital-Pin 22-27)//
#define Taster_3 41
#define Taster_4 42
#define Taster_5 43
#define Taster_6 44
//Feuchtesensoren definieren//
int FeuchteSensor1 = 1;
int FeuchteSensor1_val;
int FeuchteSensor2 = 1;
int FeuchteSensor2_val;
int FeuchteSensor3 = 1;
int FeuchteSensor3_val;
int FeuchteSensor4 = 1;
int FeuchteSensor4_val;
int FeuchteSensor5 = 1;
int FeuchteSensor5_val;
int FeuchteSensor6 = 1;
int FeuchteSensor6_val;
int FeuchteSensor7 = 1;
int FeuchteSensor7_val;
int FeuchteSensor8 = 1;
int FeuchteSensor8_val;
int FeuchteSensor9 = 1;
int FeuchteSensor9_val;
int FeuchteSensor10 = 1;
int FeuchteSensor10_val;
int FeuchteSensor11 = 1;
int FeuchteSensor11_val;
int FeuchteSensor12 = 1;
int FeuchteSensor12_val;
int FeuchteSensor13 = 1;
int FeuchteSensor13_val;
int FeuchteSensor14 = 1;
int FeuchteSensor14_val;
int FeuchteSensor15 = 1;
int FeuchteSensor15_val;
int FeuchteSensor16 = 1;
int FeuchteSensor16_val;
int FeuchteSensor17 = 1;
int FeuchteSensor17_val;
void setup() {
for (const byte p : Pins) {
pinMode (p, INPUT_PULLUP);
pinMode (p, OUTPUT); //Anfangszustand
}
pinMode(MultiplexPinA, OUTPUT);
pinMode(MultiplexPinB, OUTPUT);
pinMode(MultiplexPinC, OUTPUT);
pinMode(MultiplexPinD, OUTPUT);
pinMode (Taster_3, INPUT_PULLUP);//Taster_3-Pin//
pinMode (Taster_4, INPUT_PULLUP);//Taster_4-Pin//
pinMode (Taster_5, INPUT_PULLUP);//Taster_5-Pin//
pinMode (Taster_6, INPUT_PULLUP);//Taster_6-Pin//
Serial.begin (9600);//Serial-Begin
//dht.begin();
TCCR1A = 0; //Reset timer 1
}
void loop() {
//Erdmessung starten
MillisNow = millis();
if (MillisNow - MillisLast >= 1000) { //One second elapsed. Read the sensors,.......
for (CurrSensor = 1; CurrSensor < 15; CurrSensor++) {
SelectSensor(CurrSensor);
CountFrequency();
AssignToSensor(CurrSensor);
if (GeneralRunmode == 0) { //Send to PC in CLI Terminalmode
SendSensorFreqOverUart(CurrSensor);
}
}
CheckLockTimes();
CheckOutputs();
MillisLast = MillisNow;
FeuchteSensor1_val = analogRead(FeuchteSensor1); //Feuchtesensor-Wert 1 auslesen
Serial.print("Lese Feuchtesensor 1 - Daten aus: ");
Serial.println(FeuchteSensor1_val);
//PUMPE anhand von Messergebnissen an / oder ausschalten//
//Wenn Sensor1 Wert unter 350 - Starte Bewässerung!
if (FeuchteSensor1_val < 400) {
Serial.println("Erde zu trocken, Giessvorgang!");
digitalWrite (Pumpe, LOW); //PUMPE Starten
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= intervall) {
intervall = GIESSINTERVALL;
previousMillis = currentMillis;
//MV1 bis MV6 so lange umschalten, bis der Sensor "zu nass" misst
switch (MV_active) {
case 1 ... 15:
digitalWrite (Pins[MV_active], HIGH); //MV_x aus
MV_active++;
digitalWrite (Pins[MV_active], LOW); //MV_x an
break;
case 16:
digitalWrite (Pins[MV_active], HIGH); //MV_6 aus
MV_active = 1;
digitalWrite (Pins[MV_active], LOW); //MV_1 an
break;
}
Serial.print("Magnetventil ");
Serial.println(MV_active);
}
delay(100); // dient nur der lesbaren Anzeige, kann raus!
}
//Wenn Sensor1 Wert gleich oder über 350 - Keine Bewässerung!
if (FeuchteSensor1_val >= 350) {
Serial.println("Erde in Ordnung, keine Bewaesserung noetig!");
for (byte j = 0; j < 17; j++) {
digitalWrite (Pins[j], HIGH); // Pumpe und MV_x aus
}
delay(5000);
}
}
SensorRead
void SelectSensor(byte SensorToSelect) {
SensorToSelect--;
digitalWrite(MultiplexPinA, (bitRead(SensorToSelect, 0)));
digitalWrite(MultiplexPinB, (bitRead(SensorToSelect, 1)));
digitalWrite(MultiplexPinC, (bitRead(SensorToSelect, 2)));
digitalWrite(MultiplexPinD, (bitRead(SensorToSelect, 3)));
}
void CountFrequency() {
TCNT1 = 0; //Reset Counter
delay(10); //Delay for stable channel selection
bitSet(TCCR1B, CS12); //Select counter clock
bitSet(TCCR1B, CS11); //Count on rising edge
delay(50); //Count for 50mS
TCCR1B = 0; //Stop counting
}
void AssignToSensor(int SelectedSensor) {
FreqSensor[SelectedSensor - 1] = TCNT1 / 16; //Counts per 10mS
}