Mit einem Taster 3 Funktionen durchschalten und mit einem die Funktion bestätige

Hallo

und zwar ich habe folgendes Problem. Ich möchte gerne einen Taster haben mit dem ich ein Programm auswählen kann. Heist wenn ich diesen Taster einmal drücke soll er auf das erste Programm springen. beim 2. mal auf das 2. und beim 3. mal auf das 3. Jedes Programm würde ich gerne mit einem anderen Taster bestätigen. Heist ich möchte z.B. Programm 3 starten dann drücke ich den einen Taster 3 mal und bestätige mit dem anderen.

Kann mir da jemand weiter helfen? Bin echt am verzweifeln und bekomme kein programm auf die Kette:

Hallo,

Also sowas: Program-Vorwahl auswählen 1,2,3 , start Button.

Du must die Flanke des Tasters erkennen und entprellen , damit kannst Du dann eine Variable zählen lassen. 1,2,3, wenn sie 3 ist und du dückst nochmal springt sie wieder auf 1. Dann kannst Du mit select case verzweigen, und mit dem zweiten Taster dann ausführen wenn der gedrück ist. Ist ja sowas wie Start. Irgendwie musst Du dir nann noch anzeigen lassen wo die Vorwahl gerade steht, dazu kannst Du im einfachten Fall drei LED´s nehmen .

Heinz

Hast du dafür einen Beispielsketch?
Ich habe vor damit nachher 2 Motoren mit einem PWM Signal zu steuern.

  1. Programm Motor 1 an
  2. Programm Motor 2 an
  3. Programm Motor 1&2 an

Die Taster habe ich entprellt mit einem Widerstand auf die Minusleitung.

/// https://forum.arduino.cc/index.php?action=dlattach;topic=675418.0;attach=355763
#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>
#include <CombieTypeMangling.h>

using namespace Combie::Millis;


using WahlTaster         = Combie::Pin::TasterGND<2>; // Taster zwischen Pin und GND(invertierend)
using BestaetigungTaster = Combie::Pin::TasterGND<3>; // Taster zwischen Pin und GND(invertierend)
using Counter            = Combie::Tools::Counter<byte>;

Counter            counter;
WahlTaster         wahlTaster; 
BestaetigungTaster bestaetigungTaster;

Combie::Timer::EntprellTimer     bestaetigungEntprell {20_ms};
Combie::Timer::EntprellTimer     wahlEntprell         {20_ms};
Combie::Tools::FlankenErkennung  bestaetigungFlankenerkennung;
Combie::Tools::FlankenErkennung  wahlFlankenerkennung;

const byte wahlMoeglichkeiten = 4;
byte programm = 0;

void setup() 
{
  Serial.begin(9600);
  wahlTaster.initPullup();
  bestaetigungTaster.initPullup();
  counter.onCount( [](Counter &counter)   // Lambda Funktion
                   {
                     if(counter >= wahlMoeglichkeiten) counter.reStart();
                     Serial.print("Auswahl: ");
                     Serial.println(counter);
                   }
                 );
  Serial.print("Programm: ");
  Serial.println(programm);
}

void loop() 
{
  counter = wahlFlankenerkennung = wahlEntprell = wahlTaster;
  
  if(bestaetigungFlankenerkennung = bestaetigungEntprell = bestaetigungTaster)
  {
    programm = counter;
    Serial.print("Programm: ");
    Serial.println(programm);
  }
}

bolli951:
Die Taster habe ich entprellt mit einem Widerstand aus die Minusleitung.

Mit einem Widerstand kannst du keinen Taster entprellen.
Da brauchst du auch einen Kondensator zu.
Besser ist, du machst es im Sketch.

combie:

/// https://forum.arduino.cc/index.php?action=dlattach;topic=675418.0;attach=355763

#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>
#include <CombieTypeMangling.h>

using namespace Combie::Millis;

using WahlTaster        = Combie::Pin::TasterGND<2>; // Taster zwischen Pin und GND(invertierend)
using BestaetigungTaster = Combie::Pin::TasterGND<3>; // Taster zwischen Pin und GND(invertierend)
using Counter            = Combie::tools::Counter;

Counter            counter;
WahlTaster        wahlTaster;
BestaetigungTaster bestaetigungTaster;

Combie::timer::EntprellTimer    bestaetigungEntprell {20_ms};
Combie::timer::EntprellTimer    wahlEntprell        {20_ms};
Combie::tools::FlankenErkennung  bestaetigungFlankenerkennung;
Combie::tools::FlankenErkennung  wahlFlankenerkennung;

