Midi Bewegungsschaltung für eine Schneekugel

Hallo zusammen

Ich habe Vibration Sensor an einer Schneekugel, mit dem ich gerne ein Midi Befehl an meinen Computer schicken will, aber der Befehl soll erst lost geschickt werden wenn ich die Kugel ein paar mal geschüttelt habe.
Ich habe schon mal die midi Schaltung gemacht und die funktioniert auch gut, aber eben, der Befehl LOW soll nur nach dem geschüttelte, ich denke so 5- 6 mal LOW mit dem Wert (127) an mein Computer geschickt Werden.

PS. Der Delay am Schluss ist gedacht für den Clip, den ich damit starte, so lange geht und erst wenn er zu ende ist die ganze Schaltung wieder freigegeben werden soll.

int taste = HIGH;
int tasteAlt = HIGH;

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);
}
 
void loop() {
  
 taste = digitalRead(2);


  
  if (taste == HIGH && tasteAlt == LOW) {
    Serial.write(144);
    Serial.write(36);
    Serial.write(0);
    tasteAlt = taste;
    
  } if (taste == LOW && tasteAlt == HIGH) 
  {
    Serial.write(144);
    Serial.write(36);
    Serial.write(127);
    tasteAlt = taste;
    delay(90000);
  }
}

ResBaechli81:
Ich habe Vibration Sensor

welchen? Bitte einen Link zum Produkt.

Dein Code ist recht rudimentär.
Kann man machen, ist aber nicht zielführend.

    delay(90000);

PS. Der Delay am Schluss ist gedacht für den Clip, den ich damit starte, so lange geht und erst wenn er zu ende ist die ganze Schaltung wieder freigegeben werden soll.
[/quote]
Nein.
Der delay() macht Dir (so wie Du es hier zeigst) alles kaputt.

Mach Dir einen Plan, was Du willst.
->Start
-> Bewegung wird erkannt
-->Merke die aktuelle Zeit als Startzeit
-->Solange aktuelle Zeit - Startzeit nicht abgelaufen, zähle BewegungsImpulse
---> Prüfe ob zwischen den Impulsen maximalZeit abgelaufen ist.
-> Wenn ja: setze Zähler zurück und beginne von vorn.

  • wenn Wartezeit abgelaufen UND genügend Impulse gezählt, dann starte Dein Programm, indem Du Zeit merkst, und solange taste nicht abfragst, wie Intervall noch nicht erreicht.

Hallo my_xy_projekt
Grove - Vibrationssensor (SW-420)
Stimmt mit dem delay der soll ja erst kommen wenn der "if (taste == LOW && tasteAlt == HIGH)" Befehl ausgeführt worden ist.
Ich weiss das er rudimentär ist, ich habe so eine Schaltung auch schon gemacht und das ist die die ich kenne.

my_xy_projekt:
Mach Dir einen Plan, was Du willst.
->Start
-> Bewegung wird erkannt
-->Merke die aktuelle Zeit als Startzeit
-->Solange aktuelle Zeit - Startzeit nicht abgelaufen, zähle BewegungsImpulse
---> Prüfe ob zwischen den Impulsen maximalZeit abgelaufen ist.
-> Wenn ja: setze Zähler zurück und beginne von vorn.

  • wenn Wartezeit abgelaufen UND genügend Impulse gezählt, dann starte Dein Programm, indem Du Zeit merkst, und solange taste nicht abfragst, wie Intervall noch nicht erreicht.

Dieser Plan tönt echt gut. nur weiss ich noch nicht wie er umzusetzen ist :slight_smile:

ResBaechli81:
Dieser Plan tönt echt gut. nur weiss ich noch nicht wie er umzusetzen ist :slight_smile:

Ich werd Dir den Code nicht schreiben :wink:
Als erstes musst Du das mit der Zeit hinbekommen.

Dafür gibt es in der IDE das Beispiel blink without delay und eben gleicher Funktion debounce.
Hier immer wieder erwähnt die Nachwächtererklärung. https://forum.arduino.cc/index.php?topic=423688.0

