Dosierpumpen mit Schaltsteckdosen - Ein AquaGrow Mod

rrnetz

Member
glaub er meint
#define DOSE7 6
#define DOSE6 7
#define DOSE5 8
#define DOSE4 9 // Dosierpumpe
#define DOSE3 10 // Dosierpumpe
#define DOSE2 11 // Dosierpumpe
#define DOSE1 12 // Dosierpumpe

Kommentiere mal #define DOSE7 6 aus mit //
 

omega

Well-Known Member
Hallo Martin,

hugo1892":36f75u1f schrieb:
Deine pinAddr in dosing sind auch falsch. Die sind der Index auf den Array dosingPins. Der hat bei Dir aber nur 6 Elemente.
Wie muss ich es schreiben meisnt du?
Dein dosing Array:
Code:
PUMP dosing[] = {
{get_ts(10,0,5),1,"D1",8,10},
{get_ts(10,0,10),1,"D2",2,10},
{get_ts(10,0,15),1,"D3",3,10},
{get_ts(10,0,20),1,"D4",4,10},
{get_ts(10,0,25),1,"D5",5,10},
{get_ts(10,0,30),1,"D6",6,10},

{get_ts(10,0,35),1,"D1",8,10},
{get_ts(10,0,40),1,"D1",8,10},
{get_ts(10,0,45),1,"D1",8,10},
};
PUMP ist deklariert als:
Code:
typedef struct {
uint32_t time;
boolean active;
char name[3];
byte pinAddr;
byte mldosing;
}PUMP;
Deine Werte für pinAddr lauten 8, 2, 3, 4, 5, 6, 8, 8, 8 und werden in Dosing.ino so benutzt:
Code:
dosingPins[dosing[i].pinAddr]
Sie sind also Indizes auf den Array dosingPins. Du hast den bei Dir so deklariert:
Code:
const byte dosingPins[]={DOSE1,DOSE2,DOSE3,DOSE4,DOSE5,DOSE6,};
Ein Index auf dosingPins - das Element pinAddr von PUMP - darf demnach nur zwischen 0 und 5 liegen.

Wie müssen 8, 2, 3, 4, 5, 6, 8, 8, 8 also stattdessen lauten?

Grüße, Markus
 

hugo1892

Member
Also, im Moment habe ich folgenden Code hinterlegt! Ich hoffe das ist so richtig wenn es nur zwischen 0 und 5 liegen soll.

Ich weiß nicht wie ich auf die 8 und 6 gekommen bin. Das kommt davon weil ich die pumpen nicht mit angeschlossen habe und nur über den oled kontrolliere ob er mir die Werte an nimmt. Und das tat er auch mit den fehlerhaften, außer bei den Mehrfachdosierungen.

Code:
#define PUMPCOUNTS 6      // Number Pumps
#define RELAYCHANNELS 4
#define RELAYTIMES 6
#define KEYPADI2C 0x20
#define LCD_ADR 0x27


  // PIN MAPPING NICHT ÄNDERN!!!
  #define PIN_TEMP A1   // Temperatur
  #define RELAY1 2
  #define RELAY2 3
  #define RELAY3 4
  #define RELAY4 5
//  #define DOSE7 6
  #define DOSE6 7   
  #define DOSE5 8  
  #define DOSE4 9     // Dosierpumpe 
  #define DOSE3 10      // Dosierpumpe 
  #define DOSE2 11     // Dosierpumpe 
  #define DOSE1 12     // Dosierpumpe 

// Größe Vorratsflaschen Dünger in ml
const int dose_val = 1000;

// Neu zuordnung der Pins für Dosierung
const byte dosingPins[]={DOSE1,DOSE2,DOSE3,DOSE4,DOSE5,DOSE6,};
// Milliliter per minute in Reihenfolge wie Pumpen oben Achtung Maximum 255ml/Minute
const byte dosingMlMin[]={60,60,60,60,60,60,};

