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
combie
July 27, 2017, 4:40pm
9
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.