Moin,
ich hoffe mir kann jemand bei meinem Problem helfen.
Ich möchte für ein Projekt das abrollen eines Kabels über einen induktiven Sensor erfassen.
Auf einer Rolle habe ich kleine Stahlplättchen aufgeklebt um damit den Sensor zu aktivieren.
Bei meinem Programm habe ich erkannt, dass ich beim erfassen des Signals aufpassen muss, dass er bei der Signalgebung nicht dauerhaft HIGH sendet, damit er nicht bei einem Signal mehrfach den Abstand zählt.
Hier zeigt sich aber mein Problem, wenn ich mit meinem Programm den sensorstate abfrage und dieser auf 1 also HIGH schaltet, dauert es zu lange bis das Programm diesen wieder auf LOW setzt, um den nächsten Schritt zu zählen.
Kann mir vielleicht jemand helfen, dies zu verbessern?
#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 2, 3, 4, 5);
int taster_val;
int old_val;
byte sensorpin = 8;
int sensorstate;
int oldstate;
double Laenge;
double Laenge_neu;
double Laenge_alt;
float Abstand;
//LCD Belegung
int RS = 13; //RS - LCD
int E = 12; //E - LCD
int DB4 = 2; //Bit0 - LCD
int DB5 = 3; //Bit1 - LCD
int DB6 = 4; //Bit2 - LCD
int DB7 = 5; //Bit3 - LCD
void setup() {
Serial.begin(9600);
pinMode(sensorpin, INPUT);
pinMode(DB4, OUTPUT); //Definition der Variable DB4 als Output
pinMode(DB5, OUTPUT); //Definition der Variable DB5 als Output
pinMode(DB6, OUTPUT); //Definition der Variable DB6 als Output
pinMode(DB7, OUTPUT); //Definition der Variable DB7 als Output
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.write("Laenge = ");
lcd.print(Laenge, 1);
lcd.write(" m");
}
void loop() {
SensorFunktion();
}
//***********************************************************************
void SensorFunktion() {
sensorstate = digitalRead(sensorpin);
if (sensorstate != oldstate) {
Serial.print("Sensorstate");
Serial.println(sensorstate);
oldstate = sensorstate;
}
Abstand = 10;
taster_val = digitalRead(sensorpin);
if (taster_val == HIGH && taster_val != old_val) {
Laenge = (Laenge + Abstand);
Serial.print("Sensorstate");
Serial.println(sensorstate);
Serial.print("Laenge = ");
Serial.print(Laenge * 0.01, 1);
Serial.println("m");
lcd.clear();
lcd.setCursor(0, 0);
lcd.write("Laenge = ");
lcd.print(Laenge * 0.01, 1);
lcd.write(" m");
old_val = taster_val;
} else {
old_val = taster_val;
}
}
Es scheint, du könntest einen Knopf library gebrauchen (zB OneButton von Matthias Hertel), was Ihr Leben einfacher machen würde, um Zustandsänderungen zu folgen
Danke für den Vorschlag. Allerdings ist mein Versuch es zu implementierennicht erfolgreich gewesen. Hast du einen Vorschlag, wie ich es machen könnte? Muss ich beim einfügen einer neuen Library den Sketch neu anfangen?
Hallo,
wie schnell kommen denn die Impulse?
das Programn mit allen if-bedingungen und Ausgaben auf lcd und seriellen-Monitor ist in 0,05 Sekunden abgearbeitet.
Also wie viele Impulse pro Sekunde müssen gezählt werden?
Wenn es wiklich seeehr viele Impulse pro Sekunde (10000 oder noch mehr) sind dann könnte man einen Interrupt verwenden.
Mit Interrupts programmieren hat aber auch seine Eigenheiten.
Danke für den Sketch. Allerdings habe ich beim ausprobieren gemerkt, dass er beim Auslösen des Pins nicht zählt bzw den Zustand nicht ändert. Er führt den Befehl einmal aus und gibt die Länge von 0,0 m an.
Die hohe Impulsrate war dazu gedacht, dass das Programm schneller aus dem Sensorstate 1 kommt. Das dauert sonst noch länger. Er bedient sich bei meinem Sketch anscheinend an einer festen Zeit, die ich nicht beeinflussen konnte.
Ja er hängt an 12 V, da ich für den Arduino ein 12 V Netzteil habe. Als Versuche, kann ich die Spannung des Sensors aber auch auf 10V verringern.
Der Wert für High hängt von der Auslösedauer des Sensors ab. Wenn er zu lange auf High bleibt kann es bis zu 8 Sek dauern, bis er wieder auf LOW schaltet.
Selbst bei kurzer Auslösung braucht er min 1 Sek bis er auf Low schaltet
Was meinst du mit Impulsrate? Ich verzichte jetzt aufs spekulieren.
Ich hätte es gerne ganz präzise. Wer hat da was für eine "Impulsrate?"
Oder was ist mit "Impulsrate" gemeint?
Welches "Sensortaste 1"?
In dem Programm das im post #1 gepostet wurde gibt es eine function void SensorFunktion()
Also so viel Präzision muss in der Kommunikation schon sein.
Die function SensorFunktion() ist in 0,05 Sekunden abgearbeitet daran kann es also nicht liegen.
Entschuldigung, habe es mit einem vorher angelegten Sketch verwechselt bei dem ich noch einen Entprellungsbefehl über lastdebounce eingegeben habe. Mein Fehler.
Ich meinte in dem Fall also den delay bis er eine neue Eingabe entgegennimmt.
Kannst Du mal bitte die Bilder rausnehmen und dafür im Seriellen Monitor einmal reinklicken, STRG-A, STRG-C, und hier in Codetags mit STRG-V einfügen.... Ggfls. kürzen.