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?