Hilfe bei Sketch

Guten Abend,

Ich habe folgendes Problem.

Ich möchte einen Motor mit einem Taster An- und Ausschalten mit diesen Sketch:

#include "OneButton.h"

bool geschaltet = false;
int LED33=3;
int LED45=4;
int LEDpower=5;
int RPM33=6;
int RPM45=7;
const int power=8;
int RelaisRPM= 9;
const int Relaispower=10;
OneButton button(power, false); 


void setup() {
 pinMode(LED33, OUTPUT);
 pinMode(LED45, OUTPUT);
 pinMode(LEDpower, OUTPUT);
 pinMode(RelaisRPM, OUTPUT);
 pinMode(Relaispower, OUTPUT);
 pinMode(RPM33, INPUT);
 pinMode(RPM45, INPUT);
 pinMode(power, INPUT);

 button.attachClick(clickedIt);
}

void loop() {
button.tick();

delay(10);
}


void clickedIt() {
ledState = !ledState;
digitalWrite(Relaispower, ledState);
digitalWrite(LEDpower, ledState);
}

Das funktioniert auch Problemlos, aber ich will jetzt mit dem zweiten Taster ein zweites Relais einschalten und mit dem dritten Taster das Relais wieder ausschalten. Also so eine Art Wechselschaltung.
Diese Schaltung soll aber erst gehen wenn das erste Relais angezogen hat also wenn der Motor läuft.

Ich wollte diese Schaltung hinzufügen:

#include "OneButton.h"

bool geschaltet = false;
int LED33=3;
int LED45=4;
int LEDpower=5;
int RPM33=6;
int RPM45=7;
const int power=8;
int RelaisRPM= 9;
const int Relaispower=10;
OneButton button(power, false); 


void setup() {
 pinMode(LED33, OUTPUT);
 pinMode(LED45, OUTPUT);
 pinMode(LEDpower, OUTPUT);
 pinMode(RelaisRPM, OUTPUT);
 pinMode(Relaispower, OUTPUT);
 pinMode(RPM33, INPUT);
 pinMode(RPM45, INPUT);
 pinMode(power, INPUT);

 button.attachClick(clickedIt);
 int tasterstatus-1=0;
 int tasterstatus-2=0;
 
 

}

void loop() {
button.tick();

delay(10);
}


void clickedIt() {
ledState = !ledState;
digitalWrite(Relaispower, ledState);
digitalWrite(LEDpower, ledState);
digitalWrite(LED33, ledState);
}

tasterstatus-1=digitalRead(RPM45);
if (tasterstatus-1 == HIGH)
{
digitalWrite(RelaisRPM, HIGH);
digitalWrite(LED45, HIGH);
digitalWrite(LED33, LOW);

}
else
{
tasterstatus-2=digitalRead(RPM33);
if (tasterstatus-2 == LOW)
{
digitalWrite(RelaisRPM, LOW);
digitalWrite(LED33, HIGH);
}

Die LED33 und LED45 sind LEDs an den Tastern die jeweils leuchten sollen wenn der Taster betätigt wird.

Ich glaube Ich habe einen größeren Denkfehler in diesem Sketch. Vielleicht könnte Mir da jemand helfen was ich genau da falsch mache.

Ich entschuldige mich schon im voraus wegen meinen Fragen :o

Lg

Michi

wo ist deine Funktion button.tick() und wo rufst du die Funktion clickedIt() auf?
Ps. ich habe gerade gesehen das die Funktionen zu OneButton Library gehören.

a)
Variable names in Visual C++ can range from 1 to 255 characters. To make variable names portable to other environments stay within a 1 to 31 character range.

All variable names must begin with a letter of the alphabet or an
underscore( _ ). For beginning programmers, it may be easier to begin all variable names with a letter of the alphabet.

After the first initial letter, variable names can also contain letters and numbers. No spaces or special characters, however, are allowed.

Uppercase characters are distinct from lowercase characters. Using all uppercase letters is used primarily to identify constant variables.

You cannot use a C++ keyword (reserved word) as a variable name.

Quelle: Data Basics - Naming Variables

b)
drück mal STRG-T zum formatieren in deiner IDE

c)
a und b werden dir zeigen, dass das nicht macht was du dir wünscht:

