Ja, dat kan. Maar dan wordt het al snel onoverzichtelijk, en je maakt gemakkelijk foutjes. Dan is het beter om de variabelen te bundelen in een class. En dan zou ik alle logica ook binnen die class bouwen.
Met zo een class kun je zoveel strings maken als je analoge poorten hebt.
Dat zou dan zo kunnen werken:
code:
class ANALOG_BUTTON
{
public:
void setup(int PinNr)
{ m_PinNr = PinNr;
}
bool check(int &Action)
{
if(m_Timer != millis())
{ m_Timer = millis();
int NewValue = analogRead(m_PinNr);
if(m_Counter < 0)
{ if(near(NewValue,0))
m_Counter += 1;
}
else
{ if( near(NewValue, m_LastValue) )
{ const int MaxDebounce = 50;
if( m_Counter < MaxDebounce)
{ // Same value multiple times in a row
m_Counter += 1;
}
else
{ Action = decodeButton(m_LastValue);
if(Action != 0)
{ m_Counter = -50;
return true;
}
}
}
else
{ // Value has changed. Register new value and restart counter.
m_LastValue = NewValue;
m_Counter = 0;
}
}
}
return false;
}
bool near(int x1, int x2)
{ int Margin = 20;
return ((x1 > (x2 - Margin)) && (x1 < (x2 + Margin)) );
}
int decodeButton(int AnalogValue)
{ // - Assuming a resistor ladder of 9 equal resistors.
static const int Table[] =
{ 1024 * 0 / 9,
1024 * 1 / 9,
1024 * 2 / 9,
1024 * 3 / 9,
1024 * 4 / 9,
1024 * 5 / 9,
1024 * 6 / 9,
1024 * 7 / 9,
1024 * 8 / 9,
1024 * 9 / 9,
};
for(int i = 0; ; i++)
{ if(i >= 10)
{ return 0;
}
if(near(AnalogValue, Table[i]))
{ return i;
}
}
}
int m_PinNr;
unsigned long m_Timer;
int m_LastValue;
int m_Counter;
};
ANALOG_BUTTON Button1;
ANALOG_BUTTON Button2;
ANALOG_BUTTON Button3;
void setup()
{
Serial.begin(9600);
Button1.setup(A1); // Button1 uses analog pin A1
Button2.setup(A2); // Button2 uses analog pin A2
Button3.setup(A3); // Button3 uses analog pin A3
}
void loop()
{
int Action;
if(Button1.check(Action))
{ Serial.print("- Button 1, Action "); Serial.println(Action);
if(Action == 1)
{ // Code voor Button1 Action 1
}
if(Action == 2)
{ // Code voor Button1 Action 2
}
}
if(Button2.check(Action))
{ Serial.print("- Button 2, Action "); Serial.println(Action);
if(Action == 1)
{ // Code voor Button2 Action 1
}
if(Action == 2)
{ // Code voor Button2 Action 2
}
}
if(Button3.check(Action))
{ Serial.print("- Button 3, Action "); Serial.println(Action);
if(Action == 1)
{ // Code voor Button3 Action 1
}
if(Action == 2)
{ // Code voor Button3 Action 2
}
}
}
[Bericht gewijzigd door deKees op dinsdag 17 december 2019 01:25:35 (84%)