Taster für Start/Stop

Hallo zusammen,

ich habe ein kleines Problem. Ich möchte mit meinem 1Sheeld / DataLogger gerne Temperatur und Luftfeuchtigkeit aufzeichnen. Dazu habe ich auf meinem Breadboard einen Taster aufgesteckt und einen DHT22. Mehr als einen Taster habe ich nicht zur Verfüfung.

Ich möchte, dass per Taster-Druck die Aufzeichnung startet. Mit einem weiteren Taster-Druck soll die Aufzeichnung stoppen. Die Aufzeichnung startet auch mit dem ersten Taster-Druck. Nur leider endet sie nicht mit dem zweiten Taster-Druck.

Zum Debugging nutze ich das Terminal des 1Sheelds und lasse mir ausgeben, ob der Taster gedrückt ist und darüber hinaus lasse ich mir den Zustand meiner Variablen “startFlag” (bool) ausgeben. Der Taster-Druck wird erkannt, aber startFlag wird nur einmal von 0 auf 1 geändert. Danach leider trotz Taster-Druck nicht mehr zurück. Hier mein Code:

#define DHTPIN 9
#define DHTTYPE DHT22
#define CUSTOM_SETTINGS
#define INCLUDE_TERMINAL_SHIELD
#define INCLUDE_DATA_LOGGER_SHIELD

#include <DHT.h>
#include <OneSheeld.h>
#include <Bounce2.h>

DHT sensor(DHTPIN, DHTTYPE);
int counter = 0;
int buttonPin = 12;
bool startFlag = false;
Bounce bouncer = Bounce();

void setup() {
  // Begin OneSheeld
  OneSheeld.begin();

  // Begin DHT22
  sensor.begin();

  // Setup Bounce2
  pinMode(buttonPin, INPUT);
  bouncer.attach(buttonPin);
  bouncer.interval(5);
}

void loop() {
  // Update bouncer
  bouncer.update();
  
  // Read temperature and humidity 
  float t = sensor.readTemperature();
  float h = sensor.readHumidity();

  if (bouncer.read() == HIGH) {
    if (startFlag == false) {
      startFlag = true;
    }
    else {
      startFlag == false;
    }
  }

  Terminal.print(bouncer.read());
  Terminal.print(" ,");
  Terminal.println(startFlag);

  if (startFlag) {
    Logger.start("2016-12-30_Test");
    Logger.add("Temperature", t);
    Logger.add("Humidity", h);
    Logger.log();
  }
  else {
    Logger.stop();
  }
}

Besonders interessant ist diese Stelle:

if (bouncer.read() == HIGH) {
    if (startFlag == false) {
      startFlag = true;
    }
    else {
      startFlag == false;
    }
  }

Hab ich da irgendwo einen Denkfehler eingebaut? Ich versteh’ nicht, warum das nicht nicht funktioniert :frowning: :frowning:

  1. Also
...
   else {
      startFlag == false;
    }
...

ist nicht richtig.
Es muss heißen:

...
   else {
      startFlag = false;
    }
...

== und = haben in C (und C++) sehr unterschiedliche Bedeutung.
= ist eine Zuweisung: z.B. Gewicht = 20; Der Variablen "Gewicht" wird der Wert 20 zugewiesen.
== ist ein Vergleichsoperator: z.B. if (Gewicht == 10)... Es wird "abgefragt" ob Gewicht den Wert 10 hat.
Umgekehrt (also Gewicht == 20; und if (Gewicht = 10)...) macht es keinen Sinn - und vor allem nicht das was du vielleicht denkst.

  1. Wie ist dein Taster angeschlossen?
    Normalerweise wird das so gemacht:
    Der Taster wird mit dem einen Kontakt am gewünschten Pin des Arduino angeschlossen und mit dem anderen Kontakt an GND.
    Am Pin des Arduino wird mit der Anweisung
  pinMode(buttonPin, INPUT_PULLUP);

der Pullup-Widerstand eingeschalten, der dafür sorgt, dass die Leitung immer auf HIGH liegt, solange der Taster NICHT gedrückt ist. Wenn er gedrückt wird geht die Leitung auf LOW.

Es gibt natürlich auch noch andere Möglichkeiten einen Taster anzuschließen.
Detail siehe zum Beispiel hier: Inputs
Wichtig ist aber, dass die "Signalleitung" immer einen definierten Pegel hat (also entweder HIGH oder LOW) aber nie "in der Luft" hängt!

Falls du den Taster so anschließt wie beschrieben, musst du natürlich auch die "Auswertungs-Logik" ändern.
Denn wenn der Taster gedrückt wird ist das Signal LOW und wenn er nicht gedrückt ist HIGH.

Hallo uxomm,

danke für deine Antwort.

Zu 1)
Der Unterschied zwischen "=" und "==" ist mir natürlich bekannt. War ein Tippfehler, den ich absolut nicht gesehen habe :smiley:

