Monitor Systeem                                                                        2021-10-03  JanBee, janbee@hack42.nl


Geschiedenis:
Voor het pand van Hack42 aan de Cruquiusweg 3 in Arnhem werd de behoefte gesignaleerd om het energie verbruik in de gaten te houden, teneinde te voorkomen dat het totaal verbruik zo hoog zou worden dat er een hoofdzekering aanspreekt. Grote verbruikers zijn vooral de warmtepomp, heetwater voorzieningen en keuken apparatuur.
Daarbij komt een slecht voorspelbare, maar in de pieken aanzienlijke energieleverantie van de zonnepanelen.
Het idee ontstond bij mij om op toepasselijke plaatsen, vooral (sub) groepenkasten, de opgenomen  stroom te meten, om aan de hand van die gegevens te besluiten om bepaalde belastingen af te schakelen of niet toe te laten.
In de loop van de ontwikkeling bleek er ook behoefte om een aantal parameters van het binnenklimaat te meten, om daarmee verwarming, koeling en ventilatie te kunnen regelen.
Het resultaat van dit project is:

Beknopte omschrijving:
Een Monitor-unit (elektronica bord met behuizing) waarmee de stromen van diverse verbruikers gemeten kunnen worden, en waarop aansluit mogelijkheden zijn voor sensors waarmee temperaturen, luchtvochtigheid, CO2 gehalte, diverse verontreinigende gassen en de fijnstof concentratie gemeten kunnen worden.
Er kunnen relais aangestuurd worden waarmee bepaalde verbruikers afgeschakeld dan wel niet toegelaten kunnen worden, o.a. op grond van de SpaceState.

De monitor units zijn niet slim, d.w.z. ze nemen geen beslissingen over afschakelen of niet toelaten van verbruikers. Die taak is voor de “Mediator”, een stuk software dat buiten het bereik van dit project valt.
Deze units communiceren met die “Mediator” via het MQTT protocol.
Het MQTT protocol laat wel toe dat andere entiteiten gebruik maken van de informatie die de Monitor-units aanleveren.





Foto
Het gemonteerde bord, ca. 190 x 110 mm.  Rechts onder het Ethernet Shield, aan de onderkant van de print is de Arduino MEGA ingestoken (niet zichtbaar) Voor dit bord + een 24VDC power supply is een behuizing ontworpen (lasersnijden) met een doorzichtig deksel zodat de led’s geďnspecteerd kunnen worden.
Het bord is aan de componentenzijde vingerveilig t.a.v. de 230 Volt voedingsspanning in het gebied linksboven. De onderkant van het bord is daar niet vingerveilig.
Nabij de rode led is een lange messing schroef gemonteerd. Deze is bedoeld om de GND draad van een oscilloscope aan te klemmen.
Alle aansluitingen van de Arduino MEGA zijn uitgevoerd met een bus aan de bovenzijde. Ook dat is gedaan voor het gemakkelijk aansluiten van meetapparatuur.


Specificaties:

Algemeen:
Het bord wordt bestuurd door een Arduino MEGA 2560 R3. Er zijn versies in omloop met verschillende USB-serial converters. De PC waarop de firmware gecompileerd wordt moet hiervoor ingericht zijn.
Er wordt een Arduino Ethernet Shield gebruikt voor de communicatie met de MQTT-Broker. Er zijn ETH-shields in omloop met verschillende Ethernet Interface IC’s. Voor het compileren van de firmware moet de juiste chip geconfigureerd zijn in de Arduino libraries.

Stroom meting:
Via maximaal 7 stroom transformatoren kunnen 50 Hz wisselstromen gemeten worden in bijv. een groepenkast. De stroommeting en calibratie gebeurt zodanig dat het resulteert in de amplitude van de stroom en de fase-hoek, zodat ook het werkelijke vermogen berekend kan worden.
De meetmethode is niet true-RMS, d.w.z. dat als de golfvorm van de stroom sterk afwijkt van de zuivere sinusvorm er een meetfout optreedt. Alle meetkanalen hebben wel een 2e orde laag-doorlaat filter dat harmonischen wegfiltert. Deze filters zijn identiek uitgevoerd zodat de faseverschuiving in alle meetkanalen dezelfde is.
De fase-referentie wordt betrokken van de voedingstrafo op het board, die geacht wordt op de R-fase aangesloten te zijn. De stroom- en fasemetingen worden gemiddeld over 1/2 seconde.
De eerste 3 stroom meetkanalen worden geacht aangesloten te zijn op stroomtrafo’s in de R, S en T-fasen. De 4 andere kanalen (8 t/m 11) kunnen naar believen andere stromen meten. De nominale fase voor deze kanalen wordt d.m.v. jumpers ingesteld.
Kanaal 8 is geschikt te maken om de spanning tussen de Nul en de Veiligheidsaarde te meten.
De calibratie van de metingen vindt plaats door het kiezen van de weerstanden waarmee de stroomtrafo’s afgesloten worden, in combinatie met parameters in de firmware (hard te coderen)

In / Uit schakelen van verbruikers:
Er kunnen maximaal 7 relais aangesloten worden voor het schakelen van eindgroepen.
De relais dienen te werken met een spoelspanning van 24 VDC en gezamenlijk niet meer dan 1A te gebruiken, per stuk niet meer dan 300 mA.
Als er relais gebruikt worden dan moet er een aparte 24 VDC voeding aangesloten worden. Daarvoor is ruimte gereserveerd in de behuizing.

