Nog een update van de logger.
Na een slimme opmerking uit dit forum heb ik een vier poorts NAND (74LS20) gekocht en aangesloten.
De uitgangen van de schmitt triggers (74LS14) heb ik op de NAND aangesloten. In mijn situatie heb ik drie triggers en heb de vierde ingang van de NAND op 5V gezet.
De uitgang van de NAND heb ik op een digitale pin aangesloten van de netduino.
Hoe gaat dit in zijn werk:
Geen activiteit:
-de ingang van de trigger is laag en de uitgang hoog.
-alle ingangen van de NAND zijn hoog en de uitgang is daarom laag (1x1x1x1=1 => 0).
Activiteit:
-een van de kwh meters geeft een puls en de uitgang van de aangesloten trigger is eventjes laag
-een van de ingangen van de NAND poort is laag en daarom de uitgang even hoog (1x1x1x0=0 => 1)
Hieronder heb ik een stukje c# geschreven om de hardware te testen.
Het programma zit in een loop die
-de eerste kwh meter leest (D2 en D3 worden op false geïnitialiseerd)
-het totaal aan pulsen print in het debug scherm
-5 seconden wacht.
De output van de NAND is op D4 aangesloten en als interrupt gedefinieerd. De routine geeft alleen aan dat er een puls is ontvangen. Ik moet ook de interrupt weer clearen.
Het heeft nog maar vijf minuten gelopen en werkte prima. Nu dit werkt kan ik verder met de software.
Volgende week komt de real time clock binnen (DS1307), die moet waarschijnlijk aan de analoge ingang komen door de I2C interface. Alternatieven zijn welkom, ik kan altijd de tijd nog van het internet halen om te vergelijken maar die wil ik niet als primaire tijd gebruiken.
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
67
68
69
70
71
72
73
74
75
76
77
78
79
| namespace Meterkastlogger1209
{
public class Program
{
// io ports netduino definition
// 0 = input, Za: bit0 value kwh meter
// 1 = input, Zb: bit1 value kwh meter
static InputPort GetCounterBit0 = new InputPort(Pins.GPIO_PIN_D0, false, Port.ResistorMode.Disabled);
static InputPort GetCounterBit1 = new InputPort(Pins.GPIO_PIN_D1, false, Port.ResistorMode.Disabled);
// Zb : Za : counter value
// 0 0 : 0
// 0 1 : 1
// 1 0 : 2
// 1 1 : 3
// 2 = output, S0: bit0 select kwh meter
// 3 = output, S1: bit1 select kwh meter
static OutputPort SelectCounterBit0 = new OutputPort(Pins.GPIO_PIN_D2, false);
static OutputPort SelectCounterBit1 = new OutputPort(Pins.GPIO_PIN_D3, false);
// S1 : S0
// 0 0 kwh meter 1
// 0 1 kwh meter 2
// 1 0 kwh meter 3
// 1 1 kwh meter 4 (not connected on board.)
// 4 = input, interrupt input for reading inputs.
// define the interrupt port and connect to a variable
// This interrupt is generated when the value of one of the three counters is changed
static InterruptPort ReadSensors;
//
// we must read the datetime to label our values.
// variables for total
static int Tnow, Tlast, nOverflow;
public static void Main()
{
Tnow = 0;
Tlast = 0;
nOverflow = 0;
ReadSensors = new InterruptPort(Pins.GPIO_PIN_D4, false, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeLevelHigh);
ReadSensors.OnInterrupt += new NativeEventHandler(ReadSensors_OnInterrupt);
ReadSensors.ClearInterrupt();
while (true)
{
// sleep
Tnow = (GetCounterBit1.Read() ? 1 : 0) * 2 + (GetCounterBit0.Read() ? 1 : 0);
if (Tlast != Tnow)
{
// Nieuwe waarde van de teller
if (Tnow < Tlast)
{
// overflow van de teller
nOverflow++;
}
Tlast = Tnow;
}
Debug.Print("Aantal pulsen= " + (4*nOverflow + Tlast).ToString());
Thread.Sleep(5000);
// store data on SD card
// send data to providers
}
}
static void ReadSensors_OnInterrupt(uint data1, uint data2, DateTime time)
{
Debug.Print("incoming...pulse ");
Meterkastlogger1209.Program.ReadSensors.ClearInterrupt();
// There is an interrupt generated by one of the S0 signals.
// Read the sensors
// Reset the watchdog to avoid reset.
}
}
} |