Moin moin,
ich bin Hannes, dies ist mein erster post in diesem Forum also entschuldige ich mich schonmal im voraus falls ich mein Problem in die falsche Kategorie eingeordnet habe
ich bin dabei mir eine automatische Melkzeugzwischendesinfektion zu bauen. der Ablauf der schaltung soll so sein:
durch ein Signal der Melkanlage soll nach einer bestimmten zeit (10 Sekunden) ein Programm gestartet werden wo nacheinander verschiedene Magnetventile geschaltet werden. nun habe ich das Problem das die Pins 7 und 8 die die beiden Relais steuern, die dann wiederum die Magnetventile steuern, ab start des Arduinos auf HIGH stehen, obwohl sie eigentlich auf LOW stehen sollten und erst im verlauf des Programms kurzzeitig auf HIGH schalten sollen..
Habe dazu auch wohl etwas bei Dr. Google gefunden, nur da bin ich absolut nicht schlau draus geworden. vielleicht hat ja jemand von euch lust sich den Code mal anzusehen.
Danke und Liebe grüße aus dem Lockdown!
Achja schonmal die erste frage, wie sende ich hier den Code? oder hab ich das richtig gemacht?
const int sensor= 2;
const int wasser= 6;
const int luft=7;
unsigned long abnahme = 0;
unsigned long wasserstart = 0;
unsigned long luftstart = 0;
unsigned long ersterluftstoss = 0;
const long interval1 = 10000; //Zeit zwischen abnahme und start
const long interval2 = 2000; //dauer des Wasserventils
const long interval3 = 2000; //dauer des 2. luftstoßes
const long interval4 = 2000; //dauer des 1. Luftstoßes
const long interval5 = 5000; //pause nach wasser
int tasterstatus = 0;
int modus=0;
void setup() {
pinMode (sensor, INPUT);
pinMode (wasser, OUTPUT);
pinMode (luft, OUTPUT);
Serial.begin(9600);
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print(tasterstatus);
tasterstatus=digitalRead(sensor);
if ((tasterstatus == 1) && (modus == 0) && (millis() >interval1 + abnahme))
{
abnahme = millis();
if (modus == 0)
{
modus == 1;
}
else
{
modus == 0;
}
if ((tasterstatus == 1) && (modus == 1))
{
digitalWrite(luft, HIGH);
}
if (millis() > interval4 + ersterluftstoss)
{
ersterluftstoss = millis();
digitalWrite(luft, LOW);
modus == 2;
}
if ((tasterstatus == HIGH) && (modus == 2))
{
digitalWrite(wasser, HIGH);
}
if (millis() > interval2 + wasserstart)
{
wasserstart = millis();
digitalWrite(wasser, LOW);
modus == 3;
}
if ((tasterstatus == HIGH )&& (modus == 3 )&& (millis() > interval5 + luftstart))
{
digitalWrite(luft, HIGH);
}
if (millis() > interval3 + luftstart)
{
luftstart = millis();
digitalWrite(luft, LOW);
modus == 4;
}
if (tasterstatus == LOW)
{
modus == 0;
}
}
}
doenermaker77:
nun habe ich das Problem das die Pins 7 und 8 die die beiden Relais steuern, die dann wiederum die Magnetventile steuern, ab start des Arduinos auf HIGH stehen, obwohl sie eigentlich auf LOW stehen sollten und erst im verlauf des Programms kurzzeitig auf HIGH schalten sollen..
Achja schonmal die erste frage, wie sende ich hier den Code? oder hab ich das richtig gemacht?
Wenn DU in Deinen ersten Post unten rechts auf modify message und dann im editor das "</>" Symbol nimmst, kannst dazwischen Deinen Code einfügen.
BESSER: In der IDE "für Forum kopieren" und einfach in den text einfügen - voila.
Ich habe den Code mal nachgebessert nach euren Vorschlägen, es hat sich leider nichts geändert. Die Relais sind normalerweise die "richtigen", sie schalten wenn strom anliegt.
ich hätte gerne das die Pins solange auf LOW sind bis das Programm was anderes sagt
Aus der Anleitung von denen:
Zitat "ACHTUNG: Es gibt Relaiskarten die schalten, wenn an dem Pin „IN“ GND angelegt wird und es gibt Relaiskarten die schalten, wenn an dem Pin „IN“ eine Spannung von 5V+ angelegt wird . Welche Version man hat lässt sich leicht feststellen, indem man den „Signal-„Pin einmal mit GND und einmal mit 5V+ des Arduino Boards verbindet. Das Schalten der Relaiskarte ist durch ein lautes knacken deutlich zu erkennen."
ganz egal in welcher reinfolge ich das eingebe, es wird nicht etwas geschaltet. Beim seriellen Monitor wird auch bei z.b. "abnahme" nicht hochgezählt, das müsste doch normalerweise auch oder nicht?
Von der Melkmaschine wird ein Magnetventil geschaltet, dort am Magnetventil wird dann die spannung gemessen die dann vom Arduino erkannt wird, sobald der Arduino dort eine Spannung erkennt soll "tasterstellung" auf 1 springen und gleichzeitig soll per millis ein Timer gestartet werden. Wenn nach 10 Sekunden Die "tastertstellung" immernoch 1 ist, dann soll für 2 Sekunden das Relais "Luft" geschaltet werden und gleichzeitig soll der "modus" auf 1 gestellt werden.
Nach Ablauf der 2 Sekunden soll dann das Relais "luft" ausgeschaltet werden und der Modus auf 2 gestellt werden.
Wenn dann immernoch die "tasterstellung" 1 ist, und der Modus auf 2 steht dann soll das Relais "wasser" eingeschaltet werden für 2 Sekunden. Nach ablauf der 2 Sekunden wird dann das Relais "wasser" ausgeschaltet und der Modus auf 3 gestellt. Bei dem teil soll alles genauso ablaufen. Ich habe das "modus" als sicherheit eingebaut, falls während des Vorgangs sich die "tastertstellung" in 0 verändert soll der komplette vorgang abgebrochen werden.
Durch das Magnetventil welches ich als Startsignal verwnden möchte soll eine Diode geschaltet werden die dann 5v an den Pin 2 (sensor) leitet
doenermaker77:
Momentan simuliere ich den „Sensor“ einfach mit 5v vom arduino
Das ist Mist.
Denn die Ladung, die Du dem PIN gibst, braucht ewig um aufgebraucht zu sein, da der Eingang des Chip SEHR Hochohmig ist.
Also muss das geändert werden.
Im Setup:
Den Pin nicht INPUT sondern INPUT_PULLUP.
Die Simulation nicht +5V sondern GND.
Das ist auch die einzige sinnvolle Variante.
Dein Code ist - wurde ja auch schon gesagt - nicht mal ansatzweise verständlich.
Du misch HIGH / 1 und LOW / 0 etc. pp.
Da sind Konstrukte mit den If's drin, die ich für nicht zielführend halte, habe mich aber mal kurz rangewagt und nur cpy&past gemacht mit ein paar Änderungen und vollkommen ungetestest stell ich das mal hier hin:
const int sensor = 2;
const int wasser = 6;
const int luft = 7;
unsigned long abnahme = 0;
unsigned long wasserstart = 0;
unsigned long luftstart = 0;
unsigned long ersterluftstoss = 0;
const long interval1 = 10000; //Zeit zwischen abnahme und start
const long interval2 = 2000; //dauer des Wasserventils
const long interval3 = 2000; //dauer des 2. luftstoßes
const long interval4 = 2000; //dauer des 1. Luftstoßes
const long interval5 = 5000; //pause nach wasser
bool tasterstatus;
int modus = 0;
void setup()
{
pinMode(sensor, INPUT_PULLUP);
pinMode(wasser, OUTPUT);
pinMode(luft, OUTPUT);
Serial.begin(9600);
}
void loop()
{
tasterstatus = digitalRead(sensor);
Serial.print(F("Tasterstatus: "));
Serial.println(tasterstatus);
if ((tasterstatus == HIGH) && (modus == 0) && (millis() > interval1 + abnahme))
{
abnahme = millis();
if (modus == 0)
{
modus == 1;
}
else
{
modus == 0;
}
if ((tasterstatus == HIGH) && (modus == 1))
{
digitalWrite(luft, HIGH);
}
if (millis() > interval4 + ersterluftstoss)
{
ersterluftstoss = millis();
digitalWrite(luft, LOW);
modus == 2;
}
if ((tasterstatus == LOW) && (modus == 2))
{
digitalWrite(wasser, HIGH);
}
if (millis() > interval2 + wasserstart)
{
wasserstart = millis();
digitalWrite(wasser, LOW);
modus == 3;
}
if ((tasterstatus == LOW) && (modus == 3) && (millis() > interval5 + luftstart))
{
digitalWrite(luft, HIGH);
}
if (millis() > interval3 + luftstart)
{
luftstart = millis();
digitalWrite(luft, LOW);
modus == 4;
}
if (tasterstatus == HIGH)
{
modus == 0;
}
}
}