Sensoren voor luchtkwaliteit:
Er is voorzien om een BME280, een CSS811 en een SDS011 sensor aan te sluiten.
De BME280 meet temperatuur, luchtvochtigheid en barometrische druk.
De CSS811 meet relatieve CO2 en VOC gehaltes. (VOC = Volatile Organic Compounds)
De SDS011 meet fijnstof deeltjes van 10μm en 2.5 μm.

Daarnaast kunnen maximaal 10 temperatuur sensoren van het Dallas type DS18B20 of DS18S20 aangesloten worden.

De BME280 en CSS811 sensoren worden in een daarvoor ontworpen behuizing geplaatst en aangesloten met een 4-aderig kabeltje, bijv. het type telefoonkabel met rood-blauw-zwart-geel.
Deze sensoren gebruiken het I2C protocol. In die behuizing is een conversie naar 3.3 Volt voorzien voor de CSS811. Er kunnen ook andere sensoren op 3.3 Volt aangesloten worden.

De SDS011 heeft een 3 aderig kabeltje nodig en praat seriëel 9600 baud.
Deze sensor bevat een laserdiode met een beperkte levensduur en wordt normaliter slechts 1 x per 10 minuten of zo, even ingeschakeld.

De Dallas temperatuur sensoren hebben 3 aders nodig. Er is 5 Volt voedingsspanning beschikbaar zodat er geen gebruik gemaakt hoeft te worden van de z.g. parasite power mogelijkheid.
Sensoren van het type DS18S20 (0.5 °C resolutie) en DS18B20 (0.0625 °C resolutie) kunnen door elkaar aangesloten worden. De firmware bepaalt automatisch de juiste calibratie factor.
De identificatie codes voor deze sensoren worden bij het opstarten automatisch door de firmware uitgeplozen en toegekend aan de meetkanalen. Er moet dan alleen nog experimenteel uitgezocht worden welke sensor op welk meetkanaal gerapporteerd wordt.

Request kastjes:
In sommige gevallen zal het wenselijk zijn dat een grote verbruiker niet domweg ingeschakeld wordt, en dat de Mediator dan maar moet uitzoeken wie er afgeschakeld kan/moet worden, maar dat er eerst een verzoek gedaan wordt om die grote verbruiker te mogen inschakelen. Daarvoor kunnen er twee z.g. Request kastjes aangesloten worden.
En request kastje bevat een rode en een groene led en een drukknop.
Als de betreffende load ingeschakeld mag worden brandt de groene led, indien niet de rode. In dat geval kan het verzoek ingediend worden door op de drukknop te drukken.
De groene led gaat knipperen zolang het verzoek in behandeling is. Als het mag gaat groen continue, anders terug naar rood. (jammer dan)
Het is aan de Mediator om te bepalen hoe lang de betreffende load ingeschakeld mag blijven.

Feature Connector:
Er is een connector aanwezig waarmee extra dingen gedaan kunnen worden. Daarvoor moet de firmware aangepast worden.
De volgende functies zijn bereikbaar:
- GND en +5Volt.
- RXD en TXD voor seriele communicatie.
- 4 digitale in/uitgangen (kunnen geen interrupt genereren).
- 2 digitale in/uitgangen (kunnen interrupts genereren of PWM output zijn).
- 2 analoge ingangen.
- SPI poort met faciliteiten voor bijv. een display.


MQTT berichten:

Voor een beknopte samenvatting van het MQTT protocol zie “Broker” e.v. in de begrippenlijst.

Elke Monitor unit moet een unieke ClientID te hebben. Deze verschijnt in alle publicaties en subscriptions (behalve de HeartBeat subscription).
De ClientID verwijst bij voorkeur naar de locatie of het doel van de betreffende unit.

Publicaties:

Topic: ClientID/Status
Payload: “sss ” + <VersionString>
Waar sss (byte) Status.
Status:
bit 0 = Request van kastje 1,
bit 1 = Request van kastje 2,
bit 3 .. 6 n.t.b.
bit 7 = Error tijdens initialisatie van de unit.
De <VersionString> bevat de ClientID en de bouw datum en tijd van de firmware.
Publicatie interval: Eens per minuut, en als de Request Status verandert.

Topic: ClientID/Power
Payload: “ aaa aaa aaa aaa aaa aaa aaa fff fff fff fff fff fff fff”.
Waar aaa de amplitude in deci-Amperes en fff de fasehoek in graden is van de kanalen R, S, T, ch11, ch10, ch09 en ch08, in die volgorde.
Publicatie interval: 2 x per seconde. Er wordt steeds over 25 lichtnet periodes gemiddeld.

Topic: ClientID/AirQuality
Payload: “ tttt hhhh bbbb cccc vvvv nnnn pppp”
Waar tttt de temperatuur in deci °C (kan negatief zijn), hhhh Hygro in %relatief, bbbb de barometrische druk in mBar c.q. hectoPascal, cccc de CO2 concentratie in ppm, vvvv de VOC concentratie in ppm, nnnn de fijnstof concentratie van 10um deeltjes en pppp de fijnstof concentratie van 2.5 um deeltjes, beide in ug/m3, bereik 0 .. 999.
Voor niet gebruikte sensoren wordt -999 gerapporteerd.
Publicatie interval: 1 x per minuut. (Fijnstof wordt infrequent gemeten, de laatst gemeten waarde wordt opgegeven)

Topic: ClientID/DallasTemperatures
Payload: “ tttt tttt tttt tttt tttt tttt tttt tttt tttt tttt”
Waar tttt de temperatuur is in deci °C.
Er is gerekend op maximaal 10 sensoren. Voor afwezige sensoren wordt -999 gerapporteerd.
Publicatie interval: 1 x per minuut.

