const byte inputPin {2};
const byte outputPin[] {2, 3, 4, 5, 6, 7, };
const byte anzahlPin = sizeof(outputPin) / sizeof(outputPin[1]);
bool gedrueckt = false;
bool lastState = !gedrueckt;
byte step = 0;
void setup()
{
Serial.begin(115200);
pinMode(inputPin, INPUT_PULLUP);
for (byte b = 0; b < anzahlPin; b++)
{
pinMode(outputPin[b], OUTPUT);
digitalWrite(outputPin[b], HIGH);
}
digitalWrite(outputPin[0], LOW);
}
void loop()
{
if (!digitalRead(inputPin))
{
if (lastState == !gedrueckt)
{
lastState = gedrueckt;
for (byte b = 1; b < anzahlPin; b++) // kann evtl. entfallen
{ digitalWrite(outputPin[b], HIGH); }
step++; // nÀchste Stufe auswÀhlen
if (step >= anzahlPin)
{ step = 1; }
digitalWrite(outputPin[step], LOW);
}
}
else if (lastState == gedrueckt)
{
lastState = !gedrueckt;
}
delay(100);
for (byte b = 0; b < anzahlPin; b++) // alles aus machen
{ digitalWrite(outputPin[b], HIGH); }
}
const byte inputPin {8 };
const byte outputPin[] {11, 12, };
const byte anzahlPin = sizeof(outputPin) / sizeof(outputPin[2]);
bool gedrueckt = false;
bool lastState = !gedrueckt;
byte step = 0;
void setup()
{
Serial.begin(10);
pinMode(inputPin, INPUT_PULLUP);
for (byte b = 0; b < anzahlPin; b++)
{
pinMode(outputPin[b], OUTPUT);
digitalWrite(outputPin[b], HIGH);
}
digitalWrite(outputPin[0], LOW);
}
void loop()
{
if (!digitalRead(inputPin))
{
if (lastState == !gedrueckt)
{
lastState = gedrueckt;
for (byte b = 1; b < anzahlPin; b++) // kann evtl. entfallen
{ digitalWrite(outputPin[b], HIGH); }
step++; // nÀchste Stufe auswÀhlen
if (step >= anzahlPin)
{ step = 1; }
digitalWrite(outputPin[step], LOW);
}
}
else if (lastState == gedrueckt)
{
lastState = !gedrueckt;
}
delay(500);
for (byte b = 0; b < anzahlPin; b++) // alles aus machen
{ digitalWrite(outputPin[b], HIGH); }
}
ich möcht Platz sparen und wenn es geht auf einem Board haben UNO3 beide Funktionen
Im englischen Teil des Forum mĂŒssen die BeitrĂ€ge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.
mfg ein Moderator.
combie
June 19, 2025, 9:08pm
3
Wo ist dein Problem?
Ich sehe da 2 Probleme!
2 verschieden Baudraten, wobei die 10 vermutlich ein Problem ist.
die delay.
Am Rande:
Kann man ersetzen durch:
for (auto pin:outputPin)
{
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
}
const byte inputPin {2};
const byte outputPin[] {2, 3, 4, 5, 6, 7, };
const byte anzahlPin = sizeof(outputPin) / sizeof(outputPin[1]);
bool gedrueckt = false;
bool lastState = !gedrueckt;
byte step = 0;
void setup()
{
Serial.begin(115200);
pinMode(inputPin, INPUT_PULLUP);
for (auto pin:outputPin)
{
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
}
digitalWrite(outputPin[0], LOW);
}
void loop()
{
if (!digitalRead(inputPin))
{
if (lastState == !gedrueckt)
{
lastState = gedrueckt;
for (byte b = 1; b < anzahlPin; b++) // kann evtl. entfallen
{ digitalWrite(outputPin[b], HIGH); }
step++; // nÀchste Stufe auswÀhlen
if (step >= anzahlPin)
{ step = 1; }
digitalWrite(outputPin[step], LOW);
}
}
else if (lastState == gedrueckt)
{
lastState = !gedrueckt;
}
delay(100);
for (byte b = 0; b < anzahlPin; b++) // alles aus machen
{ digitalWrite(outputPin[b], HIGH); }
}
const byte inputPin {8 };
const byte outputPin[] {11, 12, };
const byte anzahlPin = sizeof(outputPin) / sizeof(outputPin[2]);
bool gedrueckt = false;
bool lastState = !gedrueckt;
byte step = 0;
void setup()
{
Serial.begin(10);
pinMode(inputPin, INPUT_PULLUP);
for (auto pin:outputPin)
{
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
}
digitalWrite(outputPin[0], LOW);
}
void loop()
{
if (!digitalRead(inputPin))
{
if (lastState == !gedrueckt)
{
lastState = gedrueckt;
for (byte b = 1; b < anzahlPin; b++) // kann evtl. entfallen
{ digitalWrite(outputPin[b], HIGH); }
step++; // nÀchste Stufe auswÀhlen
if (step >= anzahlPin)
{ step = 1; }
digitalWrite(outputPin[step], LOW);
}
}
else if (lastState == gedrueckt)
{
lastState = !gedrueckt;
}
delay(500);
for (byte b = 0; b < anzahlPin; b++) // alles aus machen
{ digitalWrite(outputPin[b], HIGH); }
}
Funktioniert leider nicht
uwefed
June 19, 2025, 9:41pm
5
Gib den sketch in Code Tags (Befehlsleiste im Editorfenster)
Formattiere den Sketch in der IDE mit der automatikfunktion.
Wieso generierst Du ein Array mit 3 Elementen und benutzt nur 2?
Wieso schaust Du wie groĂ das 3 Elenent ist?
GrĂŒĂe Uwe
combie
June 19, 2025, 9:45pm
6
Das letzte Komma ist irrelevant.
Erlaubt, aber nicht erforderlich.
In manchen Situationen sogar sehr sehr hilfreich.
uwefed
June 19, 2025, 10:33pm
7
Also ein Array mit 2 Elementen?
dann ist aber outputPin[2] etwas auĂerhalb des Arrays.
GrĂŒĂe Uwe
combie
June 19, 2025, 10:48pm
8
Du meinst hier:
Eigentlich ja, aber auch nicht.
Es ist eher verwirrend, als falsch,
Vollkommen konform mit der Zeiger Arithmetik, welche ja Ăquivalent zur Arraysyntax ist
Es erfolgt dort kein Zugriff auf die Zelle. Auswertung zur Kompilezeit.
GrundsÀtzlich halte ich nichts von solchen arrayCount Dingern mit sizeof.
Damit schieĂt man sich zu schnell ins Bein.
Mittlerweile haben wir bessere Möglichkeiten das zu tun,
Beispiel:
template<typename T, size_t N>
constexpr size_t arrayCount(T(&)[N])
{
return N;
}
Auch zur Kompilezeit, kein Code wird generiert, wirkt wie ein Literal.
Damit schiesst Du Dir ins Knie, wenn Du nur ein Element hast.
Du startest falsch.
Das erste Element hat die Ordnungszahl 0.
Was ist denn der Kram, der hier kommt?
Das kompiliert doch nicht.
Benutze doch bitte STRG-T in der IDE und hier Codetags. Du bist doch nu schon ein paar Tage dabei.
const byte inputPin {2};
const byte outputPin[] {2, 3, 4, 5, 6, 7, };
const byte anzahlPin = sizeof(outputPin) / sizeof(outputPin[0]);
bool gedrueckt = false;
bool lastState = !gedrueckt;
byte step = 0;
void setup()
{
Serial.begin(115200);
pinMode(inputPin, INPUT_PULLUP);
for (auto pin : outputPin)
{
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
}
digitalWrite(outputPin[0], LOW);
}
void loop()
{
if (!digitalRead(inputPin))
{
if (lastState == !gedrueckt)
{
lastState = gedrueckt;
for (byte b = 1; b < anzahlPin; b++) // kann evtl. entfallen
{ digitalWrite(outputPin[b], HIGH); }
step++; // nÀchste Stufe auswÀhlen
if (step >= anzahlPin)
{ step = 0; }
digitalWrite(outputPin[step], LOW);
}
}
else if (lastState == gedrueckt)
{
lastState = !gedrueckt;
}
delay(100);
for (byte b = 0; b < anzahlPin; b++) // alles aus machen
{ digitalWrite(outputPin[b], HIGH); }
}
PS: Das auswerten der ZustÀnde gedrueckt und !gedrueckt macht bei Dir keinen Sinn, wenn Du das debounce dabei weglÀsst....
Hallo klaki1968 ,
erzÀhl mal mit einfachen Worten was das Programm machen soll und beschreibe es so einfach wie möglich.
ACH, noch was...
klaki1968:
const byte inputPin {2};
const byte outputPin[] {2, 3, 4, 5, 6, 7, };
Du benutzt einen PIN als INPUT UND OUTPUT....
Das wird nicht funktionieren.
Und ich hab jetzt vermutlich auch verstanden, was Du da machen willst.
const bool gedrueckt = true;
const uint32_t debounceTime {100};
struct A
{
const byte inputPin;
bool lastState;
byte step;
uint32_t pressTime;
uint32_t holdTime;
byte outputPins;
const byte outputPin[];
};
A y {9, !gedrueckt, 0, 0, 500, 2, {10, 11,}};
A z {8, !gedrueckt, 0, 0, 100, 6, {2, 3, 4, 5, 6, 7,}};
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
pinMode(y.inputPin, INPUT_PULLUP);
pinMode(z.inputPin, INPUT_PULLUP);
for (byte b = 0; b < y.outputPins; b++)
{
pinMode(y.outputPin[b], OUTPUT);
digitalWrite(y.outputPin[b], LOW);
}
for (byte b = 0; b < z.outputPins; b++)
{
pinMode(z.outputPin[b], OUTPUT);
digitalWrite(z.outputPin[b], LOW);
}
}
void loop()
{
checkStep(y);
checkStep(z);
}
void checkStep(A &xx)
{
if (!digitalRead(xx.inputPin))
{
if (xx.lastState != gedrueckt)
{
xx.lastState = gedrueckt;
xx.pressTime = millis();
xx.step++;
if (xx.step >= xx.outputPins)
{ xx.step = 0; }
for (byte b = 0; b < xx.outputPins; b++)
{ digitalWrite(xx.outputPin[b], xx.step == b ? HIGH : LOW); }
}
}
else if (xx.lastState == gedrueckt)
{
if (millis() - xx.pressTime > debounceTime)
{ xx.lastState = !gedrueckt; }
}
if (digitalRead(xx.outputPin[xx.step]))
{
if (millis() - xx.pressTime > xx.holdTime)
{ digitalWrite(xx.outputPin[xx.step], LOW); }
}
}
@combie ... kannst du mir bitte "einfach" erklĂ€ren wie der Kompiler in meinem Beispiel fĂŒr N auf die 5 kommt ?
ist das nur weil der Kompiler das template selber auflöst und somit das N / die ArraygröĂe ermittelt kann?
so hab ich es probiert (und komm richtigerweise auf 5):
int arr[] {0, 1, 2, 3, 4};
template<typename T, size_t N>
constexpr size_t arrayCount(T(&)[N]) {
return N;
}
void setup() {
Serial.begin(115200);
size_t size = arrayCount(arr);
Serial.println(size);
}
void loop() {
// put your main code here, to run repeatedly:
}
Hallo zusammen, danke euch vielmals fĂŒr eure Hilfe. Ich habe 2 Boards mit einmal Relaisschaltung mit einer Taste die ,die Funktion hat 5 Relais nacheinander zu schalten und das 2 Board schaltet ein Relais fĂŒr 500 Millisekunden. und beide Boards funktionieren perfekt. Nun möchte ich es auf einem Bord haben so das Pin2 die AusgĂ€nge 2- 7 schaltet und Pin 8 den Ausgang 12 schaltet . Jedes Board hat ein Taster , also möchte ich das auf einem Board 2 Taster meine Funktionen steuern.
combie
June 20, 2025, 9:44am
14
Nochmal:
Wo ist dein Problem das umzusetzen?
combie
June 20, 2025, 10:03am
15
Die Funktion bekommt das Array als Referenz Parameter ĂŒbermittelt.
Der ArrayType beinhaltet auch die Anzahl Zellen.
[with T = const unsigned char [6]]
C++ erlaubt uns viele solcher Dinge mit Typen anzustellen.
Die Anzahl da raus zu picken ist nur eins von vielen.
Siehe dazu auch "C++ Type Traits"
#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation fĂŒr "Arme"
const byte outputPin[] {2, 3, 4, 5, 6, 7, };
template<typename T>
const char* parameterTypZeiger(T&)
{
return __PRETTY_FUNCTION__;
}
void setup()
{
Serial.begin(9600);
cout << F("Start: ") << F(__FILE__) << endl;
cout << parameterTypZeiger(outputPin) << endl;
}
void loop()
{
}
1 Like
Was sind denn die AusgĂ€nge 2 bis 7 fĂŒr Pins?
Das sind aber mehr als einer.
Ich habe das gemacht, was Du wolltest.
Offensichtlich stimmt Deine Aufgabenstellung nicht.
Klar wird das funktionieren. Nur wenn du nicht liest was dir geschrieben wird und das machst, kann das alles nicht funktionieren.
Du erwartest Hilfe aber ignorierst entsprechende BeitrÀge.
Sorry, habe jetzt erst wieder Zeit fĂŒr mein Projekt. In meinem ersten Post habe ich beide Programme die funktionieren eingestellt , die sind auf 2 Boards . jetzt will ich die auf einem Board haben , aber wenn ich von dem 2. Board die Daten kopiere, und die dann auf das 1. mit einfĂŒgen tue , dann habe ich Fehlermeldungen. das ist mein Problem, Ich muss auch sagen das ich das Programmieren noch nicht so gut kann. Aber ich danke allen die sich die Zeit nehmen mir zu helfen.
Die Relais sollen nur geschaltet werden wenn die Taste gedrĂŒckt wird und beim loslassen wieder aus gehen. Ich möchte das PIn 2 die AusgĂ€nge 3-7 schaltet nacheinander bei jedem Tastendruck erster druck schaltet Relais 1 und beim 2. Tastendruck das Relais 2 und so weiter. Das 6. Relais soll mit dem 2 . Taster Pin 8 angesteuert werden mit Ausgang pin 12
combie
June 20, 2025, 6:30pm
20
klaki1968:
, aber wenn ich von dem 2. Board die Daten kopiere, und die dann auf das 1. mit einfĂŒgen tue , dann habe ich Fehlermeldungen.
Diese Meldungen kann man lesen und dann auch beheben.
Das kannst nur du Àndern.
Wir können das nicht.
klaki1968:
das ist mein Problem,
Dein Problem scheint eher zu sein dass du hier keinen (dummen?) findest, der/die/das deine Arbeit macht.