auch ich befasse mich mit dem Arduino erst seit wenigen Wochen.
Ich möchte ein Relais bei kurzem Tastendruck für eine Zeit x eingeschaltet lassen, bei einem andauernden Tastendruck soll das Relais so lange angesteuert werden, wie die Taste gedrückt wird.
Das funktioniert in der Theorie auch soweit.
Den Taster habe ich mit R=10k gegen Masse verschaltet.
Wenn ich nun den Taster geschlossen halte, bekomme ich am Ausgang ~ 1,5V, bei geöffnetem Taster (und durchgesteuertem Ausgang) sind es ~4,8V. Als Trockenübung mit LED ist ja noch alles Schick, aber am Relais (mit Transistorstufe) funktioniert das dann nicht mehr so schön.
Wer kann mir hier einen Rat geben?
Auch wenn ich denke, dass der Code nicht relevant ist, hier ist er dennoch:
int ab = 48;
int ab2 = 48;
int Taster4 = 44;
long Taster4Timer = 20;
long longPressTime = 250;
boolean Taster4Active = false;
boolean longPressActive = false;
void setup() {
pinMode(ab, OUTPUT);
pinMode(ab2, OUTPUT);
pinMode(Taster4, INPUT_PULLUP);
}
void loop() {
if (digitalRead(Taster4) == HIGH) {
if (Taster4Active == false) {
Taster4Active = true;
Taster4Timer = millis();
}
if ((millis() - Taster4Timer > longPressTime) && (longPressActive == false)) {
longPressActive = true;}
digitalWrite(ab, HIGH);
// delay(0);
digitalWrite(ab, LOW);
}
else {
if (Taster4Active == true) {
if (longPressActive == true) {
longPressActive = false;
} else {
digitalWrite(ab2, HIGH);
delay(10000);
digitalWrite(ab2, LOW);
}
Taster4Active = false;
}
}
}
"ab" ist für den Fall, daß das Relais so lange geschlossen bleibt wie der Taster gesrückt wird (delay(0))
"ab2" ist für den Fall, daß das Relais (10000 ms) gehalten wird
das mit dem "pinMode(Taster4, INPUT_PULLUP);" resultiert daraus, daß ich ein wenig expirimentiert habe - das PULLUP habe ich schon wieder gelöscht.
Die Verdrahtung habe ich in folgender Reihenfolge vorgenommen:
VCC
Taster Eingang
Taster Ausgang
Eingang Arduino / R10k //also beide am gleichen Punkt
R10k // andere Seite des Widerstands
Masse
ich hab mir deinen Sketch nicht genau angesehen, wie kommst Du darauf das es nicht daran liegt ? Woran soll es sonst liegen, an der Hardware ?
Ich denke wenn du die 1.5V misst wird der Ausgang ständig ein und aus geschaltet und im mittel ergibt das 1.5V . Bau ein paar Serial.print ein um dir den Zustand anzeigen zu lassen. Aber Du hast schon recht ist eine geile Übung um millis zu verstehen.
Du solltest beachten, dass Taster manchmal prellen, das könnte den Arduino verwirren. Außerdem sieht das Sketch mit Booleans und einem Pin unter zwei Namen unnötig kompliziert aus. Das sollte auch einfacher gehen.
Ein Eingangspin sollte entweder LOW ( am besten 0V, auf jeden Fall < 0.7V ) sein, oder HIGH ( >=3 V )
Deine gewünschte Logik verstehe ich so: sobald der Taster betätigt wird, wird das Relais für min. Zeit x (1s) eingeschaltet. Ist der Taster nach dieser Zeit immer hoch gedrückt, bleibt das Relais ein, bis der Taster losgelassen wird.
Nicht erwähnt ist: Ab wann zählt die Zeit, wenn innerhalb der Zeit x der Taster erneut kurz gedrückt wird?
Bleibt das Relais permanent an, wenn du z.b. alle 800 ms für 100 ms den Taster betätigst, x = 1000 ms ?
oder geht es 1000 ms nach dem ersten Start aus und 600 ms später wieder an (beim übernächsten Betätigen?)
Das Prellen beim Übergang normal -> gedrückt wird nebenbei mit erschlagen, allerdings prellt ein Taster auch beim Loslassen. Soll das auch die Zeit x neu starten?
Den Taster habe ich mit R=10k gegen Masse verschaltet.
pinMode(Taster4, INPUT_PULLUP);
Du hast hier einen Spannungsteiler gebastelt mit dem Du nie HIGH am Eingang haben wirst (der interne Pullup ist zwischen 20k und 50 kOhm)
Wenn ich nun den Taster geschlossen halte, bekomme ich am Ausgang ~ 1,5V, bei geöffnetem Taster (und durchgesteuertem Ausgang) sind es ~4,8V. Als Trockenübung mit LED ist ja noch alles Schick, aber am Relais (mit Transistorstufe) funktioniert das dann nicht mehr so schön.
Relaismodule funktionieren oft invertiert. Das Relais schaltet mit LOW ein. Wie hast Du die LED angeschlossen. Zwischen Ausgang und +5V?
danke für die zahlreichen Hinweise. Der Code ist sicherlich nicht sauber geschrieben und es gibt bestimmt noch viel Potential (was einige von euch auch angeregt haben). Mit diesem Thema werde ich mich später befassen.
Dank des Hinweises von "Rentner" habe ich mir das Ganze mal mit dem Oszi angesehen. Es ist tatsächlich so, daß die Spannungen "sehr schnell (auf eine Frequenzmessung habe ich verzichtet)" geschaltet werden. Dies scheint dadurch bedingt zu sein, daß ich "delay()" herausgenommen habe. Wenn ich nun delay auf mindestens 1 ms setzte habe ich eine saubere Ausgangsspannung. Da die Anwendung alles Andere als zeitkritisch ist, könnte ich sogar mit 500 ms leben.