Wenn Du das durch hast, fange mit einem Codeschnipsel an die LED blinken zu lassen.
Dann füge hinzu, das die nur blinken soll, wenn die Kugel geschüttelt wurde.
Wenn das funktioniert, füge hinzu 10 sekunden blinken und danach aus, bis wieder geschüttelt.

Daraus baust Du dann das, was ich oben angeboten habe.

nein natürlich nicht schreiben, wäre aber nett gewesen:-), aber die Hilfestellung ist schon super, ich wusste nicht nach was ich suchen soll.
werde das ganze mal versuchen zusammen zu basteln. und mich dann wider melden.

Ich habe jetzt eine andere Variante heraus gefunden. habe es jetzt mit einen Doppelklick Programm gelöst. muss es nur noch ein bisschen fein justieren. Die Doppelklick Geschwindigkeit noch ein bisschen optimieren. kommt aber glaub gut.
hier noch der Code, er ist glaube ich sehr Amateur Haft, da ich mich nur 1 mal im Jahr mit Arduino auseinander setze:-), bin sehr froh um Optimierung s Vorschläge. ein paar Sachen nimm ich dann noch raus.
ich musste noch die Bibliothek anpassen, da der Vibration Sensor normal auf HIGH ist und die Original Schaltung nur umgekehrt richtig funktioniert.

#include <OneButton.h>




const int buttonPin = 3;
const int ledPin = 13;
 
OneButton button(buttonPin, false);
 
int ledState = LOW;
 
void setup() {
 pinMode(ledPin, OUTPUT);
 pinMode(buttonPin, INPUT);
 
 
 button.attachDoubleClick(doubleClickedIt);
 
}
 
void loop() {
 Serial.begin(9600);
 button.tick();
 
 delay(10);
}
 
 
void clickedIt() {
 ledState = !ledState;
 digitalWrite(ledPin, ledState);
}
 
void doubleClickedIt() {
 for (int i=0; i<1; i++) {
  Serial.write(144);
  Serial.write(36);
  Serial.write(127);
 delay(60);
  Serial.write(144);
  Serial.write(36);
  Serial.write(0);
 delay(20000);
 }
 
 digitalWrite(ledPin, ledState);
}

ResBaechli81:
Ich habe jetzt eine andere Variante heraus gefunden.

ich musste noch die Bibliothek anpassen

#include <OneButton.h>

delay(20000);

Wenn Du Fremdlibs einsetzt und die umschreibst, aber noch immer delay() einbastelst, ist mir nicht klar, was Du willst und was Du kannst.
An Stelle der ganzen Sucherei, hättest nen kurzen Sketch geschrieben, getestet, geändert, neu getestet und dabei was gelernt.
Nun gut - wenns denn geht…

Der Delay ist dazu da den Start des MIDI Befehl erst wider frei zu geben wenn der Clip abgelaufen ist.
Habe mir den code jetzt noch vereinfacht.

my_xy_projekt:
An Stelle der ganzen Sucherei, hättest nen kurzen Sketch geschrieben, getestet, geändert, neu getestet und dabei was gelernt.
Nun gut - wenns denn geht...

ich habe geschrieben getestet gendert und neu getestet und neu geschrieben und wieder angepasst und nochmal was anderes probiert und nochmals angepasst und gesucht und noch was gesucht und nochmal auf was gestosen und so weiter und sogar ein bitzli was gelernt:-).
hier mein Resultat

#include "OneButton.h"


#define PIN_INPUT 3
#define PIN_LED 13

OneButton button(PIN_INPUT, false);

void setup()
{
  Serial.begin(9600);

  
  pinMode(PIN_LED, OUTPUT); // sets the digital pin as output

 
  button.attachDoubleClick(doubleclick);


} 



void loop()
{
  
  button.tick();

  
  delay(10);
} 

void doubleclick()
{
  Serial.write(144);
  Serial.write(36);
  Serial.write(127);
 delay(60);
  Serial.write(144);
  Serial.write(36);
  Serial.write(0);
 delay(123000);

 
}