ich bräuchte mal eure Hilfe zum Thema Button

Hallo

ich hab nicht wirklich Ahnung davon, aber könnt ihr mir helfen ich habe ein Sketch versucht zu schrieben leider bin ich am verzweifel. ich habe 4 lager wo ich was ablegen möchte je nach dem wo ich was reinlege soll gezählt werden und möchte das auf dem Display anzeigen lassen.
wenn ich jetzt den Kontakt schließe dann zählt er mal in Raum1 und mal in Raum2. könnt ihr mir da weiter helfen!

//YWROBOT

//Compatible with the Arduino IDE 1.0

//Library version:1.1

#include <Wire.h>

#include <LiquidCrystal_I2C.h>



LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 is the I2C bus address for an unmodified module




// this constant won't change:

const int  Raum1   = 2;   
const int  Raum2   = 3;
const int  Raum3   = 4; 
const int  Raum4   = 5; // the pin that the pushbutton is attached to

const int  Down_buttonPin = 99;



// Variables will change:

int buttonPushCounter1 = 0;   // counter for the number of button presses
int buttonPushCounter2 = 0;
int buttonPushCounter3 = 0;
int buttonPushCounter4 = 0;


int up_buttonState1 = 0;         // current state of the up button
int up_lastButtonState1 = 0;     // previous state of the up button
int up_buttonState2 = 0;         // current state of the up button
int up_lastButtonState2 = 0;     // previous state of the up button
int up_buttonState3 = 0;         // current state of the up button
int up_lastButtonState3 = 0;     // previous state of the up button
int up_buttonState4 = 0;         // current state of the up button
int up_lastButtonState4 = 0;     // previous state of the up button


int down_buttonState = 0;         // current state of the up button
int down_lastButtonState = 0;     // previous state of the up button

bool bPress = false;




void setup()

{

  Serial.begin(9600);

 pinMode( Raum1 , INPUT_PULLUP);
pinMode( Raum2 , INPUT_PULLUP);
pinMode( Raum3 , INPUT_PULLUP);
pinMode( Raum4 , INPUT_PULLUP);
  pinMode( Down_buttonPin , INPUT_PULLUP);

 

  lcd.begin();                      // initialize the lcd

 

  // Print a message to the LCD.
  
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("   z\341hlen        ");
lcd.setCursor(0,1);
lcd.print("  los gehts       ");
delay(500);
lcd.clear();

  lcd.backlight();

  lcd.setCursor(0,0);

  lcd.print(" 1   2   3   4");

  lcd.setCursor(1,1);

  lcd.print(buttonPushCounter1);
  lcd.setCursor(5,1);
lcd.print(buttonPushCounter2);
lcd.setCursor(9,1);
lcd.print(buttonPushCounter3);
lcd.setCursor(13,1);
lcd.print(buttonPushCounter4);


 

}





void loop()

{

   checkRaum1();
   checkRaum2();
   checkRaum3();
   checkRaum4();
   checkDown();



   if( bPress){

       bPress = false;

      lcd.setCursor(2,1);

      lcd.print("       ");

      lcd.setCursor(1,1);
      lcd.print(buttonPushCounter1);
      
      lcd.setCursor(5,1);
      lcd.print(buttonPushCounter2);
      
      lcd.setCursor(9,1);
      lcd.print(buttonPushCounter3);
      
      lcd.setCursor(13,1);
      lcd.print(buttonPushCounter4);
   }

 

}



void checkRaum1()