Zu 2)
Der Taster ist über einen externen 10k-Pull-Down angeschlossen.

Dummerweise ist das ganze so träge, dass ich den Taster länger drücken muss, bis ein Signal ankommt und die Aufzeichnung beginnt. Leider drückt man dann immer so lange, dass es zwei Loops anhält und die Aufzeichnung direkt wieder stoppt :frowning:

Mag das wohl an dem Pull-Down-Widerstand liegen? Ist der zu groß?

Mag das wohl an dem Pull-Down-Widerstand liegen?

nöö...

jurs:
Ach, dummes Zeugs.

Das einzige, was träge ist, ist der Programmierer des Sketches!
Der ist offenbar völlig ahnungslos in Bezug auf die verwendete Hardware und hat das Datenblatt zum DHT Sensor entweder nicht gelesen, nicht verstanden oder nicht beachtet.

Die DHT-Sensoren dürfen meines Erachtens nach überhaupt nur alle zwei Sekunden ausgelesen werden, also nach einer erfolgten Messung frühestens zwei Sekunden später wieder.

In Deinem Sketch ist aber überhaupt keine Zeitsteuerung drin, der Sketch versucht also offenbar genau so oft den Button auszulesen wie den DHT Sensor.

Die Programmlogik ist zur Verwendung mit einem DHT-Sensor VÖLLIG UNBRAUCHBAR!

Mach Dir eine asynchrone Zeitsteuerung für die loop-Funktion:

  • lies nur den Button bei jedem Durchlauf der loop aus!
  • aber den DHT-Sensor immer erst zwei Sekunden nach der vorherigen Messung!

Tja, was du schreibst, ist leider ebenfalls dummes Zeug.
Die Sache mit den 2 Sekunden habe ich gelesen. Wenn ich den DHT22 auslese und die Werte normal über den seriellen Monitor anzeigen lasse (ohne Taster, ohne alles), klappt das aber auch ohne 2 Sekunden Verzögerung.

Zu meinem Problem habe ich folgendes ausprobiert:

DHT22 vollständig ausgebaut und alles was mit dem DHT22 zu tun hat aus dem Sketch gestrichen.
Und trotzdem bleibt das Problem bestehen. Der Taster-Druck wird nur erkannt, wenn man den Taster über längere Zeit gedrückt hält.

Ich vermute das Problem im Delay.

Winnie_Arduino:
Tja, was du schreibst, ist leider ebenfalls dummes Zeug.

OK, dann wird das dumme Zeug von mir mal gleich wieder aus dem Thread gelöscht, bevor es hier noch die nächsten 10 Jahre stehen bleibt.
Bye

Leute, ich habe das Problem lösen können.
Nachdem ich das Problem im Delay vermutet habe, habe ich noch ein wenig gegoogelt und das hier gefunden: BlinkWithoutDelay.

Und es hat geklappt. Jetzt wird jeder Tastendruck erkannt :slight_smile:

jurs:
OK, dann wird das dumme Zeug von mir mal gleich wieder aus dem Thread gelöscht, bevor es hier noch die nächsten 10 Jahre stehen bleibt.
Bye

Trotzdem danke. Deine Antwort hat mich dazu veranlasst, den DHT erstmal auszuklammern und mich nur auf das Taster-Problem zu konzentrieren.

Ich vermute das Problem im Delay.

Wo hast du ein delay() ? In deinem ersten Beitrag ("2016-12-31, 02:45:10") sehe ich keins.
Und wenn ja, wo ist dann das Problem? Wenn du es so programmierst, dass zwei Sekunden keine Taste eingelesen werden soll, dann wird eben keine Taste eingelesen.

OK, brauchst jetzt eigentlich den sketch mit delay(2000); nicht vorzuführen, das wäre doch zu peinlich.
Glückwunsch, dass du BlinkWithoutDelay gefunden hast, und es sogar auf dein Problem anwenden konntest.

michael_x:
Wo hast du ein delay() ? In deinem ersten Beitrag ("2016-12-31, 02:45:10") sehe ich keins.
Und wenn ja, wo ist dann das Problem? Wenn du es so programmierst, dass zwei Sekunden keine Taste eingelesen werden soll, dann wird eben keine Taste eingelesen.

OK, brauchst jetzt eigentlich den sketch mit delay(2000); nicht vorzuführen, das wäre doch zu peinlich.
Glückwunsch, dass du BlinkWithoutDelay gefunden hast, und es sogar auf dein Problem anwenden konntest.

Der Sketch vom 31.12.2016 hat auch kein Delay. Das war meine erste Version. Und es klappt ohne Verzögerung nicht. Die Verzögerung darf aber halt nicht durch Delay herbeigeführt werden...das hab ich in späteren Sketchen ausprobiert, die ich hier nicht alle gepostet hab.

Wie auch immer, mein Problem ist gelöst.