Frage zu einem Arduino Befehl

Abend zusammen

beim anschauen diverser Programme hier bin ich auf einem Befehl gestolpert den ich nirgends nachschlagen konnte....

und zwar

Auszug...
if (state==HIGH && myButtons[i].down==false && labs(millis()
...

was mich interessiert wäre was labs(millis) bedeutet

Hallo,
ist eine und-Bedingung, beide Seiten müssen wahr sein.

millis() ist ein Arduino-IDE Schlüsselwort
labs ist kein Arduino-IDE Schlüsselwort, selbst gestrickt.

Ohne Sketch wirst Du nicht dahinterkommen. Ne´ Klammer fehlt auch.
Gruß und Spaß
Andreas

Joe-muc:
Abend zusammen

beim anschauen diverser Programme hier bin ich auf einem Befehl gestolpert den ich nirgends nachschlagen konnte....

und zwar

Auszug...

if (state==HIGH && myButtons[i].down==false && labs(millis()
...




was mich interessiert wäre was **labs(millis)** bedeutet

Wenn du den kompletten Sketch postest, wäre es deutlicher.

Das wird eine Variable sein.

klar kein ding

#define BUTTONTYPE INPUT_PULLUP  // INPUT or INPUT_PULLUP
struct debouncedButton {byte pin; unsigned long lastChanged; boolean down; boolean pressed;};

debouncedButton myButtons[]={
  {2,0,false,false}, // pin-2
  {3,0,false,false}, // pin-3
  {4,0,false,false}, // pin-4
  {5,0,false,false}, // pin-5
  {6,0,false,false}, // pin-6
};

#define NUMBUTTONS sizeof(myButtons)/sizeof(myButtons[0])
#define DEBOUNCETIME 5

void initButtons()
{
  for (int i=0; i<NUMBUTTONS; i++)
    pinMode(myButtons[i].pin,BUTTONTYPE); // set button pinMode
}

void setButtons()
{
  for (int i=0; i<NUMBUTTONS; i++)
  {
    myButtons[i].pressed=false;
    boolean state=digitalRead(myButtons[i].pin);
    if (BUTTONTYPE==INPUT_PULLUP) state=!state;
    if (state==HIGH && myButtons[i].down==false && labs(millis()-myButtons[i].lastChanged)>DEBOUNCETIME)
    {
      myButtons[i].lastChanged=millis();
      myButtons[i].down=true;
      myButtons[i].pressed=true;
    }
    else if (state==LOW && myButtons[i].down==true && labs(millis()-myButtons[i].lastChanged)>DEBOUNCETIME)
    {
      myButtons[i].down=false;
      myButtons[i].lastChanged=millis();
    }
  } 
}


void setup() {
  Serial.begin(9600);
  Serial.println("Press any button");
  initButtons();
}


void loop() {
  setButtons();
  for (int i=0; i<NUMBUTTONS; i++)
  {
    if (myButtons[i].pressed)
    {
      Serial.print("Button pressed, Index ");Serial.print(i);
      Serial.print("\tPin ");Serial.println(myButtons[i].pin);
    }
  }
}

bezüglich Arduino Schlüsselwort, wenn ich labs in einem Skech eingebe wird es genauso orange dargestellt wie etwa digitalWrite oder millis etc.....

Hallo,
bei mir nicht...
könnte das sein
Gruß und Spaß
Andreas

Hallo,
ist ja merkwürdig:
gibt Fehler:
int n = dfgs(4009);
gibt keine Fehler
int n = labs(4009);

Gruß und Spaß
Andreas

Ja, das ist die long Version von abs()

Das ist Teil der avr libc:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html

Joe-muc:
bezüglich Arduino Schlüsselwort, wenn ich labs in einem Skech eingebe wird es genauso orange dargestellt wie etwa digitalWrite oder millis etc.....

So ist es gewollt!

Die IDE zeigt das erwartete Verhalten.

Die SyntaxErhellung ist in diversen keywords.txt definiert.
Zu jeder Lib kann eine solche gehören, so wie zum Core auch...
Die Arduino IDE ließt diese Dateien, und erhellt die Worte.

Ist für euch warsch. eine dumme Frage, aber was macht labs in der if-Abfrage?

Nichts sinnvolles, da millis immer unsigned long zurück gibt.

Gruß Tommy

@Joe_Muc: Nein, das ist eine gute Frage.

Man könnte

const unsigned int DEBOUNCETIME=5;

schreiben, um die Warnung zum Vergleich signed / unsigned loszuwerden.

Joe-muc:
Ist für euch warsch. eine dumme Frage, aber was macht labs in der if-Abfrage?

Es wurden zwei verschiedene Dokus verlinkt wo das steht. Einmal die Standard C++ Referenz (welche ein guter Anhaltspunkt ist aber nicht identisch mit der Arduino Software ist) und einmal die AVR libc (die Bibliothek auf welcher die Software basiert).
abs() für den Absolutwert gibt es so in sehr, sehr vielen Programmiersprachen

Aber ja, das ist hier sinnfrei. Es könnte wirklich ein Trick sein um die Warnung zu umgehen. Aber kein guter.