{

  up_buttonState1 = digitalRead(Raum1);



  // compare the buttonState to its previous state

  if (up_buttonState1 != up_lastButtonState1) {

    // if the state has changed, increment the counter

    if (up_buttonState1 == LOW) {

        bPress = true;

      // if the current state is HIGH then the button went from off to on:

      buttonPushCounter1++;

      Serial.println("on");

      Serial.print("number of button pushes: ");

      Serial.println(buttonPushCounter1);

    } else {

      // if the current state is LOW then the button went from on to off:

      Serial.println("off");

    }

    // Delay a little bit to avoid bouncing

    delay(200);

  }

  // save the current state as the last state, for next time through the loop

  up_lastButtonState1 = up_buttonState1;

}
void checkRaum2()
{
up_buttonState2 = digitalRead(Raum2);



  // compare the buttonState to its previous state

  if (up_buttonState1 != up_lastButtonState1) {

    // if the state has changed, increment the counter

    if (up_buttonState2 == LOW) {

        bPress = true;

      // if the current state is HIGH then the button went from off to on:

      buttonPushCounter2++;

      Serial.println("on");

      Serial.print("number of button pushes: ");

      Serial.println(buttonPushCounter2);

    } else {

      // if the current state is LOW then the button went from on to off:

      Serial.println("off");

    }

    // Delay a little bit to avoid bouncing

    delay(200);

  }

  // save the current state as the last state, for next time through the loop

  up_lastButtonState2 = up_buttonState2;

}

void checkRaum3()

{

  up_buttonState3 = digitalRead(Raum1);



  // compare the buttonState to its previous state

  if (up_buttonState3 != up_lastButtonState3) {

    // if the state has changed, increment the counter

    if (up_buttonState3 == LOW) {

        bPress = true;

      // if the current state is HIGH then the button went from off to on:

      buttonPushCounter3++;

      Serial.println("on");

      Serial.print("number of button pushes: ");

      Serial.println(buttonPushCounter3);

    } else {

      // if the current state is LOW then the button went from on to off:

      Serial.println("off");

    }

    // Delay a little bit to avoid bouncing

    delay(200);

  }

  // save the current state as the last state, for next time through the loop

  up_lastButtonState3 = up_buttonState3;

}
void checkRaum4()
{
up_buttonState4 = digitalRead(Raum2);



  // compare the buttonState to its previous state

  if (up_buttonState4 != up_lastButtonState4) {

    // if the state has changed, increment the counter

    if (up_buttonState4 == LOW) {

        bPress = true;

      // if the current state is HIGH then the button went from off to on:

      buttonPushCounter4++;

      Serial.println("on");

      Serial.print("number of button pushes: ");

      Serial.println(buttonPushCounter4);

    } else {

      // if the current state is LOW then the button went from on to off:

      Serial.println("off");

    }

    // Delay a little bit to avoid bouncing

    delay(200);

  }

  // save the current state as the last state, for next time through the loop

  up_lastButtonState4 = up_buttonState4;

}













void checkDown()

{

  down_buttonState = digitalRead(Down_buttonPin);



  // compare the buttonState to its previous state

  if (down_buttonState != down_lastButtonState) {

    // if the state has changed, increment the counter

    if (down_buttonState == LOW) {

        bPress = true;

      // if the current state is HIGH then the button went from off to on:

      buttonPushCounter1--;

     

      Serial.println("on");

      Serial.print("number of button pushes: ");

      Serial.println(buttonPushCounter1);

    } else {

      // if the current state is LOW then the button went from on to off:

      Serial.println("off");

    }

    // Delay a little bit to avoid bouncing

    delay(50);

  }

  // save the current state as the last state, for next time through the loop

  down_lastButtonState = down_buttonState;

}