const byte wahlMoeglichkeiten = 4;
byte programm = 0;

void setup()
{
  Serial.begin(9600);
  wahlTaster.initPullup();
  bestaetigungTaster.initPullup();
  counter.onCount( [](Counter &counter)  // Lambda Funktion
                  {
                    if(counter >= wahlMoeglichkeiten) counter.reStart();
                    Serial.print("Auswahl: ");
                    Serial.println(counter);
                  }
                );
  Serial.print("Programm: ");
  Serial.println(programm);
}

void loop()
{
  counter = wahlFlankenerkennung = wahlEntprell = wahlTaster;
 
  if(bestaetigungFlankenerkennung = bestaetigungEntprell = bestaetigungTaster)
  {
    programm = counter;
    Serial.print("Programm: ");
    Serial.println(programm);
  }
}

combie:

/// https://forum.arduino.cc/index.php?action=dlattach;topic=675418.0;attach=355763

#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>
#include <CombieTypeMangling.h>

using namespace Combie::Millis;

using WahlTaster        = Combie::Pin::TasterGND<2>; // Taster zwischen Pin und GND(invertierend)
using BestaetigungTaster = Combie::Pin::TasterGND<3>; // Taster zwischen Pin und GND(invertierend)
using Counter            = Combie::tools::Counter;

Counter            counter;
WahlTaster        wahlTaster;
BestaetigungTaster bestaetigungTaster;

Combie::timer::EntprellTimer    bestaetigungEntprell {20_ms};
Combie::timer::EntprellTimer    wahlEntprell        {20_ms};
Combie::tools::FlankenErkennung  bestaetigungFlankenerkennung;
Combie::tools::FlankenErkennung  wahlFlankenerkennung;

const byte wahlMoeglichkeiten = 4;
byte programm = 0;

void setup()
{
  Serial.begin(9600);
  wahlTaster.initPullup();
  bestaetigungTaster.initPullup();
  counter.onCount( [](Counter &counter)  // Lambda Funktion
                  {
                    if(counter >= wahlMoeglichkeiten) counter.reStart();
                    Serial.print("Auswahl: ");
                    Serial.println(counter);
                  }
                );
  Serial.print("Programm: ");
  Serial.println(programm);
}

void loop()
{
  counter = wahlFlankenerkennung = wahlEntprell = wahlTaster;
 
  if(bestaetigungFlankenerkennung = bestaetigungEntprell = bestaetigungTaster)
  {
    programm = counter;
    Serial.print("Programm: ");
    Serial.println(programm);
  }
}

Gibt es hierzu eine kurze Erläuterung und kurze info wo ich die Biblioteken finden kann?

Rate mal, wozu die URL oben drin steht.
Wieso zitierst Du das 2 Mal?

Gruß Tommy

#include <CombieTypeMangling.h>

das nimmt er bei mir nicht als Bibliothek also es wird nicht orange hinterlegt

Die Farbe ist irrelevant!
Dafür gibts einfach nur noch keinen keywords.txt Eintrag.

Das tut der Funktionalität keinen Abbruch.

Das größere Problem ist, dass deine Aufgabenbeschreibung zwar verständlich und einfach, aber kaum ausreichend ist.

  • Woran erkennst du, wie oft du den Wahlschalter gedrückt hast? Was also beim Drücken von Start passieren wird?
  • Passiert was, wenn du Start mehrfach drückst?
  • Wie kriegst du die Motoren wieder aus?

-also das mit dem erkennen würde ich gerne mit leds regeln
-wenn ich den das 2. mal drücke wäre es mega wenn der Motor wieder ausgehen würde.

Hast du die PinNummern richtig eingetragen?

Wie sind deine Taster geschaltet?

habe den fehler gefunden

wie kann ich in dem Falle 3 LEDs (Programm 1 2 3 ) einfügen. Bzw. nicht wie sondern wo

Hallo,

ne Beispiel hab ich keines zur Hand, aber fang doch einfach mal mit dem Zählen an.
eventuell so

Heinz

const byte btnpin = 2;
bool merker, btnstat;
byte count = 1;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(btnpin, INPUT_PULLUP);
}

void loop() {
  // put your main code here, to run repeatedly:
  btnstat = !digitalRead(btnpin);
  delay(10); // zum entprellen geht das mal hier
  
  if ( btnstat & !merker) {
    merker = true;
    count++;
    if (count == 4) count = 1;
    Serial.println(count);
  }
  if (!btnstat)merker = false;
}

