Ausgabe des Serial Monitors

Hallo,

ich habe einen Tilt-Sensor, der nachdem er getiltet wurde eine Zufallszahl an den Serial Monitor schicken soll.

Hier der Code:

int randNumber;
const int button = 2;             
const int LEDPin = 11;              
int SensorPreviousValue = 0;
int SensorCurrentValue = 0;
long lastTimeMoved = 0;
int shakeTime=500;

void setup()
{
  pinMode (button, INPUT);        
  digitalWrite (button, HIGH);
  pinMode (LEDPin, OUTPUT);       
  Serial.begin(9600);
}

void loop()
{
  SensorCurrentValue=digitalRead(button);
  if (SensorPreviousValue != SensorCurrentValue){
    lastTimeMoved = millis();
    SensorPreviousValue = SensorCurrentValue;
  }

  if (millis() - lastTimeMoved < shakeTime){
    digitalWrite(LEDPin, LOW);
    randNumber = random(10);  
    Serial.println(randNumber);   
  }
  else{
    digitalWrite(LEDPin, HIGH);    
  }
}

Ich dachte das ich mit der "if (millis() - lastTimeMoved < shakeTime){" Abfrage verhindere, dass er mir nur eine Zahl rausgibt. Stattdessen gibt er mir im Serial Monitor einen ganzen Haufen Zahlen raus. Wo liegt mein Fehler?

Hallo yog_slogoth,

Deine Programmierung setzt im Falle eines Drucks auf den Sensor die "lastTimeMoved".
Daraufhin wird natürlich die Ausgabe der Zufallszahl aufgerufen. Und zwar so oft, bis 500 Millisekunden vergangen sind.
Die loop()-Funktion wird kontinuierlich aufgerufen und das ziemlich schnell hintereinander. Da kann es durchaus vorkommen, das Du ein paar Hundert Zahlen ausgegeben bekommst, bis dieses Intervall abgelaufen ist.

Warum nicht alles in der Abfrage zu vereinen? Schließlich ist der Sensor ja "debounced".

void loop()
{
  SensorCurrentValue=digitalRead(button);
  if (SensorPreviousValue != SensorCurrentValue){
    SensorPreviousValue = SensorCurrentValue;
    digitalWrite(LEDPin, LOW);
    randNumber = random(10);  
    Serial.println(randNumber);   
  }
  else{
    digitalWrite(LEDPin, HIGH);    
  }
}

Vielleicht habe ich auch nur zu wenig Kaffee getrunken und das Problem nicht korrekt erfasst :slight_smile:

Leider auch nicht wirklich, aber trotzdem vielen Dank.

Ich werde mich jetzt nochmal an die Verkableung machen, vielleicht habe ich da irgendwo einen Wackler drin...

Dann schlage ich vor, dass Du ein kleines delay(50); einbaust und bei jedem if (SensorPreviousValue != SensorCurrentValue) den SensorCurrentValue ausgibst. So ist erkennbar wann der Schalter auslöst und du siehst ob das unkontrolliert vorkommt.
Evtl. ist der Wiederstand unterdimensioniert?!? (Debounce Tutorial)

Eine Idee die ich noch mal ausprobieren muss. Ich hatte jetzt an einem Workaround gepfeilt, der soweit auch funktioniert: Da ich die Random-Zahl eh von einem Perl-Skript aufgefangen wird, nehme es nur die letzte Zahl und arbeitet damit weiter.

Oh, jetzt gerade kommt es mir, ich könnte auch einfach das Perl-Skript so umbauen, dass es auf das Signal vom Arduino die Zufallszahl erstellt...
Ja manchmal hilft es doch ein bisschen nachzudenken, bevor man macht 8)