int tasterstatus-1=0;

tasterstatus-2=digitalRead(RPM33);

Danke für die Antwort. Die OneButton Funktion ist ja für das erste Relais. Das über den ersten Taster ein und aus geschaltet wird, was auch funktioniert. Ich habe das Sketch ja so noch nicht geschrieben weil ich mir schon dachte das es bestimmt nicht funktioniert, ich habe bis jetzt es nur hin gekriegt eine Schaltung zu schreiben und nicht zwei gleichzeitig. Ich glaube ich werde nochmal ganz von vorne anfangen müssen,mich durch die ganzen Internet Seiten mit den verschiedenen Funktionen durcharbeiten müssen.

Eigentlich ist das nur ein einmaliges Projekt mit dem Arduino weil ich gerade ein Plattenspieler baue und damit nur den Plattenspieler einschalten will und mit ein Relais zwischen zwei Potis schalten muss um die Geschwindigkeit einzustellen.

Dachte halt das es mit ein Mikrocontroller einfach geht. Also sry nochmal, Ich weiß das regt dann viele Leute auf wenn man als Anfänger Fragen stellt. Die Leute denken dann gleich das man das als selbstverständlich meint eine Antwort zu kriegen und das die Probleme dann gleich gelöst sind. Aber das will ich selbst nicht, Ich würde das auch gerne selbst machen aber hänge jetzt schon eine Weile daran.
Wenn ich das nicht hinkriege muss ich es halt auf die Altmodische Art machen Schütz Schaltung :smiley:

Gruß

Michi

Natürlich kann man per µC die gleichen Logik-Schaltungen realisieren, die Zauberkünstler wie du trickreich mit Relais oder Schützen realisieren.

Halt mit einem komplett anderen Denk-Ansatz. ( Auch anders als mit SPS-Programmierung ).

Ich glaube, @Michi_Moses, du hast noiasca's Einwand nicht verstanden. Er wollte dir nur vorsichtig andeuten, dass z.B.

int tasterstatus-1=0;

völlig unverständlicher Unsinn ist. (Vermutlich nur wegen des Minus-Zeichens)
Wenn du Variable definieren willst, kannst du das, wenn es denn sein muss, mit

int tasterstatus_1;
int tasterstatus_2;

machen, und deren Wert evtl. und an passender Stelle mit

tasterstatus_1 = digitalRead(RPM45);
tasterstatus_2 = digitalRead(RPM33);

setzen.

Ist nur leider bei dir an einer unpassenden Stelle, ausserhalb jeder Funktionsdefinition.

Ich kenne nun deine OneButton Library nicht, kann daher nur raten, dass die Funktion clickedIt() jedesmal und nur dann und nur einmal drankommt, wenn der Taster an Pin 8 (power) betätigt wurde.

Wenn tatsächlich nur dann etwas passieren soll, und ansonsten Änderungen der Pins 6 und 7 ( RPM33 / RPM 45 ) ignoriert werden sollen, ist dein Programm fast richtig, ausser dass deine Klammern nicht nur in der Anzahl nicht stimmen, sondern wohl auch in der Reihenfolge.

Deinen ersten Beitrag interpretiere ich allerdings etwas anders, d.h. wenn der Motor an ist, sollen die zwei Taster immer abgefragt werden. (Richtig?) Dann käme dein Code-Fragment eher in loop() unter...

#include "OneButton.h"

bool geschaltet = false; // true: Motor an, Taster RPM33/45 aktiv

// Pinbelegungen
const int LED33=3;
const int LED45=4;
const int LEDpower=5;

const int RPM33=6;
const int RPM45=7;
const int power=8;
const int RelaisRPM= 9;
const int Relaispower=10;

OneButton button(power, false);


void setup() {
 pinMode(LED33, OUTPUT);
 pinMode(LED45, OUTPUT);
 pinMode(LEDpower, OUTPUT);
 pinMode(RelaisRPM, OUTPUT);
 pinMode(Relaispower, OUTPUT);
 pinMode(RPM33, INPUT_PULLUP);
 pinMode(RPM45, INPUT_PULLUP);
 pinMode(power, INPUT);  // braucht externen Pulldown-Widerstand

 button.attachClick(clickedIt);
}

