Hallo bin Blutiger Anfänger,
Folgende Situation:
Mit einem einfachen Taster sollen beim Arduino UNO 8 Ausgänge durchgeschaltet werden
Bedeutet Ausgang 1 On Rest aus
Tasten => Ausgang 2 On Rest aus ...........
Wie kann man das am einfachsten Realisieren
Vielen Dank im Voraus
Hallo
Soll das ein Lauflicht werden ?
Kann man fast so Sagen,
die Ausgänge sollen hinterher auf Relais angeschlossen werden und die schalten jeweils einen Lichtbereich ein
Hallo
Dann zeige mal deinen aktuellen Sketch, damit wir sehen wie wir dir am Besten helfen können.
bool Taster = false;
bool Switch1 = false;
bool Relais1 = false;
bool Relais2 = false;
bool Relais3 = false;
bool Relais4 = false;
bool Relais5 = false;
bool Relais6 = false;
bool Relais7 = false;
bool Relais8 = false;
bool Relais9 = false;
bool Relais10 = false;
bool Relais11 = false;
bool Relais12 = false;
bool Relais13 = false;
void setup() {
pinMode(1, INPUT);
pinMode(2, INPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
Taster = digitalRead(1);
if (Taster == true && Switch1 == false) {
Switch1 = true;
}
if (Taster == false && Switch1 == true) {
Switch1 = false;
Relais1 = !Relais1;
Relais2 = !Relais2;
}
if (Relais2 == true) {
digitalWrite(4, true);
} else {
digitalWrite(4, false);
} // Spieler 1 beendet
if (Taster == true && Switch1 == false) {
Switch1 = true;
}
if (Taster == false && Switch1 == true) {
Switch1 = false;
Relais1 = false;
Relais2 = true;
}
Da passt deine Beschreibung nicht zum Sketch.
eine Taste, 8 Ausgänge? Mit jedem Tastendruck um einen Ausgang weiterschalten?
ist es das was du brauchst?
Hallo,
vorausgesetzt die Reihenfolge geht immer von Relais1 bis Relay8.
Dann könntest du für die Ausgänge ein Array anlegen und mittest dem Taster von 0-7 zälhen. Dabei ist der Zähler dann der Index für das Array.
das geht dann alles in einer for... Schleife
Alle Ausgänge vorher löschen und dann den mit dem Index auf ein schalten.
nur so als Denkansatz
digitalWrite (Relaispin[index], HIGH);
Heinz
/*
Debounce Buttons OOP
a simple class to check if a button was pressed
debounce without delay, non blocking, and reuseable
https://forum.arduino.cc/t/ablaufsteuerung/1070553/7
to be deleted 2023-02
*/
//-------------------------------------------------------------------------------------------------------------------------- Taster Klasse (Kassenautomat) --------------------------------------------------------------------------------------------------------------------
class Button { // class to debounce switches
const byte buttonPin; // the pin for the button
static constexpr byte debounceDelay = 20; // the debounce time - one value for all buttons (hence "static")
const bool active; // is the button HIGH or LOW active
bool lastButtonState = HIGH; // previous state of pin
byte lastDebounceTime = 0; // previous debounce time (we just need short debounce delay, so the rollover of the byte variable works fine and spares 3 bytes compared to an unsigned long)
public:
Button(byte attachTo, bool active = LOW) : buttonPin(attachTo), active(active) {}
void begin() { // sets the pinMode and optionally activates the internal pullups
if (active == LOW)
pinMode(buttonPin, INPUT_PULLUP);
else
pinMode(buttonPin, INPUT);
}
bool wasPressed() {
bool buttonState = LOW;
byte reading = LOW;
if (digitalRead(buttonPin) == active) reading = HIGH;
if (((millis() & 0xFF ) - lastDebounceTime) > debounceDelay) {
if (reading != lastButtonState && lastButtonState == LOW) {
buttonState = HIGH;
}
lastDebounceTime = millis() & 0xFF; // we store just the last byte from millis()
lastButtonState = reading;
}
return buttonState;
}
};
Button buttonA(A5); // create a button object on this pin, by default, activate internal pullups
constexpr uint8_t outputPin[] {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
constexpr size_t noOfOutput = sizeof(outputPin) / sizeof(outputPin[0]);
size_t actual = 0; // the actual pin
void next()
{
digitalWrite(outputPin[actual], LOW);
actual++;
if (actual >= noOfOutput) actual = 0;
digitalWrite(outputPin[actual], HIGH);
Serial.print(F("activate pin ")); Serial.println(outputPin[actual]);
}
void setup() {
Serial.begin(115200);
Serial.println(F("Start"));
buttonA.begin(); // start button
for (auto &i : outputPin) pinMode(i, OUTPUT);
Serial.println(F("end of setup"));
}
void loop() {
if (buttonA.wasPressed())
next();
}
Hallo
Hier kommt ein Beispiel:
constexpr byte LedPins[] {2, 3, 4, 5, 6, 7, 8, 9};
constexpr byte ButtonPin {A0};
void setup()
{
for (auto LedPin : LedPins) pinMode(LedPin, OUTPUT);
pinMode(ButtonPin, INPUT_PULLUP);
}
void loop()
{
int stateNew = !digitalRead(ButtonPin);
delay (20); // Q&D debouncing
if (stateNew == !digitalRead(ButtonPin))
{
static int stateOld;
if (stateOld != stateNew)
{
stateOld = stateNew;
if (stateNew)
{
static int counter = 0;
for (auto LedPin : LedPins) digitalWrite(LedPin, LOW);
digitalWrite(LedPins[counter], HIGH);
counter = (counter + 1) % sizeof(LedPins);
}
}
}
}
Jetzt fehlt noch ein Beispiel in Standard C programmiert
puuh!
Das sagt mir jetzt zum teil noch nichts
constexpr byte LedPins???
davon kenne ich garnichts
Genau
Das Forum ist ein Lernportal.
Die Gesamtfunktion ist für einen Anfänger sagen wir mal ... --- ... mittelschwer
Deshalb in Teile zerlegen:
zuerst ein Progrämmchen das nichts weiter macht als den Zustand des Tasters einlesen
und eine LED ein/ausschalten
schön einfach.
Dann lernen wie man im Programm einen Taster entprellt.
gaaanz wichtig. Wenn man das Entprellen weglässt dann werden die Relais nachher
ganz wild klackern und man wird NIEMALS die Relais sauber hintereinander schalten können
Das funktioniert nur wenn man den Taster entprellt
Das kann man zu Fuß programmieren oder eine library benutzen.
Schon wieder neue Begriffe was ist eine library?
Dann ein Progrämmchen das nichts weiter macht als Relais 1 einschalten
eine Sekunde warten Relais 1 ausschalten
dann Relais 2 einschalten
eine Sekunde warten
usw.
Dann diese beiden Programmteile zusammenbringen.
Aus deiner ursprünglichen Frage
vermute ich du hast dir vorgestellt 10 Zeilen Programm und dann hat es sich.
Ne leider nicht. Es sind deutlich mehr Zeilen egal ob mit oder ohne library
Du kannst im Forum hunderte Fragen stellen. Die werden alle beantwortet unter der Bedingung das eigene Mühe und ein Lernfortschritt zu erkennen sind.
Die allereinfachste Variante ist den Befehl
"blockiere den Mikrocontroller vollständig für 1 Sekunde"
mit zu verwenden. Dann wird das Entprellen von dieser Blockierzeit gemacht
Taster einlesen
wenn Taster gedrückt
einen Zähler 1 hochzählen
prüfen ob Zähler bei 9 angekommen ist
wenn ja Zähler zurücksetzen auf 1
alle Relais ausschalten
Relaisnummer X wobei "X" die Zählerzahl ist einschalten
1 Sekunde Codeausführung blockieren
vgs
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.