Hallo,
ich habe da mal eben was zusammen geschrieben.
1 | const int ledPin13 = 13;
|
2 |
|
3 | unsigned int subS0Pulses = 0;
|
4 | unsigned int lastAnalogValue = 0;
|
5 | boolean generateOutput = false;
|
6 | int outputPulseDuration = 0;
|
7 |
|
8 | const unsigned int s0PulsesRef = 10; // [sub S0 pulses]
|
9 | // Make sure s0PulseOnTime/tickDuration has no remainder.
|
10 | // Same is true for s0PulseOffTime/tickDuration.
|
11 | const unsigned int tickDuration = 1; // [ms]
|
12 | const unsigned int s0PulseOnTime = 30; // [ms]
|
13 | const unsigned int s0PulseOffTime = 30; // [ms]
|
14 |
|
15 | void setup()
|
16 | {
|
17 | pinMode(ledPin13, OUTPUT);
|
18 | }
|
19 |
|
20 | void loop()
|
21 | {
|
22 | // Detect rising edge
|
23 | int analogValue = analogRead(0);
|
24 | if((analogValue > 300) &&
|
25 | (lastAnalogValue <= 300))
|
26 | {
|
27 | // Remember analog value for the next time.
|
28 | subS0Pulses++;
|
29 | }
|
30 | lastAnalogValue = analogValue;
|
31 | // Only every tenth pulse should generate an output impulse
|
32 | if(subS0Pulses >= s0PulsesRef && generateOutput == false)
|
33 | {
|
34 | generateOutput = true;
|
35 | outputPulseDuration = 0;
|
36 | subS0Pulses -= s0PulsesRef;
|
37 | }
|
38 | // Generate output impulse
|
39 | if(generateOutput == true)
|
40 | {
|
41 | if(outputPulseDuration < (s0PulseOnTime / tickDuration))
|
42 | {
|
43 | digitalWrite(ledPin13, HIGH);
|
44 | outputPulseDuration++;
|
45 | }
|
46 | else if((outputPulseDuration >= (s0PulseOnTime / tickDuration)) &&
|
47 | (outputPulseDuration < (s0PulseOffTime / tickDuration)))
|
48 | {
|
49 | digitalWrite(ledPin13, LOW);
|
50 | outputPulseDuration++;
|
51 | }
|
52 | else
|
53 | {
|
54 | generateOutput = false;
|
55 | }
|
56 | }
|
57 | delay(tickDuration);
|
58 | }
|
Ich habe weder eine IDE oder gar Hardware. Soll heissen: Da sind
bestimmt noch einige Unstimmigkeiten - oder gar richtige Fehler -
enthalten.
Die Idee ist, dass du nicht darauf wartest, dass die Befehle nach
einander abgearbeitet werden und das Programm erst danach erst einen
erneuten Durchlauf der Schleife beginnt.
Stattdessen wird die die Schleife alle <tickDuration>/1ms durchlaufen.
Siehe ganz unten das delay().
Ein Durchlauf beginnt damit, dass der ADC ausgelesen wird. Anschliessend
wird der aktuelle und der alte Wert verglichen ob es eine steigende
Flanke gibt(die LED vom Zähler angeht). Wenn das der Fall ist, wird
subS0Pulses um 1 erhöht.
Danach wird überprüft ob schon genug Impulse gezählt wurden und gerade
kein Impuls ausgegeben wird. Falls ja wird ein neuer Impuls angestossen.
Dies geschieht im letzten IF-Block.
Mit <outputPulseDuration> wird dabei gezählt, der wievielte Durchlauf
von loop() es gerade ist und somit auch was gerade passieren soll.
Es wird nur kurz der Ausgabe-Pin gesetzt und die Zählervariable erhöht -
viel mehr passiert in diesem IF-Block nicht und das Programm läuft
direkt in den delay().
CU,
Jay