Topic: ClientID/HeartBeatAck
Payload: 1 byte, die de payload van de Mediator’s HeartBeat publicatie echo’t.
Publicatie interval: Als respons op de HeartBeat van Mediator.

Abonnementen (Subscriptions):

Topic: ClientID/SetRelays
Payload: “ddd”
Waar ddd de relais code is.
De relais zijn genummerd 1 t/m 7. Dit correspondeert met de bitjes 1 t/m 7 in binary(ddd). Bit 0 doet niets.

Topic: ClientID/SetRequestLights
Payload: “ddd”
Waar ddd een byte waarde is met:
Bits 0, 1, 2, 3 voor RequestBox 1, bits 4, 5, 6, 7 voor RequestBox 2.
Bit 0, 4 rood, bit 1, 5 groen knipperend, bit 2, 6: groen. 
Bit 3, 7: cancel RequestButton.

Topic: Mediator/HeartBeat
Payload: 1 byte, wordt modulo 256 opgehoogd door de Mediator.
Mediator verwacht een  ClientID/HeartBeatAck bericht en rapporteert (n.t.b. aan wie?) een error als die uitblijft.
N.B. Het MQTT protocol ondersteunt ook een soort HeartBeat procedure. Ik vond de mogelijkheden daarvan echter te beperkt of niet erg geschikt (Last Will gedoe)






Integratie.

Een voorbeeld van hoe zulke monitoren in de elektrische installatie geďntegreerd kunnen worden.
In dit voorbeeld is ook een suggestie van mij verwerkt, nl. om de sub-groepenkasten niet afzonderlijk af te zekeren maar via een scheider aan te sluiten op de hoofdkast. De daarvoor benodigde kabel moet flink zwaar zijn, ik denk aan 5 x 10 mm2. Elke kast heeft uiteraard ook een scheider aan de ingang om veilg te kunnen werken zonder alle sub-kasten af te schakelen.
Het afzonderlijk afzekeren van de sub-kasten leidt tot een bijkans onoplosbaar selectiviteits probleem.






Aansluiten van relais en 24 VDC Power Supply.


                   
 
Aansluiten van Sensors en Stroomtransformatoren.
Houd er rekening mee dat de - kant van de stroomtrafo’s op + 2.5 Volt DC staat.



Genereren van een nieuwe unit:

Montage hardware:
Zie de onderdelen lijst.
Componenten die alleen dienen voor functies die toch niet gebruikt worden kunnen weggelaten worden. Check daarvoor de schema’s.
Er is een modificatie nodig op de print. De verbinding tussen pin 13 en de Reset van de arduino moet worden doorgesneden en Reset moet aan pin 8 van de arduino mega gelegd worden.
De benodigde schroefklemmen moeten worden samengsteld uit de beschikbare 2- en 3-polige blokjes. Van de goene blokjes moeten de pennen ingeknepen worden met een platbektangetje.

Firmware:
Gebruik een PC of laptop met een recente versie van de Arduino IDE en de juiste libraries:

Adafruit_BME280_Library-master
Adafruit_BusIO-master
AdaFruit_CSS811-master
Adafruit_Sensor-master
Ethernet-5500 (voor het geval dat er W5500 ETH chips gebruikt worden)
OneWire-master
PubSubClient

1/ Maak een directory met de naam FW_<Nieuwe CLIENTID>
   <Nieuwe CLIENTID> dient z.m. de locatie of het doel van de nieuwe unit aan te geven.
2/ Copieer de files van een bestaande instantie naar dat directory.
3/ Wijzig de naam van de .ino file in die van het directory en start de IDE.
4/ Wijzig in de Gobals.h file het item #define CIENTID in de nieuwe naam. 
5/ Geef in de file Globals.h op welke sensors er gebruikt gaan worden.  Dat zijn de items:

#define USE_CURRENTS
#define USE_BME280 
#define USE_CCS811
#define USE_SDS011
#define USE_DALLAS_SENSORS
#define USE_REQUEST_BOX1
#define USE_REQUEST_BOX2

6/ Geef in de file Client.cpp op wat het IP adres van deze unit moet zijn. (ClientIP, verschillend voor alle monitor units)
7/ Geef in de file Client.cpp op wat het IP adres van de Broker is. (BrokerIP, zelfde voor alle monitor units)
8/ Compileer het programma en laad het in de unit.
9/ Activeer de Arduino Monitor met ctrl-shift-M en inspecteer de uitvoer bij het opstarten. Zie voorbeeld.
10/ Copy-paste de Build-datum en tijd van de uitvoer naar de .ino file bij het item VERSIONSTRING en sla het project op.
N.B. De build datum en tijd worden automatisch gegenereerd bij het compileren, maar komen niet automatisch in de broncode terecht. Voor de traceability is dat wel erg gewenst.


Calibraties:

Berekenen van de afsluitweerstanden voor de stroomtrafo’s. (Zie ook schema deel 2)
Het p-p bereik van de A/D converter is 5 Volt en de gain van de filterversterkers is 1.
5V p-p komt overeen met 1.77 V RMS.
Stroomtransformatoren hebben een conversiefactor F (vaak 100 , 1000 of 10000)
Voorbeeld:
Kies het maximale stroombereik I-max, bijv. 30A voor een 25A gezekerde groep. (We houden wat marge).
De afsluitweerstand moet dan zo gekozen worden dat bij die stroom een spanning van 1.77 V ontstaat. Dus bereik 30A, stel F= 1000, de secondaire stroom is dan 30 mA, en je krijgt 1.77 V met een weerstand van 1.770 / 0.030 = 59 Ohm. Neem de eerst kleinere reekswaarde: 56 Ohm. Verdere calibratie gebeurt in de firmware.
De afsluitweerstanden voor de kanalen R, S, T, zijn resp. R29, R30, R31, en die voor de kanalen 11, 10, 09, 08 resp. R52, R53, R54 en R55.
Om kanaal 08 te gebruiken met een stroomtrafo moeten R51 en C18 overbrugd worden.
Kanaal 08 is in beginsel voorbereid om de spanning tussen de Nul en Veiligheidsaarde te meten. Met R55 = 1 kOhm en R51 = 11 kOhm is er een bereik van 20 Volt. In de praktijk mag die spanning enkele volts bedragen; als het meer is dan ca. 10 Volt dan is er iets geks aan de hand dat aandacht vereist.
De fase waarop de stroom meetkanalen 08 t/m 11 aangesloten zijn kan ingesteld worden met het 3 x 4 jumperblok. (kan on-the-fly gewijzigd worden).
Zonder jumper geldt de fase als R (dezelfde fase als die waarop de voeding is aangesloten) Met een jumper op de R of T positie wordt de fasehoek zodanig gecorrigeerd dat de fase voor een zuiver ohmse belasting nagenoeg 0 of 359 is.

Verdere calibraties in de software.
De stromen worden bepaald met een quadratuurmeting. Dat wil zeggen dat het signaal bemonsterd wordt op de momenten A, B, C en D. Zie figuur hieronder. De waarde A wordt opgeteld bij een Sinus-term, C wordt daar van afgetrokken. B wordt opgeteld bij een Cosinus-term en D wordt daarvan afgetrokken. Dat gebeurt over een interval van 0.5 seconde, dus 25 periodes.
De amplitude wordt dan berekend als de Wortel uit (Sinus-term2 + Cosinus-term2).  Deze amplitude is onafhankelijk van de fase hoek van de stroom.
De A/D converter heeft een bereik van 5 V p-p of 1.77 Volt RMS, hetgeen 1023 A/D eenheden oplevert. Na sommatie over 25 periodes geeft dat 25565 eenheden.
Dus: 25565 eenheden komt overeen met 1.77 Volt rms.
De calibratie wordt nu: Stroom in A-rms = gemeten eenheden / 25565 * 1.77 / Rt * F  [A]
De waardes voor elk kanaal dienen ingevuld te worden in de file Currents.cpp van de firmware. (regel 31 e.v. )



De sample momenten voor de quadratuurmeting, hier voor een Ohmse  stroom met fasehoek ϕ = 0, oftewel cos(ϕ) = 1.  A en C zijn de sinus termen, B en D de cosinus termen.
Het signaal heeft een offset ter grootte van de halve voedingsspanning omdat deze A/D converter geen negatieve signalen kan verwerken. Bij de uiteindelijke signaalverwerking blijkt dat die offset wegvalt, zodat de precieze waarde ervan niet ter zake doet.


Testen en Diagnose:

Voor Testen en Diagnose dient er een terminal aangesloten te worden op de seriele poort van de Arduino. Dit kan de monitor van de Arduino IDE zijn (ctrl-shift-M) of een andere terminal, bijv. Putty. Instelling: 19200 baud, 8 bit, No parity, 1 of 2 stopbits.
Het is ook nodig dat er een goed werkende MQTT Broker aanwezig is in het netwerk, bijv. Mosquitto.

Hulpsoftware:
Er is een dummy-Mediator gemaakt, een PC-programma dat zich als Mediator gedraagt in zoverre dat het de data van een monitorunit weergeeft.
Er is eveneens een MQTT-Spy beschikbaar die alle berichten van de Broker toont.

Service Mode: Jumper op JP1-JP2. (kan on-the-fly gewijzigd worden).
In Service Mode worden de sensoren veel vaker uitgelezen dan in de normale mode, en de voeding voor de fijnstofsensor blijft continue aan.

Diagnose Mode: Jumper op JP3-JP4. (kan on-the-fly gewijzigd worden).
In Diagnose Mode worden de ontvangen en verstuurde MQTT berichten ook weergegeven via de seriele poort.

Andere diagnose voorzieningen:
Het intypen van de (hoofd) letter 'R' veroorzaakt een volledige (ook hardware) reset van de Arduino.
Een 'D' veroozaakt het opnieuw uitzoeken en rapporteren van de Dallas temperatur senors.
Relais kunnen aangezet worden door het intypen van een cijfer 1 t/m 7, en 0 voor het uitzetten van alle relais.
N.B. Als er een MQTT Topic_SetRelays binnenkomt gaat dat voor.

Led's:
CONN (groen)  Continue aan: Connectie met Broker OK. Snel knipperen: Fout bij verbinden met de Broker.
PUB (geel)     Toggelt bij elke publicatie
SUB (blauw)   Subscriptions gelukt. Snel knipperen: 1 of meer subscriptions mislukt.
HTBT (rood)   Toggelt bij het ontvangen van de Heartbeat Topic. Snel knipperen: Fout tijdens het initialiseren van de sensors.

Testpunten:
De 8 aansluitingen ADCL van de Arduino MEGA zijn gebruikt als test-uitgangen, bedoeld om met een oscilloscope bepaalde (timing) signalen te bekijken. Ze zijn bereikbaar op het Ethernet shield als A0 t/m A5. A6 en A7 zijn beschikbaar op de connector onder het ETH shield. (A6 wat lastig bereikbaar)
In de firmware zijn deze aansluitingen aangeduid als DIAGPIN_n.

