### GLOBAL ### | |||||
# Random generated Desktop.ini files # | |||||
*.ini |
### Altium ### | |||||
# Previews Folders | |||||
**/__Previews/ | |||||
# History Folders | |||||
**/History/* | |||||
# Project Logs | |||||
Project Logs*/ | |||||
# Auto-conversion notices | |||||
*.PcbDoc.htm | |||||
# Access lock file for dbLib sources | |||||
**/*.ldb |
T€T€#v 2 s k €#v 2 s k €#v 2 s k €#v 2 s k €#v 2 s k €#v 2 s k €#v 2 s k €#v 2 s k €#v 2 s k €#v 2 s k €#v 2 s k €#v 2 s k €#v 2 s k €#v 2 s k €€# €7 8€78 €7 8€78 €78€78€78€# €78€78 €78€78€7 8€7 8€78 €# €78€7€8€7€7 8€7 €7 €8 €7 €7 €78€8€8€8€# €78€8€7 8 €8 €7 €7 €7 €7 €7 €7 €8 €7 €7 €7 €7 €7 €# €78€8€# €78€8€8€8€8€8€8€8 €7€8€8€8€8€8€8€8€# €78€8€# €7 8€8€7€8€T € |
---------------------------------------------------------------------------------------------------------------------------------- | |||||
NCDrill File Report For: Platine.PcbDoc 02.08.2021 23:43:27 | |||||
---------------------------------------------------------------------------------------------------------------------------------- | |||||
Layer Pair : Top Layer to Bottom Layer | |||||
ASCII RoundHoles File : Platine.TXT | |||||
EIA File : Platine.DRL | |||||
Tool Hole Size Hole Tolerance Hole Type Hole Count Plated Tool Travel | |||||
---------------------------------------------------------------------------------------------------------------------------------- | |||||
T1 28mil (0.711mm) Round 7 PTH 0.00inch (0.00mm) | |||||
T2 30mil (0.762mm) Round 7 PTH 0.00inch (0.00mm) | |||||
T3 32mil (0.8mm) Round 14 PTH 0.00inch (0.00mm) | |||||
T4 35mil (0.9mm) Round 16 PTH 0.00inch (0.00mm) | |||||
T5 39mil (1mm) Round 2 PTH 0.00inch (0.00mm) | |||||
T6 40mil (1.016mm) Round 16 PTH 0.00inch (0.00mm) | |||||
T7 47mil (1.2mm) Round 2 PTH 0.00inch (0.00mm) | |||||
T8 114mil (2.9mm) Round 4 NPTH 0.00inch (0.00mm) | |||||
---------------------------------------------------------------------------------------------------------------------------------- | |||||
Totals 68 | |||||
Total Processing Time (hh:mm:ss) : 00:00:00 |
------------------------------------------------------------------------------------------ | |||||
Gerber File Extension Report For: Platine.GBR 02.08.2021 23:43:26 | |||||
------------------------------------------------------------------------------------------ | |||||
------------------------------------------------------------------------------------------ | |||||
Layer Extension Layer Description | |||||
------------------------------------------------------------------------------------------ | |||||
.GTO Top Overlay | |||||
.GTP Top Paste | |||||
.GTS Top Solder | |||||
.GTL Top Layer | |||||
.GBL Bottom Layer | |||||
.GBS Bottom Solder | |||||
.GBP Bottom Paste | |||||
.GBO Bottom Overlay | |||||
.GM1 Mechanical 1 | |||||
------------------------------------------------------------------------------------------ |
G04* | |||||
G04 #@! TF.GenerationSoftware,Altium Limited,Altium Designer,21.5.1 (32)* | |||||
G04* | |||||
G04 Layer_Color=32896* | |||||
%FSLAX25Y25*% | |||||
%MOIN*% | |||||
G70* | |||||
G04* | |||||
G04 #@! TF.SameCoordinates,6B47F07E-1737-4CAB-AE6A-8125E67B32FB* | |||||
G04* | |||||
G04* | |||||
G04 #@! TF.FilePolarity,Positive* | |||||
G04* | |||||
G01* | |||||
G75* | |||||
M02* |
G04* | |||||
G04 #@! TF.GenerationSoftware,Altium Limited,Altium Designer,21.5.1 (32)* | |||||
G04* | |||||
G04 Layer_Color=128* | |||||
%FSLAX25Y25*% | |||||
%MOIN*% | |||||
G70* | |||||
G04* | |||||
G04 #@! TF.SameCoordinates,6B47F07E-1737-4CAB-AE6A-8125E67B32FB* | |||||
G04* | |||||
G04* | |||||
G04 #@! TF.FilePolarity,Positive* | |||||
G04* | |||||
G01* | |||||
G75* | |||||
M02* |
G04* | |||||
G04 #@! TF.GenerationSoftware,Altium Limited,Altium Designer,21.5.1 (32)* | |||||
G04* | |||||
G04 Layer_Color=16711935* | |||||
%FSLAX25Y25*% | |||||
%MOIN*% | |||||
G70* | |||||
G04* | |||||
G04 #@! TF.SameCoordinates,6B47F07E-1737-4CAB-AE6A-8125E67B32FB* | |||||
G04* | |||||
G04* | |||||
G04 #@! TF.FilePolarity,Negative* | |||||
G04* | |||||
G01* | |||||
G75* | |||||
%ADD30C,0.06706*% | |||||
%ADD31C,0.06800*% | |||||
%ADD32C,0.05131*% | |||||
%ADD33C,0.08674*% | |||||
%ADD34R,0.06706X0.06706*% | |||||
%ADD35C,0.07874*% | |||||
%ADD36C,0.12217*% | |||||
%ADD37C,0.05800*% | |||||
D30* | |||||
X16913Y55245D02* | |||||
D03* | |||||
Y43434D02* | |||||
D03* | |||||
X254331Y36614D02* | |||||
D03* | |||||
Y117323D02* | |||||
D03* | |||||
X433366Y57441D02* | |||||
D03* | |||||
X321240Y113740D02* | |||||
D03* | |||||
X331240D02* | |||||
D03* | |||||
X341240D02* | |||||
D03* | |||||
X351240D02* | |||||
D03* | |||||
X361240D02* | |||||
D03* | |||||
X371240D02* | |||||
D03* | |||||
X311240Y143740D02* | |||||
D03* | |||||
X321240D02* | |||||
D03* | |||||
X331240D02* | |||||
D03* | |||||
X341240D02* | |||||
D03* | |||||
X351240D02* | |||||
D03* | |||||
X361240D02* | |||||
D03* | |||||
X371240D02* | |||||
D03* | |||||
X433366Y25492D02* | |||||
D03* | |||||
D31* | |||||
X235433Y100394D02* | |||||
D03* | |||||
X79528Y67716D02* | |||||
D03* | |||||
X26913Y43434D02* | |||||
D03* | |||||
Y55245D02* | |||||
D03* | |||||
X293791Y76272D02* | |||||
D03* | |||||
X380421Y35917D02* | |||||
D03* | |||||
X433366Y47441D02* | |||||
D03* | |||||
Y15492D02* | |||||
D03* | |||||
X342126Y126870D02* | |||||
D03* | |||||
X385531Y75984D02* | |||||
D03* | |||||
X435039Y72835D02* | |||||
D03* | |||||
X94488Y102362D02* | |||||
D03* | |||||
Y92362D02* | |||||
D03* | |||||
Y82362D02* | |||||
D03* | |||||
Y72362D02* | |||||
D03* | |||||
Y62362D02* | |||||
D03* | |||||
Y52362D02* | |||||
D03* | |||||
Y42362D02* | |||||
D03* | |||||
Y32362D02* | |||||
D03* | |||||
X184488Y102362D02* | |||||
D03* | |||||
Y92362D02* | |||||
D03* | |||||
Y82362D02* | |||||
D03* | |||||
Y72362D02* | |||||
D03* | |||||
Y62362D02* | |||||
D03* | |||||
Y52362D02* | |||||
D03* | |||||
Y42362D02* | |||||
D03* | |||||
Y32362D02* | |||||
D03* | |||||
D32* | |||||
X57500Y63779D02* | |||||
D03* | |||||
X42500D02* | |||||
D03* | |||||
X50000D02* | |||||
D03* | |||||
Y93307D02* | |||||
D03* | |||||
X57500D02* | |||||
D03* | |||||
X42500D02* | |||||
D03* | |||||
D33* | |||||
X433563Y143425D02* | |||||
D03* | |||||
Y123622D02* | |||||
D03* | |||||
D34* | |||||
X311240Y113740D02* | |||||
D03* | |||||
D35* | |||||
X22441Y72953D02* | |||||
D03* | |||||
Y82953D02* | |||||
D03* | |||||
D36* | |||||
X412598Y27953D02* | |||||
D03* | |||||
Y125591D02* | |||||
D03* | |||||
X40157D02* | |||||
D03* | |||||
Y27953D02* | |||||
D03* | |||||
D37* | |||||
X392309Y111457D02* | |||||
D03* | |||||
X392618Y26378D02* | |||||
D03* | |||||
X277264Y108760D02* | |||||
D03* | |||||
X441823Y101575D02* | |||||
D03* | |||||
X253740Y97342D02* | |||||
D03* | |||||
X382283Y59842D02* | |||||
D03* | |||||
X387274Y55135D02* | |||||
D03* | |||||
M02* |
G04* | |||||
G04 #@! TF.GenerationSoftware,Altium Limited,Altium Designer,21.5.1 (32)* | |||||
G04* | |||||
G04 Layer_Color=16711935* | |||||
%FSLAX25Y25*% | |||||
%MOIN*% | |||||
G70* | |||||
G04* | |||||
G04 #@! TF.SameCoordinates,6B47F07E-1737-4CAB-AE6A-8125E67B32FB* | |||||
G04* | |||||
G04* | |||||
G04 #@! TF.FilePolarity,Positive* | |||||
G04* | |||||
G01* | |||||
G75* | |||||
%ADD11C,0.01000*% | |||||
D11* | |||||
Y153543D01* | |||||
X452756Y0D02* | |||||
Y153543D01* | |||||
X0Y0D02* | |||||
X452756D01* | |||||
X0Y153543D02* | |||||
X452756D01* | |||||
M02* |
G04* | |||||
G04 #@! TF.GenerationSoftware,Altium Limited,Altium Designer,21.5.1 (32)* | |||||
G04* | |||||
G04 Layer_Color=8421504* | |||||
%FSLAX25Y25*% | |||||
%MOIN*% | |||||
G70* | |||||
G04* | |||||
G04 #@! TF.SameCoordinates,6B47F07E-1737-4CAB-AE6A-8125E67B32FB* | |||||
G04* | |||||
G04* | |||||
G04 #@! TF.FilePolarity,Positive* | |||||
G04* | |||||
G01* | |||||
G75* | |||||
%ADD18R,0.01969X0.02362*% | |||||
%ADD19R,0.06693X0.03740*% | |||||
%ADD20R,0.04331X0.06693*% | |||||
%ADD21R,0.03740X0.06693*% | |||||
%ADD22R,0.02165X0.02362*% | |||||
%ADD23O,0.09055X0.02362*% | |||||
D18* | |||||
X424902Y110236D02* | |||||
D03* | |||||
X432382D02* | |||||
D03* | |||||
X428642Y102362D02* | |||||
D03* | |||||
D19* | |||||
X388779Y136024D02* | |||||
D03* | |||||
Y125000D02* | |||||
D03* | |||||
X170866Y107087D02* | |||||
D03* | |||||
Y118110D02* | |||||
D03* | |||||
X418504Y60532D02* | |||||
D03* | |||||
Y71555D02* | |||||
D03* | |||||
X105118Y118110D02* | |||||
D03* | |||||
Y107087D02* | |||||
D03* | |||||
D20* | |||||
X344291Y67402D02* | |||||
D03* | |||||
X355709D02* | |||||
D03* | |||||
X344291Y57008D02* | |||||
D03* | |||||
X355709D02* | |||||
D03* | |||||
X344291Y77795D02* | |||||
D03* | |||||
X355709D02* | |||||
D03* | |||||
X344291Y88189D02* | |||||
D03* | |||||
X355709D02* | |||||
D03* | |||||
Y46614D02* | |||||
D03* | |||||
X344291D02* | |||||
D03* | |||||
Y36220D02* | |||||
D03* | |||||
X355709D02* | |||||
D03* | |||||
D21* | |||||
X379528Y98425D02* | |||||
D03* | |||||
X390551D02* | |||||
D03* | |||||
D22* | |||||
X435237Y93406D02* | |||||
D03* | |||||
Y96752D02* | |||||
D03* | |||||
X428347Y93405D02* | |||||
D03* | |||||
Y96752D02* | |||||
D03* | |||||
X442126Y93406D02* | |||||
D03* | |||||
Y96752D02* | |||||
D03* | |||||
D23* | |||||
X371063Y89547D02* | |||||
D03* | |||||
Y84547D02* | |||||
D03* | |||||
Y79547D02* | |||||
D03* | |||||
Y74547D02* | |||||
D03* | |||||
Y69547D02* | |||||
D03* | |||||
Y64547D02* | |||||
D03* | |||||
Y59547D02* | |||||
D03* | |||||
Y54547D02* | |||||
D03* | |||||
X406890Y89547D02* | |||||
D03* | |||||
Y84547D02* | |||||
D03* | |||||
Y79547D02* | |||||
D03* | |||||
Y74547D02* | |||||
D03* | |||||
Y69547D02* | |||||
D03* | |||||
Y64547D02* | |||||
D03* | |||||
Y59547D02* | |||||
D03* | |||||
Y54547D02* | |||||
D03* | |||||
M02* |
G04* | |||||
G04 #@! TF.GenerationSoftware,Altium Limited,Altium Designer,21.5.1 (32)* | |||||
G04* | |||||
G04 Layer_Color=8388736* | |||||
%FSLAX25Y25*% | |||||
%MOIN*% | |||||
G70* | |||||
G04* | |||||
G04 #@! TF.SameCoordinates,6B47F07E-1737-4CAB-AE6A-8125E67B32FB* | |||||
G04* | |||||
G04* | |||||
G04 #@! TF.FilePolarity,Negative* | |||||
G04* | |||||
G01* | |||||
G75* | |||||
%ADD24R,0.07493X0.04540*% | |||||
%ADD25R,0.05131X0.07493*% | |||||
%ADD26R,0.04540X0.07493*% | |||||
%ADD27R,0.02965X0.03162*% | |||||
%ADD28O,0.09855X0.03162*% | |||||
%ADD29R,0.02362X0.02756*% | |||||
%ADD30C,0.06706*% | |||||
%ADD31C,0.06800*% | |||||
%ADD32C,0.05131*% | |||||
%ADD33C,0.08674*% | |||||
%ADD34R,0.06706X0.06706*% | |||||
%ADD35C,0.07874*% | |||||
%ADD36C,0.12217*% | |||||
%ADD37C,0.05800*% | |||||
D24* | |||||
X388779Y136024D02* | |||||
D03* | |||||
Y125000D02* | |||||
D03* | |||||
X170866Y107087D02* | |||||
D03* | |||||
Y118110D02* | |||||
D03* | |||||
X418504Y60532D02* | |||||
D03* | |||||
Y71555D02* | |||||
D03* | |||||
X105118Y118110D02* | |||||
D03* | |||||
Y107087D02* | |||||
D03* | |||||
D25* | |||||
X344291Y67402D02* | |||||
D03* | |||||
X355709D02* | |||||
D03* | |||||
X344291Y57008D02* | |||||
D03* | |||||
X355709D02* | |||||
D03* | |||||
X344291Y77795D02* | |||||
D03* | |||||
X355709D02* | |||||
D03* | |||||
X344291Y88189D02* | |||||
D03* | |||||
X355709D02* | |||||
D03* | |||||
Y46614D02* | |||||
D03* | |||||
X344291D02* | |||||
D03* | |||||
Y36220D02* | |||||
D03* | |||||
X355709D02* | |||||
D03* | |||||
D26* | |||||
X379528Y98425D02* | |||||
D03* | |||||
X390551D02* | |||||
D03* | |||||
D27* | |||||
X435237Y93406D02* | |||||
D03* | |||||
Y96752D02* | |||||
D03* | |||||
X428347Y93405D02* | |||||
D03* | |||||
Y96752D02* | |||||
D03* | |||||
X442126Y93406D02* | |||||
D03* | |||||
Y96752D02* | |||||
D03* | |||||
D28* | |||||
X371063Y89547D02* | |||||
D03* | |||||
Y84547D02* | |||||
D03* | |||||
Y79547D02* | |||||
D03* | |||||
Y74547D02* | |||||
D03* | |||||
Y69547D02* | |||||
D03* | |||||
Y64547D02* | |||||
D03* | |||||
Y59547D02* | |||||
D03* | |||||
Y54547D02* | |||||
D03* | |||||
X406890Y89547D02* | |||||
D03* | |||||
Y84547D02* | |||||
D03* | |||||
Y79547D02* | |||||
D03* | |||||
Y74547D02* | |||||
D03* | |||||
Y69547D02* | |||||
D03* | |||||
Y64547D02* | |||||
D03* | |||||
Y59547D02* | |||||
D03* | |||||
Y54547D02* | |||||
D03* | |||||
D29* | |||||
X428642Y102362D02* | |||||
D03* | |||||
X424902Y110236D02* | |||||
D03* | |||||
X432382D02* | |||||
D03* | |||||
D30* | |||||
X16913Y55245D02* | |||||
D03* | |||||
Y43434D02* | |||||
D03* | |||||
X254331Y36614D02* | |||||
D03* | |||||
Y117323D02* | |||||
D03* | |||||
X433366Y57441D02* | |||||
D03* | |||||
X321240Y113740D02* | |||||
D03* | |||||
X331240D02* | |||||
D03* | |||||
X341240D02* | |||||
D03* | |||||
X351240D02* | |||||
D03* | |||||
X361240D02* | |||||
D03* | |||||
X371240D02* | |||||
D03* | |||||
X311240Y143740D02* | |||||
D03* | |||||
X321240D02* | |||||
D03* | |||||
X331240D02* | |||||
D03* | |||||
X341240D02* | |||||
D03* | |||||
X351240D02* | |||||
D03* | |||||
X361240D02* | |||||
D03* | |||||
X371240D02* | |||||
D03* | |||||
X433366Y25492D02* | |||||
D03* | |||||
D31* | |||||
X235433Y100394D02* | |||||
D03* | |||||
X79528Y67716D02* | |||||
D03* | |||||
X26913Y43434D02* | |||||
D03* | |||||
Y55245D02* | |||||
D03* | |||||
X293791Y76272D02* | |||||
D03* | |||||
X380421Y35917D02* | |||||
D03* | |||||
X433366Y47441D02* | |||||
D03* | |||||
Y15492D02* | |||||
D03* | |||||
X342126Y126870D02* | |||||
D03* | |||||
X385531Y75984D02* | |||||
D03* | |||||
X435039Y72835D02* | |||||
D03* | |||||
X94488Y102362D02* | |||||
D03* | |||||
Y92362D02* | |||||
D03* | |||||
Y82362D02* | |||||
D03* | |||||
Y72362D02* | |||||
D03* | |||||
Y62362D02* | |||||
D03* | |||||
Y52362D02* | |||||
D03* | |||||
Y42362D02* | |||||
D03* | |||||
Y32362D02* | |||||
D03* | |||||
X184488Y102362D02* | |||||
D03* | |||||
Y92362D02* | |||||
D03* | |||||
Y82362D02* | |||||
D03* | |||||
Y72362D02* | |||||
D03* | |||||
Y62362D02* | |||||
D03* | |||||
Y52362D02* | |||||
D03* | |||||
Y42362D02* | |||||
D03* | |||||
Y32362D02* | |||||
D03* | |||||
D32* | |||||
X57500Y63779D02* | |||||
D03* | |||||
X42500D02* | |||||
D03* | |||||
X50000D02* | |||||
D03* | |||||
Y93307D02* | |||||
D03* | |||||
X57500D02* | |||||
D03* | |||||
X42500D02* | |||||
D03* | |||||
D33* | |||||
X433563Y143425D02* | |||||
D03* | |||||
Y123622D02* | |||||
D03* | |||||
D34* | |||||
X311240Y113740D02* | |||||
D03* | |||||
D35* | |||||
X22441Y72953D02* | |||||
D03* | |||||
Y82953D02* | |||||
D03* | |||||
D36* | |||||
X412598Y27953D02* | |||||
D03* | |||||
Y125591D02* | |||||
D03* | |||||
X40157D02* | |||||
D03* | |||||
Y27953D02* | |||||
D03* | |||||
D37* | |||||
X392309Y111457D02* | |||||
D03* | |||||
X392618Y26378D02* | |||||
D03* | |||||
X277264Y108760D02* | |||||
D03* | |||||
X441823Y101575D02* | |||||
D03* | |||||
X253740Y97342D02* | |||||
D03* | |||||
X382283Y59842D02* | |||||
D03* | |||||
X387274Y55135D02* | |||||
D03* | |||||
M02* |
Layer Pairs Export File for PCB: C:\Users\Julian\Documents\Git Repositories\SS21_PRA\Platine.PcbDoc | |||||
LayersSetName=Top_Bot_Thru_Holes|DrillFile=platine.txt|DrillLayers=gtl,gbl |
************************************************************* | |||||
FileName = Platine.GBR | |||||
AutoAperture = True | |||||
************************************************************* | |||||
Generating : Mechanical 1 | |||||
File : Platine.GM1 | |||||
Adding Layer : Mechanical 1 | |||||
Used DCodes : | |||||
D11 | |||||
************************************************************* | |||||
************************************************************* | |||||
Generating : Bottom Overlay | |||||
File : Platine.GBO | |||||
Adding Layer : Bottom Overlay | |||||
Used DCodes : | |||||
************************************************************* | |||||
************************************************************* | |||||
Generating : Bottom Paste | |||||
File : Platine.GBP | |||||
Adding Layer : Bottom Paste | |||||
Adding Layer : Bottom Layer | |||||
Adding Layer : Multi-Layer | |||||
Used DCodes : | |||||
************************************************************* | |||||
************************************************************* | |||||
Generating : Bottom Solder | |||||
File : Platine.GBS | |||||
Adding Layer : Bottom Solder | |||||
Adding Layer : Bottom Layer | |||||
Adding Layer : Multi-Layer | |||||
Used DCodes : | |||||
D30 | |||||
D31 | |||||
D32 | |||||
D33 | |||||
D34 | |||||
D35 | |||||
D36 | |||||
D37 | |||||
************************************************************* | |||||
************************************************************* | |||||
Generating : Top Solder | |||||
File : Platine.GTS | |||||
Adding Layer : Top Solder | |||||
Adding Layer : Top Layer | |||||
Adding Layer : Multi-Layer | |||||
Used DCodes : | |||||
D24 | |||||
D25 | |||||
D26 | |||||
D27 | |||||
D28 | |||||
D29 | |||||
D30 | |||||
D31 | |||||
D32 | |||||
D33 | |||||
D34 | |||||
D35 | |||||
D36 | |||||
D37 | |||||
************************************************************* | |||||
************************************************************* | |||||
Generating : Top Paste | |||||
File : Platine.GTP | |||||
Adding Layer : Top Paste | |||||
Adding Layer : Top Layer | |||||
Adding Layer : Multi-Layer | |||||
Used DCodes : | |||||
D18 | |||||
D19 | |||||
D20 | |||||
D21 | |||||
D22 | |||||
D23 | |||||
************************************************************* | |||||
************************************************************* | |||||
Generating : Top Overlay | |||||
File : Platine.GTO | |||||
Adding Layer : Top Overlay | |||||
Used DCodes : | |||||
D10 | |||||
D11 | |||||
D12 | |||||
D13 | |||||
D14 | |||||
D15 | |||||
D16 | |||||
D17 | |||||
************************************************************* | |||||
************************************************************* | |||||
Generating : Bottom Layer | |||||
File : Platine.GBL | |||||
Adding Layer : Bottom Layer | |||||
Adding Layer : Multi-Layer | |||||
Used DCodes : | |||||
D10 | |||||
D11 | |||||
D35 | |||||
D38 | |||||
D39 | |||||
D40 | |||||
D41 | |||||
D42 | |||||
D43 | |||||
D44 | |||||
************************************************************* | |||||
************************************************************* | |||||
Generating : Top Layer | |||||
File : Platine.GTL | |||||
Adding Layer : Top Layer | |||||
Adding Layer : Multi-Layer | |||||
Used DCodes : | |||||
D10 | |||||
D11 | |||||
D19 | |||||
D20 | |||||
D21 | |||||
D22 | |||||
D23 | |||||
D29 | |||||
D35 | |||||
D38 | |||||
D39 | |||||
D40 | |||||
D41 | |||||
D42 | |||||
D43 | |||||
D44 | |||||
************************************************************* | |||||
DRC Rules Export File for PCB: C:\Users\Julian\Documents\Git Repositories\SS21_PRA\Platine.PcbDoc | |||||
RuleKind=SolderMaskExpansion|RuleName=SolderMaskExpansion|Scope=Board|Minimum=4.00 | |||||
RuleKind=Width|RuleName=Width|Scope=Board|Minimum=10.00 | |||||
RuleKind=Clearance|RuleName=Clearance|Scope=Board|Minimum=10.00 | |||||
RuleKind=ShortCircuit|RuleName=ShortCircuit|Scope=Board|Allowed=0 |
M48 | |||||
;Layer_Color=9474304 | |||||
;FILE_FORMAT=2:5 | |||||
INCH,TZ | |||||
;TYPE=PLATED | |||||
T1F00S00C0.02800 | |||||
T2F00S00C0.03000 | |||||
T3F00S00C0.03150 | |||||
T4F00S00C0.03543 | |||||
T5F00S00C0.03937 | |||||
T6F00S00C0.04000 | |||||
T7F00S00C0.04724 | |||||
;TYPE=NON_PLATED | |||||
T8F00S00C0.11417 | |||||
% | |||||
T01 | |||||
X253740Y97342 | |||||
X277264Y108760 | |||||
X392309Y111457 | |||||
X441823Y101575 | |||||
X387274Y55135 | |||||
X382283Y59842 | |||||
X392618Y26378 | |||||
T02 | |||||
X79528Y67716 | |||||
X235433Y100394 | |||||
X293791Y76272 | |||||
X385531Y75984 | |||||
X380421Y35917 | |||||
X435039Y72835 | |||||
X342126Y126870 | |||||
T03 | |||||
X16913Y43434 | |||||
X26913 | |||||
Y55245 | |||||
X16913 | |||||
X42500Y63779 | |||||
X50000 | |||||
X57500 | |||||
Y93307 | |||||
X50000 | |||||
X42500 | |||||
X433366Y57441 | |||||
Y47441 | |||||
Y25492 | |||||
Y15492 | |||||
T04 | |||||
X254331Y36614 | |||||
Y117323 | |||||
X311240Y113740 | |||||
Y143740 | |||||
X321240 | |||||
X331240 | |||||
X341240 | |||||
X351240 | |||||
X361240 | |||||
X371240 | |||||
Y113740 | |||||
X361240 | |||||
X351240 | |||||
X341240 | |||||
X331240 | |||||
X321240 | |||||
T05 | |||||
X22441Y72953 | |||||
Y82953 | |||||
T06 | |||||
X94488Y32362 | |||||
Y42362 | |||||
Y52362 | |||||
Y62362 | |||||
Y72362 | |||||
Y82362 | |||||
Y92362 | |||||
Y102362 | |||||
X184488 | |||||
Y92362 | |||||
Y82362 | |||||
Y72362 | |||||
Y62362 | |||||
Y52362 | |||||
Y42362 | |||||
Y32362 | |||||
T07 | |||||
X433563Y123622 | |||||
Y143425 | |||||
T08 | |||||
X40157Y27953 | |||||
Y125591 | |||||
X412598 | |||||
Y27953 | |||||
M30 |
D10 ROUNDED 11.811 11.811 0.000 LINE 0.000 | |||||
D11 ROUNDED 10.000 10.000 0.000 LINE 0.000 | |||||
D12 ROUNDED 20.000 20.000 0.000 LINE 0.000 | |||||
D13 ROUNDED 7.874 7.874 0.000 LINE 0.000 | |||||
D14 ROUNDED 9.842 9.842 0.000 LINE 0.000 | |||||
D15 ROUNDED 23.622 23.622 0.000 LINE 0.000 | |||||
D16 ROUNDED 5.906 5.906 0.000 LINE 0.000 | |||||
D17 ROUNDED 8.000 8.000 0.000 LINE 0.000 | |||||
D18 RECTANGULAR 19.686 23.622 0.000 FLASH 0.000 | |||||
D19 RECTANGULAR 66.929 37.402 0.000 FLASH 0.000 | |||||
D20 RECTANGULAR 66.929 43.307 0.000 FLASH 90.000 | |||||
D21 RECTANGULAR 66.929 37.402 0.000 FLASH 90.000 | |||||
D22 RECTANGULAR 21.654 23.622 0.000 FLASH 180.000 | |||||
D23 ROUNDED 23.622 90.551 0.000 FLASH 270.000 | |||||
D24 RECTANGULAR 74.929 45.402 0.000 FLASH 0.000 | |||||
D25 RECTANGULAR 74.929 51.307 0.000 FLASH 90.000 | |||||
D26 RECTANGULAR 74.929 45.402 0.000 FLASH 90.000 | |||||
D27 RECTANGULAR 29.654 31.622 0.000 FLASH 180.000 | |||||
D28 ROUNDED 31.622 98.551 0.000 FLASH 270.000 | |||||
D29 RECTANGULAR 27.559 23.622 0.000 FLASH 270.000 | |||||
D30 ROUNDED 67.055 67.055 0.000 FLASH 0.000 | |||||
D31 ROUNDED 68.000 68.000 0.000 FLASH 0.000 | |||||
D32 ROUNDED 51.307 51.307 0.000 FLASH 0.000 | |||||
D33 ROUNDED 86.740 86.740 0.000 FLASH 0.000 | |||||
D34 RECTANGULAR 67.055 67.055 0.000 FLASH 90.000 | |||||
D35 ROUNDED 78.740 78.740 0.000 FLASH 0.000 | |||||
D36 ROUNDED 122.173 122.173 0.000 FLASH 0.000 | |||||
D37 ROUNDED 58.000 58.000 0.000 FLASH 0.000 | |||||
D38 ROUNDED 13.780 13.780 0.000 LINE 0.000 | |||||
D39 ROUNDED 59.055 59.055 0.000 FLASH 0.000 | |||||
D40 ROUNDED 60.000 60.000 0.000 FLASH 0.000 | |||||
D41 ROUNDED 43.307 43.307 0.000 FLASH 0.000 | |||||
D42 RECTANGULAR 59.055 59.055 0.000 FLASH 90.000 | |||||
D43 ROUNDED 114.173 114.173 0.000 FLASH 0.000 | |||||
D44 ROUNDED 50.000 50.000 0.000 FLASH 0.000 |
Output: Drill_Files | |||||
Type : NC Drill | |||||
From : PCB Document [Platine.PcbDoc] | |||||
Generated File[Platine.TXT] | |||||
Generated File[Platine.DRL] | |||||
Generated File[Platine.LDP] | |||||
Generated File[Platine.DRR] | |||||
Files Generated : 4 | |||||
Documents Printed : 0 | |||||
Finished Output Generation At 23:43:27 On 02.08.2021 |
Project Outputs Generation Report | |||||
--------------------------------- | |||||
Start Output Generation At 23:43:17 On 02.08.2021 | |||||
Output: STEP_model | |||||
Type : ExportSTEP | |||||
From : Variant [[No Variations]] of PCB Document [Platine.PcbDoc] | |||||
Generated File[Model_SS21_PRA.step] | |||||
Files Generated : 1 | |||||
Documents Printed : 0 | |||||
Finished Output Generation At 23:43:23 On 02.08.2021 |
Record=TopLevelDocument|FileName=Schaltplan.SchDoc|SheetNumber=1 |
### Dokumentation Latex ### | |||||
# Output Folder # | |||||
out/ | |||||
# VS Code working directory # | |||||
.vscode/ |
% This file was created with Citavi 6.8.0.0 | |||||
@www{Benutzerhandbuch, | |||||
author = {Landis+Gyr}, | |||||
year = {2018}, | |||||
title = {E220 Benutzerhandbuch}, | |||||
url = {https://www.landisgyr.de/webfoo/wp-content/uploads/2018/08/D000063497-E220-AMxD-Benutzerhandbuch-de-f.pdf} | |||||
} | |||||
@www{DownloadPuTTY, | |||||
author = {PuTTY}, | |||||
title = {Download PuTTY}, | |||||
url = {https://www.putty.org/} | |||||
} | |||||
@www{EasyMeter, | |||||
author = {Streck}, | |||||
editor = {EasyMeter}, | |||||
year = {2009}, | |||||
title = {Protokoll Datentransfer zu Erweiterungsmodulen}, | |||||
url = {https://www.mikrocontroller.net/attachment/89888/Q3Dx_D0_Spezifikation_v11.pdf} | |||||
} | |||||
@www{EDI, | |||||
author = {BDEW}, | |||||
year = {2013}, | |||||
title = {EDI@Energy OBIS-Kennzahlen-System}, | |||||
url = {https://www.bundesnetzagentur.de/DE/Beschlusskammern/BK06/BK6_81_GPKE_GeLi/Mitteilung_Nr_37/Anlagen/OBIS-Kennzahlensystem%202.2a.pdf?__blob=publicationFile&v=2} | |||||
} | |||||
@www{eHZ, | |||||
editor = {{EMH metering GmbH {\&} Co. KG}}, | |||||
title = {eHZ Generation K}, | |||||
url = {https://emh-metering.com/wp-content/uploads/2021/08/eHZ-K-DAB-D-1.10.pdf} | |||||
} | |||||
@www{eHZ2020, | |||||
author = {{EMH metering GmbH {\&} Co. KG}}, | |||||
year = {2020}, | |||||
title = {eHZ Generation K Elektronischer Haushaltsz{\"a}hler}, | |||||
url = {https://emh-metering.com/wp-content/uploads/2020/08/eHZ-K-BIA-D-1-20.pdf} | |||||
} | |||||
@www{ESP, | |||||
author = {WEMOS}, | |||||
year = {2021}, | |||||
title = {LOLIN D1 mini}, | |||||
url = {https://www.wemos.cc/en/latest/d1/d1_mini.html} | |||||
} | |||||
@www{ESPSolution, | |||||
author = {{Espressif IOT Team}}, | |||||
year = {2019}, | |||||
title = {ESP8266 Low-Power Solutions}, | |||||
url = {https://www.espressif.com/sites/default/files/documentation/9b-esp8266-low_power_solutions__en.pdf} | |||||
} | |||||
@www{Flash.Flawless., | |||||
author = {Balena}, | |||||
year = {2021}, | |||||
title = {Flash. Flawless.}, | |||||
url = {https://www.balena.io/etcher/} | |||||
} | |||||
@www{Fotodiode, | |||||
author = {Osram}, | |||||
year = {2014}, | |||||
title = {Silizium-PIN-Fotodiode}, | |||||
url = {https://cdn-reichelt.de/documents/datenblatt/A501/SFH213FA_ENG_TDS.pdf} | |||||
} | |||||
@www{haushaltszaehler, | |||||
editor = {{EMH metering GmbH {\&} Co. KG}}, | |||||
title = {haushaltszaehler}, | |||||
url = {https://emh-metering.com/produkte/haushaltszaehler-smart-meter/ehz-k/} | |||||
} | |||||
@www{ImportingandExportingFlows, | |||||
author = {{OpenJS Foundation}}, | |||||
title = {Importing and Exporting Flows}, | |||||
url = {https://nodered.org/docs/user-guide/editor/workspace/import-export} | |||||
} | |||||
@www{Maxim, | |||||
author = {{maxim integrated}}, | |||||
year = {2015}, | |||||
title = {Extremely Accurate I2C-Integrated RTC/TCXO/Crystal}, | |||||
url = {https://datasheets.maximintegrated.com/en/ds/DS3231.pdf} | |||||
} | |||||
@www{MOSFET, | |||||
author = {{Nexperia B.V.}}, | |||||
year = {2010}, | |||||
title = {NX2301P 20 V, 2 A P-channel Trench MOSFET}, | |||||
url = {https://assets.nexperia.com/documents/data-sheet/NX2301P.pdf} | |||||
} | |||||
@www{MQTT, | |||||
year = {2020}, | |||||
title = {MQTT}, | |||||
url = {https://mqtt.org/} | |||||
} | |||||
@www{nodered, | |||||
editor = {{OpenJS Foundation}}, | |||||
title = {NodeRED}, | |||||
url = {https://nodered.org/} | |||||
} | |||||
@www{Panasonic, | |||||
author = {Panasonic}, | |||||
title = {Specifications for NCR18650PF}, | |||||
url = {https://b2b-api.panasonic.eu/file_stream/pids/fileversion/3447} | |||||
} | |||||
@www{pubsubclient, | |||||
author = {GitHub}, | |||||
year = {2020}, | |||||
title = {pubsubclient}, | |||||
url = {https://github.com/knolleary/pubsubclient} | |||||
} | |||||
@www{Raspberry, | |||||
author = {{RASPBERRY PI FOUNDATION}}, | |||||
title = {Raspberry Pi OS}, | |||||
url = {https://www.raspberrypi.org/software/} | |||||
} | |||||
@www{RaspberryPutty, | |||||
author = {{Raspberry pi Tutorials}}, | |||||
title = {Raspberry Pi SSH Zugriff einrichten via Putty (Windows)}, | |||||
url = {https://tutorials-raspberrypi.de/raspberry-pi-ssh-windows-zugriff-putty/} | |||||
} | |||||
@www{Running, | |||||
author = {{OpenJS Foundation}}, | |||||
title = {Running on Raspberry Pi}, | |||||
url = {https://nodered.org/docs/getting-started/raspberrypi} | |||||
} | |||||
@www{smartHome, | |||||
author = {Wikipedia}, | |||||
editor = {Wikipedia}, | |||||
year = {2021}, | |||||
title = {Smart Home}, | |||||
url = {https://de.wikipedia.org/wiki/Smart_Home} | |||||
} | |||||
@www{StromAuskunft, | |||||
editor = {{Heidjann GmbH}}, | |||||
title = {StromAuskunft}, | |||||
url = {https://www.stromauskunft.de/stromverbrauch/stromverbrauch-haushalte/#backtotop} | |||||
} | |||||
@www{TechnischeRichtlinie, | |||||
author = {{Bundesamt f{\"u}r Sicherheit in der Informationstechnik}}, | |||||
year = {2013}, | |||||
title = {Technische Richtlinie BSI TR-03109-1}, | |||||
url = {https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR03109/TR-03109-1_Anlage_Feinspezifikation_Drahtgebundene_LMN-Schnittstelle_Teilb.pdf?__blob=publicationFile} | |||||
} | |||||
@www{Transistor, | |||||
author = {{Continental Device India Limited}}, | |||||
year = {2012}, | |||||
title = {NPN SILICON PLANAR EPITAXIAL TRANSISTORS}, | |||||
url = {https://cdn-reichelt.de/documents/datenblatt/A100/BC546_48-CDIL.pdf} | |||||
} | |||||
@www{Wemos, | |||||
author = {GrabCAD}, | |||||
year = {2021}, | |||||
title = {Wemos 18650 battery shield V3}, | |||||
url = {https://cad.grabcad.com/library/wemos-18650-battery-shield-v3-1} | |||||
} | |||||
@www{WiFiManager, | |||||
author = {GitHub}, | |||||
year = {2021}, | |||||
title = {WiFi Manager}, | |||||
url = {https://github.com/tzapu/WiFiManager} | |||||
} | |||||
\documentclass[a4paper,12pt,bibliography=totoc]{scrreprt} %Dokument Einstellungen: Papierformat, Schriftgröße, Art des Dokuments (scr für Deutsch) | |||||
% ============= Packages ============= | |||||
\usepackage[utf8]{inputenc} %Sonderzeichen, Umlaute | |||||
\usepackage[left= 3cm,right = 2cm, bottom = 4 cm]{geometry} %Anpassung Seitenränder | |||||
\usepackage[onehalfspacing]{setspace} %Zeilenabstand anpassen | |||||
\usepackage[ngerman]{babel} %Sprache z.B. für Worttrennungen | |||||
\usepackage[T1]{fontenc} %Schrift | |||||
\usepackage{amsmath} %Mathe package | |||||
\usepackage{mathpazo} %Schriftart | |||||
\usepackage{graphicx} %Bilder einfügen | |||||
\usepackage{fancyhdr} %Angepasste Kopf- und Fußzeile | |||||
\usepackage{siunitx} %Chillige Einheiten | |||||
\usepackage{placeins} %Bilder daran hindern sonstwo zu landen | |||||
\usepackage{microtype} %Typesetting schöner | |||||
\usepackage[hidelinks]{hyperref} %Klickbare Verweise | |||||
\usepackage{listings} % code highlightin | |||||
\usepackage{url} | |||||
\usepackage{fancyvrb} | |||||
\usepackage{listings} % Bessere Code-Umgebung | |||||
%\usepackage{minted} % anderes code highlighting | |||||
% ============= Kopf- und Fußzeile ============= | |||||
\pagestyle{fancy} | |||||
% | |||||
\lhead{\includegraphics[height=24pt]{"TH_Logo.jpeg"}} | |||||
\chead{} | |||||
\rhead{\slshape \leftmark} | |||||
%% | |||||
\lfoot{} | |||||
\cfoot{\thepage} | |||||
\rfoot{} | |||||
%% | |||||
\renewcommand{\headrulewidth}{0.4pt} | |||||
\renewcommand{\footrulewidth}{0pt} | |||||
% ============= Dokument Beschreibung ============= | |||||
\title{Projektarbeit} | |||||
\author{Katharina Steib\thanks{TH Nürnberg} | |||||
\and Simon Kocher\footnotemark[1] | |||||
\and Julian Rico Birner\footnotemark[1]} | |||||
\date{heute} | |||||
% ============= Einstellungen ============= | |||||
\setcounter{tocdepth}{5} %Erweiterung des Inhalstverzeichnisses um eine weiter Ebene | |||||
\setcounter{secnumdepth}{5} %Erweiterug der Kapiteltiefe um eine weitere Ebene | |||||
\bibliographystyle{alphadin} %Zitationsstil | |||||
\sisetup{output-decimal-marker = {,}} % Komma statt . bei \SI{...} | |||||
% ============= Dokumentbeginn ============= | |||||
% ========================================== | |||||
\begin{document} | |||||
\begin{titlepage} % Suppresses displaying the page number on the title page and the subsequent page counts as page 1 | |||||
\newcommand{\HRule}{\rule{\linewidth}{0.5mm}} % Defines a new command for horizontal lines, change thickness here | |||||
\center % Centre everything on the page | |||||
%------------------------------------------------ | |||||
% Headings | |||||
%------------------------------------------------ | |||||
\textsc{\LARGE | |||||
\begin{figure} | |||||
\begin{center} | |||||
\includegraphics[scale=1]{"TH_Logo.jpeg"} | |||||
\end{center} | |||||
\end{figure} | |||||
}\\[0.5cm] % Main heading such as the name of your university/college | |||||
\textsc{\Large Projektarbeit}\\[0.5cm] % Major heading such as course name | |||||
\textsc{\large Elektro- und Informationstechnik}\\[0.5cm] % Minor heading such as course title | |||||
%------------------------------------------------ | |||||
% Title | |||||
%------------------------------------------------ | |||||
\HRule\\[0.4cm] | |||||
{\huge\bfseries Entwicklung eines IR-Empfängers für einen Stromzähler}\\[0.4cm] % Title of your document | |||||
\HRule\\[1.5cm] | |||||
%------------------------------------------------ | |||||
% Author(s) | |||||
%------------------------------------------------ | |||||
\begin{minipage}{0.4\textwidth} | |||||
\begin{flushleft} | |||||
\large | |||||
\textit{Autoren} | |||||
\\ Katharina \textsc{Steib} % Your name | |||||
\\ Simon \textsc{Kocher} %Your friends name | |||||
\\ Julian \textsc{Rico Birner} %Your other friends name | |||||
\end{flushleft} | |||||
\end{minipage} | |||||
~ | |||||
\begin{minipage}{0.4\textwidth} | |||||
\begin{flushright} | |||||
\large | |||||
\textit{Betreuer}\\ | |||||
Bernd \textsc{Klehn} % Supervisor's name | |||||
\end{flushright} | |||||
\end{minipage} | |||||
% If you don't want a supervisor, uncomment the two lines below and comment the code above | |||||
%{\large\textit{Author}}\\ | |||||
%John \textsc{Smith} % Your name | |||||
%------------------------------------------------ | |||||
% Date | |||||
%------------------------------------------------ | |||||
\vfill\vfill\vfill % Position the date 3/4 down the remaining page | |||||
{\large\today} % Date, change the \today to a set date if you want to be precise | |||||
%------------------------------------------------ | |||||
% Logo | |||||
%------------------------------------------------ | |||||
%\vfill\vfill | |||||
%\includegraphics[width=0.2\textwidth]{placeholder.jpg}\\[1cm] % Include a department/university logo - this will require the graphicx package | |||||
%---------------------------------------------------------------------------------------- | |||||
\vfill % Push the date up 1/4 of the remaining page | |||||
\begin{center} | |||||
steibka77404@th-nuernberg.de (3264785) | |||||
\\ kochersi74936@th-nuernberg.de(3254887) | |||||
\\ ricobirnerju74691@th-nuernberg.de(3273163) | |||||
\end{center} | |||||
\end{titlepage} | |||||
%\maketitle %Erstellt Titelseite | |||||
\tableofcontents % Erstellt Inhaltsverzeichnis | |||||
\part{Hauptteil} | |||||
\chapter{Einleitung} | |||||
%++- | |||||
% Kathi 1,5 Seiten | |||||
Durch die Coronapandemie ist der Stromverbrauch in Deutschland im Jahr 2020 um rund 4,4 Prozent im Vergleich | |||||
zum Vorjahr gesunken, was einer Einsparung von 25 TWh entspricht. Dieses Phänomen lässt sich besonders auf den | |||||
lockdownbedingten Konjunktureinbruch zurückführen. Trotz des Rückgangs ist aber noch viel Luft nach oben. | |||||
Laut dem Stromspiegel 2019 verschwendeten die privaten Haushalte in Deutschland Strom im Wert von 9 Mrd. Euro.\\ | |||||
Viele Deutsche wissen gar nicht wie hoch ihr Stromverbrauch eigentlich ist und ob dieser über oder | |||||
unterdurchschnittlich ist. Zum Vergleich kann der durchschnittliche Stromverbrauch einer Familie von | |||||
4250 kWh pro Jahr heran gezogen werden. Den eigenen Stromverbrauch zu ermitteln und im besten Fall auch entsprechend | |||||
zu regulieren ist schon schwieriger. Zwar findet man im Internet zahlreiche Seiten die anhand verschiedener Angaben | |||||
den Verbrauch abschätzen, jedoch handelt es sich dabei lediglich um eine grobe Näherung. \cite{StromAuskunft}\\ \\ | |||||
Im Zuge der Digitalisierung verfügen immer mehr Haushalte über ein Smart Home System. Dabei handelt es sich | |||||
eigentlich um einen Überbegriff der verschiedene Verfahren vereint, die mit automatisierbaren Abläufen das Leben | |||||
in Bezug auf den Wohnraum vereinfachen sollen. Bekannte Beispiele sind das Regeln der Heizung auch von Unterwegs, | |||||
das an und ausschalten verschiedener Geräte oder Lampen ohne zum Schalter gehen zu müssen oder auch das Öffnen | |||||
und Schließen von Fenstern und Rollläden. Dabei können die Geräte sowohl über eine Programmierschnittstelle zu | |||||
bestimmten Zeiten und/oder Bedingungen geschaltet werden als auch bequem per App vom Smartphone. | |||||
Das Zuhause wird also sowohl intelligenter als auch bequemer für seine Bewohner.\\ | |||||
Ein solches Smart Home System eignet sich auch zur genauen Stromerfassung und Regulierung besonders gut. | |||||
Der Verbraucher kann nicht nur genaue Daten ablesen sondern auch gezielt daran arbeiten seinen Stromverbrauch mit | |||||
speziell auf ihn angepassten Einstellungen zu minimieren. | |||||
Leider ist die Installation eines solchen Systems oftmals mit einem hohen Aufwand und hohen | |||||
Kosten verbunden, da meist viele bereits vorhandene Teile ausgetauscht werden müssen. Auch die Kosten für die | |||||
Installation und Einrichtung sind nicht unerheblich. \cite{smartHome}\\ \\ | |||||
In diesem Projekt wurde an einer möglichst benutzerfreundlichen, kostengünstigen und einfachen Lösung gearbeitet | |||||
mit der man einen Stromzähler zu Hause selbst visualisieren kann. Dabei ist hervorzuheben, dass das entwickelte | |||||
Gerät an den bereits vorhandenen Stromzähler ergänzt wird und somit kein Austausch von Geräten nötig ist.\\ | |||||
Der folgende Bericht wurde zur besseren Übersicht in zwei Teile unterteilt. | |||||
Im ersten Teil werden die technischen Hintergründe und Funktionen erläutert. | |||||
Der zweite Teil soll hierbei als eine Art Benutzerhandbuch zur Anleitung dienen.\\ | |||||
\chapter{Konzept} | |||||
%+-- | |||||
% Simon ~1,5 Seiten | |||||
Im Folgenden wird zunächst auf die Aufgabenstellung eingegangen und anschließend ein Lösungsansatz schematisch erläutert. | |||||
\section{Soll-Ist-Analyse} | |||||
%+-- | |||||
Gegeben ist ein Stromzähler des Typen \glqq eHZ Generation K\grqq{} der Firma EMH metering GmbH \& Co. KG \cite{haushaltszaehler}. | |||||
% https://emh-metering.com/produkte/haushaltszaehler-smart-meter/ehz-k/ haushaltszaehler | |||||
Der Zähler verfügt über mehrere Infrarotschnittstellen zur Datenübertragung \cite{eHZ}. | |||||
% https://emh-metering.com/wp-content/uploads/2021/08/eHZ-K-DAB-D-1.10.pdf eHZ | |||||
Es soll ein Empfänger für die Zählerstände, die über diese Schnittstellen übertragen werden entwickelt | |||||
werden. Der Empfänger soll in sinnvollen Intervallen (z.B. zweimal pro Tag) den Zählerstand ermitteln | |||||
und an einen bestehenden Smart-Home-Controller in Form eines Raspberry Pi übermitteln.\\ | |||||
Der bestehende Controller zeigt bereits vorhandene Daten aus anderer Quelle in einem Dashboard auf | |||||
Basis von Node-RED \cite{nodered} | |||||
% https://nodered.org/ nodered | |||||
an. Die Zäherstände sollen ebenfalls in Node-RED angezeigt werden.\\ | |||||
Um eine möglichst einfache Installation des Empfängers zu ermöglichen, soll der Empfänger sowohl | |||||
im Hinblick auf die Datenübertragung als auch die Energieversorgung vollständig drahtlos funktionieren.\\ | |||||
Weiterhin soll ein Teststand entwickelt werden, mit dem der Empfänger ohne den Stromzähler auf | |||||
Funktion getestet werden kann. | |||||
\section{Lösungskonzept} | |||||
%+-- | |||||
% Konzept von Simon | |||||
% => Blockschaltbild | |||||
% - Nen Microcontroller+wifi | |||||
% - Iwie Versorgung | |||||
% - iwie Einlesen | |||||
% - Empfangen an Raspi | |||||
% - | |||||
Um eine drahtlose Energieversorgung des Empfängers zu ermöglichen, wird der Empfängeraufbau mit | |||||
einem Akku betrieben. Für den Akku müssen sowohl eine Ladevorrichtung als auch der Akkutechnologie entsprechende | |||||
Schutzschaltungen vorgesehen werden. Der Datenempfang und die Weitergabe an den | |||||
Smart-Home-Controller wird durch einen Microcontroller realisiert. Um auch für die | |||||
Datenübermittlung an den Controller kabellos zu bleiben, wird ein Microcontroller mit | |||||
WiFi-Schnittstelle benötigt. Der Datentransfer zum Smart-Home-Controller kann dabei über das | |||||
MQTT-Protokoll \cite{MQTT} | |||||
% https://mqtt.org/ MQTT | |||||
realisiert werden. Für den Empfang der Stromzählerstände muss ein Infrarotempfänger, der kompatibel | |||||
zur IR-Schnittstelle des Zählers ist, entwickelt werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=\linewidth]{img/konzept_bsb.PNG} | |||||
\caption{Schematische Darstellung des Lösungskonzepts} | |||||
\label{fig:concept_bsb} | |||||
} | |||||
\end{figure} | |||||
Für den Teststand muss ein Infrarotsender entwickelt werden, der die IR-Schnittstelle des Stromzählers | |||||
nachahmt und konfigurierbare Werte als Zählerstand versendet. Hier bietet sich ebenfalls eine Lösung | |||||
mit einem Microcontroller an. | |||||
\FloatBarrier | |||||
\chapter{Implementierung} | |||||
%--- | |||||
% Simon und Julian | |||||
\section{Stromzähler} | |||||
%--- | |||||
% Julian ~ 2 Seiten | |||||
\subsection{Infrarotschnittstellen} | |||||
%+-- | |||||
% @Julian: war glaube ich dir zugeteilt, ich hab mich beim Zähler mal auf das Modell aus | |||||
% https://emh-metering.com/wp-content/uploads/2021/08/eHZ-K-DAB-D-1.10.pdf (Datasheet) | |||||
% bezogen, wär cool wenn du hier kurz erwähnen könntest dass es sowohl die Datenschnittstelle | |||||
% als auch so eine x Impulse/kWh IR-Schnittstelle gibt. | |||||
Wie bereits erwähnt verfügt der Stromzähler über mehrere Infrarotschnittstellen. Dabei ist zwischen der Prüf-LED und den beiden optischen Datenschnittstellen zu unterscheiden. Über die Prüf-LED sendet der Stromzähler 10.000 Impulse pro kWh, vorausgesetzt es wird ein Strom oberhalb der Anlaufschwelle gemessen. Diese Schnittstelle dient jedoch, wie der Name bereits vermuten lässt, primär zur Funktionsprüfung des Zählers. Die beiden Datenschnittstellen hingegen können dazu verwendet werden, umfangreichere Daten auszulesen.\\ Auf der Rückseite des Zählers befindet sich eine bidirektionale Datenschnittstelle, worüber neben dem Auslesen von Zählstanden auch das Setzen und Lesen von Zählerparametern, Fernabfragung oder Prüfung des Zählers möglich ist. Diese Schnittstelle ist jedoch hauptsächlich für den Netzbetreiber gedacht und aus diesem Grund auch mit einer Betriebsplombe versehen. Für den Endkunden zugänglich ist die unidirektionale INFO-Schnittstelle auf der Vorderseite, worüber der gleiche Datensatz empfangen werden kann, aber keine aktive Kommunikation mit dem Messgerät möglich ist \cite{eHZ2020}. | |||||
% https://emh-metering.com/wp-content/uploads/2020/08/eHZ-K-BIA-D-1-20.pdf (User manual) eHZ2020 | |||||
\subsection{SML - Smart Message Language} \label{SML spec} | |||||
%+-- | |||||
Über beide Datenschnittstellen wird alle paar Sekunden ein Datensatz verschickt, wobei hier zwischen einem reduzierten und einem vollständigen Datensatz gewechselt wird. Beide Datensätze verwenden SML (=Smart Message Language) \cite{TechnischeRichtlinie} | |||||
% https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR03109/TR-03109-1_Anlage_Feinspezifikation_Drahtgebundene_LMN-Schnittstelle_Teilb.pdf?__blob=publicationFile TechnischeRichtlinie | |||||
als Kommunikationsprotokoll mit einer Baudrate von 9600 Baud, einer maximalen Übertragungszeit von 400ms und eine Auflösung des Gesamtverbrauchs von \SI{100}{\milli\watt\hour}\cite{eHZ2020}. | |||||
% Gleiche Quelle wie in vorheriger Subsection: user manual eHZ Gen K | |||||
Die dabei übertragenen Werte werden über das OBIS-Kennzahlen-System \cite{EDI} kodiert. Der für das Projekt relevante Gesamtverbrauch hat dabei die Kennzahl 1.8.0. | |||||
% https://www.bundesnetzagentur.de/DE/Beschlusskammern/BK06/BK6_81_GPKE_GeLi/Mitteilung_Nr_37/Anlagen/OBIS-Kennzahlensystem%202.2a.pdf?__blob=publicationFile&v=2 EDI | |||||
\section{IR Übertragungsstrecke} | |||||
%+-- | |||||
% Simon ~ 1,5 Seiten | |||||
Die Impulsschnittstelle des Stromzählers würde sich grundsätzlich zum Aufzeichnen der Zählerstände eignen, | |||||
vorausgesetzt der Zählerstand zu Aufzeichnungsbeginn ist bekannt. Ein großer Vorteil dieser Schnittstelle | |||||
ist ihre extrem simple Natur: per GPIO-Interrupt eines Microcontrollers oder sogar per diskretem Zähler-IC | |||||
ist der Datenempfang sehr einfach realisierbar. Dagegen muss bei der IR-Datenschnittstelle sowohl | |||||
das Übertragungsprotokoll als auch die Datencodierung, die der Zähler verwendet, unterstützt werden.\\ | |||||
Gegen die Impulsschnittstelle sprechen allerdings einige Nachteile. Da der Zähler lediglich | |||||
eine fixe Anzahl an Impulsen pro verbrauchter Kilowattstunde sendet, werden hier nur Verbrauchsdeltas und | |||||
nie der absolute Wert übermittelt. Folglich wird zur Feststellung eines tatsächlichen Zählerstandes | |||||
in Kilowattstunden der Zählerstand zu Aufzeichnungsbeginn benötigt. Außerdem führt ein temporärer Ausfall | |||||
der Empfängerschaltung, bei dem Impulse nicht aufgezeichnet werden, zur Messung falscher Zählerstände.\\ | |||||
Ein weiterer Nachteil der Impulsschnittstelle ist dass zumindest ein Teil der Empfängerschaltung dauerhaft in Betrieb sein | |||||
muss um jeden Infrarotimpuls aufzunehmen. Gerade bei einem Microcontroller ist hier von einem relativ | |||||
hohen Energieverbrauch auszugehen bei dem ein Großteil der Energie verschwendet wird.\\ | |||||
Auf der Datenschnittstelle wird in regelmäßigen Intervallen der absolute Zählerstand übermittelt, damit | |||||
entfallen beide Nachteile der Impulsschnittstelle. Daher wurde sich für dieses Projekt für den Empfang | |||||
an der Datenschnittstelle entschieden. \\ | |||||
Die Datenschnittstelle überträgt hier die Zählerstände mittels des sogenannten D0-Protokolls \cite{EasyMeter} | |||||
% https://www.mikrocontroller.net/attachment/89888/Q3Dx_D0_Spezifikation_v11.pdf EasyMeter | |||||
nach DIN EN 62056‐21. Die Beschreibung des Protokolls lässt bereits eine Ähnlichkeit mit RS232 | |||||
vermuten, experimentell konnte bestätigt werden, dass die D0-Daten mittels der RS232-Peripherie eines | |||||
ESP8266 Microcontroller empfangen werden können. Dabei muss lediglich der RX-Pin der RS232-Schnittstelle | |||||
des Controllers an eine geeignete Empfangsschaltung angeschlossen werden.\\ | |||||
Bei einem Test mit einem Stromzähler des Herstellers \glqq Landis+Gyr\grqq{} konnte allerdings | |||||
festgestellt werden, dass die Datenformatangabe aus \cite{EasyMeter}, d.h. | |||||
1 Startbit, 7 Datenbits, 1 Paritätsbit und ein Stoppbit, von diesem Zähler nicht eingehalten wird, | |||||
stattdessen wird von diesem Zähler 1 Startbit, 8 Datenbits und 1 Stoppbit verwendet. | |||||
Laut Herstellerangabe \cite{Benutzerhandbuch} | |||||
% https://www.landisgyr.de/webfoo/wp-content/uploads/2018/08/D000063497-E220-AMxD-Benutzerhandbuch-de-f.pdf Benutzerhandbuch | |||||
handelt es sich bei dieser Schnittstelle ebenfalls um eine Datenschnittstelle gem. DIN EN 62056‐21. | |||||
Bei der Einstellung der RS232-Peripherie kann es also zu zählerabhängigen Unterschieden kommen.\\ | |||||
Um einen Empfang der Zählerstände zu ermöglichen, müssen die Infrarotsignale des Zählers zunächst | |||||
in digitale elektrische Signale gewandelt werden. Für die Wandlung von Infrarotsignalen zu | |||||
elektrischen Signalen wurde eine Photodiode vom Typ SFH 213 FA \cite{Fotodiode} gewählt. Laut Datenblatt | |||||
% https://cdn-reichelt.de/documents/datenblatt/A501/SFH213FA_ENG_TDS.pdf Fotodiode | |||||
fließt bei einer Sperrspannung von $V_R=\SI{20}{\volt}$ ein Dunkelstrom $I_R \leq \SI{5}{\nano\ampere}$. | |||||
Bei $V_R=\SI{5}{\volt}$ und bei einer Strahlungsleistung von \SI{1}{\milli\watt\per\centi\metre\squared} | |||||
ist ein Photostrom $I_P \geq \SI{65}{\micro\ampere}$ zu erwarten. Bei Anwendung der Photodiode | |||||
in der Empfängerschaltung sind diese Rahmenparameter, sowohl die \SI{20}{\volt} Sperrspannung als | |||||
auch die genaue Strahlungsleistung nicht identisch mit den Vorgaben aus dem Datenblatt. Allerdings | |||||
können der Dunkelstrom $I_R \approx \SI{5}{\nano\ampere}$ und der Photostrom $I_P\approx\SI{65}{\micro\ampere}$ | |||||
als grobe Vorgaben zur Dimensionierung der Empfängerschaltung verwendet werden.\\ | |||||
Um die Stromsignale der Photodiode zu verstärken, bietet sich ein einfacher NPN-Transistor an, gewählt wurde | |||||
der BC548B. Mit der Beschaltung aus Abb. \ref{fig:ir_recv_a} und $200 \leq h_{FE} \leq 450$ | |||||
\cite{Transistor}, | |||||
% https://cdn-reichelt.de/documents/datenblatt/A100/BC546_48-CDIL.pdf Transistor | |||||
ergibt sich ohne IR-Bestrahlung am Ausgang bei $V_{CC} = \SI{3,3}{\volt}$ | |||||
$U_{out} \approx V_{CC} - R_1 \cdot \SI{5}{\nano\ampere} \cdot h_{FE} \approx \SI{3,3}{\volt} \approx V_{CC}$. | |||||
Mit IR-Bestrahlung bei $I_{P}\approx\SI{65}{\micro\ampere}$ ergäbe sich nach der obigen Formel | |||||
eine negative Ausgangsspannung, in der Praxis geht der Transistor in Sättigung und $U_{out} \approx \SI{0}{\volt}$. \\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.25\textheight]{img/ir_recv_a.PNG} | |||||
\caption{Die Infrarotempfängerschaltung} | |||||
\label{fig:ir_recv_a} | |||||
} | |||||
\end{figure} | |||||
Anhand der Berechnung lässt sich erkennen, dass die Verstärkerschaltung das Eingangssignal invertiert: | |||||
bei Dunkelheit wird eine digitale 1 erzeugt, bei IR-Belichtung eine digitale 0. Dieses Verhalten | |||||
kann schaltungstechnisch mit einem einfach Inverter, wie in Abb. \ref{fig:ir_recv_b} zu sehen, behoben werden. \\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.25\textheight]{img/ir_recv_b.PNG} | |||||
\caption{Die Infrarotempfängerschaltung mit Inverter} | |||||
\label{fig:ir_recv_b} | |||||
} | |||||
\end{figure} \\ | |||||
Nach Entwicklung der Schaltung konnte experimentell festgestellt werden, dass der getestete Stromzähler | |||||
der Firma Landis+Gyr bereits beim Senden das serielle Signal invertiert, sodass ein Inverter beim Empfänger | |||||
entfällt. Daher wurde die Inverterstufe auf der fertigen Platine durch einen Jumper konfigurierbar | |||||
ausgelegt (s. Abschnitt \ref{sec:schematic}). So kann Anwendungsspezifisch die Schaltung aus Abb. | |||||
\ref{fig:ir_recv_a} oder aus Abb. \ref{fig:ir_recv_b} verwendet werden.\\ | |||||
Das Signal $U_{out}$ der Empfängerschaltung kann direkt mit dem RX-Pin des Microcontrollers verbunden | |||||
werden. | |||||
\FloatBarrier | |||||
\section{Microcontroller} \label{sec:ESP} | |||||
%+-- | |||||
%Julian | |||||
Für das Empfangen und Verarbeiten der Daten wurde als Microcontroller ein D1 mini ausgewählt, welcher auf einem ESP8266 Prozessor basiert. Dieser verfügt über eine integrierte WLAN-Schnittstelle und ausreichend Peripherie, um den Anforderungen gerecht zu werden. Die serielle Schnittstelle des Microcontrollers kann außerdem direkt genutzt werden, um das serielle Signal vom Stromzähler mittels der bereits vorgestellten Empfängerschaltung relativ einfach einzulesen. Außerdem ist der Microcontroller mit der Arduino IDE programmierbar, was die Vorteile einer einfachen Programmierung und der gleichzeitig großen Vielfalt an Bibliotheken und Erweiterungen für diese Plattform kombiniert. Trotz seiner geringen Größe und dem vernachlässigbaren Gewicht verfügt das Board dennoch über ausreichend RAM und Flash-Speicher, eine Taktgeschwindigkeit von 80 bzw. 160 Mhz und einer $I^2C$-Schnittstelle zur Kommunikation mit der RTC, womit alle Anforderungen erfüllt sind und er sich perfekt zur Umsetztung des Projekts eignet \cite{ESP}. | |||||
% https://www.wemos.cc/en/latest/d1/d1_mini.html ESP | |||||
\begin{figure}[!h] | |||||
\centering | |||||
\includegraphics[height=0.25\textheight]{img/d1_top.jpg} | |||||
\caption{ESP 8266 D1 Mini} | |||||
\label{fig:d1_mini_top} | |||||
\end{figure} | |||||
% TODO Bild auf gleiche Seite wie Text | |||||
\FloatBarrier | |||||
\section{Energieverbrauch} | |||||
%+-- | |||||
% Simon ~ 3-4 Seiten | |||||
Da das Infrarotempfängerkonzept eine vollständig kabellose Anbindung des Empfängeraufbaus vorsieht, | |||||
ist die Energieversorgung über einen Akku notwendig. Als Akku wurde ein Lithium-Ionen Akku im 18650 | |||||
Formfaktor gewählt. Für das Akkumanagement, d.h. Laden des Akkus und Unterspannungsschutz, wird | |||||
ein fertiges BMS-Board verwendet. Das gewählte BMS-Board ist unter der Bezeichnung | |||||
\glqq Wemos 18650 battery shield V3\grqq{} auf diversen Onlinemarktplätzen zu finden.\\ | |||||
Das Board wird mit einer 18650 Lithium-Ionen-Zelle bestückt und liefert \SI{3}{\volt} und | |||||
\SI{5}{\volt} Ausgangsspannung, die bei Unterspannung der Akkuzelle automatisch abgeschaltet werden. | |||||
Weiterhin kann der Akku im BMS-Board bequem per Micro-USB aufgeladen werden.\\ | |||||
Damit der Empfänger einen möglichst nützlichen | |||||
Smart Home-Sensor darstellt, muss eine hohe Akkulebensdauer sichergestellt sein, da bei einem Empfänger, | |||||
der sehr häufig aufgeladen werden muss auch das manuelle notieren der Stromzählerstände einen vergleichbaren | |||||
Aufwand verursachen würde.\\ | |||||
Bei einem handelsüblichen 18650 Lithium-Ionen-Akku kann von einer Kapazität in der Größenordnung von | |||||
\SI{2700}{\milli\ampere{}\hour} ausgegangen werden \cite{Panasonic}. | |||||
% https://b2b-api.panasonic.eu/file_stream/pids/fileversion/3447 Panasonic | |||||
Bei einer geschätzten Stromaufnahme der Empfängerschaltung im Dauerbetrieb von ca. | |||||
\SI{150}{\milli\ampere}, ergäbe sich eine Akkulebensdauer von ca. \SI{18}{\hour}, ein völlig | |||||
inakzeptabler Wert. Aus dieser Überschlagsrechnung wird klar, dass die Empfängerschaltung in zwei | |||||
Zuständen, einem Aktivzustand mit großem Energieverbrauch und einem möglichst sparsamen Passivzustand, | |||||
realisiert werden muss. | |||||
\subsection{Abschätzung der Akkulebensdauer} | |||||
%+-- | |||||
\label{sec:lifetime_approx} | |||||
Um eine Realisierung dieser beiden Zustände zu beurteilen, ist ein Modell der Akkulebensdauer | |||||
in Abhängigkeit der Parameter der Zustände (Verweildauer im Zustand und Stromaufnahme) sinnvoll.\\ | |||||
Der Aktivzustand wird charakterisiert durch die Dauer $t_{on}$ mit mittlerem Versorgungsstrom $I_{on}$, | |||||
der in einem Zyklus der Periode $T_{cycle}$ auftritt, der Standby-Zustand wir charakterisiert durch | |||||
den Ruhestrom $I_{off}$.\\ | |||||
Mit Ladung $C=\int{I(\tau)d\tau}$ ergibt sich näherungsweise eine Ladungsaufnahme der Schaltung von | |||||
\begin{equation} | |||||
C_{auf}(t) = I_{on}\cdot\frac{t_{on}}{T_{cycle}}\cdot t + I_{off}\cdot t. | |||||
\end{equation} | |||||
Dabei wurden unter den Annahmen $t \gg T_{cycle}$ und $\frac{t_{on}}{T_{cycle}} \ll 1$ einige Vereinfachungen vorgenommen.\\ | |||||
Modelliert man nun den Akku der Kapazität $C_A$ (z.B. \SI{2800}{\milli\ampere{}\hour}) als simple Ladungsquelle, | |||||
die die Schaltung versorgt, bis $C_A$ \glqq aufgebraucht\grqq{} ist, ergibt sich durch Gleichsetzen von | |||||
$C_{auf}(t)$ und $C_A$ eine geschätzte Lebensdauer | |||||
\begin{equation} | |||||
t_L = \frac{C_A}{I_{on}\cdot t_{on}/T_{cycle}+I_{off}}. | |||||
\end{equation} | |||||
Für einen Ruhestrom von $I_{off}=\SI{2}{\micro\ampere}$, eine Aktivzeit $t_{on}=\SI{30}{\second}$, | |||||
$T_{cycle}=\SI{12}{\hour}$, $C_A=\SI{2800}{\milli\ampere{}\hour}$ und | |||||
einen mittleren Versorgungsstrom $I_{on}=\SI{150}{\milli\ampere}$ ergibt sich beispielsweise aus der Abschätzung | |||||
$t_L=\SI{1099}{\day}$. Wird bei den selben Parametern ein Ruhestrom von $I_{off}=\SI{0,2}{\milli\ampere}$ | |||||
angesetzt, drittelt sich die geschätzte Lebensdauer auf ca. \SI{384}{\day}.\\ \\ | |||||
Es ist fragwürdig, ob in der Praxis tatsächlich eine derartig hohe Lebensdauer erreichbar ist, mitunter, | |||||
da kein realistisches Akkumodell verwendet wurde.\\ | |||||
Allerdings ist die hohe Abschätzung der Lebensdauer eine gute Indikation dafür, dass | |||||
die reale Lebensdauer nicht ausschließlich durch den Energieverbrauch der Schaltung sondern durch Eigenschaften | |||||
des Akkus limitiert wird und somit eine weitere Optimierung des Energieverbrauchs nicht unbedingt zu einem | |||||
signifikanten Anstieg der Akkulebensdauer führen würde. Um die Lebensdauer genauer zu bestimmen, ist allerdings | |||||
eine Echtzeitmessung oder die Verwendung eines präzisen Akkumodells erforderlich. | |||||
\subsection{Schaltungstechnische Realisierung des Standbyzustands} | |||||
%+-- | |||||
Der ESP8266 verfügt Hardwareseitig bereits über einen sogenannten \glqq Deep-sleep\grqq{}-Modus \cite{ESPSolution}. | |||||
% ESP8266 Low Power Solutions V1.5, Espressif | |||||
% https://www.espressif.com/sites/default/files/documentation/9b-esp8266-low_power_solutions__en.pdf ESPSolution | |||||
In diesem Modus wird der Großteil des Mikrocontrollers deaktiviert und damit der Energieverbrauch | |||||
deutlich gesenkt \cite{ESPSolution}. Mittels der internen Uhr (RTC) des ESP wird der Microcontroller | |||||
in bestimmten Intervallen wieder \glqq geweckt\grqq{} \cite{ESPSolution}. | |||||
Durch diesen Mechanismus könnte der zuvor beschriebene Energiesparmodus umgesetzt werden. | |||||
Da für dieses Projekt allerdings der ESP8266 nicht einzeln sondern in Form eines Entwicklungsboards | |||||
mit zusätzlicher Peripherie (z.B. Spannungswandler und USB zu UART Wandler) verwendet wird und | |||||
auch im Arbeitspunkt der IR-Empfängerschaltung ein geringer Strom fließt, würde | |||||
der Deep-sleep-Modus zwar den Energieverbrauch des ESP reduzieren, alle weiteren Komponenten wären | |||||
davon allerdings nicht betroffen. Wie die Lebensdauerabschätzung im vorherigen Abschnitt zeigt, ist | |||||
ein Standbystrom im Microamperebereich wünschenswert, daher ist der Deep-sleep-Modus für diesen Zweck | |||||
nicht ausreichend.\\ | |||||
Eine alternative Lösung, die im Rahmen dieses Projekts gewählt wurde, ist im Standbyzustand die | |||||
Energieversorgung der kompletten Schaltung zu unterbrechen.\\ | |||||
Dafür wird mittels eines p-MOSFET ein high-side Schalter realisiert, der die Versorgungsspannung | |||||
vom BMS-Board zum Empfänger schaltet. Der MOSFET wird angesteuert durch eine externe Echtzeituhr | |||||
(RTC) vom Typ DS3231 \cite{Maxim}. | |||||
% https://datasheets.maximintegrated.com/en/ds/DS3231.pdf Maxim | |||||
Die DS3231 liefert via I\textsuperscript{2}C-Schnittstelle nach einmaliger Konfiguration fortlaufend | |||||
das aktuelle Datum und die aktuelle Uhrzeit. Die RTC wird dabei von einer Lithium-Knopfzelle versorgt | |||||
und ist damit in ihrer Funktion unabhängig von einer externen Spannungsversorgung. Die für dieses Projekt | |||||
wichtigste Funktion der DS3231 sind die zwei programmierbaren Alarme der RTC.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=0.5\linewidth]{img/power_schema.PNG} | |||||
\caption{Schematische Darstellung der geschalteten Energieversorgung} | |||||
\label{fig:power_schema} | |||||
} | |||||
\end{figure} | |||||
Mittels I\textsuperscript{2}C können in den Registern der RTC zwei Alarme dazu programmiert werden, in | |||||
bestimmten Intervallen (minütlich, stündlich, täglich, ...) den $\overline{\mbox{INT}}$-Pin der RTC | |||||
auf Masse zu ziehen \cite{Maxim}. Dabei ist sehr hilfreich, dass die Alarmsignale selbsthaltend sind, | |||||
d.h. wird ein Alarm ausgelöst bleibt $\overline{\mbox{INT}}$ auf Masse gezogen, bis via | |||||
I\textsuperscript{2}C das jeweilige Alarmflag (A1E bzw. A2E) in den RTC-Registern zurückgesetzt wird \cite{Maxim}.\\ | |||||
Das Signal eignet sich also direkt zum Schalten der Energieversorgung der Empfängerschaltung. | |||||
Weiterhin handelt es sich bei dem $\overline{\mbox{INT}}$-Pin um einen open-drain Ausgang, d.h. der Pin | |||||
muss mit einem externen Pull-Up-Widerstand beschaltet werden \cite{Maxim}, der die high-Spannung des | |||||
Signals vorgibt. Damit bietet sich das Signal zum Steuern des p-MOSFET sehr an, da durch einen | |||||
Pull-Up auf die Sourcespannung des MOSFET der p-MOSFET korrekt durch das Signal geschaltet wird.\\ | |||||
In der praktischen Erprobung der Schaltung hat sich gezeigt, dass teils beim Ausschalten Glitches | |||||
auftreten können, bei denen die Versorgung nicht vollständig ausgeschaltet wird, sondern die Spannung | |||||
am Drain des MOSFET (die nahe \SI{0}{\volt} liegen sollte) bei beispielsweise \SI{1,6}{\volt} hängen | |||||
bleibt und der Ausschaltvorgang somit fehlschlägt. Um ein sicheres Ausschalten zu gewährleisten, | |||||
wurde zwischen das $\overline{\mbox{INT}}$-Signal der RTC mit Pull-Up und den MOSFET ein Spannungspuffer | |||||
geschaltet (realisiert durch zwei nacheinander geschaltete NAND-Gatter aus einem CD4011B IC, | |||||
Schaltung siehe Abschnitt \ref{sec:schematic}).\\ | |||||
Nach dieser Änderung konnten keine Glitches mehr festgestellt werden.\\ | |||||
Als p-MOSFET wurde ein NX2301P gewählt \cite{MOSFET}. | |||||
% https://assets.nexperia.com/documents/data-sheet/NX2301P.pdf MOSFET | |||||
Das wichtigste Auswahlkriterium für den MOSFET war in dieser Funktion ein betragsmäßig ausreichend | |||||
geringes $V_{GS}$ um den MOSFET einzuschalten. Dem Datenblatt lässt sich bei | |||||
$V_{GS}=\SI{-1.8}{\volt}$ ein maximales $R_{DSon}$ von \SI{270}{\milli\ohm} entnehmen. Dieser | |||||
$R_{DSon}$-Wert ist für den Aktivzustand der Schaltung völlig ausreichend - bei einer Stromaufnahme | |||||
von \SI{150}{\milli\ampere} fallen über dem MOSFET maximal \SI{41}{\milli\volt} ab, der Leistungsverlust | |||||
über dem MOSFET liegt im einstelligen Milliwattbereich. Die Gate-Source Spannung | |||||
von \SI{-1.8}{\volt} ist ebenfalls komfortabel erreichbar, bei einer Akkuspannung von \SI{3}{\volt} | |||||
wird ein $V_{GS}$ von knapp \SI{-3}{\volt} im Aktivzustand erreicht. | |||||
\FloatBarrier | |||||
\subsection{Messtechnische Überprüfung des Energieverbrauchs} | |||||
%+-- | |||||
Zur messtechnischen Überprüfung des Energieverbrauchs wurde zunächst das BMS-Board mit \SI{3,7}{\volt} | |||||
versorgt und die Stromaufnahme ohne angeschlossene Last bestimmt. Es konnte ein Wert von ca. | |||||
\SI{0,33}{\milli\ampere} gemessen werden. Wie bereits bei der Abschätzung der Akkulebensdauer festgestellt | |||||
wurde, handelt es sich hierbei um einen relativ hohen Standbyverbrauch. Es ist eine naheliegende Vermutung, | |||||
dass dieser Stromverbrauch ohne Last durch den DC-DC Step-Up Konverter auf dem BMS-Board verursacht wird, | |||||
der die \SI{5}{\volt} Ausgangsspannung des Boards generiert.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.7\linewidth]{img/bms_board.jpg} | |||||
\caption{Die Rückseite des BMS-Boards. Rot markiert der Step-Up Konverter} | |||||
\label{fig:bms_backside} | |||||
} | |||||
\end{figure} \\ | |||||
Durch Position der Induktivität und Nachschlagen der IC-Nummern konnte U7 (s. Abb. \ref{fig:bms_backside}) | |||||
als Step-Up Konverter des Typs FP6298 identifiziert werden. Durch Entfernen des Step-Up ICs von der Platine | |||||
konnte die Stromaufnahme des BMS-Boards ohne angeschlossene Last auf unter \SI{0,2}{\micro\ampere} | |||||
reduziert werden. Durch diese Modifikation geht selbstverständlich der \SI{5}{\volt} Ausgang des BMS-Boards | |||||
verloren, stattdessen steht maximal die Zellspannung zur Verfügung. Das stellt allerdings kein Problem | |||||
dar, da experimentell festgestellt wurde, dass eine Versorgungsspannung im Bereich von \SI{3}{\volt} | |||||
bis \SI{3,7}{\volt} für den Betrieb der Empfängerschaltung ausreichend ist. Betrachtet man die | |||||
Entladecharakteristik eines typischen 18650 Lithium-Ionen Akkus (s. Abb. \ref{fig:liion_discharge}), | |||||
ist ersichtlich, dass in diesem | |||||
Spannungsbereich der größte Teil der Akkuladung ausgenutzt werden kann.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.7\linewidth]{img/discharge_curve.PNG} | |||||
\caption{Entladekurve eines 18650 Lithium-Ionen Akkus \cite{Panasonic}} | |||||
% https://b2b-api.panasonic.eu/file_stream/pids/fileversion/3447 Panasonic | |||||
\label{fig:liion_discharge} | |||||
} | |||||
\end{figure} | |||||
Anschließend wurde der Energieverbrauch der vollständigen Empfängerschaltung zusammen mit dem | |||||
BMS-Board charakterisiert. Dafür wurden erneut \SI{3,7}{\volt} an den Zellanschlüssen des BMS-Boards | |||||
eingespeist und der Stromfluss am Zellanschluss gemessen.\\ | |||||
Es konnte im Aktivzustand ein mittlerer Stromverbrauch von ca. \SI{150}{\milli\ampere} und im | |||||
Standby-Zustand ein Stromverbrauch zwischen \SI{0,3}{\micro\ampere} und \SI{1,5}{\micro\ampere} | |||||
gemessen werden. Mit der Abschätzung aus Abschnitt \ref{sec:lifetime_approx} ergibt sich mit diesen | |||||
Werten bei $t_{on}=\SI{30}{\second}$, $T_{cycle}=\SI{12}{\hour}$ und $C_A=\SI{2800}{\milli\ampere{}\hour}$ | |||||
eine geschätzte Lebensdauer von $t_L\approx\SI{1104}{\day}$. Obwohl die reale Akkulebensdauer | |||||
sicherlich deutlich geringer ausfallen wird, lässt dieser hohe Wert vermuten, dass Verbraucherseitig | |||||
die Voraussetzungen für eine hohe Akkulebensdauer erfüllt sind. | |||||
\FloatBarrier | |||||
\section{Platine} | |||||
%+-- | |||||
% Julian ~ 1-2 Seiten | |||||
Um alle benötigten Komponenten sicher miteinander zu verbinden wurde entschieden eine eigene Platine zu entwerfen. Zwar hätte ein Aufbau auf einer Lochrasterplatine sicherlich auch funktioniert, jedoch wäre dieser bei der Anzahl der Komponenten und deren Größe, wie z.B. dem Microcontroller oder den NAND-Gates, sehr unübersichtlich geworden. Außerdem konnten die verschiedenen Konfigurationsmöglichkeiten so leichter implementiert und beschriftet werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\linewidth]{img/platine_rendering.png} | |||||
\caption{3D-Rendering der Platine in Altium} | |||||
\label{fig:pcb_rendering} | |||||
} | |||||
\end{figure} | |||||
Wie bereits im vorherigen Kapitel beschrieben kam es zu Glitches beim Abschalten des pMOSFETs. Um sowohl die Möglichkeit des direkten Abschaltens, als auch die des gepufferten Abschaltens zu haben, wurden Lötbrücken platziert. Somit kann ohne besonders viel Aufwand die Konfiguration geändert werden. \\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\linewidth]{img/pcb_sb1_sb2.png} | |||||
\caption{Lötbrücke 1 und 2 für Abschaltung mit oder ohne Puffer} | |||||
\label{fig:pcb_sb1_sb2} | |||||
} | |||||
\end{figure} \\ | |||||
Eine weitere Lötbrücke wurde platziert um die RTC im aktiven Zustand aus dem Akku zu speisen. Damit wird vermieden, dass die Knopfzelle zu schnell entleert wird.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.5\textheight]{img/pcb_sb3.png} | |||||
\caption{Lötbrücke 3 für Versorgung der RTC per Akku} | |||||
\label{fig:pcb_sb3} | |||||
} | |||||
\end{figure} \\ | |||||
Außerdem wurde beim Testen mit einem anderen Stromzähler entdeckt, dass der Stromzähler des Herstellers \glqq Landis+Gyr\grqq{} bereits ein invertiertes Signal sendet. Da der Stromzähler, an dem der Empfänger letzten Endes betrieben wird, nicht getestet werden konnte, wurden hierfür Jumper eingebaut. Somit kann die Inverterstufe im Empfangspfad leichter aktiviert oder deaktiviert werden.\\ | |||||
Leider wurde nach Fertigstellung der Platine bemerkt, dass J2 vor R402 gesetzt werden müsste. \\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/pcb_jumper_corrected.png} | |||||
\caption{Jumper zum Aktivieren und Deaktivieren der Inverterstufe mit nötiger Korrektur} | |||||
\label{fig:pcb_jumper} | |||||
} | |||||
\end{figure} | |||||
Im Auslieferungszustand wurden die Lötbrücken SB1 (Gepuffertes Abschalten des pMOSFET) und SB3 (Speisen der RTC aus dem Akku im aktiven Zustand) sowie der Jumper 1 (mit Invertierung im Empfangspad) gesetzt. | |||||
\section{Software} | |||||
%--- | |||||
% Julian ~ 6-8 Seiten | |||||
Das komplette Programm sowohl für den Empfänger, als auch für den Teststand, sind im Anhang \ref{sec:software_reader} zu finden. | |||||
\subsection{Programmablauf} \label{sec:Programm} | |||||
%+-- | |||||
Der ESP wurde mit der Arduino IDE programmiert. Diese ermöglicht den Zugang zu beliebiger Hardware, solange der korrekte Treiber installiert ist und es eine Anbindung an die Arduino IDE gibt. Als Schnittstelle gibt es eine setup()-Funktion, welche einmalig zu Beginn des Programms abgearbeitet wird und eine loop()-Funktion, welche nach dem Setup zyklisch als Endlosschleife abläuft.\\ | |||||
Im Setup werden zunächst einzelne Pins initialisiert, danach wird die serielle Kommunikation gestartet, woraufhin die Verbindung zum WLAN hergestellt wird. Ist dies erfolgreich, versucht der ESP als nächstes sich mit dem MQTT-Broker zu verbinden. Sobald auch das funktioniert hat ist die Initialisierung beendet. Sollte jedoch keine Verbindung zum WLAN oder dem MQTT-Broker hergestellt werden können, wird nach einer bestimmten Zeit das Ausschalten initialisiert. | |||||
\subsection{RTC} | |||||
%+-- | |||||
Die Spannungsversorgung des Microcontrollers wird von der RTC gesteuert. Diese arbeitet mit internen Alarmen und schaltet den INT-Pin (low-aktiv), sobald ein aktiver Alarm abgelaufen ist. Danach bleibt sie aktiv, bis über $I^2C$ der Befehl zum Ausschalten gesendet wird. Dies geschieht, indem der Microcontroller nach Ablauf seines Programms im Control-Register der RTC die Flags für die Alarme zurücksetzt. Sobald das passiert ist, setzt die RTC den INT-Pin zurück und unterbricht damit die Stromversorgung für den ESP. Nach Ablaufen des Alarms beginnt dieser Zyklus von neuem. | |||||
\subsection{WifiManager} \label{wifi_mgr} | |||||
%+-- | |||||
Kernanforderung des Projekts war die drahtlose Kommunikation zwischen Empfänger und Smart-Home-Controller. Da uns aus ersichtlichen Gründen jedoch zur Projektlaufzeit die Zugangsdaten zum endgültigen WLAN nicht zur Verfügung standen war es nötig, dem Bediener die Möglichkeit zu geben, eine gültige WLAN Konfiguration an den Microcontroller zu übermitteln, ohne ihn dafür jedes Mal neu flashen zu müssen. Diese Funktionalität gibt es bereits in Form einer Bibliothek mit dem Namen WifiManager \cite{WiFiManager}.\\ | |||||
% https://github.com/tzapu/WiFiManager WiFiManager | |||||
Mit Hilfe der Bibliothek startet der Microcontroller im Station-Mode und versucht, sich mit ggf. vorher gespeicherten Zugangsdaten anzumelden. Gelingt dies nicht oder ist noch keine Konfiguration hinterlegt, wechselt der ESP in Access-Point-Mode und startet einen eigenen Webserver. Nun kann sich der Bediener mit jedem beliebigen, WLAN-fähigen Gerät am WLAN des ESP anmelden und wird zu einer Anmeldeseite weitergeleitet, wo nun die WLAN Zugangsdaten eingegeben werden können. Sobald sich der ESP erfolgreich mit dem angegebenen Netzwerk verbunden hat wird der Programmablauf fortgesetzt.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=0.5\textwidth]{img/wifimgr_loginpage.png} | |||||
\caption{Anmeldeseite des WifiManager aus Sicht des Bedieners} | |||||
\label{fig:wifi_manager} | |||||
} | |||||
\end{figure} | |||||
Zwar bietet die Bibliothek auch Felder für MQTT-Broker IP und Port an, dies hat jedoch zum Zeitpunkt des Projekts nicht zuverlässig funktioniert und wurde deshalb aus dem Programm entfernt. Sollte die Bibliothek dahingehend verbessert werden, wäre es sinnvoll, dieses Feature nachzurüsten, um nicht jedes Mal den Microcontroller flashen zu müssen wenn ein anderer MQTT-Broker verwendet wird. Da dem Broker, welcher in diesem Fall ein Raspberry Pi ist, entweder in der internen Konfiguration des Raspberry Pi eine statische oder über den Router immer dieselbe IP zugewiesen werden kann und das Gerät nicht für wechselnde MQTT-Broker gedacht ist, kann auf dieses Feature aber auch verzichtet werden. IP und Port des Brokers sind daher im Programm in Variablen hinterlegt. | |||||
\subsection{Einlesen der SML-Daten} \label{sec:sml} | |||||
%--- | |||||
Hauptauftrag der Software ist das erfolgreiche Einlesen und Verarbeiten der eingehenden Daten. Da die serielle Schnittstelle des ESP genutzt wird kann dafür auch die Standardbibliothek von Arduino zum Einlesen serieller Daten genutzt werden. Sobald Daten verfügbar sind werden diese in einen internem Buffer, ein Int-Array der Länge 1000, gespeichert. Danach wird dieser Buffer auf bestimmte Zeichenfolgen untersucht. Da die Daten per SML kodiert sind muss auf eine bestimmte Zeichenfolge aus dem SML-Protokoll getriggert werden, hierbei wurde sich auf die OBIS-Kennzahl 1.8.0 (vgl. \ref{SML spec}) konzentriert. | |||||
% TODO Code so formattieren dass kein Overflow passiert, ggf Kommentare in eigene Zeile | |||||
% TODO In Endfassung schauen dass Code auf EINER Seite ist | |||||
\begin{Verbatim}[tabsize=4] | |||||
// Daten von Stromzähler: Gesamtverbrauch herausfiltern | |||||
if ( /* OBIS Kennung: 1-0.1.8.0*255 = 01 00 */ | |||||
/* 01 08 00 FF */ | |||||
BUFFER[j] == 0x77 && /* 77 - SML_Message.messageBody.SML_GetList */ | |||||
/* _Reponse.valList.valListEntry (Sequence) */ | |||||
BUFFER[j+1] == 0x07 && /* 07 - objName (TL[1] + octet-string[6] */ | |||||
BUFFER[j+2] == 0x01 && /* 01 - objName Teil A */ | |||||
BUFFER[j+3] == 0x00 && /* 00 - objName Teil B */ | |||||
BUFFER[j+4] == 0x01 && /* 01 - objName Teil C */ | |||||
BUFFER[j+5] == 0x08 && /* 08 - objName Teil D */ | |||||
BUFFER[j+6] == 0x00 && /* 00 - objName Teil E */ | |||||
BUFFER[j+7] == 0xFF) /* FF - objName Teil F */ | |||||
/* xx - status */ | |||||
/* xx - valTime */ | |||||
/* xx - unit */ | |||||
/* xx - scaler */ | |||||
\end{Verbatim} | |||||
Nun kann es auch passieren dass der ESP genau dann hochfährt, wenn gerade ein SML Paket verschickt wurde, der relevante Teil aber bereits gesendet wurde und für den ESP verloren ist. In diesem Fall darf der ESP nach dem Einlesen der Daten nicht sofort heruntergefahren werden, sondern es muss auf das nächste Paket gewartet werden, welches den Gesamtverbrauch beinhaltet. \\ | |||||
Der Gesamtverbrauch hat eine Auflösung von \SI{0,1}{\watt\hour} und ist als Type-Length-Field kodiert. Dieses TL-Feld definiert die Bedeutung des aktuellen und der folgenden Bytes. | |||||
Aus dem Datenblatt des Stromzählers lässt sich schließen, dass es sich dabei um eine 64-Bit große vorzeichenbehaftete Festpunktzahl (Integer) handelt, was sich zu \glqq0x59h\grqq{} kodiert. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/typelengthfield.png} | |||||
\caption{Type-Length-Field Definition aus \cite{TechnischeRichtlinie}, siehe unter Abbildung} | |||||
\label{fig:typelengthfield} | |||||
} | |||||
\end{figure} | |||||
% Diese Quelle wird bereits unter 1.3.1 schon mal verwendet! | |||||
% Punkt 7.1: https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR03109/TR-03109-1_Anlage_Feinspezifikation_Drahtgebundene_LMN-Schnittstelle_Teilb.pdf?__blob=publicationFile&v=1, | |||||
\FloatBarrier | |||||
Als nächstes müssen die Bytes aus dem Buffer zur eigentlichen Zahl zusammengesetzt werden: | |||||
\begin{Verbatim}[tabsize=4] | |||||
// mWh aus Buffer rekonstruieren | |||||
long long mWh = ((long long)BUFFER[j+1]) << 56 | | |||||
((long long)BUFFER[j+2]) << 48 | | |||||
((long long)BUFFER[j+3]) << 40 | | |||||
((long long)BUFFER[j+4]) << 32 | | |||||
((long long)BUFFER[j+5]) << 24 | | |||||
((long long)BUFFER[j+6]) << 16 | | |||||
((long long)BUFFER[j+7]) << 8 | | |||||
((long long)BUFFER[j+8]); | |||||
\end{Verbatim} | |||||
Abschließend wird diese Zahl in kWh umgerechnet und dieser Messwert an den MQTT-Broker gesendet. | |||||
\subsection{MQTT} | |||||
%--- | |||||
MQTT (=Message Queuing Telemetry Transport \cite{MQTT}) % https://mqtt.org/ | |||||
ist ein Nachrichtenprotokoll zur Vernetzung von IoT-Geräten und funktioniert nach einem Client-Server Modell. Die Clients können Daten versenden, indem sie eine Nachricht in einem Topic an den Broker senden. Auf der anderen Seite können Daten empfangen werden, indem Topics abonniert werden. Das besondere dabei ist, dass Clients Anfragen und Daten ausschließlich über den MQTT-Broker erhalten, welcher den Datenstrom verwaltet. Im Fall dieser Projektarbeit ist der ESP ein MQTT-Client, welcher den Gesamtverbrauch an das Topic \glqq smartmeter\grqq{} sendet. Der Raspberry Pi ist in diesem Fall der MQTT-Broker. | |||||
Da MQTT bereits weit verbreitet ist und besonders für IoT-Geräte bereits ausreichend Implementierungen vorhanden sind wurde hier auf eine bereits bestehende Lösung zurückgegriffen. Dafür wurde die Bibliothek \glqq PubSubClient\grqq{} verwendet, welche eine einfache Implementation bereitstellt. Für Details sei an dieser Stelle auf die GitHub-Seite verwiesen. \cite{pubsubclient} | |||||
% https://github.com/knolleary/pubsubclient pubsubclient | |||||
\subsection{NodeRed und Datenbank}\label{NodeRed_DB} | |||||
%--- | |||||
Die Daten aus dem MQTT-Paket werden in einer MySQL-Datenbank auf dem Raspberry Pi gespeichert. Der genaue Aufbau dieser Datenbank wird weiter unten im Kapitel \ref{anleitung} beschrieben. | |||||
Um die Daten vom ESP in der Datenbank abzuspeichern wird ein NodeRed-Flow verwendet. Um die Zuverlässigkeit der Daten zu erhöhen wird vor dem Einfügen in die Tabelle eine Plausibilitätsprüfung durchgeführt, da Tests ergeben haben dass unvollständige Datensätze vom Stromzähler zu unplausiblen Messwerten führen können. Deshalb wird ein neuer Messwert zuerst mit dem letzten Messwert verglichen. Der neue Wert wird nur dann in der Datenbank gespeichert wenn er größer und höchstens doppelt so groß ist wie der letzte Wert (in den Tests wurden in seltenen Fällen fälschlicherweise Nullwerte oder extrem hohe Werte bemerkt). \\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/nodered_flow.png} | |||||
\caption{NodeRed-Flow zum Speichern und Anzeigen des Messwertes} | |||||
\label{fig:nodered-flow} | |||||
} | |||||
\end{figure} | |||||
Abschließend wird der Wert auf einem Dashboard angezeigt. Dieses wurde bewusst simpel gehalten, da Herr Prof. Klehn hier eigene Ideen umsetzen möchte. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/nodered_dashboard.png} | |||||
\caption{NodeRed-Dasboard zum Anzeigen des letzten Messwerts} | |||||
\label{fig:nodered_dashboard} | |||||
} | |||||
\end{figure} | |||||
% TODO Eventuell was dazu sagen wie ein Dashboard gebaut wird, ist aber eher Fülltext falls nötig | |||||
\FloatBarrier | |||||
\section{Gehäuse} | |||||
%+-- | |||||
Für den Empfängeraufbau aus BMS-Board, Platine, Photodiode, Ein- und Resetschalter wurde ein 3D-Druckgehäuse gezeichnet und gedruckt.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.9\linewidth]{img/case_cad.PNG} | |||||
\caption{CAD-Schnittbild des Gehäuses. Modellquelle BMS-Board: \cite{Wemos}} | |||||
% https://cad.grabcad.com/library/wemos-18650-battery-shield-v3-1 Wemos | |||||
\label{fig:cad_case} | |||||
} | |||||
\end{figure} \\ | |||||
Das Gehäuse kann mit einem Deckel verschlossen werden, der durch vier Schrauben befestigt wird. | |||||
Die Platine und das BMS-Board werden durch metrische Distanzbolzen im Gehäuse und aneinander befestigt. | |||||
Sämtliche Gewinde im gedruckten Material werden durch metallische Gewindeeinsätze realisiert.\\ \\ \\ | |||||
Für die Photodiode befindet sich im Boden des Gehäuses eine Durchführung, in die die Diode eingepresst wird. | |||||
An der Außenseite der Durchführung ist ein Ringmagnet montiert, der den Empfängeraufbau an die magnetische Fläche des Stromzählers fixiert. | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.9\linewidth]{img/case_finished.jpeg} | |||||
\caption{Gehäuse mit allen Komponenten installiert} | |||||
\label{fig:case_finished} | |||||
} | |||||
\end{figure} | |||||
% ToDo (Julian) hier wären 1-2 Bilder vom fertigen Gehäuse cool bzw. falls du die bei Anleitung | |||||
% o.Ä. hast (z.B. wegen Resetschalter) einfach ein kurzer Verweis auf die. Ich hab leider nur | |||||
% Bilder im halb fertigen Zustand. | |||||
\FloatBarrier | |||||
\section{Teststrecke} | |||||
% Kathi ~ 2 Seiten | |||||
%--- | |||||
Zum Testen der Funktion wurde eine kleine Teststrecke aufgebaut, mit der es möglich | |||||
ist die Übertragung ohne den Stromzähler zu simulieren. | |||||
\subsection{Aufbau} | |||||
%++- | |||||
Zunächst wurde die Schaltung der Teststrecke auf einem Steckbrett aufgebaut, um zu überprüfen, ob die Grundidee des Projekts umsetzbar ist. Auch die bestellten Bauteile und Dimensionierungen konnten so überprüft werden. Da während der Arbeit am Projekt zunächst kein Stromzähler zur Verfügung stand wurde der Teststrecke zusätzlich zu dem bereits in Kapitel \ref{sec:ESP} erläuterten ESP ein Arduino UNO hinzugefügt. So konnte überprüft werden, ob auch die Kommunikation zwischen zwei komplett voneinander getrennten Systemen funktioniert. Der ESP dient also weiterhin als Empfänger, während der Arduino den Stromzähler als Sender simuliert. \\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.25\textheight]{img/Schaltung_Teststrecke.jpeg} | |||||
\caption{Der Schalplan der Teststrecke} | |||||
\label{fig:sp_test} | |||||
} | |||||
\end{figure} | |||||
Wie in Abb. \ref{fig:sp_test} zu sehen ist sind die Schaltkreise komplett von einander getrennt. Um die besten Ergebnisse bei der Übertragung zu erzielen, werden die beiden LEDs gegenüber, Spitze an Spitze aufgebaut. Sendet man nun vom TX-Pin des Arduino eine Zahl so kann diese am RX-Pin des ESP empfangen werden. Mit der richtigen Dimensionierung von R1 auf \SI{100} {\ohm} haben auch wechselnde Lichtverhältnisse keinen Einfluss auf die Funktion der Schaltung. Die Werte von R3 und R4 sind relativ frei wählbar, solange sie nicht zu klein sind. Nach ersten erfolgreichen Tests wurden für R3 \SI{2.2}{\kilo\ohm} und für R4 \SI{1}{\kilo\ohm} festgelegt. \\ | |||||
% Julian@Kathi: Die Aussage im Satz oben drüber ist effektiv "wenn mans richtig macht funktionierts", das sollte man umschreiben oder weglassen | |||||
% Kathi@Julian: Besser? Bei R1 müssen es halt ziemlich genau die 100 Ohm sein, ich hatte zum Beispiel 150 und des hat nicht funktioniert, das sollte die Aussage sein | |||||
% Julian@Kathi: Es ging primär um R3 und R4. Hab den Text um den letzten Satz ergänzt, damit wirkt die Dimensionierung nicht rein willkürlich | |||||
Bei der Programmierung ist außerdem aufgefallen, dass das Hochladen des Programmes nur möglich ist, wenn RX- und TX-Pin des jeweiligen Mikrocontroller von der Schaltung getrennt sind. Nachdem die Funktion der Schaltung überprüft war, wurde der Aufbau auf eine Lochstreifenplatine gelötet. Dabei wurde mit Pin-Headern gearbeitet, damit das Ergebnis wie ein Art Arduino-Shield verwendet werden kann. Der Vorteil dabei liegt darin, dass beide Mikrocontroller zwar fest mit der Platine verbunden sind, aber bei Änderungen am Programm auch genauso leicht zum Hochladen getrennt werden können. Außerdem befinden sich die beiden Dioden an der Unterseite des Shields, also im Gebrauch zwischen Shield und Arduino, was die Schaltung noch zusätzlich von äußeren Lichteinflüssen schützt.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=0.5\textheight]{img/shield.jpeg} | |||||
\caption{Lochstreifenplatine mit Pin-Headern für Arduino (links) und ESP (rechts)} | |||||
\label{fig:shield} | |||||
} | |||||
\end{figure} | |||||
\subsection{Funktionalität} | |||||
%--- | |||||
Ein großer Vorteil an der Umsetzung der Teststrecke mit Arduino und ESP liegt darin, dass beide mit der Arduino IDE programmiert werden konnten (siehe Kapitel \ref{sec:Programm}). Dies bedeutet für den Tester eine deutlich komfortablere Nutzung, da kein Wechsel zwischen verschieden Sprachen nötig ist. \\ | |||||
% "Auch konnten so die Rollen von Sender und Empfänger zum Test vertauscht werden." \\ | |||||
% Julian@Kathi Nein können sie nicht. 1. wegen den LEDs 2. hat der Arduino kein Wifi 3. sind die Bibs für den ESP eben für den ESP ausgelegt und es ist nicht sicher ob die am Arduino funktionieren würden | |||||
Um den Stromzähler zu simulieren, soll der Arduino einen Gesamtverbrauch in kWh im SML-Format über eine serielle IR-Schnittstelle senden. Den Gesamtverbrauch kann der Bediener dabei selbst bestimmen. Um den Stromzähler korrekt abzubilden wird der kWh-Wert in mWh umgerechnet, bevor er verschickt wird. \\ | |||||
Die Verwendung der Teststrecke wird unter \ref{anleitung_teststrecke} erklärt, das dazugehörige Programm ist im Anhang \ref{sec:software_reader} zu finden. \\ | |||||
\FloatBarrier | |||||
\chapter{Anleitung} \label{anleitung} | |||||
%--- | |||||
% Julian ~ 4-5 Seiten | |||||
Damit diese Projektarbeit von Grund auf nachgestellt werden kann, wird im Folgenden Schritt für Schritt erklärt, wie man das entwickelte System nachbauen und notwendige Anpassungen vornehmen kann. | |||||
\section{Raspberry Pi} | |||||
Bevor der Stromzähler ausgelesen und der Empfänger in Betrieb genommen werden kann, muss die MQTT-Konfiguration und die Datenbank auf dem Raspberry Pi vorhanden sein. Alle dazu nötigen Schritte werden in den nächsten Unterkapiteln ausführlich erläutert. | |||||
\subsection{Betriebssystem} | |||||
%--- | |||||
Für Testzwecke wurde ein Raspberry Pi von Grund auf neu eingerichtet, um den bereits vorhanden Raspberry Pi möglichst genau abzubilden. Dies fängt beim Betriebssystem an, welches auf einer SD-Karte installiert wird. Diese Karte sollte genügend Speicherplatz für das Betriebssystem, die Programme und die Datenbank haben. Oft wird eine Speicherkarte mit 16GB verwendet, was für die meisten Anwendungsfälle ausreicht. \\ | |||||
Als Betriebssystem wurde \emph{Raspberry Pi OS} \cite{Raspberry} % https://www.raspberrypi.org/software/ Raspberry | |||||
verwendet, welches auf die SD Karte geflasht werden muss. Dafür Prozess wurde das Programm \emph{Etcher} \cite{Flash.Flawless.} % https://www.balena.io/etcher/ balena | |||||
verwendet, Raspberry Pi bietet jedoch auch einen eigenen Imager an. \\ | |||||
Sobald das Betriebssystem auf die SD-Karte kopiert ist kann diese in den Raspberry Pi gesteckt werden. Nach dem ersten Start erfolgt die Installation. \\ | |||||
Nach der ersten Anmeldung wird empfohlen, die installierten Packages zu updaten. | |||||
Dafür öffnet man auf dem Raspberry Pi ein Terminal geöffnet und folgende Befehle eingegeben werden: | |||||
\begin{verbatim} | |||||
sudo apt-get update | |||||
sudo apt-get upgrade | |||||
\end{verbatim} | |||||
Danach empfiehlt es sich, den Raspberry Pi neu zu starten. | |||||
\begin{verbatim} | |||||
sudo reboot | |||||
\end{verbatim} | |||||
\subsection{Fernzugriff} | |||||
%--- | |||||
Da ein Raspberry Pi oft remote verwendet wird müssen zuerst sowohl eine Möglichkeit für Fernzugriff und eine statische IP eingerichtet werden. Für den Fernzugriff im gleichen Netz bieten sich SSH oder Remotedesktop an. SSH (=Secure Shell) bietet die Möglichkeit, sich mit einem geeigneten Programm wie z.B. putty \cite{DownloadPuTTY} % https://www.putty.org/ DownloadPuTTY | |||||
per Konsole zu verbinden. Wer eine grafische Oberfläche möchte sollte Remotedesktop (meist mit RDP abgekürzt) oder ähnliche Lösungen wie z.B. VNC verwenden, wobei mit VNC sogar eine Verbindung möglich ist, wenn man sich nicht im gleichen Netz befindet (die Einrichtung dafür ist aber entsprechend umfangreicher). Hier wird nur die Einrichtung von SSH erklärt, es gibt jedoch im Netz weitreichende Erklärungen für weitere Zugriffsmöglichkeiten wie RDP oder VNC.\\ | |||||
Da SSH aus Sicherheitsgründen nicht mehr standardmäßig aktiviert ist, muss dies nun nachgeholt werden. Dazu gibt man im Terminal ein: | |||||
\begin{verbatim} | |||||
sudo raspi-config | |||||
\end{verbatim} | |||||
In dem sich nun öffnenden Menü muss nun SSH ausgewählt und aktiviert werden. | |||||
Dieser Schritt kann auch umgangen werden, indem die SD-Karte mit dem Betriebssystem vor dem ersten Start in einen Card-Reader gesteckt und im \glqq boot\grqq-Verzeichnis eine leere Datei mit dem Namen \glqq ssh\grqq{} (ohne Dateiendung) hinterlegt wird. Dies aktiviert automatisch die Möglichkeit des Zugriffs per SSH. \cite{RaspberryPutty} \\ | |||||
% https://tutorials-raspberrypi.de/raspberry-pi-ssh-windows-zugriff-putty/ RaspberryPutty | |||||
Sobald SSH aktiviert ist kann man sich z.B. mit putty auf den Raspberry Pi verbinden. \\ \\ | |||||
Als nächstes sollte man eine statische IP vergeben, da standardmäßig DHCP aktiviert ist und sich somit die IP bei jedem Start ändern kann. | |||||
Auch hierfür gibt es wieder mehrere Methoden, in diesem Fall wird die IPv4-Konfiguration in der Datei \grqq /etc/network/interfaces\grqq{} angepasst. Dafür muss man die Datei zuerst öffnen | |||||
\begin{verbatim} | |||||
sudo nano /etc/network/interfaces | |||||
\end{verbatim} | |||||
und dort nun die statische IP für das verwendete Interface (Ethernet oder WLAN) sowie die IP des Gateways und des DNS-Servers eingegeben. | |||||
Eine Beispielkonfiguration für eine statische IP des Ethernet-Interfaces eth0 mit der IP-Adresse 192.168.178.100 und dem Router (welcher Gateway und DNS-Server ist) mit der IP 192.168.178.1 könnte wie folgt aussehen: | |||||
\begin{verbatim} | |||||
# Ethernet | |||||
auto eth0 | |||||
allow-hotplug eth0 | |||||
iface eth0 inet static | |||||
address 192.168.178.100 | |||||
netmask 255.255.255.0 | |||||
gateway 192.168.178.1 | |||||
dns-nameservers 192.168.178.1 | |||||
\end{verbatim} | |||||
\subsection{Datenbank} | |||||
%--- | |||||
\subsubsection{Installation MariaDB} | |||||
Als Datenbank wird MariaDB verwendet, also wird der Datenbank-Server dafür zuerst installiert. | |||||
\begin{verbatim} | |||||
sudo apt install mariadb-server | |||||
\end{verbatim} | |||||
Es wird empfohlen, zur Konfiguration der Sicherheitseinstellungen danach folgenden Befehl auszuführen: | |||||
\begin{verbatim} | |||||
sudo mysql_secure_installation | |||||
\end{verbatim} | |||||
Die daraufhin erscheinende Abfrage kann mit \grqq Enter\grqq{} übersprungen werden. Alle folgenden Abfragen sollten mit ja bzw. \grqq y\grqq{} beantwortet werden. Damit erhöht sich die Sicherheit der MySQL Installation deutlich. \\ \\ | |||||
Der Login in die Datenbank erfolgt mit | |||||
\begin{verbatim} | |||||
mysql -u root -p | |||||
\end{verbatim} | |||||
wobei nach \grqq -u\grqq{} der Benutzer angegeben wird, mit dem sich an der Datenbank angemeldet werden soll und nach der Abfrage noch das Passwort des jeweiligen Benutzers eingegeben werden muss. | |||||
\subsubsection{Passwort für Datenbanklogin zurücksetzen} \label{DB_PW_reset} | |||||
Gelegentlich kann es passieren, dass das Passwort für einen Datenbankbenutzer vergessen wird. In diesem Fall kann das entsprechende Passwort einfach zurückgesetzt werden, was im folgenden beispielhaft für den Datenbankbenutzer \grqq root\grqq{} geschehen soll, dem das neue Passwort \grqq unforgettablePassword\grqq{} zugewiesen wird: | |||||
\begin{verbatim} | |||||
sudo mysqladmin --user=root password "unforgettablePassword" | |||||
\end{verbatim} | |||||
\subsubsection{Tabellen für Messwerte anlegen} | |||||
In Anlehnung an die vorangehende Projektarbeit einer andere Projektgruppe, welche bereits einen Gaszähler angebunden hat, wird die Tabelle für die Messwerte des Stromzählers ähnlich aufgebaut. | |||||
Um die Datenbank \grqq Stromzaehler\grqq{} und die darin enthaltene Tabelle \grqq Messwert\grqq{} anzulegen müssen folgende drei Befehle ausgeführt werden: | |||||
\begin{verbatim} | |||||
create Database Stromzaehler; | |||||
use Stromzaehler; | |||||
create table Messwert | |||||
(MwNr int auto_increment primary key, wert float, zeit timestamp); | |||||
\end{verbatim} | |||||
\subsection{MQTT} | |||||
%--- | |||||
um MQTT zu nutzen wird das Paket \emph {mosquitto} installiert. | |||||
\begin{verbatim} | |||||
sudo apt install mosquitto | |||||
\end{verbatim} | |||||
Dies installiert die MQTT-Broker Funktionalität. Zum Testen kann es aber sinnvoll sein, auch Topics zu abonnieren oder Nachrichten in Topics veröffentlichen zu können, was Teil des Client-Packages ist, welches mit folgendem Befehl installiert werden kann: | |||||
\begin{verbatim} | |||||
sudo apt install mosquitto-clients | |||||
\end{verbatim} | |||||
Die damit installierten Befehle zum Testen lauten: | |||||
% Eigentlich wollte ich im Fließtext schreiben \emph{mosquitto_sub} und ..._pub}, aber dann hat Latex nicht mehr kompiliert #RIP | |||||
\begin{verbatim} | |||||
mosquitto_sub // Zum Abonnieren von Topics | |||||
mosquitto_pub // Zum Veröffentlichen von Nachrichten in Topics | |||||
\end{verbatim} | |||||
Mosquitto wird automatisch beim Hochfahren gestartet, diesbezüglich ist hier nichts weiter zu tun. Gegebenenfalls kann noch der MQTT-Port geändert werden, dies ist aber in den meisten Fällen nicht notwendig und es wird der Standard-Port 1883 verwendet. \\ | |||||
Zu MQTT sei schlussendlich noch angemerkt, dass das Programm mosquitto auch für Windows verfügbar ist es sich anbietet, zum Testen ein weiteres Gerät wie z.B. einen Laptop zu verwenden. | |||||
\subsection{Node-Red} | |||||
Sobald die Datenbank und MQTT eingerichtet sind kann als nächstes NodeRed installiert werden. Die Installation gestaltet sich sehr einfach, da die Entwickler auf ihrer Webseite speziell für den Raspberry Pi einen Befehl vorbereitet haben, womit alle notwendigen Packages, Abhängigkeiten und Basiskonfigurationen für den Dienst von NodeRed erledigt werden: \cite{Running} | |||||
% https://nodered.org/docs/getting-started/raspberrypi Running | |||||
\begin{verbatim} | |||||
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/ | |||||
master/deb/update-nodejs-and-nodered) | |||||
\end{verbatim} | |||||
Nach der Installation sollte man noch in der Systemkonfiguration des Raspberry Pi hinterlegen, dass der Dienst beim Hochfahren automatisch gestartet wird. | |||||
\begin{verbatim} | |||||
sudo systemctl enable nodered.service | |||||
\end{verbatim} | |||||
Der Zugriff auf NodeRed erfolgt über ein Webportal, welches im Browser mit der IP des Hosts (Raspberry Pi) und dem Standard-Port 1890 aufgerufen werden kann. | |||||
Das Testsystem hatte die IP \emph{192.168.0.12}, entsprechend musste im Browser eingegeben werden: | |||||
\begin{verbatim} | |||||
192.168.0.12:1890 | |||||
\end{verbatim} | |||||
Der nächste Schritt wäre nun die Erstellung von neuen Flows. Es können allerdings auch bereits vorhandene Flows importiert werden, so wie es bei diesem Projekt der Fall sein wird. Einen existierenden Flow kann man ganz einfach als JSON exportieren und danach auf einem anderen Gerät wieder importieren \cite{ImportingandExportingFlows}. \\ | |||||
% https://nodered.org/docs/user-guide/editor/workspace/import-export Importing | |||||
Der erstellte Flow für diese Projektarbeit (vgl. \ref{NodeRed_DB}) muss für die Inbetriebnahme auf dem bereits existierenden Raspberry Pi allerdings noch an einigen Stellen angepasst werden. \\ | |||||
Um die IP des MQTT-Brokers zu ändern, muss auf einen MQTT-node geklickt werden (z.B. auf \grqq smartmeter\grqq), dann auf den Stift neben \grqq Server\grqq{} und dann die IP (und falls abweichend vom Standard, auch der Port) bearbeitet werden. Bei bereits existierenden MQTT-Brokern kann im Dropdown-Menü auch einer der bereits vorhandenen Einträge ausgewählt werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/nodered_changeMQTTbroker.png} | |||||
\caption{Anpassung der IP des MQTT-Brokers in NodeRed} | |||||
\label{fig:nodered_change_MQTT_broker} | |||||
} | |||||
\end{figure} \\ | |||||
Außerdem muss die korrekte Datenbank angegeben werden. Dafür muss einer der MariaDB-nodes angeklickt werden, dann neben \grqq Database\grqq{} auf den Stift und dann in der Eingabemaske die korrekten Werte angeben. Wenn dieser Anleitung gefolgt wurde lautet der Datenbankname \grqq Stromzaehler\grqq{}. Der Host kann auf \grqq localhost\grqq{} bleiben, sofern NodeRed und Datenbank auf dem gleichen Gerät laufen. Als Benutzer muss ein gültiger Datenbankbenutzer angegeben werden. Falls das Passwort nicht mehr bekannt ist kann dieses zurückgesetzt werden, wie unter \ref{DB_PW_reset} beschrieben. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/nodered_changeDB.png} | |||||
\caption{Anpassung der Datenbank in NodeRed} | |||||
\label{fig:nodered_change_DB} | |||||
} | |||||
\end{figure}\\ | |||||
\section{ESP8266} | |||||
%--- | |||||
Für die korrekte Verwendung des Empfängers muss lediglich die IP des MQTT-Brokers im Programm hinterlegt sein, alle weiteren Einstellungen können extern getätigt werden. | |||||
Damit die Messwerte an die Datenbank gesendet werden können, benötigt der ESP eine gültige WLAN-Konfiguration. Um nicht auf den nächsten Weckruf durch die RTC warten zu müssen kann der Schalter auf der Unterseite des Gehäuses verwendet werden um die Spannungsversorgung des ESP einzuschalten und auf das Webportal der Wifi-Managers zugreifen zu können (vgl. \ref{wifi_mgr}). \\ | |||||
Ursprünglich war es geplant einen dedizierten Button zum Zurücksetzen der WLAN-Konfiguration zu verwenden, welcher auch verbaut und am ESP angebunden ist. Ein neues WLAN-Netzwerk bedeutet jedoch automatisch dass sich auch die IP des Raspberry Pi geändert hat, wodurch diese neue IP im Programm hinterlegt und der ESP geflasht werden muss. Nach dem Flashen ist keine WLAN-Konfiguration hinterlegt und das neue WLAN-Netzwerk kann wie gewohnt über das Webportal eingestellt werden. Die Funktionalität des Buttons kann nachgerüstet oder der Button für andere Zwecke verwendet werden. \\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.4\textwidth]{img/case_switch_button.jpeg} | |||||
\caption{Schalter und Taster auf der Unterseite des Gehäuses} | |||||
\label{fig:case_switch_button} | |||||
} | |||||
\end{figure}\\ | |||||
\section{Teststrecke} \label{anleitung_teststrecke} | |||||
Zum Testen wird ein Computer mit installierter Arduino IDE oder einem Programm für serielle Kommunikation (z.B. Putty), ein Arduino Uno sowie der ESP und die Lochrasterplatine benötigt, auf welche die beiden Microcontroller nach erfolgter Programmierung aufgesteckt werden. \\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.4\textwidth]{img/shield_gesteckt.jpeg} | |||||
\caption{Shield mit aufgestecktem Arduino und ESP} | |||||
\label{fig:shield_gesteckt} | |||||
} | |||||
\end{figure} | |||||
Als nächstes müssen die beiden Geräte mit dem Computer verbunden werden. Für die Eingabe am Arduino bietet es sich an, den seriellen Monitor der Arduino IDE zu verwenden, da dort auch mehrere Zeichen gesendet werden können, was beispielsweise bei Putty nicht funktioniert hat. Für die Anzeige der empfangenen Daten am ESP reicht Putty jedoch völlig aus. \\ | |||||
Nun kann der zu sendende Wert eingegeben werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\linewidth]{img/teststrecke_send_arduino.png} | |||||
\caption{Eingabefenster des Seriellen Monitors} | |||||
\label{fig:teststrecke_send_arduino} | |||||
} | |||||
\end{figure} | |||||
Diesen Wert wird nun in SML-Kodierung an den ESP gesendet. Auf dem nächsten Bild sind das gesamte SML-Paket (rot)und der darin enthaltene Wert (blau) zu erkennen (vgl. \ref{sec:sml}). Die eingegebenen \SI{1234}{\kilo\watt\hour} wurden vor dem Versenden mit \SI{10000} multipliziert, um die Auflösung des Stromzählers von \SI{100}{\milli\watt\hour} korrekt abzubilden, was binär kodiert \emph{00 00 00 00 BC 4B 20} entspricht. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\linewidth]{img/teststrecke_ESP_output.png} | |||||
\caption{Vom Teststand empfangene Daten aus Sicht des ESP} | |||||
\label{fig:teststrecke_send_arduino} | |||||
} | |||||
\end{figure} | |||||
Die Daten vor bzw. nach dem SML-Teilpaket kommen von den Aufforderungen an den Bediener. Der in \ref{fig:teststrecke_send_arduino} zu sehende Text wird ebenfalls über die serielle Schnittstelle gesendet, da sowohl die Daten an den ESP als auch die Daten an den Computer über den gleichen TX-Pin des Arduino gesendet werden. \\ | |||||
\FloatBarrier | |||||
% ab hier alles Kathi: | |||||
\chapter{Fazit} | |||||
%--- | |||||
Abschließend lässt sich festhalten, dass die Anforderungen an das Projekt erfüllt wurden. Es wurde ein voll funktionstüchtiger IR-Empfänger für einen Stromzähler entwickelt. Auch eine Anbindung an das bereits vorhandene Smarthome-System ist gelungen. \\ | |||||
Ein großer Vorteil des entwickelten Systems ist, dass für die Umsetzung nur wenige, aber vor allem kostengünstige Bauteile nötig waren. Auch der Umgang damit ist sehr Benutzerfreundlich. Besonders sollte auch hervor gehoben werden, dass das Projekt ganz speziell an die gegebenen Umstände angepasst wurde und damit für den Benutzer personalisiert wurde. \\ | |||||
Ein kleiner Nachteil findet sich, wenn man es wieder in den Kontext des Stromsparens für einzelne Haushalte stellt. Es handelt sich nicht um ein Projekt, das für den Normalverbraucher geeignet ist. Das liegt zum einen an der Personalisierung, aber auch an den nicht unerheblichen technischen Kenntnissen, die zur Nutzung notwendig sind.\\ | |||||
Nun ist mit diesem Projekt wohl nicht unbedingt dazu beigetragen worden, dass in Deutschland weniger Strom verbraucht wird, aber vielleicht konnte damit die Vorarbeit für ein allgemeineres Projekt geliefert werden, welches von vielen Verbrauchern nutzbar ist. Diese deutlich kostengünstigere Lösung könnte dann vielleicht wirklich einen Teil dazu beitragen, dass mehr Menschen ihren Stromverbrauch aufmerksam beobachten und deutlich senken können. | |||||
\part{Anhang} | |||||
\section{Schaltplan} \label{sec:schematic} | |||||
\begin{figure}[!h] \centering{ | |||||
\includegraphics[angle=90,scale=0.7]{schematic.pdf}} | |||||
\end{figure} | |||||
\section{Software Teststand} \label{sec:software_teststand} | |||||
\VerbatimInput[fontsize=\small]{Teststand.ino} | |||||
\section{Software Empfänger} \label{sec:software_reader} | |||||
\VerbatimInput[fontsize=\small]{Smartmeter_Reader.ino} | |||||
\label{sec:bibliography{Literatur}} | |||||
\bibliography{Literatur} | |||||
\part{Danksagung} | |||||
\chapter{Danksagung} | |||||
Für die Betreuung dieser Projektarbeit und die herzliche Unterstützung bei der | |||||
Durchführung möchten wir uns bei Prof. Dr. Klehn und Herrn Wölfling bedanken. | |||||
\end{document} |
\documentclass[a4paper,12pt]{scrreprt} %Dokument Einstellungen: Papierformat, Schriftgröße, Art des Dokuments (scr für Deutsch) | |||||
% ============= Packages ============= | |||||
\usepackage[utf8]{inputenc} %Sonderzeichen, Umlaute | |||||
\usepackage[left= 3cm,right = 2cm, bottom = 4 cm]{geometry} %Anpassung Seitenränder | |||||
\usepackage[onehalfspacing]{setspace} %Zeilenabstand anpassen | |||||
\usepackage[ngerman]{babel} %Sprache z.B. für Worttrennungen | |||||
\usepackage[T1]{fontenc} %Schrift | |||||
\usepackage{amsmath} %Mathe package | |||||
\usepackage{mathpazo} %Schriftart | |||||
\usepackage{graphicx} %Bilder einfügen | |||||
\usepackage{fancyhdr} %Angepasste Kopf- und Fußzeile | |||||
\usepackage{siunitx} %Chillige Einheiten | |||||
\usepackage{placeins} %Bilder daran hindern sonstwo zu landen | |||||
\usepackage{microtype} %Typesetting schöner | |||||
\usepackage[hidelinks]{hyperref} %Klickbare Verweise | |||||
\usepackage{listings} % code highlighting | |||||
%\usepackage{minted} % anderes code highlighting | |||||
% ============= Kopf- und Fußzeile ============= | |||||
\pagestyle{fancy} | |||||
% | |||||
\lhead{\includegraphics[height=24pt]{"TH_Logo.jpeg"}} | |||||
\chead{} | |||||
\rhead{\slshape \leftmark} | |||||
%% | |||||
\lfoot{} | |||||
\cfoot{\thepage} | |||||
\rfoot{} | |||||
%% | |||||
\renewcommand{\headrulewidth}{0.4pt} | |||||
\renewcommand{\footrulewidth}{0pt} | |||||
% ============= Dokument Beschreibung ============= | |||||
\title{Projektarbeit} | |||||
\author{Katharina Steib\thanks{TH Nürnberg} | |||||
\and Simon Kocher\footnotemark[1] | |||||
\and Julian Rico Birner\footnotemark[1]} | |||||
\date{heute} | |||||
% ============= Einstellungen ============= | |||||
\setcounter{tocdepth}{5} %Erweiterung des Inhalstverzeichnisses um eine weiter Ebene | |||||
\setcounter{secnumdepth}{5} %Erweiterug der Kapiteltiefe um eine weitere Ebene | |||||
\bibliographystyle{unsrt} %Zitationsstil | |||||
\sisetup{output-decimal-marker = {,}} % Komma statt . bei \SI{...} | |||||
% ============= Dokumentbeginn ============= | |||||
% ========================================== | |||||
\begin{document} | |||||
\begin{titlepage} % Suppresses displaying the page number on the title page and the subsequent page counts as page 1 | |||||
\newcommand{\HRule}{\rule{\linewidth}{0.5mm}} % Defines a new command for horizontal lines, change thickness here | |||||
\center % Centre everything on the page | |||||
%------------------------------------------------ | |||||
% Headings | |||||
%------------------------------------------------ | |||||
\textsc{\LARGE | |||||
\begin{figure} | |||||
\begin{center} | |||||
\includegraphics[scale=1]{"TH_Logo.jpeg"} | |||||
\end{center} | |||||
\end{figure} | |||||
}\\[0.5cm] % Main heading such as the name of your university/college | |||||
\textsc{\Large Projektarbeit}\\[0.5cm] % Major heading such as course name | |||||
\textsc{\large Elektro- und Informationstechnik}\\[0.5cm] % Minor heading such as course title | |||||
%------------------------------------------------ | |||||
% Title | |||||
%------------------------------------------------ | |||||
\HRule\\[0.4cm] | |||||
{\huge\bfseries Entwicklung eines IR-Empfängers für einen Stromzähler}\\[0.4cm] % Title of your document | |||||
\HRule\\[1.5cm] | |||||
%------------------------------------------------ | |||||
% Author(s) | |||||
%------------------------------------------------ | |||||
\begin{minipage}{0.4\textwidth} | |||||
\begin{flushleft} | |||||
\large | |||||
\textit{Autoren} | |||||
\\ Katharina \textsc{Steib} % Your name | |||||
\\ Simon \textsc{Kocher} %Your friends name | |||||
\\ Julian \textsc{Rico Birner} %Your other friends name | |||||
\end{flushleft} | |||||
\end{minipage} | |||||
~ | |||||
\begin{minipage}{0.4\textwidth} | |||||
\begin{flushright} | |||||
\large | |||||
\textit{Betreuer}\\ | |||||
Bernd \textsc{Klehn} % Supervisor's name | |||||
\end{flushright} | |||||
\end{minipage} | |||||
% If you don't want a supervisor, uncomment the two lines below and comment the code above | |||||
%{\large\textit{Author}}\\ | |||||
%John \textsc{Smith} % Your name | |||||
%------------------------------------------------ | |||||
% Date | |||||
%------------------------------------------------ | |||||
\vfill\vfill\vfill % Position the date 3/4 down the remaining page | |||||
{\large\today} % Date, change the \today to a set date if you want to be precise | |||||
%------------------------------------------------ | |||||
% Logo | |||||
%------------------------------------------------ | |||||
%\vfill\vfill | |||||
%\includegraphics[width=0.2\textwidth]{placeholder.jpg}\\[1cm] % Include a department/university logo - this will require the graphicx package | |||||
%---------------------------------------------------------------------------------------- | |||||
\vfill % Push the date up 1/4 of the remaining page | |||||
\begin{center} | |||||
steibka77404@th-nuernberg.de (3264785) | |||||
\\ kochersi74936@th-nuernberg.de(3254887) | |||||
\\ ricobirnerju74691@th-nuernberg.de(3273163) | |||||
\end{center} | |||||
\end{titlepage} | |||||
%\maketitle %Erstellt Titelseite | |||||
\tableofcontents % Erstellt Inhaltsverzeichnis | |||||
\part{Hauptteil} | |||||
\chapter{Einleitung} | |||||
%++- | |||||
% Kathi 1,5 Seiten | |||||
Durch die Corona-Pandemie ist der Stromverbrauch in Deutschland im Jahr 2020 um rund 4,4 Prozent im Vergleich | |||||
zum Vorjahr gesunken, was einer Einsparung von 25 TWh entspricht. Dieses Phänomen lässt sich besonders auf den | |||||
Lockdown-bedingten Konjunktureinbruch zurück führen. Trotz des Rückgangs ist aber noch viel Luft nach oben. | |||||
Laut dem Stromspiegel 2019 verschwendeten die privaten Haushalte in Deutschland Strom im Wert von 9 Mrd. Euro.\\ | |||||
Viele Deutsche wissen gar nicht wie hoch ihr Stromverbrauch eigentlich ist und ob dieser über oder | |||||
unterdurchschnittlich ist. Zum Vergleich kann der durchschnittliche Stromverbrauch einer Familie von | |||||
4250 kWh / Jahr heran gezogen werden. Den eigenen Stromverbrauch zu ermitteln und im besten Fall auch entsprechend | |||||
zu regulieren ist schon schwieriger. Zwar findet man im Internet zahlreiche Seiten die anhand verschiedener Angaben | |||||
den Verbrauch abschätzen, jedoch handelt es sich dabei lediglich um eine grobe Näherung.\\ \\ | |||||
Im Zuger der Digitalisierung verfügen immer mehr Haushalte über ein Smart Home System. Dabei handelt es sich | |||||
eigentlich um einen Überbegriff der verschiedene Verfahren vereint, die mit automatisierbaren Abläufen das Leben | |||||
in Bezug auf den Wohnraum vereinfachen sollen. Bekannte Beispiele sind das Regeln der Heizung auch von Unterwegs, | |||||
das an und ausschalten verschiedener Geräte oder Lampen ohne zum Schalter gehen zu müssen oder auch das Öffnen | |||||
und Schließen von Fenstern und Rollläden. Dabei können die Geräte sowohl über eine Programmierschnittstelle zu | |||||
bestimmten Zeiten und/oder Bedingungen geschaltet werden als auch bequem per App vom Smartphone. | |||||
Das Zuhause wird also sowohl intelligenter als auch bequemer für seine Bewohner.\\ | |||||
Ein solches Smart Home System eignet sich auch zur genauen Stromerfassung und Regulierung besonders gut. | |||||
Der Verbraucher kann nicht nur genaue Daten ablesen sondern auch gezielt daran arbeiten seinen Stromverbrauch mit | |||||
speziell auf ihn angepassten Einstellungen zu minimieren. | |||||
Leider ist die Installation eines solchen Systhems oftmals mit einem hohen Aufwand und hohen | |||||
Kosten verbunden, da meist viele bereits vorhandene Teile ausgetauscht werden müssen. Auch die Kosten für die | |||||
Installation und Einrichtung sind nicht unerheblich.\\ \\ | |||||
In diesem Projekt wurde an einer möglichst Benutzerfreundlichen, kostengünstigen und einfachen Lösung gearbeitet | |||||
mit der man ein Stromzähler zu Hause selbst visualisieren kann. Dabei ist hervor zu heben, dass das Entwickelte | |||||
Gerät an den bereits vorhandenen Stromzähler ergänzt wird und somit kein Austausch von Geräten nötig ist.\\ | |||||
Der folgende Bericht wurde zur besseren Übersicht in zwei Teile unterteilt. | |||||
Im ersten Teil werden die Technischen Hintergründe und Funktionen erläutert. | |||||
Der zweite Teil soll hierbei als eine Art Benutzerhandbuch zur Anleitung dienen.\\ | |||||
\chapter{Konzept} | |||||
%+-- | |||||
% Simon ~1,5 Seiten | |||||
Im Folgenden wird zunächst auf die Aufgabenstellung eingegangen und anschließend ein Lösungsansatz schematisch erläutert. | |||||
\section{Soll-Ist-Analyse} | |||||
%+-- | |||||
Gegeben ist ein Stromzähler des Typen \glqq eHZ Generation K\grqq{} der Firma EMH metering GmbH \& Co. KG [x]. | |||||
% https://emh-metering.com/produkte/haushaltszaehler-smart-meter/ehz-k/ | |||||
Der Zähler verfügt über mehrere Infrarotschnittstellen zur Datenübertragung [x]. | |||||
% https://emh-metering.com/wp-content/uploads/2021/08/eHZ-K-DAB-D-1.10.pdf | |||||
Es soll ein Empfänger für die Zählerstände, die über diese Schnittstellen übertragen werden entwickelt | |||||
werden. Der Empfänger soll in sinnvollen Intervallen (z.B. zweimal pro Tag) den Zählerstand ermitteln | |||||
und an einen bestehenden Smart-Home-Controller in Form eines Raspberry Pi übermitteln.\\ | |||||
Der bestehende Controller zeigt bereits vorhandene Daten aus anderer Quelle in einem Dashboard auf | |||||
Basis von Node-RED [x] | |||||
% https://nodered.org/ | |||||
an. Die Zäherstände sollen ebenfalls in Node-RED angezeigt werden.\\ | |||||
Um eine möglichst einfache Installation des Empfängers zu ermöglichen, soll der Empfänger sowohl | |||||
im Hinblick auf die Datenübertragung als auch die Energieversorgung vollständig drahtlos funktionieren.\\ | |||||
Weiterhin soll ein Teststand entwickelt werden, mit dem der Empfänger ohne den Stromzähler auf | |||||
Funktion getestet werden kann. | |||||
\section{Lösungskonzept} | |||||
%+-- | |||||
% Konzept von Simon | |||||
% => Blockschaltbild | |||||
% - Nen Microcontroller+wifi | |||||
% - Iwie Versorgung | |||||
% - iwie Einlesen | |||||
% - Empfangen an Raspi | |||||
% - | |||||
Um eine drahtlose Energieversorgung des Empfängers zu ermöglichen, wird der Empfängeraufbau mit | |||||
einem Akku betrieben. Für den Akku müssen sowohl eine Ladevorrichtung als auch der Akkutechnologie entsprechende | |||||
Schutzschaltungen vorgesehen werden. Der Datenempfang und die Weitergabe an den | |||||
Smart-Home-Controller wird durch einen Microcontroller realisiert. Um auch für die | |||||
Datenübermittlung an den Controller kabellos zu bleiben, wird ein Microcontroller mit | |||||
WiFi-Schnittstelle benötigt. Der Datentransfer zum Smart-Home-Controller kann dabei über das | |||||
MQTT-Protokoll [x] | |||||
% https://mqtt.org/ | |||||
realisiert werden. Für den Empfang der Stromzählerstände muss ein Infrarotempfänger, der kompatibel | |||||
zur IR-Schnittstelle des Zählers ist, entwickelt werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=\linewidth]{img/konzept_bsb.PNG} | |||||
\caption{Schematische Darstellung des Lösungskonzepts.} | |||||
\label{fig:concept_bsb} | |||||
} | |||||
\end{figure} | |||||
Für den Teststand muss ein Infrarotsender entwickelt werden, der die IR-Schnittstelle des Stromzählers | |||||
nachahmt und konfigurierbare Werte als Zählerstand versendet. Hier bietet sich ebenfalls eine Lösung | |||||
mit einem Microcontroller an. | |||||
\FloatBarrier | |||||
\chapter{Implementierung} | |||||
%--- | |||||
% Simon und Julian | |||||
\section{Stromzähler} | |||||
%--- | |||||
% Julian ~ 2 Seiten | |||||
\subsection{Infrarotschnittstellen} | |||||
%+-- | |||||
% @Julian: war glaube ich dir zugeteilt, ich hab mich beim Zähler mal auf das Modell aus | |||||
% https://emh-metering.com/wp-content/uploads/2021/08/eHZ-K-DAB-D-1.10.pdf (Datasheet) | |||||
% bezogen, wär cool wenn du hier kurz erwähnen könntest dass es sowohl die Datenschnittstelle | |||||
% als auch so eine x Impulse/kWh IR-Schnittstelle gibt. | |||||
Wie bereits erwähnt verfügt der Stromzähler über mehrere Infrarotschnittstellen. Dabei ist zwischen der Prüf-LED und den beiden optischen Datenschnittstellen zu unterscheiden. Über die Prüf-LED sendet der Stromzähler 10.000 Impulse pro kWh, vorausgesetzt es wird ein Strom oberhalb der Anlaufschwelle gemessen. Diese Schnittstelle dient jedoch, wie der Name bereits vermuten lässt, primär zur Funktionsprüfung des Zählers. Die beiden Datenschnittstellen hingegen können dazu verwendet werden, umfangreichere Daten auszulesen.\\ Auf der Rückseite des Zählers befindet sich eine bidirektionale Datenschnittstelle, worüber neben dem Auslesen von Zählstanden auch das Setzen und Lesen von Zählerparametern, Fernabfragung oder Prüfung des Zählers möglich ist. Diese Schnittstelle ist jedoch hauptsächlich für den Netzbetreiber gedacht und aus diesem Grund auch mit einer Betriebsplombe versehen. Für den Endkunden zugänglich ist die unidirektionale INFO-Schnittstelle auf der Vorderseite, worüber der gleiche Datensatz empfangen werden kann, aber keine aktive Kommunikation mit dem Messgerät möglich ist [x]. | |||||
% https://emh-metering.com/wp-content/uploads/2020/08/eHZ-K-BIA-D-1-20.pdf (User manual) | |||||
<<<<<<< HEAD | |||||
\subsection{SML - Smart Message Language} \label{SML spec} | |||||
%--- | |||||
======= | |||||
\subsection{SML - Smart Message Language} | |||||
%+-- | |||||
>>>>>>> c6f7d789a87a74dba7d203e8761e1ebbce0fa422 | |||||
Über beide Datenschnittstellen wird alle paar Sekunden ein Datensatz verschickt, wobei hier zwischen einem reduzierten und einem vollständigen Datensatz gewechselt wird. Beide Datensätze verwenden SML (=Smart Message Language) [x] | |||||
% https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR03109/TR-03109-1_Anlage_Feinspezifikation_Drahtgebundene_LMN-Schnittstelle_Teilb.pdf?__blob=publicationFile | |||||
als Kommunikationsprotokoll mit einer Baudrate von 9600 Baud und einer maximalen Übertragungszeit von 400ms [x]. | |||||
% Gleiche Quelle wie in vorheriger Subsection: user manual eHZ Gen K | |||||
Die dabei übertragenen Werte werden über das OBIS-Kennzahlen-System [x] kodiert. Der für das Projekt relevante Gesamtverbrauch hat dabei die Kennzahl 1.8.0. | |||||
% https://www.bundesnetzagentur.de/DE/Beschlusskammern/BK06/BK6_81_GPKE_GeLi/Mitteilung_Nr_37/Anlagen/OBIS-Kennzahlensystem%202.2a.pdf?__blob=publicationFile&v=2 | |||||
\section{IR Übertragungsstrecke} | |||||
%+-- | |||||
% Simon ~ 1,5 Seiten | |||||
Die Impulsschnittstelle des Stromzählers würde sich grundsätzlich zum Aufzeichnen der Zählerstände eignen, | |||||
vorausgesetzt der Zählerstand zu Aufzeichnungsbeginn ist bekannt. Ein großer Vorteil dieser Schnittstelle | |||||
ist ihre extrem simple Natur: per GPIO-Interrupt eines Microcontrollers oder sogar per diskretem Zähler-IC | |||||
ist der Datenempfang sehr einfach realisierbar. Dagegen muss bei der IR-Datenschnittstelle sowohl | |||||
das Übertragungsprotokoll als auch die Datencodierung, die der Zähler verwendet, unterstützt werden.\\ | |||||
Gegen die Impulsschnittstelle sprechen allerdings einige Nachteile. Da die diese lediglich | |||||
eine fixe Anzahl an Impulsen pro verbrauchter Kilowattstunde sendet, werden hier nur Verbrauchsdeltas und | |||||
nie der absolute Wert übermittelt. Folglich wird zur Feststellung eines tatsächlichen Zählerstandes | |||||
in Kilowattstunden der Zählerstand zu Aufzeichnungsbeginn benötigt. Außerdem führt ein temporärer Ausfall | |||||
der Empfängerschaltung, bei dem Impulse nicht aufgezeichnet werden, zur Messung falscher Zählerstände.\\ | |||||
Ein weiterer Nachteil der Impulsschnittstelle ist dass zumindest ein Teil der Empfängerschaltung dauerhaft in Betrieb sein | |||||
muss um jeden Infrarotimpuls aufzunehmen. Gerade bei einem Microcontroller ist hier von einem relativ | |||||
hohen Energieverbrauch auszugehen bei dem ein Großteil der Energie verschwendet wird.\\ | |||||
Auf der Datenschnittstelle wird in regelmäßigen Intervallen der absolute Zählerstand übermittelt, damit | |||||
entfallen beide Nachteile der Impulsschnittstelle. Daher wurde sich für dieses Projekt für den Empfang | |||||
an der Datenschnittstelle entschieden. \\ | |||||
Die Datenschnittstelle überträgt hier die Zählerstände mittels des sogenannten D0-Protokolls [x] | |||||
% https://www.mikrocontroller.net/attachment/89888/Q3Dx_D0_Spezifikation_v11.pdf | |||||
nach DIN EN 62056‐21. Die Beschreibung des Protokolls lässt bereits eine Ähnlichkeit mit RS232 | |||||
vermuten, experimentell konnte bestätigt werden, dass die D0-Daten mittels der RS232-Peripherie eines | |||||
ESP8266 Microcontroller empfangen werden können. Dabei muss lediglich der RX-Pin der RS232-Schnittstelle | |||||
des Controllers an eine geeignete Empfangsschaltung angeschlossen werden.\\ | |||||
Bei einem Test mit einem Stromzähler des Herstellers \glqq Landis+Gyr\grqq{} konnte allerdings | |||||
festgestellt werden, dass die Datenformatangabe aus [x, gleiches wie vorher], d.h. | |||||
1 Startbit, 7 Datenbits, 1 Paritätsbit und ein Stoppbit, von diesem Zähler nicht eingehalten wird, | |||||
stattdessen wird von diesem Zähler 1 Startbit, 8 Datenbits und 1 Stoppbit verwendet. | |||||
Laut Herstellerangabe [x] | |||||
% https://www.landisgyr.de/webfoo/wp-content/uploads/2018/08/D000063497-E220-AMxD-Benutzerhandbuch-de-f.pdf | |||||
handelt es sich bei dieser Schnittstelle ebenfalls um eine Datenschnittstelle gem. DIN EN 62056‐21. | |||||
Bei der Einstellung der RS232-Peripherie kann es also zu zählerabhängigen Unterschieden kommen.\\ | |||||
Um einen Empfang der Zählerstände zu ermöglichen, müssen die Infrarotsignale des Zählers zunächst | |||||
in digitale elektrische Signale gewandelt werden. Für die Wandlung von Infrarotsignalen zu | |||||
elektrischen Signalen wurde eine Photodiode vom Typ SFH 213 FA [x] gewählt. Laut Datenblatt | |||||
% https://cdn-reichelt.de/documents/datenblatt/A501/SFH213FA_ENG_TDS.pdf | |||||
fließt bei einer Sperrspannung von $V_R=\SI{20}{\volt}$ ein Dunkelstrom $I_R \leq \SI{5}{\nano\ampere}$. | |||||
Bei $V_R=\SI{5}{\volt}$ und bei einer Strahlungsleistung von \SI{1}{\milli\watt\per\centi\metre\squared} | |||||
ist ein Photostrom $I_P \geq \SI{65}{\micro\ampere}$ zu erwarten. Bei Anwendung der Photodiode | |||||
in der Empfängerschaltung sind diese Rahmenparameter, sowohl die \SI{20}{\volt} Sperrspannung als | |||||
auch die genaue Strahlungsleistung nicht identisch mit den Vorgaben aus dem Datenblatt. Allerdings | |||||
können der Dunkelstrom $I_R \approx \SI{5}{\nano\ampere}$ und der Photostrom $I_P\approx\SI{65}{\micro\ampere}$ | |||||
als grobe Vorgaben zur Dimensionierung der Empfängerschaltung verwendet werden.\\ | |||||
Um die Stromsignale der Photodiode zu verstärken, bietet sich ein einfacher NPN-Transistor an, gewählt wurde | |||||
der BC548B. Mit der Beschaltung aus Abb. \ref{fig:ir_recv_a} und $200 \leq h_{FE} \leq 450$ | |||||
[x], | |||||
% https://cdn-reichelt.de/documents/datenblatt/A100/BC546_48-CDIL.pdf | |||||
ergibt sich ohne IR-Bestrahlung am Ausgang bei $V_{CC} = \SI{3,3}{\volt}$ | |||||
$U_{out} \approx V_{CC} - R_1 \cdot \SI{5}{\nano\ampere} \cdot h_{FE} \approx \SI{3,3}{\volt} \approx V_{CC}$. | |||||
Mit IR-Bestrahlung bei $I_{P}\approx\SI{65}{\micro\ampere}$ ergäbe sich nach der obigen Formel | |||||
eine negative Ausgangsspannung, in der Praxis geht der Transistor in Sättigung und $U_{out} \approx \SI{0}{\volt}$. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.25\textheight]{img/ir_recv_a.PNG} | |||||
\caption{Die Infrarotempfängerschaltung.} | |||||
\label{fig:ir_recv_a} | |||||
} | |||||
\end{figure} | |||||
Anhand der Berechnung lässt sich erkennen, dass die Verstärkerschaltung das Eingangssignal invertiert: | |||||
bei Dunkelheit wird eine digitale 1 erzeugt, bei IR-Belichtung eine digitale 0. Dieses Verhalten | |||||
kann schaltungstechnisch mit einem einfach Inverter, wie in Abb. \ref{fig:ir_recv_b} zu sehen, behoben werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.25\textheight]{img/ir_recv_b.PNG} | |||||
\caption{Die Infrarotempfängerschaltung mit Inverter.} | |||||
\label{fig:ir_recv_b} | |||||
} | |||||
\end{figure} | |||||
Nach Entwicklung der Schaltung konnte experimentell festgestellt werden, dass der getestete Stromzähler | |||||
der Firma Landis+Gyr bereits beim Senden das serielle Signal invertiert, sodass ein Inverter beim Empfänger | |||||
entfällt. Daher wurde die Inverterstufe auf der fertigen Platine durch einen Jumper konfigurierbar | |||||
ausgelegt (s. Abschnitt \ref{sec:schematic}). So kann Anwendungsspezifisch die Schaltung aus Abb. | |||||
\ref{fig:ir_recv_a} oder aus Abb. \ref{fig:ir_recv_b} verwendet werden.\\ | |||||
Das Signal $U_{out}$ der Empfängerschaltung kann direkt mit dem RX-Pin des Microcontrollers verbunden | |||||
werden. | |||||
\FloatBarrier | |||||
\section{Microcontroller} \label{sec:ESP} | |||||
%+-- | |||||
%Julian | |||||
Für das Empfangen und Verarbeiten der Daten wurde als Microcontroller ein D1 mini ausgewählt, welcher auf einem ESP8266 Prozessor basiert. Dieser verfügt über eine integrierte WLAN-Schnittstelle und ausreichend Peripherie, um den Anforderungen gerecht zu werden. Die serielle Schnittstelle des Microcontrollers kann außerdem direkt genutzt werden, um das serielle Signal vom Stromzähler mittels der bereits vorgestellten Empfängerschaltung relativ einfach einzulesen. Außerdem ist der Microcontroller mit der Arduino IDE programmierbar, was die Vorteile einer einfachen Programmierung und der gleichzeitig großen Vielfalt an Bibliotheken und Erweiterungen für diese Plattform kombiniert. Trotz seiner geringen Größe und dem vernachlässigbaren Gewicht verfügt das Board dennoch über ausreichend RAM und Flash-Speicher, eine Taktgeschwindigkeit von 80 bzw. 160 Mhz und einer $I^2C$-Schnittstelle zur Kommunikation mit der RTC, womit alle Anforderungen erfüllt sind und er sich perfekt zur Umsetztung des Projekts eignet[x]. | |||||
% https://www.wemos.cc/en/latest/d1/d1_mini.html | |||||
\begin{figure}[!h] | |||||
\centering | |||||
\includegraphics[height=0.25\textheight]{img/d1_top.jpg} | |||||
\caption{ESP 8266 D1 Mini.} | |||||
\label{fig:d1_mini_top} | |||||
\end{figure} | |||||
% TODO Bild auf gleiche Seite wie Text | |||||
\FloatBarrier | |||||
\section{Energieverbrauch} | |||||
%+-- | |||||
% Simon ~ 3-4 Seiten | |||||
Da das Infrarotempfängerkonzept eine vollständig kabellose Anbindung des Empfängeraufbaus vorsieht, | |||||
ist die Energieversorgung über einen Akku notwendig. Als Akku wurde ein Lithium-Ionen Akku im 18650 | |||||
Formfaktor gewählt. Für das Akkumanagement, d.h. Laden des Akkus und Unterspannungsschutz, wird | |||||
ein fertiges BMS-Board verwendet. Das gewählte BMS-Board ist unter der Bezeichnung | |||||
\glqq Wemos 18650 battery shield V3\grqq{} auf diversen Onlinemarktplätzen zu finden.\\ | |||||
Das Board wird mit einer 18650 Lithium-Ionen-Zelle bestückt und liefert \SI{3}{\volt} und | |||||
\SI{5}{\volt} Ausgangsspannung, die bei Unterspannung der Akkuzelle automatisch abgeschaltet werden. | |||||
Weiterhin kann der Akku im BMS-Board bequem per Micro-USB aufgeladen werden.\\ | |||||
Damit der Empfänger einen möglichst nützlichen | |||||
Smart Home-Sensor darstellt, muss eine hohe Akkulebensdauer sichergestellt sein, da bei einem Empfänger, | |||||
der sehr häufig aufgeladen werden muss auch das manuelle notieren der Stromzählerstände einen vergleichbaren | |||||
Aufwand verursachen würde.\\ | |||||
Bei einem handelsüblichen 18650 Lithium-Ionen-Akku kann von einer Kapazität in der Größenordnung von | |||||
\SI{2700}{\milli\ampere{}\hour} ausgegangen werden [x]. | |||||
% https://b2b-api.panasonic.eu/file_stream/pids/fileversion/3447 | |||||
Bei einer geschätzten Stromaufnahme der Empfängerschaltung im Dauerbetrieb von ca. | |||||
\SI{150}{\milli\ampere}, ergäbe sich eine Akkulebensdauer von ca. \SI{18}{\hour}, ein völlig | |||||
inakzeptabler Wert. Aus dieser Überschlagsrechnung wird klar, dass die Empfängerschaltung in zwei | |||||
Zuständen, einem Aktivzustand mit großem Energieverbrauch und einem möglichst sparsamen Passivzustand, | |||||
realisiert werden muss. | |||||
\subsection{Abschätzung der Akkulebensdauer} | |||||
%+-- | |||||
\label{sec:lifetime_approx} | |||||
Um eine Realisierung dieser beiden Zustände zu beurteilen, ist ein Modell der Akkulebensdauer | |||||
in Abhängigkeit der Parameter der Zustände (Verweildauer im Zustand und Stromaufnahme) sinnvoll.\\ | |||||
Der Aktivzustand wird charakterisiert durch die Dauer $t_{on}$ mit mittlerem Versorgungsstrom $I_{on}$, | |||||
der in einem Zyklus der Periode $T_{cycle}$ auftritt, der Standby-Zustand wir charakterisiert durch | |||||
den Ruhestrom $I_{off}$.\\ | |||||
Mit Ladung $C=\int{I(\tau)d\tau}$ ergibt sich näherungsweise eine Ladungsaufnahme der Schaltung von | |||||
\begin{equation} | |||||
C_{auf}(t) = I_{on}\cdot\frac{t_{on}}{T_{cycle}}\cdot t + I_{off}\cdot t. | |||||
\end{equation} | |||||
Dabei wurden unter den Annahmen $t \gg T_{cycle}$ und $\frac{t_{on}}{T_{cycle}} \ll 1$ einige Vereinfachungen vorgenommen.\\ | |||||
Modelliert man nun den Akku der Kapazität $C_A$ (z.B. \SI{2800}{\milli\ampere{}\hour}) als simple Ladungsquelle, | |||||
die die Schaltung versorgt, bis $C_A$ \glqq aufgebraucht\grqq{} ist, ergibt sich durch Gleichsetzen von | |||||
$C_{auf}(t)$ und $C_A$ eine geschätzte Lebensdauer | |||||
\begin{equation} | |||||
t_L = \frac{C_A}{I_{on}\cdot t_{on}/T_{cycle}+I_{off}}. | |||||
\end{equation} | |||||
Für einen Ruhestrom von $I_{off}=\SI{2}{\micro\ampere}$, eine Aktivzeit $t_{on}=\SI{30}{\second}$, | |||||
$T_{cycle}=\SI{12}{\hour}$, $C_A=\SI{2800}{\milli\ampere{}\hour}$ und | |||||
einen mittleren Versorgungsstrom $I_{on}=\SI{150}{\milli\ampere}$ ergibt sich beispielsweise aus der Abschätzung | |||||
$t_L=\SI{1099}{\day}$. Wird bei den selben Parametern ein Ruhestrom von $I_{off}=\SI{0,2}{\milli\ampere}$ | |||||
angesetzt, drittelt sich die geschätzte Lebensdauer auf ca. \SI{384}{\day}.\\ | |||||
Es ist fragwürdig, ob in der Praxis tatsächlich eine derartig hohe Lebensdauer erreichbar ist, mitunter, | |||||
da kein realistisches Akkumodell verwendet wurde.\\ | |||||
Allerdings ist die hohe Abschätzung der Lebensdauer eine gute Indikation dafür, dass | |||||
die reale Lebensdauer nicht ausschließlich durch den Energieverbrauch der Schaltung sondern durch Eigenschaften | |||||
des Akkus limitiert wird und somit eine weitere Optimierung des Energieverbrauchs nicht unbedingt zu einem | |||||
signifikanten Anstieg der Akkulebensdauer führen würde. Um die Lebensdauer genauer zu bestimmen, ist allerdings | |||||
eine Echtzeitmessung oder die Verwendung eines präzisen Akkumodells erforderlich. | |||||
\subsection{Schaltungstechnische Realisierung des Standbyzustands} | |||||
%+-- | |||||
Der ESP8266 verfügt Hardwareseitig bereits über einen sogenannten \glqq Deep-sleep\grqq{}-Modus [x]. | |||||
% ESP8266 Low Power Solutions V1.5, Espressif | |||||
% https://www.espressif.com/sites/default/files/documentation/9b-esp8266-low_power_solutions__en.pdf | |||||
In diesem Modus wird der Großteil des Mikrocontrollers deaktiviert und damit der Energieverbrauch | |||||
deutlich gesenkt [x, selbe wie vorher]. Mittels der internen Uhr (RTC) des ESP wird der Microcontroller | |||||
in bestimmten Intervallen wieder \glqq geweckt\grqq{} [x, selbe wie vorher]. | |||||
Durch diesen Mechanismus könnte der zuvor beschriebene Energiesparmodus umgesetzt werden. | |||||
Da für dieses Projekt allerdings der ESP8266 nicht einzeln sondern in Form eines Entwicklungsboards | |||||
mit zusätzlicher Peripherie (z.B. Spannungswandler und USB zu UART Wandler) verwendet wird und | |||||
auch im Arbeitspunkt der IR-Empfängerschaltung ein geringer Strom fließt, würde | |||||
der Deep-sleep-Modus zwar den Energieverbrauch des ESP reduzieren, alle weiteren Komponenten wären | |||||
davon allerdings nicht betroffen. Wie die Lebensdauerabschätzung im vorherigen Abschnitt zeigt, ist | |||||
ein Standbystrom im Microamperebereich wünschenswert, daher ist der Deep-sleep-Modus für diesen Zweck | |||||
nicht ausreichend.\\ | |||||
Eine alternative Lösung, die im Rahmen dieses Projekts gewählt wurde, ist im Standbyzustand die | |||||
Energieversorgung der kompletten Schaltung zu unterbrechen.\\ | |||||
Dafür wird mittels eines p-MOSFET ein high-side Schalter realisiert, der die Versorgungsspannung | |||||
vom BMS-Board zum Empfänger schaltet. Der MOSFET wird angesteuert durch eine externe Echtzeituhr | |||||
(RTC) vom Typ DS3231 [x]. | |||||
% https://datasheets.maximintegrated.com/en/ds/DS3231.pdf | |||||
Die DS3231 liefert via I\textsuperscript{2}C-Schnittstelle nach einmaliger Konfiguration fortlaufend | |||||
das aktuelle Datum und die aktuelle Uhrzeit. Die RTC wird dabei von einer Lithium-Knopfzelle versorgt | |||||
und ist damit in ihrer Funktion unabhängig von einer externen Spannungsversorgung. Die für dieses Projekt | |||||
wichtigste Funktion der DS3231 sind die zwei programmierbaren Alarme der RTC.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=0.5\linewidth]{img/power_schema.PNG} | |||||
\caption{Schematische Darstellung der geschalteten Energieversorgung.} | |||||
\label{fig:power_schema} | |||||
} | |||||
\end{figure} | |||||
Mittels I\textsuperscript{2}C können in den Registern der RTC zwei Alarme dazu programmiert werden, in | |||||
bestimmten Intervallen (minütlich, stündlich, täglich, ...) den $\overline{\mbox{INT}}$-Pin der RTC | |||||
auf Masse zu ziehen [x, selbe wie vorher]. Dabei ist sehr hilfreich, dass die Alarmsignale selbsthaltend sind, | |||||
d.h. wird ein Alarm ausgelöst bleibt $\overline{\mbox{INT}}$ auf Masse gezogen, bis via | |||||
I\textsuperscript{2}C das jeweilige Alarmflag (A1E bzw. A2E) in den RTC-Registern zurückgesetzt wird [x, selbe wie vorher].\\ | |||||
Das Signal eignet sich also direkt zum Schalten der Energieversorgung der Empfängerschaltung. | |||||
Weiterhin handelt es sich bei dem $\overline{\mbox{INT}}$-Pin um einen open-drain Ausgang, d.h. der Pin | |||||
muss mit einem externen Pull-Up-Widerstand beschaltet werden [x, selbe wie vorher], der die high-Spannung des | |||||
Signals vorgibt. Damit bietet sich das Signal zum Steuern des p-MOSFET sehr an, da durch einen | |||||
Pull-Up auf die Sourcespannung des MOSFET der p-MOSFET korrekt durch das Signal geschaltet wird.\\ | |||||
In der praktischen Erprobung der Schaltung hat sich gezeigt, dass teils beim Ausschalten Glitches | |||||
auftreten können, bei denen die Versorgung nicht vollständig ausgeschaltet wird, sondern die Spannung | |||||
am Drain des MOSFET (die nahe \SI{0}{\volt} liegen sollte) bei beispielsweise \SI{1,6}{\volt} hängen | |||||
bleibt und der Ausschaltvorgang somit fehlschlägt. Um ein sicheres Ausschalten zu gewährleisten, | |||||
wurde zwischen das $\overline{\mbox{INT}}$-Signal der RTC mit Pull-Up und den MOSFET ein Spannungspuffer | |||||
geschaltet (realisiert durch zwei nacheinander geschaltete NAND-Gatter aus einem CD4011B IC, | |||||
Schaltung siehe Abschnitt \ref{sec:schematic}).\\ | |||||
Nach dieser Änderung konnten keine Glitches mehr festgestellt werden.\\ | |||||
Als p-MOSFET wurde ein NX2301P gewählt [x]. | |||||
% https://assets.nexperia.com/documents/data-sheet/NX2301P.pdf | |||||
Das wichtigste Auswahlkriterium für den MOSFET war in dieser Funktion ein betragsmäßig ausreichend | |||||
geringes $V_{GS}$ um den MOSFET einzuschalten. Dem Datenblatt lässt sich bei | |||||
$V_{GS}=\SI{-1.8}{\volt}$ ein maximales $R_{DSon}$ von \SI{270}{\milli\ohm} entnehmen. Dieser | |||||
$R_{DSon}$-Wert ist für den Aktivzustand der Schaltung völlig ausreichend - bei einer Stromaufnahme | |||||
von \SI{150}{\milli\ampere} fallen über dem MOSFET maximal \SI{41}{\milli\volt} ab, der Leistungsverlust | |||||
über dem MOSFET liegt im einstelligen Milliwattbereich. Die Gate-Source Spannung | |||||
von \SI{-1.8}{\volt} ist ebenfalls komfortabel erreichbar, bei einer Akkuspannung von \SI{3}{\volt} | |||||
wird ein $V_{GS}$ von knapp \SI{-3}{\volt} im Aktivzustand erreicht. | |||||
\FloatBarrier | |||||
\subsection{Messtechnische Überprüfung des Energieverbrauchs} | |||||
%+-- | |||||
Zur messtechnischen Überprüfung des Energieverbrauchs wurde zunächst das BMS-Board mit \SI{3,7}{\volt} | |||||
versorgt und die Stromaufnahme ohne angeschlossene Last bestimmt. Es konnte ein Wert von ca. | |||||
\SI{0,33}{\milli\ampere} gemessen werden. Wie bereits bei der Abschätzung der Akkulebensdauer festgestellt | |||||
wurde, handelt es sich hierbei um einen relativ hohen Standbyverbrauch. Es ist eine naheliegende Vermutung, | |||||
dass dieser Stromverbrauch ohne Last durch den DC-DC Step-Up Konverter auf dem BMS-Board verursacht wird, | |||||
der die \SI{5}{\volt} Ausgangsspannung des Boards generiert.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.7\linewidth]{img/bms_board.jpg} | |||||
\caption{Die Rückseite des BMS-Boards. Rot markiert der Step-Up Konverter.} | |||||
\label{fig:bms_backside} | |||||
} | |||||
\end{figure} | |||||
Durch Position der Induktivität und Nachschlagen der IC-Nummern konnte U7 (s. Abb. \ref{fig:bms_backside}) | |||||
als Step-Up Konverter des Typs FP6298 identifiziert werden. Durch Entfernen des Step-Up ICs von der Platine | |||||
konnte die Stromaufnahme des BMS-Boards ohne angeschlossene Last auf unter \SI{0,2}{\micro\ampere} | |||||
reduziert werden. Durch diese Modifikation geht selbstverständlich der \SI{5}{\volt} Ausgang des BMS-Boards | |||||
verloren, stattdessen steht maximal die Zellspannung zur Verfügung. Das stellt allerdings kein Problem | |||||
dar, da experimentell festgestellt wurde, dass eine Versorgungsspannung im Bereich von \SI{3}{\volt} | |||||
bis \SI{3,7}{\volt} für den Betrieb der Empfängerschaltung ausreichend ist. Betrachtet man die | |||||
Entladecharakteristik eines typischen 18650 Lithium-Ionen Akkus (s. Abb. \ref{fig:liion_discharge}), | |||||
ist ersichtlich, dass in diesem | |||||
Spannungsbereich der größte Teil der Akkuladung ausgenutzt werden kann.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.7\linewidth]{img/discharge_curve.PNG} | |||||
\caption{Entladekurve eines 18650 Lithium-Ionen Akkus [x].} | |||||
% https://b2b-api.panasonic.eu/file_stream/pids/fileversion/3447 | |||||
\label{fig:liion_discharge} | |||||
} | |||||
\end{figure} | |||||
Anschließend wurde der Energieverbrauch der vollständigen Empfängerschaltung zusammen mit dem | |||||
BMS-Board charakterisiert. Dafür wurden erneut \SI{3,7}{\volt} an den Zellanschlüssen des BMS-Boards | |||||
eingespeist und der Stromfluss am Zellanschluss gemessen.\\ | |||||
Es konnte im Aktivzustand ein mittlerer Stromverbrauch von ca. \SI{150}{\milli\ampere} und im | |||||
Standbyzustand ein Stromverbrauch zwischen \SI{0,3}{\micro\ampere} und \SI{1,5}{\micro\ampere} | |||||
gemessen werden. Mit der Abschätzung aus Abschnitt \ref{sec:lifetime_approx} ergibt sich mit diesen | |||||
Werten bei $t_{on}=\SI{30}{\second}$, $T_{cycle}=\SI{12}{\hour}$ und $C_A=\SI{2800}{\milli\ampere{}\hour}$ | |||||
eine geschätzte Lebensdauer von $t_L\approx\SI{1104}{\day}$. Obwohl die reale Akkulebensdauer | |||||
sicherlich deutlich geringer ausfallen wird, lässt dieser hohe Wert vermuten, dass Verbraucherseitig | |||||
die Voraussetzungen für eine hohe Akkulebensdauer erfüllt sind. | |||||
\FloatBarrier | |||||
\section{Platine} | |||||
%+-- | |||||
% Julian ~ 1-2 Seiten | |||||
Um alle benötigten Komponenten sicher miteinander zu verbinden wurde entschieden eine eigene Platine zu entwerfen. Zwar hätte ein Aufbau auf einer Lochrasterplatine sicherlich auch funktioniert, jedoch wäre dieser bei der Anzahl der Komponenten und deren Größe, wie z.B. dem Microcontroller oder den NAND-Gates, sehr unübersichtlich geworden. Außerdem konnten die verschiedenen Konfigurationsmöglichkeiten so leichter implementiert und beschriftet werden.\\ \\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\linewidth]{img/platine_rendering.png} | |||||
\caption{3D-Rendering der Platine in Altium.} | |||||
\label{fig:pcb_rendering} | |||||
} | |||||
\end{figure} | |||||
Wie bereits im vorherigen Kapitel beschrieben kam es zu Glitches beim Abschalten des pMOSFETs. Um sowohl die Möglichkeit des direkten Abschaltens, als auch die des gepufferten Abschaltens zu haben, wurden Lötbrücken platziert. Somit kann ohne besonders viel Aufwand die Konfiguration geändert werden.\\ \\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\linewidth]{img/pcb_sb1_sb2.png} | |||||
\caption{Lötbrücke 1 und 2 für Abschaltung mit oder ohne Puffer.} | |||||
\label{fig:pcb_sb1_sb2} | |||||
} | |||||
\end{figure} | |||||
Eine weitere Lötbrücke wurde platziert um die RTC im aktiven Zustand aus dem Akku zu speisen. Damit wird vermieden, dass die Knopfzelle zu schnell entleert wird.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.5\textheight]{img/pcb_sb3.png} | |||||
\caption{Lötbrücke 3 für Versorgung der RTC per Akku.} | |||||
\label{fig:pcb_sb3} | |||||
} | |||||
\end{figure} | |||||
Außerdem wurde beim Testen mit einem anderen Stromzähler entdeckt, dass der Stromzähler des Herstellers \glqq Landis+Gyr\grqq bereits ein invertiertes Signal sendet. Da der Stromzähler, an dem der Empfänger letzten Endes betrieben wird, nicht getestet werden konnte, wurden hierfür Jumper eingebaut. Somit kann die Inverterstufe im Empfangspfad leichter aktiviert oder deaktiviert werden.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/pcb_jumper.png} | |||||
\caption{Jumper zum Aktivieren und Deaktivieren der Inverterstufe.} | |||||
\label{fig:pcb_jumper} | |||||
} | |||||
\end{figure} | |||||
%TODO Bildgrößen und Platzierung anpassen | |||||
\FloatBarrier | |||||
\section{Software} | |||||
%--- | |||||
Das komplette Programm sowohl für den Empfänger, als auch für den Teststand, sind im Anhang zu finden. | |||||
% TODO Macht das Sinn? Schickt man sowas einfach nur per Mail mit? Wie machen wir das? | |||||
% Julian ~ 6-8 Seiten | |||||
\subsection{Programmablauf} | |||||
%+-- | |||||
Der ESP wurde mit der Arduino IDE programmiert. Diese ermöglicht den Zugang zu beliebiger Hardware, solange der korrekte Treiber installiert ist und es eine Anbindung an die Arduino IDE gibt. Als Schnittstelle gibt es eine setup()-Funktion, welche einmalig zu Beginn des Programms abgearbeitet wird und eine loop()-Funktion, welche nach dem Setup zyklisch als Endlosschleife abläuft.\\ | |||||
Im Setup werden zunächst einzelne Pins initialisiert, danach wird die serielle Kommunikation gestartet, woraufhin die Verbindung zum WLAN hergestellt wird. Ist dies erfolgreich, versucht der ESP als nächstes sich mit dem MQTT-Broker zu verbinden. Sobald auch das funktioniert hat ist die Initialisierung beendet. Sollte jedoch keine Verbindung zum WLAN oder dem MQTT-Broker hergestellt werden können, wird nach einer bestimmten Zeit das Ausschalten initialisiert. | |||||
\subsection{RTC} | |||||
%+-- | |||||
Die Spannungsversorgung des Microcontrollers wird von der RTC gesteuert. Diese arbeitet mit internen Alarmen und schaltet den INT-Pin (low-aktiv), sobald ein aktiver Alarm abgelaufen ist. Danach bleibt sie aktiv, bis über $I^2C$ der Befehl zum Ausschalten gesendet wird. Dies geschieht, indem der Microcontroller nach Ablauf seines Programms im Control-Register der RTC die Flags für die Alarme zurücksetzt. Sobald das passiert ist, setzt die RTC den INT-Pin zurück und unterbricht damit die Stromversorgung für den ESP. Nach Ablaufen des Alarms beginnt dieser Zyklus von neuem. | |||||
\subsection{WifiManager} | |||||
%+-- | |||||
Kernanforderung des Projekts war die drahtlose Kommunikation zwischen Empfänger und Smart-Home-Controller. Da uns aus ersichtlichen Gründen jedoch zur Projektlaufzeit die Zugangsdaten zum endgültigen WLAN nicht zur Verfügung standen war es nötig, dem Bediener die Möglichkeit zu geben, eine gültige WLAN Konfiguration an den Microcontroller zu übermitteln, ohne ihn dafür jedes Mal neu flashen zu müssen. Diese Funktionalität gibt es bereits in Form einer Bibliothek mit dem Namen WifiManager [x].\\ | |||||
% https://github.com/tzapu/WiFiManager | |||||
Mit Hilfe der Bibliothek startet der Microcontroller im Station-Mode und versucht, sich mit ggf. vorher gespeicherten Zugangsdaten anzumelden. Gelingt dies nicht oder ist noch keine Konfiguration hinterlegt, wechselt der ESP in Access-Point-Mode und startet einen eigenen Webserver. Nun kann sich der Bediener mit jedem beliebigen, WLAN-fähigen Gerät am WLAN des ESP anmelden und wird zu einer Anmeldeseite weitergeleitet, wo nun die WLAN Zugangsdaten eingegeben werden können. Sobald sich der ESP erfolgreich mit dem angegebenen Netzwerk verbunden hat wird der Programmablauf fortgesetzt.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=0.5\textwidth]{img/wifimgr_loginpage.png} | |||||
\caption{Anmeldeseite des WifiManager aus Sicht des Bedieners.} | |||||
\label{fig:wifi_manager} | |||||
} | |||||
\end{figure} | |||||
<<<<<<< HEAD | |||||
Zwar bietet die Bibliothek auch Felder für MQTT-Broker IP und Port an, dies hat jedoch zum Zeitpunkt des Projekts nicht zuverlässig funktioniert und wurde deshalb aus dem Programm entfernt. Sollte die Bibliothek dahingehend verbessert werden würde es Sinn machen, dieses Feature nachzurüsten, um nicht jedes Mal den Microcontroller flashen zu müssen wenn ein anderer MQTT-Broker verwendet wird. Da dem Broker, welcher in diesem Fall ein Raspberry Pi ist, entweder in der internen Konfiguration des Raspberry Pi eine statische bzw. über den Router immer dieselbe IP zugewiesen werden kann und das Gerät nicht für wechselnde Broker gedacht ist, kann auf dieses Feature aber auch verzichtet werden. Ersatzweise ist die IP im Programm hardkodiert. | |||||
\subsection{Einlesen der SML-Daten} | |||||
%--- | |||||
Hauptauftrag der Software ist das erfolgreiche Einlesen und Verarbeiten der eingehenden Daten. Da die serielle Schnittstelle des ESP genutzt wird kann dafür auch die Standardbibliothek von Arduino zum Einlesen serieller Daten genutzt werden. Sobald Daten verfügbar sind werden diese in einen internem Buffer, ein Int-Array der Länge 1000, gespeichert. Danach wird dieser Buffer auf bestimmte Zeichenfolgen untersucht. Da die Daten per SML kodiert sind muss auf eine bestimmte Zeichenfolge aus dem SML-Protokoll getriggert werden, hierbei wurde sich auf die OBIS-Kennzahl 1.8.0 (vgl. \ref{SML spec}) konzentriert. | |||||
% TODO Code so formattieren dass kein Overflow passiert, ggf Kommentare in eigene Zeile | |||||
% TODO In Endfassung schauen dass Code auf EINER Seite ist | |||||
\begin{verbatim} | |||||
// Daten von Stromzähler: Gesamtverbrauch herausfiltern | |||||
if ( /* OBIS Kennung: 1-0.1.8.0*255 = 01 00 01 08 00 FF */ | |||||
BUFFER[j] == 0x77 && /* 77 - SML_Message.messageBody.SML_GetList_Reponse.valList.valListEntry (Sequence) */ | |||||
BUFFER[j+1] == 0x07 && /* 07 - objName (TL[1] + octet-string[6] */ | |||||
BUFFER[j+2] == 0x01 && /* 01 - objName Teil A */ | |||||
BUFFER[j+3] == 0x00 && /* 00 - objName Teil B */ | |||||
BUFFER[j+4] == 0x01 && /* 01 - objName Teil C */ | |||||
BUFFER[j+5] == 0x08 && /* 08 - objName Teil D */ | |||||
BUFFER[j+6] == 0x00 && /* 00 - objName Teil E */ | |||||
BUFFER[j+7] == 0xFF) /* FF - objName Teil F */ | |||||
/* xx - status */ | |||||
/* xx - valTime */ | |||||
/* xx - unit */ | |||||
/* xx - scaler */ | |||||
\end{verbatim} | |||||
Nun kann es auch passieren dass der ESP genau dann hochfährt, wenn gerade ein SML Paket verschickt wurde, der relevante Teil aber bereits gesendet wurde und für den ESP verloren ist. In diesem Fall darf der ESP nach dem Einlesen der Daten nicht sofort heruntergefahren werden, sondern es muss auf das nächste Paket gewartet werden, welches den Gesamtverbrauch beinhaltet. | |||||
Der Gesamtverbrauch hat eine Auflösung von 0,1Wh und ist als Type-Length-Field kodiert. Dieses TL-Feld definiert die Bedeutung des aktuellen und der folgenden Bytes. | |||||
Aus dem Datenblatt des Stromzählers lässt sich schließen, dass es sich dabei um eine 64-Bit große vorzeichenbehaftete Festpunktzahl (Integer) handelt, was sich zu \glqq0x59h\grqq kodiert. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/typelengthfield.png} | |||||
\caption{Type-Length-Field Definition aus [x, siehe unter Abbildung} | |||||
\label{fig:typelengthfield} | |||||
} | |||||
\end{figure} | |||||
% Diese Quelle wird bereits unter 1.3.1 schon mal verwendet! | |||||
% Punkt 7.1: https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR03109/TR-03109-1_Anlage_Feinspezifikation_Drahtgebundene_LMN-Schnittstelle_Teilb.pdf?__blob=publicationFile&v=1, | |||||
Als nächstes müssen die Bytes aus dem Buffer zur eigentlichen Zahl zusammengesetzt werden: | |||||
\begin{verbatim} | |||||
// mWh aus Buffer rekonstruieren | |||||
long long mWh = ((long long)BUFFER[j+1]) << 56 | ((long long)BUFFER[j+2]) << 48 | | |||||
((long long)BUFFER[j+3]) << 40 | ((long long)BUFFER[j+4]) << 32 | | |||||
((long long)BUFFER[j+5]) << 24 | ((long long)BUFFER[j+6]) << 16 | | |||||
((long long)BUFFER[j+7]) << 8 | ((long long)BUFFER[j+8]); | |||||
\end{verbatim} | |||||
Abschließend wird diese Zahl in kWh umgerechnet und dieser Messwert an den MQTT-Broker gesendet. | |||||
======= | |||||
Zwar bietet die Bibliothek auch Felder für MQTT-Broker IP und Port an, dies hat jedoch zum Zeitpunkt des Projekts nicht zuverlässig funktioniert und wurde deshalb aus dem Programm entfernt. Sollte die Bibliothek dahingehend verbessert werden, wäre es sinnvoll, dieses Feature nachzurüsten, um nicht jedes Mal den Microcontroller flashen zu müssen wenn ein anderer MQTT-Broker verwendet wird. Da dem Broker, welcher in diesem Fall ein Raspberry Pi ist, entweder in der internen Konfiguration des Raspberry Pi eine statische oder über den Router immer dieselbe IP zugewiesen werden kann und das Gerät nicht für wechselnde Broker gedacht ist, kann auf dieses Feature aber auch verzichtet werden. | |||||
%den letzten Satz evt nochmal umschreiben, der ist sehr verwirrend | |||||
>>>>>>> c6f7d789a87a74dba7d203e8761e1ebbce0fa422 | |||||
\subsection{MQTT} | |||||
%--- | |||||
MQTT (=Message Queuing Telemetry Transport [x]) % https://mqtt.org/ | |||||
ist ein Nachrichtenprotokoll zur Vernetzung von IoT-Geräten und funktioniert nach einem Client-Server Modell. Die Clients können Daten versenden, indem sie eine Nachricht in einem Topic an den Broker senden. Auf der anderen Seite können Daten empfangen werden, indem Topics abonniert werden. Das besondere dabei ist, dass Clients Anfragen und Daten ausschließlich über den MQTT-Broker erhalten, welcher den Datenstrom verwaltet. Im Fall dieser Projektarbeit ist der ESP ein MQTT-Client, welcher den Gesamtverbrauch an das Topic \glqq smartmeter\grqq sendet. Der Raspberry Pi ist in diesem Fall der MQTT-Broker. | |||||
Da MQTT bereits weit verbreitet ist und besonders für IoT-Geräte bereits ausreichend Implementierungen vorhanden sind wurde hier auf eine bereits bestehende Lösung zurückgegriffen. Dafür wurde die Bibliothek \glqq PubSubClient\grqq verwendet, welche eine einfache Implementation bereitstellt. Für Details sei an dieser Stelle auf die GitHub-Seite verwiesen. [x] | |||||
% https://github.com/knolleary/pubsubclient | |||||
\subsection{NodeRed und Datenbank} | |||||
%--- | |||||
Die Daten aus dem MQTT-Paket werden in einer MySQL-Datenbank auf dem Raspberry Pi gespeichert. Der genaue Aufbau dieser Datenbank wird weiter unten im Kapitel \ref{anleitung} beschrieben. | |||||
Um die Daten vom ESP in der Datenbank abzuspeichern wird ein NodeRed-Flow verwendet. Um die Zuverlässigkeit der Daten zu erhöhen wird vor dem Einfügen in die Tabelle eine Plausibilitätsprüfung durchgeführt, da Tests ergeben haben dass unvollständige Datensätze vom Stromzähler zu unplausiblen Messwerten führen können. Deshalb wird ein neuer Messwert zuerst mit dem letzten Messwert verglichen. Der neue Wert wird nur dann in der Datenbank gespeichert wenn er größer und höchstens doppelt so groß ist wie der letzte Wert (in den Tests wurden in seltenen Fällen fälschlicherweise Nullwerte oder extrem hohe Werte bemerkt). | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/nodered-flow.png} | |||||
\caption{NodeRed-Flow zum Speichern und Anzeigen des Messwertes} | |||||
\label{fig:nodered-flow} | |||||
} | |||||
\end{figure} | |||||
Abschließend wird der Wert auf einem Dashboard angezeigt. Dieses wurde bewusst simpel gehalten, da Herr Prof. Klehn hier eigene Ideen umsetzen möchte. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/nodered_dashboard.png} | |||||
\caption{NodeRed-Dasboard zum Anzeigen des letzten Messwerts} | |||||
\label{fig:nodered_dashboard} | |||||
} | |||||
\end{figure} | |||||
% TODO Eventuell was dazu sagen wie ein Dashboard gebaut wird, ist aber eher Fülltext falls nötig | |||||
\section{Gehäuse} | |||||
%+-- | |||||
Für den Empfängeraufbau aus BMS-Board, Platine, Photodiode, Ein- und Resetschalter wurde ein | |||||
3D-Druckgehäuse gezeichnet und gedruckt.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.9\linewidth]{img/case_cad.PNG} | |||||
\caption{CAD-Schnittbild des Gehäuses. Modellquelle BMS-Board: [x].} | |||||
% https://cad.grabcad.com/library/wemos-18650-battery-shield-v3-1 | |||||
\label{fig:cad_case} | |||||
} | |||||
\end{figure} | |||||
Das Gehäuse kann mit einem Deckel verschlossen werden, der durch vier Schrauben befestigt wird. | |||||
Die Platine und das BMS-Board werden durch metrische Distanzbolzen im Gehäuse und aneinander befestigt. | |||||
Sämtliche Gewinde im gedruckten Material werden durch metallische Gewindeeinsätze realisiert.\\ | |||||
Für die Photodiode befindet sich im Boden des Gehäuses eine Durchführung in die die Diode eingepresst wird. | |||||
An die Außenseite der Durchführung ist ein Ringmagnet montiert, der den Empfängeraufbau an die magnetische | |||||
Fläche des Stromzählers fixiert. | |||||
% ToDo (Julian) hier wären 1-2 Bilder vom fertigen Gehäuse cool bzw. falls du die bei Anleitung | |||||
% o.Ä. hast (z.B. wegen Resetschalter) einfach ein kurzer Verweis auf die. Ich hab leider nur | |||||
% Bilder im halb fertigen Zustand. | |||||
\FloatBarrier | |||||
\section{Teststrecke} | |||||
% Kathi ~ 2 Seiten | |||||
%--- | |||||
Zum Testen der Funktion wurde eine kleine Teststrecke aufgebaut, mit der es möglich | |||||
ist die Übertragung ohne den Stromzähler zu simulieren. | |||||
\subsection{Aufbau} | |||||
%--- | |||||
Zunächst wurde die Schaltung der Teststrecke auf einem Steckbrett aufgebaut, um zu überprüfen, ob die Grundidee des Projekts umsetzbar ist. Auch die bestellten Bauteile und Dimensionierungen konnten so überprüft werden. Da während der arbeit am Projekt zunächst kein Stromzähler zur verfügung stand wurde der Teststrecke zusätzlich zu dem bereits in Kapitel \ref{sec:ESP} erleuterten ESP, ein Arduino UNO hinzugefügt. So konnte überprüft werden, ob auch die Kommunikation zwischen zwei komplett voneinander getrennten Systhemen funktioniert. Der ESP dient also weiterhin als Empfänger, während der Arduino den Stromzähler als Sender simuliert. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.3\textheight]{img/Schaltung_Teststrecke.jpeg} | |||||
\caption{Der Schalplan der Teststrecke.} | |||||
\label{fig:sp_test} | |||||
} | |||||
\end{figure} | |||||
Wie in Abb. \ref{fig:sp_test} zu sehen ist, sind also die Schaltkreise komplett von einander getrennt. Um die besten Ergebnisse bei der Übertragung zu erzielen, werden die beiden LEDs gegenüber, Spitze an Spitze aufgebaut. Sendet man nun von TX-Pin des Arduino beispielsweise ein "A" so kann dieses am RX-Pin des ESP empfangen werden. Mit der richtigen dimensionierung von R1, auf \SI{100} {\ohm} nehmen auch wechselnde Lichtverhältnisse keinen Einfluss auf die Funktion der Schaltung. Der Wert der beiden Wiederstände R3 und R4 ist allerdings relativ frei wählbar, solange diese annähernd in der richtigen Größenordnung liegen.\\ | |||||
Eine weitere Besonderheit ist bei den beiden Dioden D1 und D2 zu beachten. Zwar handelt es sich bei beiden um Infrarotdioden, allerdings ist für die Funktion wichtig, dass es sich dabei auf der Sender Seite um eine klare, und auf der Empfänger Seite um eine möglichst dunkle, oder im besten Fall schwarze Diode handelt. Dazu wurden die LD274 (Sender) und die SHF213FA (Empfänger) gewählt.\\ \\ | |||||
Bei der Programmierung ist außerdem aufgefallen, dass das Hochladen des Programmes nur möglich ist, wenn der RX- und TX-Pin vom jeweiligen Mikrocontroller von der Schaltung getrennt sind. Nachdem die funktion der Schaltung überprüft war, wurde der Aufbau auf eine Lochplatine gelötet, dabei wurde mit Pin-Headern gearbeitet, sodass das Ergebnis als eine Art Arduino-Shield fungiert. Der Vorteil liegt dabei darin, dass beide Mikrocontroller zwar fest mit der Platine verbunden sind, aber bei Änderungen am Programm, auch genauso leicht zum Hochladen getrennt werden können. Außerdem befinden sich die beiden Dioden an der Unterseite des Shields, also im Gebrauch zwischen Shield und Arduino, was die Schaltung noch zusätzlich von äußeren Lichteinflüssen schützt.\\ | |||||
\subsection{Funktion} | |||||
%--- | |||||
- ESp Empfänger | |||||
- Arduino Sender | |||||
- Beide an einen Laptop mit zwei command windows öffnen | |||||
- kleiner Code zum eingeben was man senden will | |||||
- Problem dass Consolen text mit gesendet wird | |||||
- Was wollen sie senden text raus filtern | |||||
- Testen des Programms | |||||
- Inverter | |||||
\chapter{Anleitung} \label{anleitung} | |||||
%--- | |||||
% Julian ~ 4-5 Seiten | |||||
\section{Raspberry Pi} | |||||
%--- | |||||
Config und alles pipapo um Raspi komplett einzurichten | |||||
PLUS das was Klehn zusätzlich machen muss für unseren Teil | |||||
\subsection{Betriebssystem} | |||||
%--- | |||||
\subsection{Installation MQTT} | |||||
%--- | |||||
\subsection{NodeRed} | |||||
%--- | |||||
\subsection{Datebank} | |||||
%--- | |||||
\section{ESP8266} | |||||
%--- | |||||
Wifi Manager undso in der praktischen Anwendung nochmal erklären | |||||
Bilder WifiMgr etc blabla | |||||
Jumper Inverter | |||||
\section{Testaufbau} | |||||
%--- | |||||
Erklärung shield, putty, evtl. arduino Include | |||||
+Fotos | |||||
% ab hier alles Kathi: | |||||
\chapter{Fazit} | |||||
%--- | |||||
- Es funktioniert | |||||
- mit geringen finanziellen Mitteln umgesetzt | |||||
- einigermaßen Benutzerfreundlich | |||||
- Nicht für jeden geeignet, bezug auf Einleitung | |||||
- Speziell an den Klehn angepasst | |||||
\part{Anhang} | |||||
\section{Schaltplan}\label{sec:schematic} | |||||
\begin{figure}[!h] \centering{ | |||||
\includegraphics[angle=90,scale=0.7]{schematic.pdf}} | |||||
\end{figure} | |||||
\chapter{Literaturverzeichnis} | |||||
\label{sec:bibliography{Literatur}} | |||||
\part{Danksagung} | |||||
\end{document} |
\documentclass[a4paper,12pt]{scrreprt} %Dokument Einstellungen: Papierformat, Schriftgröße, Art des Dokuments (scr für Deutsch) | |||||
% ============= Packages ============= | |||||
\usepackage[utf8]{inputenc} %Sonderzeichen, Umlaute | |||||
\usepackage[left= 3cm,right = 2cm, bottom = 4 cm]{geometry} %Anpassung Seitenränder | |||||
\usepackage[onehalfspacing]{setspace} %Zeilenabstand anpassen | |||||
\usepackage[ngerman]{babel} %Sprache z.B. für Worttrennungen | |||||
\usepackage[T1]{fontenc} %Schrift | |||||
\usepackage{amsmath} %Mathe package | |||||
\usepackage{mathpazo} %Schriftart | |||||
\usepackage{graphicx} %Bilder einfügen | |||||
\usepackage{fancyhdr} %Angepasste Kopf- und Fußzeile | |||||
\usepackage{siunitx} %Chillige Einheiten | |||||
\usepackage{placeins} %Bilder daran hindern sonstwo zu landen | |||||
\usepackage{microtype} %Typesetting schöner | |||||
\usepackage[hidelinks]{hyperref} %Klickbare Verweise | |||||
\usepackage{listings} % code highlighting | |||||
% ============= Kopf- und Fußzeile ============= | |||||
\pagestyle{fancy} | |||||
% | |||||
\lhead{\includegraphics[height=24pt]{"TH_Logo.jpeg"}} | |||||
\chead{} | |||||
\rhead{\slshape \leftmark} | |||||
%% | |||||
\lfoot{} | |||||
\cfoot{\thepage} | |||||
\rfoot{} | |||||
%% | |||||
\renewcommand{\headrulewidth}{0.4pt} | |||||
\renewcommand{\footrulewidth}{0pt} | |||||
% ============= Dokument Beschreibung ============= | |||||
\title{Projektarbeit} | |||||
\author{Katharina Steib\thanks{TH Nürnberg} | |||||
\and Simon Kocher\footnotemark[1] | |||||
\and Julian Rico Birner\footnotemark[1]} | |||||
\date{heute} | |||||
% ============= Einstellungen ============= | |||||
\setcounter{tocdepth}{5} %Erweiterung des Inhalstverzeichnisses um eine weiter Ebene | |||||
\setcounter{secnumdepth}{5} %Erweiterug der Kapiteltiefe um eine weitere Ebene | |||||
\bibliographystyle{unsrt} %Zitationsstil | |||||
\sisetup{output-decimal-marker = {,}} % Komma statt . bei \SI{...} | |||||
% ============= Dokumentbeginn ============= | |||||
% ========================================== | |||||
\begin{document} | |||||
\begin{titlepage} % Suppresses displaying the page number on the title page and the subsequent page counts as page 1 | |||||
\newcommand{\HRule}{\rule{\linewidth}{0.5mm}} % Defines a new command for horizontal lines, change thickness here | |||||
\center % Centre everything on the page | |||||
%------------------------------------------------ | |||||
% Headings | |||||
%------------------------------------------------ | |||||
\textsc{\LARGE | |||||
\begin{figure} | |||||
\begin{center} | |||||
\includegraphics[scale=1]{"TH_Logo.jpeg"} | |||||
\end{center} | |||||
\end{figure} | |||||
}\\[0.5cm] % Main heading such as the name of your university/college | |||||
\textsc{\Large Projektarbeit}\\[0.5cm] % Major heading such as course name | |||||
\textsc{\large Elektro- und Informationstechnik}\\[0.5cm] % Minor heading such as course title | |||||
%------------------------------------------------ | |||||
% Title | |||||
%------------------------------------------------ | |||||
\HRule\\[0.4cm] | |||||
{\huge\bfseries Entwicklung eines IR-Empfängers für einen Stromzähler}\\[0.4cm] % Title of your document | |||||
\HRule\\[1.5cm] | |||||
%------------------------------------------------ | |||||
% Author(s) | |||||
%------------------------------------------------ | |||||
\begin{minipage}{0.4\textwidth} | |||||
\begin{flushleft} | |||||
\large | |||||
\textit{Autoren} | |||||
\\ Katharina \textsc{Steib} % Your name | |||||
\\ Simon \textsc{Kocher} %Your friends name | |||||
\\ Julian \textsc{Rico Birner} %The other guys name | |||||
\end{flushleft} | |||||
\end{minipage} | |||||
~ | |||||
\begin{minipage}{0.4\textwidth} | |||||
\begin{flushright} | |||||
\large | |||||
\textit{Betreuer}\\ | |||||
Bernd \textsc{Klehn} % Supervisor's name | |||||
\end{flushright} | |||||
\end{minipage} | |||||
% If you don't want a supervisor, uncomment the two lines below and comment the code above | |||||
%{\large\textit{Author}}\\ | |||||
%John \textsc{Smith} % Your name | |||||
%------------------------------------------------ | |||||
% Date | |||||
%------------------------------------------------ | |||||
\vfill\vfill\vfill % Position the date 3/4 down the remaining page | |||||
{\large\today} % Date, change the \today to a set date if you want to be precise | |||||
%------------------------------------------------ | |||||
% Logo | |||||
%------------------------------------------------ | |||||
%\vfill\vfill | |||||
%\includegraphics[width=0.2\textwidth]{placeholder.jpg}\\[1cm] % Include a department/university logo - this will require the graphicx package | |||||
%---------------------------------------------------------------------------------------- | |||||
\vfill % Push the date up 1/4 of the remaining page | |||||
\begin{center} | |||||
steibka77404@th-nuernberg.de (3264785) | |||||
\\ kochersi74936@th-nuernberg.de(3254887) | |||||
\\ ricobirnerju74691@th-nuernberg.de(3273163) | |||||
\end{center} | |||||
\end{titlepage} | |||||
%\maketitle %Erstellt Titelseite | |||||
\tableofcontents % Erstellt Inhaltsverzeichnis | |||||
\part{Hauptteil} | |||||
\chapter{Einleitung} | |||||
%++- | |||||
% Kathi 1,5 Seiten | |||||
Durch die Corona-Pandemie ist der Stromverbrauch in Deutschland im Jahr 2020 um rund 4,4 Prozent im Vergleich | |||||
zum Vorjahr gesunken, was einer Einsparung von 25 TWh entspricht. Dieses Phänomen lässt sich besonders auf den | |||||
Lockdown-bedingten Konjunktureinbruch zurück führen. Trotz des Rückgangs ist aber noch viel Luft nach oben. | |||||
Laut dem Stromspiegel 2019 verschwendeten die privaten Haushalte in Deutschland Strom im Wert von 9 Mrd. Euro.\\ | |||||
Viele Deutsche wissen gar nicht wie hoch ihr Stromverbrauch eigentlich ist und ob dieser über oder | |||||
unterdurchschnittlich ist. Zum Vergleich kann der durchschnittliche Stromverbrauch einer Familie von | |||||
4250 kWh / Jahr heran gezogen werden. Den eigenen Stromverbrauch zu ermitteln und im besten Fall auch entsprechend | |||||
zu regulieren ist schon schwieriger. Zwar findet man im Internet zahlreiche Seiten die anhand verschiedener Angaben | |||||
den Verbrauch abschätzen, jedoch handelt es sich dabei lediglich um eine grobe Näherung.\\ \\ | |||||
Im Zuger der Digitalisierung verfügen immer mehr Haushalte über ein Smart Home System. Dabei handelt es sich | |||||
eigentlich um einen Überbegriff der verschiedene Verfahren vereint, die mit automatisierbaren Abläufen das Leben | |||||
in Bezug auf den Wohnraum vereinfachen sollen. Bekannte Beispiele sind das Regeln der Heizung auch von Unterwegs, | |||||
das an und ausschalten verschiedener Geräte oder Lampen ohne zum Schalter gehen zu müssen oder auch das Öffnen | |||||
und Schließen von Fenstern und Rollläden. Dabei können die Geräte sowohl über eine Programmierschnittstelle zu | |||||
bestimmten Zeiten und/oder Bedingungen geschaltet werden als auch bequem per App vom Smartphone. | |||||
Das Zuhause wird also sowohl intelligenter als auch bequemer für seine Bewohner.\\ | |||||
Ein solches Smart Home System eignet sich auch zur genauen Stromerfassung und Regulierung besonders gut. | |||||
Der Verbraucher kann nicht nur genaue Daten ablesen sondern auch gezielt daran arbeiten seinen Stromverbrauch mit | |||||
speziell auf ihn angepassten Einstellungen zu minimieren. | |||||
Leider ist die Installation eines solchen Systhems oftmals mit einem hohen Aufwand und hohen | |||||
Kosten verbunden, da meist viele bereits vorhandene Teile ausgetauscht werden müssen. Auch die Kosten für die | |||||
Installation und Einrichtung sind nicht unerheblich.\\ \\ | |||||
In diesem Projekt wurde an einer möglichst Benutzerfreundlichen, kostengünstigen und einfachen Lösung gearbeitet | |||||
mit der man ein Stromzähler zu Hause selbst visualisieren kann. Dabei ist hervor zu heben, dass das Entwickelte | |||||
Gerät an den bereits vorhandenen Stromzähler ergänzt wird und somit kein Austausch von Geräten nötig ist.\\ | |||||
Der folgende Bericht wurde zur besseren Übersicht in zwei Teile unterteilt. | |||||
Im ersten Teil werden die Technischen Hintergründe und Funktionen erläutert. | |||||
Der zweite Teil soll hierbei als eine Art Benutzerhandbuch zur Anleitung dienen.\\ | |||||
\chapter{Konzept} | |||||
%+-- | |||||
% Simon ~1,5 Seiten | |||||
Im Folgenden wird zunächst auf die Aufgabenstellung eingegangen und anschließend ein Lösungsansatz schematisch erläutert. | |||||
\section{Soll-Ist-Analyse} | |||||
%+-- | |||||
Gegeben ist ein Stromzähler des Typen \glqq eHZ Generation K\grqq{} der Firma EMH metering GmbH \& Co. KG [x]. | |||||
% https://emh-metering.com/produkte/haushaltszaehler-smart-meter/ehz-k/ | |||||
Der Zähler verfügt über mehrere Infrarotschnittstellen zur Datenübertragung [x]. | |||||
% https://emh-metering.com/wp-content/uploads/2021/08/eHZ-K-DAB-D-1.10.pdf | |||||
Es soll ein Empfänger für die Zählerstände, die über diese Schnittstellen übertragen werden entwickelt | |||||
werden. Der Empfänger soll in sinnvollen Intervallen (z.B. zweimal pro Tag) den Zählerstand ermitteln | |||||
und an einen bestehenden Smart-Home-Controller in Form eines Raspberry Pi übermitteln.\\ | |||||
Der bestehende Controller zeigt bereits vorhandene Daten aus anderer Quelle in einem Dashboard auf | |||||
Basis von Node-RED [x] | |||||
% https://nodered.org/ | |||||
an. Die Zäherstände sollen ebenfalls in Node-RED angezeigt werden.\\ | |||||
Um eine möglichst einfache Installation des Empfängers zu ermöglichen, soll der Empfänger sowohl | |||||
im Hinblick auf die Datenübertragung als auch die Energieversorgung vollständig drahtlos funktionieren.\\ | |||||
Weiterhin soll ein Teststand entwickelt werden, mit dem der Empfänger ohne den Stromzähler auf | |||||
Funktion getestet werden kann. | |||||
\section{Lösungskonzept} | |||||
%+-- | |||||
% Konzept von Simon | |||||
% => Blockschaltbild | |||||
% - Nen Microcontroller+wifi | |||||
% - Iwie Versorgung | |||||
% - iwie Einlesen | |||||
% - Empfangen an Raspi | |||||
% - | |||||
Um eine drahtlose Energieversorgung des Empfängers zu ermöglichen, wird der Empfängeraufbau mit | |||||
einem Akku betrieben. Für den Akku müssen sowohl eine Ladevorrichtung als auch der Akkutechnologie entsprechende | |||||
Schutzschaltungen vorgesehen werden. Der Datenempfang und die Weitergabe an den | |||||
Smart-Home-Controller wird durch einen Microcontroller realisiert. Um auch für die | |||||
Datenübermittlung an den Controller kabellos zu bleiben, wird ein Microcontroller mit | |||||
WiFi-Schnittstelle benötigt. Der Datentransfer zum Smart-Home-Controller kann dabei über das | |||||
MQTT-Protokoll [x] | |||||
% https://mqtt.org/ | |||||
realisiert werden. Für den Empfang der Stromzählerstände muss ein Infrarotempfänger, der kompatibel | |||||
zur IR-Schnittstelle des Zählers ist, entwickelt werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=\linewidth]{img/konzept_bsb.PNG} | |||||
\caption{Schematische Darstellung des Lösungskonzepts.} | |||||
\label{fig:concept_bsb} | |||||
} | |||||
\end{figure} | |||||
Für den Teststand muss ein Infrarotsender entwickelt werden, der die IR-Schnittstelle des Stromzählers | |||||
nachahmt und konfigurierbare Werte als Zählerstand versendet. Hier bietet sich ebenfalls eine Lösung | |||||
mit einem Microcontroller an. | |||||
\FloatBarrier | |||||
\chapter{Implementierung} | |||||
%--- | |||||
% Simon und Julian | |||||
\section{Stromzähler} | |||||
%--- | |||||
% Julian ~ 2 Seiten | |||||
\subsection{Infrarotschnittstellen} | |||||
%--- | |||||
% @Julian: war glaube ich dir zugeteilt, ich hab mich beim Zähler mal auf das Modell aus | |||||
% https://emh-metering.com/wp-content/uploads/2021/08/eHZ-K-DAB-D-1.10.pdf (Datasheet) | |||||
% bezogen, wär cool wenn du hier kurz erwähnen könntest dass es sowohl die Datenschnittstelle | |||||
% als auch so eine x Impulse/kWh IR-Schnittstelle gibt. | |||||
Wie bereits erwähnt verfügt der Stromzähler über mehrere Infrarotschnittstellen. Dabei ist zu unterscheiden zwischen der Prüf-LED und den beiden optischen Datenschnittstellen. Über die Prüf-LED sendet der Stromzähler 10.000 Impulse pro kWh, vorausgesetzt es wird ein Strom oberhalb der Anlaufschwelle gemessen. Diese Schnittstelle dient jedoch, wie der Name bereits vermuten lässt, primär zur Funktionsprüfung des Zählers. Die beiden Datenschnittstellen hingegen können dazu verwendet werden, umfangreichere Daten auszulesen. Auf der Rückseite des Zählers befindet sich eine bidirektionale Datenschnittstelle, worüber neben dem Auslesen von Zählstanden auch das Setzen und Lesen von Zählerparametern, Fernabfragung oder Prüfung des Zählers möglich ist. Diese Schnittstelle ist jedoch hauptsächlich für den Netzbetreiber gedacht und aus diesem Grund auch mit einer Betriebsplombe versehen. Für den Endkunden zugänglich ist die unidirektionale INFO-Schnittstelle auf der Vorderseite, worüber der gleiche Datensatz empfangen werden kann, aber keine aktive Kommunikation mit dem Messgerät möglich ist [x]. | |||||
% https://emh-metering.com/wp-content/uploads/2020/08/eHZ-K-BIA-D-1-20.pdf (User manual) | |||||
\subsection{SML - Smart Message Language} | |||||
%--- | |||||
Über beide Datenschnittstellen wird alle paar Sekunden ein Datensatz verschickt, wobei hier zwischen einem reduzierten und einem vollständigen Datensatz gewechselt wird. Beide Datensätze verwenden SML (=Smart Message Language) [x] | |||||
% https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR03109/TR-03109-1_Anlage_Feinspezifikation_Drahtgebundene_LMN-Schnittstelle_Teilb.pdf?__blob=publicationFile | |||||
als Kommunikationsprotokoll mit einer Baudrate von 9600 Baud und einer maximalen Übertragungszeit von 400ms [x]. | |||||
% Gleiche Quelle wie in vorheriger Subsection: user manual eHZ Gen K | |||||
Die dabei übertragenen Werte werden über das OBIS-Kennzahlen-System [x] kodiert, der für uns interessante Gesamtverbrauch hat dabei die Kennzahl 1.8.0. | |||||
% https://www.bundesnetzagentur.de/DE/Beschlusskammern/BK06/BK6_81_GPKE_GeLi/Mitteilung_Nr_37/Anlagen/OBIS-Kennzahlensystem%202.2a.pdf?__blob=publicationFile&v=2 | |||||
\section{IR Übertragungsstrecke} | |||||
%+-- | |||||
% Simon ~ 1,5 Seiten | |||||
Die Impulsschnittstelle des Stromzählers würde sich grundsätzlich zum Aufzeichnen der Zählerstände eignen, | |||||
vorausgesetzt der Zählerstand zu Aufzeichnungsbeginn ist bekannt. Ein großer Vorteil dieser Schnittstelle | |||||
ist ihre extrem simple Natur: per GPIO-Interrupt eines Microcontrollers oder sogar per diskretem Zähler-IC | |||||
ist der Datenempfang sehr einfach realisierbar. Dagegen muss bei der IR-Datenschnittstelle sowohl | |||||
das Übertragungsprotokoll als auch die Datencodierung, die der Zähler verwendet, unterstützt werden.\\ | |||||
Gegen die Impulsschnittstelle sprechen allerdings einige Nachteile. Da die diese lediglich | |||||
eine fixe Anzahl an Impulsen pro verbrauchter Kilowattstunde sendet, werden hier nur Verbrauchsdeltas und | |||||
nie der absolute Wert übermittelt. Folglich wird zur Feststellung eines tatsächlichen Zählerstandes | |||||
in Kilowattstunden der Zählerstand zu Aufzeichnungsbeginn benötigt. Außerdem führt ein temporärer Ausfall | |||||
der Empfängerschaltung, bei dem Impulse nicht aufgezeichnet werden, zur Messung falscher Zählerstände.\\ | |||||
Ein weiterer Nachteil der Impulsschnittstelle ist dass zumindest ein Teil der Empfängerschaltung dauerhaft in Betrieb sein | |||||
muss um jeden Infrarotimpuls aufzunehmen. Gerade bei einem Microcontroller ist hier von einem relativ | |||||
hohen Energieverbrauch auszugehen bei dem ein Großteil der Energie verschwendet wird.\\ | |||||
Auf der Datenschnittstelle wird in regelmäßigen Intervallen der absolute Zählerstand übermittelt, damit | |||||
entfallen beide Nachteile der Impulsschnittstelle. Daher wurde sich für dieses Projekt für den Empfang | |||||
an der Datenschnittstelle entschieden. \\ | |||||
Die Datenschnittstelle überträgt hier die Zählerstände mittels des sogenannten D0-Protokolls [x] | |||||
% https://www.mikrocontroller.net/attachment/89888/Q3Dx_D0_Spezifikation_v11.pdf | |||||
nach DIN EN 62056‐21. Die Beschreibung des Protokolls lässt bereits eine Ähnlichkeit mit RS232 | |||||
vermuten, experimentell konnte bestätigt werden, dass die D0-Daten mittels der RS232-Peripherie eines | |||||
ESP8266 Microcontroller empfangen werden können. Dabei muss lediglich der RX-Pin der RS232-Schnittstelle | |||||
des Controllers an eine geeignete Empfangsschaltung angeschlossen werden.\\ | |||||
Bei einem Test mit einem Stromzähler des Herstellers \glqq Landis+Gyr\grqq{} konnte allerdings | |||||
festgestellt werden, dass die Datenformatangabe aus [x, gleiches wie vorher], d.h. | |||||
1 Startbit, 7 Datenbits, 1 Paritätsbit und ein Stoppbit, von diesem Zähler nicht eingehalten wird, | |||||
stattdessen wird von diesem Zähler 1 Startbit, 8 Datenbits und 1 Stoppbit verwendet. | |||||
Laut Herstellerangabe [x] | |||||
% https://www.landisgyr.de/webfoo/wp-content/uploads/2018/08/D000063497-E220-AMxD-Benutzerhandbuch-de-f.pdf | |||||
handelt es sich bei dieser Schnittstelle ebenfalls um eine Datenschnittstelle gem. DIN EN 62056‐21. | |||||
Bei der Einstellung der RS232-Peripherie kann es also zu zählerabhängigen Unterschieden kommen.\\ | |||||
Um einen Empfang der Zählerstände zu ermöglichen, müssen die Infrarotsignale des Zählers zunächst | |||||
in digitale elektrische Signale gewandelt werden. Für die Wandlung von Infrarotsignalen zu | |||||
elektrischen Signalen wurde eine Photodiode vom Typ SFH 213 FA [x] gewählt. Laut Datenblatt | |||||
% https://cdn-reichelt.de/documents/datenblatt/A501/SFH213FA_ENG_TDS.pdf | |||||
fließt bei einer Sperrspannung von $V_R=\SI{20}{\volt}$ ein Dunkelstrom $I_R \leq \SI{5}{\nano\ampere}$. | |||||
Bei $V_R=\SI{5}{\volt}$ und bei einer Strahlungsleistung von \SI{1}{\milli\watt\per\centi\metre\squared} | |||||
ist ein Photostrom $I_P \geq \SI{65}{\micro\ampere}$ zu erwarten. Bei Anwendung der Photodiode | |||||
in der Empfängerschaltung sind diese Rahmenparameter, sowohl die \SI{20}{\volt} Sperrspannung als | |||||
auch die genaue Strahlungsleistung nicht identisch mit den Vorgaben aus dem Datenblatt. Allerdings | |||||
können der Dunkelstrom $I_R \approx \SI{5}{\nano\ampere}$ und der Photostrom $I_P\approx\SI{65}{\micro\ampere}$ | |||||
als grobe Vorgaben zur Dimensionierung der Empfängerschaltung verwendet werden.\\ | |||||
Um die Stromsignale der Photodiode zu verstärken, bietet sich ein einfacher NPN-Transistor an, gewählt wurde | |||||
der BC548B. Mit der Beschaltung aus Abb. \ref{fig:ir_recv_a} und $200 \leq h_{FE} \leq 450$ | |||||
[x], | |||||
% https://cdn-reichelt.de/documents/datenblatt/A100/BC546_48-CDIL.pdf | |||||
ergibt sich ohne IR-Bestrahlung am Ausgang bei $V_{CC} = \SI{3,3}{\volt}$ | |||||
$U_{out} \approx V_{CC} - R_1 \cdot \SI{5}{\nano\ampere} \cdot h_{FE} \approx \SI{3,3}{\volt} \approx V_{CC}$. | |||||
Mit IR-Bestrahlung bei $I_{P}\approx\SI{65}{\micro\ampere}$ ergäbe sich nach der obigen Formel | |||||
eine negative Ausgangsspannung, in der Praxis geht der Transistor in Sättigung und $U_{out} \approx \SI{0}{\volt}$. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.25\textheight]{img/ir_recv_a.PNG} | |||||
\caption{Die Infrarotempfängerschaltung.} | |||||
\label{fig:ir_recv_a} | |||||
} | |||||
\end{figure} | |||||
Anhand der Berechnung lässt sich erkennen, dass die Verstärkerschaltung das Eingangssignal invertiert: | |||||
bei Dunkelheit wird eine digitale 1 erzeugt, bei IR-Belichtung eine digitale 0. Dieses Verhalten | |||||
kann schaltungstechnisch mit einem einfach Inverter, wie in Abb. \ref{fig:ir_recv_b} zu sehen, behoben werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.25\textheight]{img/ir_recv_b.PNG} | |||||
\caption{Die Infrarotempfängerschaltung mit Inverter.} | |||||
\label{fig:ir_recv_b} | |||||
} | |||||
\end{figure} | |||||
Nach Entwicklung der Schaltung konnte experimentell festgestellt werden, dass der getestete Stromzähler | |||||
der Firma Landis+Gyr bereits beim Senden das serielle Signal invertiert, sodass ein Inverter beim Empfänger | |||||
entfällt. Daher wurde die Inverterstufe auf der fertigen Platine durch einen Jumper konfigurierbar | |||||
ausgelegt (s. Abschnitt \ref{sec:schematic}). So kann Anwendungsspezifisch die Schaltung aus Abb. | |||||
\ref{fig:ir_recv_a} oder aus Abb. \ref{fig:ir_recv_b} verwendet werden.\\ | |||||
Das Signal $U_{out}$ der Empfängerschaltung kann direkt mit dem RX-Pin des Microcontrollers verbunden | |||||
werden. | |||||
\FloatBarrier | |||||
\section{Microcontroller} | |||||
%--- | |||||
Für das Empfangen und Verarbeiten der Daten wurde als Microcontroller ein D1 mini ausgewählt, welcher auf einem ESP8266 Prozessor basiert. Dieser verfügt über eine integrierte WLAN-Schnittstelle und ausreichend Peripherie, um den Anforderungen gerecht zu werden. Die serielle Schnittstelle des Microcontrollers kann außerdem direkt genutzt werden, um das serielle Signal vom Stromzähler mittels der bereits vorgestellten Empfängerschaltung relativ einfach einzulesen. Außerdem ist der Microcontroller mit der Arduino IDE programmierbar, was die Vorteile einer einfachen Programmierung und der gleichzeitig großen Vielfalt an Bibliotheken und Erweiterungen für diese Plattform kombiniert. Trotz seiner geringen Größe und dem noch vernachlässigbaren Gewicht verfügt das Board dennoch über ausreichend RAM und Flash-Speicher, eine Taktgeschwindigkeit von 80 bzw. 160 Mhz und einer $I^2C$-Schnittstelle zur Kommunikation mit der RTC, womit alle Anforderungen erfüllt sind [x]. | |||||
% https://www.wemos.cc/en/latest/d1/d1_mini.html | |||||
\begin{figure}[!h] | |||||
\centering | |||||
\includegraphics[height=0.25\textheight]{img/d1_top.jpg} | |||||
\caption{ESP 8266 D1 Mini.} | |||||
\label{fig:d1_mini_top} | |||||
\end{figure} | |||||
% TODO 1-2 Bilder vom ESP8266 vor Start von 3.4 | |||||
\FloatBarrier | |||||
\section{Energieverbrauch} | |||||
%+-- | |||||
% Simon ~ 3-4 Seiten | |||||
Da das Infrarotempfängerkonzept eine vollständig kabellose Anbindung des Empfängeraufbaus vorsieht, | |||||
ist die Energieversorgung über einen Akku notwendig. Als Akku wurde ein Lithium-Ionen Akku im 18650 | |||||
Formfaktor gewählt. Für das Akkumanagement, d.h. Laden des Akkus und Unterspannungsschutz, wird | |||||
ein fertiges BMS-Board verwendet. Das gewählte BMS-Board ist unter der Bezeichnung | |||||
\glqq Wemos 18650 battery shield V3\grqq{} auf diversen Onlinemarktplätzen zu finden.\\ | |||||
Das Board wird mit einer 18650 Lithium-Ionen-Zelle bestückt und liefert \SI{3}{\volt} und | |||||
\SI{5}{\volt} Ausgangsspannung, die bei Unterspannung der Akkuzelle automatisch abgeschaltet werden. | |||||
Weiterhin kann der Akku im BMS-Board bequem per Micro-USB aufgeladen werden.\\ | |||||
Damit der Empfänger einen möglichst nützlichen | |||||
Smart Home-Sensor darstellt, muss eine hohe Akkulebensdauer sichergestellt sein, da bei einem Empfänger, | |||||
der sehr häufig aufgeladen werden muss auch das manuelle notieren der Stromzählerstände einen vergleichbaren | |||||
Aufwand verursachen würde.\\ | |||||
Bei einem handelsüblichen 18650 Lithium-Ionen-Akku kann von einer Kapazität in der Größenordnung von | |||||
\SI{2700}{\milli\ampere{}\hour} ausgegangen werden [x]. | |||||
% https://b2b-api.panasonic.eu/file_stream/pids/fileversion/3447 | |||||
Bei einer geschätzten Stromaufnahme der Empfängerschaltung im Dauerbetrieb von ca. | |||||
\SI{150}{\milli\ampere}, ergäbe sich eine Akkulebensdauer von ca. \SI{18}{\hour}, ein völlig | |||||
inakzeptabler Wert. Aus dieser Überschlagsrechnung wird klar, dass die Empfängerschaltung in zwei | |||||
Zuständen, einem Aktivzustand mit großem Energieverbrauch und einem möglichst sparsamen Passivzustand, | |||||
realisiert werden muss. | |||||
\subsection{Abschätzung der Akkulebensdauer} | |||||
%+-- | |||||
\label{sec:lifetime_approx} | |||||
Um eine Realisierung dieser beiden Zustände zu beurteilen, ist ein Modell der Akkulebensdauer | |||||
in Abhängigkeit der Parameter der Zustände (Verweildauer im Zustand und Stromaufnahme) sinnvoll.\\ | |||||
Der Aktivzustand wird charakterisiert durch die Dauer $t_{on}$ mit mittlerem Versorgungsstrom $I_{on}$, | |||||
der in einem Zyklus der Periode $T_{cycle}$ auftritt, der Standby-Zustand wir charakterisiert durch | |||||
den Ruhestrom $I_{off}$.\\ | |||||
Mit Ladung $C=\int{I(\tau)d\tau}$ ergibt sich näherungsweise eine Ladungsaufnahme der Schaltung von | |||||
\begin{equation} | |||||
C_{auf}(t) = I_{on}\cdot\frac{t_{on}}{T_{cycle}}\cdot t + I_{off}\cdot t. | |||||
\end{equation} | |||||
Dabei wurden unter den Annahmen $t \gg T_{cycle}$ und $\frac{t_{on}}{T_{cycle}} \ll 1$ einige Vereinfachungen vorgenommen.\\ | |||||
Modelliert man nun den Akku der Kapazität $C_A$ (z.B. \SI{2800}{\milli\ampere{}\hour}) als simple Ladungsquelle, | |||||
die die Schaltung versorgt, bis $C_A$ \glqq aufgebraucht\grqq{} ist, ergibt sich durch Gleichsetzen von | |||||
$C_{auf}(t)$ und $C_A$ eine geschätzte Lebensdauer | |||||
\begin{equation} | |||||
t_L = \frac{C_A}{I_{on}\cdot t_{on}/T_{cycle}+I_{off}}. | |||||
\end{equation} | |||||
Für einen Ruhestrom von $I_{off}=\SI{2}{\micro\ampere}$, eine Aktivzeit $t_{on}=\SI{30}{\second}$, | |||||
$T_{cycle}=\SI{12}{\hour}$, $C_A=\SI{2800}{\milli\ampere{}\hour}$ und | |||||
einen mittleren Versorgungsstrom $I_{on}=\SI{150}{\milli\ampere}$ ergibt sich beispielsweise aus der Abschätzung | |||||
$t_L=\SI{1099}{\day}$. Wird bei den selben Parametern ein Ruhestrom von $I_{off}=\SI{0,2}{\milli\ampere}$ | |||||
angesetzt, drittelt sich die geschätzte Lebensdauer auf ca. \SI{384}{\day}.\\ | |||||
Es ist fragwürdig, ob in der Praxis tatsächlich eine derartig hohe Lebensdauer erreichbar ist, mitunter, | |||||
da kein realistisches Akkumodell verwendet wurde.\\ | |||||
Allerdings ist die hohe Abschätzung der Lebensdauer eine gute Indikation dafür, dass | |||||
die reale Lebensdauer nicht ausschließlich durch den Energieverbrauch der Schaltung sondern durch Eigenschaften | |||||
des Akkus limitiert wird und somit eine weitere Optimierung des Energieverbrauchs nicht unbedingt zu einem | |||||
signifikanten Anstieg der Akkulebensdauer führen würde. Um die Lebensdauer genauer zu bestimmen, ist allerdings | |||||
eine Echtzeitmessung oder die Verwendung eines präzisen Akkumodells erforderlich. | |||||
\subsection{Schaltungstechnische Realisierung des Standbyzustands} | |||||
%+-- | |||||
Der ESP8266 verfügt Hardwareseitig bereits über einen sogenannten \glqq Deep-sleep\grqq{}-Modus [x]. | |||||
% ESP8266 Low Power Solutions V1.5, Espressif | |||||
% https://www.espressif.com/sites/default/files/documentation/9b-esp8266-low_power_solutions__en.pdf | |||||
In diesem Modus wird der Großteil des Mikrocontrollers deaktiviert und damit der Energieverbrauch | |||||
deutlich gesenkt [x, selbe wie vorher]. Mittels der internen Uhr (RTC) des ESP wird der Microcontroller | |||||
in bestimmten Intervallen wieder \glqq geweckt\grqq{} [x, selbe wie vorher]. | |||||
Durch diesen Mechanismus könnte der zuvor beschriebene Energiesparmodus umgesetzt werden. | |||||
Da für dieses Projekt allerdings der ESP8266 nicht einzeln sondern in Form eines Entwicklungsboards | |||||
mit zusätzlicher Peripherie (z.B. Spannungswandler und USB zu UART Wandler) verwendet wird und | |||||
auch im Arbeitspunkt der IR-Empfängerschaltung ein geringer Strom fließt, würde | |||||
der Deep-sleep-Modus zwar den Energieverbrauch des ESP reduzieren, alle weiteren Komponenten wären | |||||
davon allerdings nicht betroffen. Wie die Lebensdauerabschätzung im vorherigen Abschnitt zeigt, ist | |||||
ein Standbystrom im Microamperebereich wünschenswert, daher ist der Deep-sleep-Modus für diesen Zweck | |||||
nicht ausreichend.\\ | |||||
Eine alternative Lösung, die im Rahmen dieses Projekts gewählt wurde, ist im Standbyzustand die | |||||
Energieversorgung der kompletten Schaltung zu unterbrechen.\\ | |||||
Dafür wird mittels eines p-MOSFET ein high-side Schalter realisiert, der die Versorgungsspannung | |||||
vom BMS-Board zum Empfänger schaltet. Der MOSFET wird angesteuert durch eine externe Echtzeituhr | |||||
(RTC) vom Typ DS3231 [x]. | |||||
% https://datasheets.maximintegrated.com/en/ds/DS3231.pdf | |||||
Die DS3231 liefert via I\textsuperscript{2}C-Schnittstelle nach einmaliger Konfiguration fortlaufend | |||||
das aktuelle Datum und die aktuelle Uhrzeit. Die RTC wird dabei von einer Lithium-Knopfzelle versorgt | |||||
und ist damit in ihrer Funktion unabhängig von einer externen Spannungsversorgung. Die für dieses Projekt | |||||
wichtigste Funktion der DS3231 sind die zwei programmierbaren Alarme der RTC.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=0.5\linewidth]{img/power_schema.PNG} | |||||
\caption{Schematische Darstellung der geschalteten Energieversorgung.} | |||||
\label{fig:power_schema} | |||||
} | |||||
\end{figure} | |||||
Mittels I\textsuperscript{2}C können in den Registern der RTC zwei Alarme dazu programmiert werden, in | |||||
bestimmten Intervallen (minütlich, stündlich, täglich, ...) den $\overline{\mbox{INT}}$-Pin der RTC | |||||
auf Masse zu ziehen [x, selbe wie vorher]. Dabei ist sehr hilfreich, dass die Alarmsignale selbsthaltend sind, | |||||
d.h. wird ein Alarm ausgelöst bleibt $\overline{\mbox{INT}}$ auf Masse gezogen, bis via | |||||
I\textsuperscript{2}C das jeweilige Alarmflag (A1E bzw. A2E) in den RTC-Registern zurückgesetzt wird [x, selbe wie vorher].\\ | |||||
Das Signal eignet sich also direkt zum Schalten der Energieversorgung der Empfängerschaltung. | |||||
Weiterhin handelt es sich bei dem $\overline{\mbox{INT}}$-Pin um einen open-drain Ausgang, d.h. der Pin | |||||
muss mit einem externen Pull-Up-Widerstand beschaltet werden [x, selbe wie vorher], der die high-Spannung des | |||||
Signals vorgibt. Damit bietet sich das Signal zum Steuern des p-MOSFET sehr an, da durch einen | |||||
Pull-Up auf die Sourcespannung des MOSFET der p-MOSFET korrekt durch das Signal geschaltet wird.\\ | |||||
In der praktischen Erprobung der Schaltung hat sich gezeigt, dass teils beim Ausschalten Glitches | |||||
auftreten können, bei denen die Versorgung nicht vollständig ausgeschaltet wird, sondern die Spannung | |||||
am Drain des MOSFET (die nahe \SI{0}{\volt} liegen sollte) bei beispielsweise \SI{1,6}{\volt} hängen | |||||
bleibt und der Ausschaltvorgang somit fehlschlägt. Um ein sicheres Ausschalten zu gewährleisten, | |||||
wurde zwischen das $\overline{\mbox{INT}}$-Signal der RTC mit Pull-Up und den MOSFET ein Spannungspuffer | |||||
geschaltet (realisiert durch zwei nacheinander geschaltete NAND-Gatter aus einem CD4011B IC, | |||||
Schaltung siehe Abschnitt \ref{sec:schematic}).\\ | |||||
Nach dieser Änderung konnten keine Glitches mehr festgestellt werden.\\ | |||||
Als p-MOSFET wurde ein NX2301P gewählt [x]. | |||||
% https://assets.nexperia.com/documents/data-sheet/NX2301P.pdf | |||||
Das wichtigste Auswahlkriterium für den MOSFET war in dieser Funktion ein betragsmäßig ausreichend | |||||
geringes $V_{GS}$ um den MOSFET einzuschalten. Dem Datenblatt lässt sich bei | |||||
$V_{GS}=\SI{-1.8}{\volt}$ ein maximales $R_{DSon}$ von \SI{270}{\milli\ohm} entnehmen. Dieser | |||||
$R_{DSon}$-Wert ist für den Aktivzustand der Schaltung völlig ausreichend - bei einer Stromaufnahme | |||||
von \SI{150}{\milli\ampere} fallen über dem MOSFET maximal \SI{41}{\milli\volt} ab, der Leistungsverlust | |||||
über dem MOSFET liegt im einstelligen Milliwattbereich. Die Gate-Source Spannung | |||||
von \SI{-1.8}{\volt} ist ebenfalls komfortabel erreichbar, bei einer Akkuspannung von \SI{3}{\volt} | |||||
wird ein $V_{GS}$ von knapp \SI{-3}{\volt} im Aktivzustand erreicht. | |||||
\FloatBarrier | |||||
\subsection{Messtechnische Überprüfung des Energieverbrauchs} | |||||
%--- | |||||
Zur messtechnischen Überprüfung des Energieverbrauchs wurde zunächst das BMS-Board mit \SI{3,7}{\volt} | |||||
versorgt und die Stromaufnahme ohne angeschlossene Last bestimmt. Es konnte ein Wert von ca. | |||||
\SI{0,33}{\milli\ampere} gemessen werden. Wie bereits bei der Abschätzung der Akkulebensdauer festgestellt | |||||
wurde, handelt es sich hierbei um einen relativ hohen Standbyverbrauch. Es ist eine naheliegende Vermutung, | |||||
dass dieser Stromverbrauch ohne Last durch den DC-DC Step-Up Konverter auf dem BMS-Board verursacht wird, | |||||
der die \SI{5}{\volt} Ausgangsspannung des Boards generiert.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.7\linewidth]{img/bms_board.jpg} | |||||
\caption{Die Rückseite des BMS-Boards. Rot markiert der Step-Up Konverter.} | |||||
\label{fig:bms_backside} | |||||
} | |||||
\end{figure} | |||||
Durch Position der Induktivität und Nachschlagen der IC-Nummern konnte U7 (s. Abb. \ref{fig:bms_backside}) | |||||
als Step-Up Konverter des Typs FP6298 identifiziert werden. Durch Entfernen des Step-Up ICs von der Platine | |||||
konnte die Stromaufnahme des BMS-Boards ohne angeschlossene Last auf unter \SI{0,2}{\micro\ampere} | |||||
reduziert werden. Durch diese Modifikation geht selbstverständlich der \SI{5}{\volt} Ausgang des BMS-Boards | |||||
verloren, stattdessen steht maximal die Zellspannung zur Verfügung. Das stellt allerdings kein Problem | |||||
dar, da experimentell festgestellt wurde, dass eine Versorgungsspannung im Bereich von \SI{3}{\volt} | |||||
bis \SI{3,7}{\volt} für den Betrieb der Empfängerschaltung ausreichend ist. Betrachtet man die | |||||
Entladecharakteristik eines typischen 18650 Lithium-Ionen Akkus (s. Abb. \ref{fig:liion_discharge}), | |||||
ist ersichtlich, dass in diesem | |||||
Spannungsbereich der größte Teil der Akkuladung ausgenutzt werden kann.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.7\linewidth]{img/discharge_curve.PNG} | |||||
\caption{Entladekurve eines 18650 Lithium-Ionen Akkus [x].} | |||||
% https://b2b-api.panasonic.eu/file_stream/pids/fileversion/3447 | |||||
\label{fig:liion_discharge} | |||||
} | |||||
\end{figure} | |||||
Anschließend wurde der Energieverbrauch der vollständigen Empfängerschaltung zusammen mit dem | |||||
BMS-Board charakterisiert. Dafür wurden erneut \SI{3,7}{\volt} an den Zellanschlüssen des BMS-Boards | |||||
eingespeist und der Stromfluss am Zellanschluss gemessen.\\ | |||||
Es konnte im Aktivzustand ein mittlerer Stromverbrauch von ca. \SI{150}{\milli\ampere} und im | |||||
Standbyzustand ein Stromverbrauch zwischen \SI{0,3}{\micro\ampere} und \SI{1,5}{\micro\ampere} | |||||
gemessen werden. Mit der Abschätzung aus Abschnitt \ref{sec:lifetime_approx} ergibt sich mit diesen | |||||
Werten bei $t_{on}=\SI{30}{\second}$, $T_{cycle}=\SI{12}{\hour}$ und $C_A=\SI{2800}{\milli\ampere{}\hour}$ | |||||
eine geschätzte Lebensdauer von $t_L\approx\SI{1104}{\day}$. Während die reale Akkulebensdauer | |||||
sicherlich deutlich geringer ausfallen wird, lässt dieser hohe Wert vermuten, dass Verbraucherseitig | |||||
die Voraussetzungen für eine hohe Akkulebensdauer erfüllt sind. | |||||
\FloatBarrier | |||||
\section{Platine} | |||||
%--- | |||||
% Julian ~ 1-2 Seiten | |||||
Um alle benötigten Komponenten sicher miteinander zu verbinden haben wir uns dazu entschlossen, eine eigene Platine zu entwerfen. Ein Aufbau auf einer Lochrasterplatine hätte sicherlich auch funktioniert, dies wäre bei der Anzahl der Komponenten und deren Größe, wie z.B. dem Microcontroller oder den NAND-Gates, sehr unübersichtlich geworden. Außerdem konnten die verschiedenen Konfigurationsmöglichkeiten so leichter implementiert und beschriftet werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\linewidth]{img/platine_rendering.png} | |||||
\caption{3D-Rendering der Platine in Altium.} | |||||
\label{fig:pcb_rendering} | |||||
} | |||||
\end{figure} | |||||
Wie bereits im vorherigen Kapitel beschrieben kam es zu Glitches beim Abschalten des pMOSFET. Um sowohl die Möglichkeit des direkten Abschaltens, als auch des gepufferten Abschaltens zu haben, wurden Lötbrücken platziert, womit ohne besonders viel Aufwand die Konfiguration geändert werden kann. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\linewidth]{img/pcb_sb1_sb2.png} | |||||
\caption{Lötbrücke 1 und 2 für Abschaltung mit oder ohne Puffer.} | |||||
\label{fig:pcb_sb1_sb2} | |||||
} | |||||
\end{figure} | |||||
Des Weiteren wurde eine Lotbrücke platziert um die RTC im aktiven Zustand aus dem Akku zu speisen. Damit wird vermieden, dass die Knopfzelle zu schnell entleert wird. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.5\textheight]{img/pcb_sb3.png} | |||||
\caption{Lötbrücke 3 für Versorgung der RTC per Akku.} | |||||
\label{fig:pcb_sb3} | |||||
} | |||||
\end{figure} | |||||
Außerdem wurde beim Testen entdeckt, dass der Stromzähler des Herstellers \glqq Landis+Gyr\grqq bereits ein invertiertes Signal sendet. Da der Stromzähler, an dem der Empfänger letzten Endes betrieben wird, nicht getestet werden konnte, wurden hierfür Jumper eingebaut, womit die Inverterstufe im Empfangspfad sehr leicht aktiviert oder deaktiviert werden kann. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/pcb_jumper.png} | |||||
\caption{Jumper zum Aktivieren und Deaktivieren der Inverterstufe.} | |||||
\label{fig:pcb_jumper} | |||||
} | |||||
\end{figure} | |||||
%TODO Bildgrößen und Platzierung anpassen | |||||
\FloatBarrier | |||||
\section{Software} | |||||
%--- | |||||
Das komplette Programm sowohl für den Empfänger als auch für den Teststand sind im Anhang zu finden. | |||||
% TODO Macht das Sinn? Schickt man sowas einfach nur per Mail mit? Wie machen wir das? | |||||
% Julian ~ 6-8 Seiten | |||||
\subsection{Programmablauf} | |||||
%--- | |||||
Der ESP wurde mit der Arduino IDE programmiert. Diese ermöglicht den Zugang zu beliebiger Hardware, solange der korrekte Treiber installiert ist und es eine Anbindung an die Arduino IDE gibt. Als Schnittstelle gibt es eine setup()-Funktion, welche einmalig zu Beginn des Programms abgearbeitet wird und eine loop()-Funktion, welche nach dem Setup zyklisch als Endlosschleife abläuft. | |||||
Im Setup werden zuerst einzelne Pins initialisiert, danach wird die serielle Kommunikation gestartet, woraufhin die Verbindung zum WLAN hergestellt wird. Ist dies erfolgreich, versucht der ESP als nächstes sich mit dem MQTT-Broker zu verbinden. Sobald auch das geklappt hat ist die Initialisierung beendet. Sollte jedoch keine Verbindung zum WLAN oder dem MQTT-Broker hergestellt werden können wird nach einer bestimmten Zeit das Ausschalten initialisiert. | |||||
\subsection{RTC} | |||||
%--- | |||||
Die Spannungsversorgung des Microcontrollers wird von der RTC gesteuert. Diese arbeitet mit internen Alarmen und schaltet den INT-Pin (low-aktiv), sobald ein aktiver Alarm abgelaufen ist. Danach bleibt sie aktiv, bis über $I^2C$ der Befehl zum Ausschalten gesendet wird. Dies geschieht, indem der Microcontroller nach Ablauf seines Programms im Control-Register der RTC die Flags für die Alarme zurücksetzt. Sobald das passiert ist, setzt die RTC den INT-Pin zurück und unterbricht damit die Stromversorgung für den ESP. Nach Ablaufen des Alarms beginnt dieser Zyklus von neuem. | |||||
\subsection{WifiManager} | |||||
%--- | |||||
Kernanforderung des Projekts war die drahtlose Kommunikation zwischen Empfänger und Smart-Home-Controller. Da uns aus ersichtlichen Gründen jedoch zur Projektlaufzeit die Zugangsdaten zum endgültigen WLAN nicht zur Verfügung standen war es nötig, dem Bediener die Möglichkeit zu geben, eine gültige WLAN Konfiguration an den Microcontroller zu übermitteln, ohne ihn dafür jedes Mal neu flashen zu müssen. Diese Funktionalität gibt es bereits schon in Form einer Bibliothek mit dem Namen WifiManager [x]. | |||||
% https://github.com/tzapu/WiFiManager | |||||
Mit Hilfe der Bibliothek startet der Microcontroller im Station-Mode und versucht, sich mit ggf. vorher gespeicherten Zugangsdaten anzumelden. Gelingt dies nicht oder ist noch keine Konfiguration hinterlegt, wechselt der ESP in Access-Point-Mode und startet einen eigenen Webserver. Nun kann sich der Bediener mit jedem beliebigen, WLAN-fähigen Gerät am WLAN des ESP anmelden und wird zu einer Anmeldeseite weitergeleitet, wo nun eine WLAN Zugangsdaten eingegeben werden können. Sobald sich der ESP erfolgreich mit dem angegebenen Netzwerk verbunden hat wird der Programmablauf fortgesetzt. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=0.5\textwidth]{img/wifimgr_loginpage.png} | |||||
\caption{Anmeldeseite des WifiManager aus Sicht des Bedieners.} | |||||
\label{fig:wifi_manager} | |||||
} | |||||
\end{figure} | |||||
Zwar bietet die Bibliothek auch Felder für MQTT-Broker IP und Port an, dies hat jedoch zum Zeitpunkt des Projekts nicht zuverlässig funktioniert und wurde deshalb aus dem Programm entfernt. Sollte die Bibliothek dahingehend verbessert werden würde es Sinn machen, dieses Feature nachzurüsten, um nicht jedes Mal den Microcontroller flashen zu müssen wenn ein anderer MQTT-Broker verwendet wird. Da dem Broker, welcher in diesem Fall ein Raspberry Pi ist, entweder in der internen Konfiguration des Raspberry Pi eine statische bzw. über den Router immer dieselbe IP zugewiesen werden kann und das Gerät nicht für wechselnde Broker gedacht ist, kann auf dieses Feature aber auch verzichtet werden. | |||||
\subsection{MQTT} | |||||
%--- | |||||
- PubSubClient bib ansprechen, Modell MQTT kurz erklären mit broker und client und topics und messages -> so kommen daten ans nodered | |||||
\subsection{NodeRed und Datenbank} | |||||
%--- | |||||
- Daten kommen per MQTT Paket an, werden kurz auf Plausibilität geprüft und dann in DB gespeichert | |||||
> Bild vom Flow und raspbi db | |||||
\subsection{Einlesen der SML-Daten} | |||||
%--- | |||||
Sobald ... | |||||
- ESP wartet bis serielle Daten vorhanden sind | |||||
- Teststand oder echt? | |||||
- Daten kommen seriell am RX Pin an und werden in internen Buffer geschrieben | |||||
THIS IS WHERE THE MAGIC HAPPENS | |||||
Obis gschmarri etc erklären + CODE | |||||
\section{Gehäuse} | |||||
%+-- | |||||
Für den Empfängeraufbau aus BMS-Board, Platine, Photodiode, Ein- und Resetschalter wurde ein | |||||
3D-Druckgehäuse gezeichnet und gedruckt.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.9\linewidth]{img/case_cad.PNG} | |||||
\caption{CAD-Schnittbild des Gehäuses. Modellquelle BMS-Board: [x].} | |||||
% https://cad.grabcad.com/library/wemos-18650-battery-shield-v3-1 | |||||
\label{fig:cad_case} | |||||
} | |||||
\end{figure} | |||||
Das Gehäuse kann mit einem Deckel verschlossen werden, der durch vier Schrauben befestigt wird. | |||||
Die Platine und das BMS-Board werden durch metrische Distanzbolzen im Gehäuse und aneinander befestigt. | |||||
Sämtliche Gewinde im gedruckten Material werden durch metallische Gewindeeinsätze realisiert.\\ | |||||
Für die Photodiode befindet sich im Boden des Gehäuses eine Durchführung in die die Diode eingepresst wird. | |||||
An die Außenseite der Durchführung ist ein Ringmagnet montiert, der den Empfängeraufbau an die magnetische | |||||
Fläche des Stromzählers fixiert. | |||||
% ToDo (Julian) hier wären 1-2 Bilder vom fertigen Gehäuse cool bzw. falls du die bei Anleitung | |||||
% o.Ä. hast (z.B. wegen Resetschalter) einfach ein kurzer Verweis auf die. Ich hab leider nur | |||||
% Bilder im halb fertigen Zustand. | |||||
\FloatBarrier | |||||
\section{Teststrecke} | |||||
%--- | |||||
Wie bereits erwähnt wurde zum Testen der Funktion eine kleine Teststrecke aufgebaut, mit der es möglich | |||||
ist die Übertragung ohne den Stromzähler zu simulieren. | |||||
% Kathi ~ 2 Seiten | |||||
\subsection{Aufbau} | |||||
%--- | |||||
Zunächst wurde die Test | |||||
\subsection{Funktion} | |||||
%--- | |||||
\subsection{Erkenntnisse} | |||||
%--- | |||||
\chapter{Anleitung} | |||||
%--- | |||||
% Julian ~ 4-5 Seiten | |||||
\section{Raspberry Pi} | |||||
%--- | |||||
Config und alles pipapo um Raspi komplett einzurichten | |||||
PLUS das was Klehn zusätzlich machen muss für unseren Teil | |||||
\subsection{Betriebssystem} | |||||
%--- | |||||
\subsection{Installation MQTT} | |||||
%--- | |||||
\subsection{NodeRed} | |||||
%--- | |||||
\subsection{Datebank} | |||||
%--- | |||||
\section{ESP8266} | |||||
%--- | |||||
Wifi Manager undso in der praktischen Anwendung nochmal erklären | |||||
Bilder WifiMgr etc blabla | |||||
Jumper Inverter | |||||
\section{Testaufbau} | |||||
%--- | |||||
Erklärung shield, putty, evtl. arduino Include | |||||
+Fotos | |||||
% ab hier alles Kathi: | |||||
\chapter{Fazit} | |||||
%--- | |||||
\part{Anhang} | |||||
\section{Schaltplan}\label{sec:schematic} | |||||
\begin{figure}[!h] \centering{ | |||||
\includegraphics[angle=90,scale=0.7]{schematic.pdf}} | |||||
\end{figure} | |||||
\chapter{Literaturverzeichnis} | |||||
\bibliography{Literatur} | |||||
\part{Danksagung} | |||||
\end{document} |
\documentclass[a4paper,12pt]{scrreprt} %Dokument Einstellungen: Papierformat, Schriftgröße, Art des Dokuments (scr für Deutsch) | |||||
% ============= Packages ============= | |||||
\usepackage[utf8]{inputenc} %Sonderzeichen, Umlaute | |||||
\usepackage[left= 3cm,right = 2cm, bottom = 4 cm]{geometry} %Anpassung Seitenränder | |||||
\usepackage[onehalfspacing]{setspace} %Zeilenabstand anpassen | |||||
\usepackage[ngerman]{babel} %Sprache z.B. für Worttrennungen | |||||
\usepackage[T1]{fontenc} %Schrift | |||||
\usepackage{amsmath} %Mathe package | |||||
\usepackage{mathpazo} %Schriftart | |||||
\usepackage{graphicx} %Bilder einfügen | |||||
\usepackage{fancyhdr} %Angepasste Kopf- und Fußzeile | |||||
\usepackage{siunitx} %Chillige Einheiten | |||||
\usepackage{placeins} %Bilder daran hindern sonstwo zu landen | |||||
\usepackage{microtype} %Typesetting schöner | |||||
\usepackage[hidelinks]{hyperref} %Klickbare Verweise | |||||
\usepackage{listings} % code highlighting | |||||
%\usepackage{minted} % anderes code highlighting | |||||
% ============= Kopf- und Fußzeile ============= | |||||
\pagestyle{fancy} | |||||
% | |||||
\lhead{\includegraphics[height=24pt]{"TH_Logo.jpeg"}} | |||||
\chead{} | |||||
\rhead{\slshape \leftmark} | |||||
%% | |||||
\lfoot{} | |||||
\cfoot{\thepage} | |||||
\rfoot{} | |||||
%% | |||||
\renewcommand{\headrulewidth}{0.4pt} | |||||
\renewcommand{\footrulewidth}{0pt} | |||||
% ============= Dokument Beschreibung ============= | |||||
\title{Projektarbeit} | |||||
\author{Katharina Steib\thanks{TH Nürnberg} | |||||
\and Simon Kocher\footnotemark[1] | |||||
\and Julian Rico Birner\footnotemark[1]} | |||||
\date{heute} | |||||
% ============= Einstellungen ============= | |||||
\setcounter{tocdepth}{5} %Erweiterung des Inhalstverzeichnisses um eine weiter Ebene | |||||
\setcounter{secnumdepth}{5} %Erweiterug der Kapiteltiefe um eine weitere Ebene | |||||
\bibliographystyle{unsrt} %Zitationsstil | |||||
\sisetup{output-decimal-marker = {,}} % Komma statt . bei \SI{...} | |||||
% ============= Dokumentbeginn ============= | |||||
% ========================================== | |||||
\begin{document} | |||||
\begin{titlepage} % Suppresses displaying the page number on the title page and the subsequent page counts as page 1 | |||||
\newcommand{\HRule}{\rule{\linewidth}{0.5mm}} % Defines a new command for horizontal lines, change thickness here | |||||
\center % Centre everything on the page | |||||
%------------------------------------------------ | |||||
% Headings | |||||
%------------------------------------------------ | |||||
\textsc{\LARGE | |||||
\begin{figure} | |||||
\begin{center} | |||||
\includegraphics[scale=1]{"TH_Logo.jpeg"} | |||||
\end{center} | |||||
\end{figure} | |||||
}\\[0.5cm] % Main heading such as the name of your university/college | |||||
\textsc{\Large Projektarbeit}\\[0.5cm] % Major heading such as course name | |||||
\textsc{\large Elektro- und Informationstechnik}\\[0.5cm] % Minor heading such as course title | |||||
%------------------------------------------------ | |||||
% Title | |||||
%------------------------------------------------ | |||||
\HRule\\[0.4cm] | |||||
{\huge\bfseries Entwicklung eines IR-Empfängers für einen Stromzähler}\\[0.4cm] % Title of your document | |||||
\HRule\\[1.5cm] | |||||
%------------------------------------------------ | |||||
% Author(s) | |||||
%------------------------------------------------ | |||||
\begin{minipage}{0.4\textwidth} | |||||
\begin{flushleft} | |||||
\large | |||||
\textit{Autoren} | |||||
\\ Katharina \textsc{Steib} % Your name | |||||
\\ Simon \textsc{Kocher} %Your friends name | |||||
\\ Julian \textsc{Rico Birner} %The other guys name | |||||
\end{flushleft} | |||||
\end{minipage} | |||||
~ | |||||
\begin{minipage}{0.4\textwidth} | |||||
\begin{flushright} | |||||
\large | |||||
\textit{Betreuer}\\ | |||||
Bernd \textsc{Klehn} % Supervisor's name | |||||
\end{flushright} | |||||
\end{minipage} | |||||
% If you don't want a supervisor, uncomment the two lines below and comment the code above | |||||
%{\large\textit{Author}}\\ | |||||
%John \textsc{Smith} % Your name | |||||
%------------------------------------------------ | |||||
% Date | |||||
%------------------------------------------------ | |||||
\vfill\vfill\vfill % Position the date 3/4 down the remaining page | |||||
{\large\today} % Date, change the \today to a set date if you want to be precise | |||||
%------------------------------------------------ | |||||
% Logo | |||||
%------------------------------------------------ | |||||
%\vfill\vfill | |||||
%\includegraphics[width=0.2\textwidth]{placeholder.jpg}\\[1cm] % Include a department/university logo - this will require the graphicx package | |||||
%---------------------------------------------------------------------------------------- | |||||
\vfill % Push the date up 1/4 of the remaining page | |||||
\begin{center} | |||||
steibka77404@th-nuernberg.de (3264785) | |||||
\\ kochersi74936@th-nuernberg.de(3254887) | |||||
\\ ricobirnerju74691@th-nuernberg.de(3273163) | |||||
\end{center} | |||||
\end{titlepage} | |||||
%\maketitle %Erstellt Titelseite | |||||
\tableofcontents % Erstellt Inhaltsverzeichnis | |||||
\part{Hauptteil} | |||||
\chapter{Einleitung} | |||||
%++- | |||||
% Kathi 1,5 Seiten | |||||
Durch die Corona-Pandemie ist der Stromverbrauch in Deutschland im Jahr 2020 um rund 4,4 Prozent im Vergleich | |||||
zum Vorjahr gesunken, was einer Einsparung von 25 TWh entspricht. Dieses Phänomen lässt sich besonders auf den | |||||
Lockdown-bedingten Konjunktureinbruch zurück führen. Trotz des Rückgangs ist aber noch viel Luft nach oben. | |||||
Laut dem Stromspiegel 2019 verschwendeten die privaten Haushalte in Deutschland Strom im Wert von 9 Mrd. Euro.\\ | |||||
Viele Deutsche wissen gar nicht wie hoch ihr Stromverbrauch eigentlich ist und ob dieser über oder | |||||
unterdurchschnittlich ist. Zum Vergleich kann der durchschnittliche Stromverbrauch einer Familie von | |||||
4250 kWh / Jahr heran gezogen werden. Den eigenen Stromverbrauch zu ermitteln und im besten Fall auch entsprechend | |||||
zu regulieren ist schon schwieriger. Zwar findet man im Internet zahlreiche Seiten die anhand verschiedener Angaben | |||||
den Verbrauch abschätzen, jedoch handelt es sich dabei lediglich um eine grobe Näherung.\\ \\ | |||||
Im Zuger der Digitalisierung verfügen immer mehr Haushalte über ein Smart Home System. Dabei handelt es sich | |||||
eigentlich um einen Überbegriff der verschiedene Verfahren vereint, die mit automatisierbaren Abläufen das Leben | |||||
in Bezug auf den Wohnraum vereinfachen sollen. Bekannte Beispiele sind das Regeln der Heizung auch von Unterwegs, | |||||
das an und ausschalten verschiedener Geräte oder Lampen ohne zum Schalter gehen zu müssen oder auch das Öffnen | |||||
und Schließen von Fenstern und Rollläden. Dabei können die Geräte sowohl über eine Programmierschnittstelle zu | |||||
bestimmten Zeiten und/oder Bedingungen geschaltet werden als auch bequem per App vom Smartphone. | |||||
Das Zuhause wird also sowohl intelligenter als auch bequemer für seine Bewohner.\\ | |||||
Ein solches Smart Home System eignet sich auch zur genauen Stromerfassung und Regulierung besonders gut. | |||||
Der Verbraucher kann nicht nur genaue Daten ablesen sondern auch gezielt daran arbeiten seinen Stromverbrauch mit | |||||
speziell auf ihn angepassten Einstellungen zu minimieren. | |||||
Leider ist die Installation eines solchen Systhems oftmals mit einem hohen Aufwand und hohen | |||||
Kosten verbunden, da meist viele bereits vorhandene Teile ausgetauscht werden müssen. Auch die Kosten für die | |||||
Installation und Einrichtung sind nicht unerheblich.\\ \\ | |||||
In diesem Projekt wurde an einer möglichst Benutzerfreundlichen, kostengünstigen und einfachen Lösung gearbeitet | |||||
mit der man ein Stromzähler zu Hause selbst visualisieren kann. Dabei ist hervor zu heben, dass das Entwickelte | |||||
Gerät an den bereits vorhandenen Stromzähler ergänzt wird und somit kein Austausch von Geräten nötig ist.\\ | |||||
Der folgende Bericht wurde zur besseren Übersicht in zwei Teile unterteilt. | |||||
Im ersten Teil werden die Technischen Hintergründe und Funktionen erläutert. | |||||
Der zweite Teil soll hierbei als eine Art Benutzerhandbuch zur Anleitung dienen.\\ | |||||
\chapter{Konzept} | |||||
%+-- | |||||
% Simon ~1,5 Seiten | |||||
Im Folgenden wird zunächst auf die Aufgabenstellung eingegangen und anschließend ein Lösungsansatz schematisch erläutert. | |||||
\section{Soll-Ist-Analyse} | |||||
%+-- | |||||
Gegeben ist ein Stromzähler des Typen \glqq eHZ Generation K\grqq{} der Firma EMH metering GmbH \& Co. KG [x]. | |||||
% https://emh-metering.com/produkte/haushaltszaehler-smart-meter/ehz-k/ | |||||
Der Zähler verfügt über mehrere Infrarotschnittstellen zur Datenübertragung [x]. | |||||
% https://emh-metering.com/wp-content/uploads/2021/08/eHZ-K-DAB-D-1.10.pdf | |||||
Es soll ein Empfänger für die Zählerstände, die über diese Schnittstellen übertragen werden entwickelt | |||||
werden. Der Empfänger soll in sinnvollen Intervallen (z.B. zweimal pro Tag) den Zählerstand ermitteln | |||||
und an einen bestehenden Smart-Home-Controller in Form eines Raspberry Pi übermitteln.\\ | |||||
Der bestehende Controller zeigt bereits vorhandene Daten aus anderer Quelle in einem Dashboard auf | |||||
Basis von Node-RED [x] | |||||
% https://nodered.org/ | |||||
an. Die Zäherstände sollen ebenfalls in Node-RED angezeigt werden.\\ | |||||
Um eine möglichst einfache Installation des Empfängers zu ermöglichen, soll der Empfänger sowohl | |||||
im Hinblick auf die Datenübertragung als auch die Energieversorgung vollständig drahtlos funktionieren.\\ | |||||
Weiterhin soll ein Teststand entwickelt werden, mit dem der Empfänger ohne den Stromzähler auf | |||||
Funktion getestet werden kann. | |||||
\section{Lösungskonzept} | |||||
%+-- | |||||
% Konzept von Simon | |||||
% => Blockschaltbild | |||||
% - Nen Microcontroller+wifi | |||||
% - Iwie Versorgung | |||||
% - iwie Einlesen | |||||
% - Empfangen an Raspi | |||||
% - | |||||
Um eine drahtlose Energieversorgung des Empfängers zu ermöglichen, wird der Empfängeraufbau mit | |||||
einem Akku betrieben. Für den Akku müssen sowohl eine Ladevorrichtung als auch der Akkutechnologie entsprechende | |||||
Schutzschaltungen vorgesehen werden. Der Datenempfang und die Weitergabe an den | |||||
Smart-Home-Controller wird durch einen Microcontroller realisiert. Um auch für die | |||||
Datenübermittlung an den Controller kabellos zu bleiben, wird ein Microcontroller mit | |||||
WiFi-Schnittstelle benötigt. Der Datentransfer zum Smart-Home-Controller kann dabei über das | |||||
MQTT-Protokoll [x] | |||||
% https://mqtt.org/ | |||||
realisiert werden. Für den Empfang der Stromzählerstände muss ein Infrarotempfänger, der kompatibel | |||||
zur IR-Schnittstelle des Zählers ist, entwickelt werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=\linewidth]{img/konzept_bsb.PNG} | |||||
\caption{Schematische Darstellung des Lösungskonzepts.} | |||||
\label{fig:concept_bsb} | |||||
} | |||||
\end{figure} | |||||
Für den Teststand muss ein Infrarotsender entwickelt werden, der die IR-Schnittstelle des Stromzählers | |||||
nachahmt und konfigurierbare Werte als Zählerstand versendet. Hier bietet sich ebenfalls eine Lösung | |||||
mit einem Microcontroller an. | |||||
\FloatBarrier | |||||
\chapter{Implementierung} | |||||
%--- | |||||
% Simon und Julian | |||||
\section{Stromzähler} | |||||
%--- | |||||
% Julian ~ 2 Seiten | |||||
\subsection{Infrarotschnittstellen} | |||||
%--- | |||||
% @Julian: war glaube ich dir zugeteilt, ich hab mich beim Zähler mal auf das Modell aus | |||||
% https://emh-metering.com/wp-content/uploads/2021/08/eHZ-K-DAB-D-1.10.pdf (Datasheet) | |||||
% bezogen, wär cool wenn du hier kurz erwähnen könntest dass es sowohl die Datenschnittstelle | |||||
% als auch so eine x Impulse/kWh IR-Schnittstelle gibt. | |||||
Wie bereits erwähnt verfügt der Stromzähler über mehrere Infrarotschnittstellen. Dabei ist zu unterscheiden zwischen der Prüf-LED und den beiden optischen Datenschnittstellen. Über die Prüf-LED sendet der Stromzähler 10.000 Impulse pro kWh, vorausgesetzt es wird ein Strom oberhalb der Anlaufschwelle gemessen. Diese Schnittstelle dient jedoch, wie der Name bereits vermuten lässt, primär zur Funktionsprüfung des Zählers. Die beiden Datenschnittstellen hingegen können dazu verwendet werden, umfangreichere Daten auszulesen. Auf der Rückseite des Zählers befindet sich eine bidirektionale Datenschnittstelle, worüber neben dem Auslesen von Zählstanden auch das Setzen und Lesen von Zählerparametern, Fernabfragung oder Prüfung des Zählers möglich ist. Diese Schnittstelle ist jedoch hauptsächlich für den Netzbetreiber gedacht und aus diesem Grund auch mit einer Betriebsplombe versehen. Für den Endkunden zugänglich ist die unidirektionale INFO-Schnittstelle auf der Vorderseite, worüber der gleiche Datensatz empfangen werden kann, aber keine aktive Kommunikation mit dem Messgerät möglich ist [x]. | |||||
% https://emh-metering.com/wp-content/uploads/2020/08/eHZ-K-BIA-D-1-20.pdf (User manual) | |||||
\subsection{SML - Smart Message Language} \label{SML spec} | |||||
%--- | |||||
Über beide Datenschnittstellen wird alle paar Sekunden ein Datensatz verschickt, wobei hier zwischen einem reduzierten und einem vollständigen Datensatz gewechselt wird. Beide Datensätze verwenden SML (=Smart Message Language) [x] | |||||
% https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR03109/TR-03109-1_Anlage_Feinspezifikation_Drahtgebundene_LMN-Schnittstelle_Teilb.pdf?__blob=publicationFile | |||||
als Kommunikationsprotokoll mit einer Baudrate von 9600 Baud und einer maximalen Übertragungszeit von 400ms [x]. | |||||
% Gleiche Quelle wie in vorheriger Subsection: user manual eHZ Gen K | |||||
Die dabei übertragenen Werte werden über das OBIS-Kennzahlen-System [x] kodiert, der für uns interessante Gesamtverbrauch hat dabei die Kennzahl 1.8.0. | |||||
% https://www.bundesnetzagentur.de/DE/Beschlusskammern/BK06/BK6_81_GPKE_GeLi/Mitteilung_Nr_37/Anlagen/OBIS-Kennzahlensystem%202.2a.pdf?__blob=publicationFile&v=2 | |||||
\section{IR Übertragungsstrecke} | |||||
%+-- | |||||
% Simon ~ 1,5 Seiten | |||||
Die Impulsschnittstelle des Stromzählers würde sich grundsätzlich zum Aufzeichnen der Zählerstände eignen, | |||||
vorausgesetzt der Zählerstand zu Aufzeichnungsbeginn ist bekannt. Ein großer Vorteil dieser Schnittstelle | |||||
ist ihre extrem simple Natur: per GPIO-Interrupt eines Microcontrollers oder sogar per diskretem Zähler-IC | |||||
ist der Datenempfang sehr einfach realisierbar. Dagegen muss bei der IR-Datenschnittstelle sowohl | |||||
das Übertragungsprotokoll als auch die Datencodierung, die der Zähler verwendet, unterstützt werden.\\ | |||||
Gegen die Impulsschnittstelle sprechen allerdings einige Nachteile. Da die diese lediglich | |||||
eine fixe Anzahl an Impulsen pro verbrauchter Kilowattstunde sendet, werden hier nur Verbrauchsdeltas und | |||||
nie der absolute Wert übermittelt. Folglich wird zur Feststellung eines tatsächlichen Zählerstandes | |||||
in Kilowattstunden der Zählerstand zu Aufzeichnungsbeginn benötigt. Außerdem führt ein temporärer Ausfall | |||||
der Empfängerschaltung, bei dem Impulse nicht aufgezeichnet werden, zur Messung falscher Zählerstände.\\ | |||||
Ein weiterer Nachteil der Impulsschnittstelle ist dass zumindest ein Teil der Empfängerschaltung dauerhaft in Betrieb sein | |||||
muss um jeden Infrarotimpuls aufzunehmen. Gerade bei einem Microcontroller ist hier von einem relativ | |||||
hohen Energieverbrauch auszugehen bei dem ein Großteil der Energie verschwendet wird.\\ | |||||
Auf der Datenschnittstelle wird in regelmäßigen Intervallen der absolute Zählerstand übermittelt, damit | |||||
entfallen beide Nachteile der Impulsschnittstelle. Daher wurde sich für dieses Projekt für den Empfang | |||||
an der Datenschnittstelle entschieden. \\ | |||||
Die Datenschnittstelle überträgt hier die Zählerstände mittels des sogenannten D0-Protokolls [x] | |||||
% https://www.mikrocontroller.net/attachment/89888/Q3Dx_D0_Spezifikation_v11.pdf | |||||
nach DIN EN 62056‐21. Die Beschreibung des Protokolls lässt bereits eine Ähnlichkeit mit RS232 | |||||
vermuten, experimentell konnte bestätigt werden, dass die D0-Daten mittels der RS232-Peripherie eines | |||||
ESP8266 Microcontroller empfangen werden können. Dabei muss lediglich der RX-Pin der RS232-Schnittstelle | |||||
des Controllers an eine geeignete Empfangsschaltung angeschlossen werden.\\ | |||||
Bei einem Test mit einem Stromzähler des Herstellers \glqq Landis+Gyr\grqq{} konnte allerdings | |||||
festgestellt werden, dass die Datenformatangabe aus [x, gleiches wie vorher], d.h. | |||||
1 Startbit, 7 Datenbits, 1 Paritätsbit und ein Stoppbit, von diesem Zähler nicht eingehalten wird, | |||||
stattdessen wird von diesem Zähler 1 Startbit, 8 Datenbits und 1 Stoppbit verwendet. | |||||
Laut Herstellerangabe [x] | |||||
% https://www.landisgyr.de/webfoo/wp-content/uploads/2018/08/D000063497-E220-AMxD-Benutzerhandbuch-de-f.pdf | |||||
handelt es sich bei dieser Schnittstelle ebenfalls um eine Datenschnittstelle gem. DIN EN 62056‐21. | |||||
Bei der Einstellung der RS232-Peripherie kann es also zu zählerabhängigen Unterschieden kommen.\\ | |||||
Um einen Empfang der Zählerstände zu ermöglichen, müssen die Infrarotsignale des Zählers zunächst | |||||
in digitale elektrische Signale gewandelt werden. Für die Wandlung von Infrarotsignalen zu | |||||
elektrischen Signalen wurde eine Photodiode vom Typ SFH 213 FA [x] gewählt. Laut Datenblatt | |||||
% https://cdn-reichelt.de/documents/datenblatt/A501/SFH213FA_ENG_TDS.pdf | |||||
fließt bei einer Sperrspannung von $V_R=\SI{20}{\volt}$ ein Dunkelstrom $I_R \leq \SI{5}{\nano\ampere}$. | |||||
Bei $V_R=\SI{5}{\volt}$ und bei einer Strahlungsleistung von \SI{1}{\milli\watt\per\centi\metre\squared} | |||||
ist ein Photostrom $I_P \geq \SI{65}{\micro\ampere}$ zu erwarten. Bei Anwendung der Photodiode | |||||
in der Empfängerschaltung sind diese Rahmenparameter, sowohl die \SI{20}{\volt} Sperrspannung als | |||||
auch die genaue Strahlungsleistung nicht identisch mit den Vorgaben aus dem Datenblatt. Allerdings | |||||
können der Dunkelstrom $I_R \approx \SI{5}{\nano\ampere}$ und der Photostrom $I_P\approx\SI{65}{\micro\ampere}$ | |||||
als grobe Vorgaben zur Dimensionierung der Empfängerschaltung verwendet werden.\\ | |||||
Um die Stromsignale der Photodiode zu verstärken, bietet sich ein einfacher NPN-Transistor an, gewählt wurde | |||||
der BC548B. Mit der Beschaltung aus Abb. \ref{fig:ir_recv_a} und $200 \leq h_{FE} \leq 450$ | |||||
[x], | |||||
% https://cdn-reichelt.de/documents/datenblatt/A100/BC546_48-CDIL.pdf | |||||
ergibt sich ohne IR-Bestrahlung am Ausgang bei $V_{CC} = \SI{3,3}{\volt}$ | |||||
$U_{out} \approx V_{CC} - R_1 \cdot \SI{5}{\nano\ampere} \cdot h_{FE} \approx \SI{3,3}{\volt} \approx V_{CC}$. | |||||
Mit IR-Bestrahlung bei $I_{P}\approx\SI{65}{\micro\ampere}$ ergäbe sich nach der obigen Formel | |||||
eine negative Ausgangsspannung, in der Praxis geht der Transistor in Sättigung und $U_{out} \approx \SI{0}{\volt}$. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.25\textheight]{img/ir_recv_a.PNG} | |||||
\caption{Die Infrarotempfängerschaltung.} | |||||
\label{fig:ir_recv_a} | |||||
} | |||||
\end{figure} | |||||
Anhand der Berechnung lässt sich erkennen, dass die Verstärkerschaltung das Eingangssignal invertiert: | |||||
bei Dunkelheit wird eine digitale 1 erzeugt, bei IR-Belichtung eine digitale 0. Dieses Verhalten | |||||
kann schaltungstechnisch mit einem einfach Inverter, wie in Abb. \ref{fig:ir_recv_b} zu sehen, behoben werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.25\textheight]{img/ir_recv_b.PNG} | |||||
\caption{Die Infrarotempfängerschaltung mit Inverter.} | |||||
\label{fig:ir_recv_b} | |||||
} | |||||
\end{figure} | |||||
Nach Entwicklung der Schaltung konnte experimentell festgestellt werden, dass der getestete Stromzähler | |||||
der Firma Landis+Gyr bereits beim Senden das serielle Signal invertiert, sodass ein Inverter beim Empfänger | |||||
entfällt. Daher wurde die Inverterstufe auf der fertigen Platine durch einen Jumper konfigurierbar | |||||
ausgelegt (s. Abschnitt \ref{sec:schematic}). So kann Anwendungsspezifisch die Schaltung aus Abb. | |||||
\ref{fig:ir_recv_a} oder aus Abb. \ref{fig:ir_recv_b} verwendet werden.\\ | |||||
Das Signal $U_{out}$ der Empfängerschaltung kann direkt mit dem RX-Pin des Microcontrollers verbunden | |||||
werden. | |||||
\FloatBarrier | |||||
\section{Microcontroller} | |||||
%--- | |||||
Für das Empfangen und Verarbeiten der Daten wurde als Microcontroller ein D1 mini ausgewählt, welcher auf einem ESP8266 Prozessor basiert. Dieser verfügt über eine integrierte WLAN-Schnittstelle und ausreichend Peripherie, um den Anforderungen gerecht zu werden. Die serielle Schnittstelle des Microcontrollers kann außerdem direkt genutzt werden, um das serielle Signal vom Stromzähler mittels der bereits vorgestellten Empfängerschaltung relativ einfach einzulesen. Außerdem ist der Microcontroller mit der Arduino IDE programmierbar, was die Vorteile einer einfachen Programmierung und der gleichzeitig großen Vielfalt an Bibliotheken und Erweiterungen für diese Plattform kombiniert. Trotz seiner geringen Größe und dem noch vernachlässigbaren Gewicht verfügt das Board dennoch über ausreichend RAM und Flash-Speicher, eine Taktgeschwindigkeit von 80 bzw. 160 Mhz und einer $I^2C$-Schnittstelle zur Kommunikation mit der RTC, womit alle Anforderungen erfüllt sind [x]. | |||||
% https://www.wemos.cc/en/latest/d1/d1_mini.html | |||||
\begin{figure}[!h] | |||||
\centering | |||||
\includegraphics[height=0.25\textheight]{img/d1_top.jpg} | |||||
\caption{ESP 8266 D1 Mini.} | |||||
\label{fig:d1_mini_top} | |||||
\end{figure} | |||||
% TODO 1-2 Bilder vom ESP8266 vor Start von 3.4 | |||||
\FloatBarrier | |||||
\section{Energieverbrauch} | |||||
%+-- | |||||
% Simon ~ 3-4 Seiten | |||||
Da das Infrarotempfängerkonzept eine vollständig kabellose Anbindung des Empfängeraufbaus vorsieht, | |||||
ist die Energieversorgung über einen Akku notwendig. Als Akku wurde ein Lithium-Ionen Akku im 18650 | |||||
Formfaktor gewählt. Für das Akkumanagement, d.h. Laden des Akkus und Unterspannungsschutz, wird | |||||
ein fertiges BMS-Board verwendet. Das gewählte BMS-Board ist unter der Bezeichnung | |||||
\glqq Wemos 18650 battery shield V3\grqq{} auf diversen Onlinemarktplätzen zu finden.\\ | |||||
Das Board wird mit einer 18650 Lithium-Ionen-Zelle bestückt und liefert \SI{3}{\volt} und | |||||
\SI{5}{\volt} Ausgangsspannung, die bei Unterspannung der Akkuzelle automatisch abgeschaltet werden. | |||||
Weiterhin kann der Akku im BMS-Board bequem per Micro-USB aufgeladen werden.\\ | |||||
Damit der Empfänger einen möglichst nützlichen | |||||
Smart Home-Sensor darstellt, muss eine hohe Akkulebensdauer sichergestellt sein, da bei einem Empfänger, | |||||
der sehr häufig aufgeladen werden muss auch das manuelle notieren der Stromzählerstände einen vergleichbaren | |||||
Aufwand verursachen würde.\\ | |||||
Bei einem handelsüblichen 18650 Lithium-Ionen-Akku kann von einer Kapazität in der Größenordnung von | |||||
\SI{2700}{\milli\ampere{}\hour} ausgegangen werden [x]. | |||||
% https://b2b-api.panasonic.eu/file_stream/pids/fileversion/3447 | |||||
Bei einer geschätzten Stromaufnahme der Empfängerschaltung im Dauerbetrieb von ca. | |||||
\SI{150}{\milli\ampere}, ergäbe sich eine Akkulebensdauer von ca. \SI{18}{\hour}, ein völlig | |||||
inakzeptabler Wert. Aus dieser Überschlagsrechnung wird klar, dass die Empfängerschaltung in zwei | |||||
Zuständen, einem Aktivzustand mit großem Energieverbrauch und einem möglichst sparsamen Passivzustand, | |||||
realisiert werden muss. | |||||
\subsection{Abschätzung der Akkulebensdauer} | |||||
%+-- | |||||
\label{sec:lifetime_approx} | |||||
Um eine Realisierung dieser beiden Zustände zu beurteilen, ist ein Modell der Akkulebensdauer | |||||
in Abhängigkeit der Parameter der Zustände (Verweildauer im Zustand und Stromaufnahme) sinnvoll.\\ | |||||
Der Aktivzustand wird charakterisiert durch die Dauer $t_{on}$ mit mittlerem Versorgungsstrom $I_{on}$, | |||||
der in einem Zyklus der Periode $T_{cycle}$ auftritt, der Standby-Zustand wir charakterisiert durch | |||||
den Ruhestrom $I_{off}$.\\ | |||||
Mit Ladung $C=\int{I(\tau)d\tau}$ ergibt sich näherungsweise eine Ladungsaufnahme der Schaltung von | |||||
\begin{equation} | |||||
C_{auf}(t) = I_{on}\cdot\frac{t_{on}}{T_{cycle}}\cdot t + I_{off}\cdot t. | |||||
\end{equation} | |||||
Dabei wurden unter den Annahmen $t \gg T_{cycle}$ und $\frac{t_{on}}{T_{cycle}} \ll 1$ einige Vereinfachungen vorgenommen.\\ | |||||
Modelliert man nun den Akku der Kapazität $C_A$ (z.B. \SI{2800}{\milli\ampere{}\hour}) als simple Ladungsquelle, | |||||
die die Schaltung versorgt, bis $C_A$ \glqq aufgebraucht\grqq{} ist, ergibt sich durch Gleichsetzen von | |||||
$C_{auf}(t)$ und $C_A$ eine geschätzte Lebensdauer | |||||
\begin{equation} | |||||
t_L = \frac{C_A}{I_{on}\cdot t_{on}/T_{cycle}+I_{off}}. | |||||
\end{equation} | |||||
Für einen Ruhestrom von $I_{off}=\SI{2}{\micro\ampere}$, eine Aktivzeit $t_{on}=\SI{30}{\second}$, | |||||
$T_{cycle}=\SI{12}{\hour}$, $C_A=\SI{2800}{\milli\ampere{}\hour}$ und | |||||
einen mittleren Versorgungsstrom $I_{on}=\SI{150}{\milli\ampere}$ ergibt sich beispielsweise aus der Abschätzung | |||||
$t_L=\SI{1099}{\day}$. Wird bei den selben Parametern ein Ruhestrom von $I_{off}=\SI{0,2}{\milli\ampere}$ | |||||
angesetzt, drittelt sich die geschätzte Lebensdauer auf ca. \SI{384}{\day}.\\ | |||||
Es ist fragwürdig, ob in der Praxis tatsächlich eine derartig hohe Lebensdauer erreichbar ist, mitunter, | |||||
da kein realistisches Akkumodell verwendet wurde.\\ | |||||
Allerdings ist die hohe Abschätzung der Lebensdauer eine gute Indikation dafür, dass | |||||
die reale Lebensdauer nicht ausschließlich durch den Energieverbrauch der Schaltung sondern durch Eigenschaften | |||||
des Akkus limitiert wird und somit eine weitere Optimierung des Energieverbrauchs nicht unbedingt zu einem | |||||
signifikanten Anstieg der Akkulebensdauer führen würde. Um die Lebensdauer genauer zu bestimmen, ist allerdings | |||||
eine Echtzeitmessung oder die Verwendung eines präzisen Akkumodells erforderlich. | |||||
\subsection{Schaltungstechnische Realisierung des Standbyzustands} | |||||
%+-- | |||||
Der ESP8266 verfügt Hardwareseitig bereits über einen sogenannten \glqq Deep-sleep\grqq{}-Modus [x]. | |||||
% ESP8266 Low Power Solutions V1.5, Espressif | |||||
% https://www.espressif.com/sites/default/files/documentation/9b-esp8266-low_power_solutions__en.pdf | |||||
In diesem Modus wird der Großteil des Mikrocontrollers deaktiviert und damit der Energieverbrauch | |||||
deutlich gesenkt [x, selbe wie vorher]. Mittels der internen Uhr (RTC) des ESP wird der Microcontroller | |||||
in bestimmten Intervallen wieder \glqq geweckt\grqq{} [x, selbe wie vorher]. | |||||
Durch diesen Mechanismus könnte der zuvor beschriebene Energiesparmodus umgesetzt werden. | |||||
Da für dieses Projekt allerdings der ESP8266 nicht einzeln sondern in Form eines Entwicklungsboards | |||||
mit zusätzlicher Peripherie (z.B. Spannungswandler und USB zu UART Wandler) verwendet wird und | |||||
auch im Arbeitspunkt der IR-Empfängerschaltung ein geringer Strom fließt, würde | |||||
der Deep-sleep-Modus zwar den Energieverbrauch des ESP reduzieren, alle weiteren Komponenten wären | |||||
davon allerdings nicht betroffen. Wie die Lebensdauerabschätzung im vorherigen Abschnitt zeigt, ist | |||||
ein Standbystrom im Microamperebereich wünschenswert, daher ist der Deep-sleep-Modus für diesen Zweck | |||||
nicht ausreichend.\\ | |||||
Eine alternative Lösung, die im Rahmen dieses Projekts gewählt wurde, ist im Standbyzustand die | |||||
Energieversorgung der kompletten Schaltung zu unterbrechen.\\ | |||||
Dafür wird mittels eines p-MOSFET ein high-side Schalter realisiert, der die Versorgungsspannung | |||||
vom BMS-Board zum Empfänger schaltet. Der MOSFET wird angesteuert durch eine externe Echtzeituhr | |||||
(RTC) vom Typ DS3231 [x]. | |||||
% https://datasheets.maximintegrated.com/en/ds/DS3231.pdf | |||||
Die DS3231 liefert via I\textsuperscript{2}C-Schnittstelle nach einmaliger Konfiguration fortlaufend | |||||
das aktuelle Datum und die aktuelle Uhrzeit. Die RTC wird dabei von einer Lithium-Knopfzelle versorgt | |||||
und ist damit in ihrer Funktion unabhängig von einer externen Spannungsversorgung. Die für dieses Projekt | |||||
wichtigste Funktion der DS3231 sind die zwei programmierbaren Alarme der RTC.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=0.5\linewidth]{img/power_schema.PNG} | |||||
\caption{Schematische Darstellung der geschalteten Energieversorgung.} | |||||
\label{fig:power_schema} | |||||
} | |||||
\end{figure} | |||||
Mittels I\textsuperscript{2}C können in den Registern der RTC zwei Alarme dazu programmiert werden, in | |||||
bestimmten Intervallen (minütlich, stündlich, täglich, ...) den $\overline{\mbox{INT}}$-Pin der RTC | |||||
auf Masse zu ziehen [x, selbe wie vorher]. Dabei ist sehr hilfreich, dass die Alarmsignale selbsthaltend sind, | |||||
d.h. wird ein Alarm ausgelöst bleibt $\overline{\mbox{INT}}$ auf Masse gezogen, bis via | |||||
I\textsuperscript{2}C das jeweilige Alarmflag (A1E bzw. A2E) in den RTC-Registern zurückgesetzt wird [x, selbe wie vorher].\\ | |||||
Das Signal eignet sich also direkt zum Schalten der Energieversorgung der Empfängerschaltung. | |||||
Weiterhin handelt es sich bei dem $\overline{\mbox{INT}}$-Pin um einen open-drain Ausgang, d.h. der Pin | |||||
muss mit einem externen Pull-Up-Widerstand beschaltet werden [x, selbe wie vorher], der die high-Spannung des | |||||
Signals vorgibt. Damit bietet sich das Signal zum Steuern des p-MOSFET sehr an, da durch einen | |||||
Pull-Up auf die Sourcespannung des MOSFET der p-MOSFET korrekt durch das Signal geschaltet wird.\\ | |||||
In der praktischen Erprobung der Schaltung hat sich gezeigt, dass teils beim Ausschalten Glitches | |||||
auftreten können, bei denen die Versorgung nicht vollständig ausgeschaltet wird, sondern die Spannung | |||||
am Drain des MOSFET (die nahe \SI{0}{\volt} liegen sollte) bei beispielsweise \SI{1,6}{\volt} hängen | |||||
bleibt und der Ausschaltvorgang somit fehlschlägt. Um ein sicheres Ausschalten zu gewährleisten, | |||||
wurde zwischen das $\overline{\mbox{INT}}$-Signal der RTC mit Pull-Up und den MOSFET ein Spannungspuffer | |||||
geschaltet (realisiert durch zwei nacheinander geschaltete NAND-Gatter aus einem CD4011B IC, | |||||
Schaltung siehe Abschnitt \ref{sec:schematic}).\\ | |||||
Nach dieser Änderung konnten keine Glitches mehr festgestellt werden.\\ | |||||
Als p-MOSFET wurde ein NX2301P gewählt [x]. | |||||
% https://assets.nexperia.com/documents/data-sheet/NX2301P.pdf | |||||
Das wichtigste Auswahlkriterium für den MOSFET war in dieser Funktion ein betragsmäßig ausreichend | |||||
geringes $V_{GS}$ um den MOSFET einzuschalten. Dem Datenblatt lässt sich bei | |||||
$V_{GS}=\SI{-1.8}{\volt}$ ein maximales $R_{DSon}$ von \SI{270}{\milli\ohm} entnehmen. Dieser | |||||
$R_{DSon}$-Wert ist für den Aktivzustand der Schaltung völlig ausreichend - bei einer Stromaufnahme | |||||
von \SI{150}{\milli\ampere} fallen über dem MOSFET maximal \SI{41}{\milli\volt} ab, der Leistungsverlust | |||||
über dem MOSFET liegt im einstelligen Milliwattbereich. Die Gate-Source Spannung | |||||
von \SI{-1.8}{\volt} ist ebenfalls komfortabel erreichbar, bei einer Akkuspannung von \SI{3}{\volt} | |||||
wird ein $V_{GS}$ von knapp \SI{-3}{\volt} im Aktivzustand erreicht. | |||||
\FloatBarrier | |||||
\subsection{Messtechnische Überprüfung des Energieverbrauchs} | |||||
%--- | |||||
Zur messtechnischen Überprüfung des Energieverbrauchs wurde zunächst das BMS-Board mit \SI{3,7}{\volt} | |||||
versorgt und die Stromaufnahme ohne angeschlossene Last bestimmt. Es konnte ein Wert von ca. | |||||
\SI{0,33}{\milli\ampere} gemessen werden. Wie bereits bei der Abschätzung der Akkulebensdauer festgestellt | |||||
wurde, handelt es sich hierbei um einen relativ hohen Standbyverbrauch. Es ist eine naheliegende Vermutung, | |||||
dass dieser Stromverbrauch ohne Last durch den DC-DC Step-Up Konverter auf dem BMS-Board verursacht wird, | |||||
der die \SI{5}{\volt} Ausgangsspannung des Boards generiert.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.7\linewidth]{img/bms_board.jpg} | |||||
\caption{Die Rückseite des BMS-Boards. Rot markiert der Step-Up Konverter.} | |||||
\label{fig:bms_backside} | |||||
} | |||||
\end{figure} | |||||
Durch Position der Induktivität und Nachschlagen der IC-Nummern konnte U7 (s. Abb. \ref{fig:bms_backside}) | |||||
als Step-Up Konverter des Typs FP6298 identifiziert werden. Durch Entfernen des Step-Up ICs von der Platine | |||||
konnte die Stromaufnahme des BMS-Boards ohne angeschlossene Last auf unter \SI{0,2}{\micro\ampere} | |||||
reduziert werden. Durch diese Modifikation geht selbstverständlich der \SI{5}{\volt} Ausgang des BMS-Boards | |||||
verloren, stattdessen steht maximal die Zellspannung zur Verfügung. Das stellt allerdings kein Problem | |||||
dar, da experimentell festgestellt wurde, dass eine Versorgungsspannung im Bereich von \SI{3}{\volt} | |||||
bis \SI{3,7}{\volt} für den Betrieb der Empfängerschaltung ausreichend ist. Betrachtet man die | |||||
Entladecharakteristik eines typischen 18650 Lithium-Ionen Akkus (s. Abb. \ref{fig:liion_discharge}), | |||||
ist ersichtlich, dass in diesem | |||||
Spannungsbereich der größte Teil der Akkuladung ausgenutzt werden kann.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.7\linewidth]{img/discharge_curve.PNG} | |||||
\caption{Entladekurve eines 18650 Lithium-Ionen Akkus [x].} | |||||
% https://b2b-api.panasonic.eu/file_stream/pids/fileversion/3447 | |||||
\label{fig:liion_discharge} | |||||
} | |||||
\end{figure} | |||||
Anschließend wurde der Energieverbrauch der vollständigen Empfängerschaltung zusammen mit dem | |||||
BMS-Board charakterisiert. Dafür wurden erneut \SI{3,7}{\volt} an den Zellanschlüssen des BMS-Boards | |||||
eingespeist und der Stromfluss am Zellanschluss gemessen.\\ | |||||
Es konnte im Aktivzustand ein mittlerer Stromverbrauch von ca. \SI{150}{\milli\ampere} und im | |||||
Standbyzustand ein Stromverbrauch zwischen \SI{0,3}{\micro\ampere} und \SI{1,5}{\micro\ampere} | |||||
gemessen werden. Mit der Abschätzung aus Abschnitt \ref{sec:lifetime_approx} ergibt sich mit diesen | |||||
Werten bei $t_{on}=\SI{30}{\second}$, $T_{cycle}=\SI{12}{\hour}$ und $C_A=\SI{2800}{\milli\ampere{}\hour}$ | |||||
eine geschätzte Lebensdauer von $t_L\approx\SI{1104}{\day}$. Während die reale Akkulebensdauer | |||||
sicherlich deutlich geringer ausfallen wird, lässt dieser hohe Wert vermuten, dass Verbraucherseitig | |||||
die Voraussetzungen für eine hohe Akkulebensdauer erfüllt sind. | |||||
\FloatBarrier | |||||
\section{Platine} | |||||
%--- | |||||
% Julian ~ 1-2 Seiten | |||||
Um alle benötigten Komponenten sicher miteinander zu verbinden haben wir uns dazu entschlossen, eine eigene Platine zu entwerfen. Ein Aufbau auf einer Lochrasterplatine hätte sicherlich auch funktioniert, dies wäre bei der Anzahl der Komponenten und deren Größe, wie z.B. dem Microcontroller oder den NAND-Gates, sehr unübersichtlich geworden. Außerdem konnten die verschiedenen Konfigurationsmöglichkeiten so leichter implementiert und beschriftet werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\linewidth]{img/platine_rendering.png} | |||||
\caption{3D-Rendering der Platine in Altium.} | |||||
\label{fig:pcb_rendering} | |||||
} | |||||
\end{figure} | |||||
Wie bereits im vorherigen Kapitel beschrieben kam es zu Glitches beim Abschalten des pMOSFET. Um sowohl die Möglichkeit des direkten Abschaltens, als auch des gepufferten Abschaltens zu haben, wurden Lötbrücken platziert, womit ohne besonders viel Aufwand die Konfiguration geändert werden kann. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\linewidth]{img/pcb_sb1_sb2.png} | |||||
\caption{Lötbrücke 1 und 2 für Abschaltung mit oder ohne Puffer.} | |||||
\label{fig:pcb_sb1_sb2} | |||||
} | |||||
\end{figure} | |||||
Des Weiteren wurde eine Lotbrücke platziert um die RTC im aktiven Zustand aus dem Akku zu speisen. Damit wird vermieden, dass die Knopfzelle zu schnell entleert wird. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.5\textheight]{img/pcb_sb3.png} | |||||
\caption{Lötbrücke 3 für Versorgung der RTC per Akku.} | |||||
\label{fig:pcb_sb3} | |||||
} | |||||
\end{figure} | |||||
Außerdem wurde beim Testen entdeckt, dass der Stromzähler des Herstellers \glqq Landis+Gyr\grqq bereits ein invertiertes Signal sendet. Da der Stromzähler, an dem der Empfänger letzten Endes betrieben wird, nicht getestet werden konnte, wurden hierfür Jumper eingebaut, womit die Inverterstufe im Empfangspfad sehr leicht aktiviert oder deaktiviert werden kann. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/pcb_jumper.png} | |||||
\caption{Jumper zum Aktivieren und Deaktivieren der Inverterstufe.} | |||||
\label{fig:pcb_jumper} | |||||
} | |||||
\end{figure} | |||||
%TODO Bildgrößen und Platzierung anpassen | |||||
\FloatBarrier | |||||
\section{Software} | |||||
%--- | |||||
Das komplette Programm sowohl für den Empfänger als auch für den Teststand sind im Anhang zu finden. | |||||
% TODO Macht das Sinn? Schickt man sowas einfach nur per Mail mit? Wie machen wir das? | |||||
% Julian ~ 6-8 Seiten | |||||
\subsection{Programmablauf} | |||||
%--- | |||||
Der ESP wurde mit der Arduino IDE programmiert. Diese ermöglicht den Zugang zu beliebiger Hardware, solange der korrekte Treiber installiert ist und es eine Anbindung an die Arduino IDE gibt. Als Schnittstelle gibt es eine setup()-Funktion, welche einmalig zu Beginn des Programms abgearbeitet wird und eine loop()-Funktion, welche nach dem Setup zyklisch als Endlosschleife abläuft. | |||||
Im Setup werden zuerst einzelne Pins initialisiert, danach wird die serielle Kommunikation gestartet, woraufhin die Verbindung zum WLAN hergestellt wird. Ist dies erfolgreich, versucht der ESP als nächstes sich mit dem MQTT-Broker zu verbinden. Sobald auch das geklappt hat ist die Initialisierung beendet. Sollte jedoch keine Verbindung zum WLAN oder dem MQTT-Broker hergestellt werden können wird nach einer bestimmten Zeit das Ausschalten initialisiert. | |||||
\subsection{RTC} | |||||
%--- | |||||
Die Spannungsversorgung des Microcontrollers wird von der RTC gesteuert. Diese arbeitet mit internen Alarmen und schaltet den INT-Pin (low-aktiv), sobald ein aktiver Alarm abgelaufen ist. Danach bleibt sie aktiv, bis über $I^2C$ der Befehl zum Ausschalten gesendet wird. Dies geschieht, indem der Microcontroller nach Ablauf seines Programms im Control-Register der RTC die Flags für die Alarme zurücksetzt. Sobald das passiert ist, setzt die RTC den INT-Pin zurück und unterbricht damit die Stromversorgung für den ESP. Nach Ablaufen des Alarms beginnt dieser Zyklus von neuem. | |||||
\subsection{WifiManager} | |||||
%--- | |||||
Kernanforderung des Projekts war die drahtlose Kommunikation zwischen Empfänger und Smart-Home-Controller. Da uns aus ersichtlichen Gründen jedoch zur Projektlaufzeit die Zugangsdaten zum endgültigen WLAN nicht zur Verfügung standen war es nötig, dem Bediener die Möglichkeit zu geben, eine gültige WLAN Konfiguration an den Microcontroller zu übermitteln, ohne ihn dafür jedes Mal neu flashen zu müssen. Diese Funktionalität gibt es bereits schon in Form einer Bibliothek mit dem Namen WifiManager [x]. | |||||
% https://github.com/tzapu/WiFiManager | |||||
Mit Hilfe der Bibliothek startet der Microcontroller im Station-Mode und versucht, sich mit ggf. vorher gespeicherten Zugangsdaten anzumelden. Gelingt dies nicht oder ist noch keine Konfiguration hinterlegt, wechselt der ESP in Access-Point-Mode und startet einen eigenen Webserver. Nun kann sich der Bediener mit jedem beliebigen, WLAN-fähigen Gerät am WLAN des ESP anmelden und wird zu einer Anmeldeseite weitergeleitet, wo nun eine WLAN Zugangsdaten eingegeben werden können. Sobald sich der ESP erfolgreich mit dem angegebenen Netzwerk verbunden hat wird der Programmablauf fortgesetzt. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=0.5\textwidth]{img/wifimgr_loginpage.png} | |||||
\caption{Anmeldeseite des WifiManager aus Sicht des Bedieners.} | |||||
\label{fig:wifi_manager} | |||||
} | |||||
\end{figure} | |||||
Zwar bietet die Bibliothek auch Felder für MQTT-Broker IP und Port an, dies hat jedoch zum Zeitpunkt des Projekts nicht zuverlässig funktioniert und wurde deshalb aus dem Programm entfernt. Sollte die Bibliothek dahingehend verbessert werden würde es Sinn machen, dieses Feature nachzurüsten, um nicht jedes Mal den Microcontroller flashen zu müssen wenn ein anderer MQTT-Broker verwendet wird. Da dem Broker, welcher in diesem Fall ein Raspberry Pi ist, entweder in der internen Konfiguration des Raspberry Pi eine statische bzw. über den Router immer dieselbe IP zugewiesen werden kann und das Gerät nicht für wechselnde Broker gedacht ist, kann auf dieses Feature aber auch verzichtet werden. Ersatzweise ist die IP im Programm hardkodiert. | |||||
\subsection{Einlesen der SML-Daten} | |||||
%--- | |||||
Hauptauftrag der Software ist das erfolgreiche Einlesen und Verarbeiten der eingehenden Daten. Da die serielle Schnittstelle des ESP genutzt wird kann dafür auch die Standardbibliothek von Arduino zum Einlesen serieller Daten genutzt werden. Sobald Daten verfügbar sind werden diese in einen internem Buffer, ein Int-Array der Länge 1000, gespeichert. Danach wird dieser Buffer auf bestimmte Zeichenfolgen untersucht. Da die Daten per SML kodiert sind muss auf eine bestimmte Zeichenfolge aus dem SML-Protokoll getriggert werden, hierbei wurde sich auf die OBIS-Kennzahl 1.8.0 (vgl. \ref{SML spec}) konzentriert. | |||||
% TODO Code so formattieren dass kein Overflow passiert, ggf Kommentare in eigene Zeile | |||||
% TODO In Endfassung schauen dass Code auf EINER Seite ist | |||||
\begin{verbatim} | |||||
// Daten von Stromzähler: Gesamtverbrauch herausfiltern | |||||
if ( /* OBIS Kennung: 1-0.1.8.0*255 = 01 00 01 08 00 FF */ | |||||
BUFFER[j] == 0x77 && /* 77 - SML_Message.messageBody.SML_GetList_Reponse.valList.valListEntry (Sequence) */ | |||||
BUFFER[j+1] == 0x07 && /* 07 - objName (TL[1] + octet-string[6] */ | |||||
BUFFER[j+2] == 0x01 && /* 01 - objName Teil A */ | |||||
BUFFER[j+3] == 0x00 && /* 00 - objName Teil B */ | |||||
BUFFER[j+4] == 0x01 && /* 01 - objName Teil C */ | |||||
BUFFER[j+5] == 0x08 && /* 08 - objName Teil D */ | |||||
BUFFER[j+6] == 0x00 && /* 00 - objName Teil E */ | |||||
BUFFER[j+7] == 0xFF) /* FF - objName Teil F */ | |||||
/* xx - status */ | |||||
/* xx - valTime */ | |||||
/* xx - unit */ | |||||
/* xx - scaler */ | |||||
\end{verbatim} | |||||
Nun kann es auch passieren dass der ESP genau dann hochfährt, wenn gerade ein SML Paket verschickt wurde, der relevante Teil aber bereits gesendet wurde und für den ESP verloren ist. In diesem Fall darf der ESP nach dem Einlesen der Daten nicht sofort heruntergefahren werden, sondern es muss auf das nächste Paket gewartet werden, welches den Gesamtverbrauch beinhaltet. | |||||
Der Gesamtverbrauch hat eine Auflösung von 0,1Wh und ist als Type-Length-Field kodiert. Dieses TL-Feld definiert die Bedeutung des aktuellen und der folgenden Bytes. | |||||
Aus dem Datenblatt des Stromzählers lässt sich schließen, dass es sich dabei um eine 64-Bit große vorzeichenbehaftete Festpunktzahl (Integer) handelt, was sich zu \glqq0x59h\grqq kodiert. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/typelengthfield.png} | |||||
\caption{Type-Length-Field Definition aus [x, siehe unter Abbildung} | |||||
\label{fig:typelengthfield} | |||||
} | |||||
\end{figure} | |||||
% Diese Quelle wird bereits unter 1.3.1 schon mal verwendet! | |||||
% Punkt 7.1: https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR03109/TR-03109-1_Anlage_Feinspezifikation_Drahtgebundene_LMN-Schnittstelle_Teilb.pdf?__blob=publicationFile&v=1, | |||||
Als nächstes müssen die Bytes aus dem Buffer zur eigentlichen Zahl zusammengesetzt werden: | |||||
\begin{verbatim} | |||||
// mWh aus Buffer rekonstruieren | |||||
long long mWh = ((long long)BUFFER[j+1]) << 56 | ((long long)BUFFER[j+2]) << 48 | | |||||
((long long)BUFFER[j+3]) << 40 | ((long long)BUFFER[j+4]) << 32 | | |||||
((long long)BUFFER[j+5]) << 24 | ((long long)BUFFER[j+6]) << 16 | | |||||
((long long)BUFFER[j+7]) << 8 | ((long long)BUFFER[j+8]); | |||||
\end{verbatim} | |||||
Abschließend wird diese Zahl in kWh umgerechnet und dieser Messwert an den MQTT-Broker gesendet. | |||||
\subsection{MQTT} | |||||
%--- | |||||
MQTT (=Message Queuing Telemetry Transport [x]) % https://mqtt.org/ | |||||
ist ein Nachrichtenprotokoll zur Vernetzung von IoT-Geräten und funktioniert nach einem Client-Server Modell. Die Clients können Daten versenden, indem sie eine Nachricht in einem Topic an den Broker senden. Auf der anderen Seite können Daten empfangen werden, indem Topics abonniert werden. Das besondere dabei ist, dass Clients Anfragen und Daten ausschließlich über den MQTT-Broker erhalten, welcher den Datenstrom verwaltet. Im Fall dieser Projektarbeit ist der ESP ein MQTT-Client, welcher den Gesamtverbrauch an das Topic \glqq smartmeter\grqq sendet. Der Raspberry Pi ist in diesem Fall der MQTT-Broker. | |||||
Da MQTT bereits weit verbreitet ist und besonders für IoT-Geräte bereits ausreichend Implementierungen vorhanden sind wurde hier auf eine bereits bestehende Lösung zurückgegriffen. Dafür wurde die Bibliothek \glqq PubSubClient\grqq verwendet, welche eine einfache Implementation bereitstellt. Für Details sei an dieser Stelle auf die GitHub-Seite verwiesen. [x] | |||||
% https://github.com/knolleary/pubsubclient | |||||
\subsection{NodeRed und Datenbank} | |||||
%--- | |||||
Die Daten aus dem MQTT-Paket werden in einer MySQL-Datenbank auf dem Raspberry Pi gespeichert. Der genaue Aufbau dieser Datenbank wird weiter unten im Kapitel \ref{anleitung} beschrieben. | |||||
Um die Daten vom ESP in der Datenbank abzuspeichern wird ein NodeRed-Flow verwendet. Um die Zuverlässigkeit der Daten zu erhöhen wird vor dem Einfügen in die Tabelle eine Plausibilitätsprüfung durchgeführt, da Tests ergeben haben dass unvollständige Datensätze vom Stromzähler zu unplausiblen Messwerten führen können. Deshalb wird ein neuer Messwert zuerst mit dem letzten Messwert verglichen. Der neue Wert wird nur dann in der Datenbank gespeichert wenn er größer und höchstens doppelt so groß ist wie der letzte Wert (in den Tests wurden in seltenen Fällen fälschlicherweise Nullwerte oder extrem hohe Werte bemerkt). | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/nodered-flow.png} | |||||
\caption{NodeRed-Flow zum Speichern und Anzeigen des Messwertes} | |||||
\label{fig:nodered-flow} | |||||
} | |||||
\end{figure} | |||||
Abschließend wird der Wert auf einem Dashboard angezeigt. Dieses wurde bewusst simpel gehalten, da Herr Prof. Klehn hier eigene Ideen umsetzen möchte. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/nodered_dashboard.png} | |||||
\caption{NodeRed-Dasboard zum Anzeigen des letzten Messwerts} | |||||
\label{fig:nodered_dashboard} | |||||
} | |||||
\end{figure} | |||||
% TODO Eventuell was dazu sagen wie ein Dashboard gebaut wird, ist aber eher Fülltext falls nötig | |||||
\section{Gehäuse} | |||||
%+-- | |||||
Für den Empfängeraufbau aus BMS-Board, Platine, Photodiode, Ein- und Resetschalter wurde ein | |||||
3D-Druckgehäuse gezeichnet und gedruckt.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.9\linewidth]{img/case_cad.PNG} | |||||
\caption{CAD-Schnittbild des Gehäuses. Modellquelle BMS-Board: [x].} | |||||
% https://cad.grabcad.com/library/wemos-18650-battery-shield-v3-1 | |||||
\label{fig:cad_case} | |||||
} | |||||
\end{figure} | |||||
Das Gehäuse kann mit einem Deckel verschlossen werden, der durch vier Schrauben befestigt wird. | |||||
Die Platine und das BMS-Board werden durch metrische Distanzbolzen im Gehäuse und aneinander befestigt. | |||||
Sämtliche Gewinde im gedruckten Material werden durch metallische Gewindeeinsätze realisiert.\\ | |||||
Für die Photodiode befindet sich im Boden des Gehäuses eine Durchführung in die die Diode eingepresst wird. | |||||
An die Außenseite der Durchführung ist ein Ringmagnet montiert, der den Empfängeraufbau an die magnetische | |||||
Fläche des Stromzählers fixiert. | |||||
% ToDo (Julian) hier wären 1-2 Bilder vom fertigen Gehäuse cool bzw. falls du die bei Anleitung | |||||
% o.Ä. hast (z.B. wegen Resetschalter) einfach ein kurzer Verweis auf die. Ich hab leider nur | |||||
% Bilder im halb fertigen Zustand. | |||||
\FloatBarrier | |||||
\section{Teststrecke} | |||||
% Kathi ~ 2 Seiten | |||||
%--- | |||||
Wie bereits erwähnt wurde zum Testen der Funktion eine kleine Teststrecke aufgebaut, mit der es möglich | |||||
ist die Übertragung ohne den Stromzähler zu simulieren. | |||||
\subsection{Aufbau} | |||||
%--- | |||||
Zunächst wurde die Test | |||||
\subsection{Funktion} | |||||
%--- | |||||
\subsection{Erkenntnisse} | |||||
%--- | |||||
\chapter{Anleitung} \label{anleitung} | |||||
%--- | |||||
% Julian ~ 4-5 Seiten | |||||
\section{Raspberry Pi} | |||||
%--- | |||||
Config und alles pipapo um Raspi komplett einzurichten | |||||
PLUS das was Klehn zusätzlich machen muss für unseren Teil | |||||
\subsection{Betriebssystem} | |||||
%--- | |||||
\subsection{Installation MQTT} | |||||
%--- | |||||
\subsection{NodeRed} | |||||
%--- | |||||
\subsection{Datebank} | |||||
%--- | |||||
\section{ESP8266} | |||||
%--- | |||||
Wifi Manager undso in der praktischen Anwendung nochmal erklären | |||||
Bilder WifiMgr etc blabla | |||||
Jumper Inverter | |||||
\section{Testaufbau} | |||||
%--- | |||||
Erklärung shield, putty, evtl. arduino Include | |||||
+Fotos | |||||
% ab hier alles Kathi: | |||||
\chapter{Fazit} | |||||
%--- | |||||
\part{Anhang} | |||||
\section{Schaltplan}\label{sec:schematic} | |||||
\begin{figure}[!h] \centering{ | |||||
\includegraphics[angle=90,scale=0.7]{schematic.pdf}} | |||||
\end{figure} | |||||
\chapter{Literaturverzeichnis} | |||||
\bibliography{Literatur} | |||||
\part{Danksagung} | |||||
\end{document} |
\documentclass[a4paper,12pt]{scrreprt} %Dokument Einstellungen: Papierformat, Schriftgröße, Art des Dokuments (scr für Deutsch) | |||||
% ============= Packages ============= | |||||
\usepackage[utf8]{inputenc} %Sonderzeichen, Umlaute | |||||
\usepackage[left= 3cm,right = 2cm, bottom = 4 cm]{geometry} %Anpassung Seitenränder | |||||
\usepackage[onehalfspacing]{setspace} %Zeilenabstand anpassen | |||||
\usepackage[ngerman]{babel} %Sprache z.B. für Worttrennungen | |||||
\usepackage[T1]{fontenc} %Schrift | |||||
\usepackage{amsmath} %Mathe package | |||||
\usepackage{mathpazo} %Schriftart | |||||
\usepackage{graphicx} %Bilder einfügen | |||||
\usepackage{fancyhdr} %Angepasste Kopf- und Fußzeile | |||||
\usepackage{siunitx} %Chillige Einheiten | |||||
\usepackage{placeins} %Bilder daran hindern sonstwo zu landen | |||||
\usepackage{microtype} %Typesetting schöner | |||||
\usepackage[hidelinks]{hyperref} %Klickbare Verweise | |||||
\usepackage{listings} % code highlighting | |||||
% ============= Kopf- und Fußzeile ============= | |||||
\pagestyle{fancy} | |||||
% | |||||
\lhead{\includegraphics[height=24pt]{"TH_Logo.jpeg"}} | |||||
\chead{} | |||||
\rhead{\slshape \leftmark} | |||||
%% | |||||
\lfoot{} | |||||
\cfoot{\thepage} | |||||
\rfoot{} | |||||
%% | |||||
\renewcommand{\headrulewidth}{0.4pt} | |||||
\renewcommand{\footrulewidth}{0pt} | |||||
% ============= Dokument Beschreibung ============= | |||||
\title{Projektarbeit} | |||||
\author{Katharina Steib\thanks{TH Nürnberg} | |||||
\and Simon Kocher\footnotemark[1] | |||||
\and Julian Rico Birner\footnotemark[1]} | |||||
\date{heute} | |||||
% ============= Einstellungen ============= | |||||
\setcounter{tocdepth}{5} %Erweiterung des Inhalstverzeichnisses um eine weiter Ebene | |||||
\setcounter{secnumdepth}{5} %Erweiterug der Kapiteltiefe um eine weitere Ebene | |||||
\bibliographystyle{unsrt} %Zitationsstil | |||||
\sisetup{output-decimal-marker = {,}} % Komma statt . bei \SI{...} | |||||
% ============= Dokumentbeginn ============= | |||||
% ========================================== | |||||
\begin{document} | |||||
\begin{titlepage} % Suppresses displaying the page number on the title page and the subsequent page counts as page 1 | |||||
\newcommand{\HRule}{\rule{\linewidth}{0.5mm}} % Defines a new command for horizontal lines, change thickness here | |||||
\center % Centre everything on the page | |||||
%------------------------------------------------ | |||||
% Headings | |||||
%------------------------------------------------ | |||||
\textsc{\LARGE | |||||
\begin{figure} | |||||
\begin{center} | |||||
\includegraphics[scale=1]{"TH_Logo.jpeg"} | |||||
\end{center} | |||||
\end{figure} | |||||
}\\[0.5cm] % Main heading such as the name of your university/college | |||||
\textsc{\Large Projektarbeit}\\[0.5cm] % Major heading such as course name | |||||
\textsc{\large Elektro- und Informationstechnik}\\[0.5cm] % Minor heading such as course title | |||||
%------------------------------------------------ | |||||
% Title | |||||
%------------------------------------------------ | |||||
\HRule\\[0.4cm] | |||||
{\huge\bfseries Entwicklung eines IR-Empfängers für einen Stromzähler}\\[0.4cm] % Title of your document | |||||
\HRule\\[1.5cm] | |||||
%------------------------------------------------ | |||||
% Author(s) | |||||
%------------------------------------------------ | |||||
\begin{minipage}{0.4\textwidth} | |||||
\begin{flushleft} | |||||
\large | |||||
\textit{Autoren} | |||||
\\ Katharina \textsc{Steib} % Your name | |||||
\\ Simon \textsc{Kocher} %Your friends name | |||||
\\ Julian \textsc{Rico Birner} %Your other friends name | |||||
\end{flushleft} | |||||
\end{minipage} | |||||
~ | |||||
\begin{minipage}{0.4\textwidth} | |||||
\begin{flushright} | |||||
\large | |||||
\textit{Betreuer}\\ | |||||
Bernd \textsc{Klehn} % Supervisor's name | |||||
\end{flushright} | |||||
\end{minipage} | |||||
% If you don't want a supervisor, uncomment the two lines below and comment the code above | |||||
%{\large\textit{Author}}\\ | |||||
%John \textsc{Smith} % Your name | |||||
%------------------------------------------------ | |||||
% Date | |||||
%------------------------------------------------ | |||||
\vfill\vfill\vfill % Position the date 3/4 down the remaining page | |||||
{\large\today} % Date, change the \today to a set date if you want to be precise | |||||
%------------------------------------------------ | |||||
% Logo | |||||
%------------------------------------------------ | |||||
%\vfill\vfill | |||||
%\includegraphics[width=0.2\textwidth]{placeholder.jpg}\\[1cm] % Include a department/university logo - this will require the graphicx package | |||||
%---------------------------------------------------------------------------------------- | |||||
\vfill % Push the date up 1/4 of the remaining page | |||||
\begin{center} | |||||
steibka77404@th-nuernberg.de (3264785) | |||||
\\ kochersi74936@th-nuernberg.de(3254887) | |||||
\\ ricobirnerju74691@th-nuernberg.de(3273163) | |||||
\end{center} | |||||
\end{titlepage} | |||||
%\maketitle %Erstellt Titelseite | |||||
\tableofcontents % Erstellt Inhaltsverzeichnis | |||||
\part{Hauptteil} | |||||
\chapter{Einleitung} | |||||
%++- | |||||
% Kathi 1,5 Seiten | |||||
Durch die Corona-Pandemie ist der Stromverbrauch in Deutschland im Jahr 2020 um rund 4,4 Prozent im Vergleich | |||||
zum Vorjahr gesunken, was einer Einsparung von 25 TWh entspricht. Dieses Phänomen lässt sich besonders auf den | |||||
Lockdown-bedingten Konjunktureinbruch zurück führen. Trotz des Rückgangs ist aber noch viel Luft nach oben. | |||||
Laut dem Stromspiegel 2019 verschwendeten die privaten Haushalte in Deutschland Strom im Wert von 9 Mrd. Euro.\\ | |||||
Viele Deutsche wissen gar nicht wie hoch ihr Stromverbrauch eigentlich ist und ob dieser über oder | |||||
unterdurchschnittlich ist. Zum Vergleich kann der durchschnittliche Stromverbrauch einer Familie von | |||||
4250 kWh / Jahr heran gezogen werden. Den eigenen Stromverbrauch zu ermitteln und im besten Fall auch entsprechend | |||||
zu regulieren ist schon schwieriger. Zwar findet man im Internet zahlreiche Seiten die anhand verschiedener Angaben | |||||
den Verbrauch abschätzen, jedoch handelt es sich dabei lediglich um eine grobe Näherung.\\ \\ | |||||
Im Zuger der Digitalisierung verfügen immer mehr Haushalte über ein Smart Home System. Dabei handelt es sich | |||||
eigentlich um einen Überbegriff der verschiedene Verfahren vereint, die mit automatisierbaren Abläufen das Leben | |||||
in Bezug auf den Wohnraum vereinfachen sollen. Bekannte Beispiele sind das Regeln der Heizung auch von Unterwegs, | |||||
das an und ausschalten verschiedener Geräte oder Lampen ohne zum Schalter gehen zu müssen oder auch das Öffnen | |||||
und Schließen von Fenstern und Rollläden. Dabei können die Geräte sowohl über eine Programmierschnittstelle zu | |||||
bestimmten Zeiten und/oder Bedingungen geschaltet werden als auch bequem per App vom Smartphone. | |||||
Das Zuhause wird also sowohl intelligenter als auch bequemer für seine Bewohner.\\ | |||||
Ein solches Smart Home System eignet sich auch zur genauen Stromerfassung und Regulierung besonders gut. | |||||
Der Verbraucher kann nicht nur genaue Daten ablesen sondern auch gezielt daran arbeiten seinen Stromverbrauch mit | |||||
speziell auf ihn angepassten Einstellungen zu minimieren. | |||||
Leider ist die Installation eines solchen Systhems oftmals mit einem hohen Aufwand und hohen | |||||
Kosten verbunden, da meist viele bereits vorhandene Teile ausgetauscht werden müssen. Auch die Kosten für die | |||||
Installation und Einrichtung sind nicht unerheblich.\\ \\ | |||||
In diesem Projekt wurde an einer möglichst Benutzerfreundlichen, kostengünstigen und einfachen Lösung gearbeitet | |||||
mit der man ein Stromzähler zu Hause selbst visualisieren kann. Dabei ist hervor zu heben, dass das Entwickelte | |||||
Gerät an den bereits vorhandenen Stromzähler ergänzt wird und somit kein Austausch von Geräten nötig ist.\\ | |||||
Der folgende Bericht wurde zur besseren Übersicht in zwei Teile unterteilt. | |||||
Im ersten Teil werden die Technischen Hintergründe und Funktionen erläutert. | |||||
Der zweite Teil soll hierbei als eine Art Benutzerhandbuch zur Anleitung dienen.\\ | |||||
\chapter{Konzept} | |||||
%+-- | |||||
% Simon ~1,5 Seiten | |||||
Im Folgenden wird zunächst auf die Aufgabenstellung eingegangen und anschließend ein Lösungsansatz schematisch erläutert. | |||||
\section{Soll-Ist-Analyse} | |||||
%+-- | |||||
Gegeben ist ein Stromzähler des Typen \glqq eHZ Generation K\grqq{} der Firma EMH metering GmbH \& Co. KG [x]. | |||||
% https://emh-metering.com/produkte/haushaltszaehler-smart-meter/ehz-k/ | |||||
Der Zähler verfügt über mehrere Infrarotschnittstellen zur Datenübertragung [x]. | |||||
% https://emh-metering.com/wp-content/uploads/2021/08/eHZ-K-DAB-D-1.10.pdf | |||||
Es soll ein Empfänger für die Zählerstände, die über diese Schnittstellen übertragen werden entwickelt | |||||
werden. Der Empfänger soll in sinnvollen Intervallen (z.B. zweimal pro Tag) den Zählerstand ermitteln | |||||
und an einen bestehenden Smart-Home-Controller in Form eines Raspberry Pi übermitteln.\\ | |||||
Der bestehende Controller zeigt bereits vorhandene Daten aus anderer Quelle in einem Dashboard auf | |||||
Basis von Node-RED [x] | |||||
% https://nodered.org/ | |||||
an. Die Zäherstände sollen ebenfalls in Node-RED angezeigt werden.\\ | |||||
Um eine möglichst einfache Installation des Empfängers zu ermöglichen, soll der Empfänger sowohl | |||||
im Hinblick auf die Datenübertragung als auch die Energieversorgung vollständig drahtlos funktionieren.\\ | |||||
Weiterhin soll ein Teststand entwickelt werden, mit dem der Empfänger ohne den Stromzähler auf | |||||
Funktion getestet werden kann. | |||||
\section{Lösungskonzept} | |||||
%+-- | |||||
% Konzept von Simon | |||||
% => Blockschaltbild | |||||
% - Nen Microcontroller+wifi | |||||
% - Iwie Versorgung | |||||
% - iwie Einlesen | |||||
% - Empfangen an Raspi | |||||
% - | |||||
Um eine drahtlose Energieversorgung des Empfängers zu ermöglichen, wird der Empfängeraufbau mit | |||||
einem Akku betrieben. Für den Akku müssen sowohl eine Ladevorrichtung als auch der Akkutechnologie entsprechende | |||||
Schutzschaltungen vorgesehen werden. Der Datenempfang und die Weitergabe an den | |||||
Smart-Home-Controller wird durch einen Microcontroller realisiert. Um auch für die | |||||
Datenübermittlung an den Controller kabellos zu bleiben, wird ein Microcontroller mit | |||||
WiFi-Schnittstelle benötigt. Der Datentransfer zum Smart-Home-Controller kann dabei über das | |||||
MQTT-Protokoll [x] | |||||
% https://mqtt.org/ | |||||
realisiert werden. Für den Empfang der Stromzählerstände muss ein Infrarotempfänger, der kompatibel | |||||
zur IR-Schnittstelle des Zählers ist, entwickelt werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=\linewidth]{img/konzept_bsb.PNG} | |||||
\caption{Schematische Darstellung des Lösungskonzepts.} | |||||
\label{fig:concept_bsb} | |||||
} | |||||
\end{figure} | |||||
Für den Teststand muss ein Infrarotsender entwickelt werden, der die IR-Schnittstelle des Stromzählers | |||||
nachahmt und konfigurierbare Werte als Zählerstand versendet. Hier bietet sich ebenfalls eine Lösung | |||||
mit einem Microcontroller an. | |||||
\FloatBarrier | |||||
\chapter{Implementierung} | |||||
%--- | |||||
% Simon und Julian | |||||
\section{Stromzähler} | |||||
%--- | |||||
% Julian ~ 2 Seiten | |||||
\subsection{Infrarotschnittstellen} | |||||
%+-- | |||||
% @Julian: war glaube ich dir zugeteilt, ich hab mich beim Zähler mal auf das Modell aus | |||||
% https://emh-metering.com/wp-content/uploads/2021/08/eHZ-K-DAB-D-1.10.pdf (Datasheet) | |||||
% bezogen, wär cool wenn du hier kurz erwähnen könntest dass es sowohl die Datenschnittstelle | |||||
% als auch so eine x Impulse/kWh IR-Schnittstelle gibt. | |||||
Wie bereits erwähnt verfügt der Stromzähler über mehrere Infrarotschnittstellen. Dabei ist zwischen der Prüf-LED und den beiden optischen Datenschnittstellen zu unterscheiden. Über die Prüf-LED sendet der Stromzähler 10.000 Impulse pro kWh, vorausgesetzt es wird ein Strom oberhalb der Anlaufschwelle gemessen. Diese Schnittstelle dient jedoch, wie der Name bereits vermuten lässt, primär zur Funktionsprüfung des Zählers. Die beiden Datenschnittstellen hingegen können dazu verwendet werden, umfangreichere Daten auszulesen.\\ Auf der Rückseite des Zählers befindet sich eine bidirektionale Datenschnittstelle, worüber neben dem Auslesen von Zählstanden auch das Setzen und Lesen von Zählerparametern, Fernabfragung oder Prüfung des Zählers möglich ist. Diese Schnittstelle ist jedoch hauptsächlich für den Netzbetreiber gedacht und aus diesem Grund auch mit einer Betriebsplombe versehen. Für den Endkunden zugänglich ist die unidirektionale INFO-Schnittstelle auf der Vorderseite, worüber der gleiche Datensatz empfangen werden kann, aber keine aktive Kommunikation mit dem Messgerät möglich ist [x]. | |||||
% https://emh-metering.com/wp-content/uploads/2020/08/eHZ-K-BIA-D-1-20.pdf (User manual) | |||||
\subsection{SML - Smart Message Language} | |||||
%+-- | |||||
Über beide Datenschnittstellen wird alle paar Sekunden ein Datensatz verschickt, wobei hier zwischen einem reduzierten und einem vollständigen Datensatz gewechselt wird. Beide Datensätze verwenden SML (=Smart Message Language) [x] | |||||
% https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR03109/TR-03109-1_Anlage_Feinspezifikation_Drahtgebundene_LMN-Schnittstelle_Teilb.pdf?__blob=publicationFile | |||||
als Kommunikationsprotokoll mit einer Baudrate von 9600 Baud und einer maximalen Übertragungszeit von 400ms [x]. | |||||
% Gleiche Quelle wie in vorheriger Subsection: user manual eHZ Gen K | |||||
Die dabei übertragenen Werte werden über das OBIS-Kennzahlen-System [x] kodiert. Der für das Projekt relevante Gesamtverbrauch hat dabei die Kennzahl 1.8.0. | |||||
% https://www.bundesnetzagentur.de/DE/Beschlusskammern/BK06/BK6_81_GPKE_GeLi/Mitteilung_Nr_37/Anlagen/OBIS-Kennzahlensystem%202.2a.pdf?__blob=publicationFile&v=2 | |||||
\section{IR Übertragungsstrecke} | |||||
%+-- | |||||
% Simon ~ 1,5 Seiten | |||||
Die Impulsschnittstelle des Stromzählers würde sich grundsätzlich zum Aufzeichnen der Zählerstände eignen, | |||||
vorausgesetzt der Zählerstand zu Aufzeichnungsbeginn ist bekannt. Ein großer Vorteil dieser Schnittstelle | |||||
ist ihre extrem simple Natur: per GPIO-Interrupt eines Microcontrollers oder sogar per diskretem Zähler-IC | |||||
ist der Datenempfang sehr einfach realisierbar. Dagegen muss bei der IR-Datenschnittstelle sowohl | |||||
das Übertragungsprotokoll als auch die Datencodierung, die der Zähler verwendet, unterstützt werden.\\ | |||||
Gegen die Impulsschnittstelle sprechen allerdings einige Nachteile. Da die diese lediglich | |||||
eine fixe Anzahl an Impulsen pro verbrauchter Kilowattstunde sendet, werden hier nur Verbrauchsdeltas und | |||||
nie der absolute Wert übermittelt. Folglich wird zur Feststellung eines tatsächlichen Zählerstandes | |||||
in Kilowattstunden der Zählerstand zu Aufzeichnungsbeginn benötigt. Außerdem führt ein temporärer Ausfall | |||||
der Empfängerschaltung, bei dem Impulse nicht aufgezeichnet werden, zur Messung falscher Zählerstände.\\ | |||||
Ein weiterer Nachteil der Impulsschnittstelle ist dass zumindest ein Teil der Empfängerschaltung dauerhaft in Betrieb sein | |||||
muss um jeden Infrarotimpuls aufzunehmen. Gerade bei einem Microcontroller ist hier von einem relativ | |||||
hohen Energieverbrauch auszugehen bei dem ein Großteil der Energie verschwendet wird.\\ | |||||
Auf der Datenschnittstelle wird in regelmäßigen Intervallen der absolute Zählerstand übermittelt, damit | |||||
entfallen beide Nachteile der Impulsschnittstelle. Daher wurde sich für dieses Projekt für den Empfang | |||||
an der Datenschnittstelle entschieden. \\ | |||||
Die Datenschnittstelle überträgt hier die Zählerstände mittels des sogenannten D0-Protokolls [x] | |||||
% https://www.mikrocontroller.net/attachment/89888/Q3Dx_D0_Spezifikation_v11.pdf | |||||
nach DIN EN 62056‐21. Die Beschreibung des Protokolls lässt bereits eine Ähnlichkeit mit RS232 | |||||
vermuten, experimentell konnte bestätigt werden, dass die D0-Daten mittels der RS232-Peripherie eines | |||||
ESP8266 Microcontroller empfangen werden können. Dabei muss lediglich der RX-Pin der RS232-Schnittstelle | |||||
des Controllers an eine geeignete Empfangsschaltung angeschlossen werden.\\ | |||||
Bei einem Test mit einem Stromzähler des Herstellers \glqq Landis+Gyr\grqq{} konnte allerdings | |||||
festgestellt werden, dass die Datenformatangabe aus [x, gleiches wie vorher], d.h. | |||||
1 Startbit, 7 Datenbits, 1 Paritätsbit und ein Stoppbit, von diesem Zähler nicht eingehalten wird, | |||||
stattdessen wird von diesem Zähler 1 Startbit, 8 Datenbits und 1 Stoppbit verwendet. | |||||
Laut Herstellerangabe [x] | |||||
% https://www.landisgyr.de/webfoo/wp-content/uploads/2018/08/D000063497-E220-AMxD-Benutzerhandbuch-de-f.pdf | |||||
handelt es sich bei dieser Schnittstelle ebenfalls um eine Datenschnittstelle gem. DIN EN 62056‐21. | |||||
Bei der Einstellung der RS232-Peripherie kann es also zu zählerabhängigen Unterschieden kommen.\\ | |||||
Um einen Empfang der Zählerstände zu ermöglichen, müssen die Infrarotsignale des Zählers zunächst | |||||
in digitale elektrische Signale gewandelt werden. Für die Wandlung von Infrarotsignalen zu | |||||
elektrischen Signalen wurde eine Photodiode vom Typ SFH 213 FA [x] gewählt. Laut Datenblatt | |||||
% https://cdn-reichelt.de/documents/datenblatt/A501/SFH213FA_ENG_TDS.pdf | |||||
fließt bei einer Sperrspannung von $V_R=\SI{20}{\volt}$ ein Dunkelstrom $I_R \leq \SI{5}{\nano\ampere}$. | |||||
Bei $V_R=\SI{5}{\volt}$ und bei einer Strahlungsleistung von \SI{1}{\milli\watt\per\centi\metre\squared} | |||||
ist ein Photostrom $I_P \geq \SI{65}{\micro\ampere}$ zu erwarten. Bei Anwendung der Photodiode | |||||
in der Empfängerschaltung sind diese Rahmenparameter, sowohl die \SI{20}{\volt} Sperrspannung als | |||||
auch die genaue Strahlungsleistung nicht identisch mit den Vorgaben aus dem Datenblatt. Allerdings | |||||
können der Dunkelstrom $I_R \approx \SI{5}{\nano\ampere}$ und der Photostrom $I_P\approx\SI{65}{\micro\ampere}$ | |||||
als grobe Vorgaben zur Dimensionierung der Empfängerschaltung verwendet werden.\\ | |||||
Um die Stromsignale der Photodiode zu verstärken, bietet sich ein einfacher NPN-Transistor an, gewählt wurde | |||||
der BC548B. Mit der Beschaltung aus Abb. \ref{fig:ir_recv_a} und $200 \leq h_{FE} \leq 450$ | |||||
[x], | |||||
% https://cdn-reichelt.de/documents/datenblatt/A100/BC546_48-CDIL.pdf | |||||
ergibt sich ohne IR-Bestrahlung am Ausgang bei $V_{CC} = \SI{3,3}{\volt}$ | |||||
$U_{out} \approx V_{CC} - R_1 \cdot \SI{5}{\nano\ampere} \cdot h_{FE} \approx \SI{3,3}{\volt} \approx V_{CC}$. | |||||
Mit IR-Bestrahlung bei $I_{P}\approx\SI{65}{\micro\ampere}$ ergäbe sich nach der obigen Formel | |||||
eine negative Ausgangsspannung, in der Praxis geht der Transistor in Sättigung und $U_{out} \approx \SI{0}{\volt}$. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.25\textheight]{img/ir_recv_a.PNG} | |||||
\caption{Die Infrarotempfängerschaltung.} | |||||
\label{fig:ir_recv_a} | |||||
} | |||||
\end{figure} | |||||
Anhand der Berechnung lässt sich erkennen, dass die Verstärkerschaltung das Eingangssignal invertiert: | |||||
bei Dunkelheit wird eine digitale 1 erzeugt, bei IR-Belichtung eine digitale 0. Dieses Verhalten | |||||
kann schaltungstechnisch mit einem einfach Inverter, wie in Abb. \ref{fig:ir_recv_b} zu sehen, behoben werden. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.25\textheight]{img/ir_recv_b.PNG} | |||||
\caption{Die Infrarotempfängerschaltung mit Inverter.} | |||||
\label{fig:ir_recv_b} | |||||
} | |||||
\end{figure} | |||||
Nach Entwicklung der Schaltung konnte experimentell festgestellt werden, dass der getestete Stromzähler | |||||
der Firma Landis+Gyr bereits beim Senden das serielle Signal invertiert, sodass ein Inverter beim Empfänger | |||||
entfällt. Daher wurde die Inverterstufe auf der fertigen Platine durch einen Jumper konfigurierbar | |||||
ausgelegt (s. Abschnitt \ref{sec:schematic}). So kann Anwendungsspezifisch die Schaltung aus Abb. | |||||
\ref{fig:ir_recv_a} oder aus Abb. \ref{fig:ir_recv_b} verwendet werden.\\ | |||||
Das Signal $U_{out}$ der Empfängerschaltung kann direkt mit dem RX-Pin des Microcontrollers verbunden | |||||
werden. | |||||
\FloatBarrier | |||||
\section{Microcontroller} \label{sec:ESP} | |||||
%+-- | |||||
%Julian | |||||
Für das Empfangen und Verarbeiten der Daten wurde als Microcontroller ein D1 mini ausgewählt, welcher auf einem ESP8266 Prozessor basiert. Dieser verfügt über eine integrierte WLAN-Schnittstelle und ausreichend Peripherie, um den Anforderungen gerecht zu werden. Die serielle Schnittstelle des Microcontrollers kann außerdem direkt genutzt werden, um das serielle Signal vom Stromzähler mittels der bereits vorgestellten Empfängerschaltung relativ einfach einzulesen. Außerdem ist der Microcontroller mit der Arduino IDE programmierbar, was die Vorteile einer einfachen Programmierung und der gleichzeitig großen Vielfalt an Bibliotheken und Erweiterungen für diese Plattform kombiniert. Trotz seiner geringen Größe und dem vernachlässigbaren Gewicht verfügt das Board dennoch über ausreichend RAM und Flash-Speicher, eine Taktgeschwindigkeit von 80 bzw. 160 Mhz und einer $I^2C$-Schnittstelle zur Kommunikation mit der RTC, womit alle Anforderungen erfüllt sind und er sich perfekt zur Umsetztung des Projekts eignet[x]. | |||||
% https://www.wemos.cc/en/latest/d1/d1_mini.html | |||||
\begin{figure}[!h] | |||||
\centering | |||||
\includegraphics[height=0.25\textheight]{img/d1_top.jpg} | |||||
\caption{ESP 8266 D1 Mini.} | |||||
\label{fig:d1_mini_top} | |||||
\end{figure} | |||||
% TODO Bild auf gleiche Seite wie Text | |||||
\FloatBarrier | |||||
\section{Energieverbrauch} | |||||
%+-- | |||||
% Simon ~ 3-4 Seiten | |||||
Da das Infrarotempfängerkonzept eine vollständig kabellose Anbindung des Empfängeraufbaus vorsieht, | |||||
ist die Energieversorgung über einen Akku notwendig. Als Akku wurde ein Lithium-Ionen Akku im 18650 | |||||
Formfaktor gewählt. Für das Akkumanagement, d.h. Laden des Akkus und Unterspannungsschutz, wird | |||||
ein fertiges BMS-Board verwendet. Das gewählte BMS-Board ist unter der Bezeichnung | |||||
\glqq Wemos 18650 battery shield V3\grqq{} auf diversen Onlinemarktplätzen zu finden.\\ | |||||
Das Board wird mit einer 18650 Lithium-Ionen-Zelle bestückt und liefert \SI{3}{\volt} und | |||||
\SI{5}{\volt} Ausgangsspannung, die bei Unterspannung der Akkuzelle automatisch abgeschaltet werden. | |||||
Weiterhin kann der Akku im BMS-Board bequem per Micro-USB aufgeladen werden.\\ | |||||
Damit der Empfänger einen möglichst nützlichen | |||||
Smart Home-Sensor darstellt, muss eine hohe Akkulebensdauer sichergestellt sein, da bei einem Empfänger, | |||||
der sehr häufig aufgeladen werden muss auch das manuelle notieren der Stromzählerstände einen vergleichbaren | |||||
Aufwand verursachen würde.\\ | |||||
Bei einem handelsüblichen 18650 Lithium-Ionen-Akku kann von einer Kapazität in der Größenordnung von | |||||
\SI{2700}{\milli\ampere{}\hour} ausgegangen werden [x]. | |||||
% https://b2b-api.panasonic.eu/file_stream/pids/fileversion/3447 | |||||
Bei einer geschätzten Stromaufnahme der Empfängerschaltung im Dauerbetrieb von ca. | |||||
\SI{150}{\milli\ampere}, ergäbe sich eine Akkulebensdauer von ca. \SI{18}{\hour}, ein völlig | |||||
inakzeptabler Wert. Aus dieser Überschlagsrechnung wird klar, dass die Empfängerschaltung in zwei | |||||
Zuständen, einem Aktivzustand mit großem Energieverbrauch und einem möglichst sparsamen Passivzustand, | |||||
realisiert werden muss. | |||||
\subsection{Abschätzung der Akkulebensdauer} | |||||
%+-- | |||||
\label{sec:lifetime_approx} | |||||
Um eine Realisierung dieser beiden Zustände zu beurteilen, ist ein Modell der Akkulebensdauer | |||||
in Abhängigkeit der Parameter der Zustände (Verweildauer im Zustand und Stromaufnahme) sinnvoll.\\ | |||||
Der Aktivzustand wird charakterisiert durch die Dauer $t_{on}$ mit mittlerem Versorgungsstrom $I_{on}$, | |||||
der in einem Zyklus der Periode $T_{cycle}$ auftritt, der Standby-Zustand wir charakterisiert durch | |||||
den Ruhestrom $I_{off}$.\\ | |||||
Mit Ladung $C=\int{I(\tau)d\tau}$ ergibt sich näherungsweise eine Ladungsaufnahme der Schaltung von | |||||
\begin{equation} | |||||
C_{auf}(t) = I_{on}\cdot\frac{t_{on}}{T_{cycle}}\cdot t + I_{off}\cdot t. | |||||
\end{equation} | |||||
Dabei wurden unter den Annahmen $t \gg T_{cycle}$ und $\frac{t_{on}}{T_{cycle}} \ll 1$ einige Vereinfachungen vorgenommen.\\ | |||||
Modelliert man nun den Akku der Kapazität $C_A$ (z.B. \SI{2800}{\milli\ampere{}\hour}) als simple Ladungsquelle, | |||||
die die Schaltung versorgt, bis $C_A$ \glqq aufgebraucht\grqq{} ist, ergibt sich durch Gleichsetzen von | |||||
$C_{auf}(t)$ und $C_A$ eine geschätzte Lebensdauer | |||||
\begin{equation} | |||||
t_L = \frac{C_A}{I_{on}\cdot t_{on}/T_{cycle}+I_{off}}. | |||||
\end{equation} | |||||
Für einen Ruhestrom von $I_{off}=\SI{2}{\micro\ampere}$, eine Aktivzeit $t_{on}=\SI{30}{\second}$, | |||||
$T_{cycle}=\SI{12}{\hour}$, $C_A=\SI{2800}{\milli\ampere{}\hour}$ und | |||||
einen mittleren Versorgungsstrom $I_{on}=\SI{150}{\milli\ampere}$ ergibt sich beispielsweise aus der Abschätzung | |||||
$t_L=\SI{1099}{\day}$. Wird bei den selben Parametern ein Ruhestrom von $I_{off}=\SI{0,2}{\milli\ampere}$ | |||||
angesetzt, drittelt sich die geschätzte Lebensdauer auf ca. \SI{384}{\day}.\\ | |||||
Es ist fragwürdig, ob in der Praxis tatsächlich eine derartig hohe Lebensdauer erreichbar ist, mitunter, | |||||
da kein realistisches Akkumodell verwendet wurde.\\ | |||||
Allerdings ist die hohe Abschätzung der Lebensdauer eine gute Indikation dafür, dass | |||||
die reale Lebensdauer nicht ausschließlich durch den Energieverbrauch der Schaltung sondern durch Eigenschaften | |||||
des Akkus limitiert wird und somit eine weitere Optimierung des Energieverbrauchs nicht unbedingt zu einem | |||||
signifikanten Anstieg der Akkulebensdauer führen würde. Um die Lebensdauer genauer zu bestimmen, ist allerdings | |||||
eine Echtzeitmessung oder die Verwendung eines präzisen Akkumodells erforderlich. | |||||
\subsection{Schaltungstechnische Realisierung des Standbyzustands} | |||||
%+-- | |||||
Der ESP8266 verfügt Hardwareseitig bereits über einen sogenannten \glqq Deep-sleep\grqq{}-Modus [x]. | |||||
% ESP8266 Low Power Solutions V1.5, Espressif | |||||
% https://www.espressif.com/sites/default/files/documentation/9b-esp8266-low_power_solutions__en.pdf | |||||
In diesem Modus wird der Großteil des Mikrocontrollers deaktiviert und damit der Energieverbrauch | |||||
deutlich gesenkt [x, selbe wie vorher]. Mittels der internen Uhr (RTC) des ESP wird der Microcontroller | |||||
in bestimmten Intervallen wieder \glqq geweckt\grqq{} [x, selbe wie vorher]. | |||||
Durch diesen Mechanismus könnte der zuvor beschriebene Energiesparmodus umgesetzt werden. | |||||
Da für dieses Projekt allerdings der ESP8266 nicht einzeln sondern in Form eines Entwicklungsboards | |||||
mit zusätzlicher Peripherie (z.B. Spannungswandler und USB zu UART Wandler) verwendet wird und | |||||
auch im Arbeitspunkt der IR-Empfängerschaltung ein geringer Strom fließt, würde | |||||
der Deep-sleep-Modus zwar den Energieverbrauch des ESP reduzieren, alle weiteren Komponenten wären | |||||
davon allerdings nicht betroffen. Wie die Lebensdauerabschätzung im vorherigen Abschnitt zeigt, ist | |||||
ein Standbystrom im Microamperebereich wünschenswert, daher ist der Deep-sleep-Modus für diesen Zweck | |||||
nicht ausreichend.\\ | |||||
Eine alternative Lösung, die im Rahmen dieses Projekts gewählt wurde, ist im Standbyzustand die | |||||
Energieversorgung der kompletten Schaltung zu unterbrechen.\\ | |||||
Dafür wird mittels eines p-MOSFET ein high-side Schalter realisiert, der die Versorgungsspannung | |||||
vom BMS-Board zum Empfänger schaltet. Der MOSFET wird angesteuert durch eine externe Echtzeituhr | |||||
(RTC) vom Typ DS3231 [x]. | |||||
% https://datasheets.maximintegrated.com/en/ds/DS3231.pdf | |||||
Die DS3231 liefert via I\textsuperscript{2}C-Schnittstelle nach einmaliger Konfiguration fortlaufend | |||||
das aktuelle Datum und die aktuelle Uhrzeit. Die RTC wird dabei von einer Lithium-Knopfzelle versorgt | |||||
und ist damit in ihrer Funktion unabhängig von einer externen Spannungsversorgung. Die für dieses Projekt | |||||
wichtigste Funktion der DS3231 sind die zwei programmierbaren Alarme der RTC.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=0.5\linewidth]{img/power_schema.PNG} | |||||
\caption{Schematische Darstellung der geschalteten Energieversorgung.} | |||||
\label{fig:power_schema} | |||||
} | |||||
\end{figure} | |||||
Mittels I\textsuperscript{2}C können in den Registern der RTC zwei Alarme dazu programmiert werden, in | |||||
bestimmten Intervallen (minütlich, stündlich, täglich, ...) den $\overline{\mbox{INT}}$-Pin der RTC | |||||
auf Masse zu ziehen [x, selbe wie vorher]. Dabei ist sehr hilfreich, dass die Alarmsignale selbsthaltend sind, | |||||
d.h. wird ein Alarm ausgelöst bleibt $\overline{\mbox{INT}}$ auf Masse gezogen, bis via | |||||
I\textsuperscript{2}C das jeweilige Alarmflag (A1E bzw. A2E) in den RTC-Registern zurückgesetzt wird [x, selbe wie vorher].\\ | |||||
Das Signal eignet sich also direkt zum Schalten der Energieversorgung der Empfängerschaltung. | |||||
Weiterhin handelt es sich bei dem $\overline{\mbox{INT}}$-Pin um einen open-drain Ausgang, d.h. der Pin | |||||
muss mit einem externen Pull-Up-Widerstand beschaltet werden [x, selbe wie vorher], der die high-Spannung des | |||||
Signals vorgibt. Damit bietet sich das Signal zum Steuern des p-MOSFET sehr an, da durch einen | |||||
Pull-Up auf die Sourcespannung des MOSFET der p-MOSFET korrekt durch das Signal geschaltet wird.\\ | |||||
In der praktischen Erprobung der Schaltung hat sich gezeigt, dass teils beim Ausschalten Glitches | |||||
auftreten können, bei denen die Versorgung nicht vollständig ausgeschaltet wird, sondern die Spannung | |||||
am Drain des MOSFET (die nahe \SI{0}{\volt} liegen sollte) bei beispielsweise \SI{1,6}{\volt} hängen | |||||
bleibt und der Ausschaltvorgang somit fehlschlägt. Um ein sicheres Ausschalten zu gewährleisten, | |||||
wurde zwischen das $\overline{\mbox{INT}}$-Signal der RTC mit Pull-Up und den MOSFET ein Spannungspuffer | |||||
geschaltet (realisiert durch zwei nacheinander geschaltete NAND-Gatter aus einem CD4011B IC, | |||||
Schaltung siehe Abschnitt \ref{sec:schematic}).\\ | |||||
Nach dieser Änderung konnten keine Glitches mehr festgestellt werden.\\ | |||||
Als p-MOSFET wurde ein NX2301P gewählt [x]. | |||||
% https://assets.nexperia.com/documents/data-sheet/NX2301P.pdf | |||||
Das wichtigste Auswahlkriterium für den MOSFET war in dieser Funktion ein betragsmäßig ausreichend | |||||
geringes $V_{GS}$ um den MOSFET einzuschalten. Dem Datenblatt lässt sich bei | |||||
$V_{GS}=\SI{-1.8}{\volt}$ ein maximales $R_{DSon}$ von \SI{270}{\milli\ohm} entnehmen. Dieser | |||||
$R_{DSon}$-Wert ist für den Aktivzustand der Schaltung völlig ausreichend - bei einer Stromaufnahme | |||||
von \SI{150}{\milli\ampere} fallen über dem MOSFET maximal \SI{41}{\milli\volt} ab, der Leistungsverlust | |||||
über dem MOSFET liegt im einstelligen Milliwattbereich. Die Gate-Source Spannung | |||||
von \SI{-1.8}{\volt} ist ebenfalls komfortabel erreichbar, bei einer Akkuspannung von \SI{3}{\volt} | |||||
wird ein $V_{GS}$ von knapp \SI{-3}{\volt} im Aktivzustand erreicht. | |||||
\FloatBarrier | |||||
\subsection{Messtechnische Überprüfung des Energieverbrauchs} | |||||
%+-- | |||||
Zur messtechnischen Überprüfung des Energieverbrauchs wurde zunächst das BMS-Board mit \SI{3,7}{\volt} | |||||
versorgt und die Stromaufnahme ohne angeschlossene Last bestimmt. Es konnte ein Wert von ca. | |||||
\SI{0,33}{\milli\ampere} gemessen werden. Wie bereits bei der Abschätzung der Akkulebensdauer festgestellt | |||||
wurde, handelt es sich hierbei um einen relativ hohen Standbyverbrauch. Es ist eine naheliegende Vermutung, | |||||
dass dieser Stromverbrauch ohne Last durch den DC-DC Step-Up Konverter auf dem BMS-Board verursacht wird, | |||||
der die \SI{5}{\volt} Ausgangsspannung des Boards generiert.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.7\linewidth]{img/bms_board.jpg} | |||||
\caption{Die Rückseite des BMS-Boards. Rot markiert der Step-Up Konverter.} | |||||
\label{fig:bms_backside} | |||||
} | |||||
\end{figure} | |||||
Durch Position der Induktivität und Nachschlagen der IC-Nummern konnte U7 (s. Abb. \ref{fig:bms_backside}) | |||||
als Step-Up Konverter des Typs FP6298 identifiziert werden. Durch Entfernen des Step-Up ICs von der Platine | |||||
konnte die Stromaufnahme des BMS-Boards ohne angeschlossene Last auf unter \SI{0,2}{\micro\ampere} | |||||
reduziert werden. Durch diese Modifikation geht selbstverständlich der \SI{5}{\volt} Ausgang des BMS-Boards | |||||
verloren, stattdessen steht maximal die Zellspannung zur Verfügung. Das stellt allerdings kein Problem | |||||
dar, da experimentell festgestellt wurde, dass eine Versorgungsspannung im Bereich von \SI{3}{\volt} | |||||
bis \SI{3,7}{\volt} für den Betrieb der Empfängerschaltung ausreichend ist. Betrachtet man die | |||||
Entladecharakteristik eines typischen 18650 Lithium-Ionen Akkus (s. Abb. \ref{fig:liion_discharge}), | |||||
ist ersichtlich, dass in diesem | |||||
Spannungsbereich der größte Teil der Akkuladung ausgenutzt werden kann.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.7\linewidth]{img/discharge_curve.PNG} | |||||
\caption{Entladekurve eines 18650 Lithium-Ionen Akkus [x].} | |||||
% https://b2b-api.panasonic.eu/file_stream/pids/fileversion/3447 | |||||
\label{fig:liion_discharge} | |||||
} | |||||
\end{figure} | |||||
Anschließend wurde der Energieverbrauch der vollständigen Empfängerschaltung zusammen mit dem | |||||
BMS-Board charakterisiert. Dafür wurden erneut \SI{3,7}{\volt} an den Zellanschlüssen des BMS-Boards | |||||
eingespeist und der Stromfluss am Zellanschluss gemessen.\\ | |||||
Es konnte im Aktivzustand ein mittlerer Stromverbrauch von ca. \SI{150}{\milli\ampere} und im | |||||
Standbyzustand ein Stromverbrauch zwischen \SI{0,3}{\micro\ampere} und \SI{1,5}{\micro\ampere} | |||||
gemessen werden. Mit der Abschätzung aus Abschnitt \ref{sec:lifetime_approx} ergibt sich mit diesen | |||||
Werten bei $t_{on}=\SI{30}{\second}$, $T_{cycle}=\SI{12}{\hour}$ und $C_A=\SI{2800}{\milli\ampere{}\hour}$ | |||||
eine geschätzte Lebensdauer von $t_L\approx\SI{1104}{\day}$. Obwohl die reale Akkulebensdauer | |||||
sicherlich deutlich geringer ausfallen wird, lässt dieser hohe Wert vermuten, dass Verbraucherseitig | |||||
die Voraussetzungen für eine hohe Akkulebensdauer erfüllt sind. | |||||
\FloatBarrier | |||||
\section{Platine} | |||||
%+-- | |||||
% Julian ~ 1-2 Seiten | |||||
Um alle benötigten Komponenten sicher miteinander zu verbinden wurde entschieden eine eigene Platine zu entwerfen. Zwar hätte ein Aufbau auf einer Lochrasterplatine sicherlich auch funktioniert, jedoch wäre dieser bei der Anzahl der Komponenten und deren Größe, wie z.B. dem Microcontroller oder den NAND-Gates, sehr unübersichtlich geworden. Außerdem konnten die verschiedenen Konfigurationsmöglichkeiten so leichter implementiert und beschriftet werden.\\ \\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\linewidth]{img/platine_rendering.png} | |||||
\caption{3D-Rendering der Platine in Altium.} | |||||
\label{fig:pcb_rendering} | |||||
} | |||||
\end{figure} | |||||
Wie bereits im vorherigen Kapitel beschrieben kam es zu Glitches beim Abschalten des pMOSFETs. Um sowohl die Möglichkeit des direkten Abschaltens, als auch die des gepufferten Abschaltens zu haben, wurden Lötbrücken platziert. Somit kann ohne besonders viel Aufwand die Konfiguration geändert werden.\\ \\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\linewidth]{img/pcb_sb1_sb2.png} | |||||
\caption{Lötbrücke 1 und 2 für Abschaltung mit oder ohne Puffer.} | |||||
\label{fig:pcb_sb1_sb2} | |||||
} | |||||
\end{figure} | |||||
Eine weitere Lötbrücke wurde platziert um die RTC im aktiven Zustand aus dem Akku zu speisen. Damit wird vermieden, dass die Knopfzelle zu schnell entleert wird.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.5\textheight]{img/pcb_sb3.png} | |||||
\caption{Lötbrücke 3 für Versorgung der RTC per Akku.} | |||||
\label{fig:pcb_sb3} | |||||
} | |||||
\end{figure} | |||||
Außerdem wurde beim Testen mit einem anderen Stromzähler entdeckt, dass der Stromzähler des Herstellers \glqq Landis+Gyr\grqq bereits ein invertiertes Signal sendet. Da der Stromzähler, an dem der Empfänger letzten Endes betrieben wird, nicht getestet werden konnte, wurden hierfür Jumper eingebaut. Somit kann die Inverterstufe im Empfangspfad leichter aktiviert oder deaktiviert werden.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=1.0\textwidth]{img/pcb_jumper.png} | |||||
\caption{Jumper zum Aktivieren und Deaktivieren der Inverterstufe.} | |||||
\label{fig:pcb_jumper} | |||||
} | |||||
\end{figure} | |||||
%TODO Bildgrößen und Platzierung anpassen | |||||
\FloatBarrier | |||||
\section{Software} | |||||
%--- | |||||
Das komplette Programm sowohl für den Empfänger, als auch für den Teststand, sind im Anhang zu finden. | |||||
% TODO Macht das Sinn? Schickt man sowas einfach nur per Mail mit? Wie machen wir das? | |||||
% Julian ~ 6-8 Seiten | |||||
\subsection{Programmablauf} | |||||
%+-- | |||||
Der ESP wurde mit der Arduino IDE programmiert. Diese ermöglicht den Zugang zu beliebiger Hardware, solange der korrekte Treiber installiert ist und es eine Anbindung an die Arduino IDE gibt. Als Schnittstelle gibt es eine setup()-Funktion, welche einmalig zu Beginn des Programms abgearbeitet wird und eine loop()-Funktion, welche nach dem Setup zyklisch als Endlosschleife abläuft.\\ | |||||
Im Setup werden zunächst einzelne Pins initialisiert, danach wird die serielle Kommunikation gestartet, woraufhin die Verbindung zum WLAN hergestellt wird. Ist dies erfolgreich, versucht der ESP als nächstes sich mit dem MQTT-Broker zu verbinden. Sobald auch das funktioniert hat ist die Initialisierung beendet. Sollte jedoch keine Verbindung zum WLAN oder dem MQTT-Broker hergestellt werden können, wird nach einer bestimmten Zeit das Ausschalten initialisiert. | |||||
\subsection{RTC} | |||||
%+-- | |||||
Die Spannungsversorgung des Microcontrollers wird von der RTC gesteuert. Diese arbeitet mit internen Alarmen und schaltet den INT-Pin (low-aktiv), sobald ein aktiver Alarm abgelaufen ist. Danach bleibt sie aktiv, bis über $I^2C$ der Befehl zum Ausschalten gesendet wird. Dies geschieht, indem der Microcontroller nach Ablauf seines Programms im Control-Register der RTC die Flags für die Alarme zurücksetzt. Sobald das passiert ist, setzt die RTC den INT-Pin zurück und unterbricht damit die Stromversorgung für den ESP. Nach Ablaufen des Alarms beginnt dieser Zyklus von neuem. | |||||
\subsection{WifiManager} | |||||
%+-- | |||||
Kernanforderung des Projekts war die drahtlose Kommunikation zwischen Empfänger und Smart-Home-Controller. Da uns aus ersichtlichen Gründen jedoch zur Projektlaufzeit die Zugangsdaten zum endgültigen WLAN nicht zur Verfügung standen war es nötig, dem Bediener die Möglichkeit zu geben, eine gültige WLAN Konfiguration an den Microcontroller zu übermitteln, ohne ihn dafür jedes Mal neu flashen zu müssen. Diese Funktionalität gibt es bereits in Form einer Bibliothek mit dem Namen WifiManager [x].\\ | |||||
% https://github.com/tzapu/WiFiManager | |||||
Mit Hilfe der Bibliothek startet der Microcontroller im Station-Mode und versucht, sich mit ggf. vorher gespeicherten Zugangsdaten anzumelden. Gelingt dies nicht oder ist noch keine Konfiguration hinterlegt, wechselt der ESP in Access-Point-Mode und startet einen eigenen Webserver. Nun kann sich der Bediener mit jedem beliebigen, WLAN-fähigen Gerät am WLAN des ESP anmelden und wird zu einer Anmeldeseite weitergeleitet, wo nun die WLAN Zugangsdaten eingegeben werden können. Sobald sich der ESP erfolgreich mit dem angegebenen Netzwerk verbunden hat wird der Programmablauf fortgesetzt.\\ | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[width=0.5\textwidth]{img/wifimgr_loginpage.png} | |||||
\caption{Anmeldeseite des WifiManager aus Sicht des Bedieners.} | |||||
\label{fig:wifi_manager} | |||||
} | |||||
\end{figure} | |||||
Zwar bietet die Bibliothek auch Felder für MQTT-Broker IP und Port an, dies hat jedoch zum Zeitpunkt des Projekts nicht zuverlässig funktioniert und wurde deshalb aus dem Programm entfernt. Sollte die Bibliothek dahingehend verbessert werden, wäre es sinnvoll, dieses Feature nachzurüsten, um nicht jedes Mal den Microcontroller flashen zu müssen wenn ein anderer MQTT-Broker verwendet wird. Da dem Broker, welcher in diesem Fall ein Raspberry Pi ist, entweder in der internen Konfiguration des Raspberry Pi eine statische oder über den Router immer dieselbe IP zugewiesen werden kann und das Gerät nicht für wechselnde Broker gedacht ist, kann auf dieses Feature aber auch verzichtet werden. | |||||
%den letzten Satz evt nochmal umschreiben, der ist sehr verwirrend | |||||
\subsection{MQTT} | |||||
%--- | |||||
- PubSubClient bib ansprechen, Modell MQTT kurz erklären mit broker und client und topics und messages -> so kommen daten ans nodered | |||||
\subsection{NodeRed und Datenbank} | |||||
%--- | |||||
- Daten kommen per MQTT Paket an, werden kurz auf Plausibilität geprüft und dann in DB gespeichert | |||||
> Bild vom Flow und raspbi db | |||||
\subsection{Einlesen der SML-Daten} | |||||
%--- | |||||
Sobald ... | |||||
- ESP wartet bis serielle Daten vorhanden sind | |||||
- Teststand oder echt? | |||||
- Daten kommen seriell am RX Pin an und werden in internen Buffer geschrieben | |||||
THIS IS WHERE THE MAGIC HAPPENS | |||||
Obis gschmarri etc erklären + CODE | |||||
\section{Gehäuse} | |||||
%+-- | |||||
Für den Empfängeraufbau aus BMS-Board, Platine, Photodiode, Ein- und Resetschalter wurde ein | |||||
3D-Druckgehäuse gezeichnet und gedruckt.\\ | |||||
\begin{figure}[h]\centering{ | |||||
\includegraphics[width=0.9\linewidth]{img/case_cad.PNG} | |||||
\caption{CAD-Schnittbild des Gehäuses. Modellquelle BMS-Board: [x].} | |||||
% https://cad.grabcad.com/library/wemos-18650-battery-shield-v3-1 | |||||
\label{fig:cad_case} | |||||
} | |||||
\end{figure} | |||||
Das Gehäuse kann mit einem Deckel verschlossen werden, der durch vier Schrauben befestigt wird. | |||||
Die Platine und das BMS-Board werden durch metrische Distanzbolzen im Gehäuse und aneinander befestigt. | |||||
Sämtliche Gewinde im gedruckten Material werden durch metallische Gewindeeinsätze realisiert.\\ | |||||
Für die Photodiode befindet sich im Boden des Gehäuses eine Durchführung in die die Diode eingepresst wird. | |||||
An die Außenseite der Durchführung ist ein Ringmagnet montiert, der den Empfängeraufbau an die magnetische | |||||
Fläche des Stromzählers fixiert. | |||||
% ToDo (Julian) hier wären 1-2 Bilder vom fertigen Gehäuse cool bzw. falls du die bei Anleitung | |||||
% o.Ä. hast (z.B. wegen Resetschalter) einfach ein kurzer Verweis auf die. Ich hab leider nur | |||||
% Bilder im halb fertigen Zustand. | |||||
\FloatBarrier | |||||
\section{Teststrecke} | |||||
%--- | |||||
Zum Testen der Funktion wurde eine kleine Teststrecke aufgebaut, mit der es möglich | |||||
ist die Übertragung ohne den Stromzähler zu simulieren. | |||||
% Kathi ~ 2 Seiten | |||||
\subsection{Aufbau} | |||||
%--- | |||||
Zunächst wurde die Schaltung der Teststrecke auf einem Steckbrett aufgebaut, um zu überprüfen, ob die Grundidee des Projekts umsetzbar ist. Auch die bestellten Bauteile und Dimensionierungen konnten so überprüft werden. Da während der arbeit am Projekt zunächst kein Stromzähler zur verfügung stand wurde der Teststrecke zusätzlich zu dem bereits in Kapitel \ref{sec:ESP} erleuterten ESP, ein Arduino UNO hinzugefügt. So konnte überprüft werden, ob auch die Kommunikation zwischen zwei komplett voneinander getrennten Systhemen funktioniert. Der ESP dient also weiterhin als Empfänger, während der Arduino den Stromzähler als Sender simuliert. | |||||
\begin{figure}[!h]\centering{ | |||||
\includegraphics[height=0.3\textheight]{img/Schaltung_Teststrecke.jpeg} | |||||
\caption{Der Schalplan der Teststrecke.} | |||||
\label{fig:sp_test} | |||||
} | |||||
\end{figure} | |||||
Wie in Abb. \ref{fig:sp_test} zu sehen ist, sind also die Schaltkreise komplett von einander getrennt. Um die besten Ergebnisse bei der Übertragung zu erzielen, werden die beiden LEDs gegenüber, Spitze an Spitze aufgebaut. Sendet man nun von TX-Pin des Arduino beispielsweise ein "A" so kann dieses am RX-Pin des ESP empfangen werden. Mit der richtigen dimensionierung von R1, auf \SI{100} {\ohm} nehmen auch wechselnde Lichtverhältnisse keinen Einfluss auf die Funktion der Schaltung. Der Wert der beiden Wiederstände R3 und R4 ist allerdings relativ frei wählbar, solange diese annähernd in der richtigen Größenordnung liegen.\\ | |||||
Eine weitere Besonderheit ist bei den beiden Dioden D1 und D2 zu beachten. Zwar handelt es sich bei beiden um Infrarotdioden, allerdings ist für die Funktion wichtig, dass es sich dabei auf der Sender Seite um eine klare, und auf der Empfänger Seite um eine möglichst dunkle, oder im besten Fall schwarze Diode handelt. Dazu wurden die LD274 (Sender) und die SHF213FA (Empfänger) gewählt.\\ \\ | |||||
Bei der Programmierung ist außerdem aufgefallen, dass das Hochladen des Programmes nur möglich ist, wenn der RX- und TX-Pin vom jeweiligen Mikrocontroller von der Schaltung getrennt sind. Nachdem die funktion der Schaltung überprüft war, wurde der Aufbau auf eine Lochplatine gelötet, dabei wurde mit Pin-Headern gearbeitet, sodass das Ergebnis als eine Art Arduino-Shield fungiert. Der Vorteil liegt dabei darin, dass beide Mikrocontroller zwar fest mit der Platine verbunden sind, aber bei Änderungen am Programm, auch genauso leicht zum Hochladen getrennt werden können. Außerdem befinden sich die beiden Dioden an der Unterseite des Shields, also im Gebrauch zwischen Shield und Arduino, was die Schaltung noch zusätzlich von äußeren Lichteinflüssen schützt.\\ | |||||
\subsection{Funktion} | |||||
%--- | |||||
- ESp Empfänger | |||||
- Arduino Sender | |||||
- Beide an einen Laptop mit zwei command windows öffnen | |||||
- kleiner Code zum eingeben was man senden will | |||||
- Problem dass Consolen text mit gesendet wird | |||||
- Was wollen sie senden text raus filtern | |||||
- Testen des Programms | |||||
- Inverter | |||||
\chapter{Anleitung} | |||||
%--- | |||||
% Julian ~ 4-5 Seiten | |||||
\section{Raspberry Pi} | |||||
%--- | |||||
Config und alles pipapo um Raspi komplett einzurichten | |||||
PLUS das was Klehn zusätzlich machen muss für unseren Teil | |||||
\subsection{Betriebssystem} | |||||
%--- | |||||
\subsection{Installation MQTT} | |||||
%--- | |||||
\subsection{NodeRed} | |||||
%--- | |||||
\subsection{Datebank} | |||||
%--- | |||||
\section{ESP8266} | |||||
%--- | |||||
Wifi Manager undso in der praktischen Anwendung nochmal erklären | |||||
Bilder WifiMgr etc blabla | |||||
Jumper Inverter | |||||
\section{Testaufbau} | |||||
%--- | |||||
Erklärung shield, putty, evtl. arduino Include | |||||
+Fotos | |||||
% ab hier alles Kathi: | |||||
\chapter{Fazit} | |||||
%--- | |||||
- Es funktioniert | |||||
- mit geringen finanziellen Mitteln umgesetzt | |||||
- einigermaßen Benutzerfreundlich | |||||
- Nicht für jeden geeignet, bezug auf Einleitung | |||||
- Speziell an den Klehn angepasst | |||||
\part{Anhang} | |||||
\section{Schaltplan}\label{sec:schematic} | |||||
\begin{figure}[!h] \centering{ | |||||
\includegraphics[angle=90,scale=0.7]{schematic.pdf}} | |||||
\end{figure} | |||||
\chapter{Literaturverzeichnis} | |||||
\label{sec:bibliography{Literatur}} | |||||
\part{Danksagung} | |||||
\end{document} |
/* | |||||
* Stand: 25.08.2021 | |||||
* Author: Julian Rico | |||||
* | |||||
* Software für Stromzähler-Empfänger | |||||
* | |||||
* Diese Software beinhaltet die Logik, um einen EMH Gen. K Stromzähler per | |||||
* Infrarot-Schnittstelle auszulesen und den Gesamtverbrauch des Zählers | |||||
* per MQTT an einen MQTT Broker zu schicken. | |||||
*/ | |||||
/* Includes */ | |||||
#include <Wire.h> | |||||
#include <WiFiManager.h> /* https://github.com/tzapu/WiFiManager */ | |||||
#include <PubSubClient.h> /* https://github.com/knolleary/pubsubclient */ | |||||
/* Defines */ | |||||
#define BAUDRATE 9600 | |||||
#define BUFFERSIZE 1000 | |||||
#define RTC_I2C_ADDR 0x68 | |||||
/* Globale Variablen */ | |||||
int BUFFER[BUFFERSIZE]; // Buffer für Einlesen serieller | |||||
// Daten | |||||
int i, j, error; // Laufvariablen | |||||
int shutdown = 0; // Wird gesetzt nach erfolgreichem | |||||
// Einlesen des Zählstands | |||||
WiFiClient espClient; // WiFi | |||||
PubSubClient client(espClient); // MQTT Client | |||||
const char* MQTT_BROKER = "192.168.178.102"; // MQTT Broker IP -> TODO anpassen | |||||
const unsigned short MQTT_PORT = 1883; // MQTT Broker Port -> TODO prüfen | |||||
char* MQTT_TOPIC_LIVE = "smartmeter"; // MQTT Topic für Stromzählerwerte | |||||
char* MQTT_TOPIC_TEST = "ESP"; // MQTT Topic für Eingaben von | |||||
// Teststand | |||||
char* MQTT_MSG = "ESP ONLINE."; // Message von ESP wenn Setup | |||||
// erfolgreich | |||||
/* Functionsprototypen */ | |||||
// MQTT Callback: Gibt erhaltene Message aus | |||||
void callback(char* topic, byte* payload, unsigned int length); | |||||
// Liest serielle Daten ein, unterscheidet ob Daten von Teststand oder Stromzähler | |||||
// kommen | |||||
bool readTelegramm(); | |||||
// Versendet Zählstand per MQTT (TOPIC_LIVE) | |||||
void read_smartmeter(int start, int komma, int ende); | |||||
// Versendet Testdaten per MQTT (TOPIC_TEST) | |||||
void read_teststation(int start); | |||||
// Alarm Register und Control Bits setzen | |||||
void RTC_Setup(); | |||||
// Ausschalten | |||||
void RTC_Shutdown(); | |||||
/* Setup: einmalig */ | |||||
void setup() { | |||||
// Debug LED | |||||
pinMode(LED_BUILTIN, OUTPUT); | |||||
digitalWrite(LED_BUILTIN, HIGH); | |||||
// Serial Setup | |||||
Serial.begin(BAUDRATE); | |||||
Serial.flush(); | |||||
Serial.println("Serial init done."); | |||||
// Wifi Setup | |||||
WiFi.mode(WIFI_STA); | |||||
WiFiManager wifiManager; | |||||
bool res; | |||||
res = wifiManager.autoConnect("ESP32-STROMZÄHLER", "PASSWORD"); | |||||
if(!res) { | |||||
Serial.println("Failed to connect"); | |||||
} | |||||
else { | |||||
//if you get here you have connected to the WiFi | |||||
Serial.println("connected...yeey :)"); | |||||
} | |||||
// MQTT Setup | |||||
error = 0; | |||||
client.setServer(MQTT_BROKER, MQTT_PORT); | |||||
while (!client.connected()) { | |||||
client.connect("ESP8266Client"); | |||||
if (client.connected()) { | |||||
Serial.println("MQTT connected"); | |||||
} | |||||
else { | |||||
Serial.print("failed, rc="); | |||||
Serial.print(client.state()); | |||||
Serial.println("try again in 5 seconds"); | |||||
delay(5000); | |||||
error++; | |||||
if (error == 12) { // Nach 60 Sekunden Shutdown | |||||
RTC_Shutdown(); | |||||
} | |||||
} | |||||
} | |||||
// Das kann dann später raus, ist nur zum testen der MQTT Verbindung per Serial | |||||
// Monitor | |||||
client.subscribe(MQTT_TOPIC_TEST); | |||||
client.setCallback(callback); | |||||
client.publish(MQTT_TOPIC_TEST, MQTT_MSG); | |||||
// RTC | |||||
RTC_Setup(); | |||||
Serial.println("RTC Setup done"); | |||||
} | |||||
/* Hauptprogramm */ | |||||
void loop() { | |||||
// Benötigt für Empfangen von MQTT Messages -> kann später raus | |||||
client.loop(); | |||||
// ESP kommst sonst seriell nicht hinterher | |||||
delay(75); | |||||
// Serielle Daten einlesen falls vorhanden | |||||
if (Serial.available() > 0) { | |||||
if (readTelegramm()) | |||||
shutdown = 1; | |||||
} | |||||
// Buffer für nächsten Datensatz leeren (benötigt, wenn Zählstand nicht dabei | |||||
// war) | |||||
if (i > 0) { | |||||
for (int k = 0; k < i; k++) | |||||
BUFFER[k] = 0; | |||||
i = 0; | |||||
} | |||||
// Shutdown durch RTC vorbereiten | |||||
if (shutdown) | |||||
RTC_Shutdown(); | |||||
} | |||||
/* MQTT Subscriber Callback */ | |||||
void callback(char* topic, byte* payload, unsigned int length) { | |||||
Serial.print("New message in topic: "); | |||||
Serial.println(topic); | |||||
Serial.print("Message: "); | |||||
for (i = 0; i < length; i++) { | |||||
Serial.print((char)payload[i]); | |||||
} | |||||
Serial.println(); | |||||
Serial.println("-----------------------"); | |||||
Serial.println(); | |||||
} | |||||
bool readTelegramm() { | |||||
// Read D0 Telegram | |||||
i = 0; | |||||
do { | |||||
if(i < BUFFERSIZE) { | |||||
BUFFER[i] = Serial.read(); | |||||
/* Debug */ | |||||
if (BUFFER[i] < 0xF) | |||||
Serial.print("0"); // Führende Null erzeugen | |||||
Serial.print(BUFFER[i], HEX); | |||||
Serial.print(" "); | |||||
if (BUFFER[i] == 0x0A) { // 0A (hex) = LF (ASCII) => Neue Zeile | |||||
Serial.println(); | |||||
} | |||||
/* Debug Ende */ | |||||
i++; | |||||
} | |||||
} while (Serial.available()); | |||||
// Buffer nach Daten für Zählerstand absuchen | |||||
for (j = 0; j < i; j++) { // Buffer nach Zeichen absuchen | |||||
// Daten von Teststand: "¡Bitte geben Sie ... !"); | |||||
if (BUFFER[j] == 0xC2 && BUFFER[j+1]) { /* C2 A1 = '¡' */ | |||||
return false; // Shutdown für RTC nur schicken wenn Daten von Smartmeter | |||||
// kommen | |||||
} | |||||
// http://itrona.ch/stuff/F2-2_PJM_5_Beschreibung%20SML%20Datenprotokoll%20 | |||||
// V1.0_28.02.2011.pdf | |||||
// Daten von Stromzähler: Gesamtverbrauch herausfiltern | |||||
if ( /* OBIS Kennung: 1-0.1.8.0*255 = 01 00 01 08 00 | |||||
FF */ | |||||
BUFFER[j] == 0x77 && /* 77 - SML_Message.messageBody. | |||||
SML_GetList_Reponse.valList.valListEntry | |||||
(Sequence) */ | |||||
BUFFER[j+1] == 0x07 && /* 07 - objName (TL[1] + octet-string[6] */ | |||||
BUFFER[j+2] == 0x01 && /* 01 - objName Teil A */ | |||||
BUFFER[j+3] == 0x00 && /* 00 - objName Teil B */ | |||||
BUFFER[j+4] == 0x01 && /* 01 - objName Teil C */ | |||||
BUFFER[j+5] == 0x08 && /* 08 - objName Teil D */ | |||||
BUFFER[j+6] == 0x00 && /* 00 - objName Teil E */ | |||||
BUFFER[j+7] == 0xFF) /* FF - objName Teil F */ | |||||
/* xx - status */ | |||||
/* xx - valTime */ | |||||
/* xx - unit */ | |||||
/* xx - scaler */ | |||||
{ | |||||
j = j+8; | |||||
// status, valTime, unit und scaler überspringen | |||||
while (BUFFER[j] != 0x59) { j++; } /* 59 - value (TL[1] + 64 Bit Integer */ | |||||
// Zahl aus SML in Variable überführen | |||||
// 64 Bit: 2 x 32 Bit Variablen -> mWh | |||||
long long mWh = ((long long)BUFFER[j+1]) << 56 | | |||||
((long long)BUFFER[j+2]) << 48 | | |||||
((long long)BUFFER[j+3]) << 40 | | |||||
((long long)BUFFER[j+4]) << 32 | | |||||
((long long)BUFFER[j+5]) << 24 | | |||||
((long long)BUFFER[j+6]) << 16 | | |||||
((long long)BUFFER[j+7]) << 8 | | |||||
((long long)BUFFER[j+8]); | |||||
// Debug | |||||
Serial.println(); | |||||
Serial.print("mWh:"); Serial.println(mWh); | |||||
mWh = mWh / 10000; // mWh -> kWh | |||||
int kWh = (int) mWh; | |||||
// Debug | |||||
Serial.print("Gesamtverbrauch: ");Serial.println(kWh); | |||||
// Zählstand an MQTT Broker schicken | |||||
send_MQTT(kWh); | |||||
// Wenn Gesamtverbrauch in SML gefunden: Signal für Shutdown geben | |||||
return true; | |||||
} // Ende if (OBIS Kennung) | |||||
j++; | |||||
} // Ende for-Schleife | |||||
// Hier return falls keine gültige SML Nachricht erkannt wurde => ESP nicht | |||||
// ausschalten, sondern auf nächste warten | |||||
return false; | |||||
} | |||||
void send_MQTT(int kWh) { | |||||
String temp = String(kWh); | |||||
client.publish(MQTT_TOPIC_LIVE, temp.c_str()); | |||||
} | |||||
void RTC_Setup() { | |||||
/* Set Alarm 1 on seconds = 0, minutes = 0, hours = 0 */ | |||||
Wire.beginTransmission(RTC_I2C_ADDR); | |||||
Wire.write(0x07); // Address of A1M1 | |||||
Wire.write(0x00); // A1M1 = 0, alarm value seconds = 0 | |||||
Wire.write(0x80); // A1M2 = 0, alarm value minutes = 0 | |||||
Wire.write(0x80); // A1M3 = 0, alarm value hours = 0 | |||||
Wire.write(0x80); // A1M4 = 1, rest X | |||||
Wire.endTransmission(); | |||||
/* Set alarm 2 on minutes = 0, hours = 12 */ | |||||
Wire.beginTransmission(RTC_I2C_ADDR); | |||||
Wire.write(0x0B); // Address of A2M2 | |||||
Wire.write(0x00); // A2M2 = 0, alarm value minutes = 0 | |||||
Wire.write(0x12); // A2M3 = 0, alarm value hours = 12 | |||||
Wire.endTransmission(); | |||||
/* Set A1E & A2E control bits */ | |||||
Wire.beginTransmission(RTC_I2C_ADDR); | |||||
Wire.write(0x0e); // Control byte | |||||
Wire.write(0x1C | 3); // Default | A1E | A2E | |||||
Wire.endTransmission(); | |||||
} | |||||
void RTC_Shutdown() { | |||||
Wire.beginTransmission(RTC_I2C_ADDR); | |||||
Wire.write(0x0F); // Address of control/status register | |||||
Wire.endTransmission(); | |||||
Wire.requestFrom(RTC_I2C_ADDR, 1); // Read the current value of the register | |||||
unsigned char reg_val = Wire.read(); | |||||
Wire.beginTransmission(RTC_I2C_ADDR); | |||||
Wire.write(0x0F); // Address of control/status register | |||||
Wire.write(reg_val & ~0x03); // Write the old value with A1F&A2F flags | |||||
// cleared | |||||
Wire.endTransmission(); // -> this resets the latching ~INT Pin | |||||
} |
/* | |||||
* Stand: 25.08.2021 | |||||
* Author: Julian Rico | |||||
* | |||||
* Teststand für Stromzähler-Empfänger. | |||||
* | |||||
* Diese Software bietet ein Interface, um den Empfänger zu testen. | |||||
* Der Benutzer kann Zahlen eingeben, welche als Zählstand interpretiert werden. | |||||
* Der Zählstand wird dann in Form eines SML Pakets verschickt. | |||||
*/ | |||||
/* Defines */ | |||||
#define BAUDRATE 9600 | |||||
#define BUFFERSIZE 100 | |||||
/* Globale Variablen */ | |||||
int BUFFER[BUFFERSIZE]; // Buffer für Einlesen serieller Daten | |||||
float kWh; // Speichervariable für berechneten Input | |||||
int i, j; // Laufvariablen | |||||
/* Funktionsprototypen */ | |||||
void readInput(); | |||||
void sendSML(unsigned long mWh); | |||||
/* Setup: einmalig */ | |||||
void setup() { | |||||
// Debug LED | |||||
pinMode(LED_BUILTIN, OUTPUT); | |||||
digitalWrite(LED_BUILTIN, LOW); | |||||
// Serial Setup | |||||
Serial.begin(BAUDRATE); | |||||
Serial.println("¡Bitte geben Sie einen ganzzahligen Wert ein [kWh]!"); | |||||
Serial.flush(); | |||||
} | |||||
/* Hauptprogramm */ | |||||
void loop() { | |||||
// Warten auf Eingabe von Bediener | |||||
if (Serial.available() > 0) | |||||
{ | |||||
digitalWrite(LED_BUILTIN, HIGH); | |||||
readInput(); | |||||
} | |||||
delay(50); | |||||
} | |||||
void readInput() { | |||||
// Einlesen | |||||
i = 0; | |||||
do { | |||||
if (i<BUFFERSIZE) { | |||||
BUFFER[i] = Serial.read(); | |||||
i++; | |||||
} | |||||
} while (Serial.available()); | |||||
i--; // Letzter Eintrag in Buffer ist LF | |||||
// Input umrechnen | |||||
kWh = 0; | |||||
for (j = i; j > 0; j--) { | |||||
kWh = kWh + (BUFFER[j-1]-48) * pow(10, (i-j)); | |||||
} | |||||
// SML senden | |||||
// +0.5 für korrektes Auf- und Abrunden, cast rundet immer ab, | |||||
// *10.000 für kWh->mWh | |||||
sendSML(((unsigned long)(kWh+0.5)*10000)); | |||||
// Buffer löschen | |||||
for (j = 0; j < i+2; j++) | |||||
BUFFER[j] = 0; | |||||
} | |||||
void sendSML(unsigned long mWh) { | |||||
// Hier wird ein Teil einer SML Nachricht verschickt | |||||
// Konkret handelt es sich um die Sequence mit dem OBIS Kenncode | |||||
// 1.8.0*255 (=Gesamtverbrauch) | |||||
Serial.write(0x77); /* 'M' ASCII = 77 - SML_Message.messageBody. | |||||
SML_GetList_Reponse.valList.valListEntry (Sequence) */ | |||||
Serial.write(0x07); /* 07 - objName (TL[1] + octet-string[6] */ | |||||
Serial.write(0x01); /* 01 - objName Teil A */ | |||||
Serial.write(0x00); /* 00 - objName Teil B */ | |||||
Serial.write(0x01); /* 01 - objName Teil C */ | |||||
Serial.write(0x08); /* 08 - objName Teil D */ | |||||
Serial.write(0x00); /* 00 - objName Teil E */ | |||||
Serial.write(0xFF); /* FF - objName Teil F */ | |||||
Serial.write(0x01); /* 01 - Status (optional: 01 bedeutet "nicht versorgt") */ | |||||
Serial.write(0x01); /* 01 - valTime (optional: 01 bedeutet "nicht versorgt") */ | |||||
Serial.write(0x01); /* 01 - unit (optional: 01 bedeutet "nicht versorgt") */ | |||||
Serial.write(0x01); /* 01 - scaler (optional: 01 bedeutet "nicht versorgt") */ | |||||
Serial.write(0x59); /* 01 - value (TL[1] + Integer[8]) */ | |||||
Serial.write(0x00); /* value[0] -- wir bekommen nur 4 Byte, | |||||
daher die ersten 4 nullen */ | |||||
Serial.write(0x00); /* value[1] -- wir bekommen nur 4 Byte, | |||||
daher die ersten 4 nullen */ | |||||
Serial.write(0x00); /* value[2] -- wir bekommen nur 4 Byte, | |||||
daher die ersten 4 nullen */ | |||||
Serial.write(0x00); /* value[3] -- wir bekommen nur 4 Byte, | |||||
daher die ersten 4 nullen */ | |||||
// Letzten 4 Bytes: mWh (unsigned long) konvertieren in 4 Bytes | |||||
unsigned long temp; | |||||
temp = (mWh & 0xFF000000) >> 24; | |||||
Serial.write(temp); /* value[4] */ | |||||
temp = (mWh & 0x00FF0000) >> 16; | |||||
Serial.write(temp); /* value[5] */ | |||||
temp = (mWh & 0x0000FF00) >> 8; | |||||
Serial.write(temp); /* value[6] */ | |||||
temp = (mWh & 0x000000FF); | |||||
Serial.write(temp); /* value[7] */ | |||||
Serial.println(); | |||||
Serial.println("¡Bei Bedarf nächsten ganzzahligen Wert eingeben [kWh]!"); | |||||
} |
code . |
[{"id":"c787281f.74e0d8","type":"tab","label":"Stromzähler","disabled":false,"info":""},{"id":"f7ce84ed.37bb98","type":"debug","z":"c787281f.74e0d8","name":"smartmeter","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":570,"y":140,"wires":[]},{"id":"8893a714.038598","type":"mqtt in","z":"c787281f.74e0d8","name":"","topic":"smartmeter","qos":"2","datatype":"auto","broker":"661ef6c0.9862c8","nl":false,"rap":true,"rh":0,"x":310,"y":200,"wires":[["f7ce84ed.37bb98","6dd1b1e1.a7a08"]]},{"id":"bce62462.8f74b8","type":"mysql","z":"c787281f.74e0d8","mydb":"dfedc41f.024908","name":"MariaDB[Test]","x":760,"y":200,"wires":[["e83fead6.1278f8"]]},{"id":"e83fead6.1278f8","type":"function","z":"c787281f.74e0d8","name":"Insert","func":"msg.letzterWert = msg.payload[0].wert;\nmsg.topic = \"\";\nif (msg.neuerWert > msg.letzterWert && msg.neuerWert < msg.letzterWert * 2) {\n msg.topic = \"INSERT INTO Messwert2(wert) VALUES ('\"+msg.neuerWert +\"');\";\n return msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":550,"y":300,"wires":[["215a35eb.e74dba"]]},{"id":"6dd1b1e1.a7a08","type":"function","z":"c787281f.74e0d8","name":"Abfrage","func":"msg.neuerWert = msg.payload;\nmsg.topic = \"SELECT wert FROM Messwert2 ORDER BY zeit DESC LIMIT 1;\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":560,"y":200,"wires":[["bce62462.8f74b8"]]},{"id":"215a35eb.e74dba","type":"mysql","z":"c787281f.74e0d8","mydb":"dfedc41f.024908","name":"MariaDB[Test]","x":760,"y":300,"wires":[["41aafba1.90e274"]]},{"id":"383b0cad.e75764","type":"comment","z":"c787281f.74e0d8","name":"Plausibilitätsprüfung","info":"# Neuen Wert mit letztem Wert vergleichen.\nFalls neuer Wert < letzter Wert oder neuer Wert > letzter Wert * 2: VERWERFEN","x":330,"y":120,"wires":[]},{"id":"41aafba1.90e274","type":"function","z":"c787281f.74e0d8","name":"Abfrage","func":"msg.neuerWert = msg.payload;\nmsg.topic = \"SELECT wert FROM Messwert2 ORDER BY zeit DESC LIMIT 1;\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":560,"y":380,"wires":[["b93dd8ce.16f098"]]},{"id":"b93dd8ce.16f098","type":"mysql","z":"c787281f.74e0d8","mydb":"dfedc41f.024908","name":"MariaDB[Test]","x":760,"y":380,"wires":[["ac879fab.637c9"]]},{"id":"49856b23.6bc074","type":"ui_numeric","z":"c787281f.74e0d8","name":"","label":"Gesamtverbrauch [kWh]:","tooltip":"Letzter gemessener Zählstand","group":"f767f57e.fafca8","order":2,"width":0,"height":0,"wrap":false,"passthru":true,"topic":"topic","topicType":"msg","format":"{{value}}","min":0,"max":10,"step":1,"x":1110,"y":420,"wires":[[]]},{"id":"99d60078.bca59","type":"debug","z":"c787281f.74e0d8","name":"output","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1050,"y":480,"wires":[]},{"id":"ac879fab.637c9","type":"change","z":"c787281f.74e0d8","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload[0].wert","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":800,"y":480,"wires":[["49856b23.6bc074","99d60078.bca59"]]},{"id":"e311af7a.c55cf","type":"comment","z":"c787281f.74e0d8","name":"Dashboard Ideen Hr. Klehn","info":"Ideen für Dashboard:\n- Durchschnittlicher Tageswert vom letzten Monat\n- Letzte Woche\n- Letzte Woche jeden Tag","x":1110,"y":360,"wires":[]},{"id":"661ef6c0.9862c8","type":"mqtt-broker","name":"RaspberryBroker","broker":"192.168.0.12","port":"1883","clientid":"","usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"log","birthQos":"0","birthPayload":"ONLINE","birthMsg":{},"closeTopic":"log","closeQos":"0","closePayload":"OFFLINE","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""},{"id":"dfedc41f.024908","type":"MySQLdatabase","name":"","host":"localhost","port":"3306","db":"Test","tz":"","charset":"UTF8"},{"id":"f767f57e.fafca8","type":"ui_group","name":"Standard","tab":"8bfe23ff.a6f95","order":1,"disp":true,"width":"6","collapse":false},{"id":"8bfe23ff.a6f95","type":"ui_tab","name":"Home","icon":"dashboard","disabled":false,"hidden":false}] |
/* | |||||
* Stand: 25.08.2021 | |||||
* Author: Julian Rico | |||||
* | |||||
* Software für Stromzähler-Empfänger | |||||
* | |||||
* Diese Software beinhaltet die Logik, um einen EMH Gen. K Stromzähler per Infrarot-Schnittstelle auszulesen | |||||
* und den Gesamtverbrauch des Zählers per MQTT an einen MQTT Broker zu schicken. | |||||
*/ | |||||
/* Includes */ | |||||
#include <Wire.h> | |||||
#include <WiFiManager.h> /* https://github.com/tzapu/WiFiManager */ | |||||
#include <PubSubClient.h> /* https://github.com/knolleary/pubsubclient */ | |||||
/* Defines */ | |||||
#define BAUDRATE 9600 | |||||
#define BUFFERSIZE 1000 | |||||
#define RTC_I2C_ADDR 0x68 | |||||
/* Globale Variablen */ | |||||
int BUFFER[BUFFERSIZE]; // Buffer für Einlesen serieller Daten | |||||
int i, j, error; // Laufvariablen | |||||
int shutdown = 0; // Wird gesetzt nach erfolgreichem Einlesen des Zählstands | |||||
WiFiClient espClient; // WiFi | |||||
PubSubClient client(espClient); // MQTT Client | |||||
const char* MQTT_BROKER = "192.168.178.102"; // MQTT Broker IP -> TODO anpassen | |||||
const unsigned short MQTT_PORT = 1883; // MQTT Broker Port -> TODO prüfen | |||||
char* MQTT_TOPIC_LIVE = "smartmeter"; // MQTT Topic für Stromzählerwerte | |||||
char* MQTT_TOPIC_TEST = "ESP"; // MQTT Topic für Eingaben von Teststand | |||||
char* MQTT_MSG = "ESP ONLINE."; // Message von ESP wenn Setup erfolgreich | |||||
/* Functionsprototypen */ | |||||
void callback(char* topic, byte* payload, unsigned int length); // MQTT Callback: Gibt erhaltene Message aus | |||||
bool readTelegramm(); // Liest serielle Daten ein, unterscheidet ob Daten von Teststand oder Stromzähler kommen | |||||
void read_smartmeter(int start, int komma, int ende); // Versendet Zählstand per MQTT (TOPIC_LIVE) | |||||
void read_teststation(int start); // Versendet Testdaten per MQTT (TOPIC_TEST) | |||||
void RTC_Setup(); // Alarm Register und Control Bits setzen | |||||
void RTC_Shutdown(); // Ausschalten | |||||
/* Setup: einmalig */ | |||||
void setup() { | |||||
// Debug LED | |||||
pinMode(LED_BUILTIN, OUTPUT); | |||||
digitalWrite(LED_BUILTIN, HIGH); | |||||
// Serial Setup | |||||
Serial.begin(BAUDRATE); | |||||
Serial.flush(); | |||||
Serial.println("Serial init done."); | |||||
// Wifi Setup | |||||
WiFi.mode(WIFI_STA); | |||||
WiFiManager wifiManager; | |||||
bool res; | |||||
res = wifiManager.autoConnect("ESP32-STROMZÄHLER", "PASSWORD"); | |||||
if(!res) { | |||||
Serial.println("Failed to connect"); | |||||
} | |||||
else { | |||||
//if you get here you have connected to the WiFi | |||||
Serial.println("connected...yeey :)"); | |||||
} | |||||
// MQTT Setup | |||||
error = 0; | |||||
client.setServer(MQTT_BROKER, MQTT_PORT); | |||||
while (!client.connected()) { | |||||
client.connect("ESP8266Client"); | |||||
if (client.connected()) { | |||||
Serial.println("MQTT connected"); | |||||
} | |||||
else { | |||||
Serial.print("failed, rc="); | |||||
Serial.print(client.state()); | |||||
Serial.println("try again in 5 seconds"); | |||||
delay(5000); | |||||
error++; | |||||
if (error == 12) { // Nach 60 Sekunden Shutdown | |||||
RTC_Shutdown(); | |||||
} | |||||
} | |||||
} | |||||
// Das kann dann später raus, ist nur zum testen der MQTT Verbindung per Serial Monitor | |||||
client.subscribe(MQTT_TOPIC_TEST); | |||||
client.setCallback(callback); | |||||
client.publish(MQTT_TOPIC_TEST, MQTT_MSG); | |||||
// RTC | |||||
RTC_Setup(); | |||||
Serial.println("RTC Setup done"); | |||||
} | |||||
/* Hauptprogramm */ | |||||
void loop() { | |||||
// Benötigt für Empfangen von MQTT Messages -> kann später raus | |||||
client.loop(); | |||||
// ESP kommst sonst seriell nicht hinterher | |||||
delay(75); | |||||
// Serielle Daten einlesen falls vorhanden | |||||
if (Serial.available() > 0) { | |||||
if (readTelegramm()) | |||||
shutdown = 1; | |||||
} | |||||
// Buffer für nächsten Datensatz leeren (benötigt, wenn Zählstand nicht dabei war) | |||||
if (i > 0) { | |||||
for (int k = 0; k < i; k++) | |||||
BUFFER[k] = 0; | |||||
i = 0; | |||||
} | |||||
// Shutdown durch RTC vorbereiten | |||||
if (shutdown) | |||||
RTC_Shutdown(); | |||||
} | |||||
/* MQTT Subscriber Callback */ | |||||
void callback(char* topic, byte* payload, unsigned int length) { | |||||
Serial.print("New message in topic: "); | |||||
Serial.println(topic); | |||||
Serial.print("Message: "); | |||||
for (i = 0; i < length; i++) { | |||||
Serial.print((char)payload[i]); | |||||
} | |||||
Serial.println(); | |||||
Serial.println("-----------------------"); | |||||
Serial.println(); | |||||
} | |||||
bool readTelegramm() { | |||||
// Read D0 Telegram | |||||
i = 0; | |||||
do { | |||||
if(i < BUFFERSIZE) { | |||||
BUFFER[i] = Serial.read(); | |||||
/* Debug */ | |||||
if (BUFFER[i] < 0xF) | |||||
Serial.print("0"); // Führende Null erzeugen | |||||
Serial.print(BUFFER[i], HEX); | |||||
Serial.print(" "); | |||||
if (BUFFER[i] == 0x0A) { // 0A (hex) = LF (ASCII) => Neue Zeile | |||||
Serial.println(); | |||||
} | |||||
/* Debug Ende */ | |||||
i++; | |||||
} | |||||
} while (Serial.available()); | |||||
// Buffer nach Daten für Zählerstand absuchen | |||||
for (j = 0; j < i; j++) { // Buffer nach Zeichen absuchen | |||||
// Daten von Teststand: "¡Bitte geben Sie ... !"); | |||||
if (BUFFER[j] == 0xC2 && BUFFER[j+1]) { /* C2 A1 = '¡' */ | |||||
return false; // Shutdown für RTC nur schicken wenn Daten von Smartmeter kommen | |||||
} | |||||
// http://itrona.ch/stuff/F2-2_PJM_5_Beschreibung%20SML%20Datenprotokoll%20V1.0_28.02.2011.pdf | |||||
// Daten von Stromzähler: Gesamtverbrauch herausfiltern | |||||
if ( /* OBIS Kennung: 1-0.1.8.0*255 = 01 00 01 08 00 FF */ | |||||
BUFFER[j] == 0x77 && /* 77 - SML_Message.messageBody.SML_GetList_Reponse.valList.valListEntry (Sequence) */ | |||||
BUFFER[j+1] == 0x07 && /* 07 - objName (TL[1] + octet-string[6] */ | |||||
BUFFER[j+2] == 0x01 && /* 01 - objName Teil A */ | |||||
BUFFER[j+3] == 0x00 && /* 00 - objName Teil B */ | |||||
BUFFER[j+4] == 0x01 && /* 01 - objName Teil C */ | |||||
BUFFER[j+5] == 0x08 && /* 08 - objName Teil D */ | |||||
BUFFER[j+6] == 0x00 && /* 00 - objName Teil E */ | |||||
BUFFER[j+7] == 0xFF) /* FF - objName Teil F */ | |||||
/* xx - status */ | |||||
/* xx - valTime */ | |||||
/* xx - unit */ | |||||
/* xx - scaler */ | |||||
{ | |||||
j = j+8; | |||||
// status, valTime, unit und scaler überspringen | |||||
while (BUFFER[j] != 0x59) { j++; } /* 59 - value (TL[1] + 64 Bit Integer */ | |||||
// Zahl aus SML in Variable überführen | |||||
// 64 Bit: 2 x 32 Bit Variablen -> mWh | |||||
long long mWh = ((long long)BUFFER[j+1]) << 56 | ((long long)BUFFER[j+2]) << 48 | ((long long)BUFFER[j+3]) << 40 | ((long long)BUFFER[j+4]) << 32 | | |||||
((long long)BUFFER[j+5]) << 24 | ((long long)BUFFER[j+6]) << 16 | ((long long)BUFFER[j+7]) << 8 | ((long long)BUFFER[j+8]); | |||||
// Debug | |||||
Serial.println(); | |||||
Serial.print("mWh:"); Serial.println(mWh); | |||||
mWh = mWh / 10000; // mWh -> kWh | |||||
int kWh = (int) mWh; | |||||
// Debug | |||||
Serial.print("Gesamtverbrauch: ");Serial.println(kWh); | |||||
// Zählstand an MQTT Broker schicken | |||||
send_MQTT(kWh); | |||||
// Wenn Gesamtverbrauch in SML gefunden: Signal für Shutdown geben | |||||
return true; | |||||
} // Ende if (OBIS Kennung) | |||||
j++; | |||||
} // Ende for-Schleife | |||||
// Hier return falls keine gültige SML Nachricht erkannt wurde => ESP nicht ausschalten, sondern auf nächste warten | |||||
return false; | |||||
} | |||||
void send_MQTT(int kWh) { | |||||
String temp = String(kWh); | |||||
client.publish(MQTT_TOPIC_LIVE, temp.c_str()); | |||||
} | |||||
void RTC_Setup() { | |||||
/* Set Alarm 1 on seconds = 0, minutes = 0, hours = 0 */ | |||||
Wire.beginTransmission(RTC_I2C_ADDR); | |||||
Wire.write(0x07); // Address of A1M1 | |||||
Wire.write(0x00); // A1M1 = 0, alarm value seconds = 0 | |||||
Wire.write(0x80); // A1M2 = 0, alarm value minutes = 0 | |||||
Wire.write(0x80); // A1M3 = 0, alarm value hours = 0 | |||||
Wire.write(0x80); // A1M4 = 1, rest X | |||||
Wire.endTransmission(); | |||||
/* Set alarm 2 on minutes = 0, hours = 12 */ | |||||
Wire.beginTransmission(RTC_I2C_ADDR); | |||||
Wire.write(0x0B); // Address of A2M2 | |||||
Wire.write(0x00); // A2M2 = 0, alarm value minutes = 0 | |||||
Wire.write(0x12); // A2M3 = 0, alarm value hours = 12 | |||||
Wire.endTransmission(); | |||||
/* Set A1E & A2E control bits */ | |||||
Wire.beginTransmission(RTC_I2C_ADDR); | |||||
Wire.write(0x0e); // Control byte | |||||
Wire.write(0x1C | 3); // Default | A1E | A2E | |||||
Wire.endTransmission(); | |||||
} | |||||
void RTC_Shutdown() { | |||||
Wire.beginTransmission(RTC_I2C_ADDR); | |||||
Wire.write(0x0F); // Address of control/status register | |||||
Wire.endTransmission(); | |||||
Wire.requestFrom(RTC_I2C_ADDR, 1); // Read the current value of the register | |||||
unsigned char reg_val = Wire.read(); | |||||
Wire.beginTransmission(RTC_I2C_ADDR); | |||||
Wire.write(0x0F); // Address of control/status register | |||||
Wire.write(reg_val & ~0x03); // Write the old value with A1F&A2F flags cleared | |||||
Wire.endTransmission(); // -> this resets the latching ~INT Pin | |||||
} |
/* | |||||
* Stand: 25.08.2021 | |||||
* Author: Julian Rico | |||||
* | |||||
* Teststand für Stromzähler-Empfänger. | |||||
* | |||||
* Diese Software bietet ein Interface, um den Empfänger zu testen. | |||||
* Der Benutzer kann Zahlen eingeben, welche als Zählstand interpretiert werden. | |||||
* Der Zählstand wird dann in Form eines SML Pakets verschickt. | |||||
*/ | |||||
/* Defines */ | |||||
#define BAUDRATE 9600 | |||||
#define BUFFERSIZE 100 | |||||
/* Globale Variablen */ | |||||
int BUFFER[BUFFERSIZE]; // Buffer für Einlesen serieller Daten | |||||
float kWh; // Speichervariable für berechneten Input | |||||
int i, j; // Laufvariablen | |||||
/* Funktionsprototypen */ | |||||
void readInput(); | |||||
void sendSML(unsigned long mWh); | |||||
/* Setup: einmalig */ | |||||
void setup() { | |||||
// Debug LED | |||||
pinMode(LED_BUILTIN, OUTPUT); | |||||
digitalWrite(LED_BUILTIN, LOW); | |||||
// Serial Setup | |||||
Serial.begin(BAUDRATE); | |||||
Serial.println("¡Bitte geben Sie einen ganzzahligen Wert ein [kWh]!"); | |||||
Serial.flush(); | |||||
} | |||||
/* Hauptprogramm */ | |||||
void loop() { | |||||
// Warten auf Eingabe von Bediener | |||||
if (Serial.available() > 0) | |||||
{ | |||||
digitalWrite(LED_BUILTIN, HIGH); | |||||
readInput(); | |||||
} | |||||
delay(50); | |||||
} | |||||
void readInput() { | |||||
// Einlesen | |||||
i = 0; | |||||
do { | |||||
if (i<BUFFERSIZE) { | |||||
BUFFER[i] = Serial.read(); | |||||
i++; | |||||
} | |||||
} while (Serial.available()); | |||||
i--; // Letzter Eintrag in Buffer ist LF | |||||
// Input umrechnen | |||||
kWh = 0; | |||||
for (j = i; j > 0; j--) { | |||||
kWh = kWh + (BUFFER[j-1]-48) * pow(10, (i-j)); | |||||
} | |||||
// SML senden | |||||
sendSML(((unsigned long)(kWh+0.5)*10000)); // +0.5 für korrektes Auf- und Abrunden, cast rundet immer ab, *10.000 für kWh->mWh | |||||
// Buffer löschen | |||||
for (j = 0; j < i+2; j++) | |||||
BUFFER[j] = 0; | |||||
} | |||||
void sendSML(unsigned long mWh) { | |||||
// Hier wird ein Teil einer SML Nachricht verschickt | |||||
// Konkret handelt es sich um die Sequence mit dem OBIS Kenncode 1.8.0*255 (=Gesamtverbrauch) | |||||
Serial.write(0x77); /* 'M' ASCII = 77 - SML_Message.messageBody.SML_GetList_Reponse.valList.valListEntry (Sequence) */ | |||||
Serial.write(0x07); /* 07 - objName (TL[1] + octet-string[6] */ | |||||
Serial.write(0x01); /* 01 - objName Teil A */ | |||||
Serial.write(0x00); /* 00 - objName Teil B */ | |||||
Serial.write(0x01); /* 01 - objName Teil C */ | |||||
Serial.write(0x08); /* 08 - objName Teil D */ | |||||
Serial.write(0x00); /* 00 - objName Teil E */ | |||||
Serial.write(0xFF); /* FF - objName Teil F */ | |||||
Serial.write(0x01); /* 01 - Status (optional: 01 bedeutet "nicht versorgt") */ | |||||
Serial.write(0x01); /* 01 - valTime (optional: 01 bedeutet "nicht versorgt") */ | |||||
Serial.write(0x01); /* 01 - unit (optional: 01 bedeutet "nicht versorgt") */ | |||||
Serial.write(0x01); /* 01 - scaler (optional: 01 bedeutet "nicht versorgt") */ | |||||
Serial.write(0x59); /* 01 - value (TL[1] + Integer[8]) */ | |||||
Serial.write(0x00); /* value[0] -- wir bekommen nur 4 Byte, daher die ersten 4 nullen */ | |||||
Serial.write(0x00); /* value[1] -- wir bekommen nur 4 Byte, daher die ersten 4 nullen */ | |||||
Serial.write(0x00); /* value[2] -- wir bekommen nur 4 Byte, daher die ersten 4 nullen */ | |||||
Serial.write(0x00); /* value[3] -- wir bekommen nur 4 Byte, daher die ersten 4 nullen */ | |||||
// Letzten 4 Bytes: mWh (unsigned long) konvertieren in 4 Bytes | |||||
unsigned long temp; | |||||
temp = (mWh & 0xFF000000) >> 24; | |||||
Serial.write(temp); /* value[4] */ | |||||
temp = (mWh & 0x00FF0000) >> 16; | |||||
Serial.write(temp); /* value[5] */ | |||||
temp = (mWh & 0x0000FF00) >> 8; | |||||
Serial.write(temp); /* value[6] */ | |||||
temp = (mWh & 0x000000FF); | |||||
Serial.write(temp); /* value[7] */ | |||||
Serial.println(); | |||||
Serial.println("¡Bei Bedarf nächsten ganzzahligen Wert eingeben [kWh]!"); | |||||
} |