diff --git a/.gitignore b/.gitignore index 259148f..3f6ce35 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +# PlatformIO Files +.pio +.vscode + # Prerequisites *.d diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..7c486f1 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,67 @@ +# Continuous Integration (CI) is the practice, in software +# engineering, of merging all developer working copies with a shared mainline +# several times a day < https://docs.platformio.org/page/ci/index.html > +# +# Documentation: +# +# * Travis CI Embedded Builds with PlatformIO +# < https://docs.travis-ci.com/user/integration/platformio/ > +# +# * PlatformIO integration with Travis CI +# < https://docs.platformio.org/page/ci/travis.html > +# +# * User Guide for `platformio ci` command +# < https://docs.platformio.org/page/userguide/cmd_ci.html > +# +# +# Please choose one of the following templates (proposed below) and uncomment +# it (remove "# " before each line) or use own configuration according to the +# Travis CI documentation (see above). +# + + +# +# Template #1: General project. Test it using existing `platformio.ini`. +# + +# language: python +# python: +# - "2.7" +# +# sudo: false +# cache: +# directories: +# - "~/.platformio" +# +# install: +# - pip install -U platformio +# - platformio update +# +# script: +# - platformio run + + +# +# Template #2: The project is intended to be used as a library with examples. +# + +# language: python +# python: +# - "2.7" +# +# sudo: false +# cache: +# directories: +# - "~/.platformio" +# +# env: +# - PLATFORMIO_CI_SRC=path/to/test/file.c +# - PLATFORMIO_CI_SRC=examples/file.ino +# - PLATFORMIO_CI_SRC=path/to/test/directory +# +# install: +# - pip install -U platformio +# - platformio update +# +# script: +# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N diff --git a/README.md b/README.md new file mode 100644 index 0000000..052f1ca --- /dev/null +++ b/README.md @@ -0,0 +1,87 @@ +# ![BrewPi Legacy Remix Logo](https://raw.githubusercontent.com/brewpi-remix/brewpi-www-rmx/master/images/brewpi_logo.png) + +# BrewPi Family Arduino Uno Test + +This firmware will allow you to test the setup of your BrewPi family Arduino Uno. The program will: + +1. Turn the onboard LED on +1. Scan for an I2C device. If found, it will use A0 for sensor tests; otherwise, it will use the original A4 pin for sensors. If the program detects an I2C LCD, a test message will display +1. Check the OneWire + 1. Display if parasitic sensors are present on the bus + 1. Display the number and type of sensors found + 1. Display the address and current temperature for each sensor +1. Test the heat and cool relays (pins 5 and 6) +1. Clear the EEPROM to avoid issues saving the sensors later on + +# ![Arduino Uno Pin Diagram](ttps://raw.githubusercontent.com/brewpi-remix/uno-test/master/images//Arduino-Uno-Pin-Diagram.png) + +It will automatically check for an I2C display, and if found, will show a test on the display. It will then scan the proper pin for the variant; A4 if no I2C is detected, and A0 if an I2C is present. + +Results using a standard or parallel LCD system: + +``` +BrewPi Family Arduino Uno Test beginning. + +Scanning I2C bus. +No I2C devices found. +I2C scan complete. + +Checking 18 for OneWire devices. +Parasitic power is off for the OneWire bus on pin 18. +Detected 2 devices on pin 18. +Device 18:0 is a DS18B20 device. +Device 18:1 is a DS18B20 device. +Sensor: 18:0 Address: 28:EE:7E:28:2C:15:0:BB Temperature: 18.94°C +Sensor: 18:1 Address: 28:EE:B1:35:23:15:0:C Temperature: 21.62°C + +Testing relay pin 5. +Turning pin 5 on. +Turning pin 5 off. +Relay test on pin 5 complete. + +Testing relay pin 6. +Turning pin 6 on. +Turning pin 6 off. +Relay test on pin 6 complete. + +Clearing EEPROM. +EEPROM clear complete. + +BrewPi Family Arduino Uno Test complete. +``` + +Results using an I2C LCD system: + +``` +BrewPi Family Arduino Uno Test beginning. + +Scanning I2C bus. +I2C device found at address 0x3F. +Setting LCD display at 0x3F. +I2C scan complete. + +Checking 14 for OneWire devices. +Parasitic power is off for the OneWire bus on pin 14. +Detected 2 devices on pin 14. +Device 14:0 is a DS18B20 device. +Device 14:1 is a DS18B20 device. +Sensor: 14:0 Address: 28:EE:7E:28:2C:15:0:BB Temperature: 19.00°C +Sensor: 14:1 Address: 28:EE:B1:35:23:15:0:C Temperature: 19.31°C + +Testing relay pin 5. +Turning relay on pin 5 on. +Turning relay on pin 5 off. +Relay test on pin 5 complete. + +Testing relay pin 6. +Turning relay on pin 6 on. +Turning relay on pin 6 off. +Relay test on pin 6 complete. + +Clearing EEPROM. +EEPROM clear complete. + +BrewPi Family Arduino Uno Test complete. +``` + +# ![LCD Display](ttps://raw.githubusercontent.com/brewpi-remix/uno-test/master/images//i2c_test.jpg) diff --git a/data/index.htm b/data/index.htm new file mode 100644 index 0000000..b6baad5 --- /dev/null +++ b/data/index.htm @@ -0,0 +1,20 @@ + + + + + + + + Index + + + + + + + + + + + + diff --git a/data/scripts.js b/data/scripts.js new file mode 100644 index 0000000..e69de29 diff --git a/data/styles.css b/data/styles.css new file mode 100644 index 0000000..e69de29 diff --git a/firmware/firmware.hex b/firmware/firmware.hex new file mode 100644 index 0000000..7b69542 --- /dev/null +++ b/firmware/firmware.hex @@ -0,0 +1,770 @@ +:100000000C94B6010C94DE010C94DE010C94DE011C +:100010000C94DE010C94DE010C94DE010C94DE01E4 +:100020000C94DE010C94DE010C94DE010C94DE01D4 +:100030000C94DE010C94DE010C94DE010C94DE01C4 +:100040000C94190F0C94DE010C94E00F0C94BA0F71 +:100050000C94DE010C94DE010C94DE010C94DE01A4 +:100060000C94E3030C94DE01000000002300260042 +:10007000290053656E736F723A0925643A25640945 +:10008000416464726573733A2025783A25783A257D +:10009000783A25783A25783A25783A25783A2578B5 +:1000A0000954656D70657261747572653A202544F6 +:1000B000C2B0430A004465766963652025643A2529 +:1000C00064206973202573206465766963652E0A50 +:1000D00000446574656374656420256420646576F6 +:1000E00069636573206F6E2070696E2025642E0A27 +:1000F0000050617261736974696320706F77657213 +:1001000020697320257320666F7220746865204F04 +:100110006E655769726520627573206F6E20706915 +:100120006E2025642E0A000A436865636B696E675A +:1001300020256420666F72204F6E655769726520B6 +:10014000646576696365732E0A0052656C61792077 +:1001500074657374206F6E2070696E20256420634F +:100160006F6D706C6574652E0A005475726E696EE1 +:10017000672072656C6179206F6E2070696E202532 +:1001800064206F66662E0A005475726E696E672071 +:1001900072656C6179206F6E2070696E2025642015 +:1001A0006F6E2E0A000A54657374696E672072655B +:1001B0006C61792070696E2025642E0A00005EBC97 +:1001C000E2613FDD83C29C7E20A3FD1F41009D2391 +:1001D000BE46DB65F88C11AF32CA57E974000000E7 +:1001E00000240027002A0000000000250028002B22 +:1001F00000040404040404040402020202020203D0 +:1002000003030303030102040810204080010204D9 +:10021000081020010204081020000000080002015C +:100220000000030407000000000000000066616C8D +:10023000736500747275650053657474696E672028 +:100240004C434420646973706C617920617420258B +:10025000582E0A00493243207363616E20636F6D2C +:10026000706C6574652E0A004E6F2049324320641D +:1002700065766963657320666F756E642E0A005536 +:100280006E6B6E6F776E206572726F722066726F22 +:100290006D204932432064657669636520666F7519 +:1002A0006E642061742061646472657373202558E4 +:1002B0002E0A004932432064657669636520666FC3 +:1002C000756E6420617420616464726573732025A7 +:1002D000582E0A000A5363616E6E696E67204932B8 +:1002E00043206275732E0A00454550524F4D2063DE +:1002F0006C65617220636F6D706C6574652E0A00A9 +:100300000A436C656172696E6720454550524F4DD6 +:100310002E0A000A4272657750692046616D696C49 +:10032000792041726475696E6F20556E6F20546537 +:10033000737420636F6D706C6574652E0A000A42D9 +:1003400072657750692046616D696C7920417264ED +:1003500075696E6F20556E6F2054657374206265E9 +:1003600067696E6E696E672E0A00EB1211241FBE5C +:10037000CFEFD8E0DEBFCDBF23E0AAEEB1E001C0F1 +:100380001D92A336B207E1F711E0A0E0B1E0EAE187 +:10039000FFE202C005900D92AA3EB107D9F711E025 +:1003A000C6EBD1E004C02197FE010E94E314C53BD7 +:1003B000D107C9F70E947F100C948B170C94000092 +:1003C000FC01538D448D252F30E0842F90E0821B5B +:1003D000930B541710F0CF96089501970895FC01E0 +:1003E000918D828D981761F0828DDF01A80FB11D6C +:1003F0005D968C91928D9F5F9F73928F90E0089590 +:100400008FEF9FEF0895FC01918D828D981731F049 +:10041000828DE80FF11D858D90E008958FEF9FEF9D +:100420000895FC01918D228D892F90E0805C9F4F73 +:10043000821B91098F739927089580E090E0892BA2 +:1004400029F00E949D0E81110C94000008954091A6 +:100450002B02262F30E0240F311D21323105DCF430 +:10046000209174022430C9F4FC0180E090E08617EA +:1004700058F430912B022191DC01A55FBD4FA30FF1 +:10048000B11D2C930196F3CF80912B02680F6093DE +:100490002B0280E0089581E0089582E00895089598 +:1004A00008950895E091A3028091A202E81730F424 +:1004B000F0E0E651FE4F808190E008958FEF9FEFCE +:1004C00008959091A3028091A202981750F4E92F09 +:1004D000F0E0E651FE4F208130E09F5F9093A30251 +:1004E00002C02FEF3FEFC90108958091A20290E072 +:1004F0002091A302821B91090895CF92DF92EF927F +:10050000FF920F931F93CF93DF937C01CB018A015E +:1005100020917A02222389F0EB016B01C40ED51ED3 +:10052000CC15DD0569F06991D701ED91FC91019041 +:10053000F081E02DC7010995F3CF642F0E942702B7 +:10054000C801DF91CF911F910F91FF90EF90DF9045 +:10055000CF900895CF93DF931F92CDB7DEB7698315 +:1005600020917A022223D1F020919D02203240F086 +:1005700021E030E0FC013383228380E090E015C06D +:1005800080917B02E82FF0E0E458FD4F9981908341 +:100590008F5F80937B0280939D0205C061E0CE0156 +:1005A00001960E94270281E090E00F90DF91CF91A9 +:1005B0000895089580E090E00895FC01848DDF01A6 +:1005C000A80FB11DA35ABF4F2C91848D90E00196C6 +:1005D0008F739927848FA689B7892C93A089B189B5 +:1005E0008C91837080648C93938D848D981306C056 +:1005F0000288F389E02D80818F7D80830895CF93D9 +:10060000DF93EC01888D8823C9F0EA89FB8980811A +:1006100085FD05C0A889B9898C9186FD0FC00FB6EC +:1006200007FCF5CF808185FFF2CFA889B9898C912D +:1006300085FFEDCFCE010E94DD02E7CFDF91CF91A4 +:100640000895FC01248131E030937A0220939C02CA +:1006500010927B0210929D028385682B8AE493E0BE +:100660000E94AA020C94AA0B0F931F93CF938C01A4 +:10067000C62F0E9421036C2F6460C8010E942103D1 +:100680006C2F6B7FC8010E94210383EC90E00197DF +:10069000F1F7CF911F910F9108950F931F93CF936F +:1006A000DF938C01C62FD42F607F642B0E9434030C +:1006B00080E1C89FB00111246D2BC801DF91CF915B +:1006C0001F910F910C94340341E00E944D0381E08F +:1006D00090E00895ECEBF0E080818A7B808360E01D +:1006E00082E10E94AE0D60E083E10C94AE0D1092A9 +:1006F000740281E08093730210924E0261E082E105 +:100700000E94AE0D61E083E10E94AE0DE9EBF0E0E6 +:1007100080818E7F808380818D7F808388E4809339 +:10072000B80085E48093BC000895CF93DF9391E0F7 +:1007300090930A02882361F0C091B800D091BA006A +:100740000E946A030E947703D093BA00C093B80056 +:10075000DF91CF91089585ED8093BC008091760262 +:1007600090917702A0917802B09179020796A11D2D +:10077000B11D23E0B695A795979587952A95D1F752 +:100780002091BC0024FF1CC040917602509177025A +:100790006091780270917902452B462B472B81F3AB +:1007A0000097A105B10541F025E32A95F1F7000076 +:1007B0000197A109B109E4CF809175020C949503CA +:1007C0001092740208951F920F920FB60F92112487 +:1007D0002F933F934F935F936F937F938F939F9349 +:1007E000AF93BF93EF93FF938091B900887F8036DA +:1007F00009F49CC068F5883209F45BC090F480313C +:1008000009F454C038F4882309F4F6C0883009F498 +:100810004DC0F6C0883109F44CC0803209F45DC087 +:10082000EFC0803409F468C048F4803309F455C03F +:10083000883309F0E5C080937202D8C0803509F48E +:100840004FC0883509F45DC0883409F0D9C0D6C0DE +:10085000883909F4C7C0A8F4883709F467C038F4A8 +:10086000883609F463C0803709F460C0C9C088388D +:1008700009F4B8C0803909F45FC0803809F0C0C0FD +:100880005BC0803B09F486C038F4803A09F466C046 +:10089000883A09F47FC0B4C0803C09F4A7C0883C02 +:1008A00009F4A4C0883B09F48AC0AAC080914F0211 +:1008B00010C09091710280917002981770F5E091CC +:1008C000710281E08E0F80937102F0E0E05BFD4FDA +:1008D00080818093BB0085EC86C0809372028EC0BD +:1008E000E091710281E08E0F809371028091BB00D4 +:1008F000F0E0E05BFD4F8083909171028091700287 +:100900006EC0E091710281E08E0F80937102809140 +:10091000BB00F0E0E05BFD4F8083809173028111AA +:100920006DC081E080934E0284EA61C083E08093D1 +:10093000740210924D02CFCF80914D02803208F0A8 +:1009400051C0E0914D0281E08E0F80934D02809165 +:10095000BB00F0E0E35DFD4F8083BDCF85EC80936D +:10096000BC001092740280914D02803230F4E0910C +:100970004D02F0E0E35DFD4F108260914D0270E0AA +:10098000E0919E02F0919F028DE292E00995109213 +:100990004D0236C084E08093740210922C021092B3 +:1009A0002B02E091A002F091A102099580912B0207 +:1009B000811105C081E080932B0210920B02E0911F +:1009C0002C0281E08E0F80932C02F0E0E55FFD4F5A +:1009D00080818093BB0090912C0280912B0298170C +:1009E00008F479CF85E88093BC000AC085EC809339 +:1009F000BC001092740204C0109272020E94AB03F9 +:100A0000FF91EF91BF91AF919F918F917F916F91E6 +:100A10005F914F913F912F910F900FBE0F901F90BC +:100A20001895DC0180E0615098F02D91982F922765 +:100A3000E92FEF70F0E0E354FE4F249192959F7000 +:100A4000E92FF0E0E353FE4FE491822F8E27EBCFA6 +:100A50000895FC0190810180F281E02DF89481815C +:100A6000892B81832281892F809528232283A7E0E7 +:100A7000B0E01197F1F7218182238183A3E2B0E0F6 +:100A80001197F1F780817894EFECF0E03197F1F76E +:100A9000982381E009F480E00895FC0190810180B1 +:100AA000F281E02D892F809560FF12C0F894228199 +:100AB000822382838181892B8183A3E2B0E0119715 +:100AC000F1F78281982B9283789487ED90E011C0A2 +:100AD000F8942281822382838181892B8183AFEFE5 +:100AE000B0E01197F1F78281982B928378948FE090 +:100AF00090E00197F1F70895DF92EF92FF920F9344 +:100B00001F93CF93DF93EC01D62EE42E08E010E084 +:100B1000FF24F39461E08D2D8F2109F460E0CE0174 +:100B20000E944D05FF0C01501109A1F7E11010C002 +:100B3000F894E981FA819181888180958923818364 +:100B4000E981FA81928188818095892382837894D2 +:100B5000DF91CF911F910F91FF90EF90DF9008955B +:100B6000EF92FF920F931F93CF93DF938C017B0142 +:100B700040E065E50E947C05E70188E0E80EF11C95 +:100B8000699140E0C8010E947C05CE15DF05C1F7E0 +:100B9000DF91CF911F910F91FF90EF900895DC01AD +:100BA0002C911196ED91FC911297F8948181922FDE +:100BB00090958923818378948DE743E050E08150BC +:100BC00021F1DA011197F1F730813223C1F3F89462 +:100BD0008281892382838181822B81837894ABE710 +:100BE000B7E01197F1F7F89481819823918383E11D +:100BF00091E00197F1F78081282381E009F080E0FE +:100C00007894E3E6F6E03197F1F708954F925F921A +:100C10006F927F928F929F92AF92BF92CF92DF920C +:100C2000EF92FF920F931F93CF93DF938C017B0181 +:100C3000EA01FC01818592850E94CF05882309F491 +:100C400043C0B701F801818592850E94B00540E05C +:100C50006EEBF801818592850E947C057E015E0124 +:100C6000F9E0AF0EB11C6E01F8016184728488E076 +:100C7000882E912C512C44244394C3010E942905B1 +:100C800081115428440CF1E08F1A9108B1F7F60154 +:100C900051926F01AE16BF0639F7F8018185928532 +:100CA0000E94CF05813081F4F70181917F0181118C +:100CB00004C0EA15FB05C1F707C068E0CE010E9439 +:100CC000110591E02885281390E0892FDF91CF91BD +:100CD0001F910F91FF90EF90DF90CF90BF90AF905A +:100CE0009F908F907F906F905F904F900895FF92AC +:100CF0000F931F93CF93DF93182FF92E9F938F930A +:100D000085EA91E09F938F931F9204E00F93C6E5CD +:100D1000D3E0DF93CF930E94920961E0812F0E947C +:100D2000FB0D61E0812F0E94AE0D68EE73E080E064 +:100D300090E00E94370EFF921F9388E891E09F9306 +:100D40008F931F920F93DF93CF930E94920960E0DD +:100D5000812F0E94AE0D68EE73E080E090E00E946B +:100D6000370EFF921F938AE691E09F938F931F9215 +:100D70000F93DF93CF930E9492096AEF70E080E0B7 +:100D800090E00E94370E61E0812F0E94AE0DFF922D +:100D90001F938AE491E09F938F931F920F93DF93A9 +:100DA000CF930E9492098DB79EB780960FB6F894A4 +:100DB0009EBF0FBE8DBFDF91CF911F910F91FF900E +:100DC00008954F925F926F927F928F929F92AF920F +:100DD000BF92CF92DF92EF92FF920F931F93CF9328 +:100DE000DF93CDB7DEB7EE970FB6F894DEBF0FBE38 +:100DF000CDBF8C011F938F9387E291E09F938F93D8 +:100E00001F9284E08F9386E593E09F938F930E94D7 +:100E1000920960E0802F0E94FB0DC8019927FC0118 +:100E2000EB5FFD4FE491E88FFC01EF50FE4FE49142 +:100E3000F0E0EE0FFF1FE859FF4F859194919A8FD4 +:100E4000898F1BA21DA21CA2FE01B3969E01255EE6 +:100E50003F4F0FB6F894DEBF0FBECDBFDF011E922D +:100E6000A217B307E1F71F8A1E8A1A82CE0148969D +:100E70009B878A8718861986198289E08C8381E08E +:100E80008D838E838F831292E217F307E1F7FF249D +:100E9000F394BE01615D7F4F8A859B850E94C50CDE +:100EA0008823E1F067E0CE018F960E9411059EA98C +:100EB0008913EFCF88858F5F88878FA5883209F4E3 +:100EC000CDC130F4803109F4C9C1823211F7C6C1F5 +:100ED0008B3309F4C3C18234E1F6C0C18981882310 +:100EE00019F080E591E002C083E591E01F930F9334 +:100EF0009F938F9381EF90E09F938F931F9294E045 +:100F0000D92EDF9226E5E22E23E0F22EFF92EF9219 +:100F10000E9492091F930F9388851F928F9381EDF2 +:100F200090E09F938F931F92DF92FF92EF920E9427 +:100F300092090FB6F894DEBF0FBECDBFE12CF12CA5 +:100F400035EBC32E30E0D32E44E0942E56E5A52E8B +:100F500053E0B52E888590E0E816F9060CF05EC0E7 +:100F60004E2DBE01695C7F4FCE0101960E94470D58 +:100F70001FA21EA219A618A61BA61AA660E070E062 +:100F8000CE0186960E94630F811105C0CE01869620 +:100F90000E948A0F08C01BA61AA66AEA71E08EA1F9 +:100FA0009FA10E9484178FA9823281F028F480319A +:100FB00081F467E571E00FC0883229F08B3349F482 +:100FC00064E771E008C061E671E005C06BE671E0BE +:100FD00002C06DE771E0CE0186960E94820D8FA15E +:100FE0008F938EA18F93FF92EF921F930F93DF92B7 +:100FF000CF921F929F92BF92AF920E9492098EA1B0 +:101000009FA10FB6F894DEBF0FBECDBF009711F0C1 +:101010000E9427163FEFE31AF30A9CCF68EE73E0B5 +:1010200080E090E00E94370E8A859B850E94CF0564 +:1010300040E06CEC8A859B850E947C05498164E4D4 +:101040008A859B850E947C058D81882309F450C088 +:10105000EC818E81882349F18981811126C08FB767 +:10106000F894C090A402D090A502E090A602F0905F +:10107000A7028FBF8A859B850E9429058130C1F117 +:101080002FB7F8948091A4029091A502A091A60296 +:10109000B091A7022FBF8C199D09AE09BF098E3EE2 +:1010A0009240A105B10530F323C0E950E33040F48C +:1010B000F0E0EE0FFF1FEA5FFE4F8081918102C0DA +:1010C0008EEE92E06C01990FEE08FF088A8188236A +:1010D00021F060E08B810E94AE0DC701B6010E9435 +:1010E000370E8A81882321F061E08B810E94AE0D4A +:1010F0006EEE72E080E090E00E94370EE12CF12C61 +:10110000F2E7AF2EF0E0BF2EA4E09A2EB6E5CB2E8C +:10111000B3E0DB2E888590E0E816F9060CF0EBC012 +:101120008E2C4E2DBE01615D7F4FCE0101960E9437 +:10113000470D811107C0712C612C7EEF572EE2EC18 +:101140004E2E53C0AE014A5D5F4FBE01615D7F4FC1 +:10115000CE0101960E940606882371F12FA130E08E +:10116000C901982F8827990F990F990F6EA158E000 +:10117000659FB00111249C01262B372B8FA5803150 +:10118000F1F46DA56623D9F070E08CA5AB01481B86 +:101190005109CA019695982F8827979587950E949F +:1011A000991460527109207F53E0220F331F5A9522 +:1011B000E1F7620F731F04C060E874EE01C0B9016B +:1011C000613854EE75070CF4B6CF072E000C880B6F +:1011D000990B0E94371320E030E040E05CE30E946E +:1011E0009613762E672E582E492E482DBE016A5D25 +:1011F0007F4FCE0101960E94470D4F925F926F92F2 +:101200007F928DA51F928F938CA51F928F938BA594 +:101210001F928F938AA51F928F9389A51F928F93F8 +:1012200088A51F928F938FA11F928F938EA11F92DB +:101230008F93FF92EF921F930F93BF92AF921F92E3 +:101240009F92DF92CF920E9492098FEFE81AF80ADC +:101250000FB6F894DEBF0FBECDBF5CCF89858F5F20 +:101260008987898181111CC08A859B850E94CF0551 +:10127000BE01615D7F4F8A859B850E94B00540E07D +:1012800064EB8A859B850E947C058A859B850E94EC +:101290002905E82E8A859B850E94CF05EE2049F11D +:1012A0008FA58031F9F0AE014A5D5F4FBE01615DEF +:1012B0007F4FCE0101960E940606882379F08AA509 +:1012C0008F3351F020F48F3149F489E00CC08F3511 +:1012D00039F08F3739F002C08AE005C080E003C0E2 +:1012E0008BE001C08CE09C81981708F0D2CD8C83F4 +:1012F000D0CDF982D5CFEE960FB6F894DEBF0FBEF3 +:10130000CDBFDF91CF911F910F91FF90EF90DF90B4 +:10131000CF90BF90AF909F908F907F906F905F9095 +:101320004F9008954F925F926F927F928F929F920B +:10133000AF92BF92CF92DF92EF92FF920F931F93E3 +:10134000CF93DF93CDB7DEB727970FB6F894DEBF04 +:101350000FBECDBF0C8D1D8DCE8CDF8C80915603C2 +:1013600090915703801791070CF4DDC1E0915B0366 +:10137000F0915C03309729F08091590390915A03C2 +:101380000995809158038823D9F087E0E1EAF1E0DC +:10139000DE01119601900D928A95E1F7FE01E00FB2 +:1013A000F11F60818091590390915A030E949C0F14 +:1013B00068E871E08091590390915A030E94B80F38 +:1013C0008E01005E1F4F76018FEFE81AF80AF601D2 +:1013D0006491662309F49CC1653209F08DC16701EF +:1013E000FFEFCF1ADF0AF7018491882309F48BC13C +:1013F000853239F48091590390915A030E949C0FD1 +:1014000082C1833761F47801F2E0EF0EF11CF8013C +:10141000608171818091590390915A0352C1833543 +:1014200061F47801F2E0EF0EF11CF8016081718146 +:101430008091590390915A035CC1843611F089362A +:1014400081F47801F2E0EF0EF11CF80180809180C8 +:101450000091590310915A03092C000CAA08BB08EB +:10146000F8C0982F9D7F943409F0ACC07801F4E067 +:10147000EF0EF11CF80180809180A280B380009172 +:10148000590310915A03A5019401C501B4010E94AA +:101490008A15882339F06BE871E0C8010E94A30F18 +:1014A000870131C124013501E89477F82FEF3FEF30 +:1014B0004FE75FE7C301B2010E948A1581110DC099 +:1014C0002FEF3FEF4FE75FE7C301B2010E943013F8 +:1014D00018161CF46FE871E0E0CF2FEF3FEF4FE7F5 +:1014E0005FE4C501B4010E948515181654F02FEF72 +:1014F0003FEF4FE75FECC501B4010E94301387FF57 +:1015000003C063E971E0C9CF20E030E0A901C50163 +:10151000B4010E94301387FF08C06DE2C8010E9429 +:101520009C0FB7FAB094B7F8B0942AE037ED43EACD +:101530005BE3C501B4010E94EA142B013C010E9447 +:1015400056154B015C010E9435139B01AC01C30190 +:10155000B2010E94E9142B013C012AE0B501A4016B +:10156000C8010E9412106EE2C8010E949C0F20E088 +:1015700030E040E251E4C301B2010E9496132B0116 +:101580003C010E9456154B01A12CB12C2AE0B5015B +:10159000A401C8010E941210C501B4010E943513B4 +:1015A0009B01AC01C301B2010E94E91420E030E0CC +:1015B00040E251E40E9496130E945615AB0160E090 +:1015C00070E059C0883751F08835A9F467E971E0B7 +:1015D0008091590390915A030E94B80F7801F2E06C +:1015E000EF0EF11CF80140815181052E000C660BB5 +:1015F000770B20E118C0823651F08234D9F46AE9C1 +:1016000071E08091590390915A030E94B80F7801BC +:10161000F2E0EF0EF11CF80140815181052E000C23 +:10162000660B770B22E08091590390915A030E9438 +:10163000121036CF8C3609F57801F4E0EF0EF11C6C +:10164000F80180809180A280B380009159031091AD +:101650005A03B7FC05C02AE0B501A401C801E7CFD1 +:101660006DE2C8010E949C0F44275527BA01481912 +:1016700059096A097B092AE0F1CF833669F47801B8 +:10168000F2E0EF0EF11CF801608180915903909116 +:101690005A030E949C0F04CF8437B1F47801F2E022 +:1016A000EF0EF11CF8012081318180915903909156 +:1016B0005A032130310519F46DE971E002C06FE978 +:1016C00071E00E94B80FECCE8435E9F47801F2E0C5 +:1016D000EF0EF11CF8012081318180915903909126 +:1016E0005A032130310519F463E372E002C06DE260 +:1016F00072E00E945B10D4CE8091590390915A03FE +:101700000E949C0F67017601FFEFEF1AFF0A5FCE80 +:10171000E0915D03F0915E03309729F080915903C9 +:1017200090915A03099527960FB6F894DEBF0FBE25 +:10173000CDBFDF91CF911F910F91FF90EF90DF9080 +:10174000CF90BF90AF909F908F907F906F905F9061 +:101750004F9008958F929F92AF92BF92CF92DF9257 +:10176000EF92FF920F931F93CF93DF9310919D02FF +:10177000113208F0C2C0D0919C020E94F40E6B019D +:101780007C01C0917402CC2311F18091760290917A +:101790007702A0917802B0917902892B8A2B8B2B4A +:1017A00081F30E94F40E8090760290907702A090D0 +:1017B0007802B0907902DC01CB018C199D09AE0949 +:1017C000BF0988169906AA06BB06D8F682C082E031 +:1017D0008093740281E0809373028FEF8093720292 +:1017E0001092710210937002ACE7B2E0E0E5F2E013 +:1017F00080E0181721F09D9191938F5FFACF10929E +:101800004F0290914F028D2F880F892B80934F02AA +:1018100080914E02813089F510924E020E94F40EA2 +:101820006B017C0180914F028093BB008091760216 +:1018300090917702A0917802B0917902892B8A2B3E +:101840008B2BA9F00E94F40E009176021091770282 +:101850002091780230917902DC01CB018C199D092D +:10186000AE09BF09081719072A073B0790F18091B5 +:10187000BC0083FDD7CF85EC01C085EE8093BC0012 +:101880000E94F40E6B017C0180917402823039F564 +:101890008091760290917702A0917802B0917902BE +:1018A000892B8A2B8B2B81F30E94F40E00917602F8 +:1018B000109177022091780230917902DC01CB01FE +:1018C0008C199D09AE09BF09081719072A073B079C +:1018D000D8F6809175020E949503C5E013C08091EF +:1018E00072028F3F79F080917202803241F08091D4 +:1018F0007202803331F0C4E005C0C1E003C0C2E031 +:1019000001C0C3E010927B0210929D0210927A02F5 +:101910008C2FDF91CF911F910F91FF90EF90DF906F +:10192000CF90BF90AF909F908F900895CF93DF930B +:10193000CDB7DEB728970FB6F894DEBF0FBECDBF88 +:101940009C0188E0ECE0F1E0DE01119601900D923F +:101950008A95E1F7F9018085841710F44FEF480F5D +:10196000FE013196E40FF11DE40FF11D9081690F26 +:10197000606840E0C90128960FB6F894DEBF0FBE3C +:10198000CDBFDF91CF910C944D03BF92CF92DF92E8 +:10199000EF92FF920F931F93CF93DF93EC016B01B4 +:1019A0008D85811105C0CE010E94CF05811105C032 +:1019B0001B861D861C8680E060C040E060EFCE0183 +:1019C0000E947C0501E0E12CB12C11E0CE010E94C7 +:1019D0002905F82ECE010E94290591E0F91203C0D5 +:1019E0008130B1F434C02E2D30E0F8121BC08B854D +:1019F000181738F4FE01E20FF31F8381802341F4AE +:101A000002C0811729F0F12C193058F41C8709C045 +:101A1000FE01EE0DF11D8381802B8383FF24F3945F +:101A200009C0B12EFE01E20FF31F9381802F809534 +:101A3000892383836F2DCE010E944D051F5F000F08 +:101A400011F4E39401E087E08E1508F0BFCF113464 +:101A500008F4AECFBB86B11002C081E08D878B81C8 +:101A6000882309F4A5CFDE011396F6012B968D91FC +:101A70008193CA17DB07D9F781E0DF91CF911F91DE +:101A80000F91FF90EF90DF90CF90BF900895DF927D +:101A9000EF92FF920F931F93CF93DF937C018B0103 +:101AA000D42EDC011996ED91FC911A9713861586B8 +:101AB0001486DF011B9633961E92EA17FB07E1F7A7 +:101AC000C0E0B801F701818592850E94C50CD82F2E +:101AD000882371F0DC1209C067E0C8010E9411057B +:101AE000D80117969C91891721F0CF5FDC1648F733 +:101AF000D0E08D2FDF91CF911F910F91FF90EF904C +:101B0000DF900895EF92FF920F931F93CF93DF938F +:101B10008C017B016115710569F0FB0101900020CA +:101B2000E9F73197EF01C61BD70BBE010E94630F87 +:101B3000811104C0C8010E948A0F08C0F801D58332 +:101B4000C483B701808191810E948417C801DF910D +:101B5000CF911F910F91FF90EF90089590E0FC01BD +:101B6000E75EFD4F2491FC01EB5FFD4F3491FC01DA +:101B7000EF50FE4FE491EE2309F43CC0222339F1EB +:101B8000233091F038F42130A9F0223001F584B5EA +:101B90008F7D12C0273091F02830A1F02430B9F4A5 +:101BA000809180008F7D03C0809180008F7780932B +:101BB00080000DC084B58F7784BD09C08091B000CE +:101BC0008F7703C08091B0008F7D8093B000F0E0EC +:101BD000EE0FFF1FE951FE4FA591B4919FB7F89406 +:101BE000611104C08C913095382302C0EC913E2BDA +:101BF0003C939FBF0895CF93DF9390E0FC01EB5F90 +:101C0000FD4F2491FC01EF50FE4F8491882361F138 +:101C100090E0880F991FFC01E352FE4FC591D491CB +:101C2000FC01E951FE4FA591B491611109C09FB724 +:101C3000F8948881209582238883EC912E230BC011 +:101C4000623061F49FB7F8948881322F30958323F6 +:101C50008883EC912E2B2C939FBF06C08FB7F894EE +:101C6000E8812E2B28838FBFDF91CF9108958F922B +:101C70009F92AF92BF92CF92DF92EF92FF926B0151 +:101C80007C010E94F40E4B015C01C114D104E104FB +:101C9000F104F1F00E94F40EDC01CB0188199909DE +:101CA000AA09BB09883E9340A105B10570F321E064 +:101CB000C21AD108E108F10888EE880E83E0981E68 +:101CC000A11CB11CC114D104E104F10419F7DDCF4A +:101CD000FF90EF90DF90CF90BF90AF909F908F904C +:101CE0000895CF92DF92EF92FF920F931F93CF93BD +:101CF000DF936C017A018B01C0E0D0E0CE15DF05E7 +:101D000081F0D8016D918D01D601ED91FC9101908A +:101D1000F081E02DC6010995892B11F02196EECFB7 +:101D20007E01C701DF91CF911F910F91FF90EF903E +:101D3000DF90CF9008950E9476178DEA92E00E947E +:101D4000110221E0892B09F420E0822F0895EF92FF +:101D5000FF920F931F93CF93DF93EC0181E0888F65 +:101D60009B8D8C8D981305C0E889F989808185FD4C +:101D700026C0F62E0B8D10E00F5F1F4F0F7311273B +:101D8000E02E8C8DE8120CC00FB607FCFACFE88964 +:101D9000F989808185FFF5CFCE010E94DD02F1CF68 +:101DA0008B8DFE01E80FF11DE35AFF4FF0829FB7C4 +:101DB000F8940B8FEA89FB89808180620AC09FB703 +:101DC000F894EE89FF896083E889F98980818370BE +:101DD000806480839FBF81E090E0DF91CF911F916D +:101DE0000F91FF90EF9008953FB7F8948091A9026A +:101DF0009091AA02A091AB02B091AC0226B5A89B2B +:101E000005C02F3F19F00196A11DB11D3FBFBA2F8C +:101E1000A92F982F8827820F911DA11DB11DBC01EC +:101E2000CD0142E0660F771F881F991F4A95D1F7B1 +:101E300008951F920F920FB60F9211242F933F9384 +:101E40008F939F93AF93BF938091A4029091A5022B +:101E5000A091A602B091A7023091A80223E0230F1F +:101E60002D3720F40196A11DB11D05C026E8230FD2 +:101E70000296A11DB11D2093A8028093A402909305 +:101E8000A502A093A602B093A7028091A902909107 +:101E9000AA02A091AB02B091AC020196A11DB11DA6 +:101EA0008093A9029093AA02A093AB02B093AC02D4 +:101EB000BF91AF919F918F913F912F910F900FBE46 +:101EC0000F901F9018950F931F93CF93DF93EC0102 +:101ED00088819981009729F02A813B81261737074D +:101EE00088F48B016F5F7F4F0E94B016009761F0FE +:101EF000998388831B830A832C813D81232B11F4D2 +:101F0000FC01108281E001C080E0DF91CF911F9140 +:101F10000F910895CF93DF93EC0188819981009709 +:101F200011F00E942716198218821D821C821B82C2 +:101F30001A82DF91CF910895DC01ED91FC9101901F +:101F4000F081E02D09946115710579F0FB01019094 +:101F50000020E9F73197AF01461B570BDC01ED91EB +:101F6000FC910280F381E02D099480E090E00895D7 +:101F70000C94A30F1F920F920FB60F9211242F9360 +:101F80003F934F935F936F937F938F939F93AF9301 +:101F9000BF93EF93FF938DEA92E00E94DD02FF91E1 +:101FA000EF91BF91AF919F918F917F916F915F91D1 +:101FB0004F913F912F910F900FBE0F901F9018954A +:101FC0001F920F920FB60F9211242F938F939F930E +:101FD000EF93FF93E091BD02F091BE028081E0910A +:101FE000C302F091C40282FD12C090818091C602AA +:101FF0008F5F8F732091C702821751F0E091C60264 +:10200000F0E0E355FD4F958F8093C60201C08081BB +:10201000FF91EF919F918F912F910F900FBE0F9095 +:102020001F9018958F929F92AF92BF92EF92FF925E +:102030000F931F93CF93DF93CDB7DEB7A1970FB662 +:10204000F894DEBF0FBECDBF7C01FA01CB0119A20F +:10205000223008F42AE08E010F5D1F4F822E912C52 +:10206000A12CB12CBF01A50194010E94AD14F9016E +:10207000CA01015011096A3014F4605D01C0695C45 +:10208000D8016C93232B242B252B61F7B801C701B2 +:102090000E94A30FA1960FB6F894DEBF0FBECDBF6E +:1020A000DF91CF911F910F91FF90EF90BF90AF9074 +:1020B0009F908F900895EF92FF920F931F93CF936D +:1020C000DF938C017B01C0E0D0E0F701EC0FFD1F36 +:1020D0006491662361F0D801ED91FC910190F0814B +:1020E000E02DC8010995892B11F02196EECFCE0184 +:1020F000DF91CF911F910F91FF90EF900895CF93B3 +:10210000DF93CDB7DEB72C970FB6F894DEBF0FBEC6 +:10211000CDBF789484B5826084BD84B5816084BD70 +:1021200085B5826085BD85B5816085BD80916E0075 +:10213000816080936E0010928100809181008260A6 +:1021400080938100809181008160809381008091E3 +:1021500080008160809380008091B10084608093D2 +:10216000B1008091B00081608093B00080917A00CE +:10217000846080937A0080917A00826080937A00F4 +:1021800080917A00816080937A0080917A008068E3 +:1021900080937A001092C100E091BD02F091BE02DE +:1021A00082E08083E091B902F091BA021082E0915E +:1021B000BB02F091BC028FEC80831092C502E091CB +:1021C000C102F091C20286E0F82EF082E091BF02D7 +:1021D000F091C002808180618083E091BF02F09124 +:1021E000C002808188608083E091BF02F091C002CC +:1021F000808180688083E091BF02F091C00280817D +:102200008F7D80838DEA92E00E94FF0206E513E055 +:1022100086E090E090935703809356031092580302 +:102220008DEA92E090935A038093590368EA71E033 +:102230000E94A30F61E08DE00E94FB0D61E08DE044 +:102240000E94AE0D8EE393E09F938F931F92FF92B7 +:102250001F930F930E9492091092A3021092A20260 +:1022600010927B0210929D020E9477038FE492E00D +:102270009093A1028093A00280E592E090939F0248 +:1022800080939E0284ED92E09F938F931F9284E04F +:102290008F931F930F930E9492090FB6F894DEBF9D +:1022A0000FBECDBF01E010E0E12CF12C6624639459 +:1022B0009FE7A92E92E0B92E26E5C22E23E0D22E6A +:1022C00033EB832E32E0932E44E0542E60927A0258 +:1022D00000939C0210927B0210929D020E94AA0B16 +:1022E000811114C01F930F939F928F921F925F9240 +:1022F000DF92CF920E9492093FEFE31AF30A0FB6E2 +:10230000F894DEBF0FBECDBF702E11C0843079F4BB +:102310001F930F93BF92AF921F928F93DF92CF9232 +:102320000E9492090FB6F894DEBF0FBECDBF0F5FBB +:102330001F4F0F37110551F60E946A03E114F10493 +:10234000A1F488E692E09F938F931F9284E08F938D +:1023500086E593E09F938F930E9492090F900F90D0 +:102360000F900F900F900F90CFC01F927F9288E335 +:1023700092E09F938F931F9214E01F9386E593E062 +:102380009F938F930E9492091C821B8288E191E0A7 +:102390009A8389837D8284E18A871B871C861092B9 +:1023A000A3021092A20210927B0210929D020E9440 +:1023B00077038FE492E09093A1028093A00280E5DE +:1023C00092E090939F0280939E021E828B850FB6AF +:1023D000F894DEBF0FBECDBF823010F098E09E8330 +:1023E000898762E370E080E090E00E94370E6C85A0 +:1023F000CE0101960E94210368EE73E080E090E038 +:102400000E94370E60E3CE0101960E9434030BE474 +:1024100016E4C8010197F1F760E3CE0101960E942E +:102420003403C8010197F1F760E3CE0101960E94E1 +:10243000340383E592E00197F1F760E2CE01019663 +:102440000E9434036E81606240E0CE0101960E94DA +:102450004D0384E08F8340E06CE0CE0101960E9442 +:102460004D0340E061E0CE0101960E944D030BE375 +:102470001FE1C8010197F1F782E0888740E066E03C +:10248000CE0101960E944D0340E062E0CE0101962C +:102490000E944D03C8010197F1F788E08C8760E046 +:1024A000CE0101960E94210340E061E0CE01019639 +:1024B0000E94960C6BEA71E0CE0101960E94B80F63 +:1024C00041E060E0CE0101960E94960C6EEB71E057 +:1024D000CE0101960E94B80F42E067E0CE0101965E +:1024E0000E94960C62ED71E0CE0101960E94B80F39 +:1024F00043E062E0CE0101960E94960C69ED71E026 +:10250000CE0101960E94B80F84E592E09F938F93CD +:102510001F9284E08F9386E593E09F938F930E94B0 +:1025200092090F900F900F900F900F900F90EF283F +:1025300019F08EE090E002C082E190E00E94E10696 +:1025400085E090E00E94770686E090E00E947706A2 +:1025500080E093E09F938F931F9284E08F9386E5B2 +:1025600093E09F938F930E9492090F900F900F908A +:102570000F900F900F9000E010E060E0C8010E9403 +:1025800054140F5F1F4F011534E01307B1F788EEA5 +:1025900092E09F938F931F9284E08F9306E513E060 +:1025A0001F930F930E94920960E08DE00E94AE0D90 +:1025B00083E193E09F938F931F9286E08F931F9305 +:1025C0000F930E9492090FB6F894DEBF0FBECDBFE5 +:1025D0000E941D02FDCFEDEAF2E01382128288EE26 +:1025E00093E0A0E0B0E084839583A683B78324E2E0 +:1025F00031E03183208325EC30E03587248724ECDB +:1026000030E03787268720EC30E0318B208B21ECBF +:1026100030E0338B228B22EC30E0358B248B26ECA0 +:1026200030E0378B268B118E128E138E148EEAE4D7 +:10263000F3E01382128284839583A683B78382E4B6 +:1026400091E091838083E6E5F3E01182108281E0DE +:10265000828314821382168215821086178208954F +:102660000E94721308F481E00895E89409C097FB72 +:102670003EF490958095709561957F4F8F4F9F4F59 +:102680009923A9F0F92F96E9BB279395F69587959D +:1026900077956795B795F111F8CFFAF4BB0F11F460 +:1026A00060FF1BC06F5F7F4F8F4F9F4F16C0882307 +:1026B00011F096E911C0772321F09EE8872F762F3D +:1026C00005C0662371F096E8862F70E060E02AF07E +:1026D0009A95660F771F881FDAF7880F969587956A +:1026E00097F90895990F0008550FAA0BE0E8FEEF3F +:1026F00016161706E807F907C0F012161306E407C6 +:10270000F50798F0621B730B840B950B39F40A26BE +:1027100061F0232B242B252B21F408950A2609F49C +:10272000A140A6958FEF811D811D08950E94A913D8 +:102730000C941A140E940C1438F00E94131420F008 +:10274000952311F00C9403140C94091411240C9487 +:102750004E140E942B1470F3959FC1F3950F50E017 +:10276000551F629FF001729FBB27F00DB11D639F43 +:10277000AA27F00DB11DAA1F649F6627B00DA11DE9 +:10278000661F829F2227B00DA11D621F739FB00D8F +:10279000A11D621F839FA00D611D221F749F3327FF +:1027A000A00D611D231F849F600D211D822F762F98 +:1027B0006A2F11249F5750409AF0F1F088234AF075 +:1027C000EE0FFF1FBB1F661F771F881F91505040E1 +:1027D000A9F79E3F510580F00C9403140C944E14FD +:1027E0005F3FE4F3983ED4F3869577956795B79568 +:1027F000F795E7959F5FC1F7FE2B880F911D969582 +:10280000879597F9089597F99F6780E870E060E0F1 +:1028100008959FEF80EC089500240A941616170679 +:1028200018060906089500240A94121613061406C1 +:1028300005060895092E0394000C11F4882352F024 +:10284000BB0F40F4BF2B11F460FF04C06F5F7F4FDC +:102850008F4F9F4F089557FD9058440F551F59F0C3 +:102860005F3F71F04795880F97FB991F61F09F3F7D +:1028700079F087950895121613061406551FF2CFA6 +:102880004695F1DF08C0161617061806991FF1CFF6 +:1028900086957105610508940895E894BB2766271D +:1028A0007727CB0197F90895262FF999FECF1FBA04 +:1028B00092BD81BD20BD0FB6F894FA9AF99A0FBE69 +:1028C000019608952F923F924F925F926F927F925E +:1028D0008F929F92AF92BF92CF92DF92EF92FF9230 +:1028E0000F931F93CF93DF93CDB7DEB7CA1BDB0BDC +:1028F0000FB6F894DEBF0FBECDBF09942A88398881 +:1029000048885F846E847D848C849B84AA84B98487 +:10291000C884DF80EE80FD800C811B81AA81B98193 +:10292000CE0FD11D0FB6F894DEBF0FBECDBFED01A7 +:10293000089597FB072E16F4009407D077FD09D071 +:102940000E94CF1407FC05D03EF4909581959F4FCF +:102950000895709561957F4F0895A1E21A2EAA1BE4 +:10296000BB1BFD010DC0AA1FBB1FEE1FFF1FA2173F +:10297000B307E407F50720F0A21BB30BE40BF50B3C +:10298000661F771F881F991F1A9469F760957095C5 +:10299000809590959B01AC01BD01CF010895AA1BC4 +:1029A000BB1B51E107C0AA1FBB1FA617B70710F03A +:1029B000A61BB70B881F991F5A95A9F7809590956C +:1029C000BC01CD010895EE0FFF1F0590F491E02D9D +:1029D00009945058BB27AA270E9401150C941A1479 +:1029E0000E940C1438F00E94131420F039F49F3F19 +:1029F00019F426F40C9409140EF4E095E7FB0C94FA +:102A00000314E92F0E942B1458F3BA1762077307B7 +:102A10008407950720F079F4A6F50C944D140EF474 +:102A2000E0950B2EBA2FA02D0B01B90190010C01DE +:102A3000CA01A0011124FF27591B99F0593F50F4F6 +:102A4000503E68F11A16F040A22F232F342F44274E +:102A5000585FF3CF469537952795A795F040539546 +:102A6000C9F77EF41F16BA0B620B730B840BBAF016 +:102A70009150A1F0FF0FBB1F661F771F881FC2F781 +:102A80000EC0BA0F621F731F841F48F48795779595 +:102A90006795B795F7959E3F08F0B0CF9395880F4F +:102AA00008F09927EE0F9795879508950E943314A3 +:102AB00088F09F5798F0B92F9927B751B0F0E1F0FF +:102AC000660F771F881F991F1AF0BA95C9F714C0AF +:102AD000B13091F00E944D14B1E008950C944D1462 +:102AE000672F782F8827B85F39F0B93FCCF38695E8 +:102AF00077956795B395D9F73EF490958095709545 +:102B000061957F4F8F4F9F4F08950E94721308F475 +:102B10008FEF08950E947213880B990B08950F93FD +:102B20001F93CF93DF938230910510F482E090E001 +:102B3000E0916103F091620320E030E0A0E0B0E0BA +:102B4000309719F14081518102811381481759074B +:102B5000C8F08417950769F4109731F012960C931A +:102B6000129713961C9327C000936103109362037E +:102B700022C02115310519F04217530718F49A01A4 +:102B8000BD01EF01DF01F801DBCF21153105F9F0BF +:102B9000281B390B2430310580F48A819B81611513 +:102BA000710521F0FB019383828304C0909362033B +:102BB00080936103FE01329644C0FE01E20FF31FD1 +:102BC0008193919322503109398328833AC020910F +:102BD0005F0330916003232B41F420910201309177 +:102BE00003013093600320935F0320910001309133 +:102BF00001012115310541F42DB73EB74091040183 +:102C000050910501241B350BE0915F03F0916003A7 +:102C1000E217F307A0F42E1B3F0B2817390778F0B3 +:102C2000AC014E5F5F4F2417350748F04E0F5F1F12 +:102C30005093600340935F038193919302C0E0E05F +:102C4000F0E0CF01DF91CF911F910F910895CF93C5 +:102C5000DF93009709F481C0FC013297138212823E +:102C6000A0916103B0916203109781F420813181BA +:102C7000820F931F20915F0330916003281739075B +:102C800051F5F0936003E0935F0367C0ED0120E02E +:102C900030E0CE17DF0740F44A815B819E01411589 +:102CA0005105F1F0EA01F5CFD383C2834081518110 +:102CB000840F951FC817D90759F488819981840F0B +:102CC000951F0296918380838A819B81938382835F +:102CD0002115310529F4F0936203E09361033DC0AF +:102CE000E901FB83EA8349915991C40FD51FEC1781 +:102CF000FD0761F480819181840F951F0296E9019F +:102D000099838883828193819B838A83E0E0F0E0CA +:102D100012968D919C911397009719F0FD01DC019B +:102D2000F7CF8D919C9111979D012E5F3F4F820FA0 +:102D3000931F20915F03309160032817390769F4CE +:102D4000309729F4109262031092610302C013823B +:102D50001282B0936003A0935F03DF91CF91089537 +:102D6000A0E0B0E0E6EBF6E10C946614EC0100970D +:102D700021F4CB010E948F15B4C0FC01E60FF71FB0 +:102D80009C0122503109E217F30708F4A8C0D901C9 +:102D90000D911C91119706171707B0F0053011051A +:102DA00008F49BC0C80104978617970708F495C0DC +:102DB00002501109061B170B019311936D937C931D +:102DC000CF010E94271689C05B01A01AB10A4C01ED +:102DD000800E911EA0916103B0916203612C712C51 +:102DE000E12CF12C109709F446C08D919C9111971C +:102DF000A815B905B1F56C0142E0C40ED11CCA1486 +:102E0000DB0478F14C018A189B08640142E0C40E8F +:102E1000D11C1296BC9012971396AC91B5E0CB16CC +:102E2000D10440F0B282A38391828082D9016D9354 +:102E30007C9309C00E5F1F4F800F911FF901918392 +:102E40008083EB2DFA2FE114F10431F0D7011396B2 +:102E5000FC93EE93129741C0F0936203E0936103F9 +:102E60003CC06816790608F43C017D0112960D906D +:102E7000BC91A02DB7CF80915F039091600388161D +:102E80009906E1F466167706C8F4809100019091E6 +:102E90000101009741F48DB79EB740910401509114 +:102EA0000501841B950BE817F907C8F4F09360033C +:102EB000E0935F03F901718360830FC0CB010E942F +:102EC0008F157C01009759F0A801BE010E947B1765 +:102ED000CE010E942716C70104C0CE0102C080E0C7 +:102EE00090E0CDB7DEB7EEE00C94821481E090E084 +:102EF000F8940C948B17FB01DC0102C001900D9239 +:102F000041505040D8F70895FB01DC0101900D922B +:0A2F10000020E1F70895F894FFCFC8 +:102F1A000000630320005E00BC007701000040004F +:102F2A0014005400000000006403710EDA02D90292 +:102F3A0000000000A70E710EE001FF021102EF016E +:102F4A000302000000009B0E710EDA02D902000093 +:102F5A000000AA027D02DA025102750261025202DF +:102F6A006F6E006F66660061204453313853323009 +:102F7A0000612044533138423230006120445331D9 +:102F8A0038323200612044533138323500616E20C4 +:102F9A00756E6B6E6F776E003A20006E616E006917 +:102FAA006E66006F76660030780030620054004624 +:102FBA00004645574E5456000D0A0048656C6C6F22 +:102FCA002C20486F6D656272657765722100596FB2 +:102FDA0075722042726577506920446973706C611A +:102FEA007900576F726B732100406C627573737945 +:0A2FFA0020736179732068692100DB +:00000001FF diff --git a/images/Arduino-Uno-Pin-Diagram.png b/images/Arduino-Uno-Pin-Diagram.png new file mode 100644 index 0000000..74e2241 Binary files /dev/null and b/images/Arduino-Uno-Pin-Diagram.png differ diff --git a/images/i2c_test.jpg b/images/i2c_test.jpg new file mode 100644 index 0000000..46a2b56 Binary files /dev/null and b/images/i2c_test.jpg differ diff --git a/include/README b/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/lib/README b/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..2aac15a --- /dev/null +++ b/platformio.ini @@ -0,0 +1,94 @@ +; 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 + +[platformio] +; default_envs = heltec_wifi_kit_32 +; default_envs = d1_mini +; default_envs = lolin_d32 +default_envs = uno + +[common_env_data] +upload_speed = 115200 +monitor_speed = 9600 +framework = arduino +build_unflags = +build_flags = + -DBAUD=${common_env_data.monitor_speed} + ; -DDEBUG_ESP_PORT=Serial + ; -DDEBUG_ESP_WIFI + ; -DDEBUG_ESP_CORE + ; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY ; v2 Lower Memory (default) + ; -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH ; v2 Higher Bandwidth + ; -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY_LOW_FLASH ; v2 Lower Memory (no features) + ; -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH ; v2 Higher Bandwidth (no features) + ; -DPIO_FRAMEWORK_ARDUINO_LWIP2_IPV6_LOW_MEMORY ; v2 IPv6 Lower Memory + ; -DPIO_FRAMEWORK_ARDUINO_LWIP2_IPV6_HIGHER_BANDWIDTH ; v2 IPv6 Higher Bandwidth + ; -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH ; v1.4 Higher Bandwidth +lib_deps = + ArduinoLog + OneWire + DallasTemperature + https://github.com/brewpi-remix/LiquidCrystal_I2C +extra_scripts = +build_type = release +monitor_filters = + ; log2file + +[env:d1_mini] +upload_speed = ${common_env_data.upload_speed} +monitor_speed = ${common_env_data.monitor_speed} +framework = ${common_env_data.framework} +build_unflags = ${common_env_data.build_unflags} +build_flags = ${common_env_data.build_flags} +extra_scripts = ${common_env_data.extra_scripts} +lib_deps = ${common_env_data.lib_deps} +build_type = ${common_env_data.build_type} +monitor_filters = ${common_env_data.monitor_filters} +platform = espressif8266 +board = d1_mini + +[env:lolin_d32] +upload_speed = ${common_env_data.upload_speed} +monitor_speed = ${common_env_data.monitor_speed} +framework = ${common_env_data.framework} +build_unflags = ${common_env_data.build_unflags} +build_flags = ${common_env_data.build_flags} +extra_scripts = ${common_env_data.extra_scripts} +lib_deps = ${common_env_data.lib_deps} +build_type = ${common_env_data.build_type} +monitor_filters = ${common_env_data.monitor_filters} +platform = espressif32 +board = lolin_d32 + +[env:heltec_wifi_kit_32] +upload_speed = ${common_env_data.upload_speed} +monitor_speed = ${common_env_data.monitor_speed} +framework = ${common_env_data.framework} +build_unflags = ${common_env_data.build_unflags} +build_flags = ${common_env_data.build_flags} +extra_scripts = ${common_env_data.extra_scripts} +lib_deps = ${common_env_data.lib_deps} +build_type = ${common_env_data.build_type} +monitor_filters = ${common_env_data.monitor_filters} +platform = espressif32 +board = heltec_wifi_kit_32 + +[env:uno] +upload_speed = ${common_env_data.upload_speed} +monitor_speed = ${common_env_data.monitor_speed} +framework = ${common_env_data.framework} +build_unflags = ${common_env_data.build_unflags} +build_flags = ${common_env_data.build_flags} +extra_scripts = ${common_env_data.extra_scripts} +lib_deps = ${common_env_data.lib_deps} +build_type = ${common_env_data.build_type} +monitor_filters = ${common_env_data.monitor_filters} +platform = atmelavr +board = uno diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..cb0d707 --- /dev/null +++ b/src/config.h @@ -0,0 +1,13 @@ +#ifndef _CONFIG_H +#define _CONFIG_H + +#define LEDON HIGH +#define LEDOFF LOW +#define RELAYON LOW +#define RELAYOFF HIGH +#define NORMAL_PIN A4 +#define I2C_PIN A0 +#define HEATRELAY 5 +#define COOLRELAY 6 + +#endif // _CONFIG_H diff --git a/src/erase.cpp b/src/erase.cpp new file mode 100644 index 0000000..3131b3a --- /dev/null +++ b/src/erase.cpp @@ -0,0 +1,14 @@ +#include "erase.h" + +void erase() +{ + // Iterate through each byte of the EEPROM storage and clear it + Log.notice(F(CR "Clearing EEPROM." CR)); + + for (uint16_t i = 0; i < EEPROM.length(); i++) + { + EEPROM.write(i, 0); + } + + Log.notice(F("EEPROM clear complete." CR)); +} diff --git a/src/erase.h b/src/erase.h new file mode 100644 index 0000000..acb2749 --- /dev/null +++ b/src/erase.h @@ -0,0 +1,12 @@ +#ifndef _ERASE_H +#define _ERASE_H + +#include +#include +#include + +#include "config.h" // Should be after Arduino.h + +void erase(); + +#endif // _ERASE_H diff --git a/src/i2c.cpp b/src/i2c.cpp new file mode 100644 index 0000000..32419b5 --- /dev/null +++ b/src/i2c.cpp @@ -0,0 +1,56 @@ +#include "i2c.h" + +int iicScan() +{ + Wire.begin(); // Wire communication begin + byte error, address, lcdAddress; // Variable for error and I2C address + int nDevices = 0; // Keep count of number of devices + + Log.notice(F(CR "Scanning I2C bus." CR)); + + for (address = 1; address < 127; address++) + { + // The i2c_scanner uses the return value of Write::endTransmission() + // to see if a device sent an ack on that address + Wire.beginTransmission(address); + error = Wire.endTransmission(); + + if (error == 0) + { + Log.notice(F("I2C device found at address %X." CR), address); + lcdAddress = address; + nDevices++; + } + else if (error == 4) + { + Log.notice(F("Unknown error from I2C device found at address %X." CR), address); + } + } + Wire.end(); + + if (nDevices == 0) + Log.notice(F("No I2C devices found." CR)); + else + iicTest(lcdAddress); + + Log.notice(F("I2C scan complete." CR)); + + return nDevices; +} + +void iicTest(byte lcdAddress) +{ + Log.notice(F("Setting LCD display at %X." CR), lcdAddress); + LiquidCrystal_I2C lcd(lcdAddress, 20, 4); + lcd.init(); // initialize the lcd + // Print a message to the LCD. + lcd.backlight(); + lcd.setCursor(1, 0); + lcd.print("Hello, Homebrewer!"); + lcd.setCursor(0, 1); + lcd.print("Your BrewPi Display"); + lcd.setCursor(7, 2); + lcd.print("Works!"); + lcd.setCursor(2, 3); + lcd.print("@lbussy says hi!"); +} diff --git a/src/i2c.h b/src/i2c.h new file mode 100644 index 0000000..f64f80c --- /dev/null +++ b/src/i2c.h @@ -0,0 +1,14 @@ +#ifndef _I2C_H +#define _I2C_H + +#include +#include +#include +#include + +#include "config.h" // Should be after Arduino.h + +int iicScan(); +void iicTest(byte lcdAddress); + +#endif // _I2C_H diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..ceaf2f5 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,28 @@ +#include "main.h" + +void setup() +{ + setSerial(); // Starts serial and ArduinoLog + + // Initialize the LED pin as an output. + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, LEDON); // Turn LED on + + Log.verbose(F(CR "BrewPi Family Arduino Uno Test beginning." CR)); + + // Check I2C bus, then test the correct OneWire pin + if (iicScan()) + checkSensors(I2C_PIN); + else + checkSensors(NORMAL_PIN); + + testRelay(HEATRELAY); + testRelay(COOLRELAY); + + erase(); // Clear EEPROM + + digitalWrite(LED_BUILTIN, LEDOFF); // Turn LED off + Log.verbose(F(CR "BrewPi Family Arduino Uno Test complete." CR)); +} + +void loop() {} diff --git a/src/main.h b/src/main.h new file mode 100644 index 0000000..d2ffcc2 --- /dev/null +++ b/src/main.h @@ -0,0 +1,18 @@ +#ifndef _MAIN_H +#define _MAIN_H + +#include "serialhandler.h" +#include "one_wire.h" +#include "i2c.h" +#include "erase.h" +#include "relaytest.h" + +#include +#include + +#include "config.h" // Should be after Arduino.h + +void setup(); +void loop(); + +#endif // _MAIN_H diff --git a/src/one_wire.cpp b/src/one_wire.cpp new file mode 100644 index 0000000..10bc442 --- /dev/null +++ b/src/one_wire.cpp @@ -0,0 +1,66 @@ +#include "one_wire.h" + +void checkSensors(int pin) +{ + Log.notice(F(CR "Checking %d for OneWire devices." CR), pin); + + // Create a OneWire bus on pin + OneWire oneWire(pin); + // Pass our oneWire reference to Dallas Temperature. + DallasTemperature sensors(&oneWire); + + sensors.begin(); + + Log.notice(F("Parasitic power is %s for the OneWire bus on pin %d." CR), sensors.isParasitePowerMode() ? "on" : "off", pin); + + Log.notice(F("Detected %d devices on pin %d." CR), sensors.getDeviceCount(), pin); + + byte deviceAddress[8]; + + for (int i = 0; i < sensors.getDeviceCount(); i++) + { + sensors.getAddress(deviceAddress, i); + String device = ""; + switch (deviceAddress[0]) + { + case DS18S20MODEL: + device = "a DS18S20"; + break; + case DS18B20MODEL: + device = "a DS18B20"; + break; + case DS1822MODEL: + device = "a DS1822"; + break; + case DS1825MODEL: + device = "a DS1825"; + break; + default: + device = "an unknown"; + } + Log.notice(F("Device %d:%d is %s device." CR), pin, i, device.c_str()); + } + delay(1000); + + sensors.requestTemperatures(); // Send the command to get temperatures + delay(750); + + for (int i = 0; i < sensors.getDeviceCount(); i++) + { + float temp = sensors.getTempCByIndex(i); + DeviceAddress deviceAddress; + sensors.getAddress(deviceAddress, i); + Log.notice(F("Sensor:\t%d:%d\tAddress: %x:%x:%x:%x:%x:%x:%x:%x\tTemperature: %D°C" CR), + pin, + i, + deviceAddress[0], + deviceAddress[1], + deviceAddress[2], + deviceAddress[3], + deviceAddress[4], + deviceAddress[5], + deviceAddress[6], + deviceAddress[7], + temp); + } +} diff --git a/src/one_wire.h b/src/one_wire.h new file mode 100644 index 0000000..c2df8cb --- /dev/null +++ b/src/one_wire.h @@ -0,0 +1,13 @@ +#ifndef _ONE_WIRE_H +#define _ONE_WIRE_H + +#include +#include +#include +#include + +#include "config.h" // Should be after Arduino.h + +void checkSensors(int pin); + +#endif // _ONE_WIRE_H diff --git a/src/relaytest.cpp b/src/relaytest.cpp new file mode 100644 index 0000000..e9fb96c --- /dev/null +++ b/src/relaytest.cpp @@ -0,0 +1,16 @@ +#include "relaytest.h" + +void testRelay(int pin) +{ + Log.notice(F(CR "Testing relay pin %d." CR), pin); + pinMode(pin, OUTPUT); + digitalWrite(pin, RELAYOFF); + delay(1000); + Log.notice(F("Turning relay on pin %d on." CR), pin); + digitalWrite(pin, RELAYON); + delay(1000); + Log.notice(F("Turning relay on pin %d off." CR), pin); + delay(250); + digitalWrite(pin, RELAYOFF); + Log.notice(F("Relay test on pin %d complete." CR), pin); +} diff --git a/src/relaytest.h b/src/relaytest.h new file mode 100644 index 0000000..e37abd3 --- /dev/null +++ b/src/relaytest.h @@ -0,0 +1,11 @@ +#ifndef _RELAYTEST_H +#define _RELAYTEST_H + +#include +#include + +#include "config.h" // Should be after Arduino.h + +void testRelay(int pin); + +#endif // _RELAYTEST_H diff --git a/src/serialhandler.cpp b/src/serialhandler.cpp new file mode 100644 index 0000000..81d8aad --- /dev/null +++ b/src/serialhandler.cpp @@ -0,0 +1,8 @@ +#include "serialhandler.h" + +void setSerial() { + Serial.begin(BAUD); + Serial.flush(); + Log.begin(LOG_LEVEL_VERBOSE, &Serial, false); + Serial.println(); +} diff --git a/src/serialhandler.h b/src/serialhandler.h new file mode 100644 index 0000000..105582f --- /dev/null +++ b/src/serialhandler.h @@ -0,0 +1,12 @@ +#ifndef _SUPPORT_H +#define _SUPPORT_H + +#include +#include + +#include "config.h" // Should be after Arduino.h + +void setSerial(); +void _delay(unsigned long); + +#endif // _SUPPORT_H diff --git a/test/README b/test/README new file mode 100644 index 0000000..df5066e --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html