DIAGPIN_0:
Toont de activiteit in FW_Monitor_xxx.ino/loop(). Verwacht een puls van ca. 80 usec met een herhalingstijd van ca. 1.1 msec.

DIAGPIN_1:
Toont de in-service tijd van de interrupt ISR(TIMER3_COMPA_vect).
Verwacht een puls van 4 ŕ 5 usec met een herhalingsfrequentie van 20 kHz.

DIAGPIN_2:
50 Hz Mains trigger.Toggelt op het moment waarop een positief gaande nuldoorgang gevonden wordt voor het signaal op de ADC-15 input. Dat is het gefilterde signaal van de voedingstrafo.
Als USE_CURRENTS uitgeconfigureerd is of er is geen lichtnet signaal zien we een triggersignaal van ongeveer 50 Hz.

DIAGPIN_3:
Toont de periodes waarin het sampelen van de stromen plaatsvindt. Verwacht per 50 Hz periode 4 pulsen van 300 usec op tijden 0, 5, 10 en 15 msec na de trigger op DIAGPIN_2.

DIAGPIN_4:
Toont het 4e quadrant, als de 4 samples genomen zijn, tot aan het vinden van de volgende nul-doorgang.

DIAGPIN_5:
Toont het uitlezen van de sensoren. Verwacht pulsen met een interval niet korter dan 200 msec. De pulsduur varieert afhankelijk van welke sensor er uitgelezen wordt.

DIAGPIN_6:
Wordt niet gebruikt want is lastig te bereiken.

DIAGPIN_7:
Toont de tijden gebruikt voor het uitlezen van de Dallas temperatuur sensoren (indien in gebruik)
Er zijn steeds 2 pulsen na elkaar te zien, eerst het uitlezen van een sensor, kort daarna het starten van de conversie voor de volgende sensor. 
Deze pulsen vallen samen met de activiteit op de 1-wire bus op T9.

Opstart sequence:
Na opstarten of reset wordt er achtereenvolgens een aantal tests gedaan:

- De 4 MQTT leds op het bord worden in sequentie aan / uit gezet gedurende 4 seconden.
- Indien geconfigureerd worden de leds op de RequestBoxen 1 en 2 getest in de sequentie rood, groen, gedurende ca. 4 seconden.
- De te publiceren topics worden weergegeven, maar alleen als de betreffende sensors niet uitgeconfigureerd zijn.
- De topics waarop deze unit zich moet abonneren worden weergegeven.
- Vervolgens wordt de verbinding met de Broker opgezet en worden de nodige subscriptions gedaan.
- De jumper settings voor ServiceMode en DiagnoseMode worden geëvalueerd en gerapporteerd. Alleen indien USE_CURRENTS is geconfigureerd wordt de instelling van de Fase-configuratie jumpers weergegeven.
- Het stroom-meetsysteem wordt geďnitialiseerd als USE_CURRENTS geconfigureerd is. Indien niet dan verschijnt de mededeling ‘Falling back to default Task Dispatcher’. Dat betekent het volgende: Het stukje software dat de timing voor de stroommetingen regelt wordt ook gebruikt voor de timing van de andere sensoren en het publiceren van topics. Het wordt daartoe gesynchroniseerd met de lichtnet frequentie. Indien niet gebruikt voor stroommetingen moet het toch in een tempo van ongeveer 50 Hz blijven lopen. Dat is de ‘Fall back’ voorziening.
Idem als USE_CURRENTS wel geconfigureerd is maar er is geen 50 Hz voeding aanwezig. In dat geval verschijnt het bericht “No Mains Zero Crossing found”. Als de 50 Hz weer terugkomt komt het weer goed.
- Hierna worden de andere sensors geďnitialiseerd, indien ze geconfigureerd zijn.
- Indien USE_DALLAS_SENSORS geconfigureerd is wordt er gezocht naar zulke sensors. Van de sensors die gevonden zijn wordt de ROM code, het chip-type en de temperatuur weergegeven.
Als er twee of meer zulke sensors in bedrijf zijn moet er handmatig uitgezocht worden welke sensor op welk kanaal gerapporteerd wordt. Dat kan bijv. door steeds 1 van de sensoren met de hand te verwarmen en dan te kijken op welk kanaal je de temperatuurstijging ziet.
Door het intypen van de hoofdletter ‘D’ wordt opnieuw gezocht naar de Dallas sensoren.
Het is sterk aan te bevelen om een copie te maken van dit lijstje kanaalnummers en ROM codes, en daarbij te noteren waar die sensors precies zitten. Als er in de toekomst sensors bijkomen, afgaan of vervangen worden zal de volgorde in het algemeen anders worden. Je kunt dan aan de ROM codes zien wie wie is/was.

Output op de seriële poort tijdens het opstarten: (voorbeeld)