void loop() {
  button.tick();
  if (geschaltet) checkSpeed();
  delay(10);
}


void clickedIt() {
 geschaltet = !geschaltet;
 digitalWrite(Relaispower, geschaltet);
 digitalWrite(LEDpower, geschaltet);
}

void checkSpeed() {
  // beide Taster => 33, kein Taster => unverändert
  if (digitalRead(RPM33) == LOW) setSpeed(LOW);
  else if (digitalRead(RPM45) == LOW) setSpeed(HIGH);
}

void setSpeed(bool speed) { 
  // true = 45 = RelaisRPM HIGH 
  digitalWrite(RelaisRPM, speed);
  digitalWrite(RPM45, speed);
  digitalWrite(RPM33, !speed);
}

Ich hab mal, anders als in deinem Versuch, beide Taster als PullUp ( LOW = betätigt ) angenommen

michael_x:
Natürlich kann man per µC die gleichen Logik-Schaltungen realisieren, die Zauberkünstler wie du trickreich mit Relais oder Schützen realisieren.

Halt mit einem komplett anderen Denk-Ansatz. ( Auch anders als mit SPS-Programmierung ).

Ich glaube, @Michi_Moses, du hast noiasca's Einwand nicht verstanden. Er wollte dir nur vorsichtig andeuten, dass z.B.

völlig unverständlicher Unsinn ist. (Vermutlich nur wegen des Minus-Zeichens)
Wenn du Variable definieren willst, kannst du das, wenn es denn sein muss, mit

int tasterstatus_1;

int tasterstatus_2;



machen, und deren Wert evtl. und *an passender Stelle* mit 


tasterstatus_1 = digitalRead(RPM45);
tasterstatus_2 = digitalRead(RPM33);



setzen.

Ist nur leider bei dir an einer unpassenden Stelle, ausserhalb jeder Funktionsdefinition.

Ich kenne nun deine OneButton Library nicht, kann daher nur raten, dass die Funktion clickedIt() jedesmal und nur dann und nur einmal drankommt, wenn der Taster an Pin 8 (power) betätigt wurde. 

Wenn tatsächlich nur dann etwas passieren soll, und ansonsten Änderungen der Pins 6 und 7 ( RPM33 / RPM 45 ) ignoriert werden sollen, ist dein Programm fast richtig, ausser dass deine Klammern nicht nur in der Anzahl nicht stimmen, sondern wohl auch in der Reihenfolge. 

Deinen ersten Beitrag interpretiere ich allerdings etwas anders, d.h. wenn der Motor an ist, sollen die zwei Taster immer abgefragt werden. (Richtig?) Dann käme dein Code-Fragment eher in loop() unter...




#include "OneButton.h"

bool geschaltet = false; // true: Motor an, Taster RPM33/45 aktiv

// Pinbelegungen
const int LED33=3;
const int LED45=4;
const int LEDpower=5;

const int RPM33=6;
const int RPM45=7;
const int power=8;
const int RelaisRPM= 9;
const int Relaispower=10;

OneButton button(power, false);

void setup() {
pinMode(LED33, OUTPUT);
pinMode(LED45, OUTPUT);
pinMode(LEDpower, OUTPUT);
pinMode(RelaisRPM, OUTPUT);
pinMode(Relaispower, OUTPUT);
pinMode(RPM33, INPUT_PULLUP);
pinMode(RPM45, INPUT_PULLUP);
pinMode(power, INPUT); // braucht externen Pulldown-Widerstand

button.attachClick(clickedIt);
}

void loop() {
button.tick();
if (geschaltet) checkSpeed();
delay(10);
}

void clickedIt() {
geschaltet = !geschaltet;
digitalWrite(Relaispower, geschaltet);
digitalWrite(LEDpower, geschaltet);
}

void checkSpeed() {
// beide Taster => 33, kein Taster => unverändert
if (digitalRead(RPM33) == LOW) setSpeed(LOW);
else if (digitalRead(RPM45) == LOW) setSpeed(HIGH);
}

void setSpeed(bool speed) {
// true = 45 = RelaisRPM HIGH
digitalWrite(RelaisRPM, speed);
digitalWrite(RPM45, speed);
digitalWrite(RPM33, !speed);
}



