Pages: [1]   Go Down
Author Topic: Dosierpumpensteuerung  (Read 766 times)
0 Members and 1 Guest are viewing this topic.
Kropp, Germany
Offline Offline
Newbie
*
Karma: 2
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
ich arbeite an einem Projekt, welches die digitalen Ausgänge meines Arduino Mega 2560 per Uhrzeit schaltet. Ich habe den Sketch so weit umgesetzt, vielleicht aber nicht ganz so elegant gelöst.
Es werden mit den Ausgängen per Optokoppler Relais angesteuert, die dann die einzelnen Steckdosen einer Steckdosenleiste und Dosierpumpen ein-und ausschalten.
Ich habe so etwas schon einmal für meinen Aquaristik-Computer gebaut und diese schon seit 1 1/2 Jahre ohne Probleme im Einsatz.

Das Problem sind nicht die Steckdosenleisten, sondern die Dosierpumpen der Dosieranlage.
Um eine bestimmte Flüssigkeitsmenge dosieren zu können, benötige ich eine Laufzeit im Sekundenbereich. Die Pumpen geben z.B. bei einer Laufzeit von 5 Sekunden eine Flüssigkeitsmenge von ca. 5ml ab.
Leider sind die Ein- und Ausschaltzeiten im Minutenbereich begrenzt. Ich kann also nur z.B. eine Steckdose um 10:30 Uhr ein- und um 18:15 Uhr wieder ausschalten. Ich brauche aber für die Dosierpumpen eine Ein- und Ausschaltzeit wie z.B. (10:30:00 Uhr ein+10:30:05 aus), so dass mit der Laufzeit von 5 Sekunden ab 10:30 Uhr eine Flüssigkeitsmenge von 5ml abgegeben wird.
Ich versuche seit ca. einer Woche, allabendlich eine Lösung zu finden und komme einfach nicht weiter.
Vielleicht hat jemand eine Idee oder so etwas ähnliches schon mal gelöst.
Anbei der Sketch:

Code:
#include "Wire.h"
#define DS1307_ADDRESS 0x68  // Die I2C-Adresse
#include <RTClib.h>

//Beleuchtung---------------
const int LEDst = 37;  //LED-Stripe weiß
const int LEDrgb = 39; //LED-Stripe RGB

 //Mini-USB-Ausgang 1 ---------------
const int MUA1 = 53;     //Strömungspumpe 1
const int MUA2 = 52;     //Strömungspumpe 2
const int MUA3 = 51;     //Heizung
const int MUA4 = 50;     //Abschäumer

//Mini-USB-Ausgang 2 ---------------
const int MUA5 = 49;     //Licht Technikbecken
const int MUA6 = 48;     //Licht Kranzbeleuchtung
const int MUA7 = 47;     //Pumpe für Hydor Flo Kreisel
const int MUA8 = 38;     //Frei

//Mini-USB-Ausgang 3 ---------------
const int DA1 = 40;     //Dosieranlage 1
const int DA2 = 41;     //Dosieranlage 2
const int DA3 = 42;     //Dosieranlage 3
const int DA4 = 43;     //Dosieranlage 4

const unsigned long HOUR = 60 * 60;
const unsigned long MINUTE = 60;
const unsigned long SECOND = 60;.
RTC_DS1307 RTC;
DateTime now;

const char LOGFORMAT[] = "%02u.%02u.%04u     %02u:%02u:%02u";
char RTCpuffer[16];     // der Wert des RTCpuffer muss gross genug sein, dass alle Zeichen reinpassen!!

void setup()
{
  pinMode(LEDrgb, OUTPUT);
  pinMode(LEDst, OUTPUT);
  pinMode(MUA1, OUTPUT);
  pinMode(MUA2, OUTPUT);
  pinMode(MUA3, OUTPUT);
  pinMode(MUA4, OUTPUT);
  pinMode(MUA5, OUTPUT);
  pinMode(MUA6, OUTPUT);
  pinMode(MUA7, OUTPUT);
  pinMode(MUA8, OUTPUT);
  pinMode(DA1, OUTPUT);
  pinMode(DA2, OUTPUT);
  pinMode(DA3, OUTPUT);
  pinMode(DA4, OUTPUT);
 
  Serial.begin(9600); //Einschalter Übertragung zum Serial-Monitor
  Wire.begin();
 
 RTC.begin();

}

byte bcdToDec(byte val)  {
// Konvertieren des binär Code zu Dezimalzahlen
  return ( (val/16*10) + (val%16) );
}

