Hallo Leute,
Ich möchte am Digitaleingang meines arduino uno Impulse zählen. Die Impulse sollen in der Variable Puls mitgezählt bzw aufadiert werden.
Gibt es dafür brauchbare Programmbeispiele?
Danke im voraus
Hallo Leute,
Ich möchte am Digitaleingang meines arduino uno Impulse zählen. Die Impulse sollen in der Variable Puls mitgezählt bzw aufadiert werden.
Gibt es dafür brauchbare Programmbeispiele?
Danke im voraus
Ja sicher, einfach mal Google fragen.
Nimm ein passendes Beispiel für Digitaleingänge ( z.B. Button )
füge bei den globalen Variablen ein:
int Puls; // Zähler
boolean oldButtonState; // zum erkennen der Änderung
in loop:
boolean buttonState = digitalRead(buttonPin);
if ( buttonState != oldButtonState ) {
// Wechsel erkannt
oldButtonState = buttonState;
delay(10); // Entprellen
if (buttonState == HIGH) {
Puls++; // das hast du gefragt
Serial.println(Puls);
}
}
Diese Zeilen sind nicht ganz komplett, und sollten mit dem Example Digital Button kombiniert werden.
Zum Kombinieren muss man natürlich in etwa verstehen, was da gemacht wird !
( Und wie ein Taster angeschlossen wird ).
Viel Spass.
Ich möchte am Digitaleingang meines arduino uno Impulse zählen.
Das kann man tun.
Wie schnell sind sie denn?
Was soll denn sonst noch auf dem Uno getan werden?
Denn daran entscheidet sich u.A. welche Methode gewählt werden sollte.
Zählung mittels Interrupt:
// UNO mit Messung an Pin2
const byte messpin = 2;
volatile unsigned long zaehler;
void setup() {
Serial.begin(9600);
pinMode(messpin,INPUT_PULLUP);
attachInterrupt(0, messung, CHANGE);
}
void loop()
{
delay(1000); // every second
Serial.print("Zaehler: "); Serial.println(zaehler);
}
void messung() {
if (digitalRead(messpin)) zaehler++;
}
Danke Michael_X
Ich habe den Code nun zusammengebastelt. Hab aber als Ergebnis im Seriellen Monitor immer nur eine 1 stehen. Leider wird der Wert nicht aufadiert. Was habe ich nur falsch gemacht?
const int buttonPin = 6; // the number of the pushbutton pin
int buttonState = 0; // variable for reading the pushbutton status
void setup() {
pinMode(buttonPin, INPUT);
Serial.begin(9600);
}
void loop(){
int Puls;
boolean buttonState = digitalRead(buttonPin);
boolean oldButtonState;
if ( buttonState != oldButtonState ) {
// Wechsel erkannt
oldButtonState = buttonState;
delay(10); }// Entprellen
if (buttonState == HIGH) {
Puls++; // das hast du gefragt
Serial.println(Puls);
}
}
Das "int Puls" muss ausserhalb der Loop stehen, in die Deklaration.
Dir fehlen die grundlegendsten Programmierkenntnisse.
Hab aber als Ergebnis im Seriellen Monitor immer nur eine 1 stehen
Das ist auch völlig logisch. Puls ist bei dir auch nur eine lokale Variable die am Ende von loop() aufhört zu existieren. Entweder musst du die global machen oder lokal als "static" deklarieren
Das gleiche gilt für oldButtonState
buttonState ist doppelt drin. Einmal global und lokal. Da würde die lokale Version reichen
Da Du mein Beispiel mit Interrupt nicht zu mögen scheinst, habe ich Deinen Sketch etwas modifiziert:
const int buttonPin = 6; // the number of the pushbutton pin
boolean buttonState, oldButtonState;
unsigned long anzeigeMillis, aktMillis;
const int anzeigeZeit = 1000;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
buttonState = digitalRead(buttonPin);
oldButtonState = buttonState;
}
void loop() {
static int Puls;
aktMillis = millis();
buttonState = digitalRead(buttonPin);
if ( buttonState && !oldButtonState ) { // positive Flanke erkannt
delay(10); // Entprellen
Puls++;
}
oldButtonState = buttonState;
if (aktMillis - anzeigeMillis >= anzeigeZeit) {
anzeigeMillis = aktMillis;
Serial.print("Puls: ");
Serial.println(Puls);
}
}
Danke Agmue, Super Sache wie du dich hier reinhängst. Ich habe deinen ersten Code natürlich noch ausprobiert. Er funktioniert einwandfrei! Jetzt würd ich ihn noch gerne erweitern. Die Sache mit dem Interupt gefällt mir gut. Ich würde gerne noch zusätzlich einen zweiten Interupt einbauen für einen Taster an Pin 3.
Nun hab ich aber die Sache noch nicht ganz verstanden. Könnt ihr mir erklären wofür die 0 steht
"attachInterrupt(0, messung, CHANGE);"?
https://www.arduino.cc/en/Reference/AttachInterrupt
Allgemein solltest du dir aber nicht angewöhnen Taster per Interrupt auszulesen. Per Hand abfragen ist besser. Interrupts sind eher für schnelle Ereignisse auf die man sofort reagieren muss. Nicht für langsame, mechanisch prellende Taster.
Meinst du per Hand eine if Abfrage?
Wenn du einen interaktiven Arduino sketch schreibst, der auf menschliche Aktionen reagiert, sollte loop() in wenigen Millisekunden durchlaufen werden.
Der ist dann deutlich schneller als ein mechanischer Taster mit menschlicher Betätigung, welcher üblicherweise beim Drücken innerhalb dieser ersten ms mehrfach hin und her schaltet (Prellen). Passiert evtl. sogar beim Loslassen.
Im einfachsten Fall "entprellt" man, indem beim Erkennen einer ersten Änderung einfach perdelay(5); (10 ms geht auch) abwartet. Der Sketch ist dann immer noch schnell genug um "sofort" zu reagieren. Und das Ganze ist deutlich einfacher, als eine Interrupt-Routine gegen Prellen unempfindlich zu machen.
Meinst du per Hand eine if Abfrage?
Ja, und ein digitalRead(). aber meist sind es zwei if: Eines für die Änderung (mit altem Tasterzustand vergleichen) und eines für den Zustand selbst ![]()
underdog0815:
Ich möchte am Digitaleingang meines arduino uno Impulse zählen.
Das hatte ich so verstanden, daß diese Impulse von einer anderen Elektronik oder einem Sensor, Lichtschranke z. B., kommen. Dann kann ein Interrupt sinnvoll sein.
Bei menschlichen Aktionen ist der µC bei blockierungsfreier Programmierung so viel schneller, daß ein Interrupt keinen Vorteil bringt.
Als ich angefangen habe, war mein erster Blick nach Interrupts und Timer Library. Inzwischen weiß ich, braucht man nur selten. Das Beispiel oben stammt übrigens aus einer Messung der HIGH- und LOW-Zeit eines PWM-Signals, wo ein Interrupt sinnvoll ist.