Hallo liebes Forum,
ich habe mir ein kleines Board mit einer Ausgabeeinheit gebastelt und benötige mit der Programmierung selbst ein wenig Hilfe, da ich derzeit nicht weiter komme.
Den Code selbst füge ich hier mal mit ein.
Grundsätzlich soll der Arduino später eine Mengenangabe zugeschoben bekommen die er dann verarbeiten soll und über die vier Ventile ausgeben.
Wenn der Wert erreicht ist soll die Ausgabe stoppen und auf den nächsten Wert warten.
Das Ganze soll Zyklisch verarbeitet werden.
Ich habe die Werte der Pumpe hier eingetragen und sie dann einem delay zugeschoben der dann die Pumpe laufen lässt bis der delay abgelaufen ist.
Leider komme ich dem Problem nicht ganz auf die Schliche,
der “BWmenge_ges” wird unzyklisch kleiner und dann wieder größer.
Kann es vllt daran liegen dass ich im ISR rechne ?
Hier erstmal mein Code:
#include<Wire.h>
#define vent1 8
#define vent2 9
#define vent3 10
#define vent4 12
#define motor 11
#define mgeschw 255.0 //maximal Geschwindigkeit Pumpe x / 255
#define pumpgeschw 0.05833 //Liter pro Sekunde
float bwzeit();
void setup() {
Wire.begin(2);
Serial.begin(9600);
// Timer 1
noInterrupts(); // Alle Interrupts temporär abschalten
TCCR1A = 0; // set TCCR1A register to 0
TCCR1B = 0; // set TCCR1B register to 0
TCNT1 = 0; // set counter value to 0
OCR1A = 1561.5;; // set compare match register
TCCR1B |= (1 << CS12) | (1 << CS10); // Set CS12 and CS10 bits for 1:1024 prescaler
TCCR1B |= (1 << WGM12); // turn on CTC mode
TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
interrupts();
//deklaration der Ausgänge
pinMode(vent1, OUTPUT);
pinMode(vent2, OUTPUT);
pinMode(vent3, OUTPUT);
pinMode(vent4, OUTPUT);
pinMode(motor, OUTPUT);
//Ausgänge vor beginn abgeschaltet
digitalWrite(vent1, 0);
digitalWrite(vent2, 0);
digitalWrite(vent3, 0);
digitalWrite(vent4, 0);
digitalWrite(motor, 0);
}
float WMAusg = 0.12; //je 2 Ventile
float WMAusgV = WMAusg*2;
int k = 0;
float _BWmenge_ges = WMAusgV * 3.0; // Liter * Ventilausgänge * Zweigmenge
float BWmenge_ges=0.0;
int fall = 0;
int timeron = 0;
float BWZeit_aus = bwzeit(WMAusg, 2.0);
void loop() {
int WLevel = 1.0;
//Wassermenge einmalig laden
//Wassermenge berechnen
//bewässerung einschalten + Wassermenge zyklisch herunterrechnen
BWmenge_ges=_BWmenge_ges;
if ((BWmenge_ges > 0.0) && ( WLevel > 0.0)) {
for (int i = 0; i < 5; i++) {
Serial.println(BWmenge_ges);
switch (i) {
case 0:
digitalWrite(vent1, 0);
digitalWrite(vent2, 0);
digitalWrite(vent3, 0);
digitalWrite(vent4, 0);
digitalWrite(motor, 0);
timeron = 0;
break;
case 1:
digitalWrite(vent1, 1);
digitalWrite(vent2, 0);
digitalWrite(vent3, 0);
digitalWrite(vent4, 0);
digitalWrite(motor, 1);
timeron = 1;
break;
case 2:
digitalWrite(vent1, 0);
digitalWrite(vent2, 1);
digitalWrite(vent3, 0);
digitalWrite(vent4, 0);
digitalWrite(motor, 1);
timeron = 1;
break;
case 3:
digitalWrite(vent1, 0);
digitalWrite(vent2, 0);
digitalWrite(vent3, 1);
digitalWrite(vent4, 0);
digitalWrite(motor, 1);
timeron = 1;
break;
case 4:
digitalWrite(vent1, 0);
digitalWrite(vent2, 0);
digitalWrite(vent3, 0);
digitalWrite(vent4, 1);
digitalWrite(motor, 1);
timeron = 1;
break;
default:
digitalWrite(vent1, 0);
digitalWrite(vent2, 0);
digitalWrite(vent3, 0);
digitalWrite(vent4, 0);
digitalWrite(motor, 0);
timeron = 0;
break;
}
if (timeron > 0) {
delay(BWZeit_aus);
//Serial.println(BWZeit_aus);
timeron = 0;
}
}
}
}
float bwzeit(float menge, float ausgaenge) { //berechnung der bewässerungszeit * Ausgänge
float zeit = menge / pumpgeschw * ausgaenge * 1000 ;
return zeit;
}
ISR(TIMER1_COMPA_vect) { // ISR aufruf
//Wasserlevel prüfen
k++;
if(k<10){
BWmenge_ges=_BWmenge_ges-WMAusgV;
k=1;
}
}