Ich hab mal, anders als in deinem Versuch, beide Taster als PullUp ( LOW = betätigt ) angenommen

Vielen Dank für die Antwort.

Also gedacht war es so, wenn der Motor gestartet hat über den ersten Taster dann kann ich erst die anderen zwei Taster betätigen. Das heißt wenn der Motor startet ist das zweite Relais noch aus aber die Meldeleuchte für die 33Rpm soll leuchten. Wenn ich den Taster 45Rpm drücke soll das Relais auf den Poti umschalten das der Motor mit 45Rpm läuft. Eigentlich wollte ich so eine Art Wechselschaltung machen mit den zwei Taster 33Rpm und 45Rpm. Ist den sowas möglich mit Taster? Weil ich habe lange gesucht um ein Sketch zu finden wo ich mit einen Taster Ein und Ausschalten kann.

Hier ein Bild zum Aufbau

Lg

Michi

Michi_Moses:
Eigentlich wollte ich so eine Art Wechselschaltung machen mit den zwei Taster 33Rpm und 45Rpm. Ist den sowas möglich mit Taster? Weil ich habe lange gesucht um ein Sketch zu finden wo ich mit einen Taster Ein und Ausschalten kann.

Hi, ja das geht, das Suchwort ist hier "toggle"
Ich habe hier gerade einen Sketch offen, bei dem ich einen Taster zum umschalten verwende, der Codeschnipsel:

DiodeStatus = digitalRead(RELtaster);
      if (DiodeStatus != LastDiodeStatus)
      {
        if (DiodeStatus == LOW)
        {
          digitalWrite(ledPin, HIGH);
          delay(50);
          digitalWrite(ledPin, LOW);
        }
        if (DiodeStatus == HIGH)
        {
          if (LEDstatus == HIGH)
          {
            LEDstatus = LOW;
            Serial.println(F("LED LOW [R=2k Ohm]"));
          }
          else
          {
            LEDstatus = HIGH;
            Serial.println(F("LED HIGH [R=200 Ohm]"));
          }
        }
        LastDiodeStatus = DiodeStatus;
    }

... hier ist mehr Code drin als Du brauchst um das zu bewerkstelligen!
Den Taster verwende ich mehrfach in unterschiedlicher Bedeutung, je nach Routine im Programm.
Die Variablen DiodeStatus und LEDstatus sind evtl verwirrend, in meinem Programm ergibt es aber Sinn.

Gruß André

Ist den sowas möglich mit Taster?

Mit Software ist "alles" möglich.
Mein Beispiel (kompiliert, aber ungetestet) sollte eigentlich das genau machen (ausser direkt beim Einschalten des Motors die 33RPM Led einzuschalten, aber das lass ich dir, als Bonus-Aufgabe)

Auch ist noch offen, was passieren soll, wenn der Motor ausgeschaltet wird:
Bleibt das 33/45 Relais evtl. angezogen?
Zeigen die LED immer die Stellung des Relais an?
Warum nimmst du dann dafür überhaupt mehrere Pins?

michael_x:
Mit Software ist “alles” möglich.
Mein Beispiel (kompiliert, aber ungetestet) sollte eigentlich das genau machen (ausser direkt beim Einschalten des Motors die 33RPM Led einzuschalten, aber das lass ich dir, als Bonus-Aufgabe)

Auch ist noch offen, was passieren soll, wenn der Motor ausgeschaltet wird:
Bleibt das 33/45 Relais evtl. angezogen?
Zeigen die LED immer die Stellung des Relais an?
Warum nimmst du dann dafür überhaupt mehrere Pins?

Hi habe es jetzt mal getestet mit deinem Sketch. Die Taster funktionieren erst wenn der Motor läuft, so soll das auch sein. Nur das Relais bleibt nur angezogen wenn der Taster gedrückt bleibt. Der dritte Taster hat leider keine Funktion dann.
Das Relais soll dann auch abschalten wenn der Motor wieder aus ist. Ich nehme mehrere Pins dafür da ich den Controller auf eine eigene Platine die ich erstelle drauf löte und die anderen Pins dann nicht mehr brauche. Er wird ja fest eingebaut.
Genau die LEDs zeigen an ob der Motor auf 33RPM läuft oder auf 45Rpm läuft. Also wenn ich den Taster 45RPM drücke muss diese LED von dem Taster angehen und das Relais anziehen. Wenn ich dann 33RPM drücke soll das Relais aus gehen und die LED45RPM an den Taster 45RPM auch. Die LED 33RPM am Taster 33RPM soll dann wieder leuchten.

