Für etliche meiner Versuche (z.B. im Bereich Radioaktivität) benötige ich einen digitalen Zähler. Mit dem MAX7219 lässt sich ein solcher sehr einfach mit insgesamt 8 digits umsetzen. Gezählt werden die Spannungspulse (steigende Flanke) mittels interrupt. Mittels 5V-Zenerdiode wird der Arduino-Eingang geschützt.
Ich habe die Schnelligkeit des Zählers mittels Funktionsgenerator überprüft. Demnach können Signale mit einer Frequenz von bis zu 140 kHz erfasst werden.
Arduino-Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#include "LedControl.h" // Arduino Pin 7 to DIN, 6 to Clk, 5 to CS, no.of devices is 1 #include <Wire.h> LedControl lc=LedControl(7,6,5,1); volatile long pulse = 0; int stelle[8]; const int buttonPin = 9; int buttonState = 0; const byte interruptPin = 2; void setup() { Serial.begin(9600); pinMode(interruptPin, INPUT_PULLUP); pinMode(buttonPin, INPUT); attachInterrupt(digitalPinToInterrupt(interruptPin), Puls, RISING); // Initialize the MAX7219 device lc.shutdown(0,false); // Enable display lc.setIntensity(0,3); // Set brightness level (0 is min, 15 is max). Format: address, intensity lc.clearDisplay(0); // Clear display register } void loop() { buttonState = digitalRead(buttonPin); if (buttonState == LOW) // Reset-Knopf gedrückt { pulse = 0; } //pulse = 87654321; stelle[7] = (pulse%100000000)/10000000; stelle[6] = (pulse%10000000)/1000000; stelle[5] = (pulse%1000000)/100000; stelle[4] = (pulse%100000)/10000; stelle[3] = (pulse%10000)/1000; stelle[2] = (pulse%1000)/100; stelle[1] = (pulse%100)/10; stelle[0] = pulse%10; for(int i=0; i<8; i++) { lc.setDigit(0,i,stelle[i],false); } //delay(1000); } // ============================== // ======= INTERRUPT ========= // ============================== void Puls() { pulse = pulse + 1; } |