void loop()
{

   now=RTC.now();
  /////  Bekommt die Zeit vom RTC in RTCHour, RTCMinute, RTCSecond

   // Stellt den Register Pointer auf 0 (Sekunden)
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write((byte)0);
  Wire.endTransmission();

  //  Liest Sekunde, Minute und Stunde aus
  Wire.requestFrom(DS1307_ADDRESS, 3);

  int RTCSecond = bcdToDec(Wire.read());
  int RTCMinute = bcdToDec(Wire.read());
  int RTCHour = bcdToDec(Wire.read() & 0b111111); //24 Stunden Zeit
 
// Schreibt die Zeit zum LCD XX: XX: XX
  if(RTCHour < 10) {
    Serial.print("0");
  }
Serial.print(RTCHour);
Serial.print(":");
  if(RTCMinute < 10) {
    Serial.print("0");
  }
Serial.print(RTCMinute);
Serial.print(":");
  if(RTCSecond < 10) {
    Serial.print("0");
  }
Serial.print(RTCSecond);

Serial.print("_UHR");

  unsigned long time = RTCHour * HOUR + RTCMinute * MINUTE + RTCSecond  ;  // Zeit in Sekunden
  Serial.println(RTCpuffer);

 //----------------------------------------BELEUCHTUNG---------------------------------------
 
 // Schaltzeiten-----------------
  if (time >= 10*HOUR+30*MINUTE)//Schaltet die LED-Stripe weiß ein
digitalWrite(LEDst, HIGH);
  if (time >= 21*HOUR+30*MINUTE)//Schaltet die LED-Stripe weiß aus
digitalWrite(LEDst, LOW);

if (time >= 10*HOUR+15*MINUTE)//Schaltet die LED-Stripe RGB ein
digitalWrite(LEDrgb, HIGH);
  if (time >= 23*HOUR+00*MINUTE)//Schaltet die LED-Stripe RGB aus
digitalWrite(LEDrgb, LOW);
}
   

Danke schon mal.

Gruß Jens
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 264
Posts: 21619
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich verstehe Dein Problem nicht, Du bist ja bereits am besten Weg.
Du rechnest ja bereits die Zeit auf Sekunden um.
Dann fehlt nur noch die Kontrolle zB 5 Sekunden um 10:30:00 (37800 Sekunden) bis 10:30:05 (37805 Sekunden).

Code:
// Schaltzeiten-----------------
  if ((time >= 37800)&&(time < 37805))    //Schaltet die LED-Stripe weiß ein
digitalWrite(LEDst, HIGH);
  else digitalWrite(LEDst, LOW);

Wenn Du die Schaltzeiten bereits in Sekunden umrechnest dann ist der Sketch schneller.

Grüße Uwe

Logged

Kropp, Germany
Offline Offline
Newbie
*
Karma: 2
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Uwe,

das sieht nicht nur gut aus, sondern funktioniert bestens. Danke dafür.
Ich hatte ehrlich gesagt nicht darüber nachgedacht, einfach den Wert in Sekunden einzusetzen anstelle der Uhrzeit.
Ich wollte es mir nur einfacher machen, indem ich anstelle der Rechnerei von Sekunden zur Uhrzeit einfach die Uhrzeit selbst eingebe.
Kann man trotzdem den Sketch so anpassen, dass ich die Uhrzeit mit Sekunden als Schaltzeit einsetzen kann?
In etwa so:

Code:
// Schaltzeiten-----------------
  if ((time >= 10*HOUR+30*MINUTE+00SECOND)&&(time < 10*HOUR+30*MINUTE+05SECOND))    //Schaltet die LED-Stripe weiß ein
digitalWrite(LEDst, HIGH);
  else digitalWrite(LEDst, LOW);

Gruß Jens
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 146
Posts: 3032
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
  if ((time >= 10*HOUR+30*MINUTE+00SECOND)&&(time < 10*HOUR+30*MINUTE+05SECOND))    //Schaltet die LED-Stripe weiß ein

Ich heiße zwar nicht Uwe, aber wenn Du oben im Sketch die Sekundendefinition korrigierst auf:
const unsigned long SECOND = 1;
dann sollte es passen mit
  if ((time >= 10*HOUR+30*MINUTE+0*SECOND)&&(time < 10*HOUR+30*MINUTE+5*SECOND)) 
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 264
Posts: 21619
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich heiße Uwe.  smiley-wink smiley-wink smiley-wink aber Jurs hat schon geantwortet.
Logged

Kropp, Germany
Offline Offline
Newbie
*
Karma: 2
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke, nicht der Uwe  smiley-cool
Funktioniert.
Gruß Jens
Logged

Kropp, Germany
Offline Offline
Newbie
*
Karma: 2
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Uwe,

Quote
Wenn Du die Schaltzeiten bereits in Sekunden umrechnest dann ist der Sketch schneller.

Was macht das in etwa aus oder ist es vernachlässigbar?

Gruß Jens
Logged

Pages: [1]   Go Up
Jump to: