40 Commits

Author SHA1 Message Date
a30dbe0759 go to stay alive 2024-01-07 14:33:02 +01:00
5724088780 remove boardaccess arc and replace with static lazy 2023-12-27 20:00:06 +01:00
4c02b99ea7 webserver improvements 2023-12-27 17:33:11 +01:00
1e40e2e3ba move to typescript, testmode, shiftregister revival 2023-12-23 01:59:00 +01:00
fd823217aa fix for reset of shift register 2023-12-23 01:56:07 +01:00
2541c83ebe more javascript shit 2023-12-22 17:26:00 +01:00
58801f870e initial config changes 2023-12-22 01:35:08 +01:00
066b3ec24f play with config page 2023-12-19 10:45:56 +01:00
303bdd131f fix reverse protection diodes 2023-12-19 10:45:22 +01:00
5d6871250e wifi config file handling added 2023-12-12 03:46:53 +01:00
e43538ec8a free size handling 2023-12-07 02:50:50 +01:00
fb0ad6b1dc file write test 2023-12-07 02:33:17 +01:00
f0f0e9f27e adjustments 2023-12-04 00:41:29 +01:00
4a8fffb3cc Merge branch 'feature/12v' of github.com:0110/PlantCtrl into feature/12v
# Conflicts:
#	rust/Cargo.toml
2023-11-30 19:26:03 +01:00
dd949a1be1 partition table 2023-11-29 18:28:09 +01:00
a9ab4ee99b fixes 2023-11-29 18:27:55 +01:00
8bfa27612d config start 2023-11-29 18:27:40 +01:00
55369e46a8 adjusted partitions 2023-11-29 18:27:23 +01:00
b2e5ccccee adjusted runner 2023-11-29 18:27:15 +01:00
031e8de99f use vergen 2023-11-27 01:07:07 +01:00
d35b814047 adjust compile stuff 2023-11-27 00:05:09 +01:00
0a0ac6babf added chrono-tz filter 2023-11-23 22:50:17 +01:00
b268466b89 adjustments 2023-11-21 23:45:15 +01:00
3c409ea339 proceeed further 2023-11-21 01:05:12 +01:00
825d389a8c design 2023-11-20 02:24:14 +01:00
17db1b8a45 adjust folder to be shorter 2023-11-20 01:46:19 +01:00
2092354bc9 ignore netlist 2023-11-20 00:14:29 +01:00
ae8ff86c1a rust init 2023-11-20 00:05:47 +01:00
ec67450a0a finalize layout for comparator 2023-11-01 22:44:32 +01:00
f72135a2b3 finalize 2023-10-26 23:08:03 +02:00
ba0fa2e732 added bettry manager 2023-10-26 07:49:56 +02:00
d3d6ad8ffb added batterymanagemt 2023-10-22 20:06:27 +02:00
ca74a716b7 updated layout 2023-10-22 01:20:17 +02:00
ba9fc2432b changes 2023-10-21 21:59:41 +02:00
fd08921bba layouted further 2023-10-16 01:10:03 +02:00
33082b7481 add charging circuit 2023-10-15 13:16:44 +02:00
8cc9b9d492 layouting continued 2023-10-11 00:01:17 +02:00
928dce949d Signed-off-by: Empire <empirephoenix@yahoo.de> 2023-10-10 20:20:48 +02:00
5f20ec17d0 12v layout tests 2023-09-27 00:55:39 +02:00
bdd9a17757 initial bus design 2023-09-26 01:20:07 +02:00
118 changed files with 241831 additions and 126984 deletions

11
.gitignore vendored
View File

@@ -1 +1,12 @@
*.sch-bak
PlantCtrlESP32-backups/
board/production/PlantCtrlESP32_2023-11-08_00-45-35/PlantCtrlESP32.zip
board/production/PlantCtrlESP32_2023-11-08_00-45-35/netlist.ipc
.vscode
.embuild/
target
Cargo.lock
node_modules/
rust/src/webserver/bundle.js
rust/image.bin

46
board/4435.kicad_mod Normal file
View File

@@ -0,0 +1,46 @@
(footprint "4435" (version 20221018) (generator pcbnew)
(layer "F.Cu")
(attr smd)
(fp_text reference "REF**" (at -3.705 0 90) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 888d4749-ec8d-48e0-b622-265ef152540e)
)
(fp_text value "4435" (at 0 0) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 92782e22-8381-4ed1-a11f-ef69c9601af0)
)
(fp_line (start -2.705 -1.9) (end 2.705 -1.9)
(stroke (width 0.12) (type default)) (layer "F.SilkS") (tstamp 3128977c-e0a0-4ca7-8f5b-79eab6c86d44))
(fp_line (start -2.705 1.1) (end -2.705 -1.9)
(stroke (width 0.12) (type default)) (layer "F.SilkS") (tstamp b5339e6e-bef0-40f8-ac0d-5ffe68b262f3))
(fp_line (start -1.905 1.9) (end -2.705 1.1)
(stroke (width 0.12) (type default)) (layer "F.SilkS") (tstamp 267dcc87-49da-46db-86da-4ce81b7d2468))
(fp_line (start 2.705 -1.9) (end 2.705 1.9)
(stroke (width 0.12) (type default)) (layer "F.SilkS") (tstamp 14aaa409-1cdb-4bf6-a811-f0da4dffe73a))
(fp_line (start 2.705 1.9) (end -1.905 1.9)
(stroke (width 0.12) (type default)) (layer "F.SilkS") (tstamp 1789de97-d192-4375-b67e-3ad05848eee2))
(fp_line (start -2.46 -4.85) (end 2.46 -4.85)
(stroke (width 0.05) (type default)) (layer "F.CrtYd") (tstamp f4d6fc79-0700-4ee7-b411-e8f033ff66d3))
(fp_line (start -2.46 4.85) (end -2.46 -4.85)
(stroke (width 0.05) (type default)) (layer "F.CrtYd") (tstamp 3cfe9046-c22e-44b7-8f86-5e90bf2c83b0))
(fp_line (start 2.46 -4.85) (end 2.46 4.85)
(stroke (width 0.05) (type default)) (layer "F.CrtYd") (tstamp 41eb9d06-d36a-4d1d-a098-b2c48b580c65))
(fp_line (start 2.46 4.85) (end -2.46 4.85)
(stroke (width 0.05) (type default)) (layer "F.CrtYd") (tstamp 05ce4f60-8c60-4fe2-86da-df65172ffb03))
(pad "1" smd rect (at -1.905 -3.5) (size 0.6 2.2) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45) (tstamp 239f0d43-7a93-43bf-abef-be78a7aed604))
(pad "1" smd rect (at -0.635 -3.5) (size 0.6 2.2) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45) (tstamp a9c370b9-178b-48cd-94a4-ca368fb8484d))
(pad "1" smd rect (at 0.635 -3.5) (size 0.6 2.2) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45) (tstamp 8d506357-8b26-4d9b-b778-52fd40f96071))
(pad "1" smd rect (at 1.905 -3.5) (size 0.6 2.2) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45) (tstamp 4f4e03c6-0964-4327-a6cb-2e71085bfef0))
(pad "2" smd rect (at 1.905 3.5) (size 0.6 2.2) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45) (tstamp 3f6b4cbd-12fd-4380-92b9-d204178e6014))
(pad "3" smd rect (at -1.905 3.5) (size 0.6 2.2) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45) (tstamp bb893791-93a0-4766-9b0e-f175da5df5f4))
(pad "3" smd rect (at -0.635 3.5) (size 0.6 2.2) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45) (tstamp 8487832e-80f2-4019-9519-9da7cbe24a96))
(pad "3" smd rect (at 0.635 3.5) (size 0.6 2.2) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45) (tstamp 4ecffbef-d0f1-4d07-af9a-0fb6030dccea))
)

82
board/CN3306.kicad_sym Normal file
View File

@@ -0,0 +1,82 @@
(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
(symbol "CN3306" (in_bom yes) (on_board yes)
(property "Reference" "U" (at 5.08 -5.08 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "" (at 0 0 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "CN3306_1_1"
(rectangle (start -2.54 7.62) (end 12.7 -16.51)
(stroke (width 0) (type default))
(fill (type background))
)
(pin input line (at 15.24 -8.89 180) (length 2.54)
(name "FB" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin input line (at 5.08 10.16 270) (length 2.54)
(name "COME" (effects (font (size 1.27 1.27))))
(number "10" (effects (font (size 1.27 1.27))))
)
(pin input line (at 15.24 -13.97 180) (length 2.54)
(name "VCC" (effects (font (size 1.27 1.27))))
(number "11" (effects (font (size 1.27 1.27))))
)
(pin input line (at 15.24 -11.43 180) (length 2.54)
(name "VCC" (effects (font (size 1.27 1.27))))
(number "12" (effects (font (size 1.27 1.27))))
)
(pin input line (at 15.24 5.08 180) (length 2.54)
(name "DRV" (effects (font (size 1.27 1.27))))
(number "13" (effects (font (size 1.27 1.27))))
)
(pin input line (at 3.81 -19.05 90) (length 2.54)
(name "GND" (effects (font (size 1.27 1.27))))
(number "14" (effects (font (size 1.27 1.27))))
)
(pin input line (at 6.35 -19.05 90) (length 2.54)
(name "GND" (effects (font (size 1.27 1.27))))
(number "15" (effects (font (size 1.27 1.27))))
)
(pin input line (at 15.24 2.54 180) (length 2.54)
(name "ISW" (effects (font (size 1.27 1.27))))
(number "16" (effects (font (size 1.27 1.27))))
)
(pin input line (at -5.08 -10.16 0) (length 2.54)
(name "COMP" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin input line (at -5.08 -1.27 0) (length 2.54)
(name "MPPT" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
(pin input line (at -5.08 -7.62 0) (length 2.54)
(name "SHDN" (effects (font (size 1.27 1.27))))
(number "5" (effects (font (size 1.27 1.27))))
)
(pin input line (at -5.08 3.81 0) (length 2.54)
(name "CHRG" (effects (font (size 1.27 1.27))))
(number "6" (effects (font (size 1.27 1.27))))
)
(pin input line (at -5.08 1.27 0) (length 2.54)
(name "DONE" (effects (font (size 1.27 1.27))))
(number "7" (effects (font (size 1.27 1.27))))
)
(pin input line (at 15.24 -3.81 180) (length 2.54)
(name "CSP" (effects (font (size 1.27 1.27))))
(number "8" (effects (font (size 1.27 1.27))))
)
(pin input line (at 15.24 -6.35 180) (length 2.54)
(name "ONE" (effects (font (size 1.27 1.27))))
(number "9" (effects (font (size 1.27 1.27))))
)
)
)
)

123
board/CN3795.kicad_sym Normal file
View File

@@ -0,0 +1,123 @@
(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
(symbol "CN3795" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "U" (id 0) (at 5.08 18.542 0)
(effects (font (size 1.27 1.27)) (justify bottom left))
)
(property "Value" "CN3795" (id 1) (at 5.08 -20.32 0)
(effects (font (size 1.27 1.27)) (justify bottom left))
)
(property "Footprint" "CN3795:SSOP10" (id 2) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "MF" "Consonance" (id 4) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Description" "\n4A, Multi-Chemistry Battery Charger\nWith Photovoltaic Cell MPPT Function\n" (id 5) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Package" "Package" (id 6) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Price" "None" (id 7) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "SnapEDA_Link" "https://www.snapeda.com/parts/CN3795/Consonance/view-part/?ref=snap" (id 8) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "MP" "CN3795" (id 9) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Availability" "Not in stock" (id 10) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Check_prices" "https://www.snapeda.com/parts/CN3795/Consonance/view-part/?ref=eda" (id 11) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(symbol "CN3795_0_0"
(rectangle (start -12.7 -17.78) (end 12.7 17.78)
(stroke (width 0.254)) (fill (type background))
)
(pin bidirectional line (at -15.24 7.62 0) (length 2.54)
(name "VCC"
(effects (font (size 1.016 1.016)))
)
(number "9"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at -15.24 -2.54 0) (length 2.54)
(name "~{CHRG}"
(effects (font (size 1.016 1.016)))
)
(number "3"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at -15.24 -7.62 0) (length 2.54)
(name "MPPT"
(effects (font (size 1.016 1.016)))
)
(number "4"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at -2.54 20.32 270.0) (length 2.54)
(name "VG"
(effects (font (size 1.016 1.016)))
)
(number "1"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at 2.54 20.32 270.0) (length 2.54)
(name "DRV"
(effects (font (size 1.016 1.016)))
)
(number "10"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at 15.24 7.62 180.0) (length 2.54)
(name "CSP"
(effects (font (size 1.016 1.016)))
)
(number "8"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at 15.24 2.54 180.0) (length 2.54)
(name "BAT"
(effects (font (size 1.016 1.016)))
)
(number "7"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at 15.24 -2.54 180.0) (length 2.54)
(name "FB"
(effects (font (size 1.016 1.016)))
)
(number "6"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at 15.24 -7.62 180.0) (length 2.54)
(name "COM"
(effects (font (size 1.016 1.016)))
)
(number "5"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at 0.0 -20.32 90.0) (length 2.54)
(name "GND"
(effects (font (size 1.016 1.016)))
)
(number "2"
(effects (font (size 1.016 1.016)))
)
)
)
)
)

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
"board": {
"active_layer": 0,
"active_layer_preset": "",
"auto_track_width": true,
"auto_track_width": false,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
@@ -64,10 +64,12 @@
33,
34,
35,
36
36,
39,
40
],
"visible_layers": "fffffff_ffffffff",
"zone_display_mode": 0
"zone_display_mode": 1
},
"meta": {
"filename": "PlantCtrlESP32.kicad_prl",

View File

@@ -34,9 +34,9 @@
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.762,
"height": 1.524,
"width": 1.524
"drill": 0.0,
"height": 3.0,
"width": 1.6
},
"silk_line_width": 0.12,
"silk_text_italic": false,
@@ -45,12 +45,39 @@
"silk_text_thickness": 0.15,
"silk_text_upright": false,
"zones": {
"45_degree_only": false,
"min_clearance": 0.508
"min_clearance": 0.0
}
},
"diff_pair_dimensions": [],
"drc_exclusions": [],
"diff_pair_dimensions": [
{
"gap": 0.0,
"via_gap": 0.0,
"width": 0.0
}
],
"drc_exclusions": [
"courtyards_overlap|189080001|128865001|67ac55df-4a92-42f8-90ae-0f317d1fcee5|c62213e3-5f38-460c-825e-5567e84c0a13",
"courtyards_overlap|199080001|128865001|67ac55df-4a92-42f8-90ae-0f317d1fcee5|cfde0667-9234-45fc-8eda-14a18003cf8d",
"courtyards_overlap|209080001|128865001|5ed14a34-184f-41cd-94a0-c9f4df9ff6fd|cfde0667-9234-45fc-8eda-14a18003cf8d",
"courtyards_overlap|219080001|128865001|4dcef43e-4bc3-40ed-bbe5-22243d3d487f|5ed14a34-184f-41cd-94a0-c9f4df9ff6fd",
"courtyards_overlap|229080001|128865001|1c5c2a00-3616-406b-aedf-bf3a81986791|4dcef43e-4bc3-40ed-bbe5-22243d3d487f",
"courtyards_overlap|239080001|128865001|1c5c2a00-3616-406b-aedf-bf3a81986791|1ecf7cd6-6488-4305-b20b-72dbab800538",
"courtyards_overlap|249080001|128865001|1ecf7cd6-6488-4305-b20b-72dbab800538|6ccc9c73-6edf-479a-97a6-a01eda77987f",
"courtyards_overlap|268679999|80770001|22510631-57e1-46b7-916a-63be4d1f1249|ab413b79-2f68-48c4-8ed3-cedb5f870570",
"silk_edge_clearance|170180000|117670000|87e2c53a-11a1-4d9d-89a9-2a5ca6e6f269|058105c1-5307-4874-9401-d1e0612824b0",
"silk_edge_clearance|170180000|49705000|87e2c53a-11a1-4d9d-89a9-2a5ca6e6f269|2af3bc4a-e24d-48a4-898d-739774f84bd6",
"silk_edge_clearance|170180000|67945000|87e2c53a-11a1-4d9d-89a9-2a5ca6e6f269|d1ed732d-93f0-4bca-ae40-dde82301c749",
"silk_edge_clearance|170242295|123498571|87e2c53a-11a1-4d9d-89a9-2a5ca6e6f269|98242ad4-5a51-4508-b392-eeabff738172",
"silk_edge_clearance|170242295|127998571|87e2c53a-11a1-4d9d-89a9-2a5ca6e6f269|9dfe510c-725d-437b-9270-62f0fb83346b",
"silk_edge_clearance|269240000|110840000|6d070ea4-5732-4974-b15a-6adc25e87507|ab851b96-316a-460d-b1e8-9d3fef419e7b",
"silk_edge_clearance|269240000|113440000|6d070ea4-5732-4974-b15a-6adc25e87507|f1ae4a26-c73e-4b69-af96-801c2a8e61d3",
"silk_edge_clearance|269240000|115980000|6d070ea4-5732-4974-b15a-6adc25e87507|685b88f7-a226-4ce5-b9a2-70f5eea54d45",
"silk_edge_clearance|269240000|118520000|6d070ea4-5732-4974-b15a-6adc25e87507|dfd6db18-258f-4809-8096-700f3184e482",
"silk_edge_clearance|269240000|121060000|6d070ea4-5732-4974-b15a-6adc25e87507|df12db4f-f2d6-4bbb-962f-c504c70a12d7",
"silk_edge_clearance|269240000|123600000|6d070ea4-5732-4974-b15a-6adc25e87507|0f1bb1cf-595c-42a5-b79f-53ba7db0e565",
"silk_edge_clearance|269240000|126140000|6d070ea4-5732-4974-b15a-6adc25e87507|85c77ea0-2469-4305-9635-0c4ccb268a57",
"silk_edge_clearance|269240000|128740000|6d070ea4-5732-4974-b15a-6adc25e87507|90543f7d-a988-4bce-a183-20300704c3c1"
],
"meta": {
"filename": "board_design_settings.json",
"version": 2
@@ -58,32 +85,43 @@
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint_type_mismatch": "error",
"footprint": "error",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_near_hole": "error",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "error",
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"silk_edge_clearance": "warning",
"silk_over_copper": "ignore",
"silk_overlap": "ignore",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
@@ -92,33 +130,77 @@
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zone_has_empty_net": "error",
"zones_intersect": "error"
},
"rule_severitieslegacy_courtyards_overlap": true,
"rule_severitieslegacy_no_courtyard_defined": false,
"rules": {
"allow_blind_buried_vias": false,
"allow_microvias": false,
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.024999999999999998,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.19999999999999998,
"min_microvia_drill": 0.09999999999999999,
"min_resolved_spokes": 1,
"min_silk_clearance": 0.0,
"min_through_hole_diameter": 0.3,
"min_text_height": 0.7999999999999999,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.19999999999999998,
"min_track_width": 0.19999999999999998,
"min_via_annular_width": 0.049999999999999996,
"min_via_annular_width": 0.09999999999999999,
"min_via_diameter": 0.39999999999999997,
"solder_mask_to_copper_clearance": 0.005,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 5,
"td_on_pad_in_zone": false,
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [
0.0,
0.2,
0.5,
1.0
1.0,
1.5,
2.0
],
"via_dimensions": [
{
@@ -134,7 +216,7 @@
"drill": 3.0
}
],
"zones_allow_external_fillets": false,
"zones_allow_external_fillets": true,
"zones_use_no_outline": true
},
"layer_presets": [],
@@ -329,7 +411,7 @@
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"endpoint_off_grid": "warning",
"endpoint_off_grid": "ignore",
"extra_units": "error",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
@@ -345,7 +427,7 @@
"no_connect_dangling": "warning",
"pin_not_connected": "error",
"pin_not_driven": "error",
"pin_to_pin": "warning",
"pin_to_pin": "error",
"power_pin_not_driven": "error",
"similar_labels": "warning",
"simulation_model_issue": "ignore",
@@ -367,7 +449,7 @@
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"clearance": 0.15,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
@@ -384,62 +466,556 @@
},
{
"bus_width": 12,
"clearance": 0.2,
"clearance": 0.15,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "5V",
"name": "12V",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 1.4,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 6
},
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Mini",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgb(255, 4, 6)",
"track_width": 1.0,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 6
"wire_width": 12
},
{
"bus_width": 12,
"clearance": 0.2,
"clearance": 0.15,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Power",
"name": "3V",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 1.7,
"schematic_color": "rgb(255, 153, 0)",
"track_width": 0.2,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 6
"wire_width": 12
},
{
"bus_width": 12,
"clearance": 0.15,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "BAT+",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgb(81, 255, 3)",
"track_width": 1.2,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 12
},
{
"bus_width": 12,
"clearance": 0.15,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "BAT-",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgb(130, 130, 130)",
"track_width": 1.2,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 12
},
{
"bus_width": 12,
"clearance": 0.15,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "GND",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgb(0, 0, 0)",
"track_width": 0.5,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 12
}
],
"meta": {
"version": 3
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
"netclass_assignments": {
"Net-(battery1-Pin_1)": "BAT-",
"VBAT": "BAT+"
},
"netclass_patterns": [
{
"netclass": "3V",
"pattern": "3_3V"
},
{
"netclass": "Default",
"pattern": "CUSTOM_GPIO12"
},
{
"netclass": "Default",
"pattern": "CUSTOM_GPIO2"
},
{
"netclass": "Default",
"pattern": "CUSTOM_GPIO34"
},
{
"netclass": "Default",
"pattern": "CUSTOM_GPIO35"
},
{
"netclass": "Default",
"pattern": "ESP_RX"
},
{
"netclass": "Default",
"pattern": "ESP_TX"
},
{
"netclass": "GND",
"pattern": "GND"
},
{
"netclass": "Default",
"pattern": "Net-(12V1-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(12V2-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Boot1-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(C10-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(C14-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(C16-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(C17-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(C4-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(C5-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(C6-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(D10-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(D11-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(D12-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(D13-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(D14-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(D15-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(D16-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(D4-Pad3)"
},
{
"netclass": "Default",
"pattern": "Net-(D5-Pad3)"
},
{
"netclass": "Default",
"pattern": "Net-(D7-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(D9-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(Pumps1-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(Q1-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q1-Pad3)"
},
{
"netclass": "Default",
"pattern": "Net-(Q10-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q11-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q12-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q12-Pad3)"
},
{
"netclass": "Default",
"pattern": "Net-(Q13-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q13-Pad3)"
},
{
"netclass": "Default",
"pattern": "Net-(Q2-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q2-Pad3)"
},
{
"netclass": "Default",
"pattern": "Net-(Q3-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q3-Pad3)"
},
{
"netclass": "Default",
"pattern": "Net-(Q4-Pad3)"
},
{
"netclass": "Default",
"pattern": "Net-(Q5-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q6-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q7-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q8-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q9-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q_PWR1-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q_PWR2-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q_PWR3-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q_PWR4-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q_PWR5-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(Q_PWR6-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(R1-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(R14-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(R18-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(R19-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(R28-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(R54-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(R56-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(R58-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(R60-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(R62-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(R64-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(R66-Pad2)"
},
{
"netclass": "Default",
"pattern": "Net-(R68-Pad1)"
},
{
"netclass": "Default",
"pattern": "Net-(U3-Pad6)"
},
{
"netclass": "Default",
"pattern": "Net-(U4-Pad17)"
},
{
"netclass": "Default",
"pattern": "Net-(U4-Pad18)"
},
{
"netclass": "Default",
"pattern": "Net-(U4-Pad19)"
},
{
"netclass": "Default",
"pattern": "Net-(U4-Pad20)"
},
{
"netclass": "Default",
"pattern": "Net-(U4-Pad21)"
},
{
"netclass": "Default",
"pattern": "Net-(U4-Pad22)"
},
{
"netclass": "Default",
"pattern": "Net-(U4-Pad32)"
},
{
"netclass": "Default",
"pattern": "Net-(U6-Pad6)"
},
{
"netclass": "Default",
"pattern": "Net-(U6-Pad7)"
},
{
"netclass": "Default",
"pattern": "PLANT0_MOIST"
},
{
"netclass": "Default",
"pattern": "PLANT0_PUMP"
},
{
"netclass": "Default",
"pattern": "PLANT1_MOIST"
},
{
"netclass": "Default",
"pattern": "PLANT1_PUMP"
},
{
"netclass": "Default",
"pattern": "PLANT2_MOIST"
},
{
"netclass": "Default",
"pattern": "PLANT2_PUMP"
},
{
"netclass": "Default",
"pattern": "PLANT3_MOIST"
},
{
"netclass": "Default",
"pattern": "PLANT3_PUMP"
},
{
"netclass": "Default",
"pattern": "PLANT4_MOIST"
},
{
"netclass": "Default",
"pattern": "PLANT4_PUMP"
},
{
"netclass": "Default",
"pattern": "PLANT5_MOIST"
},
{
"netclass": "Default",
"pattern": "PLANT5_PUMP"
},
{
"netclass": "Default",
"pattern": "PLANT6_MOIST"
},
{
"netclass": "Default",
"pattern": "PLANT6_PUMP"
},
{
"netclass": "Default",
"pattern": "PLANT_CTRL_PUMP_0"
},
{
"netclass": "Default",
"pattern": "PLANT_CTRL_PUMP_1"
},
{
"netclass": "Default",
"pattern": "PLANT_CTRL_PUMP_2"
},
{
"netclass": "Default",
"pattern": "PLANT_CTRL_PUMP_3"
},
{
"netclass": "Default",
"pattern": "PLANT_CTRL_PUMP_4"
},
{
"netclass": "Default",
"pattern": "PLANT_CTRL_PUMP_5"
},
{
"netclass": "Default",
"pattern": "PLANT_CTRL_PUMP_6"
},
{
"netclass": "Default",
"pattern": "PUMP_ENABLE"
},
{
"netclass": "Default",
"pattern": "PUMP_PWR"
},
{
"netclass": "Default",
"pattern": "PWR_I2C"
},
{
"netclass": "Default",
"pattern": "PWR_PUMP_CONVERTER"
},
{
"netclass": "Default",
"pattern": "PWR_SENSORS"
},
{
"netclass": "Default",
"pattern": "Rsense+"
},
{
"netclass": "Default",
"pattern": "SCL"
},
{
"netclass": "Default",
"pattern": "SDA"
},
{
"netclass": "Default",
"pattern": "SENSORS_ENABLE"
},
{
"netclass": "Default",
"pattern": "SOLAR_IN"
},
{
"netclass": "Default",
"pattern": "Temp"
},
{
"netclass": "Default",
"pattern": "VCC"
},
{
"netclass": "Default",
"pattern": "VCC_BATT"
},
{
"netclass": "Default",
"pattern": "VCC_FUSED_ALWAYS"
},
{
"netclass": "12V",
"pattern": "12V"
},
{
"netclass": "12V",
"pattern": "/12VR"
}
]
},
"pcbnew": {
"last_paths": {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,288 +0,0 @@
update=Thu 10 Jun 2021 10:17:33 PM CEST
version=1
last_client=kicad
[general]
version=1
RootSch=
BoardNm=
[cvpcb]
version=1
NetIExt=net
[eeschema]
version=1
LibDir=
[eeschema/libraries]
[schematic_editor]
version=1
PageLayoutDescrFile=
PlotDirectoryName=/tmp/
SubpartIdSeparator=0
SubpartFirstId=65
NetFmtName=Pcbnew
SpiceAjustPassiveValues=0
LabSize=50
ERC_TestSimilarLabels=1
[pcbnew]
version=1
PageLayoutDescrFile=
LastNetListRead=PlantCtrlESP32.net
CopperLayerCount=2
BoardThickness=1.6
AllowMicroVias=0
AllowBlindVias=0
RequireCourtyardDefinitions=0
ProhibitOverlappingCourtyards=1
MinTrackWidth=0.2
MinViaDiameter=0.4
MinViaDrill=0.3
MinMicroViaDiameter=0.2
MinMicroViaDrill=0.09999999999999999
MinHoleToHole=0.25
TrackWidth1=1.2
TrackWidth2=0.2
TrackWidth3=0.5
TrackWidth4=1
ViaDiameter1=0.8
ViaDrill1=0.4
ViaDiameter2=1.2
ViaDrill2=0.8
ViaDiameter3=4
ViaDrill3=3
dPairWidth1=0.2
dPairGap1=0.25
dPairViaGap1=0.25
SilkLineWidth=0.12
SilkTextSizeV=1
SilkTextSizeH=1
SilkTextSizeThickness=0.15
SilkTextItalic=0
SilkTextUpright=1
CopperLineWidth=0.2
CopperTextSizeV=1.5
CopperTextSizeH=1.5
CopperTextThickness=0.3
CopperTextItalic=0
CopperTextUpright=1
EdgeCutLineWidth=0.05
CourtyardLineWidth=0.05
OthersLineWidth=0.15
OthersTextSizeV=1
OthersTextSizeH=1
OthersTextSizeThickness=0.15
OthersTextItalic=0
OthersTextUpright=1
SolderMaskClearance=0.051
SolderMaskMinWidth=0.25
SolderPasteClearance=0
SolderPasteRatio=-0
[pcbnew/Layer.F.Cu]
Name=F.Cu
Type=0
Enabled=1
[pcbnew/Layer.In1.Cu]
Name=In1.Cu
Type=0
Enabled=0
[pcbnew/Layer.In2.Cu]
Name=In2.Cu
Type=0
Enabled=0
[pcbnew/Layer.In3.Cu]
Name=In3.Cu
Type=0
Enabled=0
[pcbnew/Layer.In4.Cu]
Name=In4.Cu
Type=0
Enabled=0
[pcbnew/Layer.In5.Cu]
Name=In5.Cu
Type=0
Enabled=0
[pcbnew/Layer.In6.Cu]
Name=In6.Cu
Type=0
Enabled=0
[pcbnew/Layer.In7.Cu]
Name=In7.Cu
Type=0
Enabled=0
[pcbnew/Layer.In8.Cu]
Name=In8.Cu
Type=0
Enabled=0
[pcbnew/Layer.In9.Cu]
Name=In9.Cu
Type=0
Enabled=0
[pcbnew/Layer.In10.Cu]
Name=In10.Cu
Type=0
Enabled=0
[pcbnew/Layer.In11.Cu]
Name=In11.Cu
Type=0
Enabled=0
[pcbnew/Layer.In12.Cu]
Name=In12.Cu
Type=0
Enabled=0
[pcbnew/Layer.In13.Cu]
Name=In13.Cu
Type=0
Enabled=0
[pcbnew/Layer.In14.Cu]
Name=In14.Cu
Type=0
Enabled=0
[pcbnew/Layer.In15.Cu]
Name=In15.Cu
Type=0
Enabled=0
[pcbnew/Layer.In16.Cu]
Name=In16.Cu
Type=0
Enabled=0
[pcbnew/Layer.In17.Cu]
Name=In17.Cu
Type=0
Enabled=0
[pcbnew/Layer.In18.Cu]
Name=In18.Cu
Type=0
Enabled=0
[pcbnew/Layer.In19.Cu]
Name=In19.Cu
Type=0
Enabled=0
[pcbnew/Layer.In20.Cu]
Name=In20.Cu
Type=0
Enabled=0
[pcbnew/Layer.In21.Cu]
Name=In21.Cu
Type=0
Enabled=0
[pcbnew/Layer.In22.Cu]
Name=In22.Cu
Type=0
Enabled=0
[pcbnew/Layer.In23.Cu]
Name=In23.Cu
Type=0
Enabled=0
[pcbnew/Layer.In24.Cu]
Name=In24.Cu
Type=0
Enabled=0
[pcbnew/Layer.In25.Cu]
Name=In25.Cu
Type=0
Enabled=0
[pcbnew/Layer.In26.Cu]
Name=In26.Cu
Type=0
Enabled=0
[pcbnew/Layer.In27.Cu]
Name=In27.Cu
Type=0
Enabled=0
[pcbnew/Layer.In28.Cu]
Name=In28.Cu
Type=0
Enabled=0
[pcbnew/Layer.In29.Cu]
Name=In29.Cu
Type=0
Enabled=0
[pcbnew/Layer.In30.Cu]
Name=In30.Cu
Type=0
Enabled=0
[pcbnew/Layer.B.Cu]
Name=B.Cu
Type=0
Enabled=1
[pcbnew/Layer.B.Adhes]
Enabled=1
[pcbnew/Layer.F.Adhes]
Enabled=1
[pcbnew/Layer.B.Paste]
Enabled=1
[pcbnew/Layer.F.Paste]
Enabled=1
[pcbnew/Layer.B.SilkS]
Enabled=1
[pcbnew/Layer.F.SilkS]
Enabled=1
[pcbnew/Layer.B.Mask]
Enabled=1
[pcbnew/Layer.F.Mask]
Enabled=1
[pcbnew/Layer.Dwgs.User]
Enabled=1
[pcbnew/Layer.Cmts.User]
Enabled=1
[pcbnew/Layer.Eco1.User]
Enabled=1
[pcbnew/Layer.Eco2.User]
Enabled=1
[pcbnew/Layer.Edge.Cuts]
Enabled=1
[pcbnew/Layer.Margin]
Enabled=1
[pcbnew/Layer.B.CrtYd]
Enabled=1
[pcbnew/Layer.F.CrtYd]
Enabled=1
[pcbnew/Layer.B.Fab]
Enabled=1
[pcbnew/Layer.F.Fab]
Enabled=1
[pcbnew/Layer.Rescue]
Enabled=0
[pcbnew/Netclasses]
[pcbnew/Netclasses/Default]
Name=Default
Clearance=0.2
TrackWidth=1.2
ViaDiameter=0.8
ViaDrill=0.4
uViaDiameter=0.3
uViaDrill=0.1
dPairWidth=0.2
dPairGap=0.25
dPairViaGap=0.25
[pcbnew/Netclasses/1]
Name=5V
Clearance=0.2
TrackWidth=1.4
ViaDiameter=0.8
ViaDrill=0.4
uViaDiameter=0.3
uViaDrill=0.1
dPairWidth=0.2
dPairGap=0.25
dPairViaGap=0.25
[pcbnew/Netclasses/2]
Name=Mini
Clearance=0.2
TrackWidth=1
ViaDiameter=0.8
ViaDrill=0.4
uViaDiameter=0.3
uViaDrill=0.1
dPairWidth=0.2
dPairGap=0.25
dPairViaGap=0.25
[pcbnew/Netclasses/3]
Name=Power
Clearance=0.2
TrackWidth=1.7
ViaDiameter=0.8
ViaDrill=0.4
uViaDiameter=0.3
uViaDrill=0.1
dPairWidth=0.2
dPairGap=0.25
dPairViaGap=0.25

View File

@@ -0,0 +1,7 @@
Default False 2.0 3
12V True 2.0 3
3V True 2.0 3
BAT+ True 2.0 3
BAT- True 2.0 3
GND True 2.0 3
False True False

View File

@@ -0,0 +1,63 @@
(footprint "R_Shunt_Vishay_WSK2512_6332Metric_T1.19mm" (version 20221018) (generator pcbnew)
(layer "F.Cu")
(descr "Shunt Resistor SMD 2512 (6332 Metric), 2.6mm thick, Vishay WKS2512, Terminal length (T) 1.19mm, 5 to 200 milli Ohm (http://http://www.vishay.com/docs/30108/wsk.pdf)")
(tags "resistor shunt WSK2512")
(attr smd)
(fp_text reference "REF**" (at 0 -2.65) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp e64357ee-67ea-437d-842c-edd4e9b0e817)
)
(fp_text value "R_Shunt_Vishay_WSK2512_6332Metric_T1.19mm" (at 0 2.65) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 6d43eee8-d677-4710-a5b6-ed0a393d7e86)
)
(fp_text user "${REFERENCE}" (at 0 0) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 7af73258-6848-4c90-ada6-9916b21e0d54)
)
(fp_line (start -2.5 1.7) (end 1.67 1.7)
(stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 686b0a9f-f303-4b9c-97bc-13b268071b2a))
(fp_line (start -1.67 -1.7) (end 2.53 -1.7)
(stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 8ff3cd0c-2e69-49a7-948e-62e2af1cdeaf))
(fp_line (start -4.38 -1.9) (end 4.38 -1.9)
(stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 97453d6f-90a6-4d0b-9533-4b9de0e70d67))
(fp_line (start -4.38 1.9) (end -4.38 -1.9)
(stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 8d751a64-d963-4d3e-b652-c6367d221a4c))
(fp_line (start 4.38 -1.9) (end 4.38 1.9)
(stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 5fc8cbbe-390d-45f2-b9e2-001b3b36ad53))
(fp_line (start 4.38 1.9) (end -4.38 1.9)
(stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 85ea9322-734e-4f57-b7f4-e08d8559c109))
(fp_line (start -3.175 -1.59) (end 3.175 -1.59)
(stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp a616017c-8c30-4c24-8988-6ebc65a5a14c))
(fp_line (start -3.175 0.32) (end -3.175 -1.59)
(stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 007035a4-df14-4627-b9dd-16c0816e9fc4))
(fp_line (start -3.175 0.32) (end -2.795 0.32)
(stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 7a92ebc4-86fb-494b-8925-1512bf4598dd))
(fp_line (start -3.175 0.94) (end -3.175 1.59)
(stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 8d1ed9db-8b9e-4c9a-b026-a147d8ba5a89))
(fp_line (start -3.175 0.94) (end -2.795 0.94)
(stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 3238b0a3-1bbc-4ecd-9eca-d39a4563f46a))
(fp_line (start -2.795 0.94) (end -2.795 0.32)
(stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 56e7214e-7e65-4896-9919-6dfa6ad242a1))
(fp_line (start 2.79 -0.94) (end 3.17 -0.94)
(stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp bf2fd8b5-dc07-4d36-93f4-c05d760e4ae8))
(fp_line (start 2.79 -0.32) (end 2.79 -0.94)
(stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 2732ea3b-0a68-4014-9f1f-147b192cb827))
(fp_line (start 2.79 -0.32) (end 3.17 -0.32)
(stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 7597632e-0fab-4537-9ef5-3d955ee8fe04))
(fp_line (start 3.175 -0.94) (end 3.175 -1.59)
(stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp be78e59b-9296-4843-849b-9aeaddf3ec90))
(fp_line (start 3.175 -0.32) (end 3.175 1.59)
(stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp f0529fdf-6a96-4afa-ae66-3987676f8cc1))
(fp_line (start 3.175 1.59) (end -3.175 1.59)
(stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 5494f1f1-9934-4901-ae11-4f45356840a6))
(pad "1" smd roundrect (at -2.985 0.635) (size 2.29 2.03) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.12) (tstamp 7d665233-6376-4fd3-9d23-184556b0630c))
(pad "2" smd roundrect (at -3.43 -1.27) (size 1.4 0.76) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.12) (tstamp a060266a-0c38-4364-b2df-6f7cf4c69f0d))
(pad "3" smd roundrect (at 3.43 -1.27) (size 1.4 0.76) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp a1e31646-49e8-4836-bd67-1b6bed652414))
(pad "4" smd roundrect (at 2.985 0.635) (size 2.29 2.03) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.12) (tstamp 3f532dd2-fd5a-4fe7-9636-aa84f769e3b2))
(model "${KICAD6_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_Shunt_Vishay_WSK2512_6332Metric_T1.19mm.wrl"
(offset (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)

4562
board/bom/ibom.html Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,7 @@
(fp_lib_table
(lib (name misc_footprints)(type KiCad)(uri ${KIPRJMOD}/kicad-stuff/misc_footprints-master/misc_footprints.pretty)(options "")(descr ""))
(lib (name ESP32)(type KiCad)(uri ${KIPRJMOD}/kicad-stuff/ESP32)(options "")(descr ""))
(version 7)
(lib (name "misc_footprints")(type "KiCad")(uri "${KIPRJMOD}/kicad-stuff/misc_footprints-master/misc_footprints.pretty")(options "")(descr ""))
(lib (name "ESP32")(type "KiCad")(uri "${KIPRJMOD}/kicad-stuff/ESP32")(options "")(descr ""))
(lib (name "kicad-stuff")(type "KiCad")(uri "${KIPRJMOD}/kicad-stuff")(options "")(descr ""))
(lib (name "board")(type "KiCad")(uri "${KIPRJMOD}/")(options "")(descr ""))
)

View File

@@ -1,15 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.10*
G04 #@! TF.CreationDate,2021-06-10T23:09:58+02:00*
G04 #@! TF.ProjectId,PlantCtrlESP32,506c616e-7443-4747-926c-45535033322e,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Glue,Bot*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.10) date 2021-06-10 23:09:58*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

View File

@@ -1,32 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.10*
G04 #@! TF.CreationDate,2021-06-10T23:09:58+02:00*
G04 #@! TF.ProjectId,PlantCtrlESP32,506c616e-7443-4747-926c-45535033322e,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Other,User*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.10) date 2021-06-10 23:09:58*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,0.050000*%
G04 APERTURE END LIST*
D10*
X237729200Y-51267800D02*
X237729200Y-60847800D01*
X237729200Y-51267800D02*
X242229200Y-51267800D01*
X242229200Y-60847800D02*
X237729200Y-60847800D01*
X242229200Y-60847800D02*
X242229200Y-51267800D01*
X231560800Y-64114800D02*
X223160800Y-64114800D01*
X231560800Y-57364800D02*
X231560800Y-64114800D01*
X223160800Y-57364800D02*
X231560800Y-57364800D01*
X223160800Y-64114800D02*
X223160800Y-57364800D01*
M02*

File diff suppressed because it is too large Load Diff

View File

@@ -1,425 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.10*
G04 #@! TF.CreationDate,2021-06-10T23:09:58+02:00*
G04 #@! TF.ProjectId,PlantCtrlESP32,506c616e-7443-4747-926c-45535033322e,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Other,Fab,Bot*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.10) date 2021-06-10 23:09:58*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,0.100000*%
%ADD11C,0.150000*%
G04 APERTURE END LIST*
D10*
X226110800Y-62614800D02*
X226735800Y-63614800D01*
X225485800Y-63614800D02*
X226110800Y-62614800D01*
X231060800Y-63614800D02*
X223660800Y-63614800D01*
X231060800Y-57864800D02*
X231060800Y-63614800D01*
X223660800Y-57864800D02*
X231060800Y-57864800D01*
X223660800Y-63614800D02*
X223660800Y-57864800D01*
D11*
X235812057Y-62843514D02*
X235764438Y-62891133D01*
X235716819Y-63033990D01*
X235716819Y-63129228D01*
X235764438Y-63272085D01*
X235859676Y-63367323D01*
X235954914Y-63414942D01*
X236145390Y-63462561D01*
X236288247Y-63462561D01*
X236478723Y-63414942D01*
X236573961Y-63367323D01*
X236669200Y-63272085D01*
X236716819Y-63129228D01*
X236716819Y-63033990D01*
X236669200Y-62891133D01*
X236621580Y-62843514D01*
X235716819Y-62272085D02*
X235764438Y-62367323D01*
X235812057Y-62414942D01*
X235907295Y-62462561D01*
X236193009Y-62462561D01*
X236288247Y-62414942D01*
X236335866Y-62367323D01*
X236383485Y-62272085D01*
X236383485Y-62129228D01*
X236335866Y-62033990D01*
X236288247Y-61986371D01*
X236193009Y-61938752D01*
X235907295Y-61938752D01*
X235812057Y-61986371D01*
X235764438Y-62033990D01*
X235716819Y-62129228D01*
X235716819Y-62272085D01*
X236383485Y-61510180D02*
X235716819Y-61510180D01*
X236288247Y-61510180D02*
X236335866Y-61462561D01*
X236383485Y-61367323D01*
X236383485Y-61224466D01*
X236335866Y-61129228D01*
X236240628Y-61081609D01*
X235716819Y-61081609D01*
X236383485Y-60605419D02*
X235716819Y-60605419D01*
X236288247Y-60605419D02*
X236335866Y-60557800D01*
X236383485Y-60462561D01*
X236383485Y-60319704D01*
X236335866Y-60224466D01*
X236240628Y-60176847D01*
X235716819Y-60176847D01*
X235621580Y-59938752D02*
X235621580Y-59176847D01*
X236716819Y-58748276D02*
X236716819Y-58653038D01*
X236669200Y-58557800D01*
X236621580Y-58510180D01*
X236526342Y-58462561D01*
X236335866Y-58414942D01*
X236097771Y-58414942D01*
X235907295Y-58462561D01*
X235812057Y-58510180D01*
X235764438Y-58557800D01*
X235716819Y-58653038D01*
X235716819Y-58748276D01*
X235764438Y-58843514D01*
X235812057Y-58891133D01*
X235907295Y-58938752D01*
X236097771Y-58986371D01*
X236335866Y-58986371D01*
X236526342Y-58938752D01*
X236621580Y-58891133D01*
X236669200Y-58843514D01*
X236716819Y-58748276D01*
X235716819Y-57462561D02*
X235716819Y-58033990D01*
X235716819Y-57748276D02*
X236716819Y-57748276D01*
X236573961Y-57843514D01*
X236478723Y-57938752D01*
X236431104Y-58033990D01*
X235716819Y-57129228D02*
X236383485Y-56605419D01*
X236383485Y-57129228D02*
X235716819Y-56605419D01*
X236716819Y-56033990D02*
X236716819Y-55938752D01*
X236669200Y-55843514D01*
X236621580Y-55795895D01*
X236526342Y-55748276D01*
X236335866Y-55700657D01*
X236097771Y-55700657D01*
X235907295Y-55748276D01*
X235812057Y-55795895D01*
X235764438Y-55843514D01*
X235716819Y-55938752D01*
X235716819Y-56033990D01*
X235764438Y-56129228D01*
X235812057Y-56176847D01*
X235907295Y-56224466D01*
X236097771Y-56272085D01*
X236335866Y-56272085D01*
X236526342Y-56224466D01*
X236621580Y-56176847D01*
X236669200Y-56129228D01*
X236716819Y-56033990D01*
X236621580Y-55319704D02*
X236669200Y-55272085D01*
X236716819Y-55176847D01*
X236716819Y-54938752D01*
X236669200Y-54843514D01*
X236621580Y-54795895D01*
X236526342Y-54748276D01*
X236431104Y-54748276D01*
X236288247Y-54795895D01*
X235716819Y-55367323D01*
X235716819Y-54748276D01*
X235621580Y-54557800D02*
X235621580Y-53795895D01*
X236240628Y-53224466D02*
X236240628Y-53557800D01*
X235716819Y-53557800D02*
X236716819Y-53557800D01*
X236716819Y-53081609D01*
X235764438Y-52319704D02*
X235716819Y-52414942D01*
X235716819Y-52605419D01*
X235764438Y-52700657D01*
X235859676Y-52748276D01*
X236240628Y-52748276D01*
X236335866Y-52700657D01*
X236383485Y-52605419D01*
X236383485Y-52414942D01*
X236335866Y-52319704D01*
X236240628Y-52272085D01*
X236145390Y-52272085D01*
X236050152Y-52748276D01*
X235716819Y-51843514D02*
X236383485Y-51843514D01*
X236288247Y-51843514D02*
X236335866Y-51795895D01*
X236383485Y-51700657D01*
X236383485Y-51557800D01*
X236335866Y-51462561D01*
X236240628Y-51414942D01*
X235716819Y-51414942D01*
X236240628Y-51414942D02*
X236335866Y-51367323D01*
X236383485Y-51272085D01*
X236383485Y-51129228D01*
X236335866Y-51033990D01*
X236240628Y-50986371D01*
X235716819Y-50986371D01*
X235716819Y-50081609D02*
X236240628Y-50081609D01*
X236335866Y-50129228D01*
X236383485Y-50224466D01*
X236383485Y-50414942D01*
X236335866Y-50510180D01*
X235764438Y-50081609D02*
X235716819Y-50176847D01*
X235716819Y-50414942D01*
X235764438Y-50510180D01*
X235859676Y-50557800D01*
X235954914Y-50557800D01*
X236050152Y-50510180D01*
X236097771Y-50414942D01*
X236097771Y-50176847D01*
X236145390Y-50081609D01*
X235716819Y-49462561D02*
X235764438Y-49557800D01*
X235859676Y-49605419D01*
X236716819Y-49605419D01*
X235764438Y-48700657D02*
X235716819Y-48795895D01*
X235716819Y-48986371D01*
X235764438Y-49081609D01*
X235859676Y-49129228D01*
X236240628Y-49129228D01*
X236335866Y-49081609D01*
X236383485Y-48986371D01*
X236383485Y-48795895D01*
X236335866Y-48700657D01*
X236240628Y-48653038D01*
X236145390Y-48653038D01*
X236050152Y-49129228D01*
X239526819Y-57486371D02*
X239526819Y-57962561D01*
X240526819Y-57962561D01*
X239526819Y-57153038D02*
X240526819Y-57153038D01*
X239526819Y-56676847D02*
X240526819Y-56676847D01*
X240526819Y-56295895D01*
X240479200Y-56200657D01*
X240431580Y-56153038D01*
X240336342Y-56105419D01*
X240193485Y-56105419D01*
X240098247Y-56153038D01*
X240050628Y-56200657D01*
X240003009Y-56295895D01*
X240003009Y-56676847D01*
X240526819Y-55486371D02*
X240526819Y-55295895D01*
X240479200Y-55200657D01*
X240383961Y-55105419D01*
X240193485Y-55057800D01*
X239860152Y-55057800D01*
X239669676Y-55105419D01*
X239574438Y-55200657D01*
X239526819Y-55295895D01*
X239526819Y-55486371D01*
X239574438Y-55581609D01*
X239669676Y-55676847D01*
X239860152Y-55724466D01*
X240193485Y-55724466D01*
X240383961Y-55676847D01*
X240479200Y-55581609D01*
X240526819Y-55486371D01*
X239526819Y-54105419D02*
X239526819Y-54676847D01*
X239526819Y-54391133D02*
X240526819Y-54391133D01*
X240383961Y-54486371D01*
X240288723Y-54581609D01*
X240241104Y-54676847D01*
X231098895Y-57021942D02*
X231146514Y-57069561D01*
X231289371Y-57117180D01*
X231384609Y-57117180D01*
X231527466Y-57069561D01*
X231622704Y-56974323D01*
X231670323Y-56879085D01*
X231717942Y-56688609D01*
X231717942Y-56545752D01*
X231670323Y-56355276D01*
X231622704Y-56260038D01*
X231527466Y-56164800D01*
X231384609Y-56117180D01*
X231289371Y-56117180D01*
X231146514Y-56164800D01*
X231098895Y-56212419D01*
X230527466Y-57117180D02*
X230622704Y-57069561D01*
X230670323Y-57021942D01*
X230717942Y-56926704D01*
X230717942Y-56640990D01*
X230670323Y-56545752D01*
X230622704Y-56498133D01*
X230527466Y-56450514D01*
X230384609Y-56450514D01*
X230289371Y-56498133D01*
X230241752Y-56545752D01*
X230194133Y-56640990D01*
X230194133Y-56926704D01*
X230241752Y-57021942D01*
X230289371Y-57069561D01*
X230384609Y-57117180D01*
X230527466Y-57117180D01*
X229765561Y-56450514D02*
X229765561Y-57117180D01*
X229765561Y-56545752D02*
X229717942Y-56498133D01*
X229622704Y-56450514D01*
X229479847Y-56450514D01*
X229384609Y-56498133D01*
X229336990Y-56593371D01*
X229336990Y-57117180D01*
X228860800Y-56450514D02*
X228860800Y-57117180D01*
X228860800Y-56545752D02*
X228813180Y-56498133D01*
X228717942Y-56450514D01*
X228575085Y-56450514D01*
X228479847Y-56498133D01*
X228432228Y-56593371D01*
X228432228Y-57117180D01*
X228194133Y-57212419D02*
X227432228Y-57212419D01*
X227003657Y-56117180D02*
X226908419Y-56117180D01*
X226813180Y-56164800D01*
X226765561Y-56212419D01*
X226717942Y-56307657D01*
X226670323Y-56498133D01*
X226670323Y-56736228D01*
X226717942Y-56926704D01*
X226765561Y-57021942D01*
X226813180Y-57069561D01*
X226908419Y-57117180D01*
X227003657Y-57117180D01*
X227098895Y-57069561D01*
X227146514Y-57021942D01*
X227194133Y-56926704D01*
X227241752Y-56736228D01*
X227241752Y-56498133D01*
X227194133Y-56307657D01*
X227146514Y-56212419D01*
X227098895Y-56164800D01*
X227003657Y-56117180D01*
X225717942Y-57117180D02*
X226289371Y-57117180D01*
X226003657Y-57117180D02*
X226003657Y-56117180D01*
X226098895Y-56260038D01*
X226194133Y-56355276D01*
X226289371Y-56402895D01*
X225384609Y-57117180D02*
X224860800Y-56450514D01*
X225384609Y-56450514D02*
X224860800Y-57117180D01*
X224289371Y-56117180D02*
X224194133Y-56117180D01*
X224098895Y-56164800D01*
X224051276Y-56212419D01*
X224003657Y-56307657D01*
X223956038Y-56498133D01*
X223956038Y-56736228D01*
X224003657Y-56926704D01*
X224051276Y-57021942D01*
X224098895Y-57069561D01*
X224194133Y-57117180D01*
X224289371Y-57117180D01*
X224384609Y-57069561D01*
X224432228Y-57021942D01*
X224479847Y-56926704D01*
X224527466Y-56736228D01*
X224527466Y-56498133D01*
X224479847Y-56307657D01*
X224432228Y-56212419D01*
X224384609Y-56164800D01*
X224289371Y-56117180D01*
X223575085Y-56212419D02*
X223527466Y-56164800D01*
X223432228Y-56117180D01*
X223194133Y-56117180D01*
X223098895Y-56164800D01*
X223051276Y-56212419D01*
X223003657Y-56307657D01*
X223003657Y-56402895D01*
X223051276Y-56545752D01*
X223622704Y-57117180D01*
X223003657Y-57117180D01*
X230860800Y-58493371D02*
X230527466Y-58493371D01*
X230384609Y-59017180D02*
X230860800Y-59017180D01*
X230860800Y-58017180D01*
X230384609Y-58017180D01*
X230051276Y-58017180D02*
X229384609Y-59017180D01*
X229384609Y-58017180D02*
X230051276Y-59017180D01*
X229146514Y-58017180D02*
X228575085Y-58017180D01*
X228860800Y-59017180D02*
X228860800Y-58017180D01*
X228479847Y-59112419D02*
X227717942Y-59112419D01*
X227479847Y-59017180D02*
X227479847Y-58017180D01*
X227098895Y-58017180D01*
X227003657Y-58064800D01*
X226956038Y-58112419D01*
X226908419Y-58207657D01*
X226908419Y-58350514D01*
X226956038Y-58445752D01*
X227003657Y-58493371D01*
X227098895Y-58540990D01*
X227479847Y-58540990D01*
X226575085Y-58017180D02*
X226336990Y-59017180D01*
X226146514Y-58302895D01*
X225956038Y-59017180D01*
X225717942Y-58017180D01*
X224765561Y-59017180D02*
X225098895Y-58540990D01*
X225336990Y-59017180D02*
X225336990Y-58017180D01*
X224956038Y-58017180D01*
X224860800Y-58064800D01*
X224813180Y-58112419D01*
X224765561Y-58207657D01*
X224765561Y-58350514D01*
X224813180Y-58445752D01*
X224860800Y-58493371D01*
X224956038Y-58540990D01*
X225336990Y-58540990D01*
X223813180Y-59017180D02*
X224384609Y-59017180D01*
X224098895Y-59017180D02*
X224098895Y-58017180D01*
X224194133Y-58160038D01*
X224289371Y-58255276D01*
X224384609Y-58302895D01*
M02*

File diff suppressed because it is too large Load Diff

View File

@@ -1,15 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.10*
G04 #@! TF.CreationDate,2021-06-10T23:09:58+02:00*
G04 #@! TF.ProjectId,PlantCtrlESP32,506c616e-7443-4747-926c-45535033322e,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Paste,Bot*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.10) date 2021-06-10 23:09:58*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

View File

@@ -1,436 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.10*
G04 #@! TF.CreationDate,2021-06-10T23:09:58+02:00*
G04 #@! TF.ProjectId,PlantCtrlESP32,506c616e-7443-4747-926c-45535033322e,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Legend,Bot*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.10) date 2021-06-10 23:09:58*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,0.500000*%
%ADD11C,0.120000*%
%ADD12C,0.150000*%
G04 APERTURE END LIST*
D10*
X237963476Y-80549523D02*
X237963476Y-76549523D01*
X236439666Y-76549523D01*
X236058714Y-76740000D01*
X235868238Y-76930476D01*
X235677761Y-77311428D01*
X235677761Y-77882857D01*
X235868238Y-78263809D01*
X236058714Y-78454285D01*
X236439666Y-78644761D01*
X237963476Y-78644761D01*
X233392047Y-80549523D02*
X233773000Y-80359047D01*
X233963476Y-79978095D01*
X233963476Y-76549523D01*
X230153952Y-80549523D02*
X230153952Y-78454285D01*
X230344428Y-78073333D01*
X230725380Y-77882857D01*
X231487285Y-77882857D01*
X231868238Y-78073333D01*
X230153952Y-80359047D02*
X230534904Y-80549523D01*
X231487285Y-80549523D01*
X231868238Y-80359047D01*
X232058714Y-79978095D01*
X232058714Y-79597142D01*
X231868238Y-79216190D01*
X231487285Y-79025714D01*
X230534904Y-79025714D01*
X230153952Y-78835238D01*
X228249190Y-77882857D02*
X228249190Y-80549523D01*
X228249190Y-78263809D02*
X228058714Y-78073333D01*
X227677761Y-77882857D01*
X227106333Y-77882857D01*
X226725380Y-78073333D01*
X226534904Y-78454285D01*
X226534904Y-80549523D01*
X225201571Y-77882857D02*
X223677761Y-77882857D01*
X224630142Y-76549523D02*
X224630142Y-79978095D01*
X224439666Y-80359047D01*
X224058714Y-80549523D01*
X223677761Y-80549523D01*
X220058714Y-80168571D02*
X220249190Y-80359047D01*
X220820619Y-80549523D01*
X221201571Y-80549523D01*
X221773000Y-80359047D01*
X222153952Y-79978095D01*
X222344428Y-79597142D01*
X222534904Y-78835238D01*
X222534904Y-78263809D01*
X222344428Y-77501904D01*
X222153952Y-77120952D01*
X221773000Y-76740000D01*
X221201571Y-76549523D01*
X220820619Y-76549523D01*
X220249190Y-76740000D01*
X220058714Y-76930476D01*
X218915857Y-77882857D02*
X217392047Y-77882857D01*
X218344428Y-76549523D02*
X218344428Y-79978095D01*
X218153952Y-80359047D01*
X217773000Y-80549523D01*
X217392047Y-80549523D01*
X216058714Y-80549523D02*
X216058714Y-77882857D01*
X216058714Y-78644761D02*
X215868238Y-78263809D01*
X215677761Y-78073333D01*
X215296809Y-77882857D01*
X214915857Y-77882857D01*
X213011095Y-80549523D02*
X213392047Y-80359047D01*
X213582523Y-79978095D01*
X213582523Y-76549523D01*
X209011095Y-76549523D02*
X207677761Y-80549523D01*
X206344428Y-76549523D01*
X204249190Y-76549523D02*
X203868238Y-76549523D01*
X203487285Y-76740000D01*
X203296809Y-76930476D01*
X203106333Y-77311428D01*
X202915857Y-78073333D01*
X202915857Y-79025714D01*
X203106333Y-79787619D01*
X203296809Y-80168571D01*
X203487285Y-80359047D01*
X203868238Y-80549523D01*
X204249190Y-80549523D01*
X204630142Y-80359047D01*
X204820619Y-80168571D01*
X205011095Y-79787619D01*
X205201571Y-79025714D01*
X205201571Y-78073333D01*
X205011095Y-77311428D01*
X204820619Y-76930476D01*
X204630142Y-76740000D01*
X204249190Y-76549523D01*
X201201571Y-80168571D02*
X201011095Y-80359047D01*
X201201571Y-80549523D01*
X201392047Y-80359047D01*
X201201571Y-80168571D01*
X201201571Y-80549523D01*
X197201571Y-80549523D02*
X199487285Y-80549523D01*
X198344428Y-80549523D02*
X198344428Y-76549523D01*
X198725380Y-77120952D01*
X199106333Y-77501904D01*
X199487285Y-77692380D01*
X194725380Y-76549523D02*
X194344428Y-76549523D01*
X193963476Y-76740000D01*
X193773000Y-76930476D01*
X193582523Y-77311428D01*
X193392047Y-78073333D01*
X193392047Y-79025714D01*
X193582523Y-79787619D01*
X193773000Y-80168571D01*
X193963476Y-80359047D01*
X194344428Y-80549523D01*
X194725380Y-80549523D01*
X195106333Y-80359047D01*
X195296809Y-80168571D01*
X195487285Y-79787619D01*
X195677761Y-79025714D01*
X195677761Y-78073333D01*
X195487285Y-77311428D01*
X195296809Y-76930476D01*
X195106333Y-76740000D01*
X194725380Y-76549523D01*
D11*
X223260800Y-64014800D02*
X223260800Y-62764800D01*
X224510800Y-64014800D02*
X223260800Y-64014800D01*
X230410800Y-58514800D02*
X227360800Y-58514800D01*
X230410800Y-61464800D02*
X230410800Y-58514800D01*
X231160800Y-61464800D02*
X230410800Y-61464800D01*
X224310800Y-58514800D02*
X227360800Y-58514800D01*
X224310800Y-61464800D02*
X224310800Y-58514800D01*
X223560800Y-61464800D02*
X224310800Y-61464800D01*
X231160800Y-63714800D02*
X229360800Y-63714800D01*
X231160800Y-62964800D02*
X231160800Y-63714800D01*
X229360800Y-62964800D02*
X231160800Y-62964800D01*
X229360800Y-63714800D02*
X229360800Y-62964800D01*
X225360800Y-63714800D02*
X223560800Y-63714800D01*
X225360800Y-62964800D02*
X225360800Y-63714800D01*
X223560800Y-62964800D02*
X225360800Y-62964800D01*
X223560800Y-63714800D02*
X223560800Y-62964800D01*
X227860800Y-63714800D02*
X226860800Y-63714800D01*
X227860800Y-62964800D02*
X227860800Y-63714800D01*
X226860800Y-62964800D02*
X227860800Y-62964800D01*
X226860800Y-63714800D02*
X226860800Y-62964800D01*
X231170800Y-63724800D02*
X223550800Y-63724800D01*
X231170800Y-57754800D02*
X231170800Y-63724800D01*
X223550800Y-57754800D02*
X231170800Y-57754800D01*
X223550800Y-63724800D02*
X223550800Y-57754800D01*
D12*
X185356285Y-137866380D02*
X185689619Y-137390190D01*
X185927714Y-137866380D02*
X185927714Y-136866380D01*
X185546761Y-136866380D01*
X185451523Y-136914000D01*
X185403904Y-136961619D01*
X185356285Y-137056857D01*
X185356285Y-137199714D01*
X185403904Y-137294952D01*
X185451523Y-137342571D01*
X185546761Y-137390190D01*
X185927714Y-137390190D01*
X184546761Y-137818761D02*
X184642000Y-137866380D01*
X184832476Y-137866380D01*
X184927714Y-137818761D01*
X184975333Y-137723523D01*
X184975333Y-137342571D01*
X184927714Y-137247333D01*
X184832476Y-137199714D01*
X184642000Y-137199714D01*
X184546761Y-137247333D01*
X184499142Y-137342571D01*
X184499142Y-137437809D01*
X184975333Y-137533047D01*
X184118190Y-137818761D02*
X184022952Y-137866380D01*
X183832476Y-137866380D01*
X183737238Y-137818761D01*
X183689619Y-137723523D01*
X183689619Y-137675904D01*
X183737238Y-137580666D01*
X183832476Y-137533047D01*
X183975333Y-137533047D01*
X184070571Y-137485428D01*
X184118190Y-137390190D01*
X184118190Y-137342571D01*
X184070571Y-137247333D01*
X183975333Y-137199714D01*
X183832476Y-137199714D01*
X183737238Y-137247333D01*
X182880095Y-137818761D02*
X182975333Y-137866380D01*
X183165809Y-137866380D01*
X183261047Y-137818761D01*
X183308666Y-137723523D01*
X183308666Y-137342571D01*
X183261047Y-137247333D01*
X183165809Y-137199714D01*
X182975333Y-137199714D01*
X182880095Y-137247333D01*
X182832476Y-137342571D01*
X182832476Y-137437809D01*
X183308666Y-137533047D01*
X182546761Y-137199714D02*
X182165809Y-137199714D01*
X182403904Y-136866380D02*
X182403904Y-137723523D01*
X182356285Y-137818761D01*
X182261047Y-137866380D01*
X182165809Y-137866380D01*
X181308666Y-137866380D02*
X181880095Y-137866380D01*
X181594380Y-137866380D02*
X181594380Y-136866380D01*
X181689619Y-137009238D01*
X181784857Y-137104476D01*
X181880095Y-137152095D01*
X197683238Y-137596571D02*
X197540380Y-137644190D01*
X197492761Y-137691809D01*
X197445142Y-137787047D01*
X197445142Y-137929904D01*
X197492761Y-138025142D01*
X197540380Y-138072761D01*
X197635619Y-138120380D01*
X198016571Y-138120380D01*
X198016571Y-137120380D01*
X197683238Y-137120380D01*
X197588000Y-137168000D01*
X197540380Y-137215619D01*
X197492761Y-137310857D01*
X197492761Y-137406095D01*
X197540380Y-137501333D01*
X197588000Y-137548952D01*
X197683238Y-137596571D01*
X198016571Y-137596571D01*
X196873714Y-138120380D02*
X196968952Y-138072761D01*
X197016571Y-138025142D01*
X197064190Y-137929904D01*
X197064190Y-137644190D01*
X197016571Y-137548952D01*
X196968952Y-137501333D01*
X196873714Y-137453714D01*
X196730857Y-137453714D01*
X196635619Y-137501333D01*
X196588000Y-137548952D01*
X196540380Y-137644190D01*
X196540380Y-137929904D01*
X196588000Y-138025142D01*
X196635619Y-138072761D01*
X196730857Y-138120380D01*
X196873714Y-138120380D01*
X195968952Y-138120380D02*
X196064190Y-138072761D01*
X196111809Y-138025142D01*
X196159428Y-137929904D01*
X196159428Y-137644190D01*
X196111809Y-137548952D01*
X196064190Y-137501333D01*
X195968952Y-137453714D01*
X195826095Y-137453714D01*
X195730857Y-137501333D01*
X195683238Y-137548952D01*
X195635619Y-137644190D01*
X195635619Y-137929904D01*
X195683238Y-138025142D01*
X195730857Y-138072761D01*
X195826095Y-138120380D01*
X195968952Y-138120380D01*
X195349904Y-137453714D02*
X194968952Y-137453714D01*
X195207047Y-137120380D02*
X195207047Y-137977523D01*
X195159428Y-138072761D01*
X195064190Y-138120380D01*
X194968952Y-138120380D01*
X194111809Y-138120380D02*
X194683238Y-138120380D01*
X194397523Y-138120380D02*
X194397523Y-137120380D01*
X194492761Y-137263238D01*
X194588000Y-137358476D01*
X194683238Y-137406095D01*
X243336819Y-57486371D02*
X243336819Y-57962561D01*
X244336819Y-57962561D01*
X243336819Y-57153038D02*
X244336819Y-57153038D01*
X243336819Y-56676847D02*
X244336819Y-56676847D01*
X244336819Y-56295895D01*
X244289200Y-56200657D01*
X244241580Y-56153038D01*
X244146342Y-56105419D01*
X244003485Y-56105419D01*
X243908247Y-56153038D01*
X243860628Y-56200657D01*
X243813009Y-56295895D01*
X243813009Y-56676847D01*
X244336819Y-55486371D02*
X244336819Y-55295895D01*
X244289200Y-55200657D01*
X244193961Y-55105419D01*
X244003485Y-55057800D01*
X243670152Y-55057800D01*
X243479676Y-55105419D01*
X243384438Y-55200657D01*
X243336819Y-55295895D01*
X243336819Y-55486371D01*
X243384438Y-55581609D01*
X243479676Y-55676847D01*
X243670152Y-55724466D01*
X244003485Y-55724466D01*
X244193961Y-55676847D01*
X244289200Y-55581609D01*
X244336819Y-55486371D01*
X243336819Y-54105419D02*
X243336819Y-54676847D01*
X243336819Y-54391133D02*
X244336819Y-54391133D01*
X244193961Y-54486371D01*
X244098723Y-54581609D01*
X244051104Y-54676847D01*
X230860800Y-64743371D02*
X230527466Y-64743371D01*
X230384609Y-65267180D02*
X230860800Y-65267180D01*
X230860800Y-64267180D01*
X230384609Y-64267180D01*
X230051276Y-64267180D02*
X229384609Y-65267180D01*
X229384609Y-64267180D02*
X230051276Y-65267180D01*
X229146514Y-64267180D02*
X228575085Y-64267180D01*
X228860800Y-65267180D02*
X228860800Y-64267180D01*
X228479847Y-65362419D02*
X227717942Y-65362419D01*
X227479847Y-65267180D02*
X227479847Y-64267180D01*
X227098895Y-64267180D01*
X227003657Y-64314800D01*
X226956038Y-64362419D01*
X226908419Y-64457657D01*
X226908419Y-64600514D01*
X226956038Y-64695752D01*
X227003657Y-64743371D01*
X227098895Y-64790990D01*
X227479847Y-64790990D01*
X226575085Y-64267180D02*
X226336990Y-65267180D01*
X226146514Y-64552895D01*
X225956038Y-65267180D01*
X225717942Y-64267180D01*
X224765561Y-65267180D02*
X225098895Y-64790990D01*
X225336990Y-65267180D02*
X225336990Y-64267180D01*
X224956038Y-64267180D01*
X224860800Y-64314800D01*
X224813180Y-64362419D01*
X224765561Y-64457657D01*
X224765561Y-64600514D01*
X224813180Y-64695752D01*
X224860800Y-64743371D01*
X224956038Y-64790990D01*
X225336990Y-64790990D01*
X223813180Y-65267180D02*
X224384609Y-65267180D01*
X224098895Y-65267180D02*
X224098895Y-64267180D01*
X224194133Y-64410038D01*
X224289371Y-64505276D01*
X224384609Y-64552895D01*
M02*

File diff suppressed because it is too large Load Diff

View File

@@ -1,748 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.10*
G04 #@! TF.CreationDate,2021-06-10T23:09:58+02:00*
G04 #@! TF.ProjectId,PlantCtrlESP32,506c616e-7443-4747-926c-45535033322e,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,OtherDrawing,Comment*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.10) date 2021-06-10 23:09:58*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,0.100000*%
%ADD11C,0.150000*%
G04 APERTURE END LIST*
D10*
X169862000Y-119918000D02*
X159082000Y-119918000D01*
X169862000Y-91918000D02*
X169862000Y-119918000D01*
X169862000Y-91918000D02*
X159082000Y-91918000D01*
X159082000Y-91918000D02*
X159082000Y-119918000D01*
X159082000Y-118443000D02*
X160172000Y-119918000D01*
X159082000Y-116443000D02*
X161787000Y-119918000D01*
X159082000Y-114443000D02*
X163402000Y-119918000D01*
X159082000Y-112443000D02*
X165017000Y-119918000D01*
X159082000Y-110443000D02*
X166632000Y-119918000D01*
X159082000Y-108443000D02*
X168247000Y-119918000D01*
X159082000Y-106443000D02*
X169862000Y-119918000D01*
X159082000Y-104443000D02*
X169862000Y-117918000D01*
X159082000Y-102443000D02*
X169862000Y-115918000D01*
X169862000Y-113918000D02*
X159082000Y-100443000D01*
X159082000Y-98443000D02*
X169862000Y-111918000D01*
X159082000Y-96443000D02*
X169862000Y-109918000D01*
X159082000Y-94443000D02*
X169862000Y-107918000D01*
X159082000Y-92443000D02*
X169862000Y-105918000D01*
X160172000Y-91918000D02*
X169862000Y-103918000D01*
X161787000Y-91918000D02*
X169862000Y-101918000D01*
X163402000Y-91918000D02*
X169862000Y-99918000D01*
X165017000Y-91918000D02*
X169862000Y-97918000D01*
X166632000Y-91918000D02*
X169862000Y-95918000D01*
X168247000Y-91918000D02*
X169862000Y-93918000D01*
D11*
X260475480Y-68863421D02*
X260475480Y-68768183D01*
X260523100Y-68672945D01*
X260570719Y-68625326D01*
X260665957Y-68577707D01*
X260856433Y-68530088D01*
X261094528Y-68530088D01*
X261285004Y-68577707D01*
X261380242Y-68625326D01*
X261427861Y-68672945D01*
X261475480Y-68768183D01*
X261475480Y-68863421D01*
X261427861Y-68958659D01*
X261380242Y-69006278D01*
X261285004Y-69053897D01*
X261094528Y-69101516D01*
X260856433Y-69101516D01*
X260665957Y-69053897D01*
X260570719Y-69006278D01*
X260523100Y-68958659D01*
X260475480Y-68863421D01*
X261380242Y-68101516D02*
X261427861Y-68053897D01*
X261475480Y-68101516D01*
X261427861Y-68149135D01*
X261380242Y-68101516D01*
X261475480Y-68101516D01*
X260475480Y-67434850D02*
X260475480Y-67339611D01*
X260523100Y-67244373D01*
X260570719Y-67196754D01*
X260665957Y-67149135D01*
X260856433Y-67101516D01*
X261094528Y-67101516D01*
X261285004Y-67149135D01*
X261380242Y-67196754D01*
X261427861Y-67244373D01*
X261475480Y-67339611D01*
X261475480Y-67434850D01*
X261427861Y-67530088D01*
X261380242Y-67577707D01*
X261285004Y-67625326D01*
X261094528Y-67672945D01*
X260856433Y-67672945D01*
X260665957Y-67625326D01*
X260570719Y-67577707D01*
X260523100Y-67530088D01*
X260475480Y-67434850D01*
X260475480Y-66196754D02*
X260475480Y-66672945D01*
X260951671Y-66720564D01*
X260904052Y-66672945D01*
X260856433Y-66577707D01*
X260856433Y-66339611D01*
X260904052Y-66244373D01*
X260951671Y-66196754D01*
X261046909Y-66149135D01*
X261285004Y-66149135D01*
X261380242Y-66196754D01*
X261427861Y-66244373D01*
X261475480Y-66339611D01*
X261475480Y-66577707D01*
X261427861Y-66672945D01*
X261380242Y-66720564D01*
X260904052Y-65577707D02*
X260856433Y-65672945D01*
X260808814Y-65720564D01*
X260713576Y-65768183D01*
X260665957Y-65768183D01*
X260570719Y-65720564D01*
X260523100Y-65672945D01*
X260475480Y-65577707D01*
X260475480Y-65387230D01*
X260523100Y-65291992D01*
X260570719Y-65244373D01*
X260665957Y-65196754D01*
X260713576Y-65196754D01*
X260808814Y-65244373D01*
X260856433Y-65291992D01*
X260904052Y-65387230D01*
X260904052Y-65577707D01*
X260951671Y-65672945D01*
X260999290Y-65720564D01*
X261094528Y-65768183D01*
X261285004Y-65768183D01*
X261380242Y-65720564D01*
X261427861Y-65672945D01*
X261475480Y-65577707D01*
X261475480Y-65387230D01*
X261427861Y-65291992D01*
X261380242Y-65244373D01*
X261285004Y-65196754D01*
X261094528Y-65196754D01*
X260999290Y-65244373D01*
X260951671Y-65291992D01*
X260904052Y-65387230D01*
X261475480Y-64768183D02*
X260808814Y-64768183D01*
X260475480Y-64768183D02*
X260523100Y-64815802D01*
X260570719Y-64768183D01*
X260523100Y-64720564D01*
X260475480Y-64768183D01*
X260570719Y-64768183D01*
X260808814Y-64291992D02*
X261475480Y-64291992D01*
X260904052Y-64291992D02*
X260856433Y-64244373D01*
X260808814Y-64149135D01*
X260808814Y-64006278D01*
X260856433Y-63911040D01*
X260951671Y-63863421D01*
X261475480Y-63863421D01*
X260427861Y-62672945D02*
X261713576Y-63530088D01*
X261475480Y-61815802D02*
X261475480Y-62387230D01*
X261475480Y-62101516D02*
X260475480Y-62101516D01*
X260618338Y-62196754D01*
X260713576Y-62291992D01*
X260761195Y-62387230D01*
X261380242Y-61387230D02*
X261427861Y-61339611D01*
X261475480Y-61387230D01*
X261427861Y-61434850D01*
X261380242Y-61387230D01*
X261475480Y-61387230D01*
X260808814Y-60482469D02*
X261475480Y-60482469D01*
X260427861Y-60720564D02*
X261142147Y-60958659D01*
X261142147Y-60339611D01*
X260475480Y-59530088D02*
X260475480Y-59720564D01*
X260523100Y-59815802D01*
X260570719Y-59863421D01*
X260713576Y-59958659D01*
X260904052Y-60006278D01*
X261285004Y-60006278D01*
X261380242Y-59958659D01*
X261427861Y-59911040D01*
X261475480Y-59815802D01*
X261475480Y-59625326D01*
X261427861Y-59530088D01*
X261380242Y-59482469D01*
X261285004Y-59434850D01*
X261046909Y-59434850D01*
X260951671Y-59482469D01*
X260904052Y-59530088D01*
X260856433Y-59625326D01*
X260856433Y-59815802D01*
X260904052Y-59911040D01*
X260951671Y-59958659D01*
X261046909Y-60006278D01*
X261475480Y-59006278D02*
X260808814Y-59006278D01*
X260904052Y-59006278D02*
X260856433Y-58958659D01*
X260808814Y-58863421D01*
X260808814Y-58720564D01*
X260856433Y-58625326D01*
X260951671Y-58577707D01*
X261475480Y-58577707D01*
X260951671Y-58577707D02*
X260856433Y-58530088D01*
X260808814Y-58434850D01*
X260808814Y-58291992D01*
X260856433Y-58196754D01*
X260951671Y-58149135D01*
X261475480Y-58149135D01*
X261475480Y-57672945D02*
X260808814Y-57672945D01*
X260904052Y-57672945D02*
X260856433Y-57625326D01*
X260808814Y-57530088D01*
X260808814Y-57387230D01*
X260856433Y-57291992D01*
X260951671Y-57244373D01*
X261475480Y-57244373D01*
X260951671Y-57244373D02*
X260856433Y-57196754D01*
X260808814Y-57101516D01*
X260808814Y-56958659D01*
X260856433Y-56863421D01*
X260951671Y-56815802D01*
X261475480Y-56815802D01*
X270305280Y-72063761D02*
X270305280Y-71968523D01*
X270352900Y-71873285D01*
X270400519Y-71825666D01*
X270495757Y-71778047D01*
X270686233Y-71730428D01*
X270924328Y-71730428D01*
X271114804Y-71778047D01*
X271210042Y-71825666D01*
X271257661Y-71873285D01*
X271305280Y-71968523D01*
X271305280Y-72063761D01*
X271257661Y-72159000D01*
X271210042Y-72206619D01*
X271114804Y-72254238D01*
X270924328Y-72301857D01*
X270686233Y-72301857D01*
X270495757Y-72254238D01*
X270400519Y-72206619D01*
X270352900Y-72159000D01*
X270305280Y-72063761D01*
X271210042Y-71301857D02*
X271257661Y-71254238D01*
X271305280Y-71301857D01*
X271257661Y-71349476D01*
X271210042Y-71301857D01*
X271305280Y-71301857D01*
X270400519Y-70873285D02*
X270352900Y-70825666D01*
X270305280Y-70730428D01*
X270305280Y-70492333D01*
X270352900Y-70397095D01*
X270400519Y-70349476D01*
X270495757Y-70301857D01*
X270590995Y-70301857D01*
X270733852Y-70349476D01*
X271305280Y-70920904D01*
X271305280Y-70301857D01*
X271305280Y-69349476D02*
X271305280Y-69920904D01*
X271305280Y-69635190D02*
X270305280Y-69635190D01*
X270448138Y-69730428D01*
X270543376Y-69825666D01*
X270590995Y-69920904D01*
X270638614Y-68492333D02*
X271305280Y-68492333D01*
X270257661Y-68730428D02*
X270971947Y-68968523D01*
X270971947Y-68349476D01*
X271305280Y-67968523D02*
X270638614Y-67968523D01*
X270305280Y-67968523D02*
X270352900Y-68016142D01*
X270400519Y-67968523D01*
X270352900Y-67920904D01*
X270305280Y-67968523D01*
X270400519Y-67968523D01*
X270638614Y-67492333D02*
X271305280Y-67492333D01*
X270733852Y-67492333D02*
X270686233Y-67444714D01*
X270638614Y-67349476D01*
X270638614Y-67206619D01*
X270686233Y-67111380D01*
X270781471Y-67063761D01*
X271305280Y-67063761D01*
X270257661Y-65873285D02*
X271543376Y-66730428D01*
X270305280Y-65063761D02*
X270305280Y-65539952D01*
X270781471Y-65587571D01*
X270733852Y-65539952D01*
X270686233Y-65444714D01*
X270686233Y-65206619D01*
X270733852Y-65111380D01*
X270781471Y-65063761D01*
X270876709Y-65016142D01*
X271114804Y-65016142D01*
X271210042Y-65063761D01*
X271257661Y-65111380D01*
X271305280Y-65206619D01*
X271305280Y-65444714D01*
X271257661Y-65539952D01*
X271210042Y-65587571D01*
X271210042Y-64587571D02*
X271257661Y-64539952D01*
X271305280Y-64587571D01*
X271257661Y-64635190D01*
X271210042Y-64587571D01*
X271305280Y-64587571D01*
X270638614Y-63682809D02*
X271305280Y-63682809D01*
X270257661Y-63920904D02*
X270971947Y-64159000D01*
X270971947Y-63539952D01*
X270638614Y-62730428D02*
X271305280Y-62730428D01*
X270257661Y-62968523D02*
X270971947Y-63206619D01*
X270971947Y-62587571D01*
X270733852Y-62063761D02*
X270686233Y-62159000D01*
X270638614Y-62206619D01*
X270543376Y-62254238D01*
X270495757Y-62254238D01*
X270400519Y-62206619D01*
X270352900Y-62159000D01*
X270305280Y-62063761D01*
X270305280Y-61873285D01*
X270352900Y-61778047D01*
X270400519Y-61730428D01*
X270495757Y-61682809D01*
X270543376Y-61682809D01*
X270638614Y-61730428D01*
X270686233Y-61778047D01*
X270733852Y-61873285D01*
X270733852Y-62063761D01*
X270781471Y-62159000D01*
X270829090Y-62206619D01*
X270924328Y-62254238D01*
X271114804Y-62254238D01*
X271210042Y-62206619D01*
X271257661Y-62159000D01*
X271305280Y-62063761D01*
X271305280Y-61873285D01*
X271257661Y-61778047D01*
X271210042Y-61730428D01*
X271114804Y-61682809D01*
X270924328Y-61682809D01*
X270829090Y-61730428D01*
X270781471Y-61778047D01*
X270733852Y-61873285D01*
X271305280Y-61254238D02*
X270638614Y-61254238D01*
X270733852Y-61254238D02*
X270686233Y-61206619D01*
X270638614Y-61111380D01*
X270638614Y-60968523D01*
X270686233Y-60873285D01*
X270781471Y-60825666D01*
X271305280Y-60825666D01*
X270781471Y-60825666D02*
X270686233Y-60778047D01*
X270638614Y-60682809D01*
X270638614Y-60539952D01*
X270686233Y-60444714D01*
X270781471Y-60397095D01*
X271305280Y-60397095D01*
X271305280Y-59920904D02*
X270638614Y-59920904D01*
X270733852Y-59920904D02*
X270686233Y-59873285D01*
X270638614Y-59778047D01*
X270638614Y-59635190D01*
X270686233Y-59539952D01*
X270781471Y-59492333D01*
X271305280Y-59492333D01*
X270781471Y-59492333D02*
X270686233Y-59444714D01*
X270638614Y-59349476D01*
X270638614Y-59206619D01*
X270686233Y-59111380D01*
X270781471Y-59063761D01*
X271305280Y-59063761D01*
X267295380Y-77835911D02*
X267295380Y-77740673D01*
X267343000Y-77645435D01*
X267390619Y-77597816D01*
X267485857Y-77550197D01*
X267676333Y-77502578D01*
X267914428Y-77502578D01*
X268104904Y-77550197D01*
X268200142Y-77597816D01*
X268247761Y-77645435D01*
X268295380Y-77740673D01*
X268295380Y-77835911D01*
X268247761Y-77931150D01*
X268200142Y-77978769D01*
X268104904Y-78026388D01*
X267914428Y-78074007D01*
X267676333Y-78074007D01*
X267485857Y-78026388D01*
X267390619Y-77978769D01*
X267343000Y-77931150D01*
X267295380Y-77835911D01*
X268200142Y-77074007D02*
X268247761Y-77026388D01*
X268295380Y-77074007D01*
X268247761Y-77121626D01*
X268200142Y-77074007D01*
X268295380Y-77074007D01*
X267295380Y-76407340D02*
X267295380Y-76312102D01*
X267343000Y-76216864D01*
X267390619Y-76169245D01*
X267485857Y-76121626D01*
X267676333Y-76074007D01*
X267914428Y-76074007D01*
X268104904Y-76121626D01*
X268200142Y-76169245D01*
X268247761Y-76216864D01*
X268295380Y-76312102D01*
X268295380Y-76407340D01*
X268247761Y-76502578D01*
X268200142Y-76550197D01*
X268104904Y-76597816D01*
X267914428Y-76645435D01*
X267676333Y-76645435D01*
X267485857Y-76597816D01*
X267390619Y-76550197D01*
X267343000Y-76502578D01*
X267295380Y-76407340D01*
X267390619Y-75693054D02*
X267343000Y-75645435D01*
X267295380Y-75550197D01*
X267295380Y-75312102D01*
X267343000Y-75216864D01*
X267390619Y-75169245D01*
X267485857Y-75121626D01*
X267581095Y-75121626D01*
X267723952Y-75169245D01*
X268295380Y-75740673D01*
X268295380Y-75121626D01*
X268295380Y-74169245D02*
X268295380Y-74740673D01*
X268295380Y-74454959D02*
X267295380Y-74454959D01*
X267438238Y-74550197D01*
X267533476Y-74645435D01*
X267581095Y-74740673D01*
X268295380Y-73740673D02*
X267628714Y-73740673D01*
X267295380Y-73740673D02*
X267343000Y-73788292D01*
X267390619Y-73740673D01*
X267343000Y-73693054D01*
X267295380Y-73740673D01*
X267390619Y-73740673D01*
X267628714Y-73264483D02*
X268295380Y-73264483D01*
X267723952Y-73264483D02*
X267676333Y-73216864D01*
X267628714Y-73121626D01*
X267628714Y-72978769D01*
X267676333Y-72883530D01*
X267771571Y-72835911D01*
X268295380Y-72835911D01*
X267247761Y-71645435D02*
X268533476Y-72502578D01*
X267295380Y-71121626D02*
X267295380Y-71026388D01*
X267343000Y-70931150D01*
X267390619Y-70883530D01*
X267485857Y-70835911D01*
X267676333Y-70788292D01*
X267914428Y-70788292D01*
X268104904Y-70835911D01*
X268200142Y-70883530D01*
X268247761Y-70931150D01*
X268295380Y-71026388D01*
X268295380Y-71121626D01*
X268247761Y-71216864D01*
X268200142Y-71264483D01*
X268104904Y-71312102D01*
X267914428Y-71359721D01*
X267676333Y-71359721D01*
X267485857Y-71312102D01*
X267390619Y-71264483D01*
X267343000Y-71216864D01*
X267295380Y-71121626D01*
X268200142Y-70359721D02*
X268247761Y-70312102D01*
X268295380Y-70359721D01*
X268247761Y-70407340D01*
X268200142Y-70359721D01*
X268295380Y-70359721D01*
X267295380Y-69407340D02*
X267295380Y-69883530D01*
X267771571Y-69931150D01*
X267723952Y-69883530D01*
X267676333Y-69788292D01*
X267676333Y-69550197D01*
X267723952Y-69454959D01*
X267771571Y-69407340D01*
X267866809Y-69359721D01*
X268104904Y-69359721D01*
X268200142Y-69407340D01*
X268247761Y-69454959D01*
X268295380Y-69550197D01*
X268295380Y-69788292D01*
X268247761Y-69883530D01*
X268200142Y-69931150D01*
X267295380Y-69026388D02*
X267295380Y-68407340D01*
X267676333Y-68740673D01*
X267676333Y-68597816D01*
X267723952Y-68502578D01*
X267771571Y-68454959D01*
X267866809Y-68407340D01*
X268104904Y-68407340D01*
X268200142Y-68454959D01*
X268247761Y-68502578D01*
X268295380Y-68597816D01*
X268295380Y-68883530D01*
X268247761Y-68978769D01*
X268200142Y-69026388D01*
X267295380Y-68074007D02*
X267295380Y-67454959D01*
X267676333Y-67788292D01*
X267676333Y-67645435D01*
X267723952Y-67550197D01*
X267771571Y-67502578D01*
X267866809Y-67454959D01*
X268104904Y-67454959D01*
X268200142Y-67502578D01*
X268247761Y-67550197D01*
X268295380Y-67645435D01*
X268295380Y-67931150D01*
X268247761Y-68026388D01*
X268200142Y-68074007D01*
X268295380Y-67026388D02*
X267628714Y-67026388D01*
X267723952Y-67026388D02*
X267676333Y-66978769D01*
X267628714Y-66883530D01*
X267628714Y-66740673D01*
X267676333Y-66645435D01*
X267771571Y-66597816D01*
X268295380Y-66597816D01*
X267771571Y-66597816D02*
X267676333Y-66550197D01*
X267628714Y-66454959D01*
X267628714Y-66312102D01*
X267676333Y-66216864D01*
X267771571Y-66169245D01*
X268295380Y-66169245D01*
X268295380Y-65693054D02*
X267628714Y-65693054D01*
X267723952Y-65693054D02*
X267676333Y-65645435D01*
X267628714Y-65550197D01*
X267628714Y-65407340D01*
X267676333Y-65312102D01*
X267771571Y-65264483D01*
X268295380Y-65264483D01*
X267771571Y-65264483D02*
X267676333Y-65216864D01*
X267628714Y-65121626D01*
X267628714Y-64978769D01*
X267676333Y-64883530D01*
X267771571Y-64835911D01*
X268295380Y-64835911D01*
X266660380Y-65339230D02*
X266660380Y-65243992D01*
X266708000Y-65148754D01*
X266755619Y-65101135D01*
X266850857Y-65053516D01*
X267041333Y-65005897D01*
X267279428Y-65005897D01*
X267469904Y-65053516D01*
X267565142Y-65101135D01*
X267612761Y-65148754D01*
X267660380Y-65243992D01*
X267660380Y-65339230D01*
X267612761Y-65434469D01*
X267565142Y-65482088D01*
X267469904Y-65529707D01*
X267279428Y-65577326D01*
X267041333Y-65577326D01*
X266850857Y-65529707D01*
X266755619Y-65482088D01*
X266708000Y-65434469D01*
X266660380Y-65339230D01*
X267565142Y-64577326D02*
X267612761Y-64529707D01*
X267660380Y-64577326D01*
X267612761Y-64624945D01*
X267565142Y-64577326D01*
X267660380Y-64577326D01*
X266660380Y-63910659D02*
X266660380Y-63815421D01*
X266708000Y-63720183D01*
X266755619Y-63672564D01*
X266850857Y-63624945D01*
X267041333Y-63577326D01*
X267279428Y-63577326D01*
X267469904Y-63624945D01*
X267565142Y-63672564D01*
X267612761Y-63720183D01*
X267660380Y-63815421D01*
X267660380Y-63910659D01*
X267612761Y-64005897D01*
X267565142Y-64053516D01*
X267469904Y-64101135D01*
X267279428Y-64148754D01*
X267041333Y-64148754D01*
X266850857Y-64101135D01*
X266755619Y-64053516D01*
X266708000Y-64005897D01*
X266660380Y-63910659D01*
X266660380Y-62672564D02*
X266660380Y-63148754D01*
X267136571Y-63196373D01*
X267088952Y-63148754D01*
X267041333Y-63053516D01*
X267041333Y-62815421D01*
X267088952Y-62720183D01*
X267136571Y-62672564D01*
X267231809Y-62624945D01*
X267469904Y-62624945D01*
X267565142Y-62672564D01*
X267612761Y-62720183D01*
X267660380Y-62815421D01*
X267660380Y-63053516D01*
X267612761Y-63148754D01*
X267565142Y-63196373D01*
X267660380Y-62196373D02*
X266993714Y-62196373D01*
X266660380Y-62196373D02*
X266708000Y-62243992D01*
X266755619Y-62196373D01*
X266708000Y-62148754D01*
X266660380Y-62196373D01*
X266755619Y-62196373D01*
X266993714Y-61720183D02*
X267660380Y-61720183D01*
X267088952Y-61720183D02*
X267041333Y-61672564D01*
X266993714Y-61577326D01*
X266993714Y-61434469D01*
X267041333Y-61339230D01*
X267136571Y-61291611D01*
X267660380Y-61291611D01*
X266612761Y-60101135D02*
X267898476Y-60958278D01*
X267660380Y-59243992D02*
X267660380Y-59815421D01*
X267660380Y-59529707D02*
X266660380Y-59529707D01*
X266803238Y-59624945D01*
X266898476Y-59720183D01*
X266946095Y-59815421D01*
X267565142Y-58815421D02*
X267612761Y-58767802D01*
X267660380Y-58815421D01*
X267612761Y-58863040D01*
X267565142Y-58815421D01*
X267660380Y-58815421D01*
X266755619Y-58386850D02*
X266708000Y-58339230D01*
X266660380Y-58243992D01*
X266660380Y-58005897D01*
X266708000Y-57910659D01*
X266755619Y-57863040D01*
X266850857Y-57815421D01*
X266946095Y-57815421D01*
X267088952Y-57863040D01*
X267660380Y-58434469D01*
X267660380Y-57815421D01*
X266660380Y-57482088D02*
X266660380Y-56815421D01*
X267660380Y-57243992D01*
X267660380Y-56434469D02*
X266993714Y-56434469D01*
X267088952Y-56434469D02*
X267041333Y-56386850D01*
X266993714Y-56291611D01*
X266993714Y-56148754D01*
X267041333Y-56053516D01*
X267136571Y-56005897D01*
X267660380Y-56005897D01*
X267136571Y-56005897D02*
X267041333Y-55958278D01*
X266993714Y-55863040D01*
X266993714Y-55720183D01*
X267041333Y-55624945D01*
X267136571Y-55577326D01*
X267660380Y-55577326D01*
X267660380Y-55101135D02*
X266993714Y-55101135D01*
X267088952Y-55101135D02*
X267041333Y-55053516D01*
X266993714Y-54958278D01*
X266993714Y-54815421D01*
X267041333Y-54720183D01*
X267136571Y-54672564D01*
X267660380Y-54672564D01*
X267136571Y-54672564D02*
X267041333Y-54624945D01*
X266993714Y-54529707D01*
X266993714Y-54386850D01*
X267041333Y-54291611D01*
X267136571Y-54243992D01*
X267660380Y-54243992D01*
M02*

View File

@@ -1,14 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.10*
G04 #@! TF.CreationDate,2021-06-10T23:09:58+02:00*
G04 #@! TF.ProjectId,PlantCtrlESP32,506c616e-7443-4747-926c-45535033322e,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Other,ECO1*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.10) date 2021-06-10 23:09:58*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

View File

@@ -1,14 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.10*
G04 #@! TF.CreationDate,2021-06-10T23:09:58+02:00*
G04 #@! TF.ProjectId,PlantCtrlESP32,506c616e-7443-4747-926c-45535033322e,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Other,ECO2*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.10) date 2021-06-10 23:09:58*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

View File

@@ -1,28 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.10*
G04 #@! TF.CreationDate,2021-06-10T23:09:58+02:00*
G04 #@! TF.ProjectId,PlantCtrlESP32,506c616e-7443-4747-926c-45535033322e,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Profile,NP*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.10) date 2021-06-10 23:09:58*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 #@! TA.AperFunction,Profile*
%ADD10C,0.050000*%
G04 #@! TD*
G04 APERTURE END LIST*
D10*
X170180000Y-40640000D02*
X269240000Y-40640000D01*
X170180000Y-43180000D02*
X170180000Y-40640000D01*
X170180000Y-139700000D02*
X170180000Y-43180000D01*
X269240000Y-139700000D02*
X269240000Y-40640000D01*
X170180000Y-139700000D02*
X269240000Y-139700000D01*
M02*

View File

@@ -1,32 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.10*
G04 #@! TF.CreationDate,2021-06-10T23:09:58+02:00*
G04 #@! TF.ProjectId,PlantCtrlESP32,506c616e-7443-4747-926c-45535033322e,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Glue,Top*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.10) date 2021-06-10 23:09:58*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,0.380000*%
G04 APERTURE END LIST*
D10*
X211413132Y-73660000D02*
G75*
G03*
X211413132Y-73660000I-212132J0D01*
G01*
X211751000Y-73660000D02*
G75*
G03*
X211751000Y-73660000I-550000J0D01*
G01*
X212101000Y-73660000D02*
G75*
G03*
X212101000Y-73660000I-900000J0D01*
G01*
M02*

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,14 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.10*
G04 #@! TF.CreationDate,2021-06-10T23:09:58+02:00*
G04 #@! TF.ProjectId,PlantCtrlESP32,506c616e-7443-4747-926c-45535033322e,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Other,User*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.10) date 2021-06-10 23:09:58*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

View File

@@ -1,20 +0,0 @@
M48
; DRILL file {KiCad 5.1.10} date Thu Jun 10 23:11:37 2021
; FORMAT={-:-/ absolute / inch / decimal}
; #@! TF.CreationDate,2021-06-10T23:11:37+02:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,5.1.10
; #@! TF.FileFunction,NonPlated,1,2,NPTH
FMAT,2
INCH
T1C0.0941
T2C0.1358
%
G90
G05
T1
X9.8951Y-2.461
T2
X7.394Y-2.461
X9.5672Y-1.831
T0
M30

View File

@@ -1,304 +0,0 @@
M48
; DRILL file {KiCad 5.1.10} date Thu Jun 10 23:11:37 2021
; FORMAT={-:-/ absolute / inch / decimal}
; #@! TF.CreationDate,2021-06-10T23:11:37+02:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,5.1.10
; #@! TF.FileFunction,Plated,1,2,PTH
FMAT,2
INCH
T1C0.0157
T2C0.0295
T3C0.0315
T4C0.0374
T5C0.0394
T6C0.0591
T7C0.0591
T8C0.0787
T9C0.1181
%
G90
G05
T1
X6.7418Y-4.8632
X6.755Y-4.285
X6.8055Y-4.415
X6.825Y-3.525
X6.845Y-3.93
X6.8754Y-4.7304
X6.8757Y-4.3343
X6.905Y-4.58
X6.96Y-4.585
X6.98Y-3.19
X6.985Y-3.91
X7.005Y-4.37
X7.025Y-2.385
X7.025Y-4.75
X7.04Y-4.6
X7.045Y-5.035
X7.05Y-3.48
X7.055Y-4.38
X7.055Y-4.89
X7.08Y-2.99
X7.11Y-5.025
X7.13Y-2.45
X7.13Y-4.96
X7.14Y-4.77
X7.15Y-2.92
X7.1528Y-5.1602
X7.17Y-5.43
X7.21Y-4.3
X7.22Y-4.77
X7.225Y-4.35
X7.225Y-4.35
X7.2274Y-4.2647
X7.23Y-3.06
X7.25Y-5.16
X7.255Y-4.41
X7.2866Y-5.2154
X7.29Y-3.41
X7.3Y-4.41
X7.315Y-2.385
X7.32Y-4.77
X7.3282Y-3.95
X7.34Y-4.075
X7.35Y-3.73
X7.3621Y-4.3489
X7.37Y-3.67
X7.37Y-4.12
X7.42Y-4.77
X7.4275Y-5.0525
X7.43Y-4.92
X7.43Y-4.96
X7.45Y-3.15
X7.5Y-3.78
X7.52Y-4.77
X7.5434Y-4.5416
X7.55Y-4.35
X7.58Y-4.58
X7.59Y-4.15
X7.59Y-5.29
X7.5965Y-4.9528
X7.62Y-4.77
X7.64Y-4.18
X7.66Y-2.095
X7.665Y-1.99
X7.69Y-5.41
X7.7Y-2.36
X7.72Y-4.77
X7.78Y-2.525
X7.78Y-5.37
X7.825Y-3.25
X7.875Y-3.45
X7.975Y-3.45
X7.975Y-4.45
X8.025Y-1.97
X8.0625Y-2.8075
X8.07Y-2.09
X8.072Y-4.652
X8.09Y-5.2
X8.125Y-3.4
X8.145Y-2.32
X8.15Y-5.09
X8.18Y-4.44
X8.22Y-3.92
X8.24Y-4.72
X8.2779Y-3.7421
X8.2779Y-3.9179
X8.2779Y-4.1879
X8.29Y-5.44
X8.3Y-5.26
X8.31Y-3.275
X8.31Y-3.645
X8.3299Y-3.8453
X8.33Y-4.58
X8.35Y-4.645
X8.375Y-3.66
X8.38Y-5.37
X8.4Y-1.72
X8.43Y-4.7
X8.48Y-4.595
X8.49Y-1.815
X8.54Y-3.85
X8.57Y-1.78
X8.615Y-4.375
X8.637Y-4.8689
X8.6726Y-3.6326
X8.695Y-4.59
X8.695Y-4.7
X8.8Y-3.15
X8.83Y-3.85
X8.841Y-1.761
X8.847Y-1.646
X8.915Y-4.38
X8.9526Y-3.6326
X8.955Y-4.705
X8.9559Y-4.861
X8.96Y-4.58
X9.06Y-2.97
X9.11Y-2.1
X9.11Y-2.34
X9.13Y-3.85
X9.2Y-3.34
X9.22Y-4.37
X9.2526Y-3.6326
X9.2551Y-4.8335
X9.27Y-4.585
X9.27Y-4.705
X9.28Y-3.21
X9.319Y-1.656
X9.32Y-3.46
X9.325Y-1.764
X9.35Y-2.48
X9.44Y-3.85
X9.45Y-3.21
X9.47Y-2.59
X9.515Y-3.375
X9.52Y-4.38
X9.525Y-3.46
X9.525Y-4.585
X9.53Y-4.7
X9.5374Y-3.6326
X9.5588Y-3.2462
X9.58Y-4.85
X9.59Y-4.955
X9.715Y-2.025
X9.74Y-3.85
X9.75Y-4.7
X9.79Y-3.465
X9.84Y-4.385
X9.84Y-4.85
X9.845Y-1.835
X9.851Y-1.657
X9.854Y-1.744
X9.8774Y-3.6326
X9.885Y-4.955
X9.925Y-4.58
X10.03Y-3.27
X10.03Y-3.41
X10.05Y-3.85
X10.12Y-4.375
X10.125Y-4.22
X10.14Y-4.01
X10.17Y-4.85
X10.185Y-4.525
X10.185Y-4.955
X10.21Y-3.265
X10.315Y-4.715
X10.328Y-2.639
X10.3328Y-2.1392
X10.3378Y-3.8453
X10.34Y-3.41
X10.345Y-4.275
X10.355Y-3.585
X10.36Y-4.485
X10.365Y-2.6
X10.375Y-3.29
X10.4Y-3.945
X10.4028Y-3.85
X10.42Y-3.405
X10.475Y-3.63
X10.48Y-3.015
X10.505Y-4.41
X10.5051Y-3.5849
X10.51Y-3.195
X10.57Y-3.559
X10.572Y-2.412
T2
X8.47Y-1.645
X8.52Y-1.645
X8.57Y-1.645
T3
X8.655Y-3.03
X10.145Y-3.47
X10.1474Y-3.6326
T4
X6.861Y-2.737
X6.861Y-2.8354
X6.861Y-2.9339
X7.5247Y-5.07
X7.6231Y-5.07
X7.7216Y-5.07
X7.82Y-5.07
X8.45Y-4.9031
X8.45Y-5.0016
X8.45Y-5.1
X8.75Y-4.9031
X8.75Y-5.0016
X8.75Y-5.1
X9.05Y-4.9031
X9.05Y-5.0016
X9.05Y-5.1
X9.35Y-4.9031
X9.35Y-5.0016
X9.35Y-5.1
X9.65Y-4.9031
X9.65Y-5.0016
X9.65Y-5.1
X9.95Y-4.9031
X9.95Y-5.0016
X9.95Y-5.1
X10.25Y-4.9031
X10.25Y-5.0016
X10.25Y-5.1
T5
X6.95Y-3.4
X7.1381Y-2.805
X7.1469Y-3.4
X7.335Y-2.805
X7.5781Y-2.795
X7.775Y-2.795
X7.825Y-3.775
X7.825Y-3.875
X7.9Y-4.55
X7.925Y-3.775
X7.925Y-3.875
X8.0Y-4.55
X8.025Y-3.775
X8.025Y-3.875
X8.1Y-4.55
X8.125Y-3.775
X8.125Y-3.875
X8.39Y-3.4
X8.45Y-4.3516
X8.45Y-4.45
X8.5869Y-3.4
X8.707Y-2.665
X8.75Y-4.3516
X8.75Y-4.45
X8.807Y-2.665
X8.85Y-3.4
X8.902Y-2.412
X8.907Y-2.665
X9.0004Y-2.412
X9.007Y-2.665
X9.0469Y-3.4
X9.05Y-4.3516
X9.05Y-4.45
X9.35Y-4.3516
X9.35Y-4.45
X9.65Y-4.3516
X9.65Y-4.45
X9.95Y-4.3516
X9.95Y-4.45
X10.225Y-2.815
X10.225Y-2.915
X10.225Y-3.015
X10.225Y-3.115
X10.25Y-4.3516
X10.25Y-4.45
T6
X9.1502Y-2.8
X10.04Y-2.8
T7
X9.448Y-2.107
X9.448Y-2.307
T8
X6.9321Y-2.146
X10.029Y-2.146
T9
X6.85Y-1.75
X6.85Y-5.34
X10.45Y-1.75
X10.45Y-5.34
T0
M30

Binary file not shown.

View File

@@ -0,0 +1,158 @@
(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
(symbol "BQ34Z100PWR-G1" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "U" (id 0) (at -12.7 26.4 0.0)
(effects (font (size 1.27 1.27)) (justify bottom left))
)
(property "Value" "BQ34Z100PWR-G1" (id 1) (at -12.7 -29.4 0.0)
(effects (font (size 1.27 1.27)) (justify bottom left))
)
(property "Footprint" "BQ34Z100PWR-G1:SOP65P640X120-14N" (id 2) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "MF" "Texas Instruments" (id 4) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Description" "\nMulti-chemistry Impedance Track™ standalone fuel gauge | battery gas gauge\n" (id 5) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Package" "TSSOP-14 Texas Instruments" (id 6) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Price" "None" (id 7) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "SnapEDA_Link" "https://www.snapeda.com/parts/BQ34Z100PWR-G1/Texas+Instruments/view-part/?ref=snap" (id 8) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "MP" "BQ34Z100PWR-G1" (id 9) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Purchase-URL" "https://www.snapeda.com/api/url_track_click_mouser/?unipart_id=327977&manufacturer=Texas Instruments&part_name=BQ34Z100PWR-G1&search_term=None" (id 10) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Availability" "In Stock" (id 11) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Check_prices" "https://www.snapeda.com/parts/BQ34Z100PWR-G1/Texas+Instruments/view-part/?ref=eda" (id 12) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(symbol "BQ34Z100PWR-G1_0_0"
(rectangle (start -12.7 -25.4) (end 12.7 25.4)
(stroke (width 0.41)) (fill (type background))
)
(pin input line (at -17.78 22.86 0) (length 5.08)
(name "REGIN"
(effects (font (size 1.016 1.016)))
)
(number "6"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at -17.78 17.78 0) (length 5.08)
(name "BAT"
(effects (font (size 1.016 1.016)))
)
(number "4"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at -17.78 12.7 0) (length 5.08)
(name "CE"
(effects (font (size 1.016 1.016)))
)
(number "5"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at -17.78 7.62 0) (length 5.08)
(name "P1"
(effects (font (size 1.016 1.016)))
)
(number "3"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at -17.78 5.08 0) (length 5.08)
(name "P2"
(effects (font (size 1.016 1.016)))
)
(number "1"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at -17.78 2.54 0) (length 5.08)
(name "P3/SDA"
(effects (font (size 1.016 1.016)))
)
(number "14"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at -17.78 -2.54 0) (length 5.08)
(name "REG25"
(effects (font (size 1.016 1.016)))
)
(number "7"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at -17.78 -7.62 0) (length 5.08)
(name "SRN"
(effects (font (size 1.016 1.016)))
)
(number "10"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at -17.78 -12.7 0) (length 5.08)
(name "SRP"
(effects (font (size 1.016 1.016)))
)
(number "9"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at -17.78 -17.78 0) (length 5.08)
(name "VEN"
(effects (font (size 1.016 1.016)))
)
(number "2"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at 17.78 5.08 180.0) (length 5.08)
(name "P4/SCL"
(effects (font (size 1.016 1.016)))
)
(number "13"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at 17.78 2.54 180.0) (length 5.08)
(name "P5/HDQ"
(effects (font (size 1.016 1.016)))
)
(number "12"
(effects (font (size 1.016 1.016)))
)
)
(pin bidirectional line (at 17.78 1.77636e-15 180.0) (length 5.08)
(name "P6/TS"
(effects (font (size 1.016 1.016)))
)
(number "11"
(effects (font (size 1.016 1.016)))
)
)
(pin power_in line (at 17.78 -20.32 180.0) (length 5.08)
(name "VSS"
(effects (font (size 1.016 1.016)))
)
(number "8"
(effects (font (size 1.016 1.016)))
)
)
)
)
)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,186 @@
(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
(symbol "CN61CN33" (in_bom yes) (on_board yes)
(property "Reference" "U" (at 2.54 12.7 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "CN61CN33" (at 5.08 10.16 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "Package_TO_SOT_SMD:SOT-23" (at 7.62 2.54 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm809.pdf" (at 7.62 2.54 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_keywords" "reset supervisor" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_description" "Microprocessor Reset (active-low) Circuit, SOT-23" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_fp_filters" "SOT?23*" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "CN61CN33_0_1"
(rectangle (start 5.08 7.62) (end -5.08 -7.62)
(stroke (width 0.254) (type solid))
(fill (type background))
)
)
(symbol "CN61CN33_1_1"
(pin output line (at 0 -10.16 90) (length 2.54)
(name "RESET" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at 7.62 0 180) (length 2.54)
(name "GND" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at 0 10.16 270) (length 2.54)
(name "VCC" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
)
)
(symbol "DS2438" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "U" (at 0 0 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "DS2438" (at 0 0 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "DS2438_0_1"
(rectangle (start -11.43 -2.54) (end 12.7 -30.48)
(stroke (width 0) (type solid))
(fill (type background))
)
)
(symbol "DS2438_1_1"
(pin power_in line (at -13.97 -6.35 0) (length 2.54)
(name "GND" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at -13.97 -12.7 0) (length 2.54)
(name "Vsens+" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at -13.97 -19.05 0) (length 2.54)
(name "Vsense-" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
(pin input line (at -13.97 -25.4 0) (length 2.54)
(name "Vad" (effects (font (size 1.27 1.27))))
(number "4" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at 15.24 -25.4 180) (length 2.54)
(name "Vdd" (effects (font (size 1.27 1.27))))
(number "5" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 15.24 -19.05 180) (length 2.54)
(name "NC" (effects (font (size 1.27 1.27))))
(number "6" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 15.24 -12.7 180) (length 2.54)
(name "NC" (effects (font (size 1.27 1.27))))
(number "7" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 15.24 -6.35 180) (length 2.54)
(name "DQ" (effects (font (size 1.27 1.27))))
(number "8" (effects (font (size 1.27 1.27))))
)
)
)
(symbol "DW01" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "IC" (at 21.59 7.62 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Value" "DW01" (at 21.59 5.08 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Footprint" "SOT95P280X135-6N" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "Datasheet" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "HEIGHT" "1.35mm" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "DESCRIPTION" "ic" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "MANUFACTURER_PART_NUMBER" "DW01" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "MANUFACTURER_NAME" "Slkor" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "ki_locked" "" (at 0 0 0)
(effects (font (size 1.27 1.27)))
)
(symbol "DW01_0_0"
(polyline
(pts
(xy 5.08 2.54)
(xy 5.08 -7.62)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 5.08 2.54)
(xy 20.32 2.54)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 20.32 -7.62)
(xy 5.08 -7.62)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 20.32 -7.62)
(xy 20.32 2.54)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(pin bidirectional line (at 0 0 0) (length 5.08)
(name "OD" (effects (font (size 1.016 1.016))))
(number "1" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 0 -2.54 0) (length 5.08)
(name "CSI" (effects (font (size 1.016 1.016))))
(number "2" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 0 -5.08 0) (length 5.08)
(name "OC" (effects (font (size 1.016 1.016))))
(number "3" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 25.4 -5.08 180) (length 5.08)
(name "TD" (effects (font (size 1.016 1.016))))
(number "4" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 25.4 -2.54 180) (length 5.08)
(name "VDD" (effects (font (size 1.016 1.016))))
(number "5" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 25.4 0 180) (length 5.08)
(name "VSS" (effects (font (size 1.016 1.016))))
(number "6" (effects (font (size 1.016 1.016))))
)
)
)
)

View File

@@ -0,0 +1,454 @@
(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
(symbol "ESP32-DEVKITC-32D" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "U" (at -15.2654 26.0604 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Value" "ESP32-DEVKITC-32D" (at -15.2654 -27.9654 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Footprint" "MODULE_ESP32-DEVKITC-32D" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "Datasheet" "4" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "Field4" "Espressif Systems" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "ki_locked" "" (at 0 0 0)
(effects (font (size 1.27 1.27)))
)
(symbol "ESP32-DEVKITC-32D_0_0"
(polyline
(pts
(xy -15.24 -25.4)
(xy -15.24 25.4)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -15.24 25.4)
(xy 15.24 25.4)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 15.24 -25.4)
(xy -15.24 -25.4)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 15.24 25.4)
(xy 15.24 -25.4)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(pin power_in line (at -20.32 22.86 0) (length 5.08)
(name "3V3" (effects (font (size 1.016 1.016))))
(number "1" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -20.32 0 0) (length 5.08)
(name "IO26" (effects (font (size 1.016 1.016))))
(number "10" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -20.32 -2.54 0) (length 5.08)
(name "IO27" (effects (font (size 1.016 1.016))))
(number "11" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -20.32 -5.08 0) (length 5.08)
(name "IO14" (effects (font (size 1.016 1.016))))
(number "12" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -20.32 -7.62 0) (length 5.08)
(name "IO12" (effects (font (size 1.016 1.016))))
(number "13" (effects (font (size 1.016 1.016))))
)
(pin power_in line (at -20.32 -10.16 0) (length 5.08)
(name "GND1" (effects (font (size 1.016 1.016))))
(number "14" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -20.32 -12.7 0) (length 5.08)
(name "IO13" (effects (font (size 1.016 1.016))))
(number "15" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -20.32 -15.24 0) (length 5.08)
(name "SD2" (effects (font (size 1.016 1.016))))
(number "16" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -20.32 -17.78 0) (length 5.08)
(name "SD3" (effects (font (size 1.016 1.016))))
(number "17" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -20.32 -20.32 0) (length 5.08)
(name "CMD" (effects (font (size 1.016 1.016))))
(number "18" (effects (font (size 1.016 1.016))))
)
(pin power_in line (at -20.32 -22.86 0) (length 5.08)
(name "EXT_5V" (effects (font (size 1.016 1.016))))
(number "19" (effects (font (size 1.016 1.016))))
)
(pin input line (at -20.32 20.32 0) (length 5.08)
(name "EN" (effects (font (size 1.016 1.016))))
(number "2" (effects (font (size 1.016 1.016))))
)
(pin power_in line (at 20.32 22.86 180) (length 5.08)
(name "GND3" (effects (font (size 1.016 1.016))))
(number "20" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 20.32 180) (length 5.08)
(name "IO23" (effects (font (size 1.016 1.016))))
(number "21" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 17.78 180) (length 5.08)
(name "IO22" (effects (font (size 1.016 1.016))))
(number "22" (effects (font (size 1.016 1.016))))
)
(pin output line (at 20.32 15.24 180) (length 5.08)
(name "TXD0" (effects (font (size 1.016 1.016))))
(number "23" (effects (font (size 1.016 1.016))))
)
(pin input line (at 20.32 12.7 180) (length 5.08)
(name "RXD0" (effects (font (size 1.016 1.016))))
(number "24" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 10.16 180) (length 5.08)
(name "IO21" (effects (font (size 1.016 1.016))))
(number "25" (effects (font (size 1.016 1.016))))
)
(pin power_in line (at 20.32 7.62 180) (length 5.08)
(name "GND2" (effects (font (size 1.016 1.016))))
(number "26" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 5.08 180) (length 5.08)
(name "IO19" (effects (font (size 1.016 1.016))))
(number "27" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 2.54 180) (length 5.08)
(name "IO18" (effects (font (size 1.016 1.016))))
(number "28" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 0 180) (length 5.08)
(name "IO5" (effects (font (size 1.016 1.016))))
(number "29" (effects (font (size 1.016 1.016))))
)
(pin input line (at -20.32 17.78 0) (length 5.08)
(name "SENSOR_VP" (effects (font (size 1.016 1.016))))
(number "3" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 -2.54 180) (length 5.08)
(name "IO17" (effects (font (size 1.016 1.016))))
(number "30" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 -5.08 180) (length 5.08)
(name "IO16" (effects (font (size 1.016 1.016))))
(number "31" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 -7.62 180) (length 5.08)
(name "IO4" (effects (font (size 1.016 1.016))))
(number "32" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 -10.16 180) (length 5.08)
(name "IO0" (effects (font (size 1.016 1.016))))
(number "33" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 -12.7 180) (length 5.08)
(name "IO2" (effects (font (size 1.016 1.016))))
(number "34" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 -15.24 180) (length 5.08)
(name "IO15" (effects (font (size 1.016 1.016))))
(number "35" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 -17.78 180) (length 5.08)
(name "SD1" (effects (font (size 1.016 1.016))))
(number "36" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 20.32 -20.32 180) (length 5.08)
(name "SD0" (effects (font (size 1.016 1.016))))
(number "37" (effects (font (size 1.016 1.016))))
)
(pin input clock (at 20.32 -22.86 180) (length 5.08)
(name "CLK" (effects (font (size 1.016 1.016))))
(number "38" (effects (font (size 1.016 1.016))))
)
(pin input line (at -20.32 15.24 0) (length 5.08)
(name "SENSOR_VN" (effects (font (size 1.016 1.016))))
(number "4" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -20.32 12.7 0) (length 5.08)
(name "IO34" (effects (font (size 1.016 1.016))))
(number "5" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -20.32 10.16 0) (length 5.08)
(name "IO35" (effects (font (size 1.016 1.016))))
(number "6" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -20.32 7.62 0) (length 5.08)
(name "IO32" (effects (font (size 1.016 1.016))))
(number "7" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -20.32 5.08 0) (length 5.08)
(name "IO33" (effects (font (size 1.016 1.016))))
(number "8" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -20.32 2.54 0) (length 5.08)
(name "IO25" (effects (font (size 1.016 1.016))))
(number "9" (effects (font (size 1.016 1.016))))
)
)
)
(symbol "SL2300" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "Q" (at 0 0 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "SL2300" (at 7.62 0 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "SL2300_1_1"
(polyline
(pts
(xy -1.016 0)
(xy -3.81 0)
)
(stroke (width 0) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -1.016 1.905)
(xy -1.016 -1.905)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -0.508 -1.27)
(xy -0.508 -2.286)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -0.508 0.508)
(xy -0.508 -0.508)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -0.508 2.286)
(xy -0.508 1.27)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 1.27 2.54)
(xy 1.27 1.778)
)
(stroke (width 0) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 1.27 -2.54)
(xy 1.27 0)
(xy -0.508 0)
)
(stroke (width 0) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -0.508 -1.778)
(xy 2.032 -1.778)
(xy 2.032 1.778)
(xy -0.508 1.778)
)
(stroke (width 0) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -0.254 0)
(xy 0.762 0.381)
(xy 0.762 -0.381)
(xy -0.254 0)
)
(stroke (width 0) (type solid))
(fill (type outline))
)
(polyline
(pts
(xy 1.524 0.508)
(xy 1.651 0.381)
(xy 2.413 0.381)
(xy 2.54 0.254)
)
(stroke (width 0) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 2.032 0.381)
(xy 1.651 -0.254)
(xy 2.413 -0.254)
(xy 2.032 0.381)
)
(stroke (width 0) (type solid))
(fill (type none))
)
(circle (center 0.381 0) (radius 2.794)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(circle (center 1.27 -1.778) (radius 0.254)
(stroke (width 0) (type solid))
(fill (type outline))
)
(circle (center 1.27 1.778) (radius 0.254)
(stroke (width 0) (type solid))
(fill (type outline))
)
(pin input line (at -6.35 0 0) (length 2.54)
(name "G" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 1.27 -5.08 90) (length 2.54)
(name "S" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 1.27 5.08 270) (length 2.54)
(name "D" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
)
)
(symbol "SR04M-2" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "H" (at 6.35 27.94 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "SR04M-2" (at 7.62 -21.59 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "SR04M-2_0_1"
(rectangle (start -22.86 26.67) (end 41.91 -20.32)
(stroke (width 0.254) (type solid))
(fill (type none))
)
)
)
(symbol "SR04M-2-HeaderConn_01x04_Female" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
(property "Reference" "J" (at 0 5.08 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "SR04M-2-HeaderConn_01x04_Female" (at 0 -7.62 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "ESP32:SR04M-2PinHeader_1x04_P2.54mm_Vertical" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "~" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_keywords" "connector" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_description" "Generic connector, single row, 01x04, script generated (kicad-library-utils/schlib/autogen/connector/)" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_fp_filters" "Connector*:*_1x??_*" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "SR04M-2-HeaderConn_01x04_Female_1_1"
(arc (start 0 -4.572) (mid -0.5058 -5.08) (end 0 -5.588)
(stroke (width 0.1524) (type solid))
(fill (type none))
)
(arc (start 0 -2.032) (mid -0.5058 -2.54) (end 0 -3.048)
(stroke (width 0.1524) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -1.27 -5.08)
(xy -0.508 -5.08)
)
(stroke (width 0.1524) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -1.27 -2.54)
(xy -0.508 -2.54)
)
(stroke (width 0.1524) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -1.27 0)
(xy -0.508 0)
)
(stroke (width 0.1524) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -1.27 2.54)
(xy -0.508 2.54)
)
(stroke (width 0.1524) (type solid))
(fill (type none))
)
(arc (start 0 0.508) (mid -0.5058 0) (end 0 -0.508)
(stroke (width 0.1524) (type solid))
(fill (type none))
)
(arc (start 0 3.048) (mid -0.5058 2.54) (end 0 2.032)
(stroke (width 0.1524) (type solid))
(fill (type none))
)
(pin power_in line (at -5.08 2.54 0) (length 3.81)
(name "VCC" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin input line (at -5.08 0 0) (length 3.81)
(name "RX" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin output line (at -5.08 -2.54 0) (length 3.81)
(name "TX" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at -5.08 -5.08 0) (length 3.81)
(name "GND" (effects (font (size 1.27 1.27))))
(number "4" (effects (font (size 1.27 1.27))))
)
)
)
)

View File

@@ -0,0 +1,74 @@
(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
(symbol "LP38690DT-3.3" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "U" (at -10.16 5.08 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Value" "LP38690DT-3.3" (at -10.16 -7.62 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Footprint" "DPAK457P991X255-3N" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "Datasheet" "IPC-7351B" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "Field4" "Texas Instruments" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "Field5" "M" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "Field6" "2.55mm" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "ki_locked" "" (at 0 0 0)
(effects (font (size 1.27 1.27)))
)
(symbol "LP38690DT-3.3_0_0"
(polyline
(pts
(xy -10.16 -5.08)
(xy 10.16 -5.08)
)
(stroke (width 0.1524) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -10.16 5.08)
(xy -10.16 -5.08)
)
(stroke (width 0.1524) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 10.16 -5.08)
(xy 10.16 5.08)
)
(stroke (width 0.1524) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 10.16 5.08)
(xy -10.16 5.08)
)
(stroke (width 0.1524) (type solid))
(fill (type none))
)
(pin output line (at 15.24 2.54 180) (length 5.08)
(name "OUT" (effects (font (size 1.016 1.016))))
(number "1" (effects (font (size 1.016 1.016))))
)
(pin input line (at -15.24 2.54 0) (length 5.08)
(name "IN" (effects (font (size 1.016 1.016))))
(number "3" (effects (font (size 1.016 1.016))))
)
(pin power_in line (at 15.24 -2.54 180) (length 5.08)
(name "GND" (effects (font (size 1.016 1.016))))
(number "4" (effects (font (size 1.016 1.016))))
)
)
)
)

View File

@@ -0,0 +1,37 @@
(footprint SOP65P640X120-14N (layer F.Cu) (tedit 65346025)
(descr "")
(attr smd)
(fp_text reference REF** (at -0.595 -3.435 0) (layer F.SilkS)
(effects (font (size 1.0 1.0) (thickness 0.15)))
)
(fp_text value SOP65P640X120-14N (at 7.025 3.435 0) (layer F.Fab)
(effects (font (size 1.0 1.0) (thickness 0.15)))
)
(pad 1 smd roundrect (roundrect_rratio 0.05) (at -2.87 -1.95) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 2 smd roundrect (roundrect_rratio 0.05) (at -2.87 -1.3) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 3 smd roundrect (roundrect_rratio 0.05) (at -2.87 -0.65) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 4 smd roundrect (roundrect_rratio 0.05) (at -2.87 0.0) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 5 smd roundrect (roundrect_rratio 0.05) (at -2.87 0.65) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 6 smd roundrect (roundrect_rratio 0.05) (at -2.87 1.3) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 7 smd roundrect (roundrect_rratio 0.05) (at -2.87 1.95) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 8 smd roundrect (roundrect_rratio 0.05) (at 2.87 1.95) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 9 smd roundrect (roundrect_rratio 0.05) (at 2.87 1.3) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 10 smd roundrect (roundrect_rratio 0.05) (at 2.87 0.65) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 11 smd roundrect (roundrect_rratio 0.05) (at 2.87 0.0) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 12 smd roundrect (roundrect_rratio 0.05) (at 2.87 -0.65) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 13 smd roundrect (roundrect_rratio 0.05) (at 2.87 -1.3) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 14 smd roundrect (roundrect_rratio 0.05) (at 2.87 -1.95) (size 1.57 0.41) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(fp_circle (center -4.24 -2.26) (end -4.14 -2.26) (layer F.SilkS) (width 0.2))
(fp_circle (center -4.24 -2.26) (end -4.14 -2.26) (layer F.Fab) (width 0.2))
(fp_line (start -2.2 -2.5) (end 2.2 -2.5) (layer F.Fab) (width 0.127))
(fp_line (start -2.2 2.5) (end 2.2 2.5) (layer F.Fab) (width 0.127))
(fp_line (start -2.2 -2.5) (end 2.2 -2.5) (layer F.SilkS) (width 0.127))
(fp_line (start -2.2 2.5) (end 2.2 2.5) (layer F.SilkS) (width 0.127))
(fp_line (start -2.2 -2.5) (end -2.2 2.5) (layer F.Fab) (width 0.127))
(fp_line (start 2.2 -2.5) (end 2.2 2.5) (layer F.Fab) (width 0.127))
(fp_line (start -3.905 -2.75) (end 3.905 -2.75) (layer F.CrtYd) (width 0.05))
(fp_line (start -3.905 2.75) (end 3.905 2.75) (layer F.CrtYd) (width 0.05))
(fp_line (start -3.905 -2.75) (end -3.905 2.75) (layer F.CrtYd) (width 0.05))
(fp_line (start 3.905 -2.75) (end 3.905 2.75) (layer F.CrtYd) (width 0.05))
)

View File

@@ -0,0 +1,29 @@
(footprint SSOP10 (layer F.Cu) (tedit 652971AF)
(descr "")
(attr smd)
(fp_text reference REF** (at -3.2004 0.0 900) (layer F.SilkS)
(effects (font (size 0.64 0.64) (thickness 0.15)))
)
(fp_text value SSOP10 (at 3.1496 -0.4064 900) (layer F.Fab)
(effects (font (size 0.64 0.64) (thickness 0.15)))
)
(pad 2 smd rect (at -1.0 2.8) (size 0.6 1.75) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 9 smd rect (at -1.0 -2.8) (size 0.6 1.75) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 1 smd rect (at -2.0 2.8) (size 0.6 1.75) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 3 smd rect (at 0.0 2.8) (size 0.6 1.75) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 4 smd rect (at 1.0 2.8) (size 0.6 1.75) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 10 smd rect (at -2.0 -2.8) (size 0.6 1.75) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 8 smd rect (at 0.0 -2.8) (size 0.6 1.75) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 7 smd rect (at 1.0 -2.8) (size 0.6 1.75) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 5 smd rect (at 2.0 2.8) (size 0.6 1.75) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 6 smd rect (at 2.0 -2.8) (size 0.6 1.75) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(fp_line (start 2.527 -1.9) (end 2.527 1.4) (layer F.Fab) (width 0.2032))
(fp_line (start 2.527 1.4) (end 2.527 1.9) (layer F.Fab) (width 0.2032))
(fp_line (start 2.527 1.9) (end -2.527 1.9) (layer F.Fab) (width 0.2032))
(fp_line (start -2.527 1.9) (end -2.527 1.4) (layer F.Fab) (width 0.2032))
(fp_line (start -2.527 1.4) (end -2.527 -1.9) (layer F.Fab) (width 0.2032))
(fp_line (start -2.527 -1.9) (end 2.527 -1.9) (layer F.Fab) (width 0.2032))
(fp_line (start 2.527 1.4) (end -2.527 1.4) (layer F.Fab) (width 0.2032))
(fp_line (start -1.905 1.016) (end -1.905 -1.016) (layer F.SilkS) (width 0.3048))
)

View File

@@ -0,0 +1,104 @@
(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
(symbol "SX1308" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "U" (at -17.78 20.32 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Value" "SX1308" (at -17.8054 17.8054 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Footprint" "SOT-23-6" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "Datasheet" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
)
(property "ki_locked" "" (at 0 0 0)
(effects (font (size 1.27 1.27)))
)
(symbol "SX1308_0_0"
(polyline
(pts
(xy -17.78 -7.62)
(xy -17.78 15.24)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -17.78 15.24)
(xy 0 15.24)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -13.7922 0.1778)
(xy -11.2522 0.1778)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -11.303 1.6764)
(xy -8.763 1.6764)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy -11.2522 0.1778)
(xy -11.303 1.6764)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 0 -7.62)
(xy -17.78 -7.62)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 0 15.24)
(xy 0 -7.62)
)
(stroke (width 0.254) (type solid))
(fill (type none))
)
(text "ON/OFF" (at -10.8712 -0.0508 0)
(effects (font (size 0.8128 0.8128)) (justify left bottom))
)
(pin bidirectional line (at 5.08 12.7 180) (length 5.08)
(name "SW" (effects (font (size 1.016 1.016))))
(number "1" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -22.86 -5.08 0) (length 5.08)
(name "GND" (effects (font (size 1.016 1.016))))
(number "2" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 5.08 -2.54 180) (length 5.08)
(name "FB" (effects (font (size 1.016 1.016))))
(number "3" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -22.86 2.54 0) (length 5.08)
(name "EN" (effects (font (size 1.016 1.016))))
(number "4" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -22.86 12.7 0) (length 5.08)
(name "IN" (effects (font (size 1.016 1.016))))
(number "5" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at 5.08 5.08 180) (length 5.08)
(name "N/C" (effects (font (size 1.016 1.016))))
(number "6" (effects (font (size 1.016 1.016))))
)
)
)
)

View File

@@ -0,0 +1,168 @@
(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
(symbol "ds2438az+" (pin_names (offset 0.254)) (in_bom yes) (on_board yes)
(property "Reference" "U" (at 30.48 10.16 0)
(effects (font (size 1.524 1.524)))
)
(property "Value" "ds2438az+" (at 30.48 7.62 0)
(effects (font (size 1.524 1.524)))
)
(property "Footprint" "21-0041B_8_MXM" (at 30.48 6.096 0)
(effects (font (size 1.524 1.524)) hide)
)
(property "Datasheet" "" (at 0 0 0)
(effects (font (size 1.524 1.524)))
)
(property "ki_locked" "" (at 0 0 0)
(effects (font (size 1.27 1.27)))
)
(property "ki_fp_filters" "21-0041B_8_MXM 21-0041B_8_MXM-M 21-0041B_8_MXM-L" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "ds2438az+_1_1"
(polyline
(pts
(xy 7.112 -7.62)
(xy 6.0452 -8.128)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 7.112 -7.62)
(xy 6.0452 -7.112)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 7.112 -5.08)
(xy 6.0452 -5.588)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 7.112 -5.08)
(xy 6.0452 -4.572)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 7.112 -2.54)
(xy 6.0452 -3.048)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 7.112 -2.54)
(xy 6.0452 -2.032)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 7.62 -12.7)
(xy 53.34 -12.7)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 7.62 5.08)
(xy 7.62 -12.7)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 53.34 -12.7)
(xy 53.34 5.08)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 53.34 5.08)
(xy 7.62 5.08)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 53.848 0)
(xy 54.9148 -0.508)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 53.848 0)
(xy 54.9148 0.508)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 55.4228 -0.508)
(xy 56.4642 0)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(polyline
(pts
(xy 55.4228 0.508)
(xy 56.4642 0)
)
(stroke (width 0.127) (type solid))
(fill (type none))
)
(pin power_in line (at 0 0 0) (length 7.62)
(name "GND" (effects (font (size 1.4986 1.4986))))
(number "1" (effects (font (size 1.4986 1.4986))))
)
(pin input line (at 0 -2.54 0) (length 7.62)
(name "VSENS+" (effects (font (size 1.4986 1.4986))))
(number "2" (effects (font (size 1.4986 1.4986))))
)
(pin input line (at 0 -5.08 0) (length 7.62)
(name "VSENS-" (effects (font (size 1.4986 1.4986))))
(number "3" (effects (font (size 1.4986 1.4986))))
)
(pin input line (at 0 -7.62 0) (length 7.62)
(name "VAD" (effects (font (size 1.4986 1.4986))))
(number "4" (effects (font (size 1.4986 1.4986))))
)
(pin power_in line (at 60.96 -7.62 180) (length 7.62)
(name "VDD" (effects (font (size 1.4986 1.4986))))
(number "5" (effects (font (size 1.4986 1.4986))))
)
(pin no_connect line (at 60.96 -5.08 180) (length 7.62)
(name "NC" (effects (font (size 1.4986 1.4986))))
(number "6" (effects (font (size 1.4986 1.4986))))
)
(pin no_connect line (at 60.96 -2.54 180) (length 7.62)
(name "NC" (effects (font (size 1.4986 1.4986))))
(number "7" (effects (font (size 1.4986 1.4986))))
)
(pin bidirectional line (at 60.96 0 180) (length 7.62)
(name "DQ" (effects (font (size 1.4986 1.4986))))
(number "8" (effects (font (size 1.4986 1.4986))))
)
)
)
)

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,11 @@
(sym_lib_table
(lib (name "LP38690DT-3.3")(type "Legacy")(uri "${KIPRJMOD}/kicad-stuff/LP38690DT-3.3.lib")(options "")(descr ""))
(lib (name "ESP32-DEVKITC-32D")(type "Legacy")(uri "${KIPRJMOD}/kicad-stuff/ESP32/ESP32-DEVKITC-32D.lib")(options "")(descr ""))
(lib (name "DW01")(type "Legacy")(uri "${KIPRJMOD}/kicad-stuff/DW01.lib")(options "")(descr ""))
(lib (name "SX1308")(type "Legacy")(uri "${KIPRJMOD}/kicad-stuff/SX1308.lib")(options "")(descr ""))
(lib (name "ds2438")(type "Legacy")(uri "${KIPRJMOD}/kicad-stuff/ds2438.lib")(options "")(descr ""))
(lib (name "PlantCtrlESP32-rescue")(type "Legacy")(uri "${KIPRJMOD}/PlantCtrlESP32-rescue.lib")(options "")(descr ""))
(version 7)
(lib (name "LP38690DT-3.3")(type "KiCad")(uri "${KIPRJMOD}/kicad-stuff/LP38690DT-3.3.kicad_sym")(options "")(descr ""))
(lib (name "ESP32-DEVKITC-32D")(type "KiCad")(uri "${KIPRJMOD}/kicad-stuff/ESP32/ESP32-DEVKITC-32D.kicad_sym")(options "")(descr ""))
(lib (name "DW01")(type "KiCad")(uri "${KIPRJMOD}/kicad-stuff/DW01.kicad_sym")(options "")(descr ""))
(lib (name "SX1308")(type "KiCad")(uri "${KIPRJMOD}/kicad-stuff/SX1308.kicad_sym")(options "")(descr ""))
(lib (name "ds2438")(type "KiCad")(uri "${KIPRJMOD}/kicad-stuff/ds2438.kicad_sym")(options "")(descr ""))
(lib (name "CN3306")(type "KiCad")(uri "${KIPRJMOD}/CN3306.kicad_sym")(options "")(descr ""))
(lib (name "CN3795")(type "KiCad")(uri "${KIPRJMOD}/CN3795.kicad_sym")(options "")(descr ""))
(lib (name "BQ34Z100PWR-G1")(type "KiCad")(uri "${KIPRJMOD}/kicad-stuff/BQ34Z100PWR-G1.kicad_sym")(options "")(descr ""))
)

View File

@@ -1,41 +1,16 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:esp32doit-devkit-v1]
platform = espressif32@6.3.2
platform = espressif32
board = esp32doit-devkit-v1
framework = arduino
build_flags = -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY
-DPLANT0_SENSORTYPE=FREQUENCY_MOD_RESISTANCE_PROBE
-DPLANT1_SENSORTYPE=FREQUENCY_MOD_RESISTANCE_PROBE
-DPLANT2_SENSORTYPE=FREQUENCY_MOD_RESISTANCE_PROBE
-DPLANT3_SENSORTYPE=FREQUENCY_MOD_RESISTANCE_PROBE
-DPLANT4_SENSORTYPE=FREQUENCY_MOD_RESISTANCE_PROBE
-DPLANT5_SENSORTYPE=FREQUENCY_MOD_RESISTANCE_PROBE
-DPLANT6_SENSORTYPE=FREQUENCY_MOD_RESISTANCE_PROBE
-DTIMED_LIGHT_PIN=CUSTOM1_PIN5
-DFLOWMETER_PIN=CUSTOM1_PIN1
-DANALOG_WATER=GPIO_NUM_34
board_build.partitions = defaultWithSmallerSpiffs.csv
;#https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html
; the latest development brankitchen-lightch (convention V3.0.x)
lib_deps = bblanchon/ArduinoJson@^6.20.1
paulstoffregen/OneWire@^2.3.6
milesburton/DallasTemperature@^3.11.0
pololu/VL53L0X@^1.3.1
lib_deps = ArduinoJson@6.16.1
OneWire
DallasTemperature
pololu/VL53L0X
https://github.com/homieiot/homie-esp8266.git#develop
[platformio]
extra_configs = custom_platformio.ini
; add additional parameter, like the upload port
upload_port=/dev/ttyUSB1

View File

@@ -17,8 +17,6 @@ if [ ! -f $firmwareFile ]; then
echo "the script $0 must be started in host/ sub directory"
exit 2
fi
echo "Firmware changed:"
ls -l $firmwareFile
mosquitto_pub -h $mqttHost -t "${mqttPrefix}${homieId}/stay/alive/set" -m "1" -r
echo "Waiting ..."

View File

@@ -54,15 +54,6 @@
#define SENSOR_PLANT5 GPIO_NUM_39 /**< SENSOR_VIN */
#define SENSOR_PLANT6 GPIO_NUM_36 /**< SENSOR_VP */
#ifdef HWREVISION07
#define OUTPUT_PUMP0 GPIO_NUM_17 /**< GPIO 17 */
#define OUTPUT_PUMP1 GPIO_NUM_5 /**< GPIO 5 */
#define OUTPUT_PUMP2 GPIO_NUM_18 /**< GPIO 18 */
#define OUTPUT_PUMP3 GPIO_NUM_19 /**< GPIO 19 */
#define OUTPUT_PUMP4 GPIO_NUM_21 /**< GPIO 21 */
#define OUTPUT_PUMP5 GPIO_NUM_22 /**< GPIO 22 */
#define OUTPUT_PUMP6 GPIO_NUM_23 /**< GPIO 23 */
#else
#define OUTPUT_PUMP0 GPIO_NUM_15 /**< GPIO 15 */
#define OUTPUT_PUMP1 GPIO_NUM_5 /**< GPIO 5 */
#define OUTPUT_PUMP2 GPIO_NUM_18 /**< GPIO 18 */
@@ -70,35 +61,18 @@
#define OUTPUT_PUMP4 GPIO_NUM_21 /**< GPIO 21 */
#define OUTPUT_PUMP5 GPIO_NUM_22 /**< GPIO 22 */
#define OUTPUT_PUMP6 GPIO_NUM_23 /**< GPIO 23 */
#endif
#define OUTPUT_ENABLE_PUMP GPIO_NUM_13 /**< GPIO 13 - Enable Pumps */
#ifdef HWREVISION07
#define OUTPUT_ENABLE_SENSOR GPIO_NUM_16 /**< GPIO 16 - Enable Sensors */
#define SENSOR_ONEWIRE GPIO_NUM_2 /** GPIO 02 - Temperatur sensor, Battery and other cool onewire stuff */
#else
#define OUTPUT_ENABLE_SENSOR GPIO_NUM_14 /**< GPIO 14 - Enable Sensors */
#define SENSOR_ONEWIRE GPIO_NUM_4 /**< GPIO 12 - Temperatur sensor, Battery and other cool onewire stuff */
#endif
#ifdef ANALOG_WATER
#define SENSOR_TANK_ANALOG ANALOG_WATER /**< GPIO 34 - analog water sensor (GPIO_NUM_34) */
#else
#ifdef HWREVISION07
#define OUTPUT_ENABLE_PUMP GPIO_NUM_13 /**< GPIO 13 - Enable Pumps */
#else
#define SENSOR_ONEWIRE GPIO_NUM_4 /**< GPIO 12 - Temperatur sensor, Battery and other cool onewire stuff */
#define SENSOR_TANK_SDA GPIO_NUM_17 /**< GPIO 17 - water sensor SDA */
#define SENSOR_TANK_SCL GPIO_NUM_16 /**< GPIO 16 - water sensor SCL */
#endif
#endif
#define BUTTON GPIO_NUM_0 /**< GPIO 0 - Fix button of NodeMCU */
#define CUSTOM1_PIN1 GPIO_NUM_34 /** direct gpio */
#define CUSTOM1_PIN3 GPIO_NUM_35 /** direct gpio */
#ifdef HWREVISION07
#define CUSTOM1_PIN5 GPIO_NUM_4 /** mosfet controlled */
#else
#define CUSTOM1_PIN5 GPIO_NUM_2 /** mosfet controlled */
#endif
#define CUSTOM1_PIN7 GPIO_NUM_12 /** mosfet controlled */
/* @} */
@@ -111,29 +85,18 @@
#define FLOWMETER_PULSES_PER_ML 2.2
#define FIRMWARE_FEATURE1 "Flow"
#else
#ifdef ANALOG_WATER
#define FIRMWARE_FEATURE1 "Water"
#else
#define FIRMWARE_FEATURE1 ""
#endif
#endif
#ifdef TIMED_LIGHT_PIN
#define FIRMWARE_FEATURE2 "Light"
#else
#define FIRMWARE_FEATURE2 ""
#define FIRMWARE_FEATURE2 ""
#endif
#define FIRMWARE_BASENAME "PlantControl"
#define FIRMWARE_NAME FIRMWARE_BASENAME FIRMWARE_FEATURE1 FIRMWARE_FEATURE2
#define FIRMWARE_VERSIONNMUMBER "3.021"
#ifdef HWREVISION07
#define FIRMWARE_VERSION FIRMWARE_VERSIONNMUMBER " HW0.7"
#else
#define FIRMWARE_VERSION FIRMWARE_VERSIONNMUMBER " HW0.10b"
#endif
#define FIRMWARE_VERSION "3.01 HW0.10b"
#define MOIST_SENSOR_MAX_FRQ 5200 // 60kHz (500Hz margin)
#define MOIST_SENSOR_MIN_FRQ 500 // 0.5kHz (500Hz margin)
@@ -141,36 +104,28 @@
#define ANALOG_SENSOR_MAX_MV 1300 //successive approximation of good range
#define ANALOG_SENSOR_MIN_MV 100 //successive approximation of good range
#ifdef HWREVISION07
#define SOLAR_VOLT_FACTOR (4.0306f) /**< 100k and 33k voltage dividor */
#else
#define SOLAR_VOLT_FACTOR (11.0f) /**< Configuratiion before dd3888ba52f51338788820a933c0a6f4bee78ed5 */
#endif
#define SOLAR_VOLT_FACTOR 11
#define BATTSENSOR_INDEX_SOLAR 0
#define BATTSENSOR_INDEX_BATTERY 1
#define MQTT_TIMEOUT (1000 * 60) /**< After 10 seconds, MQTT is expected to be connected */
#define ESP_STALE_TIMEOUT (MQTT_TIMEOUT+(700*1000))
#define ESP_ADC_MAX 4095
#define MAX_PLANTS 7
#define SOLAR_CHARGE_MIN_VOLTAGE 7 /**< Sun is rising (morning detected) */
#define SOLAR_CHARGE_MAX_VOLTAGE 9 /**< Sun is shining (noon) */
#define SOLAR_MAX_VOLTAGE_POSSIBLE 100 /**< higher values are treated as not connected sensor */
#define VOLT_MAX_BATT 4.2f
#define VOLT_SENSORS_BATT 3.6f /**< Minimum battery voltage for sensor (and pump) usage */
#define VOLT_MIN_BATT 3.4f /**< Minimum battery voltage for normal operation */
#define LOWVOLT_SLEEP_FACTOR 6 /**< Factor for nightsleep delay, if the battery drops below minimum (@see VOLT_MIN_BATT) */
#define LOWVOLT_SLEEP_MINIMUM 7200 /**< At low voltage sleep at least for 120 minutes (two hours) */
#define WATER_LEVEL_MINIMUM 500 /**< Minimum Analog value (1023 is the maximum)*/
#define VOLT_MIN_BATT 3.0f /**< Minimum battery voltage for normal operation */
#define LOWVOLT_SLEEP_FACTOR 3 /**< Factor for nightsleep delay, if the battery drops below minimum (@see VOLT_MIN_BATT) */
#define LOWVOLT_SLEEP_MINIMUM 1800 /**< At low voltage sleep at least for 30 minutes */
#define MAX_CONFIG_SETTING_ITEMS 100 /**< Parameter, that can be configured in Homie */
#define MAX_JSON_CONFIG_FILE_SIZE_CUSTOM 2500
#define TEMPERATUR_TIMEOUT 5000 /**< 5 Seconds timeout for the temperatures sensors */
#define WATERSENSOR_TIMEOUT 1000 /**< 1 Seconds timeout for the water distance sensor */
#define WATERSENSOR_CYCLE 10 /**< 10 sensor measurement are performed */
#define TEMPERATUR_TIMEOUT 3000 /**< 3 Seconds timeout for the temperatures sensors */
#define WATERSENSOR_TIMEOUT 3000 /**< 3 Seconds timeout for the water distance sensor */
#define WATERSENSOR_CYCLE 10 /**< 5 sensor measurement are performed */
#define DS18B20_RESOLUTION 9 /**< 9bit temperature resolution -> 0.5°C steps */
#define UTC_OFFSET_DE 3600 /* UTC offset in seconds for Germany */

View File

@@ -75,6 +75,9 @@ HomieNode stayAlive("stay", "alive", "alive"); /**< Necessary for Mqtt Active C
HomieSetting<long> deepSleepTime("sleep", "time in seconds to sleep");
HomieSetting<long> deepSleepNightTime("nightsleep", "time in seconds to sleep (0 uses same setting: deepsleep at night, too)");
HomieSetting<long> pumpIneffectiveWarning("pumpConsecutiveWarn", "if the pump was triggered this amount directly after each cooldown, without resolving dryness, warn");
HomieSetting<long> waterLevelMax("tankmax", "distance (mm) at maximum water level");
HomieSetting<long> waterLevelMin("tankmin", "distance (mm) at minimum water level (pumps still covered)");
HomieSetting<long> waterLevelWarn("tankwarn", "warn (mm) if below this water level %");
HomieSetting<long> waterLevelVol("tankVolume", "(ml) between minimum and maximum");
HomieSetting<const char *> lipoSensorAddr("lipoDSAddr", "1wire address for lipo temperature sensor");
HomieSetting<const char *> waterSensorAddr("tankDSAddr", "1wire address for water temperature sensor");

View File

@@ -25,8 +25,7 @@
#define LOG_SENSORMODE_UNKNOWN "Unknown sensor mode requested"
#define LOG_SENSORMODE_UNKNOWN_CODE -5
#define LOG_SENSOR_MISSING_ERROR_MESSAGE "1Wire: sensors found"
#define LOG_SENSOR_MISSING_ERROR_CODE -6
#define LOG_SENSOR_MISSING -6
#define LOG_PUMP_AND_DOWNLOADMODE "Download mode, ignoring pump request"
#define LOG_PUMP_AND_DOWNLOADMODE_CODE 2
@@ -47,10 +46,5 @@
#define LOG_SLEEP_CYCLE 102
#define LOG_MISSING_PUMP -4
#define LOG_BOOT_ERROR_DETECTION 10000
#define LOG_BOOT_ERROR_IMG_UNDEFINED (LOG_BOOT_ERROR_DETECTION + 1)
#define LOG_BOOT_ERROR_IMG_NEW (LOG_BOOT_ERROR_DETECTION + 2)
#define LOG_BOOT_ERROR_IMG_INVALID (LOG_BOOT_ERROR_DETECTION + 3)
#define LOG_BOOT_ERROR_IMG_VALID (LOG_BOOT_ERROR_DETECTION + 4)
#define LOG_BOOT_ERROR_IMG_PENDING_VERIFY (LOG_BOOT_ERROR_DETECTION + 5)
#define LOG_SOLAR_CHARGER_MISSING 300
#endif

View File

@@ -22,9 +22,6 @@ build_flags = -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY
-DPLANT6_SENSORTYPE=FREQUENCY_MOD_RESISTANCE_PROBE
-DTIMED_LIGHT_PIN=CUSTOM1_PIN5
-DFLOWMETER_PIN=CUSTOM1_PIN1
-DANALOG_WATER=GPIO_NUM_34
; Optional: Compatibilitymode for hardware revision 0.7
;-DHWREVISION07=1
board_build.partitions = defaultWithSmallerSpiffs.csv

View File

@@ -54,10 +54,8 @@ void Plant::init(void)
{ return ((candidate >= 0) && (candidate <= 100)); });
/* Initialize Hardware */
pinMode(this->mPinPump, OUTPUT);
digitalWrite(this->mPinPump, LOW);
ledcSetup(this->mPlantId, PWM_FREQ, PWM_BITS);
ledcAttachPin(this->mPinPump, this->mPlantId);
ledcAttachPin(mPinPump, this->mPlantId);
ledcWrite(this->mPlantId, 0);
pinMode(this->mPinSensor, INPUT);
}

View File

@@ -51,10 +51,7 @@ extern "C" bool verifyRollbackLater(){
* DEFINES
******************************************************************************/
#define AMOUNT_SENOR_QUERYS 8
#ifdef ANALOG_WATER
#else
#define MAX_TANK_DEPTH 5000
#endif
#define REBOOT_LOOP_DETECTION_ERROR 5
/******************************************************************************
@@ -80,9 +77,9 @@ RTC_DATA_ATTR long consecutiveWateringPlant[MAX_PLANTS] = {0};
/******************************************************************************
* LOCAL VARIABLES
******************************************************************************/
bool volatile vmDownloadMode = false; /**< Controller must not sleep */
bool volatile vmSensorsRead = false; /**< Sensors are read without Wifi or MQTT */
int volatile vmPumpToRun = -1; /** pump to run at the end of the cycle */
bool volatile mDownloadMode = false; /**< Controller must not sleep */
bool volatile mSensorsRead = false; /**< Sensors are read without Wifi or MQTT */
int volatile pumpToRun = -1; /** pump to run at the end of the cycle */
int volatile selfTestPumpRun = -1; /** pump to run at the end of the cycle */
bool mConfigured = false;
@@ -151,23 +148,23 @@ void finsihedCycleSucessfully()
esp_ota_img_states_t ota_state;
if (esp_ota_get_state_partition(running, &ota_state) == ESP_OK)
{
log(LOG_LEVEL_DEBUG, "Get State Partition was Successfull", LOG_BOOT_ERROR_DETECTION);
log(LOG_LEVEL_INFO, "Get State Partition was Successfull", LOG_BOOT_ERROR_DETECTION);
if(ota_state == ESP_OTA_IMG_UNDEFINED){
log(LOG_LEVEL_DEBUG, "ESP_OTA_IMG_UNDEFINED should not happen with rollback", LOG_BOOT_ERROR_IMG_UNDEFINED);
log(LOG_LEVEL_INFO, "ESP_OTA_IMG_UNDEFINED should not happen with rollback", LOG_BOOT_ERROR_DETECTION);
}
if(ota_state == ESP_OTA_IMG_NEW){
log(LOG_LEVEL_DEBUG, "ESP_OTA_IMG_NEW", LOG_BOOT_ERROR_IMG_NEW);
log(LOG_LEVEL_INFO, "ESP_OTA_IMG_NEW", LOG_BOOT_ERROR_DETECTION);
}
if(ota_state == ESP_OTA_IMG_INVALID){
log(LOG_LEVEL_DEBUG, "ESP_OTA_IMG_INVALID", LOG_BOOT_ERROR_IMG_INVALID);
log(LOG_LEVEL_INFO, "ESP_OTA_IMG_INVALID", LOG_BOOT_ERROR_DETECTION);
}
if(ota_state == ESP_OTA_IMG_VALID){
log(LOG_LEVEL_DEBUG, "ESP_OTA_IMG_VALID", LOG_BOOT_ERROR_IMG_VALID);
log(LOG_LEVEL_INFO, "ESP_OTA_IMG_VALID", LOG_BOOT_ERROR_DETECTION);
}
if (ota_state == ESP_OTA_IMG_PENDING_VERIFY)
{
log(LOG_LEVEL_DEBUG, "ESP_OTA_IMG_PENDING_VERIFY Diagnostics completed successfully! Marking as valid", LOG_BOOT_ERROR_IMG_PENDING_VERIFY);
log(LOG_LEVEL_INFO, "ESP_OTA_IMG_PENDING_VERIFY Diagnostics completed successfully! Marking as valid", LOG_BOOT_ERROR_DETECTION);
esp_ota_mark_app_valid_cancel_rollback();
}
}
@@ -175,11 +172,11 @@ void finsihedCycleSucessfully()
void espDeepSleep(bool afterPump = false)
{
/* download mode or normal operation should restore device status*/
finsihedCycleSucessfully();
if (vmDownloadMode)
if (mDownloadMode)
{
log(LOG_LEVEL_DEBUG, "abort deepsleep, DownloadMode active", LOG_DEBUG_CODE);
// if we manage to get to the download mode, the device can be restored
finsihedCycleSucessfully();
return;
}
if (aliveWasRead())
@@ -204,7 +201,7 @@ void espDeepSleep(bool afterPump = false)
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
unsigned long secondsToSleep = -1;
long secondsToSleep = -1;
if (afterPump)
{
@@ -213,8 +210,9 @@ void espDeepSleep(bool afterPump = false)
}
else
{
if ( ((int) (mBatteryVoltage * 100)) < ((int) (VOLT_MIN_BATT * 100)) )
if (mBatteryVoltage < VOLT_MIN_BATT)
{
log(LOG_LEVEL_INFO, String(String(mBatteryVoltage) + "V! Almost empty -> deepSleepNight " + String(LOWVOLT_SLEEP_FACTOR)) + " times", LOG_SLEEP_LOWVOLTAGE);
/* use the largest sleeping duration */
if (deepSleepNightTime.get() > deepSleepTime.get()) {
secondsToSleep = (deepSleepNightTime.get() * LOWVOLT_SLEEP_FACTOR);
@@ -225,7 +223,6 @@ void espDeepSleep(bool afterPump = false)
if (secondsToSleep < LOWVOLT_SLEEP_MINIMUM) {
secondsToSleep = LOWVOLT_SLEEP_MINIMUM;
}
log(LOG_LEVEL_INFO, String(String(mBatteryVoltage) + "V! Almost empty -> deepSleepNight " + String(LOWVOLT_SLEEP_FACTOR)) + " times (" + secondsToSleep + "s)", LOG_SLEEP_LOWVOLTAGE);
}
else if (mSolarVoltage < SOLAR_CHARGE_MIN_VOLTAGE)
{
@@ -239,14 +236,12 @@ void espDeepSleep(bool afterPump = false)
}
}
#define SECOND2USECOND_FACTOR (1000U * 1000U)
finsihedCycleSucessfully();
/* sleep always at least one second */
if (secondsToSleep <= 0) {
secondsToSleep = (unsigned long) (UINT64_MAX / SECOND2USECOND_FACTOR);
if (secondsToSleep < 0) {
secondsToSleep = 1;
}
esp_sleep_enable_timer_wakeup((secondsToSleep * SECOND2USECOND_FACTOR));
#undef SECOND2USECOND_FACTOR
esp_sleep_enable_timer_wakeup((secondsToSleep * 1000U * 1000U));
if (aliveWasRead())
{
delay(1000);
@@ -359,35 +354,68 @@ void readPowerSwitchedSensors()
Plant plant = mPlants[i];
switch (plant.getSensorMode())
{
case FREQUENCY_MOD_RESISTANCE_PROBE:
case FREQUENCY_MOD_RESISTANCE_PROBE: {
Serial << "Plant " << i << " measurement: " << mPlants[i].getCurrentMoistureRaw() << " hz " << mPlants[i].getCurrentMoisturePCT() << "%" << endl;
break;
case ANALOG_RESISTANCE_PROBE :
}
case ANALOG_RESISTANCE_PROBE : {
Serial << "Plant " << i << " measurement: " << mPlants[i].getCurrentMoistureRaw() << " mV " << mPlants[i].getCurrentMoisturePCT() << "%" << endl;
break;
default:
case NONE:
break;
}
case NONE : {
}
}
}
#ifdef ANALOG_WATER
Serial << "Analog water measurement " << WATERSENSOR_CYCLE << " cycles.." << endl;
Serial.flush();
/* Read analog Water sensor*/
for(int i=0; i < WATERSENSOR_CYCLE; i++)
Wire.begin(SENSOR_TANK_SDA, SENSOR_TANK_SCL);
// Source: https://www.st.com/resource/en/datasheet/vl53l0x.pdf
tankSensor.setAddress(0x52);
tankSensor.setBus(&Wire);
delay(50);
Serial << "Distance sensor init" << endl;
long start = millis();
bool distanceReady = false;
while ((start + WATERSENSOR_TIMEOUT) > millis())
{
int value = analogRead(SENSOR_TANK_ANALOG);
Serial << "Round " << i << " measurement: " << value << " mV " << endl;
waterRawSensor.add(value);
delay(7);
if (tankSensor.init())
{
distanceReady = true;
break;
}
else
{
delay(200);
}
}
if (distanceReady)
{
waterRawSensor.clear();
tankSensor.setSignalRateLimit(0.1);
// increase laser pulse periods (defaults are 14 and 10 PCLKs)
tankSensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
tankSensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
tankSensor.setMeasurementTimingBudget(200000);
Serial << "Distance sensor measuring" << endl;
for (int readCnt = 0; readCnt < WATERSENSOR_CYCLE; readCnt++)
{
if (!tankSensor.timeoutOccurred())
{
uint16_t distance = tankSensor.readRangeSingleMillimeters();
if (distance < MAX_TANK_DEPTH)
{
waterRawSensor.add(distance);
}
}
delay(50);
}
Serial << "Distance sensor " << waterRawSensor.getMedian() << " mm" << endl;
}
else
{
log(LOG_LEVEL_WARN, LOG_TANKSENSOR_FAIL_DETECT, LOG_TANKSENSOR_FAIL_DETECT_CODE);
}
Serial << "Analog water measurement done" << endl;
#else
Serial << "Analog water measurement deactivated" << endl;
#endif
Serial.flush();
/* deactivate the sensors */
digitalWrite(OUTPUT_ENABLE_SENSOR, LOW);
@@ -403,12 +431,12 @@ void onHomieEvent(const HomieEvent &event)
case HomieEventType::SENDING_STATISTICS:
break;
case HomieEventType::MQTT_READY:
if (vmSensorsRead)
if (mSensorsRead)
{
Serial.printf("Timeout occured... too late!\r\n");
return;
}
vmSensorsRead = true; // MQTT is working, deactivate timeout logic
mSensorsRead = true; // MQTT is working, deactivate timeout logic
configTime(UTC_OFFSET_DE, UTF_OFFSET_DE_DST, ntpServer.get());
startMQTTRoundtripTest();
@@ -419,7 +447,7 @@ void onHomieEvent(const HomieEvent &event)
mPlants[i].deactivatePump();
}
otaRunning = true;
vmDownloadMode = true;
mDownloadMode = true;
break;
case HomieEventType::OTA_SUCCESSFUL:
digitalWrite(OUTPUT_ENABLE_SENSOR, LOW);
@@ -436,21 +464,12 @@ int determineNextPump(bool isLowLight)
int pumpToUse = -1;
for (int i = 0; i < MAX_PLANTS; i++)
{
Plant plant = mPlants[i];
switch (plant.getSensorMode())
{
case FREQUENCY_MOD_RESISTANCE_PROBE:
log(LOG_LEVEL_DEBUG,
String("Plant " + String(i) + " measurement: " + String(plant.getCurrentMoistureRaw()) + " hz " + String(plant.getCurrentMoisturePCT()) + "%"),
LOG_DEBUG_CODE);
break;
}
bool wateralarm = consecutiveWateringPlant[i] >= pumpIneffectiveWarning.get();
if (wateralarm)
{
log(LOG_LEVEL_ERROR, String(String(i) + " Plant still dry after " + String(consecutiveWateringPlant[i]) + " watering attempts"), LOG_PUMP_INEFFECTIVE);
}
Plant plant = mPlants[i];
if (!plant.isPumpTriggerActive())
{
plant.publishState(PLANTSTATE_NUM_DEACTIVATED, PLANTSTATE_STR_DEACTIVATED);
@@ -511,7 +530,7 @@ int determineNextPump(bool isLowLight)
}
else
{
if (vmDownloadMode)
if (mDownloadMode)
{
plant.publishState(PLANTSTATE_NUM_ACTIVE_SUPESSED, PLANTSTATE_STR_ACTIVE_SUPESSED);
}
@@ -571,15 +590,15 @@ bool aliveHandler(const HomieRange &range, const String &value)
if (value.equals("ON") || value.equals("On") || value.equals("1"))
{
vmDownloadMode = true;
mDownloadMode = true;
}
else
{
if (vmDownloadMode)
if (mDownloadMode)
{
esp_restart();
}
vmDownloadMode = false;
mDownloadMode = false;
}
return true;
@@ -656,11 +675,11 @@ void initPumpLogic()
pcnt_counter_resume(unit);
#endif
pumpStartTime = millis();
pumpTarget = millis() + (mPlants[vmPumpToRun].getPumpDuration() * 1000);
pumpTarget = millis() + (mPlants[pumpToRun].getPumpDuration() * 1000);
#ifdef FLOWMETER_PIN
log(LOG_LEVEL_INFO, "Starting pump " + String(pumpToRun) + " for " + String(mPlants[pumpToRun].getPumpDuration()) + "s or " + String(pumpTargetMl) + "ml", LOG_PUMP_STARTED_CODE);
#else
log(LOG_LEVEL_INFO, "Starting pump " + String(vmPumpToRun) + " for " + String(mPlants[vmPumpToRun].getPumpDuration()) + "s", LOG_PUMP_STARTED_CODE);
log(LOG_LEVEL_INFO, "Starting pump " + String(pumpToRun) + " for " + String(mPlants[pumpToRun].getPumpDuration()) + "s", LOG_PUMP_STARTED_CODE);
#endif
@@ -670,7 +689,7 @@ void initPumpLogic()
delay(100);
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 1);
mPlants[vmPumpToRun].activatePump();
mPlants[pumpToRun].activatePump();
}
void pumpActiveLoop()
@@ -681,7 +700,7 @@ void pumpActiveLoop()
{
initPumpLogic();
pumpStarted = true;
rtcLastWateringPlant[vmPumpToRun] = getCurrentTime();
rtcLastWateringPlant[pumpToRun] = getCurrentTime();
}
bool mqttUpdateTick = false;
@@ -723,12 +742,12 @@ void pumpActiveLoop()
if (millis() > pumpTarget)
{
mPlants[vmPumpToRun].setProperty("watertime").send(String(duration));
mPlants[pumpToRun].setProperty("watertime").send(String(duration));
targetReached = true;
}
else if (mqttUpdateTick)
{
mPlants[vmPumpToRun].setProperty("watertime").send(String(duration));
mPlants[pumpToRun].setProperty("watertime").send(String(duration));
}
if (targetReached)
@@ -736,11 +755,11 @@ void pumpActiveLoop()
// disable all
digitalWrite(OUTPUT_ENABLE_PUMP, LOW);
mPlants[vmPumpToRun].deactivatePump();
mPlants[pumpToRun].deactivatePump();
// disable loop, to prevent multi processing
pumpStarted = false;
// if runtime is larger than cooldown, else it would run continously
rtcLastWateringPlant[vmPumpToRun] = getCurrentTime();
rtcLastWateringPlant[pumpToRun] = getCurrentTime();
espDeepSleep(true);
}
}
@@ -772,11 +791,6 @@ void safeSetup()
digitalWrite(OUTPUT_ENABLE_PUMP, LOW);
pinMode(OUTPUT_ENABLE_SENSOR, OUTPUT);
digitalWrite(OUTPUT_ENABLE_SENSOR, LOW);
#ifdef ANALOG_WATER
pinMode(SENSOR_TANK_ANALOG, INPUT);
#endif
static_assert(HomieInternals::MAX_CONFIG_SETTING_SIZE >= MAX_CONFIG_SETTING_ITEMS, "Limits.hpp not adjusted MAX_CONFIG_SETTING_ITEMS");
if (HomieInternals::MAX_CONFIG_SETTING_SIZE < MAX_CONFIG_SETTING_ITEMS)
@@ -805,6 +819,9 @@ void safeSetup()
deepSleepNightTime.setDefaultValue(600);
ntpServer.setDefaultValue("pool.ntp.org");
/* waterLevelMax 1000 */ /* 100cm in mm */
waterLevelMin.setDefaultValue(50); /* 5cm in mm */
waterLevelWarn.setDefaultValue(500); /* 50cm in mm */
waterLevelVol.setDefaultValue(5000); /* 5l in ml */
lipoSensorAddr.setDefaultValue("");
waterSensorAddr.setDefaultValue("");
@@ -831,39 +848,24 @@ void safeSetup()
{
mPlants[i].initSensors();
}
readPowerSwitchedSensors();
Serial << "Reading Homie Config..." << endl;
Homie.setup();
/************************* Start One-Wire bus ***************/
int tempInitStartTime = millis();
uint8_t sensorCount = 0U;
/* Required to read the temperature at least once */
for(int i=0;
((sensorCount == 0 || !battery.isFound()) && millis() < tempInitStartTime + TEMPERATUR_TIMEOUT);
i++)
while ((sensorCount == 0 || !battery.isFound()) && millis() < tempInitStartTime + TEMPERATUR_TIMEOUT)
{
sensors.begin();
battery.begin();
sensorCount = sensors.getDS18Count();
if (i > 1)
{
Serial << "DS18S20 count: " << sensorCount << ", battery is found: " << battery.isFound() << " ( loop: " << i << " )" << endl;
}
delay(100);
delay(50);
}
readOneWireSensors();
mBatteryVoltage = battery.getVoltage(BATTSENSOR_INDEX_BATTERY);
if ( ((int) (mBatteryVoltage * 100)) >= ((int) (VOLT_SENSORS_BATT * 100)) )
{
/* read all sensors with additional power source */
readPowerSwitchedSensors();
}
/* Start Homie and Wifi */
Serial << "Reading Homie Config..." << endl;
Homie.setup();
Serial << "DS18S20 count: " << sensorCount << " found in " << (millis() - tempInitStartTime) << " ms" << endl;
Serial.flush();
/* Measure temperature TODO idea: move this into setup */
@@ -872,23 +874,6 @@ void safeSetup()
sensors.setResolution(DS18B20_RESOLUTION);
sensors.requestTemperatures();
}
else
{
Serial << "NO SENSOR FOUND! " << endl;
Serial << " N N OOO SSSS EEEEE N N SSSS OOO RRRR FFFFF OOO U U N N DDDD !" << endl;
Serial << " NN N O O S E NN N S O O R R F O O U U NN N D D !" << endl;
Serial << " N N N O O SSS EEEE N N N SSS O O RRRR FFFF O O U U N N N D D !" << endl;
Serial << " N NN O O S E N NN S O O R R F O O U U N NN D D !" << endl;
Serial << " N N OOO SSSS EEEEE N N SSSS OOO R R F OOO UUU N N DDDD !" << endl;
Serial << "" << endl;
Serial << "" << endl;
Serial << FIRMWARE_NAME << " " FIRMWARE_VERSIONNMUMBER << endl;
Serial << "" << endl;
Serial << "Is expected to run on the following board:" << endl;
Serial << FIRMWARE_VERSION << endl;
Serial.flush();
}
mConfigured = Homie.isConfigured();
if (mConfigured)
@@ -962,7 +947,7 @@ void safeSetup()
delay(100);
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 1);
Serial.println("Initial Setup. Start Accesspoint...");
vmDownloadMode = true;
mDownloadMode = true;
}
stayAlive.advertise("alive").setName("Alive").setDatatype(NUMBER_TYPE).settable(aliveHandler);
setupFinishedTimestamp = millis();
@@ -998,7 +983,7 @@ void selfTest()
if (selfTestPumpRun >= 0 && selfTestPumpRun < MAX_PLANTS)
{
Serial << "self test mode pump deactivate " << vmPumpToRun << endl;
Serial << "self test mode pump deactivate " << pumpToRun << endl;
Serial.flush();
mPlants[selfTestPumpRun].deactivatePump();
}
@@ -1030,7 +1015,7 @@ void loop()
{
Homie.loop();
/* Toggel Senor LED to visualize mode 3 */
if (vmDownloadMode)
if (mDownloadMode)
{
if (nextBlink < millis())
{
@@ -1055,9 +1040,9 @@ void loop()
else
{
unsigned long timeSinceSetup = millis() - setupFinishedTimestamp;
if ((timeSinceSetup > MQTT_TIMEOUT) && (!vmSensorsRead))
if ((timeSinceSetup > MQTT_TIMEOUT) && (!mSensorsRead))
{
vmSensorsRead = true;
mSensorsRead = true;
/* Disable Wifi and put modem into sleep mode */
WiFi.mode(WIFI_OFF);
Serial << "Wifi mode set to " << WIFI_OFF << " mqqt was no reached within " << timeSinceSetup << "ms , fallback to offline mode " << endl;
@@ -1067,14 +1052,14 @@ void loop()
}
/** Timeout always stopping the ESP -> no endless power consumption */
if (millis() > ESP_STALE_TIMEOUT && !vmDownloadMode)
if (millis() > ESP_STALE_TIMEOUT && !mDownloadMode)
{
Serial << (millis() / 1000) << "not terminated watchdog reset" << endl;
Serial.flush();
esp_restart();
}
if (vmPumpToRun != -1)
if (pumpToRun != -1)
{
pumpActiveLoop();
}
@@ -1097,8 +1082,9 @@ void plantcontrol()
readOneWireSensors();
Serial << "W : " << waterRawSensor.getAverage() << " mm " << endl;
Serial << "W : " << waterRawSensor.getAverage() << " mm (" << String(waterLevelMax.get() - waterRawSensor.getAverage()) << " mm left)" << endl;
mBatteryVoltage = battery.getVoltage(BATTSENSOR_INDEX_BATTERY);
float chipTemp = battery.getTemperature();
Serial << "Chip Temperatur " << chipTemp << " °C " << endl;
@@ -1107,58 +1093,34 @@ void plantcontrol()
/* Publish water values, if available */
if (waterRawSensor.getCount() > 0)
{
if (!isnan(waterRawSensor.getAverage()))
float remaining = (waterLevelMax.get() - waterRawSensor.getAverage());
float actualDifference = waterLevelMax.get() - waterLevelMin.get();
float ratio = remaining/actualDifference;
sensorWater.setProperty("useable").send(String(actualDifference));
if (!isnan(remaining))
{
/* measuring the distance from top -> smaller value means more water: */
long averageWater = waterRawSensor.getAverage();
if (averageWater < ESP_ADC_MAX) {
long percentage = (averageWater * averageWater);
percentage = percentage / 570000;
/* Add offset */
if (percentage > 0)
{
percentage += 4;
}
sensorWater.setProperty("remaining").send(String(percentage));
} else {
sensorWater.setProperty("remaining").send(String("100"));
}
sensorWater.setProperty("remaining").send(String(ratio*100));
sensorWater.setProperty("raw").send(String(waterRawSensor.getAverage()));
}
if (!isnan(waterRawSensor.getAverage()))
{
sensorWater.setProperty("distance").send(String(waterRawSensor.getAverage()));
}
}
if ( ((int) (mBatteryVoltage * 100)) < ((int) (VOLT_MIN_BATT * 100)) )
{
sensorLipo.setProperty("percent").send("0");
}
else
{
sensorLipo.setProperty("percent").send(String(100 * (((mBatteryVoltage - VOLT_MIN_BATT) / (VOLT_MAX_BATT - VOLT_MIN_BATT)))));
}
if (battery.isFound()) {
sensorLipo.setProperty("volt").send(String(mBatteryVoltage));
sensorLipo.setProperty("current").send(String(battery.getCurrent()));
sensorLipo.setProperty("Ah").send(String(battery.getAh()));
sensorLipo.setProperty("ICA").send(String(battery.getICA()));
sensorLipo.setProperty("DCA").send(String(battery.getDCA()));
sensorLipo.setProperty("CCA").send(String(battery.getCCA()));
if (mSolarVoltage < SOLAR_MAX_VOLTAGE_POSSIBLE) {
sensorSolar.setProperty("volt").send(String(mSolarVoltage));
} else {
log(LOG_LEVEL_INFO, String("Ignore unrealistc sun voltage" + String(mSolarVoltage) +"V"), LOG_SOLAR_CHARGER_MISSING);
}
sensorTemp.setProperty(TEMPERATUR_SENSOR_CHIP).send(String(chipTemp));
sensorLipo.setProperty("percent").send(String(100 * mBatteryVoltage / VOLT_MAX_BATT));
sensorLipo.setProperty("volt").send(String(mBatteryVoltage));
sensorLipo.setProperty("current").send(String(battery.getCurrent()));
sensorLipo.setProperty("Ah").send(String(battery.getAh()));
sensorLipo.setProperty("ICA").send(String(battery.getICA()));
sensorLipo.setProperty("DCA").send(String(battery.getDCA()));
sensorLipo.setProperty("CCA").send(String(battery.getCCA()));
if (mSolarVoltage < SOLAR_MAX_VOLTAGE_POSSIBLE) {
sensorSolar.setProperty("volt").send(String(mSolarVoltage));
} else {
log(LOG_LEVEL_ERROR, String("No battery or sun sensor found"), LOG_SOLAR_CHARGER_MISSING);
log(LOG_LEVEL_INFO, String("Ignore unrealistc sun voltage" + String(mSolarVoltage) +"V"), LOG_SOLAR_CHARGER_MISSING);
}
/* Publish 1-wire sensor status on failure */
if (sensors.getDS18Count() <= 1) {
log(LOG_LEVEL_ERROR, String("Found " + String(sensors.getDS18Count()) + " DS18B20 sensors"), LOG_SENSOR_MISSING_ERROR_CODE);
}
sensorTemp.setProperty(TEMPERATUR_SENSOR_CHIP).send(String(chipTemp));
}
else
{
@@ -1166,7 +1128,7 @@ void plantcontrol()
Serial.flush();
}
bool isLowLight = (mSolarVoltage <= SOLAR_CHARGE_MIN_VOLTAGE);
bool isLowLight = (mSolarVoltage <= SOLAR_CHARGE_MAX_VOLTAGE);
#if defined(TIMED_LIGHT_PIN)
bool shouldLight = determineTimedLightState(isLowLight);
@@ -1178,30 +1140,30 @@ bool isLowLight = (mSolarVoltage <= SOLAR_CHARGE_MIN_VOLTAGE);
#endif // TIMED_LIGHT_PIN
bool isLiquid = (waterTemp > 5.0f);
bool isLiquid = waterTemp > 5;
bool hasWater = true; // By default activate the pump
if (waterRawSensor.getCount() > 0)
{
//surface of water is still nearer the sensor than required to cover the pumps
hasWater = waterRawSensor.getAverage() > WATER_LEVEL_MINIMUM;
}
if (mBatteryVoltage >= VOLT_SENSORS_BATT)
{
// FIXME no water warning message
vmPumpToRun = determineNextPump(isLowLight);
hasWater = waterRawSensor.getAverage() < waterLevelMin.get();
if (waterRawSensor.getAverage() > waterLevelMax.get()) {
log(LOG_LEVEL_ERROR, LOG_PUMP_FULLTANK_MESSAGE, LOG_PUMP_FULLTANK_CODE);
hasWater = true;
}
}
// FIXME no water warning message
pumpToRun = determineNextPump(isLowLight);
// early aborts
if (vmPumpToRun != -1)
if (pumpToRun != -1)
{
if(isLiquid){
if (hasWater)
{
if (vmDownloadMode)
if (mDownloadMode)
{
log(LOG_LEVEL_INFO, LOG_PUMP_AND_DOWNLOADMODE, LOG_PUMP_AND_DOWNLOADMODE_CODE);
vmPumpToRun = -1;
pumpToRun = -1;
} else {
/* Pump can be used :) */
}
@@ -1209,18 +1171,18 @@ bool isLowLight = (mSolarVoltage <= SOLAR_CHARGE_MIN_VOLTAGE);
else
{
log(LOG_LEVEL_ERROR, LOG_PUMP_BUTNOTANK_MESSAGE, LOG_PUMP_BUTNOTANK_CODE);
vmPumpToRun = -1;
pumpToRun = -1;
}
}
else
{
log(LOG_LEVEL_ERROR, LOG_VERY_COLD_WATER, LOG_VERY_COLD_WATER_CODE);
vmPumpToRun = -1;
pumpToRun = -1;
}
}
// go directly to sleep, skipping the pump loop
if (vmPumpToRun == -1)
if (pumpToRun == -1)
{
espDeepSleep();
}

18
rust/.cargo/config.toml Normal file
View File

@@ -0,0 +1,18 @@
[build]
target = "xtensa-esp32-espidf"
[target.xtensa-esp32-espidf]
linker = "ldproxy"
runner = "espflash flash --monitor --baud 921600 --partition-table partitions.csv" # Select this runner for espflash v2.x.x
#runner = "cargo runner"
rustflags = [ "--cfg", "espidf_time64"] # Extending time_t for ESP IDF 5: https://github.com/esp-rs/rust/issues/110
[unstable]
build-std = ["std", "panic_abort"]
[env]
MCU="esp32"
# Note: this variable is not used by the pio builder (`cargo build --features pio`)
ESP_IDF_VERSION = "v5.1.1"
CHRONO_TZ_TIMEZONE_FILTER="UTC|Europe/Berlin"
CARGO_WORKSPACE_DIR = { value = "", relative = true }

8
rust/.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
</profile>
</component>

8
rust/.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/plant-ctrl2.iml" filepath="$PROJECT_DIR$/.idea/plant-ctrl2.iml" />
</modules>
</component>
</project>

11
rust/.idea/plant-ctrl2.iml generated Normal file
View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="EMPTY_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
rust/.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

84
rust/Cargo.toml Normal file
View File

@@ -0,0 +1,84 @@
[package]
name = "plant-ctrl2"
version = "0.1.0"
authors = ["Empire Phoenix"]
edition = "2021"
resolver = "2"
rust-version = "1.71"
[profile.release]
# Explicitly disable LTO which the Xtensa codegen backend has issues
#lto = "thin"
opt-level = "s"
strip = false
#codegen-units = 1
debug = true
overflow-checks = true
panic = "unwind"
incremental = true
[profile.dev]
# Explicitly disable LTO which the Xtensa codegen backend has issues
#lto = "thin"
opt-level = "s"
strip = false
#codegen-units = 1
debug = true
overflow-checks = true
panic = "unwind"
incremental = true
[package.metadata.cargo_runner]
# The string `$TARGET_FILE` will be replaced with the path from cargo.
command = [
"cargo",
"espflash",
"save-image",
"--chip",
"esp32",
"image.bin"
]
[package.metadata.espflash]
partition_table = "partitions.csv"
[features]
default = ["std", "embassy", "esp-idf-svc/native"]
pio = ["esp-idf-svc/pio"]
std = ["alloc", "esp-idf-svc/binstart", "esp-idf-svc/std"]
alloc = ["esp-idf-svc/alloc"]
nightly = ["esp-idf-svc/nightly"]
experimental = ["esp-idf-svc/experimental"]
embassy = ["esp-idf-svc/embassy-sync", "esp-idf-svc/critical-section", "esp-idf-svc/embassy-time-driver"]
[dependencies]
log = { version = "0.4", default-features = false }
esp-idf-svc = { version = "0.47.3", default-features = false }
serde = { version = "1.0.192", features = ["derive"] }
average = { version = "0.14.1" , features = ["std"] }
#esp32 = "0.28.0"
bit_field = "0.10.2"
ds18b20 = "0.1.1"
embedded-svc = { version = "0.26.4", features = ["experimental"] }
esp-idf-hal = "0.42.5"
esp-idf-sys = { version = "0.33.7", features = ["binstart", "native"] }
esp-ota = "0.2.0"
esp_idf_build = "0.1.3"
chrono = { version = "0.4.23", default-features = false , features = ["iana-time-zone"] }
chrono-tz = {version="0.8.0", default-features = false , features = [ "filter-by-regex" ]}
embedded-hal = "0.2.7"
#shift-register-driver = "0.1.1"
one-wire-bus = "0.1.1"
anyhow = { version = "1.0.75", features = ["std", "backtrace"] }
schemars = "0.8.16"
heapless = { version = "0.7", features = ["serde"] }
serde_json = "1.0.108"
strum = { version = "0.25.0", features = ["derive"] }
once_cell = "1.19.0"
#?bq34z100 required
[build-dependencies]
embuild = "0.31.3"
vergen = { version = "8.2.6", features = ["build", "git", "gitcl"] }

25
rust/build.rs Normal file
View File

@@ -0,0 +1,25 @@
use std::process::Command;
use vergen::EmitBuilder;
fn main() {
println!("cargo:rerun-if-changed=./src/src_webpack");
Command::new("rm")
.arg("./src/webserver/bundle.js")
.output()
.expect("failed to execute process");
let output = Command::new("npx")
.arg("webpack")
.current_dir("./src_webpack")
.output()
.expect("failed to execute process");
println!("status: {}", output.status);
println!("stdout: {}", String::from_utf8_lossy(&output.stdout));
println!("stderr: {}", String::from_utf8_lossy(&output.stderr));
assert!(output.status.success());
embuild::espidf::sysenv::output();
let _ = EmitBuilder::builder().all_git().emit();
}

6
rust/partitions.csv Normal file
View File

@@ -0,0 +1,6 @@
nvs, data, nvs, , 16k,
otadata, data, ota, , 8k,
phy_init, data, phy, , 4k,
ota_0, app, ota_0, , 1792K,
ota_1, app, ota_1, , 1792K,
storage, data, spiffs, , 400K,
1 nvs data nvs 16k
2 otadata data ota 8k
3 phy_init data phy 4k
4 ota_0 app ota_0 1792K
5 ota_1 app ota_1 1792K
6 storage data spiffs 400K

3
rust/rust-toolchain.toml Normal file
View File

@@ -0,0 +1,3 @@
[toolchain]
channel = "nightly"

10
rust/sdkconfig.defaults Normal file
View File

@@ -0,0 +1,10 @@
# Rust often needs a bit of an extra main task stack size compared to C (the default is 3K)
CONFIG_ESP_MAIN_TASK_STACK_SIZE=20000
# Use this to set FreeRTOS kernel tick frequency to 1000 Hz (100 Hz by default).
# This allows to use 1 ms granuality for thread sleeps (10 ms by default).
CONFIG_FREERTOS_HZ=1000
# Workaround for https://github.com/espressif/esp-idf/issues/7631
#CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n
#CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=n

18
rust/setup.txt Normal file
View File

@@ -0,0 +1,18 @@
cargo install cargo-generate
cargo install ldproxy
cargo install espup
cargo install espflash
cargo install cargo-espflash
cargo generate esp-rs/esp-idf-template cargo
export PATH="$PATH:$HOME/.cargo/bin"
espup install
rustup toolchain link esp ~/.rustup/toolchains/esp/
cargo install ldproxy
cargo espflash save-image --chip esp32 image.bin
esptool.py --chip ESP32-C3 elf2image --output my-app.bin target/release/my-app
$ espflash save-image ESP32-C3 target/release/my-app my-app.bin

85
rust/src/config.rs Normal file
View File

@@ -0,0 +1,85 @@
use std::fmt;
use serde::{Deserialize, Serialize};
use crate::PLANT_COUNT;
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct Config {
pub mqtt_url: heapless::String<128>,
pub base_topic: heapless::String<64>,
pub max_consecutive_pump_count: u8,
pub tank_allow_pumping_if_sensor_error: bool,
pub tank_sensor_enabled: bool,
pub tank_useable_ml: u32,
pub tank_warn_percent: u8,
pub tank_empty_mv: f32,
pub tank_full_mv: f32,
pub night_lamp_hour_start: u8,
pub night_lamp_hour_end: u8,
pub night_lamp_only_when_dark: bool,
pub plants: [Plant; PLANT_COUNT],
}
impl Default for Config {
fn default() -> Self {
Self {
base_topic: "plant/one".into(),
mqtt_url: "mqtt://192.168.1.1:1883".into(),
tank_allow_pumping_if_sensor_error: true,
tank_sensor_enabled: true,
tank_warn_percent: 50,
night_lamp_hour_start: 21,
night_lamp_hour_end: 2,
night_lamp_only_when_dark: true,
plants: [Plant::default(); PLANT_COUNT],
max_consecutive_pump_count: 15,
tank_useable_ml: 5000,
tank_empty_mv: 0.1,
tank_full_mv: 3.3,
}
}
}
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq)]
pub enum Mode {
OFF,
TargetMoisture,
TimerOnly,
}
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq)]
pub struct Plant {
pub mode: Mode,
pub target_moisture: u8,
pub pump_time_s: u16,
pub pump_cooldown_min: u16,
pub pump_hour_start: u8,
pub pump_hour_end: u8,
}
impl Default for Plant {
fn default() -> Self {
Self {
target_moisture: 40,
pump_time_s: 60,
pump_cooldown_min: 60,
pump_hour_start: 8,
pump_hour_end: 20,
mode: Mode::OFF,
}
}
}
#[derive(Serialize, Deserialize, Debug)]
pub struct WifiConfig {
pub ssid: heapless::String<32>,
pub password: Option<heapless::String<64>>,
}
impl fmt::Display for WifiConfig {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "({}, ****)", self.ssid)
}
}

4
rust/src/lib.rs Normal file
View File

@@ -0,0 +1,4 @@
#![allow(dead_code)]
extern crate embedded_hal as hal;
pub mod sipo;

446
rust/src/main.rs Normal file
View File

@@ -0,0 +1,446 @@
use std::{
env,
sync::{atomic::AtomicBool, Arc, Mutex},
};
use anyhow::Result;
use chrono::{Datelike, Duration, NaiveDateTime, Timelike};
use chrono_tz::Europe::Berlin;
use esp_idf_hal::delay::Delay;
use esp_idf_sys::{esp_restart, uxTaskGetStackHighWaterMark, vTaskDelay};
use esp_ota::rollback_and_reboot;
use log::error;
use once_cell::sync::Lazy;
use plant_hal::{CreatePlantHal, PlantCtrlBoard, PlantCtrlBoardInteraction, PlantHal, PLANT_COUNT};
use serde::{Deserialize, Serialize};
use crate::{
config::{Config, WifiConfig},
webserver::webserver::{httpd, httpd_initial},
};
mod config;
pub mod plant_hal;
const MOIST_SENSOR_MAX_FREQUENCY: u32 = 5200; // 60kHz (500Hz margin)
const MOIST_SENSOR_MIN_FREQUENCY: u32 = 500; // 0.5kHz (500Hz margin)
const FROM: (f32, f32) = (
MOIST_SENSOR_MIN_FREQUENCY as f32,
MOIST_SENSOR_MAX_FREQUENCY as f32,
);
const TO: (f32, f32) = (0_f32, 100_f32);
mod webserver {
pub mod webserver;
}
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq)]
enum OnlineMode {
Offline,
Wifi,
SnTp,
}
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq)]
enum WaitType {
InitialConfig,
FlashError,
NormalConfig,
StayAlive,
}
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Default)]
struct PlantState {
a: u8,
b: u8,
p: u8,
after_p: u8,
dry: bool,
active: bool,
pump_error: bool,
not_effective: bool,
cooldown: bool,
no_water: bool,
}
fn wait_infinity(wait_type: WaitType, reboot_now: Arc<AtomicBool>) -> ! {
let delay = match wait_type {
WaitType::InitialConfig => 250_u32,
WaitType::FlashError => 100_u32,
WaitType::NormalConfig => 500_u32,
WaitType::StayAlive => 1000_u32,
};
let led_count = match wait_type {
WaitType::InitialConfig => 8,
WaitType::FlashError => 8,
WaitType::NormalConfig => 4,
WaitType::StayAlive => 2,
};
loop {
unsafe {
//do not trigger watchdog
for i in 0..8 {
BOARD_ACCESS.lock().unwrap().fault(i, i < led_count);
}
BOARD_ACCESS.lock().unwrap().general_fault(true);
vTaskDelay(delay);
BOARD_ACCESS.lock().unwrap().general_fault(false);
for i in 0..8 {
BOARD_ACCESS.lock().unwrap().fault(i, false);
}
vTaskDelay(delay);
if wait_type == WaitType::StayAlive
&& !STAY_ALIVE.load(std::sync::atomic::Ordering::Relaxed)
{}
if reboot_now.load(std::sync::atomic::Ordering::Relaxed) {
println!("Rebooting");
esp_restart();
}
}
}
}
pub static BOARD_ACCESS: Lazy<Mutex<PlantCtrlBoard>> = Lazy::new(|| PlantHal::create().unwrap());
pub static STAY_ALIVE: Lazy<AtomicBool> = Lazy::new(|| AtomicBool::new(false));
fn map_range(from_range: (f32, f32), to_range: (f32, f32), s: f32) -> f32 {
to_range.0 + (s - from_range.0) * (to_range.1 - to_range.0) / (from_range.1 - from_range.0)
}
fn main() -> Result<()> {
// It is necessary to call this function once. Otherwise some patches to the runtime
// implemented by esp-idf-sys might not link properly. See https://github.com/esp-rs/esp-idf-template/issues/71
esp_idf_svc::sys::link_patches();
// Bind the log crate to the ESP Logging facilities
esp_idf_svc::log::EspLogger::initialize_default();
if esp_idf_sys::CONFIG_MAIN_TASK_STACK_SIZE < 20000 {
error!(
"stack too small: {} bail!",
esp_idf_sys::CONFIG_MAIN_TASK_STACK_SIZE
);
return Ok(());
}
log::info!("Startup Rust");
let git_hash = env!("VERGEN_GIT_DESCRIBE");
println!("Version useing git has {}", git_hash);
let mut partition_state: embedded_svc::ota::SlotState = embedded_svc::ota::SlotState::Unknown;
// match esp_idf_svc::ota::EspOta::new() {
// Ok(ota) => {
// match ota.get_running_slot(){
// Ok(slot) => {
// partition_state = slot.state;
// println!(
// "Booting from {} with state {:?}",
// slot.label, partition_state
// );
// },
// Err(err) => {
// println!("Error getting running slot {}", err);
// },
// }
// },
// Err(err) => {
// println!("Error obtaining ota info {}", err);
// },
// }
println!("Board hal init");
let mut board: std::sync::MutexGuard<'_, PlantCtrlBoard<'_>> = BOARD_ACCESS.lock().unwrap();
println!("Mounting filesystem");
board.mount_file_system()?;
let free_space = board.file_system_size()?;
println!(
"Mounted, total space {} used {} free {}",
free_space.total_size, free_space.used_size, free_space.free_size
);
let time = board.time();
let mut cur = match time {
Ok(cur) => cur,
Err(err) => {
log::error!("time error {}", err);
NaiveDateTime::from_timestamp_millis(0).unwrap().and_utc()
}
};
//check if we know the time current > 2020
if cur.year() < 2020 {
if board.is_day() {
//assume TZ safe times ;)
cur = *cur.with_hour(15).get_or_insert(cur);
} else {
cur = *cur.with_hour(3).get_or_insert(cur);
}
}
println!("cur is {}", cur);
if board.is_config_reset() {
board.general_fault(true);
println!("Reset config is pressed, waiting 5s");
for i in 0..25 {
board.general_fault(true);
Delay::new_default().delay_ms(50);
board.general_fault(false);
Delay::new_default().delay_ms(50);
}
if board.is_config_reset() {
println!("Reset config is still pressed, deleting configs and reboot");
match board.remove_configs() {
Ok(case) => {
println!("Succeeded in deleting config {}", case);
}
Err(err) => {
println!("Could not remove config files, system borked {}", err);
//terminate main app and freeze
wait_infinity(WaitType::FlashError, Arc::new(AtomicBool::new(false)));
}
}
} else {
board.general_fault(false);
}
}
let mut online_mode = OnlineMode::Offline;
let wifi_conf = board.get_wifi();
let wifi: WifiConfig;
match wifi_conf {
Ok(conf) => {
wifi = conf;
}
Err(err) => {
if board.is_wifi_config_file_existant() {
match partition_state {
embedded_svc::ota::SlotState::Invalid
| embedded_svc::ota::SlotState::Unverified => {
println!("Config seem to be unparsable after upgrade, reverting");
rollback_and_reboot()?;
}
_ => {}
}
}
println!("Missing wifi config, entering initial config mode {}", err);
board.wifi_ap().unwrap();
//config upload will trigger reboot!
drop(board);
let reboot_now = Arc::new(AtomicBool::new(false));
let _webserver = httpd_initial(reboot_now.clone());
wait_infinity(WaitType::InitialConfig, reboot_now.clone());
}
};
println!("attempting to connect wifi");
match board.wifi(&wifi.ssid, wifi.password.as_deref(), 10000) {
Ok(_) => {
online_mode = OnlineMode::Wifi;
}
Err(_) => {
println!("Offline mode");
board.general_fault(true);
}
}
if online_mode == OnlineMode::Wifi {
match board.sntp(1000 * 120) {
Ok(new_time) => {
cur = new_time;
online_mode = OnlineMode::SnTp;
}
Err(err) => {
println!("sntp error: {}", err);
board.general_fault(true);
}
}
println!("Running logic at utc {}", cur);
let europe_time = cur.with_timezone(&Berlin);
println!("Running logic at europe/berlin {}", europe_time);
}
let config: Config;
match board.get_config() {
Ok(valid) => {
config = valid;
}
Err(err) => {
println!("Missing normal config, entering config mode {}", err);
//config upload will trigger reboot!
drop(board);
let reboot_now = Arc::new(AtomicBool::new(false));
let _webserver = httpd(reboot_now.clone());
wait_infinity(WaitType::NormalConfig, reboot_now.clone());
}
}
//do mqtt before config check, as mqtt might configure
if online_mode == OnlineMode::SnTp {
match board.mqtt(&config) {
Ok(_) => {
println!("Mqtt connection ready");
}
Err(err) => {
println!("Could not connect mqtt due to {}", err);
}
}
}
match board.battery_state() {
Ok(_state) => {}
Err(err) => {
board.general_fault(true);
println!("Could not read battery state, assuming low power {}", err);
}
}
let mut enough_water = true;
if config.tank_sensor_enabled {
let tank_value = board.tank_sensor_mv();
match tank_value {
Ok(tank_raw) => {
//FIXME clear
let percent = map_range(
(config.tank_empty_mv, config.tank_full_mv),
(0_f32, 100_f32),
tank_raw.into(),
);
let left_ml = ((percent / 100_f32) * config.tank_useable_ml as f32) as u32;
println!(
"Tank sensor returned mv {} as {}% leaving {} ml useable",
tank_raw, percent as u8, left_ml
);
if config.tank_warn_percent > percent as u8 {
board.general_fault(true);
println!(
"Low water, current percent is {}, minimum warn level is {}",
percent as u8, config.tank_warn_percent
);
//FIXME warn here
}
if config.tank_warn_percent <= 0 {
enough_water = false;
}
}
Err(_) => {
board.general_fault(true);
if !config.tank_allow_pumping_if_sensor_error {
enough_water = false;
}
//set tank sensor state to fault
}
}
}
let plantstate = [PlantState {
..Default::default()
}; PLANT_COUNT];
for plant in 0..PLANT_COUNT {
let mut state = plantstate[plant];
//return mapf(mMoisture_raw.getMedian(), MOIST_SENSOR_MIN_FRQ, MOIST_SENSOR_MAX_FRQ, 0, 100);
state.a = map_range(
FROM,
TO,
board.measure_moisture_hz(plant, plant_hal::Sensor::A)? as f32,
) as u8;
state.b = map_range(
FROM,
TO,
board.measure_moisture_hz(plant, plant_hal::Sensor::B)? as f32,
) as u8;
state.p = map_range(
FROM,
TO,
board.measure_moisture_hz(plant, plant_hal::Sensor::PUMP)? as f32,
) as u8;
let plant_config = config.plants[plant];
//FIXME how to average analyze whatever?
if state.a < plant_config.target_moisture || state.b < plant_config.target_moisture {
state.dry = true;
if !enough_water {
state.no_water = true;
}
}
let duration = Duration::minutes((60 * plant_config.pump_cooldown_min).into());
if (board.last_pump_time(plant)? + duration) > cur {
state.cooldown = true;
}
if state.dry {
let consecutive_pump_count = board.consecutive_pump_count(plant) + 1;
board.store_consecutive_pump_count(plant, consecutive_pump_count);
if consecutive_pump_count > config.max_consecutive_pump_count.into() {
state.not_effective = true;
board.fault(plant, true);
}
} else {
board.store_consecutive_pump_count(plant, 0);
}
//TODO update mqtt state here!
}
if (STAY_ALIVE.load(std::sync::atomic::Ordering::Relaxed)) {
drop(board);
let reboot_now = Arc::new(AtomicBool::new(false));
let _webserver = httpd(reboot_now.clone());
wait_infinity(WaitType::StayAlive, reboot_now.clone());
}
'eachplant: for plant in 0..PLANT_COUNT {
let mut state = plantstate[plant];
if (state.dry && !state.cooldown) {
println!("Trying to pump with pump {} now", plant);
let plant_config = config.plants[plant];
board.any_pump(true)?;
board.store_last_pump_time(plant, cur);
board.pump(plant, true)?;
board.last_pump_time(plant)?;
state.active = true;
unsafe { vTaskDelay(plant_config.pump_time_s.into()) };
state.after_p = map_range(
FROM,
TO,
board.measure_moisture_hz(plant, plant_hal::Sensor::PUMP)? as f32,
) as u8;
if state.after_p < state.p + 5 {
state.pump_error = true;
board.fault(plant, true);
}
break 'eachplant;
}
}
/*
//check if during light time
//lightstate += out of worktime
//check battery level
//lightstate += battery empty
//check solar level if config requires
//lightstate += stillday
//if no preventing lightstate, enable light
//lightstate = active
//keep webserver in scope
let webserver = httpd(true);
let delay = Delay::new_default();
loop {
//let freertos do shit
delay.delay_ms(1001);
}
*/
//deepsleep here?
Ok(())
}
//error codes
//error_reading_config_after_upgrade
//error_no_config_after_upgrade
//error_tank_sensor_fault

777
rust/src/plant_hal.rs Normal file
View File

@@ -0,0 +1,777 @@
//mod config;
use embedded_svc::wifi::{
AccessPointConfiguration, AccessPointInfo, AuthMethod, ClientConfiguration, Configuration,
};
use esp_idf_svc::eventloop::EspSystemEventLoop;
use esp_idf_svc::mqtt::client::QoS::ExactlyOnce;
use esp_idf_svc::mqtt::client::{EspMqttClient, MqttClientConfiguration};
use esp_idf_svc::nvs::EspDefaultNvsPartition;
use esp_idf_svc::wifi::config::{ScanConfig, ScanType};
use esp_idf_svc::wifi::EspWifi;
use plant_ctrl2::sipo::ShiftRegister40;
use anyhow::anyhow;
use anyhow::{bail, Ok, Result};
use serde::{Deserialize, Serialize};
use std::ffi::CString;
use std::fs::File;
use std::path::Path;
use std::sync::atomic::AtomicBool;
use std::sync::{Arc, Mutex};
use std::time::Duration;
use chrono::{DateTime, NaiveDateTime, Utc};
use ds18b20::Ds18b20;
use embedded_hal::digital::v2::OutputPin;
use esp_idf_hal::adc::{attenuation, AdcChannelDriver, AdcDriver};
use esp_idf_hal::delay::Delay;
use esp_idf_hal::gpio::{AnyInputPin, Gpio39, Gpio4, Level, PinDriver};
use esp_idf_hal::pcnt::{
PcntChannel, PcntChannelConfig, PcntControlMode, PcntCountMode, PcntDriver, PinIndex,
};
use esp_idf_hal::prelude::Peripherals;
use esp_idf_hal::reset::ResetReason;
use esp_idf_svc::sntp::{self, SyncStatus};
use esp_idf_svc::systime::EspSystemTime;
use esp_idf_sys::{vTaskDelay, EspError};
use one_wire_bus::OneWire;
use crate::config::{self, Config, WifiConfig};
use crate::STAY_ALIVE;
pub const PLANT_COUNT: usize = 8;
const PINS_PER_PLANT: usize = 5;
const PLANT_PUMP_OFFSET: usize = 0;
const PLANT_FAULT_OFFSET: usize = 1;
const PLANT_MOIST_PUMP_OFFSET: usize = 2;
const PLANT_MOIST_B_OFFSET: usize = 3;
const PLANT_MOIST_A_OFFSET: usize = 4;
const SPIFFS_PARTITION_NAME: &str = "storage";
const WIFI_CONFIG_FILE: &str = "/spiffs/wifi.cfg";
const CONFIG_FILE: &str = "/spiffs/config.cfg";
#[link_section = ".rtc.data"]
static mut LAST_WATERING_TIMESTAMP: [i64; PLANT_COUNT] = [0; PLANT_COUNT];
#[link_section = ".rtc.data"]
static mut CONSECUTIVE_WATERING_PLANT: [u32; PLANT_COUNT] = [0; PLANT_COUNT];
#[link_section = ".rtc.data"]
static mut LOW_VOLTAGE_DETECTED: bool = false;
#[derive(Serialize, Deserialize, Debug)]
pub struct BatteryState {
pub state_charge_percent: u8,
max_error_percent: u8,
remaining_milli_ampere_hour: u32,
max_milli_ampere_hour: u32,
design_milli_ampere_hour: u32,
voltage_milli_volt: u16,
average_current_milli_ampere: u16,
temperature_tenth_kelvin: u32,
average_time_to_empty_minute: u16,
average_time_to_full_minute: u16,
average_discharge_power_cycle_milli_watt: u16,
cycle_count: u16,
state_health_percent: u8,
}
impl Default for BatteryState {
fn default() -> Self {
BatteryState {
state_charge_percent: 50,
max_error_percent: 100,
remaining_milli_ampere_hour: 100,
max_milli_ampere_hour: 200,
design_milli_ampere_hour: 200,
voltage_milli_volt: 12,
average_current_milli_ampere: 50,
temperature_tenth_kelvin: 1337,
average_time_to_empty_minute: 123,
average_time_to_full_minute: 123,
average_discharge_power_cycle_milli_watt: 123,
cycle_count: 123,
state_health_percent: 90,
}
}
}
pub struct FileSystemSizeInfo {
pub total_size: usize,
pub used_size: usize,
pub free_size: usize,
}
#[derive(strum::Display)]
pub enum ClearConfigType {
WifiConfig,
Config,
None,
}
#[derive(Debug)]
pub enum Sensor {
A,
B,
PUMP,
}
pub trait PlantCtrlBoardInteraction {
fn time(&mut self) -> Result<chrono::DateTime<Utc>>;
fn wifi(&mut self, ssid: &str, password: Option<&str>, max_wait: u32) -> Result<()>;
fn sntp(&mut self, max_wait: u32) -> Result<chrono::DateTime<Utc>>;
fn mount_file_system(&mut self) -> Result<()>;
fn file_system_size(&mut self) -> Result<FileSystemSizeInfo>;
fn battery_state(&mut self) -> Result<BatteryState>;
fn general_fault(&mut self, enable: bool);
fn is_day(&self) -> bool;
fn water_temperature_c(&mut self) -> Result<f32>;
fn tank_sensor_mv(&mut self) -> Result<u16>;
fn set_low_voltage_in_cycle(&mut self);
fn clear_low_voltage_in_cycle(&mut self);
fn low_voltage_in_cycle(&mut self) -> bool;
fn any_pump(&mut self, enabled: bool) -> Result<()>;
//keep state during deepsleep
fn light(&mut self, enable: bool) -> Result<()>;
fn measure_moisture_hz(&self, plant: usize, sensor: Sensor) -> Result<i32>;
fn pump(&self, plant: usize, enable: bool) -> Result<()>;
fn last_pump_time(&self, plant: usize) -> Result<chrono::DateTime<Utc>>;
fn store_last_pump_time(&mut self, plant: usize, time: chrono::DateTime<Utc>);
fn store_consecutive_pump_count(&mut self, plant: usize, count: u32);
fn consecutive_pump_count(&mut self, plant: usize) -> u32;
//keep state during deepsleep
fn fault(&self, plant: usize, enable: bool);
//config
fn is_config_reset(&mut self) -> bool;
fn remove_configs(&mut self) -> Result<ClearConfigType>;
fn get_config(&mut self) -> Result<config::Config>;
fn set_config(&mut self, wifi: &Config) -> Result<()>;
fn get_wifi(&mut self) -> Result<config::WifiConfig>;
fn set_wifi(&mut self, wifi: &WifiConfig) -> Result<()>;
fn wifi_ap(&mut self) -> Result<()>;
fn wifi_scan(&mut self) -> Result<Vec<AccessPointInfo>>;
fn test(&mut self) -> Result<()>;
fn is_wifi_config_file_existant(&mut self) -> bool;
fn mqtt(&mut self, config: &Config) -> Result<()>;
}
pub trait CreatePlantHal<'a> {
fn create() -> Result<Mutex<PlantCtrlBoard<'static>>>;
}
pub struct PlantHal {}
pub struct PlantCtrlBoard<'a> {
shift_register: ShiftRegister40<
PinDriver<'a, esp_idf_hal::gpio::Gpio21, esp_idf_hal::gpio::Output>,
PinDriver<'a, esp_idf_hal::gpio::Gpio22, esp_idf_hal::gpio::Output>,
PinDriver<'a, esp_idf_hal::gpio::Gpio19, esp_idf_hal::gpio::Output>,
>,
consecutive_watering_plant: Mutex<[u32; PLANT_COUNT]>,
last_watering_timestamp: Mutex<[i64; PLANT_COUNT]>,
low_voltage_detected: Mutex<bool>,
tank_driver: AdcDriver<'a, esp_idf_hal::adc::ADC1>,
tank_channel: esp_idf_hal::adc::AdcChannelDriver<'a, { attenuation::DB_11 }, Gpio39>,
solar_is_day: PinDriver<'a, esp_idf_hal::gpio::Gpio25, esp_idf_hal::gpio::Input>,
boot_button: PinDriver<'a, esp_idf_hal::gpio::Gpio0, esp_idf_hal::gpio::Input>,
signal_counter: PcntDriver<'a>,
light: PinDriver<'a, esp_idf_hal::gpio::Gpio26, esp_idf_hal::gpio::Output>,
main_pump: PinDriver<'a, esp_idf_hal::gpio::Gpio23, esp_idf_hal::gpio::Output>,
tank_power: PinDriver<'a, esp_idf_hal::gpio::Gpio27, esp_idf_hal::gpio::Output>,
general_fault: PinDriver<'a, esp_idf_hal::gpio::Gpio13, esp_idf_hal::gpio::Output>,
pub wifi_driver: EspWifi<'a>,
one_wire_bus: OneWire<PinDriver<'a, Gpio4, esp_idf_hal::gpio::InputOutput>>,
mqtt_client: Option<EspMqttClient<'a>>,
}
impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
fn battery_state(&mut self) -> Result<BatteryState> {
return Ok(BatteryState::default());
}
fn is_day(&self) -> bool {
self.solar_is_day.get_level().into()
}
fn water_temperature_c(&mut self) -> Result<f32> {
let mut delay = Delay::new_default();
self.one_wire_bus
.reset(&mut delay)
.map_err(|err| -> anyhow::Error { anyhow!("Missing attribute: {:?}", err) })?;
let first = self.one_wire_bus.devices(false, &mut delay).next();
if first.is_none() {
bail!("Not found any one wire Ds18b20");
}
let device_address = first
.unwrap()
.map_err(|err| -> anyhow::Error { anyhow!("Missing attribute: {:?}", err) })?;
let water_temp_sensor = Ds18b20::new::<EspError>(device_address)
.map_err(|err| -> anyhow::Error { anyhow!("Missing attribute: {:?}", err) })?;
water_temp_sensor
.start_temp_measurement(&mut self.one_wire_bus, &mut delay)
.map_err(|err| -> anyhow::Error { anyhow!("Missing attribute: {:?}", err) })?;
ds18b20::Resolution::Bits12.delay_for_measurement_time(&mut delay);
let sensor_data = water_temp_sensor
.read_data(&mut self.one_wire_bus, &mut delay)
.map_err(|err| -> anyhow::Error { anyhow!("Missing attribute: {:?}", err) })?;
if sensor_data.temperature == 85_f32 {
bail!("Ds18b20 dummy temperature returned");
}
Ok(sensor_data.temperature)
}
fn tank_sensor_mv(&mut self) -> Result<u16> {
let delay = Delay::new_default();
self.tank_power.set_high()?;
//let stabilize
delay.delay_ms(100);
let value = self.tank_driver.read(&mut self.tank_channel)?;
self.tank_power.set_low()?;
Ok(value)
}
fn set_low_voltage_in_cycle(&mut self) {
*self.low_voltage_detected.get_mut().unwrap() = true;
}
fn clear_low_voltage_in_cycle(&mut self) {
*self.low_voltage_detected.get_mut().unwrap() = false;
}
fn light(&mut self, enable: bool) -> Result<()> {
self.light.set_state(enable.into())?;
Ok(())
}
fn pump(&self, plant: usize, enable: bool) -> Result<()> {
let index = plant * PINS_PER_PLANT + PLANT_PUMP_OFFSET;
//currently infailable error, keep for future as result anyway
self.shift_register.decompose()[index]
.set_state(enable.into())
.unwrap();
Ok(())
}
fn last_pump_time(&self, plant: usize) -> Result<chrono::DateTime<Utc>> {
let ts = unsafe { LAST_WATERING_TIMESTAMP }[plant];
let timestamp = NaiveDateTime::from_timestamp_millis(ts)
.ok_or(anyhow!("could not convert timestamp"))?;
Ok(DateTime::<Utc>::from_naive_utc_and_offset(timestamp, Utc))
}
fn store_last_pump_time(&mut self, plant: usize, time: chrono::DateTime<Utc>) {
self.last_watering_timestamp.get_mut().unwrap()[plant] = time.timestamp_millis();
}
fn store_consecutive_pump_count(&mut self, plant: usize, count: u32) {
self.consecutive_watering_plant.get_mut().unwrap()[plant] = count;
}
fn consecutive_pump_count(&mut self, plant: usize) -> u32 {
return self.consecutive_watering_plant.get_mut().unwrap()[plant];
}
fn fault(&self, plant: usize, enable: bool) {
let index = plant * PINS_PER_PLANT + PLANT_FAULT_OFFSET;
self.shift_register.decompose()[index]
.set_state(enable.into())
.unwrap()
}
fn low_voltage_in_cycle(&mut self) -> bool {
return *self.low_voltage_detected.get_mut().unwrap();
}
fn any_pump(&mut self, enable: bool) -> Result<()> {
{
self.main_pump.set_state(enable.into()).unwrap();
Ok(())
}
}
fn time(&mut self) -> Result<chrono::DateTime<Utc>> {
let time = EspSystemTime {}.now().as_millis();
let smaller_time = time as i64;
let local_time = NaiveDateTime::from_timestamp_millis(smaller_time)
.ok_or(anyhow!("could not convert timestamp"))?;
Ok(local_time.and_utc())
}
fn sntp(&mut self, max_wait_ms: u32) -> Result<chrono::DateTime<Utc>> {
let sntp = sntp::EspSntp::new_default()?;
let mut counter = 0;
while sntp.get_sync_status() != SyncStatus::Completed {
let delay = Delay::new_default();
delay.delay_ms(100);
counter += 100;
if counter > max_wait_ms {
bail!("Reached sntp timeout, aborting")
}
}
self.time()
}
fn measure_moisture_hz(&self, plant: usize, sensor: Sensor) -> Result<i32> {
self.signal_counter.counter_pause()?;
self.signal_counter.counter_clear()?;
//
let offset = match sensor {
Sensor::A => PLANT_MOIST_A_OFFSET,
Sensor::B => PLANT_MOIST_B_OFFSET,
Sensor::PUMP => PLANT_MOIST_PUMP_OFFSET,
};
let index = plant * PINS_PER_PLANT + offset;
let delay = Delay::new_default();
let measurement = 100;
let factor = 1000 / 100;
self.shift_register.decompose()[index].set_high().unwrap();
//give some time to stabilize
delay.delay_ms(10);
self.signal_counter.counter_resume()?;
delay.delay_ms(measurement);
self.signal_counter.counter_pause()?;
self.shift_register.decompose()[index].set_low().unwrap();
let unscaled = self.signal_counter.get_counter_value()? as i32;
let hz = unscaled * factor;
println!("Measuring {:?} @ {} with {}", sensor, plant, hz);
Ok(hz)
}
fn general_fault(&mut self, enable: bool) {
self.general_fault.set_state(enable.into()).unwrap();
}
fn wifi_ap(&mut self) -> Result<()> {
let apconfig = AccessPointConfiguration {
ssid: "PlantCtrl".into(),
auth_method: AuthMethod::None,
ssid_hidden: false,
..Default::default()
};
let clientconfig = ClientConfiguration::default();
self.wifi_driver
.set_configuration(&Configuration::Mixed(clientconfig, apconfig))?;
self.wifi_driver.start()?;
Ok(())
}
fn wifi(&mut self, ssid: &str, password: Option<&str>, max_wait: u32) -> Result<()> {
match password {
Some(pw) => {
//TODO expect error due to invalid pw or similar! //call this during configuration and check if works, revert to config mode if not
self.wifi_driver.set_configuration(&Configuration::Client(
ClientConfiguration {
ssid: ssid.into(),
password: pw.into(),
..Default::default()
},
))?;
}
None => {
self.wifi_driver
.set_configuration(&Configuration::Client(ClientConfiguration {
ssid: ssid.into(),
auth_method: AuthMethod::None,
..Default::default()
}))
.unwrap();
}
}
self.wifi_driver.start()?;
self.wifi_driver.connect()?;
let delay = Delay::new_default();
let mut counter = 0_u32;
while !self.wifi_driver.is_connected()? {
println!("Waiting for station connection");
//TODO blink status?
delay.delay_ms(250);
counter += 250;
if counter > max_wait {
//ignore these errors, wifi will not be used this
self.wifi_driver.disconnect().unwrap_or(());
self.wifi_driver.stop().unwrap_or(());
bail!("Did not manage wifi connection within timeout");
}
}
println!("Should be connected now");
while !self.wifi_driver.is_up().unwrap() {
println!("Waiting for network being up");
delay.delay_ms(250);
counter += 250;
if counter > max_wait {
//ignore these errors, wifi will not be used this
self.wifi_driver.disconnect().unwrap_or(());
self.wifi_driver.stop().unwrap_or(());
bail!("Did not manage wifi connection within timeout");
}
}
//update freertos registers ;)
let address = self.wifi_driver.sta_netif().get_ip_info().unwrap();
println!("IP info: {:?}", address);
Ok(())
}
fn mount_file_system(&mut self) -> Result<()> {
let base_path = CString::new("/spiffs")?;
let storage = CString::new(SPIFFS_PARTITION_NAME)?;
let conf = esp_idf_sys::esp_vfs_spiffs_conf_t {
base_path: base_path.as_ptr(),
partition_label: storage.as_ptr(),
max_files: 2,
format_if_mount_failed: true,
};
unsafe {
esp_idf_sys::esp!(esp_idf_sys::esp_vfs_spiffs_register(&conf))?;
Ok(())
}
}
fn file_system_size(&mut self) -> Result<FileSystemSizeInfo> {
let storage = CString::new(SPIFFS_PARTITION_NAME)?;
let mut total_size = 0;
let mut used_size = 0;
unsafe {
esp_idf_sys::esp!(esp_idf_sys::esp_spiffs_info(
storage.as_ptr(),
&mut total_size,
&mut used_size
))?;
}
Ok(FileSystemSizeInfo {
total_size,
used_size,
free_size: total_size - used_size,
})
}
fn is_config_reset(&mut self) -> bool {
self.boot_button.get_level() == Level::Low
}
fn remove_configs(&mut self) -> Result<ClearConfigType> {
let config = Path::new(CONFIG_FILE);
if config.exists() {
println!("Removing config");
std::fs::remove_file(config)?;
return Ok(ClearConfigType::Config);
}
let wifi_config = Path::new(WIFI_CONFIG_FILE);
if wifi_config.exists() {
println!("Removing wifi config");
std::fs::remove_file(wifi_config)?;
return Ok(ClearConfigType::WifiConfig);
}
Ok(ClearConfigType::None)
}
fn get_wifi(&mut self) -> Result<config::WifiConfig> {
let cfg = File::open(WIFI_CONFIG_FILE)?;
let config: WifiConfig = serde_json::from_reader(cfg)?;
Ok(config)
}
fn set_wifi(&mut self, wifi: &WifiConfig) -> Result<()> {
let mut cfg = File::create(WIFI_CONFIG_FILE)?;
serde_json::to_writer(&mut cfg, &wifi)?;
println!("Wrote wifi config {}", wifi);
Ok(())
}
fn get_config(&mut self) -> Result<config::Config> {
let cfg = File::open(CONFIG_FILE)?;
let config: Config = serde_json::from_reader(cfg)?;
Ok(config)
}
fn set_config(&mut self, config: &Config) -> Result<()> {
let mut cfg = File::create(CONFIG_FILE)?;
serde_json::to_writer(&mut cfg, &config)?;
println!("Wrote config config {:?}", config);
Ok(())
}
fn wifi_scan(&mut self) -> Result<Vec<AccessPointInfo>> {
//remove this parts
for i in 1..11 {
println!("Scanning channel {}", i);
self.wifi_driver.start_scan(
&ScanConfig {
scan_type: ScanType::Passive(Duration::from_secs(1)),
show_hidden: false,
channel: Some(i),
..Default::default()
},
true,
)?;
let sr = self.wifi_driver.get_scan_result()?;
for r in sr.iter() {
println!("Found wifi {}", r.ssid);
}
}
self.wifi_driver.start_scan(
&ScanConfig {
scan_type: ScanType::Passive(Duration::from_secs(1)),
show_hidden: false,
..Default::default()
},
true,
)?;
Ok(self.wifi_driver.get_scan_result()?)
}
fn test(&mut self) -> Result<()> {
self.general_fault(true);
unsafe { vTaskDelay(100) };
self.general_fault(false);
unsafe { vTaskDelay(100) };
self.any_pump(true)?;
unsafe { vTaskDelay(500) };
self.any_pump(false)?;
unsafe { vTaskDelay(500) };
self.light(true)?;
unsafe { vTaskDelay(500) };
self.light(false)?;
unsafe { vTaskDelay(500) };
for i in 0..8 {
self.fault(i, true);
unsafe { vTaskDelay(500) };
self.fault(i, false);
unsafe { vTaskDelay(500) };
}
for i in 0..8 {
self.pump(i, true)?;
unsafe { vTaskDelay(500) };
self.pump(i, false)?;
unsafe { vTaskDelay(500) };
}
for i in 0..8 {
self.measure_moisture_hz(i, Sensor::A)?;
unsafe { vTaskDelay(500) };
}
for i in 0..8 {
self.measure_moisture_hz(i, Sensor::B)?;
unsafe { vTaskDelay(500) };
}
for i in 0..8 {
self.measure_moisture_hz(i, Sensor::PUMP)?;
unsafe { vTaskDelay(500) };
}
Ok(())
}
fn is_wifi_config_file_existant(&mut self) -> bool {
let config = Path::new(CONFIG_FILE);
config.exists()
}
fn mqtt(&mut self, config: &Config) -> Result<()> {
//FIXME testament
let mqtt_client_config = MqttClientConfiguration {
//room for improvement
..Default::default()
};
let round_trip_ok = Arc::new(AtomicBool::new(false));
let round_trip_topic = format!("{}/internal/roundtrip", config.base_topic);
let stay_alive_topic = format!("{}/stay_alive", config.base_topic);
println!("Round trip topic is {}", round_trip_topic);
println!("Stay alive topic is {}", stay_alive_topic);
let stay_alive_topic_copy = stay_alive_topic.clone();
let round_trip_topic_copy = round_trip_topic.clone();
let round_trip_ok_copy = round_trip_ok.clone();
let mut client =
EspMqttClient::new(&config.mqtt_url, &mqtt_client_config, move |handler| {
match handler {
Err(err) => println!("Ignoring damaged message {}", err),
core::result::Result::Ok(event) => {
match event {
embedded_svc::mqtt::client::Event::Received(msg) => {
let data = String::from_utf8_lossy(msg.data());
if let Some(topic) = msg.topic() {
//todo use enums
if topic.eq(round_trip_topic_copy.as_str()) {
round_trip_ok_copy
.store(true, std::sync::atomic::Ordering::Relaxed);
} else if topic.eq(stay_alive_topic_copy.as_str()) {
let value = data.eq_ignore_ascii_case("true")
|| data.eq_ignore_ascii_case("1");
println!("Received stay alive with value {}", value);
STAY_ALIVE
.store(value, std::sync::atomic::Ordering::Relaxed);
} else {
println!("Unknown topic recieved {}", topic);
}
}
}
_ => {}
}
}
}
})?;
//subscribe to roundtrip
client.subscribe(round_trip_topic.as_str(), ExactlyOnce)?;
client.subscribe(stay_alive_topic.as_str(), ExactlyOnce)?;
//publish to roundtrip
client.publish(
round_trip_topic.as_str(),
ExactlyOnce,
false,
"online_test".as_bytes(),
)?;
let wait_for_roundtrip = 0;
while wait_for_roundtrip < 100 {
match round_trip_ok.load(std::sync::atomic::Ordering::Relaxed) {
true => {
println!("Round trip registered, proceeding");
self.mqtt_client = Some(client);
return Ok(());
}
false => {
unsafe { vTaskDelay(10) };
}
}
}
bail!("Mqtt did not complete roundtrip in time");
}
}
impl CreatePlantHal<'_> for PlantHal {
fn create() -> Result<Mutex<PlantCtrlBoard<'static>>> {
let peripherals = Peripherals::take()?;
let clock = PinDriver::output(peripherals.pins.gpio21)?;
let latch = PinDriver::output(peripherals.pins.gpio22)?;
let data = PinDriver::output(peripherals.pins.gpio19)?;
let one_wire_pin = PinDriver::input_output_od(peripherals.pins.gpio4)?;
//TODO make to none if not possible to init
//init,reset rtc memory depending on cause
let reasons = ResetReason::get();
let reset_store = match reasons {
ResetReason::Software => false,
ResetReason::ExternalPin => false,
ResetReason::Watchdog => true,
ResetReason::Sdio => true,
ResetReason::Panic => true,
ResetReason::InterruptWatchdog => true,
ResetReason::PowerOn => true,
ResetReason::Unknown => true,
ResetReason::Brownout => true,
ResetReason::TaskWatchdog => true,
ResetReason::DeepSleep => false,
};
if reset_store {
println!("Clear and reinit RTC store");
unsafe {
LAST_WATERING_TIMESTAMP = [0; PLANT_COUNT];
CONSECUTIVE_WATERING_PLANT = [0; PLANT_COUNT];
LOW_VOLTAGE_DETECTED = false;
};
} else {
println!("Keeping RTC store");
}
let mut counter_unit1 = PcntDriver::new(
peripherals.pcnt0,
Some(peripherals.pins.gpio18),
Option::<AnyInputPin>::None,
Option::<AnyInputPin>::None,
Option::<AnyInputPin>::None,
)?;
println!("Channel config start");
counter_unit1.channel_config(
PcntChannel::Channel0,
PinIndex::Pin0,
PinIndex::Pin1,
&PcntChannelConfig {
lctrl_mode: PcntControlMode::Reverse,
hctrl_mode: PcntControlMode::Keep,
pos_mode: PcntCountMode::Decrement,
neg_mode: PcntCountMode::Increment,
counter_h_lim: i16::MAX,
counter_l_lim: 0,
},
)?;
println!("Setup filter");
//TODO validate filter value! currently max allowed value
counter_unit1.set_filter_value(1023)?;
counter_unit1.filter_enable()?;
println!("Wifi start");
let sys_loop = EspSystemEventLoop::take()?;
let nvs = EspDefaultNvsPartition::take()?;
let wifi_driver = EspWifi::new(peripherals.modem, sys_loop, Some(nvs))?;
let shift_register = ShiftRegister40::new(clock, latch, data);
let last_watering_timestamp = Mutex::new(unsafe { LAST_WATERING_TIMESTAMP });
let consecutive_watering_plant = Mutex::new(unsafe { CONSECUTIVE_WATERING_PLANT });
let low_voltage_detected = Mutex::new(unsafe { LOW_VOLTAGE_DETECTED });
let tank_driver =
AdcDriver::new(peripherals.adc1, &esp_idf_hal::adc::config::Config::new())?;
let tank_channel: AdcChannelDriver<'_, { attenuation::DB_11 }, Gpio39> =
AdcChannelDriver::new(peripherals.pins.gpio39)?;
let solar_is_day = PinDriver::input(peripherals.pins.gpio25)?;
let boot_button = PinDriver::input(peripherals.pins.gpio0)?;
let light = PinDriver::output(peripherals.pins.gpio26)?;
let main_pump = PinDriver::output(peripherals.pins.gpio23)?;
let tank_power = PinDriver::output(peripherals.pins.gpio27)?;
let general_fault = PinDriver::output(peripherals.pins.gpio13)?;
let one_wire_bus = OneWire::new(one_wire_pin)
.map_err(|err| -> anyhow::Error { anyhow!("Missing attribute: {:?}", err) })?;
println!("After stuff");
let rv = Mutex::new(PlantCtrlBoard {
shift_register,
last_watering_timestamp,
consecutive_watering_plant,
low_voltage_detected,
tank_driver,
tank_channel,
solar_is_day,
boot_button,
light,
main_pump,
tank_power,
general_fault,
one_wire_bus,
signal_counter: counter_unit1,
wifi_driver,
mqtt_client: None,
});
Ok(rv)
}
}

150
rust/src/sipo.rs Normal file
View File

@@ -0,0 +1,150 @@
//! Serial-in parallel-out shift register
use core::cell::RefCell;
use core::mem::{self, MaybeUninit};
use crate::hal::digital::v2::OutputPin;
trait ShiftRegisterInternal {
fn update(&self, index: usize, command: bool) -> Result<(), ()>;
}
/// Output pin of the shift register
pub struct ShiftRegisterPin<'a> {
shift_register: &'a dyn ShiftRegisterInternal,
index: usize,
}
impl<'a> ShiftRegisterPin<'a> {
fn new(shift_register: &'a dyn ShiftRegisterInternal, index: usize) -> Self {
ShiftRegisterPin {
shift_register,
index,
}
}
}
impl OutputPin for ShiftRegisterPin<'_> {
type Error = ();
fn set_low(&mut self) -> Result<(), Self::Error> {
self.shift_register.update(self.index, false)?;
Ok(())
}
fn set_high(&mut self) -> Result<(), Self::Error> {
self.shift_register.update(self.index, true)?;
Ok(())
}
}
macro_rules! ShiftRegisterBuilder {
($name: ident, $size: expr) => {
/// Serial-in parallel-out shift register
pub struct $name<Pin1, Pin2, Pin3>
where
Pin1: OutputPin,
Pin2: OutputPin,
Pin3: OutputPin,
{
clock: RefCell<Pin1>,
latch: RefCell<Pin2>,
data: RefCell<Pin3>,
output_state: RefCell<[bool; $size]>,
}
impl<Pin1, Pin2, Pin3> ShiftRegisterInternal for $name<Pin1, Pin2, Pin3>
where
Pin1: OutputPin,
Pin2: OutputPin,
Pin3: OutputPin,
{
/// Sets the value of the shift register output at `index` to value `command`
fn update(&self, index: usize, command: bool) -> Result<(), ()> {
self.output_state.borrow_mut()[index] = command;
let output_state = self.output_state.borrow();
self.latch.borrow_mut().set_low().map_err(|_e| ())?;
for i in 1..=output_state.len() {
if output_state[output_state.len() - i] {
self.data.borrow_mut().set_high().map_err(|_e| ())?;
} else {
self.data.borrow_mut().set_low().map_err(|_e| ())?;
}
self.clock.borrow_mut().set_high().map_err(|_e| ())?;
self.clock.borrow_mut().set_low().map_err(|_e| ())?;
}
self.latch.borrow_mut().set_high().map_err(|_e| ())?;
Ok(())
}
}
impl<Pin1, Pin2, Pin3> $name<Pin1, Pin2, Pin3>
where
Pin1: OutputPin,
Pin2: OutputPin,
Pin3: OutputPin,
{
/// Creates a new SIPO shift register from clock, latch, and data output pins
pub fn new(clock: Pin1, latch: Pin2, data: Pin3) -> Self {
$name {
clock: RefCell::new(clock),
latch: RefCell::new(latch),
data: RefCell::new(data),
output_state: RefCell::new([false; $size]),
}
}
/// Get embedded-hal output pins to control the shift register outputs
pub fn decompose(&self) -> [ShiftRegisterPin; $size] {
// Create an uninitialized array of `MaybeUninit`. The `assume_init` is
// safe because the type we are claiming to have initialized here is a
// bunch of `MaybeUninit`s, which do not require initialization.
let mut pins: [MaybeUninit<ShiftRegisterPin>; $size] =
unsafe { MaybeUninit::uninit().assume_init() };
// Dropping a `MaybeUninit` does nothing, so if there is a panic during this loop,
// we have a memory leak, but there is no memory safety issue.
for (index, elem) in pins.iter_mut().enumerate() {
elem.write(ShiftRegisterPin::new(self, index));
}
// Everything is initialized. Transmute the array to the
// initialized type.
unsafe { mem::transmute::<_, [ShiftRegisterPin; $size]>(pins) }
}
/// Consume the shift register and return the original clock, latch, and data output pins
pub fn release(self) -> (Pin1, Pin2, Pin3) {
let Self {
clock,
latch,
data,
output_state: _,
} = self;
(clock.into_inner(), latch.into_inner(), data.into_inner())
}
}
};
}
ShiftRegisterBuilder!(ShiftRegister8, 8);
ShiftRegisterBuilder!(ShiftRegister16, 16);
ShiftRegisterBuilder!(ShiftRegister24, 24);
ShiftRegisterBuilder!(ShiftRegister32, 32);
ShiftRegisterBuilder!(ShiftRegister40, 40);
ShiftRegisterBuilder!(ShiftRegister48, 48);
ShiftRegisterBuilder!(ShiftRegister56, 56);
ShiftRegisterBuilder!(ShiftRegister64, 64);
ShiftRegisterBuilder!(ShiftRegister72, 72);
ShiftRegisterBuilder!(ShiftRegister80, 80);
ShiftRegisterBuilder!(ShiftRegister88, 88);
ShiftRegisterBuilder!(ShiftRegister96, 96);
ShiftRegisterBuilder!(ShiftRegister104, 104);
ShiftRegisterBuilder!(ShiftRegister112, 112);
ShiftRegisterBuilder!(ShiftRegister120, 120);
ShiftRegisterBuilder!(ShiftRegister128, 128);
/// 8 output serial-in parallel-out shift register
pub type ShiftRegister<Pin1, Pin2, Pin3> = ShiftRegister8<Pin1, Pin2, Pin3>;

Some files were not shown because too many files have changed in this diff Show More