// Pumpen Einstellungen
// Uhrzeit, Aktive, Name, Pin Adresse (von array oben 0 ist erste Pumpe "Dose1"), Status (ignorieren, nur wichtig für Programm), Milliliter pro Dosierungconst 
PUMP dosing[] = {  
{get_ts(10,0,5),1,"D1",0,10},
{get_ts(10,0,10),1,"D2",1,10},
{get_ts(10,0,15),1,"D3",2,10},
{get_ts(10,0,20),1,"D4",3,10},
{get_ts(10,0,25),1,"D5",4,10},
{get_ts(10,0,30),1,"D6",5,10},
{get_ts(10,0,35),1,"D1",0,10},
};

// Wird verwendet um zu sehen ob schon dosiert wurde. Nicht Ändern!!!
boolean dosingState[PUMPCOUNTS];

const byte relayPIN[]= {RELAY1,RELAY2,RELAY3,RELAY4};
RELAY relays[RELAYCHANNELS][RELAYTIMES] = { 
  {{get_ts(0,0,0),1},{get_ts(17,10,0),0},{get_ts(17,15,0),1},{get_ts(17,20,0),0},{get_ts(17,25,0),1},{get_ts(17,30,0),0}},
  {{get_ts(0,0,0),0},{get_ts(10,0,0),1},{get_ts(11,30,0),0},{get_ts(19,0,0),1},{get_ts(20,0,0),0},{get_ts(21,30,0),0}},
  {{get_ts(0,0,0),0},{get_ts(10,0,0),1},{get_ts(11,30,0),0},{get_ts(19,0,0),1},{get_ts(20,0,0),0},{get_ts(21,30,0),0}},
  {{get_ts(0,0,0),0},{get_ts(10,0,0),1},{get_ts(11,30,0),0},{get_ts(19,0,0),1},{get_ts(20,0,0),0},{get_ts(21,30,0),0}}
};

Die letzte Zeile zieht er dann trotzdem nicht ab.

