INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
24.02.2015, 12:19
Beitrag #9
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
Hallo Danke für die Antworten,
ich muss mich entschuldigen, aber irgendwie habe ich keine Benachrichtigung bekommen, dass neue Posts da sind!

Mein Code ist sehr einfach, ich hatte den Teil, wo er merkt, dass er gehalten wird und nur eine Variable hochzählt mit der ich inkrementiere, die Variable erhöht sich und wird automatisch immer größer, ich sage mal Qick & DirtyTongue

Wo ich jetzt drüber gestolpert bin (ohne eure Codes anzusehen, das mache ich gleich):

Wie fange ich es ab, dass wenn ich kurz drücke ein Delay einbaue und wenn ich halte das Delay weglasse, das stört ja?

Also einmal drücken nur um 0.01 erhöhen , länger drücken den Wert mit dem ich inkrementiere immer erhöhen

Hier mein Code:

Code:
const int buttonPin = 8;     // the number of the pushbutton pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status
int lastState =0;
float testvar=0;
float Wert=0.01;

void setup() {
  Serial.begin(9600);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);    
}

void loop(){
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {    
    if (lastState==buttonState) {
      testvar = testvar + Wert;
      Wert=Wert+0.01;
      Serial.print(testvar);
      Serial.print("    ");
      Serial.println(Wert);
    }
    else {
      testvar = testvar + 0.01;
      delay(200);
      //lastState=LOW;
    }
    lastState=buttonState;
}
  else {
    lastState=buttonState;
    Wert=0.01;
  }
}

Danke für Eure hilfe!

Gruß Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 12:39
Beitrag #10
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
ich habe dir doch einen funktionierenden Code gepostet, wieso verwendest du ihn nicht ???
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 13:01
Beitrag #11
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
Hallo HaWe,

wie gesagt war der Code den ich selber hatte, und mal loswerden wollte.
Dein Code funktioniert wunderbar Big Grin, ich muss ihn nur verstehen,
ich bin kein Fan von Copy & Paste, ich möchte auch wissen warum er funktioniert.
Ich schaue ihn mir jetzt an und werde sicher noch einige Fragen habe.

Ich habe das sprintf gesehen, ich habe mich damit am Wochenende rumgeschlagen und bin nicht weiter gekommen, vielleicht kannst du mir da einen Tipp geben ohne dass ich extra einen Thread auf machen muss.

Ich habe eine float-Variable, die möchte ich auf 3 Stellen nach dem Komma "runden" und in einer andere Variable speichern, wie bekomme ich das mit sprinff hin?

Ich habe probiert:
Code:
sprintf (floatVal,"%.3f",zielVal);

Das hat nicht funktioniert, er meinte ich kann Double nicht in Double umwandeln?

Danke Schön für den genialen Code!

Schöne Grüße Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 13:47
Beitrag #12
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
Hi,
das sprintf brauchst Du gar nicht. Jag einfach die Teile einzeln mit Serial.print raus.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 14:28 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 14:41 von facebraker.)
Beitrag #13
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
Hallo Thorsten,

ja das ist klar!
Wegen dem sprintf frage ich wegen einen anderen Problem:
Ich habe einen Glasmaßstab, musst du Dir vorstellen wie eine ca. 40cm lange Aluschiene mit einer Glasskala darin, auf der Skala sind Striche in 5µm Abständen (0,005mm), über diese Schiene wird der Leseschlitten geschoben, bei jedem Teilstrich bekomme ich ein HIGH Signal, also habe ich 5µm bewegt.

Das speichere ich in einer Variable, also die gezählenten Striche/HIGH geteilt durch
200 ergibt den Wert in Millimeter:

Code:
double floatVal=pulses/200.000;

Wenn ich den Inhalt der Variable ausgebe mit :

Code:
Serial.println(floatVal,3);

Wird es korrekt 3 Stellig nach dem Komma angezeigt.
Nun möchte ich die Variable in ein Array umwandeln und die Werte auf einer LED Anzeige darzustellen, da hat die Variable nur 2 Stellen nach dem Komma.

Code:
dtostrf(floatVal, 4, 3, charVal);

Mein Problem wie bekomme ich die Variable floatVal mit 3 Nachkommastellen, da die Idee mit sprintf, würde das gehen?

Danke!

(24.02.2015 12:39)HaWe schrieb:  ich habe dir doch einen funktionierenden Code gepostet, wieso verwendest du ihn nicht ???

Hallo HaWe, dein Code ist einfach genial, er funktioniert perfekt und ist sehr verständlich!
Ich glaube ich hätte noch ewig gegrübelt ehe ich da drauf gekommen wäre, die Zeitfunktion macht einfach mehr Sinn da man prüfen kann ob kurz gedrückt wurde.

Den Wert, den ich immer erhöht habe für das inkrementieren hilft da ja nicht weiter da ich nicht abfangen kann ob nur kurz gedrückt wurde, also die Zeit ist schon richtig!

Vielen vielen Dank, du hast mich echt weiter gebracht!
Wenn ich es implementiert habe, poste ich mal ein Video davon!
Denke, dass ich aber erst am Wochenende mit der Hardware dazu komme!

Danke!

Gruß Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 14:47 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 15:15 von tito-t.)
Beitrag #14
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
sprintf wandelt eine Zahl in einen formatierten String (!) um.

