Go Down

Topic: Zwei parallele Programme laufen lassen (Read 2188 times) previous topic - next topic

kahmui

#60
Jul 17, 2020, 08:50 am Last Edit: Jul 17, 2020, 10:21 am by kahmui
Welches Relais?
Also Nein! ?
Nein. Natürlich ist nicht beabsichtigt, dass die Pumpen ohne Grund anlaufen und sich die Klinke geben :)

Ich benutze ein Relais Shield, welches meine 230-Verbraucher schaltet. Diese Relais Pins sind HIGH-aktiv und schalten meine beiden 230V Pumpen sowie meine 230V-Wegeventile.

Meine beiden Sensoren sind LOW-aktiv. Daher hast du natürlich recht und es muss

> "taskWaitFor(!digitalRead(inPin));" oder wie du schreibst ""taskWaitFor(not digitalRead(inPin));"

heißen.

PINS 2 und 3 sind LOW-aktiv (IR-Sensoren)

PINS 4, 5, 6 und 7 sind HIGH-aktiv (Relais-Shield - 2 Pumpen (7 und 5) und 2 Wegeventile zur Druckentlastung (6 und 4))

PINS 8 und 9 sind meine beiden Taster (Schließer), die für die manuelle Betätigung genutzt werden. (Wenn jeweils betätigt, dann zugehörige Pumpe und Druckentlastung an)

Code: [Select]

#include <CooperativeTask.h>

/*-------------------------Pumpe----------------------------*/

class Pumpe: public Task
{
  protected:
    const byte inPin;
    const byte outPin;
    const byte entlastungPin;
    const unsigned long laufZeit;
    const unsigned long pauseZeit;
    const unsigned long entlastungZeit;
 
  public:
    Pumpe(const byte inPin,const byte outPin,const byte entlastungPin,const unsigned long laufZeit,const unsigned long pauseZeit,const unsigned long entlastungZeit):
       inPin(inPin),
       outPin(outPin),
       entlastungPin(entlastungPin),
       laufZeit(laufZeit),
       pauseZeit(pauseZeit),
       entlastungZeit(entlastungZeit)
    {
    }
   
    virtual void init() override
    {
      pinMode(inPin,INPUT_PULLUP);
      pinMode(outPin,OUTPUT);
      pinMode(entlastungPin,OUTPUT);
    }
   
    virtual void run() override
    {
      TaskBlock
      {
        taskWaitFor(!digitalRead(inPin));
        digitalWrite(outPin,HIGH);
        taskPause(laufZeit);
        digitalWrite(outPin,LOW);
        digitalWrite(entlastungPin,HIGH);
        taskPause(entlastungZeit);
        taskPause(pauseZeit-entlastungZeit);
      }
    }
};

Pumpe pumpen[] { // {inPin, outPin, entlastungPin,  laufZeit, pauseZeit,  entlastungZeit}
                    {2,     7,      6,              2000,     3000,       300},
                    {3,     5,      4,              2000,     3000,       300}
               };

/*-----------------------------------------------------*/

void setup()
{
 Scheduler::instance().init();
}

void loop()
{
  Scheduler::instance().run();
}



UPDATE:

Also... das Programm funktioniert soweit, BIS die 230V scharf geschaltet werden (Stinknormaler Nockenschalter mit Sicherung etc). Ist die 230V-Spannungsquelle nicht aktiv, funktioniert alles soweit wie es soll. Ich löse mittels Handbewegung einen beliebigen Sensor aus, das zugehörige Relais wird geschaltet, die Laufzeit passt und die Druckentlastung findet auf dem anderen Relais ebenfalls statt. Beide Kreise funktionieren, auch unabhängig voneinander. (zu beobachten an den Relais-Shield LED´s).

Jetzt kommt´s aber:
Ich lege den Nockenschalter um und habe die 230V an meinen Verbrauchern. Löse ich mittels Handbewegung einen Ablauf aus, funktioniert dieser zwar soweit, ABER der zweite Kreis wird im Anschluss ebenfalls direkt ausgelöst! Dies passiert beidseitig. Läuft Kreis 1 an, kommt Kreis 2 direkt im Anschluss und umgekehrt.

Habt ihr eine Ahnung woran das liegen kann? Die Relais schalten meine Spannung doch nur durch? Die Relais auf dem Shield sollten normalerweise die 230VAC verkraften. Relais 4 fach

combie

#61
Jul 17, 2020, 10:23 am Last Edit: Jul 17, 2020, 10:24 am by combie
Schön auch mal ein solches Relaisboard kennen lernen zu dürfen.

Quote
? Die Relais auf dem Shield sollten normalerweise die 230VAC verkraften. Relais 4 fach
Das Datenblatt/Anleitung ist da eindeutig!
Switching Voltage - - 35 VDC
...
2. Do not operate voltage more than 35V DC


Und, wenn ich mir die Leiterbahnführung auf dem Board anschaue, dann ist das auch mehr als berechtigt.

Keinesfalls ist das Board für Netzspannung geeignet.
Nimmer.


Deine Störungen kommen allerdings daher, dass du die Snubber vergessen hast.

Also andere Relais und Snubber verwenden.
Säge kein Sägemehl.

kahmui

Laut Reichelt und auch der Beschreibung auf den Relais sollte das möglich sein.

Technische Daten
• Betriebsspannung: 4,75 ... 5,25 V
• Betriebsstrom: 8 ... 250 mA
• Schaltspannung: 250 VAC / 30 VDC
• Schaltstrom: 15 A / 7 A

Foto im Anhang

Tommy56

Das Relais allein, aber nicht auf dieser Platine.
Der Hersteller schreibt solche Einschränkungen nicht umsonst rein.
Wenn Du es trotzdem tust, ist das Vorsatz - mit allen juristischen Konsequenzen für Dich.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

kahmui

#64
Jul 17, 2020, 10:48 am Last Edit: Jul 17, 2020, 12:22 pm by kahmui
Dann werde ich das Ding wohl mal unverzüglich zurückschicken.  :smiley-roll-sweat:


Zurück zum Thema :)

Wie kann ich nun meine Taster mit integrieren? Für die beiden Pumpenkreise kann ich ja einen Ablauf schreiben der der Reihe nach abgearbeitet wird.

Wie sieht das nun mit Tastern aus?
Ich kann zwar fragen ob der Taster betätigt ist, aber was passiert wenn der Taster NICHT gedrückt ist?

Also während Taster gedrückt-> Betätige Pumpe x -> wenn Taster nicht mehr betätigt, schalte Pumpe x aus und die Entlastung im Anschluss kurz (200ms) ein und wieder aus .

Er würde ja permanent meine Pumpe abschalten und das Ventil kabwechselnd ein- / abschalten, wenn der Taster NICHT gedrückt ist.




combie

Naja, du könntest Semaphore, oder einen Mutex einführen, so dass die jeweils 2 konkurierenden Tasks sich gegenseitig ausschließen.

Oder du lässt die Tasks über Methoden miteinander kommunizieren.
Säge kein Sägemehl.

Go Up