Jetzt gehts trotzdem ins Bett da morgen leider der erste Arbeitstag ist :-(

Danke Euch schon mal.
 

MajorMadness

Active Member
Wie Markus richtig bemerk hat kommt der Fehler von unterschiedlichen längen der Arrays die verwendet sind. ich hab auf grund des Speicherplatzes der MiniControl hier ne limitierung drin gehabt. Bei der Dosing ist dies nicht weswegen der Code teilweise klappt. Da aber in beiden sketchen die gleichen Dateien verwendet werden kommt es nun bei dir zu fehlern durch unterschiede.

Ich werde den code mal umschreiben und dann aktualisieren damit es ein wenig dynamischer ist und dann sollte es auch mit weniger Pumpen, mehr schaltzeiten klappen.
Ich kann nicht versprechen das ich das morgen mache aber bis ende der Woche sollte ich wärend der Arbeit dazu kommen. Chef merkt hoffentlich nicht WAS ich da grade programmiere. :D
 

omega

Well-Known Member
Hallo Martin,

hugo1892":3nj95vsa schrieb:
Code:
#define PUMPCOUNTS 6   // Number Pumps
...
PUMP dosing[] = {  
{get_ts(10,0,5),1,"D1",0,10},
{get_ts(10,0,10),1,"D2",1,10},
{get_ts(10,0,15),1,"D3",2,10},
{get_ts(10,0,20),1,"D4",3,10},
{get_ts(10,0,25),1,"D5",4,10},
{get_ts(10,0,30),1,"D6",5,10},
{get_ts(10,0,35),1,"D1",0,10},
};

Die letzte Zeile zieht er dann trotzdem nicht ab.
der Array hat 7 Elemente, PUMPCOUNTS steht auf 6.
Um mehr als einen Lauf einer Pumpe pro Tag zu ermöglichen, müßtest Du neben dosing halt auch dosingMlMin und dosingState entsprechend des eingangs angesprochenen Index-Zugriffs anpassen, damit Moritz' Algorithmus wie gewünscht funktioniert.

Grüße, Markus
 

MajorMadness

Active Member
SO, bitte mal testen ob es klappt:
Dosing.ino:
Code:
void resetPumps(){
  if(rtc.daystamp>get_ts(23,59,30)){
    pumpReset=true;
  }
  if(rtc.daystamp<60 && pumpReset==true){
    pumpReset=false;
    for( int i=0;i < sizeof(dosingState)/sizeof(dosingState[0]); i++){
        dosingState[i]=false;
    }
  }
}
void setDosing(){
  resetPumps();
    for( int i=0;i < sizeof(dosing) / sizeof(dosing[0]); i++){
      if(dosing[i].active!=0){
        if(rtc.daystamp>=dosing[i].time && rtc.daystamp<=dosing[i].time+10 && digitalRead(dosingPins[dosing[i].pinAddr])==LOW && dosingState[i]==false){
	  unsigned long time = long(60000L * dosing[i].mldosing / dosingMlMin[i]);
          t.pulseImmediate(dosingPins[dosing[i].pinAddr],time, HIGH);
          dosingState[i]=true;
          printDose(dosing[i].pinAddr,dosing[i].mldosing);
        }
      }
    }
}
config.h:
Code:
#define PUMPCOUNTS 7      // Number Pumps
#define RELAYCHANNELS 4
#define RELAYTIMES 6
#define KEYPADI2C 0x20
#define LCD_ADR 0x27


  // PIN MAPPING NICHT ÄNDERN!!!
  #define PIN_TEMP A1   // Temperatur
  #define RELAY1 2
  #define RELAY2 3
  #define RELAY3 4
  #define RELAY4 5
  #define DOSE7 6      // Dosierpumpe 
  #define DOSE6 7       // Dosierpumpe 
  #define DOSE5 8      // Dosierpumpe 
  #define DOSE4 9     // Dosierpumpe 
  #define DOSE3 10      // Dosierpumpe 
  #define DOSE2 11     // Dosierpumpe 
  #define DOSE1 12     // Dosierpumpe 

// Größe Vorratsflaschen Dünger in ml
const int dose_val = 1000;

// Neu zuordnung der Pins für Dosierung
const byte dosingPins[PUMPCOUNTS]={DOSE1,DOSE2,DOSE3,DOSE4,DOSE5,DOSE6,DOSE7};
// Milliliter per minute in Reihenfolge wie Pumpen oben Achtung Maximum 255ml/Minute
const byte dosingMlMin[PUMPCOUNTS]={60,60,60,60,60,60,60};

// Pumpen Einstellungen
// Uhrzeit, Aktive, Name, Pin Adresse (von array oben 0 ist erste Pumpe "Dose1"), Milliliter pro Dosierung
const PUMP dosing[] = {  
{get_ts(10,0,0),1,"D0",0,5},
{get_ts(11,0,0),1,"D1",1,6},
{get_ts(11,25,0),1,"D1",1,3},
{get_ts(11,26,0),1,"D1",1,3},
{get_ts(11,23,0),1,"D1",1,3},
{get_ts(11,28,0),1,"D1",1,5},
{get_ts(11,29,0),1,"D1",1,5},
{get_ts(11,0,0),1,"D2",2,6},
{get_ts(11,25,0),1,"D2",2,3},
{get_ts(11,26,0),1,"D2",2,3},
{get_ts(11,23,0),1,"D2",2,3},
{get_ts(11,28,0),1,"D2",2,5},
{get_ts(11,29,0),1,"D2",2,5},
};

// Wird verwendet um zu sehen ob schon dosiert wurde. Nicht Ändern!!!
boolean dosingState[sizeof dosing / sizeof dosing[0]];
NIX!!!! verändern, außer die zeiten und Pin Adresse in PUMP dosing. Hinzufügen und wegnehmen von Schaltzeiten sollte möglich sein, bei der Pin Adresse ist 0-6 möglich als Pumpe.
Ich habe den code so geändert dass man zwar die Anzahl der möglichen Pumpen oben angibt, danach wird aber nur an schaltzeiten kalkuliert, ausgegeben ect. Die ml angabenbeim LCD/oled waren vorher an die Schaltzeit gebunden, jetzt an die Pumpe.
Wichtig ist das in dosingPins und dosingMlMin genau so viele elemente stehen wie in PUMPCOUNTS angegeben (auch wenn nur 3 Pumpen vorhanden können die eigentlich so bleiben).

Ich komme frühstens übermorgen dazu das zu testen. Sry...
 

hugo1892

Member
Wow, du bist wieder mal drauf! Im positiven Sinne natürlich :bier:

Ich schaff es aber auch erst heute abend zu testen.

Bin ja auch wieder auf Arbeit :-(

Bis dahin.
 

omega

Well-Known Member
Hi Moritz,

MajorMadness":swzdu22s schrieb:
Wichtig ist das in dosingPins und dosingMlMin genau so viele elemente stehen wie in PUMPCOUNTS angegeben (auch wenn nur 3 Pumpen vorhanden können die eigentlich so bleiben).
für dosingPins stimmt das, für dosingMlMin aber nicht.
Bei
Code:
unsigned long time = long(60000L * dosing[i].mldosing / dosingMlMin[i]);
ist Dein dosingMlMin zu kurz für 0 <= i < sizeof(dosing) / sizeof(dosing[0]).

Grüße, Markus
 

MajorMadness

Active Member
Shit, danke hab das über sehen.

unsigned long time = long(60000L * dosing.mldosing / dosingMlMin[dosing.pinAddr]);
So müsste es stimmen wenn ich es auf dem Handy richtig hin bekomme.
Wichtig ist das der beim durchlaufen der Schaltzeiten das element aus mlMin nimmt welches dem element der Pins entspricht. Also erste mlMin ist gleich der 0 bei Pins...
 

hugo1892

Member
Hallo zusammen,

also im Trockenversuch ohne Pumpen wird es sauber durchgerechnet.

Herzlichen Dank an Euch!!! Vorallem an Moritz für die super schnelle Umsetzung. :tnx:

Hab mal 4 Schaltzeiten je Pumpe eingefügt.

Code:
// Pumpen Einstellungen
// Uhrzeit, Aktive, Name, Pin Adresse (von array oben 0 ist erste Pumpe "Dose1"), Milliliter pro Dosierung
const PUMP dosing[] = { 
{get_ts(11,0,10),1,"D0",0,5},
{get_ts(11,0,10),1,"D1",1,5},
{get_ts(11,0,10),1,"D1",2,5},
{get_ts(11,0,10),1,"D1",3,5},
{get_ts(11,0,10),1,"D1",4,5},
{get_ts(11,0,10),1,"D1",5,5},
{get_ts(11,0,20),1,"D1",0,5},
{get_ts(11,0,20),1,"D2",1,5},
{get_ts(11,0,20),1,"D2",2,5},
{get_ts(11,0,20),1,"D2",3,5},
{get_ts(11,0,20),1,"D2",4,5},
{get_ts(11,0,20),1,"D2",5,5},
{get_ts(11,0,30),1,"D1",0,5},
{get_ts(11,0,30),1,"D2",1,5},
{get_ts(11,0,30),1,"D2",2,5},
{get_ts(11,0,30),1,"D2",3,5},
{get_ts(11,0,30),1,"D2",4,5},
{get_ts(11,0,30),1,"D2",5,5},
{get_ts(11,0,40),1,"D1",0,5},
{get_ts(11,0,40),1,"D2",1,5},
{get_ts(11,0,40),1,"D2",2,5},
{get_ts(11,0,40),1,"D2",3,5},
{get_ts(11,0,40),1,"D2",4,5},
{get_ts(11,0,40),1,"D2",5,5},
};

// Wird verwendet um zu sehen ob schon dosiert wurde. Nicht Ändern!!!
boolean dosingState[sizeof dosing / sizeof dosing[0]];

Natürlich wird das so bei keinem Anwendung finden, ist aber doch klasse das es jetzt funktioniert.

Wenn es klappt werde ich heute Abend mal noch die Pumpen anschließen um zu schauen ob es da auch klappt.

Alle 6 Pumpen zur selben Zeit wird im Test nicht ratsam sein, oder? Mein Netzteil hat 12V mit 2A (24W)

Ich geb dann mal Rückmeldung was sich getan hat.
 

MajorMadness

Active Member
hugo1892":3b6vxyeo schrieb:
Natürlich wird das so bei keinem Anwendung finden, ist aber doch klasse das es jetzt funktioniert.
Sag das nicht. :D Wenn es klappt werde ich den Code so auch in die MiniControl und später in die TFT Control übernehmen damit man evt 4xtäglich 5 Pumpen laufen lassen kann. bei 512kb hab ich ja den platz für sehr viele schaltzeiten. :D
hugo1892":3b6vxyeo schrieb:
Alle 6 Pumpen zur selben Zeit wird im Test nicht ratsam sein, oder? Mein Netzteil hat 12V mit 2A (24W)
KANN kritisch werden... 1 Pumpe zieht 300mA ca, der limitierende Faktor ist aber der ULN2003. Der hat ne MAXIMUM Peak collector current von 500mA, Wobei hier die Meinungen auseinander gehen ob das für einen Pin oder alle Pins gemeint ist. Laut Datenblatt ist "Output Current (Single Output): 500mA (MAX.) ". Wenn du also 4 Pumpen gleiuchzeitig an hast und der Chip Kalt bleibt (unter +125 °C :stumm: ) dan KANN es klappen, muss aber nicht... Ich rate es nicht zu versuchen. Ich könnte aber mal ne defekte MiniControl nehmen und die mit 6 Pumpen betreiben. :pfeifen:
 

hugo1892

Member
Nochmals hallo an alle!

Gute Nachrichten:

ES FUNKTIONIERT :grow: :bier: :D

:tnx:

Jetzt noch Touchdisplay :hust: :hust: :glaskugel: (das war jetzt ein Spaß, aber schön wärs schon ;-) )

Nochmals vielen Dank an alle.
 

rrnetz

Member
MajorMadness":vjilb91x schrieb:
unsigned long time = long(60000L * dosing.mldosing / dosingMlMin[dosing.pinAddr]);


Hi Moritz

wenn ich das so übernehme bekomm ich Fehlermeldung

In file included from AquaGrowDosingTimeOled.ino:13:
C:\Dokumente und Einstellungen\Rene\Eigene Dateien\Downloads\ArduinoIDE-master\libraries\MicroLCD/MicroLCD.h:33: warning: '__progmem__' attribute ignored
In file included from AquaGrowDosingTimeOled.ino:13:
C:\Dokumente und Einstellungen\Rene\Eigene Dateien\Downloads\ArduinoIDE-master\libraries\MicroLCD/MicroLCD.h:61: warning: '__progmem__' attribute ignored
C:\Dokumente und Einstellungen\Rene\Eigene Dateien\Downloads\ArduinoIDE-master\libraries\MicroLCD/MicroLCD.h:78: warning: '__progmem__' attribute ignored
AquaGrowDosingTimeOled.ino: In function 'void setup()':
AquaGrowDosingTimeOled.ino:61: warning: only initialized variables can be placed into program memory area
AquaGrowDosingTimeOled.ino: In function 'void loop()':
AquaGrowDosingTimeOled.ino:76: warning: unused variable 'key'
Dosing.ino: In function 'void resetPumps()':
Dosing.ino:7: warning: comparison between signed and unsigned integer expressions
Dosing.ino: In function 'void setDosing()':
Dosing.ino:14: warning: comparison between signed and unsigned integer expressions
Dosing:17: error: request for member 'pinAddr' in 'dosingMlMin', which is of non-class type 'const byte'
LCD.ino: In function 'void printSpace(int)':
LCD.ino:2: warning: only initialized variables can be placed into program memory area
LCD.ino:3: warning: only initialized variables can be placed into program memory area
LCD.ino:4: warning: only initialized variables can be placed into program memory area
LCD.ino: In function 'void printTemp(float)':
LCD.ino:19: warning: only initialized variables can be placed into program memory area
LCD.ino: In function 'void printRelay(byte, boolean)':
LCD.ino:25: warning: only initialized variables can be placed into program memory area
LCD.ino:27: warning: only initialized variables can be placed into program memory area
Serial.ino: In function 'void serialHandler(String)':
Serial.ino:40: warning: only initialized variables can be placed into program memory area
Serial.ino:42: warning: only initialized variables can be placed into program memory area
Serial.ino:44: warning: only initialized variables can be placed into program memory area
Serial.ino:46: warning: only initialized variables can be placed into program memory area
keypad.ino: In function 'void keypadEvent(KeypadEvent)':
keypad.ino:56: warning: only initialized variables can be placed into program memory area
keypad.ino:61: warning: only initialized variables can be placed into program memory area
keypad.ino:66: warning: only initialized variables can be placed into program memory area
keypad.ino:71: warning: only initialized variables can be placed into program memory area
keypad.ino:76: warning: only initialized variables can be placed into program memory area
keypad.ino:81: warning: only initialized variables can be placed into program memory area
keypad.ino:86: warning: only initialized variables can be placed into program memory area
keypad.ino:93: warning: only initialized variables can be placed into program memory area
keypad.ino:5: warning: enumeration value 'IDLE' not handled in switch
keypad.ino:5: warning: enumeration value 'RELEASED' not handled in switch
keypad.ino:3: warning: unused variable 'chanel'
keypad.ino:4: warning: unused variable 's_Light'
/writeAnything.h: In function 'int EEPROM_readAnything(int, T&) [with T = int]':
LCD.ino:38: instantiated from here
/writeAnything.h:14: warning: comparison between signed and unsigned integer expressions
/writeAnything.h: In function 'int EEPROM_writeAnything(int, const T&) [with T = int]':
LCD.ino:40: instantiated from here
/writeAnything.h:5: warning: comparison between signed and unsigned integer expressions

Kompiliere ich ohne .pinAddr] funktioniert es
 
