Hallo Leute,
ich möchte mit Buttons ein paar Relais ansteuern, welche an einem Schieberegister (74HC595) angeschlossen sind ansteuern. Aus einem mir unbekanntem Grund funktioniert der Sketch aber nicht:
const int button1 = 22; //Verbessert
const int button2 = 23; //Verbessert
int stateA;
int stateB;
int lastStateA;
int lastStateB;
int relaisStateA;
int relaisStateB;
int summe = 0;
int latchPin = 9;
int clockPin = 8;
int dataPin = 10;
void setup() {
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
stateA = digitalRead(button1);
if (stateA != lastStateA)
{
if (stateA == HIGH)
{
if (relaisStateA == HIGH)
{
relaisStateA = (LOW);
summe -1;
}
else
{
summe +1;
relaisStateA = (HIGH);
}
}
lastStateA = stateA;
}
stateB = digitalRead(button2);
if (stateB != lastStateB)
{
if (stateB == HIGH)
{
if (relaisStateB == HIGH)
{
summe -2;
relaisStateB = LOW;
}
else
{
summe +2;
relaisStateB = HIGH;
}
}
lastStateB = stateB;
}
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, summe);
digitalWrite(latchPin, HIGH);
delay(100);
}
Button 1 soll Relais A ein- oder abschalten, Button 2 soll Relais B ein- oder abschalten.
Um eventuelle Fragen vorweg zu nehmen: Mein Projekt ist um einiges größer, ich habe das Schaubild und den Code nur auf das wesentliche Problem reduziert. Man kann diese Schaltung natürlich noch um sechs weitere Buttons und Relais erweitern, wobei die Buttons die Summe jeweils um einen Binärwert erhöht (...4, 8, 16 usw) und die Relais dann mit diesem Wert angesteuert werden.
@agmue, Ich wusste gar nicht, dass ich so eine Einstellung in meiner IDE habe, danke Dir. Ich habe den Code daraufhin mal ein wenig geändert und habe auch gleich positive Resultate erzielt.
const int button1 = 6;
const int button2 = 7;
int stateA;
int stateB;
int lastStateA;
int lastStateB;
int relaisStateA;
int relaisStateB;
int summe = 0;
int latchPin = 9;
int clockPin = 8;
int dataPin = 10;
void setup() {
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
stateA = digitalRead(button1);
if (stateA != lastStateA)
{
if (stateA == HIGH)
{
if (relaisStateA == HIGH)
{
relaisStateA = (LOW);
summe=(summe-1);
// Serial.println("1 ist aus");
}
else
{
summe=(summe+1);
relaisStateA = (HIGH);
Serial.println("1 ist an");
}
}
lastStateA = stateA;
}
stateB = digitalRead(button2);
if (stateB != lastStateB)
{
if (stateB == HIGH)
{
if (relaisStateB == HIGH)
{
summe=(summe-2);
relaisStateB = LOW;
// Serial.println("2 ist aus");
}
else
{
summe=(summe+2);
relaisStateB = HIGH;
Serial.println("2 ist an");
}
}
lastStateB = stateB;
}
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, summe);
digitalWrite(latchPin, HIGH);
// Serial.println(summe);
delay(500);
}
summe=(summe+1);Die Klammern sind nicht notwendig:summe=summe+1;
Anstelle Bits mittels Addition zu setzen, gehen auch andere Möglichkeiten der Bitmanipulation. Diese zu kennen nützt, da man sie häufig in anderen Programmen findet:
byte test;
void setup() {
Serial.begin(9600);
Serial.print("1: ");
Serial.println(test, BIN);
test |= 0b00000001;
Serial.print("2: ");
Serial.println(test, BIN);
test |= 0b00000010;
Serial.print("3: ");
Serial.println(test, BIN);
test &= 0b11111110;
Serial.print("4: ");
Serial.println(test, BIN);
test &= 0b11111101;
Serial.print("5: ");
Serial.println(test, BIN);
test |= 1 << 0;
Serial.print("6: ");
Serial.println(test, BIN);
test |= 1 << 1;
Serial.print("7: ");
Serial.println(test, BIN);
test &= ~(1 << 0);
Serial.print("8: ");
Serial.println(test, BIN);
test &= ~(1 << 1);
Serial.print("9: ");
Serial.println(test, BIN);
}
void loop() {}
@agmue: Diesen Code muss ich mir nochmal näher anschauen. Ich habe davon bisher nur wenig Ahnung und solange das andere funktioniert, behalte ich es erst mal bei. @combie: die drei Adern an dem Button ist nach Tutorials angeschlossen und es funktioniert auch gut soweit.
Ich habe meine Schaltung und den Sketch um zwei Buttons und zwei Relais erweitert und es funktioniert auch wunderbar und ich habe auch einen kleinen Schönheitsfehler beseitigt: Beim start schaltet der Arduino erstmal alle Relais an, was (wie ich denke) daran liegt, dass beider IF-Abfrage das lastState noch keinen Wert zugewiesen bekommen hatte. Gelöst wurde es ganz simpel, in dem ich im Int-Bereich alle lastState direkt auf HIGH gesetzt habe und der Arduino diese im Loop wieder auf LOW setzt. Ausserdem habe ich einen kleinen Fehler beim Anschluss der Buttons gemacht (ich musste meine 8-Button-Platine noch mal umlöten >:( ). Dies habe ich auch korrigiert:
Und hier der Code:
const int button1 = 30;
const int button2 = 31;
const int button3 = 32;
const int button4 = 33;
int stateA;
int stateB;
int stateC;
int stateD;
int lastStateA = HIGH;
int lastStateB = HIGH;
int lastStateC = HIGH;
int lastStateD = HIGH;
int relaisStateA;
int relaisStateB;
int relaisStateC;
int relaisStateD;
int summe = 0;
int latchPin = 9;
int clockPin = 8;
int dataPin = 10;
void setup() {
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(button3, INPUT);
pinMode(button4, INPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
stateA = digitalRead(button1);
stateB = digitalRead(button2);
stateC = digitalRead(button3);
stateD = digitalRead(button4);
if (stateA != lastStateA)
{
if (stateA == HIGH)
{
if (relaisStateA == HIGH)
{
relaisStateA = (LOW);
summe=(summe-1);
Serial.println("1 ist aus");
}
else
{
summe=(summe+1);
relaisStateA = (HIGH);
Serial.println("1 ist an");
}
}
lastStateA = stateA;
}
// --------------------------------//
if (stateB != lastStateB)
{
if (stateB == HIGH)
{
if (relaisStateB == HIGH)
{
summe=(summe-2);
relaisStateB = LOW;
Serial.println("2 ist aus");
}
else
{
summe=(summe+2);
relaisStateB = HIGH;
Serial.println("2 ist an");
}
}
lastStateB = stateB;
}
// --------------------------------//
if (stateC != lastStateC)
{
if (stateC == HIGH)
{
if (relaisStateC == HIGH)
{
summe=(summe-4);
relaisStateC = LOW;
Serial.println("3 ist aus");
}
else
{
summe=(summe+4);
relaisStateC = HIGH;
Serial.println("3 ist an");
}
}
lastStateC = stateC;
}
// --------------------------------//
if (stateD != lastStateD)
{
if (stateD == HIGH)
{
if (relaisStateD == HIGH)
{
summe=(summe-8);
relaisStateD = LOW;
Serial.println("4 ist aus");
}
else
{
summe=(summe+8);
relaisStateD = HIGH;
Serial.println("4 ist an");
}
}
lastStateD = stateD;
}
// --------------------------------//
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, summe);
digitalWrite(latchPin, HIGH);
Serial.println(summe);
delay(100);
}