Habe ich meine Frage falsch gestellt? Bin jetzt momentan ein wenig verwirrt deswegen :confused:

Gruß

Michi

Habe ich meine Frage falsch gestellt? Bin jetzt momentan ein wenig verwirrt deswegen :confused:

Nö. Nur ist jede Aufgabenbeschreibung unvollständig, und wird auch gern nicht komplett überlegt.

Also wenn ich den Taster 45RPM drücke muss diese LED von dem Taster angehen und das Relais anziehen. Wenn ich dann 33RPM drücke soll das Relais aus gehen und die LED45RPM an den Taster 45RPM auch. Die LED 33RPM am Taster 33RPM soll dann wieder leuchten.

Klar, aber nur wenn der Motor läuft, richtig :

Die Taster funktionieren erst wenn der Motor läuft, so soll das auch sein.

Dass beim Einschalten des Motors das RPM Relais aus bleibt, und du daher gern die 33RPM LED leuchten hättest, kam erst später auf …
Und wenn der Motor ausgeschaltet wird an dem OneButton - Taster
… passiert nix, d.h. Relais bleibt an, LED bleiben wie sie sind, aber die Taster 33/45 werden danach ignoriert.

Wenn du das nicht willst, sondern dass bei Motor aus z.B. das RPMRelais abfällt und beide LED ausgehen, muss das in die Aufgabenbeschreibung und in die Programmierung rein. (Mach mal, wenn du das so willst)

Was passieren soll bei Tastern, wenn man diese länger gedrückt hält, oder beide drückt, ist ein ähnliches -generell gern undefiniertes- Thema.

Was direkt nach dem Strom Einschalten passieren soll, kann übrigens auch ein Thema sein.

Der dritte Taster hat leider keine Funktion dann.

Welches ist "der dritte Taster"?

das Relais bleibt nur angezogen wenn der Taster gedrückt bleibt

digitalWrite(RPMRelais, ... ); kommt eigentlich nur in setSpeed vor, und das sollte nur aufgerufen werden, während ein Taster gedrückt ist. Wäre die Frage, warum das Relais abfällt, wenn der Taster 45RPM losgelassen wird ( so verstehe ich dein Problem jedenfalls ).

Deine Hardware hat keiner da, da müsstest du schon selber sehen, was passiert.
Zum Testen gibt es noch Serial Testausgaben und die eingebaute LED auf Pin13 ...

Zum Glück hast du mit dem delay(10); ja ein sehr gemütliches System:

  • Entprellte Taster,
  • so langsam, dass man LEDs blitzen sehen kann,
  • so schnell, dass auf Taster sofort reagiert wird.
    (Nur in jedem Loop-Durchlauf eine Ausgabe auf Serial wäre etwas viel)

Also mit dritten Taster meine ich den 33RPM Taster. Wenn der 45RPM Taster gedrückt wird zieht das Relais auch an aber fällt wieder ab wenn ich den los lasse. Achso da ist ja einiges zu beachten beim Programmieren :open_mouth:
Ich habe gedacht das es sich in der Art dann programmieren lässt wie bei SPS, halt in der Programmiersprache von Arduino.

Also was muss ich jetzt dann alles in Programm hinzufügen? Ist das ein größerer Akt dann mit mein Vorhaben?

Gruß

Michi

Die Arduino-Sprache ist C++.
( Mit ein paar Vereinfachungen: statt main() definierst du die Funtionen void setup() und void main() und kriegst ein bisschen was automatisch generiert. )

Generell gibt es zwei Ansätze :

  • C++ lernen, möglichst aus einem richtigen Buch
  • Beispiele aus der IDE und aus dem Internet ansehen, nachbauen, verstehen, spielen (= verändern und immer noch verstehen)

Beide Ansätze parallel wäre mein Vorschlag.


SPS-Programmierung (STEP, LOGO o.ä.) ist was ganz anderes.

Hallo habe es jetzt geschafft das so zu programmieren wie Ich das wollte.