Ähnliche Themen
Themenersteller Titel Forum Antworten Datum
bastifantasti Hat Jemand Erfahrung mit elektr. Dosierpumpen?? Technik 13
B Dosierpumpen, verschiedene Hersteller? Technik 1
Mr-K Inline Dosierer für Dosierpumpen Bastelanleitungen 9
T Dosierpumpen Jebao DP-4 und Kamoer KSP-F03A Technik 2
M Dosierpumpen über Homematic steuern Technik 6
Erwin Dosierpumpen - Es wird immer unerträglicher.... Technik 5
T Dosierpumpen für Düngerautomatisierung ;) Bastelanleitungen 8
M Dünger über Dosierpumpen zuführen! Technik 5
O Dosierpumpen Anlage bauen Technik 21
L RF Wireless mit Solid LS verbinden Technik 0
Heiko Muth (Sumpfheini) Cryptocoryne siamensis jetzt wieder mit Art-Status Pflanzen Allgemein 1
Maj.Monogwam Biete Co2 Flasche mit Diffusor 500g Biete Technik / Zubehör 0
Maj.Monogwam Biete Eheim 126L Aquarium mit Unterschrank! Raum Erfurt/Thüringen Biete Technik / Zubehör 0
Maj.Monogwam Biete 2KG Co2-Anlage US-Aquaristik mit TÜV! Biete Technik / Zubehör 0
N Osmoseanlage Proline X3 mit sera GH/KH-plus 250 ml und sera shrimp mineral salt 100 ml Aufsalzen Nährstoffe 42
D Blätter mit Mangelerscheinung oder Algen abschneiden? Ja oder nein? Pflanzen Allgemein 5
Oli86 Uniq FS 600 LED mit WLAN Controller und verstellbarer Alu-Halterung + weiteres Zubehör | OVP | Top Zustand Biete Technik / Zubehör 0
madcyp Probleme mit Mangelerscheinungen Erste Hilfe 12
E Pflanzen Empfehlung mit WOW Effekt, Vordergrund Hightech Becken. Pflanzen Allgemein 0
Maj.Monogwam Biete Dennerle Nanocube 60L mit viel Zubehör Biete Technik / Zubehör 0

Ähnliche Themen

Oben