16:54:00.734 -> FW_Monitor_Primary   Build: Oct  2 2021 16:53:47
16:54:00.767 -> Client ID = Monitor_Primary
16:54:01.065 -> Client IP = 192.168.2.5
16:54:01.065 -> Broker IP = 192.168.2.4
16:54:01.098 -> 
16:54:01.098 -> Testing MQTT Leds
16:54:05.078 -> Testing RequestBox 1 Leds
16:54:07.101 -> Testing RequestBox 2 Leds
16:54:09.125 -> 
16:54:09.125 -> Prepare Topics to publish: 
16:54:09.125 -> Monitor_Primary/Status
16:54:09.125 -> Monitor_Primary/Power
16:54:09.158 -> Monitor_Primary/AirQuality
16:54:09.158 -> Monitor_Primary/DallasTemperatures
16:54:09.191 -> Monitor_Primary/HeartBeatAck
16:54:09.191 -> 
16:54:09.191 -> Prepare Topics to subscribe to: 
16:54:09.224 -> Monitor_Primary/SetRelays
16:54:09.224 -> Monitor_Primary/SetRequestLights
16:54:09.258 -> Mediator/HeartBeat
16:54:09.258 -> 
16:54:09.258 -> Try to connect to the MQTT Broker
16:54:09.457 -> Monitor_Primary is now connected to the MQTT Broker
16:54:09.490 -> Subscribe to Topic: Monitor_Primary/SetRelays....OK
16:54:09.523 -> Subscribe to Topic: Monitor_Primary/SetRequestLights....OK
16:54:09.556 -> Subscribe to Topic: Mediator/HeartBeat....OK
16:54:09.556 -> 
16:54:09.556 -> Evaluate Jumper settings: 
16:54:09.589 -> Service Mode is OFF
16:54:09.589 -> Diagnostic Mode is OFF
16:54:09.589 -> 
16:54:09.622 -> Channel 08 Mode is: R
16:54:09.622 -> Channel 09 Mode is: T
16:54:09.622 -> Channel 10 Mode is: R
16:54:09.656 -> Channel 11 Mode is: R
16:54:09.656 -> 
16:54:09.656 -> Initializing Current Measurements....
16:54:09.689 -> Current Measurements Initialized.
16:54:09.689 -> 
16:54:12.806 -> Start initialisation of sensors:
16:54:12.806 -> Initialize BME280 sensor for Temperature, Hygro and Baro.....OK
16:54:13.237 -> Initialize CCS811 sensor for eCO2 and eVOC..... OK
16:54:17.416 -> Initialize SDS011 Particle Sensor.....OK
16:54:19.440 -> Searching for Dallas Temperature Sensors....
16:54:19.473 -> Sensor no 0: ROM = 40 25 65 117 208 1 60 30 , Chip = DS18B20
16:54:19.507 -> Sensor no 1: ROM = 40 31 51 117 208 1 60 66 , Chip = DS18B20
16:54:19.540 -> Found 2 Dallas Temperature Sensors.
16:54:20.568 -> Sensor no 0: Temperature = 25.12 Celsius, 
16:54:21.596 -> Sensor no 1: Temperature = 24.69 Celsius, 
16:54:21.596 -> 
16:54:21.596 -> Enter 'D' to repeat the Dallas Sensor Search
16:54:21.630 -> 
16:54:21.630 -> No errors found during initialisation


Hulp Software:

Voor het testen van de Arduino firmware zijn twee hulpprgramma's gemaakt in FreePascal (3.2.0) met de Lazarus-IDE (2.0.12) voor Linux.
Het programma Mediator vervult de functies van de "Mediator" in die zin dat de door de Monitor unit geproduceerde gegevens getoond worden en dat de "Mediator commando's" gegeven kunnen worden. Er zit verder geen slimmigheid in.
Het programma MqttSpy abonneert zich op alle berichten van de Broker en laat die zien met een time-stamp.
Beide programma's produceren een event-log file met een date-timestamp als naam.
Het IP adres van de Broker wordt uit een tekst bestandje MQTTBrokerIP.txt gelezen, en -indien gewijzigd- daar ook weer naar teruggeschreven bij het stoppen van het programma
Beide programma's zijn in broncode te downloaden in zip-formaat. Er zit een linux-32 executable bij.
Voor het compileren is een niet te oude versie van Lazarus / Free Pascal nodig.


Software:

De software voor de monitor units is ontwikkeld met de Arduino 1.8.16  IDE op een Linux-Mint PC.
Het testen van de communicatie is gedaan tegen de “Mosquitto” Broker op diezelfde PC.

De Arduino software bestaat uit:
Een directory “FW_Monitor_Primary” met de files:

“FW_Monitor_Primary.ino“
“Client.cpp“
“Currents.cpp“
“Sensors.cpp“
“Globals.h“
“DiagMEGA.h“

“FW_Monitor_Primary.ino” is de start-up file voor het project. Aanbeveling voor de naam: “FW_” + de CLIENTID van de betreffende instantie.
De naam van het directory en deze .ino file moeten identiek zijn.
Deze .ino file bevat de setup(), loop() en enkele algemene functies.

“Client.cpp“ bevat nagenoeg alles wat nodig is voor het publiceren en ontvangen van MQTT berichten.
 
“Currents.cpp“ bevat de routines die nodig zijn voor het meten van de stromen. Er wordt een interrupt handler gebruikt die ook nodig is als er geen stromen gemeten hoeven te worden.
In deze interrupt handler worden ook enkele andere functies afgehandeld.

“Sensors.cpp“ bevat de routines voor het initialiseren en bevragen van de sensors, anders dan de stroom sensors.

“Globals.h“ bevat definities voor variabelen die in meer dan 1 file nodig zijn, en de #defines voor het in/uit configureren van sensors.

“DiagMEGA.h“ bevat een aantal definities die handig zijn voor het debuggen, i.h.b. met een oscilloscope.


Overzicht Functies:

Functie
Aangeroepen door
Hoe vaak
Doel
In .INO file:



