Hallo,
mit zwei Tastern möchte ich per Arduino UNO zwei Lampen, die jeweils über ein Relaismodul geschaltet werden, ein und aus schalten.
Zusätzlich ist ein IR-Bewegungsmelder verbaut der dann die zwei Lichtfelder nach 10 Minuten ausschaltet wenn niemand mehr in der Nähe ist.
Anbei das Programm - die "Schalterei" ist ein Chaos - da ist ein "Geprelle" an und aus. Muss dann mehrmals drücken und wie das Relais dann immer steht ist vom Zufall abhängig.
Könnte mir da jemand helfen - komme nicht zurecht obwohl ich die Bounce2-Funktionen verwende.
Achtung: das Relais schaltet bei LOW an deshalb wird in der Funktion swchange() LOW und HIGH vertauscht.
Ein Eingang muss jederzeit einen definierten Zustand haben. Das bedeutet er muss immer beschaltet sein, wenigstens mit einem Pullup- oder Pulldownwiderstand (Widerstand vom Pin auf 5V bzw auf Masse) oder den internen Pullup aktiviert haben.
es fehlt eine Statusvariable, damit ein Tastendruck nur einmal detektiert wird. Bei deinem Sketch schaltet der Arduino mit jedem Loop-Durchlauf, während die Taste gedrückt wird, die Lampe um. Da das einige 100mal pro Sekunde passiert, ist das Ergebnis zufällig.
Ich habe mal beispielhaft sw1aktiv eingefügt. Die Variable muss am Sketchanfang mit boolean sw1aktiv; noch deklariert werden.
[...]
sw1.update(); // Taster 1
int sw1_tast = sw1.read();
if ((sw1_tast == HIGH) && (sw1aktiv==true)) {
if (sw1_soll == LOW)
sw1_soll = HIGH;
else
sw1_soll = LOW;
swchange(1);
sw1aktiv=false;
vg_time1 = millis();
}
if (sw1_tast == LOW) sw1aktiv=true;
[...]
Hallo,
die zwei Taster die jeweils zwei Lampen schalten funktionieren an meinem Arbeitsplatz. Wenn man sich entfernt gehen die Lichter, gesteuert durch den Bewegungsmelder, nach 5 Minuten aus. Wenn ich jedoch lange Zeit vor dem Rechner sitze, geht das Licht nach 5 nicht mehr von alleine aus - während meiner langen Sitzung hat der Bewegungsmelder jedoch fast permanent geschaltet. Hab ich da irgendwann einen Zählerüberlauf? Ich finde den Fehler nicht unsigned long ist doch mehr als ausreichend?
Hat da jemand eine Idee?
Danke!!
#include "Arduino.h"
#include <Bounce2.h>
int ledPin = 13; // LED on Pin 13 of Arduino
int pirPin = 10; // Input for HC-S501
int sw1pin = 11; //Schalter 1 Lampe Mitte
int sw2pin = 12; //Schalter 2 re und li Lampe
int rel1pin = 9; // Relais 1
int rel2pin = 8; // Relais 2
int pirValue; // Place to store read PIR Value
bool sw1_soll = 0;
int sw1_tast = 0;
bool sw1aktiv = false;
bool sw2_soll = 0;
int sw2_tast = 0;
bool sw2aktiv = false;
Bounce sw1 = Bounce();
Bounce sw2 = Bounce();
unsigned long vg_time1 = millis();
const unsigned long restlicht = 600000;
void swchange(int);
void setup() {
//Serial.begin(115200); // USB-Serielle SST
pinMode(ledPin, OUTPUT);
pinMode(pirPin, INPUT);
pinMode(sw1pin,INPUT);
pinMode(sw2pin,INPUT);
pinMode(rel1pin,OUTPUT);
pinMode(rel2pin,OUTPUT);
digitalWrite(ledPin, LOW);
digitalWrite(rel1pin, HIGH);
digitalWrite(rel2pin, HIGH);
sw1.attach(11);
sw1.interval(50);
sw2.attach(12);
sw2.interval(50);
}
void loop() {
// Beide Lampen ausschalten wenn keine IR-Bewegung
if ((millis() - vg_time1) > restlicht) {
sw1_soll = LOW;
sw2_soll = LOW;
swchange(1);
swchange(2);
}
sw1.update(); // Taster 1
int sw1_tast = sw1.read();
if ((sw1_tast == HIGH) && (sw1aktiv== true)) {
if (sw1_soll == LOW)
sw1_soll = HIGH;
else
sw1_soll = LOW;
swchange(1);
sw1aktiv =false;
vg_time1 = millis();
}
if (sw1_tast == LOW) sw1aktiv = true;
sw2.update(); // Taster 2
int sw2_tast = sw2.read();
if ((sw2_tast == HIGH) && (sw2aktiv== true)) {
if (sw2_soll == LOW)
sw2_soll = HIGH;
else
sw2_soll = LOW;
swchange(2);
sw2aktiv =false;
vg_time1 = millis();
}
if (sw2_tast == LOW) sw2aktiv = true;
pirValue = digitalRead(pirPin); // Bewegung startet Lichttimer von vorne
if (pirValue == 1) {
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
vg_time1 = millis();
}
}
void swchange(int sw){ // Relais schalten
if (sw == 1)
digitalWrite(rel1pin, !sw1_soll);
else
digitalWrite(rel2pin, !sw2_soll);
}