Inzwischen hast Du ja schon eine komplett Lösung

bolli951:
habe den fehler gefunden

wie kann ich in dem Falle 3 LEDs (Programm 1 2 3 ) einfügen. Bzw. nicht wie sondern wo

/// https://forum.arduino.cc/index.php?action=dlattach;topic=675418.0;attach=355763
#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>
#include <CombieTypeMangling.h>

using namespace Combie::Millis;
using namespace Combie::Helper;


using WahlTaster         = Combie::Pin::TasterGND<2>; // Taster zwischen Pin und GND(invertierend)
using BestaetigungTaster = Combie::Pin::TasterGND<3>; // Taster zwischen Pin und GND(invertierend)
using Counter            = Combie::Tools::Counter<byte>;


Counter            wahlCounter;
Counter            bestaetigungCounter;
WahlTaster         wahlTaster; 
BestaetigungTaster bestaetigungTaster;

Combie::Timer::EntprellTimer     bestaetigungEntprell {20_ms};
Combie::Timer::EntprellTimer     wahlEntprell         {20_ms};
Combie::Tools::FlankenErkennung  bestaetigungFlankenerkennung;
Combie::Tools::FlankenErkennung  wahlFlankenerkennung;

byte programm = 0;
const byte ledPins[] {
                       13 , // Alles aus
                       12 , // Programm Motor 1 an
                       11 , // Programm Motor 2 an
                       10 , // Programm Motor 1&2 an
                     };
               
void tueLed()
{
  for(unsigned i = 0;i<arrayCount(ledPins);i++)
    digitalWrite(ledPins[i],i==programm);
}

void setup() 
{
  Serial.begin(9600);
  for(const byte pin:ledPins)pinMode(pin,OUTPUT);
  wahlTaster.initPullup();
  bestaetigungTaster.initPullup();
  wahlCounter.onCount( [](Counter &counter)   // Lambda Funktion
                   {
                     if(counter >= arrayCount(ledPins)) counter.reStart();
                     Serial.print("Auswahl: ");
                     Serial.println(counter);
                   }
                 );
  bestaetigungCounter.onCount( [](Counter &counter)   // Lambda Funktion
                   {
                     if(counter >= 2) counter.reStart();
                     programm = counter?wahlCounter:0;
                     tueLed();
                   }
                 );
                 
  tueLed();
}

void loop() 
{
  wahlCounter         = wahlFlankenerkennung         = wahlEntprell         = wahlTaster;
  bestaetigungCounter = bestaetigungFlankenerkennung = bestaetigungEntprell = bestaetigungTaster;
}

EDIT: kleine Änderungen

Super ihr seit echt der Hammer danke jetzt noch eine kurze frage bekomme ich das hier dort auch eingebaut

int PWM_PIN = 6;
int pwmval = 0;

void setup()
{
Serial.begin(9600);
pinMode(PWM_PIN,OUTPUT);
Serial.println("Send a value between 1 and 255");
}

void loop()

Serial.print("Set Speed to: ");
Serial.println(pwmval);
analogWrite(PWM_PIN, pwmval);
Serial.println("done!");
}

DANKE DANKE DANKE nochmals Combie

Gerne geschehen....

jetzt noch eine kurze frage bekomme ich das hier dort auch eingebaut

Ich habe jetzt keine Lust mehr das weiter ein- oder umzubauen.
Genug der Salamitaktik.

Ich rate dir:
Schaffe dir ein schönes, dickes und modernes C++ Buch an.
Denn: "Programmieren lernen" geht über "Die Sprache lernen" und "Üben. Viel üben."

Ich beantworte dir gerne Fragen.
Aber mit Code vorkauen ist es jetzt genug.

Ne alles gute danke aber kann man das einfach so da einbauen

Bzw kannst du mir ein Buch empfehlen

aber kann man das einfach so da einbauen

Denke schon...
Wenn man Leds schalten kann, dann wird man auch Motore spielen lassen können.

Bzw kannst du mir ein Buch empfehlen

Ich finde dieses ganz nett.

void loop() {

Serial.print("Set Speed to: ");
      Serial.println(pwmval);
      analogWrite(PWM_PIN, pwmval);
      Serial.println("done!");
}

Klar bekommt man das eingebaut, aber das willst du nicht.

loop() braucht keine Zeit und kommt unendlich oft dran. im Idealfall