EvaluateLeds ()
Currents.cpp / ISR(TIMER3_COMPA_vect)
ca. 6 Hz
Leds, zo nodig knipperen
EvaluateJumpers ()
.ino-file setup () 1-malig of in service mode bij invoer van 'D'
Stand van de jumpers uitzoeken
Sequence_MQTT_Leds ()
.ino-file setup () 1-malig Testen van de 4 MQTT leds
Sequence_Request1_Leds ()
.ino-file setup () 1-malig Testen van de leds op Request box 1
Sequence_Reques2_Leds ()
.ino-file setup () 1-malig Testen van de leds op Request box 2
SystemReset ()
.ino-file  loop () In service mode bij invoer van 'R' Complete hardware reset van de Arduino.
Doet hetzelfde als de reset button
setup ()
Bij opstarten
1-malig Initialisaties
loop ()
Continue
ca. 1 kHz
Handelt opdrachten via de seriële poort af.




In file Client.cpp:
Aangeroepen door
Hoe vaak
Doel
InitTopics ()
InitClient () 1-malig Voorbereiden van de Topic strings
TopicReceived ()
PubSub Library (Callback)
Bij ontvangen van een topic
Opdracht uitvoeren
UpdateClient ()
.ino-file  loop ()
ca. 1 kHz
Publiceren van Topics
InitClient ()
.ino-file setup () 1-malig Initialisatie, opzetten van communicatie met de Broker, Subscriptions doen.




In file Currents.cpp:
Aangeroepen door
Hoe vaak
Doel
ISR(TIMER3_COMPA_vect)
Timer 3 Interrupt
20 kHz
Systeem timing, Meten van de stroomtrafo's,
Opwekken Blink signaal.
UpdateCurrents ()
ISR(TIMER3_COMPA_vect) 0.5 Hz
Berekenen van stromen en fase hoeken, Voorbereiden van Payload Power
InitCurrents ()
.ino-file setup () 1-malig Initialisatie van A/D converter en Timer 3




In file Sensors.cpp:
Aangeroepen door
Hoe vaak
Doel
UpdatePublicationScheduler ()


Bepaalt publicatie interval
UpdateSensors ()
.ino-file  loop () ca. 1 kHz Uitlezen van geconfigureerde sensoren
SearchDallasSensors ()
.ino-file setup ()
.ino-file  loop ()
1-malig, of in service mode bij invoer van 'D' Zoek naar Dallas temperatuursensors op de 1-wire bus.
ReadDallasSensor ()
.ino-file setup ()
.ino-file  loop ()
1-malig, of  in service mode bij invoer van 'D' Uitlezen van de gevonden Dallas sensoren.
N.B. Het periodiek uitlezen van deze sensoren gebeurt via een ander mechanisme in UpdateSensors ()
 InitSensors ()
.ino-file setup () 1-malig Initialisatie van sensors, voor zover die geconfigureerd zijn




In file DiagMEGA.h


Definities voor diagnose signalen op ADC-L connector.
In file Globals.h


Definities van globale identifiers,
Configuratie van sensor gebruik.


Arduino MEGA 2560 pin use:

Pin number
Port, Bit
Funtion
Remark
A0
PORTF-0
Diagnostic output

A1
PORTF-1 Diagnostic output
A2
PORTF-2 Diagnostic output
A3
PORTF-3 Diagnostic output
A4
PORTF-4 Diagnostic output
A5
PORTF-5 Diagnostic output
A6
PORTF-6 Diagnostic output Also on Feature Connector
A7
PORTF-7 Diagnostic output Also on Feature Connector




A8
PORTK-0
Analog input Channel 8
Current input Line tbd / Voltage PE-N
A9
PORTK-1 Analog input Channel 9 Current input Line tbd
A10
PORTK-2 Analog input Channel 10 Current input Line tbd
A11
PORTK-3 Analog input Channel 11 Current input Line tbd
A12
PORTK-4 Analog input Channel 12 Current input Line T
A13
PORTK-5 Analog input Channel 13 Current input Line S
A14
PORTK-6 Analog input Channel 14 Current input Line R
A15
PORTK-7 Analog input Channel 15 Voltage input Line R




0
PORTE-0 RXD-0
programming / diagnostics
1
PORTE-1 TXD-0
programming / diagnostics
2
PORTE-4
/Enable Particle Sensor

3
PORTE-5 1-Wire
DS18x20 Temperature Sensors
4
PORTG-5 n.c.

5
PORTE-3 SEL-TFT
On Feature Connector
6
PORTH-3 DIR-TFT
On Feature Connector
7
PORTH-4 n.c.





8 PORTH-5 RESET Hardware Reset
9
PORTH-6 n.c.

10 PORTB-4 SEL-ETH
Internally to ETH Board
11
PORTB-5 PB5 / OC1A / PCINT5
On Feature Connector
12
PORTB-6 PB6 / OC1B / PCINT6
On Feature Connector
13
PORTB-7 n.c.




 
14
PORTJ-1
TXD3
n.c.
15
PORTJ-0 RXD3
Data from particle Sensor
16
PORTH-1 TXD2
not used
17
PORTH-0 RXD2
not used
18
PORTD-3 TXD1
On Feature Connector
19
PORTD-2 RXD1
On Feature Connector
20
PORTD-1 I2C-SDA
Sensors
21
PORTD-0 I2C-SCL
Sensors




