Hallo zusammen
Als erstes möchte ich ein grosses Dankeschön aussprechen.
Sehr tolles und informatives Forum.
@StefanL38 mit deinem Code hatte ich leider keinen Erfolg.
Ich habe dann noch einen Nano und Uno zum Ausprobieren zugelegt,
dachte das liegt am Digispark. Besten Dank nochmals.
Meinem Sohn ist dann ein Kumpel eingefallen der Programmierer
ist und sich das mal ansehen würde. Nach einigen Erklärungen
und Ablauf Skizzen, ist der Code nun fertig.
Anbei der Code und Schema, falls jemand mal das gleiche benötigt.
Gruss Marcel
[code]
const byte relaisPin = 0; // Pin für Relaisboard (OUTPUT)
const byte schaltPin = 1; // Pin für Endschalter (INPUT)
const int potiPin = A1; // Pin für Poti (INPUT) / Für Externe Einstellung der Zeitlimite
void setup() {
pinMode(schaltPin, INPUT);
pinMode(relaisPin, OUTPUT);
}
static uint32_t previousMillis = 0;
static uint32_t currentMillis = 0;
static uint32_t vorgabeZeit = 0; // diese Zeit bestimmt, ob erfüllt oder nicht erfüllt
static uint32_t vergangeneZeit = 0;
static uint32_t vorherigeZeit = 0;
static uint32_t potiWert = 0;
int schalterstatus = HIGH;
uint32_t debouncingCounter = 0;
const uint32_t zyklenAnzahl = 200; // Diese Zahl eventuell anpassen, je nach Arduino Clock und verwendetem Schalter
const uint32_t potiFaktor = 5; // Faktor Einstellung. Um den PotiWert zu erhöhen.
void loop() {
potiWert = analogRead(potiPin); // Potiwert ist die erlaubte Zeit in ms, welche nicht Überschritten werden darf
vorgabeZeit = potiWert * potiFaktor; // Benennung einer Variablen für (PotiWert inkl. Faktor)
schalterstatus = LOW; // Schalterstatus wird zurückgesetzt
if (digitalRead(schaltPin) == HIGH) { // Wenn der Endschalter betätigt wurde...
debouncingCounter = 0; // stelle den Counter auf Null
} else { // wenn nicht betätigt....
debouncingCounter++; // erhöht bei jedem Durchgang um 1 / wird für einen vergleich mit der ZyklenAnzahl benötigt
}
if (debouncingCounter == zyklenAnzahl) { // Wenn der Endschalter in der gewählten ZyklenAnzahl (wie als Zeit) nicht betätigt wurde,
schalterstatus = HIGH; // zählen wir dies als schaltvorgang
}
currentMillis = millis();
vergangeneZeit = currentMillis - previousMillis;
if (schalterstatus == HIGH) { // Wenn der Endschalter betätigt wird, passiert folgendes ....
vorherigeZeit = vergangeneZeit;
previousMillis = currentMillis; // previousMillis wird auf die aktuelle Zeit gesetzt
vergangeneZeit = 0; // vergangeneZeit wird auf 0 zurückgesetzt
}
if (vergangeneZeit > vorgabeZeit) { // Wenn die vergangeneZeit grösser als die vorgabeZeit ist
digitalWrite(relaisPin, LOW); // dann schalte das Relais der Oberen Zylinder Aus
} else { // wenn Zeit kleiner, dann weiter..
if (vorherigeZeit < vorgabeZeit) { // Wenn die vorherigeZeit kleiner als die vorgabeZeit ist
digitalWrite(relaisPin, HIGH); // dann schalte das Relais der Oberen Zylinder Ein
}
}
schalterstatus = LOW;
}
[/code]
Und das Schema