ist float f=1.234567
und ist
char str[10]
ein string (eigentlich ein char-Array mit dem ASCII Wert 0 am Schluss)
dann macht sprintf daraus
sprintf(str,"%.3f", f)
genau was du willst, nämlich die Zeichenfolge "1.234"

ich habe bis jetzt auch einen Float-Patch benutzt wie Hawe, aber angeblich soll das mit dem neuesten Sketch 1.6.0 nicht mehr nötig sein (kA ob das stimmt, ich habe es nicht getestet).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 15:13
Beitrag #15
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
Hallo Tito-t,

würde ja auch passen, ich brauche sowieso ein String-Array um die Zahl auf ein LED Display auszugeben.

Zur Zeit mache ich es mit diese Funktion:

Code:
void DisplayCurrentVal (double curVal)
  {
      lc.clearDisplay(0);
      // Clear display register
      //charsize wird gespeichert wie groß das Array werden soll, es darf werder zu klein noch zu groß werden
      //Die Nach kommastellen bleiben immer gleich 3 Stück
      int charsize;
      if (curVal < -99.99) charsize=8;
      else if (curVal < -9.99) charsize=7;
      else if (curVal < 0) charsize=6;
      else if (curVal < 1) charsize=5;
      else if (curVal < 9.99)charsize=5;
      else if (curVal < 99.99) charsize=6;
      else  charsize=7;

      char charVal[charsize];               //temporarily holds data from vals
      String stringVal = "";     //data on buff is copied to this string
      dtostrf(curVal, 4, 2, charVal);  //4 is mininum width, 3 is precision; float value is copied onto buff
      int i=1;  
      for(int a=sizeof(charVal)-2;a>=0;a--)
      {
        lc.setChar(0,i,charVal[a],false);
        i++;
       }
    
    }

Bitte nicht steinigen, ich weiss dass der Code nicht schön ist, aber ich passe das Array der größe der Zahl an, damit ich beim zählen für das Display mich nicht vertue. ich weiß ich könnte ein Array auch dynamisch anpassen, aber das habe ich nie kapiert :-(

Mit
Code:
lc.setChar(0,i,charVal[a],false);
schreibe ich einzelne Werte auf das Display: i ist die Stelle, charVal[a] der Inhalt des Arrays an der Stelle a und hinten false/true ob mit oder ohne Punkt ausgegeben werden soll.

Live sieht es so aus:

Glasmaßstab mit LED Anzeige

Die Button , die eigentlich Thema waren, sind dafür da einen bestimmten Wert einzustellen.

Danke!

Gruß Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 15:46 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 15:49 von tito-t.)
Beitrag #16
RE: Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen
sprintf formatiert dir jede beliebige Zahl in eine bestimmte Länge.

Hawes Code zeigt im Prinzip schon wie es geht:

wenn du insgesamt 8 Stellen zur Verfügung hast, dann benutze
"%8f" für floats (inkl. Dezimalpunkt) und
"%8d" für Integer.
Die Zahlen werden rechtbündig geschrieben, der Rest sind automatisch Leerzeichen.

Willst du sie linksbündig schreiben, setze ein Minuszeichen vor die Längenangabe, also
"%-8f" für floats (inkl. Dezimalpunkt) und
"%-8d" für Integer.

wenn bei flaots zusätzlich eine feste Nachkommalänge verwendet werden soll, dann setz hinter die 8 noch .3, also
"%8.3f"
das heißt: Gesamtlänge 8 (inkl. Dezimalpunkt), dann 3 Nachkommastellen, bleiben also 4 Dezimalstellen vor dem Komma.
Werden weniger Vorkommastellen gebraucht, sind der Rest wieder Leerzeichen.

Das schönste ist aber die Ausbaufähigkeit für weitere Tricks.
Insgesamt arbeitet es exakt genau so wie printf, aber es schreibt nicht auf den Computer-Bildschirm, sondern speichert in einen String.

http://www.cplusplus.com/reference/cstdio/printf/
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Tastereingang gegen mehrmaliges drücken sperren Haustechno 9 823 13.09.2016 17:47
Letzter Beitrag: garagenloeter
  Arduino lässt sich nicht mehr beschreiben Maxi290997 15 989 07.08.2016 11:40
Letzter Beitrag: Maxi290997
  Gewichteten Durchschnitt berechnen, 20 Werte in fortlaufender Variable speichern TimeMen 10 479 03.07.2016 09:00
Letzter Beitrag: Binatone
  Frage zu One Button in Kombination mit Fast LED Wolfgang_2801 3 241 26.06.2016 22:11
Letzter Beitrag: hotsystems
  2 Tasten drücken damit licht angeht tjard 11 555 19.06.2016 12:24
Letzter Beitrag: hotsystems
  Inhalt einer Variable mit per Virtual Wire versenden toto1975 17 1.774 26.03.2016 18:57
Letzter Beitrag: hotsystems
  Bei Tastendruck ein Ausgang mehr dazu.... hannes77 2 986 07.03.2016 20:48
Letzter Beitrag: hannes77
  Pin anhand Variable schalten ! b3ta 13 828 12.01.2016 08:30
Letzter Beitrag: b3ta
  Library - Variable in Memberfunktion Scheams 1 410 10.01.2016 22:40
Letzter Beitrag: Rene
  Jeffs 4-Way Button Code auf Arduino Leonardo? noxx 17 1.315 16.11.2015 20:30
Letzter Beitrag: noxx

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste