Prüfen welcher Button gedrückt wurde

Hallo,

ich bin gerade dabei eine eigene Klasse für Analoge Buttons zu schreiben.

Nun sind alle 4 Buttons an A2 geschaltet und vor jedem ist ein Widerstand, somit erhalte ich bei analogRead(2) immer andere Werte.

Nun muss von diesem ausgehend entschieden werden, welcher Button gedrückt wurde.
Jedoch soll es nur als boolean Wert zum schluss übergeben werden.

Wie würde ich das am besten machen?

  int b, c = 0;
  c = analogRead(pin);
  if (c > 1000)
  {
    b = 0;
  }
  else if (c > 10 && c < 31)
  {
    b = 1;
  }
  else if (c > 60 && c < 81)
  {
    b = 2;
  }
  else if (c > 110 && c < 131)
  {
    b = 3;
  }
  else if (c > 150 && c < 181)
  {
    b = 4;
  }
  return b;

Bisher sieht es wie folgt aus:

MyButton.h

#ifndef MyButton_h
#define MyButton_h
#include "Arduino.h"

class MyButton
{
	public:
		MyButton(uint8_t pin);
		void begin();
		bool read();
		bool toggled();
		bool pressed();
		bool released();
		bool has_changed();

		const static bool PRESSED = LOW;
		const static bool RELEASED = HIGH;

	private:
		uint8_t  _pin;
		uint16_t _delay;
		bool     _state;
		bool     _has_changed;
		uint32_t _ignore_until;
};

#endif

MyButton.cpp

#include "MyButton.h"
#include <Arduino.h>

MyButton::MyButton(uint8_t pin)
:  _pin(pin)
,  _delay(500)
,  _state(HIGH)
,  _ignore_until(0)
,  _has_changed(false)
{
}

void MyButton::begin()
{
	pinMode(_pin, INPUT_PULLUP);
}

bool MyButton::read()
{
	if (_ignore_until > millis())
	{
	}

	else if (analogRead(_pin) != _state)
	{
		_ignore_until = millis() + _delay;
		_state = !_state;
		_has_changed = true;
	}

	return _state;
}

bool MyButton::toggled()
{
	read();
	return has_changed();
}

bool MyButton::has_changed()
{
	if (_has_changed == true)
	{
		_has_changed = false;
		return true;
	}
	return false;
}

bool MyButton::pressed()
{
	if (read() == PRESSED && has_changed() == true)
		return true;
	else
		return false;
}

bool MyButton::released()
{
	if (read() == RELEASED && has_changed() == true)
		return true;
	else
		return false;
}

Hallo,

wenn da noch mehr dazu gehören sollte, dann bietet sich ein struct an. Bsp.

// Struktur Deklaration
struct Button  {     // Typname "Button"
     bool one = false;
     bool two = false; 
} Taster;            // Strukturvariable "Taster"

dann greifste mit

Taster.one = true;
Taster.two = true;

darauf zu oder änderst den bool status in deiner analogen Abfrage o.ä.

Eine Funktion habe ich gefunden wie es geht:

/*button = readButtons(2);
  lcd.clear();
  if (button == LEFT)
  {
    lcd.setCursor(0, 2);
    lcd.print("Button ");
    lcd.print("LEFT");
  }
  else if (button == UP)
  {
    lcd.setCursor(0, 2);
    lcd.print("Button ");
    lcd.print("UP");
  }
  else if (button == DOWN)
  {
    lcd.setCursor(0, 2);
    lcd.print("Button ");
    lcd.print("DOWN");
  }
  else if (button == RIGHT)
  {
    lcd.setCursor(0, 2);
    lcd.print("Button ");
    lcd.print("RIGHT");
  }
  else {
    lcd.setCursor(0, 2);
    lcd.print("Press a Button");
  }

Nun lasse ich allerdings bei setup() eine UI bauen

do_UI();

void do_UI()
{
    char cursor_pos = 4;
    SET_TO_BEGINNING();
    lcd.print(" mode DS N Tm Go");
    print_mode(current_mode);
    print_DS();
    print_nickname_en();
    print_blackout_mode();
    while(1)
    {
        if(button == RIGHT)
            cursor_pos = (cursor_pos + 1) % 5;
        if(button == LEFT)
        {
            cursor_pos - 1 < 0 ? cursor_pos = 5 : cursor_pos;
            cursor_pos = (cursor_pos - 1) % 5;
        }
        print_cursor(cursor_pos);

        switch(cursor_pos)
        {
            case CURSOR_MODE:
            if(button == UP)
                current_mode = (current_mode + 1) % MODE_NUM;
            if(button == DOWN)
            {
                current_mode - 1 < 0 ? current_mode = MODE_NUM : current_mode;
                current_mode = (current_mode - 1) % MODE_NUM;
            }
            print_mode(current_mode);
            break;

            case CURSOR_DARK_THRESHOLD:
            if(button == UP)
                dark_threshold >= 60 ? dark_threshold : dark_threshold += 5;
            if(button == DOWN)
                dark_threshold <= 10 ? dark_threshold : dark_threshold -= 5;
            print_DS();
            break;

            case CURSOR_NICKNAME:
            if(button == UP || button == DOWN)
                nickname_enabled = (nickname_enabled + 1) % 2;
            print_nickname_en();
            break;

            case CURSOR_BLACKOUT_MODE:
            if(button == UP)
                blackout_mode = (blackout_mode + 1) % 5;
            if(button == DOWN)
            {
                blackout_mode - 1 < 0 ? blackout_mode = 5 : blackout_mode;
                blackout_mode = (blackout_mode - 1) % 5;
            }
            print_blackout_mode();
            break;

            case CURSOR_RUN:
            if(button == UP || button == DOWN)
                return;

            current_mode == CLONE_MODE ? check_screen_delay_enabled = 0 : check_screen_delay_enabled = 1;
        }
    }
}

wie kann ich dort nun checken ob der ">" sich verändern muss, da das im setup ja nur einmalig ausgeführt wird

Hallo,

ich dachte du wolltest mit bool arbeiten?
Was möchtest auf > abfragen, kann dir aktuell nicht folgen?