Drehüberwachung

Hallo zusammen, ich bin Benjamin 23 Jahre und aus Wien. Ich Studiere Maschinenbau und in meiner Freizeit verbringe ich gerne Zeit mit meinen 3D Druckern.

Nun habe ich ein neues Projekt mit einem Arduino Uno wo ich ein Eingang Signal abfragen muss.
Es ist für eine Drehüberwachung gedacht wo ich kontrollieren will ob sich eine Welle dreht.
Also sprich das Signal muss alle 10 Sekunden kommen und wieder in 3 Sekunden abfallen ist dies nicht der Fall soll ein Alarm aktiviert werden.
Daher ich leider nicht besonders begabt bin in der Sprache C bitte ich um Unterstützung.
Ich habe bereits ein Skript erstellt wo aber leider nichts funktioniert außer mein Alarm der ständig aktiviert wird.

Könnte mir bitte jemand helfen?

Danke im Voraus
LG Benjamin

Dazu solltest Du uns Deinen Sketch in Codetags (</> oben links) zeigen und genau beschreiben, was geht und was nicht.

Gruß Tommy

const byte checkPin = 7;
const byte alarmPin = 13;
unsigned int maxDuration = 10000;
unsigned long lastPulse;
byte lastState;

void setup() {
 pinMode(checkPin, INPUT_PULLUP);
 pinMode(alarmPin, OUTPUT);
}

void loop() {
 byte currState = digitalRead(checkPin);
 if (!currState) {
   if (lastState) {
     lastPulse = millis();
     digitalWrite(alarmPin, LOW);
   }
 }
 lastState = currState;
 if (millis() - lastPulse > maxDuration) {
   digitalWrite(alarmPin, HIGH);
 }
 {
tasterstatus = digitalRead(checkPin);
 if (checkPin == HIGH)
 {delay (3000);
   digitalWrite(alarmPin, HIGH);
   digitalWrite(alarmPin, LOW);
 }
 
}

Leider geht da nichts. Sobald ich den letzten Absatz raus nehme und das mit den 3 Sekunden weg lasse geht es zu Kompilieren, aber der Alarm kommt leider immer alle 10 Sekunden.
Ich bitte um Entschuldigung für den Sketch. Ich habe die aus dem Internet zusammen gefügt in der Hoffnung an mein Ziel zu kommen.

Danke im Voraus.
LG Benjamin

Du solltest lernen wier millis() funktioniert. Such nach der "Nachtwächtererklährung"
Grüße Uwe

3dbyvb:
Ich bitte um Entschuldigung für den Sketch. Ich habe die aus dem Internet zusammen gefügt in der Hoffnung an mein Ziel zu kommen.

Und wir sollen's jetzt richten, oder was?

Einen Sketch per copy-and-paste programmieren* zu wollen, ist der erste und übelste Fehler, den viele machen. Zeichne auf, was Dein Programm machen soll (Stichwort Programmablaufplan), lerne ein paar Grundlagen und schreib' Dein Programm selbst.

Gruß

Gregor

*Wer so etwas „programmieren“ nennt, sollte von der Uni fliegen.

Oder einfach mit einem Link helfen:
https://www.arduinoforum.de/arduino-Thread-Blink-Without-Delay-mal-anders-erklärt

Hi

Leider geht da nichts. Sobald ich den letzten Absatz raus nehme und das mit den 3 Sekunden weg lasse geht es zu Kompilieren, aber der Alarm kommt leider immer alle 10 Sekunden.

Das halte ich für eine gewagte Aussage.

  • Zeile 25, tasterstatus ist unbekannt - wird angemeckert
  • wenn Auskommentiert, fehlt eine schließende Klammer am Ende des Sketch (Den Du außerdem in Code-Tags hattest Posten sollen)
  • mit der schließendem Klammer am Ende kompiliert der Kram

… aber Zeile 26 if (checkPin == HIGH){ wird wohl nicht ganz machen, was Du willst - checkpin ist die Pin-Nummer, wo der Taster angeschlossen ist … NICHT der Zustand des Taster.

Weiter habe ich mir Das noch nicht angetan :slight_smile: … bin aber auch nicht studiert …

MfG

gregorss:
Und wir sollen's jetzt richten, oder was?

Einen Sketch per copy-and-paste programmieren* zu wollen, ist der erste und übelste Fehler, den viele machen. Zeichne auf, was Dein Programm machen soll (Stichwort Programmablaufplan), lerne ein paar Grundlagen und schreib' Dein Programm selbst.

Gruß

Gregor

*Wer so etwas „programmieren“ nennt, sollte von der Uni fliegen.

Ich habe in keiner Art und Weise gefragt ob mir jemand den Sketch richtig stellt! Sondern nur darum gebeten mir zu helfen was meine Fehler sind. Daher ich in C nicht viel zum tun habe!

Vielen Dank an die, die mir brauchbare Links und Antworten geschickt haben. Ich werde schauen das Problem zu lösen.

LG Benjamin

Hallo Benjanin,

Du denkst zu kompliziert, ausserdem willst Du ja sicher auch noch etwas anders machen mit dem Uno, da ist delay() absolut nicht geeignet.

Eigentlich willst du doch feststellen ob sich der Zustand des Einganges innerhalb von 10s geändert hat. Das reicht doch völlig aus. Also musst eine Flankenerkennung machen. Das hast Du ja schon. Wenn die Fanke erkannt ist setzt du eine Variable auf den aktuellen Wert von millis(). Wenn dann irgendwann die Differenz zwischen millis() und dem letzen gespeicherten Wert > 10s ist dann steht das Ding oder dreht sich zu langsam.

Heinz

Hi

Ebenso kannst Du das Abfallen des Signal auf >3 Sekunden prüfen - Alles ohne delay() oder andere Blockaden.
Du musst Dir nur die Uhrzeit (=millis() ) merken, wenn die Flanke Low->High erfolgt laufen die 3 Sekunden.
Immer laufen die 10 Sekunden, da die Startzeit bei jeder Flanke Low->High neu gesetzt wird, schlägt Diese erst zu, wenn die Welle zu langsam wird.

Du hast also zwei Fehler-Bedingungen:
Zeit > 3 Sekunden und Signal noch HIGH
bzw.
Zeit >10 Sekunden

Wenn ein Fehler ausgelöst wurde, musst Du Dir 'nur' merken, daß Dieser jetzt bekannt ist - sonst kommt in jedem loop()-Durchlauf die Fehlermeldung.
Den Merker wieder löschen, wenn die nächste Startzeit gesetzt wird.

MfG

Hallo,

Auch das abfallende Signal kommt nur alle 10s , es kommt nur 3s nach dem steigenden , macht es unnötig kompliziert

Ob du auf steigen oder fallend abfragst ist wurscht , für beides gilt > 10 s .

Heinz