Du hast einen Fehler in void checkRaum2():
if (up_buttonState1 != up_lastButtonState1) {
da sollte wohl
if (up_buttonState2 != up_lastButtonState2) {
hin

Ansonsten ist der Sketch auf Grund der vielen Leerzeilen schlecht zu lesen. Bitte korrigieren.

Hallo

Danke für den Hinweis hat mir echt weiter geholfen, Danke
scheinbar sieht man den wald vor lauter Bäumen nicht, hab den Rest auch gleich noch korrigiert.
ich würde gern jetzt noch wollen das er alle Räume zusammen addiert nur da gibt es doch bestimmt auch noch ne Lösung.
kann ich das da irgendwie mit einfügen ?

ich würde gern jetzt noch wollen das er alle Räume zusammen addiert nur da gibt es doch bestimmt auch noch ne Lösung.

Gerade hast du gelernt, das Copy&Paste (Codeduplikate) problematisch ist.
Dass sich schnell Fehler einschleichen beim umnumerieren der Komponenten.
Und dass das menschliche Auge/Gehirn diese Fehler automatisch so korrigiert, dass man sie nicht sieht/wahrnimmt. Im Programm bleiben sie natürlich erhalten, und bauen Mist.

Jetzt verrate ich dir einen Trick:

Das umnummerieren ist unnötig, wenn man die Dinge nicht nummeriert.

Man könnte Arrays verwenden.
Das addieren aller Werte eines Arrays ist kinderleicht.

Das Addieren von diskreten Variablen, durchnummerierten, ist problematisch, weil sich hier wiederum Fehler einschleichen können.

Noch ein Tipp:

Wenn du irgendwas drei mal tust, mache eine Funktion oder Klasse draus.

Hallo,

bin der gleichen Meinung. Warum? Weil sich deine gegebenen Variablen dafür regelrecht anbieten.
Du hast 4 “Einheiten”. Jede Einheit hat 4 Variablen. Jede dieser Variablen hat die gleichen Aufgabe in den Einheiten.
Ich würde für den Anfang zu einem struct tendieren. Dann hast du schon die Vorarbeit für eine spätere Klasse geschaffen. Das fällt dann leichter als wenn du jetzt mit 4 einzelnen Arrays anfängst.

Wenn der DownButton Teilfunktionen der Anderen nutzt, kannste den auch mit Instanzieren.

Ein Bsp. mit struct mit einem kleinen Schritt von einer richtigen Klasse entfernt.

// https://forum.arduino.cc/index.php?topic=670707.0

struct Raum
{
  // default alles public:
  const byte pin;
  bool buttonState;
  bool buttonLastState;
  unsigned long counter;

  // Konstruktor
  Raum (byte p, bool s = HIGH, bool sL = HIGH, unsigned long c = 0) :
    // Initialisierungsliste
    pin{p},
    buttonState{s},
    buttonLastState{sL},
    counter{c}
  {}
};

//Array anlegen, Indexnummer entspricht einem Raum.
Raum raum [] = {
  {2},                 // Pinnummer
  {3},
  {4, HIGH, HIGH, 0},  // so nicht notwendig, weil gleich der Defaulteinstellung im Konstruktor
  {5, LOW, LOW, 99},   // bei Abweichungen von default notwendig
  {99}                 // optionaler Downbutton
};

const byte ANZAHL_RAEUME = sizeof(raum) / sizeof(Raum);

void setup(void)
{
  Serial.begin(9600);

  // alle Pins in einem Aufwasch konfigurieren
  for (byte i = 0; i < ANZAHL_RAEUME; ++i)
  {
    pinMode(raum[i].pin, INPUT_PULLUP);
  }

  // Testausgaben
  Serial.println(ANZAHL_RAEUME);
  for (byte i = 0; i < ANZAHL_RAEUME; ++i)
  {
    Serial.print(raum[i].pin);
    Serial.print(',');
  }
}

void loop(void)
{

}

Kannste verwenden, kannste ausbauen, kannste links liegen lassen, kannste zur reinen struct Datenstruktur zurückbauen, kannste zur Klasse ausbauen, wie auch immer.

Oder man macht’s ‘arduino like’ und nutzt eine Lib :wink: . Dann wird’s kürzer:

//YWROBOT
//Compatible with the Arduino IDE 1.8.10

#include <MobaTools.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27 is the I2C bus address for an unmodified module

// this constants won't change:
enum : byte { Raum1, Raum2, Raum3, Raum4, Down_buttonPin };
const byte buttonPins[] = {2, 3, 4, 5, 99};
const byte buttonCnt = sizeof( buttonPins ); // buttonsPins muss Typ byte sein

//Tasterverwaltung einrichten
MoToButtons myButton( buttonPins, buttonCnt, 20, 500 );

// Variables will change:
int buttonPushCounter[5] ;   // counter for the number of button presses

void setup() {
  Serial.begin(115200);
  lcd.begin();                      // initialize the lcd

  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("   z\341hlen        ");
  lcd.setCursor(0, 1);
  lcd.print("  los gehts       ");
  delay(500);

  lcd.clear();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("  1   2   3   4");
  lcd.setCursor(0, 1);
  lcd.print("  0   0   0   0");
}

void loop() {
  myButton.processButtons();
  char txtBuf[40];

  for ( byte i = 0; i < 4; i++ ) {
    if ( myButton.pressed(i) ) {
      int summe;
      ++buttonPushCounter[i];
      sprintf(txtBuf, "%3d ", buttonPushCounter[i] );
      lcd.setCursor(i * 4, 1);
      lcd.print(txtBuf);
    }
  }
  if ( myButton.pressed(Down_buttonPin) ) {
      //Gesamtsumme ausgeben
      int summe = 0;
      for ( byte i = 0; i < 4; i++) summe = summe + buttonPushCounter[i];
      sprintf(txtBuf, "Gesamtsumme=%d Klicks", summe);
      Serial.println(txtBuf);
  }
}

Kommt halt immer drauf an, ob man eine pragmatische schnelle Lösung sucht, oder ob es ein Übungsobjekt zum Lernen ist 8)

Edit: im Sketch lcd.init wieder zu lcd.begin geändert ( ich habe eine andere lcd-Lib)
Edit2: Tippfehler im Code beseitigt.

Hallo

danke für die antworten

@MicroBahner bei deinem Code bekomme ich immer eine fehler meldung :

test_addieren_B:12:12: error: scalar object ‘buttonPins’ requires one element in initializer

const byte buttonPins = {2, 3, 4, 5,99 };

^~~~~~~~~~

exit status 1
scalar object ‘buttonPins’ requires one element in initializer

was muss ich da noch installieren?

bewussti:
was muss ich da noch installieren?

Gar nichts, ist ein Fehler von meinereiner. Da fehlen 2 Klammern. Hatte ich in meinem Code eigentlich richtig, weshalb die jetzt im Post fehlen... liegt wohl daran, dass ich da eine andere Zeile drin hatte weil ich andere Inputpins nutzen musste. Beim zurückeditieren ist es dann wohl passiert. Richtig ist:

const byte buttonPins[] = {2, 3, 4, 5, 99};

Edit: Eigentlich das erste, was Du dir über die ersten Grundfunktionen hinaus aneignen musst, sind Arrays. Ohne Arrays geht nicht viel, oder Du bist nur noch mit copy/paste/edit beschäftigt ( und dann bei der Fehlersuche wegen vergessenem 'edit' :wink: ). Arrays kommen in jedem Programmier-Lehrbuch deshalb auch sehr früh dran, und die gibt es praktisch in jeder Programmiersprache - selbst in sehr einfachen.
Mit den schon angesprochenen 'struct' kann man zwar auch viel anfangen, und die Programme übersichtlich gestalten. Sind aber erst der 2. Schritt. Und von Klassen will ich jetzt erstmal noch garnicht reden... Wir sollten das Pferd nicht von hinten aufzäumen. Klassen zu nutzen ist das eine - das machst Du mit Arduino praktisch ohne es zu merken. Selbst welche zu erstellen ist eine ganz andere Sache.

das kann ja scheinbar so einfach sein Danke Dir dafür
ich hätte da noch eine Frage dazu, kann ich mir die summe aller Räume auf dem Display anzeigen lassen wenn ich das auf pin 13 lege?

Wie gesagt, lerne wie man Arrays verwendet. Dann kannst du in einer Schleife über die Elemente iterieren und berechnen was du willst

Das steht in dem Code am Ende auch so drin. Das musst du auch lesen und ausprobieren

bewussti:
kann ich mir die summe aller Räume auf dem Display anzeigen lassen wenn ich das auf pin 13 lege?

Grundsätzlich kannst Du dir die Summe natürlich auch auf den LCD ausgeben. So wie es derzeit aufgeteilt ist, fehlt nur der Platz dafür. Aber das kannst Du ja ändern.
Was das aber mit Pin 13 zu tun haben soll ist mir unklar. Was meinst Du damit?

ich meinte mit Pin 13 Steckplatz 13 am Arduino aber das habe ich nun schon hin bekommen das er mir das anzeigt nur das das er dann nicht wieder zurück springt aber da werde ich mich noch dran versuchen.