Danke nochmal Michael X für deine Hilfe :slight_smile:

Aber jetzt ist noch ein kleines Problem wie du schon erwähnt hast.

Also die Funktion:

  • Motor wird mit Taster 1 eingeschaltet und aus
  • Mit Taster 33RPM und 45RPM kann ich das Relais und die LEDs jeweils ein und ausschalten und die Taster gehen
    erst wenn der Motor gestartet wurde.

Nur das Problem wenn ich jetzt auf 45RPM umschalte und den Motor ausschalte bleibt das RelaisRPM und die LED 45 RPM noch eingeschaltet. Was müsste ich den noch am Programm ändern?
Es passiert zwar auch nichts wenn ich beide Taster 33 und 45 zusammen drücke, kann man trotzdem eine Tasterverriegelung machen?

Hier mein Sketch

#include "OneButton.h"

bool geschaltet = false; // true: Motor an, Taster RPM33/45 aktiv

// Pinbelegungen
const int LED33=3;
const int LED45=4;
const int LEDpower=5;

const int RPM33=6;
const int RPM45=7;
const int power=8;
const int RelaisRPM= 9;
const int Relaispower=10;

OneButton button(power, false);

void setup() {
pinMode(LED33, OUTPUT);
pinMode(LED45, OUTPUT);
pinMode(LEDpower, OUTPUT);
pinMode(RelaisRPM, OUTPUT);
pinMode(Relaispower, OUTPUT);
pinMode(RPM33, INPUT_PULLUP);
pinMode(RPM45, INPUT_PULLUP);
pinMode(power, INPUT); // braucht externen Pulldown-Widerstand

button.attachClick(clickedIt);
}

void loop() {
button.tick();
if (geschaltet) checkSpeed();
delay(10);
}

void clickedIt() {
geschaltet = !geschaltet;
digitalWrite(Relaispower, geschaltet);
digitalWrite(LEDpower, geschaltet);
digitalWrite(LED33, geschaltet);
}

void checkSpeed() {
// beide Taster => 33, kein Taster => unverändert
if (digitalRead(RPM45)) digitalWrite(RelaisRPM, HIGH);
if (digitalRead(RPM45)) digitalWrite(LED45, HIGH);
if (digitalRead(RPM45)) digitalWrite(LED33, LOW);
if (digitalRead(RPM33)) digitalWrite(RelaisRPM, LOW);
if (digitalRead(RPM33)) digitalWrite(LED45, LOW);
if (digitalRead(RPM33)) digitalWrite(LED33, HIGH);
}

void setSpeed(bool speed) {
// true = 45 = RelaisRPM HIGH
digitalWrite(RelaisRPM, speed);
digitalWrite(RPM45, speed);
digitalWrite(RPM33, !speed);
digitalWrite(LED45, speed);
}

Gruß

Michi

z.B. indem du dir den sketch ansiehst und eine Stelle findest, die wohl das machen würde was du willst, wenn sie so aussähe:

if (geschaltet) checkSpeed();
else setSpeed(LOW);

das sollte sich fast von selbst erklären
(Motor eingeschaltet werden die Taster geprüft und behandelt, ausgeschaltet ist immer wie 33RPM)...

Oder du schaltest dann alle drei auf LOW : LED33RPM, LED45RPM, RPMRelais

So wie du fragst, noch ein Hinweis:
Wenn man mehrere Sachen zusammenfassen will, nimmt man { geschweifte Klammern } in if oder else Zweigen ...

michael_x:
z.B. indem du dir den sketch ansiehst und eine Stelle findest, die wohl das machen würde was du willst, wenn sie so aussähe:

if (geschaltet) checkSpeed();

else setSpeed(LOW);




das sollte sich fast von selbst erklären 
(Motor eingeschaltet werden die Taster geprüft und behandelt, ausgeschaltet ist immer wie 33RPM)...

Oder du schaltest dann alle drei auf LOW : LED33RPM, LED45RPM, RPMRelais

So wie du fragst, noch ein Hinweis: 
Wenn man mehrere Sachen zusammenfassen will, nimmt man { geschweifte Klammern } in if oder else Zweigen ...

Vielen Dank Michael :slight_smile:

Funktioniert jetzt :slight_smile:

Lg

Michi