folgendes möchte ich gerne umsetzen.
Insgesamt sollen 4 Relais mit je einem Taster ein und ausgeschaltet werden, also jedes Relais bekommt einen eigenen Taster.
Verwendet wird ein Relaisboard wo an die Pins der Relais Ground gelegt wird damit sie schalten.
Das ganze funktioniert soweit ganz gut, aber:
Ich möchte das alle Relais aus sind wenn der Arduino gestartet hat, und erst das drücken der Taste
ein Relais einschaltet
Folgenden Sketch benutze ich dafür, er ist aus einem Beispiel hier im Forum abgeleitet.
#define taster1 2
#define taster2 3
#define taster3 4
#define taster4 5
#define led1 10
#define led2 11
#define led3 12
#define led4 13
#define Entprellzeit 15 //Entprellzeit für den Taster in ms
bool led_state1, taster1_state, taster1_state_alt;// Variablendeklaration (global)
bool led_state2, taster2_state, taster2_state_alt;// Variablendeklaration (global)
bool led_state3, taster3_state, taster3_state_alt;// Variablendeklaration (global)
bool led_state4, taster4_state, taster4_state_alt;// Variablendeklaration (global)
static uint32_t Entprell_zeit;
void setup() {
pinMode(taster1, INPUT_PULLUP);
pinMode(taster2, INPUT_PULLUP);
pinMode(taster3, INPUT_PULLUP);
pinMode(taster4, INPUT_PULLUP);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
}
void loop() {
if (millis()-Entprell_zeit>Entprellzeit){
taster1_state = digitalRead(taster1); //einlesen des Tasters
}
if (taster1_state != taster1_state_alt) // bei Pegelwechsel
{
Entprell_zeit=millis();
if(!taster1_state)//wenn Taster gedrückt
{
led_state1 = !led_state1;//Ausgang wechseln
digitalWrite(led1,led_state1);}
taster1_state_alt = taster1_state; // state aktualisieren
}
if (millis()-Entprell_zeit>Entprellzeit){
taster2_state = digitalRead(taster2); //einlesen des Tasters 2
}
if (taster2_state != taster2_state_alt) // bei Pegelwechsel
{
Entprell_zeit=millis();
if(!taster2_state)//wenn Taster gedrückt
{
led_state2 = !led_state2;//Ausgang wechseln
digitalWrite(led2,led_state2);}
taster2_state_alt = taster2_state; // state aktualisieren
}
if (millis()-Entprell_zeit>Entprellzeit){
taster2_state = digitalRead(taster2); //einlesen des Tasters 2
}
if (millis()-Entprell_zeit>Entprellzeit){
taster3_state = digitalRead(taster3); //einlesen des Tasters
}
if (taster3_state != taster3_state_alt) // bei Pegelwechsel
{
Entprell_zeit=millis();
if(!taster3_state)//wenn Taster gedrückt
{
led_state3 = !led_state3;//Ausgang wechseln
digitalWrite(led3,led_state3);}
taster3_state_alt = taster3_state; // state aktualisieren
}
if (millis()-Entprell_zeit>Entprellzeit){
taster4_state = digitalRead(taster4); //einlesen des Tasters
}
if (taster4_state != taster4_state_alt) // bei Pegelwechsel
{
Entprell_zeit=millis();
if(!taster4_state)//wenn Taster gedrückt
{
led_state4 = !led_state4;//Ausgang wechseln
digitalWrite(led4,led_state4);}
taster4_state_alt = taster4_state; // state aktualisieren
}
}//Ende loop
Die Frage ist nun wie bekomme ich es hin, das die Outputs 10 - 13 beim Start auf low gehen und nicht auf High?
Bin für etwas Hilfe dankbar!
Nehme an du hast einen Arduino UNO.
Pin 13 ist problematisch da da ein Led dran hängt und dieses beim Einschalten vom Bootloader angesteuert wird. In Kürze nimm einen anderes Pin.
Zuerst mal mit einem Pulldown Widerstand und dann indem Du zuerst
digitalWrite(Pin, LOW);
PinMode(Pin,OUTPUT);
Wenn Du einen Verbraucher am Pin hast kannst Du Dir den Pulldown Widerstand sparen.
OK, hab das kleingedruckte übersehen. In diesem Fall gilt das gesagte nur mit umgekehrten Logikpegeln. Danke für die Korrektur.
Dann wennschon umgekehrt:
void setup()
{
for (byte b = 0; b < kreise; b++)
{
pinMode(taster[b], INPUT_PULLUP);
digitalWrite(led[b], HIGH);
pinMode(led[b], OUTPUT);
}
}
Zuerst HIGH (in diesem Fall internen Pullupwiderstand einschalten, weil die Pins beim Anschalten Eingänge sind) setzen und dann als Ausgang definieren. Umgekehrt kommt ein kurzer LOW Impuls.
Viele Dank für Eure Antworten!
Das mit der LED an PIN13 wusste ich schon mal, hab es hier aber übersehen, danke für den Hinweis.
Den Rest werde ich ausprobieren und berichten.
Mir war schon klar, das sich der Code auch anders schreiben lässt und so unnötig lang ist.
Allerdings verstehe ich Ihn so noch, für Arrays und ähnliches muss ich noch etwas mehr lernen.
Eine Möglichkeit das zu lernen ist im seriellen Monitor sichtbar zu machen welche Variable wann welchen Wert hat
Hier das Demo-Programm aus Post #4 mit entsprechender Ausgabe auf den seriellen Monitor
Seriellen Monitor anzeigen lassen
baudrate auf 115200 stellen.
Programm flashen
und die Ausgabe im seriellen Monitor studieren
#define maxTaster 4
constexpr byte taster[maxTaster] {2, 3, 4, 5};
constexpr byte led[maxTaster] {10, 11, 12, 13};
constexpr uint32_t Entprellzeit {15}; //Entprellzeit für den Taster in ms
bool lastState[maxTaster] = {false};
uint32_t bounceStart[maxTaster];
void setup() {
Serial.begin(115200);
Serial.println("Setup-Start");
Serial.println();
Serial.println();
for (byte b = 0; b < maxTaster; b++) {
printArrayErklaerung(b);
pinMode(taster[b], INPUT_PULLUP);
digitalWrite(led[b], LOW);
pinMode(led[b], OUTPUT);
digitalWrite(led[b], HIGH);
}
}
void loop() {
for (byte b = 0; b < maxTaster; b++) // frage alles ab
{
if (!digitalRead(taster[b])) // Taste gedrückt?
{
if (!lastState[b]) // vorher nicht gedrückt?
{
lastState[b] = true; // merken, das gedrückt
bounceStart[b] = millis(); // merken, wann ausgelöst
digitalWrite(led[b], !digitalRead(led[b])); // PIN toggeln
}
}
else if (millis() - bounceStart[b] > Entprellzeit)// Taste losgelassen UND BounceTime abgelaufen
{
lastState[b] = false;
}
}
}
void printArrayErklaerung(int Index) {
Serial.println("Defintion ein array mit 4 Elementen");
Serial.println("constexpr byte taster[maxTaster] {2, 3, 4, 5};");
Serial.println("index 0 1 2 3");
Serial.println("array {2, 3, 4, 5};");
Serial.print("b=");
Serial.println(Index);
Serial.print("taster[");
Serial.print(Index);
Serial.println("], INPUT_PULLUP);");
Serial.print("array-element [");
Serial.print(Index);
Serial.print("] enthält die Zahl ");
Serial.println(taster[Index]);
Serial.println("das bedeutet die Codezeile");
Serial.println("pinMode(taster[b], INPUT_PULLUP);");
Serial.println("macht letztendlich");
Serial.print("pinMode(");
Serial.print(taster[Index]);
Serial.println(", INPUT_PULLUP);");
Serial.println();
Serial.println();
}