From e258f68e6c978f888d512cc6875f15ac32a5985e Mon Sep 17 00:00:00 2001 From: Sam Rolfe Date: Thu, 29 Oct 2026 16:49:12 +1100 Subject: [PATCH] docs: add standardized 8-section README, dual-render images, and image manifest --- README.md | 29 +++++++++++++++++++++++++++++ docs/images/README.md | 5 +++++ docs/images/hero-site.webp | Bin 0 -> 11234 bytes docs/images/hero.png | Bin 0 -> 5824 bytes 4 files changed, 34 insertions(+) create mode 100644 README.md create mode 100644 docs/images/README.md create mode 100644 docs/images/hero-site.webp create mode 100644 docs/images/hero.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..ca2d3a0 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +ESP32 automated reptile feeder and 3-zone climate monitor controlling up to 16 servo-driven feeding doors. + +![Adafruit PCA9685 16-channel PWM servo driver board and DHT22 climate sensor](docs/images/hero.png) + +**Status: in progress** + +### What it does +* Controls up to 16 independent servo motors via PCA9685 I2C driver to open and close feeder hatch doors +* Reads temperature and humidity across 3 enclosure zones using DHT22 sensors every 30 seconds +* Exposes Web UI on port 80 and streams real-time MQTT telemetry to Home Assistant +* Supports Over-The-Air (OTA) firmware updates for hands-off maintenance + +### Bill of Materials +| Part | Quantity | Purpose | +| :--- | :---: | :--- | +| ESP32 Development Board | 1 | Microcontroller running Wi-Fi web server, MQTT, and OTA | +| Adafruit PCA9685 PWM Driver | 1 | 16-Channel 12-bit PWM I2C servo controller board | +| TowerPro Servos (SG90/MG996R) | Up to 16 | Actuators for opening/closing reptile feeding hatch doors | +| DHT22 Temperature/Humidity Sensors | 3 | Multi-zone climate sensors on GPIO 6, 7, and 18 | +| 5V 5A External DC Power Supply | 1 | High-current power source for servo motor rails | + +### How it works +Firmware uses I2C (SDA GPIO 10, SCL GPIO 11) to offload PWM servo timing to the PCA9685 chip, avoiding ESP32 interrupt jitter. Sensor readings from 3 DHT22 pins are published to Home Assistant via MQTT every 30 seconds. + +### What broke +* Initial simultaneous movement of multiple SG90 servos caused voltage sags on the 5V rail, causing the ESP32 to brown out until a dedicated 5V 5A external power supply was separated from the ESP32 logic power. + +### Links +* Gitea Repository: [sam/reptile_feeder](https://gitea.lab.audasmedia.com.au/sam/reptile_feeder) diff --git a/docs/images/README.md b/docs/images/README.md new file mode 100644 index 0000000..7d3f1ae --- /dev/null +++ b/docs/images/README.md @@ -0,0 +1,5 @@ +# Hardware Images Manifest + +`hero.png` — Transparent background cut-out of the Adafruit PCA9685 16-channel PWM servo driver board and DHT22 climate sensor layout for theme-agnostic README rendering. + +`hero-site.webp` — Portfolio dark-canvas render (1600×1000px, `#0b0d10` canvas with left gradient fade and `#8ecbff` rim light) for the portfolio resume site. diff --git a/docs/images/hero-site.webp b/docs/images/hero-site.webp new file mode 100644 index 0000000000000000000000000000000000000000..9e41908d67de68676e2dee8d5e1ab1e252d5df07 GIT binary patch literal 11234 zcmeHqWpG_Rw&gW5#?0)PVrGWePRw>pF*7qWGsYM*GegYG%*@P;G2J`)(o@~9=XJWK z>iwFjmi}z%oZ6DM)?RB%@sqgt3LOBT`cXt)MV^af;+GwJ50(K&D+GN6A)v>UB$-cE zKt_Ud^gSC9&cym+y7TRYF@`Zj#@3s;i{nUW{Y7q1?h<&sC;&Wv?tV*tD5{Tl<#l_R z29n>veAZsrkvk_|0k!!|1CK$!+Pd6n)|6nS_oUC~zlK+b2U*vdTg00_VLsl#lD9*k z$xp_=KCroq0)HGqJTu-h-U=>v`T(^%Gkk`DlP{nfi|5B;n46fR&YMm_APIkTX91`L zbbNvTD)D>?B31|e1Z@iX0OLEYL3Zt_omaqvzx>^Sfk1N*rNk3H?V!^8qP@jsA1YA3 zd&GfHpZ1u8#jywg55jz7{b&AeDG|$%x2)K;a0kYWhVRD4w1=ouzPHE9{pYv;1myo~ge10a zROYt&403a5hkm7Ne07L7ItuzP6HlIh%7tV^z`OBm%16N*Z0pp@m(bb#&y0{Aohs|> zT92+Yr50#?MPQpnk_p;yUfvZg=B*c3N?#Vp!(<^kWfR^0lx##slX z#85sI;mx_YV`v+641l(HR=foYO@;M@;NOYLB4cAP!PC8MbiD$`ujsg`?1wpnZwR;L zM0Wnf1H8k5$;sp$(o7^O1I0@vVNaD)Y&u)mZS(Q`7#7@7>GPtUv{aTTKrk(*X`e(j z3RL3+L!5s}Bt1f}2VsUUVOTU?KK@Su-L?tv^{cAt(i8_p(bzYhD#LCDnvFgpTla|Y z!yh6UG46NBna5R$mC-p?@}aMn@!yNuV!(0#wp>Eg@A3pDIdP6r;uOA7^{HjkIZAG^?eta&YJ5KB!JiRK8&0$tu zJsQ`Vx!1U!_hqc;c2N-~mg|Hd7D4{!?H{#)MHh2=_AhmyYVv$=^%IVY@0i-LtznrJ z1JnE-4w$P)NB;Bf8UKD-!E@BVj!_Ba?2=9TbS6K&=y~H`kbIq(NeSmPWX8|JZ+P_8 z0@_Sm_+RQ&1_uw%Z^c?f$(%%e&s^)WLM_v$!GrjRurV4&4F@|E{a_DZ^I6{N36~{x zEOz$y%fWG8Xsyy^k}dIFn&(dVcaryCRA;o=NrvB_P8QT3cBS9 zoDoH6sKb(!84-EYO8t|J4oHKy{O{d^jfyrCdQ;Qi2t$g-XTRG;@azNww|objpRl=3 zL|}UH#uT>a3Aenuf)1%>;jjzVOk8`U?6}v`{f&YDF4P5Xl?%V2bH{x{dIjLq(jD@1 zg8tVr{F~PQ9Z*^jC7~F&P{)6}-9KqROyp$+Phqujf`O4F@2`sCY6yGl-xUe2X?XU( z!L5yn6?-(>;(vW2Amz2fF1?G`OxIjEaprRLCnEe?ak9&MD*HQkVD_B-23=(H!-MMn z2+m&-pKx3{I{v>_?7yS=Pv`xo%^7ylWfbkzrksUK&$pt~_JKn+mhlq}CPxl?R1q-MZAJoyqG{Fh2#} zj-m~~!+u!$8w~|92baCnUcdrm9wyfQM1_zWU-SYv6}%cRi2deo%|sEKX0tAX9+;Yb z(V=zYtgpi_Gm0B%ov@zmIPuHm&9qLK^>v)!?f4|Kg7ESWzWzUo37`tsqd*fQdr1#6vT)Hy?>7EZd0b2R5^Z&HsQ8Ga8{JEz74F3$#Ra!@oX>jPV+j_d_08y{6p^=D z&{XaxVyeVQjw&kwpaW0D?GxnqAcwLQ;Rs>|v-1oSv@gyA{KtB5*GZAc7y*W0ayPN? ziuBD*;jwQ9EB9T#>WUY7%d5gemfoOtwJYqad{e>(pnT^o%LE2pB7=+oA-rcSY8+A< zeSWzA8&^cNBR=6G@`5B8g9!3BHu2Isz2dh{P3$}*iSy^Jb{um-n?zlnL zM3~poV?W{QUUUQUG)9n}GJ(!K2H%lhbO}e5=Iku5xGOlgX4&|zB@WVku5S1su7l@D z2<#EnNl>w5o4|Jjf*sYAEna~GE~+!9TyGS_U{NraEr^NG0SgldO6(Z+$eMF!!ci&b z)~=F;OI_%w7lSIPVr^EMRusipM6kIc=Z0;7fOSV2wIi6cxY`-d_RA-MRrQ2@a?#(kP&-8GGAAAzmi+WIlvo7w~^YD&}8bT@&rHuI}zC9Ya_nUu62fug_ zLw0DW8z*teocMyKlrWUExZSsFd$e5PX8vqs#c@T3uSCboozK=JR&A*`xqvo2U&YOU z{M8{2WAB1G=h3j!GQ5JBfd`h1^h8gaL6YCkr%4nJa_cL8YkK0`wxb`S;pXS(FclX6 z$UU?HN}X*(gO56!b&UKC+uPUf=GnN-sRUI$dPNtU8GPR>j9@49c;1CR90-B+dDk&s6VSy|_ z@->3h+3}2A%x%vRy!NXQiPdWKwy>JGs@L4A(I!FIDcOCf#{eCxTHrhMuO-(e^HrSV z+#zeW5__A|8KhRRS)Un+%uv6!5ir};KOd}Gp_$JE0! zIrA?x&z`Wcz~w5Ox_ekT0pdr%#&x@&*is!hzJ^|1jub#DS+(iv}FrAK^50qR2Cz zkLRNV`*=whzhgs^KhM78^!~l$Ft?M;>DFz<5xXTtJp?bU-`=Bc#hfMOp*<8ZP9}5C zz=r5_-r>@M{&|pvm_O)_rz?)(OnvY$Y;&FjyQB--paOt2T2^lOlt?8l<Nt#h}UvL zo>w}^#{+4Fq~0YOIMtM{JUCPbk+c`}L33|HHnbq%Xf0TIkWQ|<)vTc1<|zfHg7 zc2#hG(ds1E6wUqu^dmtn1rjRmG`nM3(2N{|-mR@hfI4qSi-E}kA9QjtG%6^jYP-q! zBXu6=)~)bbA329qo9L!!L2AHfE6zuGO{NEafILIWv~C=o)1BO`Q;T^;o{RX)jFcP< zYO0VXV!?#ZbZTU(;U*iIgi@o&18-{v8Vb4)XrIM_~rJ73Y?vp+r=@FGU{I zG^T#Za<@oQOmm4&Ah zI1r1MGv~%x^XokWu|bAQiB{rfsGV7g-`7SalO3fY2AxXpz*08HyRG*@g;mJu<9 zrKGQHzTp?20&fBSctRxyuOtS%#YPSFwv#NczQoFQPKYwNr#$AemC z+5oR~T_1*v+q0p@w^3X7s9ksY63 zgtWY|rw#kGT%ut&EF|907tM2T{O5>K)x}xSuJ9cT7a$vw#g!*fK=y@#y_!x+W(4Es z*N?F$@Q~(KeoqJ3xa^-*mI#RcN6v>Y8{bZD9&FVt> zmetpuVn7_v$b16_1Yt#Pd~{1i{SzD7sEuN6OdHu50{D?g+AFEut$S3$yLt+k!w$nb zuW~U^q*|)`LK5jA^8-2uV==P$U1kqN3-vQBo$FUw+eXDA*LY#Do_e{ zf-RzJ_WKMTQSS@=6NUY4li4uGCedF3O3G?AD?GPv7UIR^R%ZbxOD;;LzizAwvDl2I zqa8vS)T~7Z<@0PL9gZP}0n7#&n6mPmVBnbLRRS_spOp&69y&c-(0vvEG-l<>oh0QTw;f zxJuYl6RlGFEOQvr`S$6)QlVst0;i>{!o(alaQfCXJQPRAy?}>CM~rgK zkSnr`2Lo27DWwU&=Tx#UfXc@MWyQj2e7(zFoz!Dmu?7I67IdDKS?R&NrxTf?(LeeHewwq5 zyo=saR7}|Hnpwj=Ck>!h!n!&)>q|KJQV~PVJYt{DK+C*GWHwKSPdTi#C^d zWwp+UCIza9&7J7kaFMM>c+22;f=qzlO+cJ)6wFU)Jkg_( zwE3yp2?W(%Hq#ADy>OaD8e8#65E68dqW+{;dvq;ZEHmpg3EG=S&%!ZhFhzQZ4R}jz zPm!OR{mW;(=Y4C8Hd{Fz zpqkr4&$^lEVgO?{CuIWwvVP})EjP*%Z@WoCsXY|MvkW=@$(!>0ecIR3)Z+I!gYrfP zJO$6y5?j|kHhSNqUknYAaZ9!q!X+Az(K1z+4Xzlja^#vm5_&uze$e4%K)Ga77iiuw zRMB9WcM$A{s40TYvB_U-UF5rarxRcfea21BkvL}bVZm-nOhBZrOkesspVU#rKYYdP z`_zj)j@QT5vT0QaBK~W{+f=Z}TAbSwt+C^L?oY{NcgJhUqJbbtK@xETd;Xzf5XYot*DW1m5euy&+b*)fONbnazW;_Rx%r@{*WD#&i)Utk+>167vBK#Ya z3@(M+_&|B!!#9@`0j9u)k$`wQ4ifqG`_!t)C$Y8fvpA-=*7e|oW3fKbtbmQ$d~}6R zdS_mHV^3$_jFvm=vI|CzY~p)$^oLz- z`dJ69n*?WygA3)M@qW@f3Z;42B!a{8t`3~H-rKv6J>#&v>7J1<2Z`jFKjPdK>yqfc zAB=*5(SA>3ufJEe?}Sy5(T=Ebpj8Kh3SM|BiLrsq>%)@WwAlb;)>FhAh|S7yk9$<3s;KBBzcu~8$+Um9^L`y?*hwwz5bl(9zCspkDXHA7c+xwez&$RiO;eqZE~Y(&k)I+UV{#m^TvYp9xRxf zdWV@>p~d&nuByifjD2opgfSqDg52(-2(Y_G6PCS)+psH0{hHjDS*pTMk+jSI6>w!~ z+z`hU_$96~pN@{;5W!-%0xlXiWT!DhT- z6^Evc>+ZHVBL7cp%*0NeT)3R-ntab7#K2c6bc+lcxPHTbe{~fSt~&-0RWgyrC^*# zy(NU zbKynT1{Kif#K}!E7Dy@NY^x)1C2q~#Ui-TDEBfBY;s(3s`Ax#%06+!aqJ>MU^0#!M z$OVM>n}bS}=d+7sDb@CcIjUfyje?%$w^>lkfB}je+|!dL5nDV$FjcT*uqTrZCOF1& zVjZngdoPJSO0ZKREoV9kC=7K%FW+9YfQpSd0|h5jxR|xkrz(Mh+5;@ee6OrBwES@d zBPT9$g2q9~Sr^Bs9c$i23W$kJ=um{ElC?mgI*o&J=zc2r*2rEyOhL$$y)EVhLscc- zs=Q~87{MLmheUFP*H{SWVWSY^dX?wdXJKx?HXu0rF{JKRDB7AsGXR}2ooK;({ZYxfWs80Gv zy)p;J0}qj@R6#;IBlf0F5-l#_Ye%VcFF0Qdvcf&5s=*(QLTi`;s*nw4m?kJsliq6+ z&qw1DmFzA$yTP(+r{G~|KO*CZJAjEAvstIJ zA)#^e;V62pOeZa2GU_>C!HYOOLa~xsIz^%C8?Rf~7=LIy{qZS*)2@^~h>FpQ(9kNtKa2eo`O#hLB! z{;UQ)>5$W6EknjaGUeo=7BpKK=hARb4D=pSSptm#KL13vQ`V$sbz7F6Z>Vzd-Q8;C zNFE`~K#`<$q?UAa|J)C2QzCl(W^Po$&fRj0fTS1-X0@&jLxxC2=Ep8eftrkMSFrQ8 zv@I2ty7ZDD%du8|Q>(k7R4JRG2;5>BeWk`IOQ{#w6sLyTO4dOU)uOa5Dep#(67Tu-x9rwq~3vvme{<@HL&EL&%zw0*I!31D&KGILV)3w~4yKfJ30 zO!=3!m}sW7k_u-?_#Qun(#p<^?gq*-Ot_=R^SzSLzwgKKYqY=f)++fyR(3bKM~{+{ z)|8Yp%o&K^H-eqn0<)YBL*tRLNio;1H{c&^Y^}<$x=e7+NL7eS2V8YXA-&^{% zT12Q^fea@aY3kB@eLzRS?AmB8(|pCuZP52aM3mu**4@nUWHW8f4ouR0+RSEEVlx$w zXwYB>3g4J69Zki0y#L3gPd#1Z4Hr%JmWY0b)4PbwgBsreCC4+GP>4@wCi;)to%(wE z<%sm@l(u=)DJIb>3@X-%rbd}+xMfD)=eI;xlAYJEzFa@;V(Kzc8yDUZ$)8RDeA`k& zE)v%-oSWfMKW-eiw-8$&=OlHmo~#Qhh)j#3&(roM*$mIIxGe4WhG#B3B#AB7Zo=k5 zpvECTysIkNL5(8SxZv`C$|hi%#5o_hHxFl(G{^c74X&IQhku-l^;|CXj_ud$_cF$L zL}=<0z2zKQ&;ab2XaQB+u?rq^3Vj+%gJ)ntRKnf{tcCr!Q|q&<-}jcImCdr&T4a}w zTE-9}*RrqK{jF7Q$HXiEYX%hI4V}S?Za1Hiadp$T`7x(Qa&@7CcpDsYYme7voq`mr z5|(jw8j2VxbA@n-(zd&m3Y}cNy&c;YgD(P?x5C!tyfkyw-lw0W(VD%s-F%GZ*Pg%C zC>Cm{ek~>=WM*Rp*oH(W21K^qCvcNHbTY$=JRJM$=MX@~JDFUH=$_QHk$l^465$)7 z+jN%k{qZiD(uVVh24^rcZzy)6*kX?egbMzA>i?q}Kh@P8^7@v8wnW8IGX%X{ZyT8_ zLL7&T(Nyp(=+~2_itSW&G*@zM32i;aV7(3JX8{iZcp78tR-&+5sM|BXgVUHh{OSW8 zlV*UOt|g%gCz(VRmNzrVi*!ja3~HZRTqw-fmQ$Qa zK$aU0Qdd1$hC~nVxj#0e=y(qaRA8@alebk6qc5HcOFD5%(LKmUQ764SU8x*H0LO2j zz38~*Aw~>&KbBx7@_`hq*BLJP(1EioIC-ggfU!awI&)SN23Y2ut$fCog@8HF?JI}h zeI(!>1Ew6Q0iLB_LGCxJgfXS*U})B4R+y-oBj|x@Ct1cCeZ|o=`NWOvUSIbi+_*Q9 zZC?<^f&_8}Fo5^MRR%sMu!nC`_vkO^E2pl=9;d1c;OqI2S_2D)u3Uc|tkaN1&v7qB zD%cZ-MMaM{n&5IZ7OlAU62&F^jh{xo;t`2#@s*^4p!Q0B&ud-nd{I&&kZoW@P_NIy zOQRlP-~!*{osi+anes{7kq*4Z(3(9{x-G5WH=zN}@swO9OG``{iO<~KzsAsqd!?~M z*@nV9NF7X^0zgCc6bni=0W&FmJrr`gKID+VWVaI){OHd}c0U3_0RV--$Ip?^UILqP tMY9_SQ2yPz)oS!ue=~F)hE>XxOXtmhd_{mVAR!B%SIhpZ0Q?`f{{<#!qmcjr literal 0 HcmV?d00001 diff --git a/docs/images/hero.png b/docs/images/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..bcafacf144a8dcdca912cba34e336009b65239a3 GIT binary patch literal 5824 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 bkLwf*(vja3+z8}u5&+jjoG&`(aOZyj7IvkD literal 0 HcmV?d00001