22
PORTA-0
Led-Green-1
Request Unit 1
23
PORTA-1 Led-Green-2
Request Unit 2
24
PORTA-2 Led-Red-1 Request Unit 1
25
PORTA-3 Led-Red-2
Request Unit 2
26
PORTA-4 Switch-1
Request Unit 1
27
PORTA-5 Switch-2
Request Unit 2
28
PORTA-6 JP1 (JP2 = GND)
When connected: Service Mode
29
PORTA-7 JP3 (JP4 = GND)
When connected: Diagnose Mode




30
PORTC-7 Relay Output-T26
31
PORTC-6 Relay Output-T27
32
PORTC-5 Relay Output-T28
33
PORTC-4 Relay Output-T29
34
PORTC-3 Relay Output-T30
35
PORTC-2 Relay Output-T31
36
PORTC-1 Relay Output-T32

37
PORTC-0 Led HeartBeat





38
PORTD-7
Led-SUB

39
PORTG-2 Led-PUB

40
PORTG-1 Led-CONN

41
PORTG-0 Config-alt





42
PORTL-7 PL7 On Feature Connector
43
PORTL-6 PL6
On Feature Connector
44
PORTL-5 PL5
On Feature Connector
45
PORTL-4 PL4
On Feature Connector
46
PORTL-3 Config-ch-11 jumper

47
PORTL-2 Config-ch-10 jumper
48
PORTL-1 Config-ch-09 jumper
49
PORTL-0 Config-ch-08 jumper




50
PORTB-3 SPI-MISO
Also on Feature Connector
51
PORTB-2 SPI-MOSI
Also on Feature Connector
52
PORTB-1 SPI-SCK
Also on Feature Connector
53
PORTB-0 SPI-SS
SEL SD-Card on ETH Shield?  not used







Begrippen:    (binnen het kader van dit document / project)

Monitor, Monitor-unit, Unit: De hier beschreven elektronica en firmware.

Mediator:
Een software die de gevens van de Units verzamelt en besluiten neemt over toe te laten c.q. af te schakelen verbruikers. Zou ook de verwarming / koeling en ventilatie kunnen aansturen. 

Broker, Client, Topic, Payload:
Begrippen van het MQTT protocol. MQTT-clients “publiceren” hun gegevens aan de Broker en kunnen “geabonneerd” zijn op bepaalde gegevens van andere clients.
Een MQTT bericht bestaat uit een “Topic” en een “Payload”. De Topic geeft aan waar een bericht vandaan komt of naartoe moet, de Payload is de inhoud van het bericht (gemeten waardes, afschakel opdrachten, e.d.) De Broker (ook wel Server genoemd) verdeelt de aangeboden informatie over de geabonneerde clients, maar bemoeit zich niet met de inhoud van de berichten.

BME280:
Een sensor die temperatuur, luchtvochtigheid (hygro) en luchtdruk meet. Deze sensor gebruikt het I2C protocol en wordt met een 4-ader kabeltje aangesloten op de Unit. Deze sensor zal in het algemeen op een geschikte plek in de buurt van de Unit geplaatst worden, en niet in de buurt van een warmtebron.
Er zijn diverse goedkope PCB-tjes te koop waarmee deze chip gemakkelijk aangesloten kan worden, o.m. GY-BM E/P 280.
Let op: de zeer goedkope BMP280 heeft geen hygro sensor aan boord.

CSS-811:
Een sensor die de equivalente CO2 en VOC gehaltes in de lucht meet.
Deze goedkope sensor meet ook VOC, Volatile Organic Compounds, Vluchtige Organische Bestanddelen. Dat is een verzamelnaam voor gasjes die niet in frisse lucht thuishoren.
Er zijn diverse goedkope PCB-tjes te koop waarmee deze chip gemakkelijk aangsloten kan worden..
De goedkopere versie loopt op 3.3 Volt en is officiëel niet 5 Volt tolerant.

CO2 of kooldioxide wordt door mensen en dieren uitgeademd en door planten opgenomen. Enkele richtwardes (Wikipedia):
390 ppm (2011) .. 417 ppm (2020) "normale" concentratie in de buitenlucht.
1500 ppm: Maximum toelaatbaar in een klaslokaal.
5000 ppm: MAC waarde = maximale langdurige blootstelling zonder blijvende schade.
10000 ppm: Sufheid bij langdurige blootstelling.
40000+ ppm: Ademnood, bewusteloosheid, dodelijk.

Dallas, Dallas-Sensors:
Hiermee wordt gedoeld op de bekende DS18B20 of DS18S20 temperatuur sensoren. Deze sensoren leveren digitale informatie via een 1-draads protocol. De calibratie is afhankelijk van het “B” of “S” type. Ik heb slechte ervaring met het gebruik van “Parasite Power”, waarbij de sensor z’n voedingsspanning betrekt van de signaaldraad. Ik gebruik ze hier met een 5Volt voedingsspanning via een derde draad.

CT, Current Transformer, Stroomtrafo:
Een instrumentje om (doorgaans vrij grote) wisselstromen te meten, zonder het circuit noemenswaardig te beďnvloeden. Een CT bestaat uit een kern van gelamineerd ijzer, als bij een gewone transformator, of van een of ander ferriet. De primaire wikkeling is doorgaans een enkele draad die door het gat van de kern gestoken wordt en waardoor de te meten stroom loopt. Er is een secondare wikkeling van doorgaans 100, 1000 of 10000 wikkelingen die aangesloten wordt op het meetcircuit. In deze secondaire loopt dan een stroom die 100, 1000 of 10000 maal kleiner is dan die in de primaire. Met een geschikte weerstand kan deze stroom omgezet worden in een spanning die op velerlei manieren gemeten kan worden.