From 34dfa512cb48fcef80b6649ad601df0fc81fa8cb Mon Sep 17 00:00:00 2001 From: LiquoriceHy <15512667+liquoricehy@user.noreply.gitee.com> Date: Sun, 23 Aug 2026 19:34:12 +0800 Subject: [PATCH] =?UTF-8?q?add=EF=BC=9A=E6=B7=BB=E5=8A=A0day5=E7=9A=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=92=8C=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../figures/day5_mqttx.png" | Bin 0 -> 50738 bytes .../figures/day5_readfile.png" | Bin 0 -> 21719 bytes .../README.md" | 219 ++++++++++++++++++ .../main.c" | 194 ++++++++++++++++ .../test_dev.c" | 2 +- .../test_dev.h" | 2 +- 6 files changed, 415 insertions(+), 2 deletions(-) create mode 100644 "2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/figures/day5_mqttx.png" create mode 100644 "2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/figures/day5_readfile.png" create mode 100644 "2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/README.md" create mode 100644 "2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/main.c" diff --git "a/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/figures/day5_mqttx.png" "b/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/figures/day5_mqttx.png" new file mode 100644 index 0000000000000000000000000000000000000000..f1c62b6ef251556d46ef37b1cd2a66d190ef28ee GIT binary patch literal 50738 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%0D&wXMs@U!3YX#F-6dy=7Ky%XCPjqBT}Y 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 z zyyTAOu%@`}@P_O3%_|vGILwa<+|}6UN3ak$BhNu}?{xx}px5D=wQ=}F5B&IjEmj^= zj2E+Sv8^Yb*XAE)qC~5RZM~5v5K&R^oDS-PD!3b3 zK)*;l@Co>m2mK=PA*-E=!2zy1U0^?73;AcadJawsngn()N2%Uvw3B7?5)9V7pw- zH-YV4zuefB)*Z9!UK_)0en06_&HT%xJD>7n(k&TwxO!s4^L#n$pFsW*Z>ie7(smwx zvP6R_;N6!?`l4UweI6XNI2A`cP=lZ6j65=#E83`vU;MVY*6{eNs(izxlxCJ|+2rn~ zc||n{D{g0IBl1wGsaU;Gf{J%{ zy@s4mzR$Uz z8{YJ!H2FdEn`j43!fr!tg3n*BepJW1T>36!?`03~-L2x8FMZ3Og3HCPD)@+Ix;8jpyY{P&&ft&Um%2|QmuACQ$8C$VVI*w=?yBBv+G(ZxM>?k zTqzXgF|HUWNsB=8I_Uq>jV2A!xAc@I#pM=P&1?JD2AO?JYUtw>2~F&!j0N<#-`dqv zxDq|%R|o^ksfTz<@E%6g zi6NXK3lsD|G7Uykf|4@R9WM>@N4aMvYAom{D&fjt3OrQPFLe|uQ z<1n8g?5YpC!aG+?9j#o)dvMDYJ&(7+$kxvMN4@ODirBRBkuAty*gSzc1qS7rD!p>{ z!(|Fa_XNWCFK$yJr;qqbO4<(|ElS=b?OJV9ZT{|=rM9(upzL<^n2I+mAQYu=`A77J z0CU}`OKe0RpJC}`MY&OWYmj>%y&0qRe9$;_B3%xSQfbmM-6Mv+QOeDyFOQspE_ehj zkvb>-$j$Hy8(lwhb7nvN47hIyaIlirD9R_VkADT`XCn&gYZ>KJ=JASs#}&eUb|Q!` zqp@Zvv4VKoK!DI`F&ak;6uM=bo6HI;=_eacSvAXmSwB*Lbk{WVPly*R+(VoL{em>` zcDfVix%Dp%i-twog#`4`vAJ6Kbpy*D8VQIi7#99D=Yk>juAZTFJ)M}d5cgC5Vg0_G z<`CnckcR^7XOliLT$Le*NO@xKq1$3%L){_s%Kf`tEd_uCpRCYrxd_ z#K9={VzeP!FP`rR0Y$Q~@v~1d4I}wgN9b%9Ye1@gAsr*r6vnZvKGYn}`*}4X66%ep z$s!8L_-FieTcN^SD3kwSdhl{y7QH>U%sWS&>GK@{Rmi0%HWdp3(9f|KU^ri)Zqr94 zgWN$^GCwt2pn-mwtXUGCXgg#gKyrjmC86y7=^b{o$}8nCjzDKyN9eh?u@c#VxaM7R z5OQ^hKyX#<{Wpf68&hIOkR#>SPzethf2y|q9~a+?dSO47lwEdc`_;cISVs2>mXF9U z1uOr<)x?~${hD>MW?6V*B@h@3xMr));-bc^JWLV&T{IUv5-6!W3xRC?PaTU;1zla|H2>o4VpvwIBAgvE zwN)r6r{i`7Fk&yeU$6=4f$Se!$cPdK@<^+WTj3A!wK;Ht%pg@x`6_)Qye(WQZYq-*?+3s`#@%AC>O)GW27(jgW9L@ka1D8^~8q>qri zcR6WDKPWFF_&#ih{o0n8-BK5^(Edt$S&R^fo$X#^j( z|2pIPTzFjWcaCT=}OfFEtT9Q~tfj)`J*{Cyt=sZqDH$p=g<(b1DjF?HL^|RnA=` zzM5(%mKt8udm`K{SVc{W@Pa-SNoUvPCHF>NgKapRf0)D6ttD*66bBo@%rPS~&~l0$ zPSI36s!ZGzt>7sfiliNrGOUbXqCM|^|7d5KIQ{YnB?m_)jys^`!!K=1*#b6_Sjobn z%JL`Y58R{fo+-*ZGd*etNMCT`d(3J0&nElc*P^)+4ChcfnO#0I83qeYjt>9NUG__E zvdeUyNvDVpFtXVvW_->(DI?%M0r8PWssh| zZ5hY$@t*3zBP%GSc$!jsX|(Y899hCry5OcJ1`VLCZlVCI7V_=6|Dk8qsC1ovpo=2- zD(#j2k~_tj$BB_GaM8xijF~`YL(h-}h}{~`W_Qv)A8*V3mt8pAcEiE<7X* zoBZJi-P?z$J}raDi2#2-gE?#enJ5c#q^d`Bc9G&2Qs*WOHO%pv5)7Md|Dv=Dwik(; zxc5D`d1NfLrQ2+Jt3f-x! z5TL)M=j2J7Ydp@wfB0EZUT)rUV$(K>OK;K@_*tnN-rn7-StH-otTAAxw#%gxNq>+I z?wlU_L3+jkp*WJA)TR?2jC~%8C!whWz4P~|-qSMOch}W&kad)8h;Nxu_egVKj|L!K zH#=Q;;do{TO5^99Keh~yZ}?7j^62FG(caNLOQvaQ%l8hK&r;*#p<7hPt3@&SpA;r;<=RzuUA6GFcW)LYhJ8K**+l|N5TuQJK75 z2Pu(M8(QpxoCH{BkaN(P&Y+2672b$xg(QKK0?q}fgEpSfk?y7>uwvhOl41O%^6bAR zc8==)PI{U_N-hR5XBJR`;S8gC#BEPwzU<*o^t0kN{CAD($HM$WO?wQ>Q zlDlZb7&z!&mV2cS^EnK0Rtrg=DZjhq!F&XD$U@v3yI8sZeAYPYg-r9m;eMp*Ua$5t z0Q73ex!-#A@6wzjjZ}>lQ!LmKatVQwq_3KhF;!G0QPg`vEb)?7C_7$$MMd~=2 z4c$-M8j!oBi5wYv5Fp~KKA9dpfy(EMSHzseU%`uItNTbkn=mQu;oZH<(1>%S0xfgsl2M5cJQ zV{;0u$(fI@v?Q@RrnNMP3!yL8j#TXgT#u2B@cUl`Nf-|*@sz-EvT**TTi>%j-*S!} zPy5&YdW-}$(}N=zgOorHxF=c^oejY%73=!Xk>?6fS-*DdY@agRf}Rw zc;Lrp=6?@(aBE)HpvbQsn!SoLA0PJu3#oF@PL0n$#`n0^xj?rwaGCZ|G~I_l+@x+I@voQ?2l*x$YGcWet>&TVv(pe6Nw;3{QSJ%Z@MTVRPFm;0MDmu@U+zY100%A)h~yF9i)~N39y&o7qkqcFk`>Q`350q; z`G;nL*yI-T7R$o&FC1^5Fz1m=*$ zE+(7=z|VmRj;~LhL=C6Z|=vk&Kz^_i=!j~26tCM&4RTaCf6p#w; z`>^!ex<1AET-6owcu&tS|CiqtqAQ?#zf!YJ{|^V56M_|U`Zkl_d+H>VKDa+aHLSR{ zBi;cR+x*>kmcY@`FD!v+S5${2+FuTcbLMm*a>(j$eP=s#RNr6*p(JWlYjeDP=Xw$V zCp|HJf*vLCyqS}SGt(rX54p@FyMmZ%Tj^X(t3QTu9aLRR<2!drylvEsEJt4_lKSu| zwz__ff_54k$L`Ys!AQN6bI)RO*}Y3h_xUYd*X0bA{&K0(Z`&(1wXaQ}KYs7pL(0(- zq8Qu-dk&reFEyil8K=9# zHJ#G#zLezux7~Y~S(cN^XTSV5)g`&8RbAnv=RXy(l|d%tTQ?0&|7GIl_)FH=#RoVli_!%pF__0Yo z-O-SWc}*{s;oE5-TxasqzbA|u!`uqZ{gKVv&7Qg z%{c#@!VTVyGx=KIYuenAUs1)-)Wpk1OYEpE=6s}^>wcMJIGdfv|Ke>ICP)59Gj9!L zQIe7AHXo+Aq^ZKj=OU*J@i7}&IT`#&tUqurvXdtcp?a`Dg@OKM;wCd;V8+B;N}BPc z;Q-XOG{jEc@?9|`$LdSJ32f(k4oBAL~!cmF(A)f)TvV^!Cy{ZWs7XP!;3A9lCvYiV=e>AbbYby0rjZoY*Fc2MY4aadQ; z+Z0n96wuS~p~x@I>b2X!#J|e=vecQ`<@?>76EI$IMxGO-w4uRS zq)mmpQ(d*M6Et#14>_}Gvs?NV$K_M3|4-cEA4a zeixv^mFifpbV{4+R9oJGR?sZM=3jfCw0T3r0Un>osqkqT(;Xr+3Gh$ZoaxV-^iB?; zLSVI&W7eatRc6RI0a6+q`pfyb{j^NWi=*U=i4Ro9)jw|%)>u;zf1k{%UL-^2Cb&%P zq8>YG_{f%GVi1$+RN6Ec5{!cQc*!+y$=4uenP*Mq`w=a&z;!or&l=)%E@4$mR^y+} zT1@_z@h#(d?5{=EfQgob7^fyytW~RhD%{v}Rn!bQ17^4${yvU%Ul1u#qy zPZTQKq?Od)cXyr%Fx#oN_dtZ(&b)H2@eyMPi8irXEE)_^yo_JjX;T5do$W#$*c&9u zZSFyc0FlqZLvZXnZSHMkL-TR5+A*&4Pmjz(t z5?1>+-cg*lV0GTT?iBid$IvCt(Pz!$DH&;udxhVi32zKtd$>Ba|9JlA4MVYv?$}Jx zSCx4@S`^+U7v=loTH~udW}1qhmkl;Y!DhX>R{MyPvSq6K-8mBl;nFCY-n!>}4p?U9 zQ4sEcAwH?#a@z@N6n|7@>dzbw$IwZBpk87{*XfPDY#;r^0^(yyxc(?R#WPz=5n`Q^ zD2r2B-Anub*7}24{@(hN!~Wm2{wciQg>j0D(y^w+t1TLn>vF(ll$XXoPKct&_``Ec z)qVS-%EHM;$i+i3e-nk6VIC{ix<-=vJ*ew)T5IC|gjN9`K?SlOAvZpyP0<)fbg6Sy z!Q-p25M5TVYikWffzQWdQ}*@5@b%!d2pb+hs%K0uDW46391*Cd*x`L+=;D9P?1iQL zD;dmcK1Mo0MdY~Lk3eCmCI6Z7L4$!3>7|+XR_Z4YGff+TAQh@Qn73|wcf(}zTn)IX1$E?iix7mlHliVr2W`MtZq^$S=q=@a?}Br2c%qnP zL3jdXJ^V5!BA!HrMv)kLr>ySvbABGkeIvP^IEKGQ_CD#*#n{J)IkYdpd^JfEPyg!Y zPxXHE^WH=DJ4nBkwt~<1N*i!en!Yyap=#pk+CPK323$UnlD|*u9216|?@d_SZUm{A zp{;pn_n<#&K0r!D%{T%MCo}s{?S6(AxTL{yx%s`euga^bIMB?lVlX$E1BaS-k96=S zMatz@&VEe;&Ldz80dJ?aO_>>)MV9anO9`!ASb+uypnEx5A%sTZ`e_4RiC{zE|8t{ z#!D#wJI1k4{${)J{LOY7nLGT$c58P0Z!>#)9xgYaizC-LzPJitKUU?wPV0|i@RNQw zaZ>1+S$OKMv36*u644ABR@!lw7qA zo}TEhP2KN4yC)C*&h8#Tn(h3OzfNY2AIwW(iBbW&+bIWCVsO;Y`aSIEsm--}H*idP zdgrKCtt@FZ26F`gSc8WU=i{Ksd$HW?VAclLZDIjeIhHx0K&uB&a}yaae$GdfodI6k^rvrd%8&4UI`b$8p*2`}$7f!2MbiukYA z9c>gX@u5w`OuMnVkEiJ%cT6sZ>K+l>9Z*^r1XNmpO|-m^t2fcC;;b)v4y0tK&ye13 z`JF|Z?xp4=%^~|Fql$rz9s2?hjh` zbTL+OzvDy%CUpkj9l8|Wy5~5fU$9gCnAN@e*JTzzPyKHh-So--O-4sbygwNYypPq( zg*>;?=BQ3W$;i@2<6{EA#z}69&5utcN+=*swLa>0u{{7B1KhWwW}PQq$(jAS1U`w# zchbKxX8_*P{DR2BYNUn%VWqIkxODjp zZjI;1V*Wg5B?uvh{H<|pWTu(7+|XyapNwVF{~Kdxy~~f^0MUC~-VDSiiFP`$@RlIx z?A>gkp7si0LMP$u8WbQi$A4|9e$S>Il$0NHaeO()S<~FBUtr*t&5@>w3TxL6y#LiV zwBuMsm;{(b6drk8@SbkNpUk8p4Er1P^psXeMtJZzwD{ZehZC&A8VcfJ*lRY0iB&QArUa}~EKF04^0_jOo;Y5uG&Ehhxt&CSmhyrBnN(|%&Yxwa3&TQfFatDV?< zZE^M$my~Xq)$Ws)wqI~rGNb!Ku49mU49bLfxe+T@3TSxT)VJ~btqvgpr&-b=z!OQz zBA;!$rE#jzAAArAsG0?K^~tJc58lj--~L#nLVVin*K$)t8SqrF63?zZ`*UPNZrC5j zm0Rm4KlQjj`O85;=TlpZbAesui-OaEUFCxhua)?{6R7tTunQSoRva+j*Y~M$LM> z3pi)KXGM+w$3x7fLdBVoK5%q`uJT*pOm_`8Xr}w9&#ldf{mwedZqhp#-(~yNv)^-? z$J4`m^|>RYS~a_T1UM7kw!Fi;il?!y^;Qjk@u~D%mlGW)?N)#77rjp>aob)EV5M4O zt^Yaj$@%%G=fz!+b#?B$uU~mN47SNRrc^mkLYt>emjAC`%JPM4^!3)|_j<&X-Y@(= zG2*A-MZ}slv~}diog8veC$~{{I_LVET$~B5S}m)QSCZ$f`z6uvC6!~z>0SAn{U=W5 zo1545*?r5?4&L%p!VOrsu07SkG{IZl8N3F2m*x9Aj}I~6>J}!R1D?_4Im--qc95CzUyo_&qE?eyXPwLu3uF~bvs#E*Y zF9e(Kng68z z_zvns@0u^W_r1aMC6}9A7@0)mtiYYwi+Z#7E`BscAYl6@@!NTJv4!BlZwWR1*@q53 zx^Q`S`cdHc_lwNZhFj(y8zSL7S>B~m`$hFEH(#$dGObwz>cgHo6%eh1W2Ktr59 z6Xv!Ne1<0vbZt4(B68rkIJRR*pu4xg+oS);Z+6yX4e7s906dJ8!PC{xWt~$(697r< Be3AeF literal 0 HcmV?d00001 diff --git "a/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/README.md" "b/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/README.md" new file mode 100644 index 0000000..a757c2f --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/README.md" @@ -0,0 +1,219 @@ +# 【DAY5】AHT10 温湿度上云 + 文件系统 + 云端控制 LED + +--- + +## Part 1:任务 1 —— AHT10 温湿度采集并上传 EMQX + +### 1. 硬件与软件包配置 + +- AHT10 挂在 `i2c3` 总线上,地址 `0x38`(`AHT10_I2C_ADDR`)。 +- 通过 RT-Thread 软件包中心使能 `AHT10` 软件包(`PKG_USING_AHT10`),它会基于 sensor 框架注册两个设备:`temp_aht10`(温度)和 `humi_aht10`(湿度)。 +- 使用 `kawaii-mqtt` 软件包作 MQTT 客户端,连接公共 EMQX 测试服务器 `broker.emqx.io:1883`。 + +### 2. 初始化 AHT10(sensor 框架) + +```c +int aht10_read_init(void) +{ + struct rt_sensor_config cfg; + cfg.intf.dev_name = AHT10_I2C_BUS; // i2c3 + cfg.intf.user_data = (void *)AHT10_I2C_ADDR; // 0x38 + + if (RT_EOK != rt_hw_aht10_init("aht10", &cfg)) // 注册 temp_aht10 / humi_aht10 + { + LOG_E("aht10 init failed"); + return -RT_ERROR; + } + + rt_thread_t ath10 = rt_thread_create("aht10_read", aht10_read_task, RT_NULL, + 2048, 25, 10); + ... + rt_thread_startup(ath10); + return RT_EOK; +} +``` + +### 3. 读取温湿度并上云(aht10_read_task) + +```c +void aht10_read_task(void *parameter) +{ + struct rt_sensor_data aht10_data; + + while (1) + { + rt_device_read(rt_device_find("temp_aht10"), 0, &aht10_data, 1); + Temp = aht10_data.data.temp / 10.0f; // 单位 0.1℃,立刻取出 + + rt_device_read(rt_device_find("humi_aht10"), 0, &aht10_data, 1); + Humi = aht10_data.data.humi / 10.0f; + + rt_snprintf(buf, sizeof(buf), "{\"temp\":%.1f,\"humi\":%.1f}", Temp, Humi); + + mqtt_message_t msg; + msg.qos = QOS0; + msg.payloadlen = rt_strlen(buf); + msg.payload = buf; + mqtt_publish(mqtt_client_g, KAWAII_MQTT_PUBTOPIC, &msg); // 发布到 EMQX + + rt_thread_mdelay(3000); + } +} +``` + +> 注意:`rt_device_read` 用同一个 `aht10_data` 结构体,读温度后要**立刻取出** Temp,再读湿度取 Humi,否则会被下一次 read 覆盖。 + +### 4. MQTT 客户端连接(mqtt_task_entry) + +```c +/* 连接失败自动重试 */ +do +{ + ret = mqtt_connect(mqtt_client_g); + if (ret != 0) + { + LOG_E("mqtt connect failed: %d, retry...", ret); + rt_thread_mdelay(5000); + } +} while (ret != 0); +``` + +线程入口先轮询 `netdev_is_internet_up` 等待网络就绪(最多 30 次),再执行上面的连接流程,避免 WiFi 还没连接成功就去连 MQTT 服务器。 + +### 5. 验证结果(MQTTX 客户端) + +用 MQTTX 订阅发布主题,能看到开发板上报的温湿度消息: + +![MQTTX 客户端接收温湿度数据](../figures/day5_mqttx.png) + +--- + +## Part 2:任务 2 —— 文件系统启动流程 + 挂载 font 分区 + 写 Data.txt + +### 1. 文件系统启动流程梳理 + +本项目文件系统链路(rtconfig.h 中 `RT_USING_DFS` + `RT_USING_DFS_ELMFAT` + `RT_USING_FAL` + `BSP_USING_FLASH_FATFS` + `BSP_USING_FLASH_FS_AUTO_MOUNT` 全部使能),启动顺序如下: + +```text +rt_hw_board_init() + └─ INIT_BOARD_EXPORT → 串口/GPIO 等底层 + └─ INIT_DEVICE_EXPORT → SFUD 探测 W25Q64,注册 norflash0 块设备 + └─ INIT_COMPONENT_EXPORT→ fal_init() 初始化 FAL;elm_init() 注册 FatFS + └─ INIT_ENV_EXPORT + └─ INIT_APP_EXPORT → filesystem_mount() + ├─ 挂 romfs 到 "/"(只读根文件系统,目录表在 drv_filesystem.c) + └─ onboard_fal_mount() + ├─ fal_init() + ├─ fal_blk_device_create("filesystem") → 创建块设备 + └─ dfs_mount(... "/fal" ...) → filesystem 分区挂到 /fal +``` + +关键点:`/fal` 能在根文件系统里找到,是因为 `drv_filesystem.c` 的 `_romfs_root[]` 目录表里注册了 `"fal"` 目录。 + +### 2. 挂载 font 分区 + +FAL 分区表里 font 分区位于 W25Q64,起始 `(512+1024+512)*1024`,大小 3MB。挂载思路:**不改 romfs 表**,直接把 font 挂到已存在的 `/fal` 目录的子路径 `/fal/font`(`/fal` 上挂的是可写 FATFS,可 `mkdir`)。 + +```c +int main(void) +{ + fal_blk_device_create("font"); // 在 font 分区上创建块设备 + mkdir("/fal/font", 0); // 建挂载点目录(/fal 可写) + dfs_mount("font", "/fal/font", "elm", 0, 0); // 挂载 FATFS + ... +} +``` + +首次使用需要先格式化分区(shell 命令): + +```text +mkfs -t elm font +``` + +### 3. 温湿度同步写入 Data.txt + +在 `aht10_read_task` 里,发布 MQTT 之前追加写入文件系统: + +```c +char line[128]; +count++; +rt_snprintf(line, sizeof(line), + "Temp:%.1f; Humi:%.1f; Count:%d\n", Temp, Humi, count); + +int fd = open("/fal/font/Data.txt", O_RDWR | O_CREAT | O_APPEND, 0); +if (fd >= 0) +{ + write(fd, line, rt_strlen(line)); + close(fd); +} +``` + +### 4. 验证结果 + +```text +msh >mount +filesystem device mountpoint +---------- ------ ---------- +rom (null) / +elm filesyst?52 /fal +elm font /fal/font + +msh >cat /fal/font/Data.txt +Temp:33.8; Humi:77.7; Count:19 +Temp:33.8; Humi:77.7; Count:20 +Temp:33.8; Humi:57.8; Count:21 +``` + +串口终端 `cat` 读取 Data.txt 的实测截图: + +![串口读取 Data.txt 文件内容](../figures/day5_readfile.png) + +--- + +## Part 3:任务 3 —— 云端下发指令翻转 LED + +### 1. 实现思路 + +订阅回调里解析 payload,匹配 `"led_toggle"`(长度 10)就翻转 LED。注意 MQTT payload **可能没有 `\0` 结尾**,所以用 `payloadlen` 判断长度 + `rt_strncmp` 比较,不能用 `strcmp`。 + +```c +static void mqtt_sub_callback(void *client, message_data_t *msg) +{ + if (msg->message->payloadlen == 10 && + rt_strncmp((char *)msg->message->payload, "led_toggle", 10) == 0) + { + rt_pin_write(PIN_LED_B, !rt_pin_read(PIN_LED_B)); // 翻转 LED + } + LOG_I("mqtt recv: topic=%s msg=%.*s", msg->topic_name, + (int)msg->message->payloadlen, (char *)msg->message->payload); +} +``` + +初始化时把 `PIN_LED_B`(PF11)配置为输出,并订阅下行 topic: + +```c +int mqtt_task_init(void) +{ + rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT); + rt_pin_write(PIN_LED_B, PIN_LOW); + ... + mqtt_subscribe(mqtt_client_g, KAWAII_MQTT_SUBTOPIC, QOS0, mqtt_sub_callback); +} +``` + +### 2. 验证结果 + +用 MQTT 客户端(如 MQTTX)向订阅 topic 发布 `led_toggle`,板上 LED 每次收到都翻转一次,串口打印: + +```text +[main] I/mqtt recv: topic=rtt-hub072 msg=led_toggle +``` + +--- + +## Part 4:踩坑记录 + +1. **`cat` 显示乱码(`锛锛?`)**:格式串里用了全角 `:`、`;`(UTF-8 占 3 字节),串口按 GBK 解码显示乱码。改成半角 `:`、`;` 后正常,纯 ASCII 任何终端不乱码。 +2. **`rt_strncmp` 比较 payload**:MQTT payload 不保证有 `\0` 结尾,必须用 `payloadlen` 限定长度比较,避免越界。 + +--- diff --git "a/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/main.c" "b/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/main.c" new file mode 100644 index 0000000..ffd39d9 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/main.c" @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-5-10 ShiHao first version + * 2026-8-23 梁先汇 DAY5: AHT10 上云 + 文件系统 + 云端控制 LED + */ + +#include +#include +#include +#include "sensor_asair_aht10.h" +#include "mqttclient.h" +#include +#include +#include +#include +#include + +#define DBG_TAG "main" +#define DBG_LVL DBG_LOG +#include + +#define AHT10_I2C_BUS "i2c3" // AHT10 I2C总线设备名称 + +/* 配置 LED 灯引脚 */ +#define PIN_LED_B GET_PIN(F, 11) // PF11 : LED_B --> LED +#define PIN_LED_R GET_PIN(F, 12) // PF12 : LED_R --> LED + +mqtt_client_t *mqtt_client_g; // 全局 + +/* ============================== 主函数 ============================== */ + +int main(void) +{ + /* 任务2:挂载 font 分区(/fal 已由 INIT_APP_EXPORT 自动挂载 filesystem 分区) */ + fal_blk_device_create("font"); + mkdir("/fal/font", 0); // 挂载点目录(/fal 已挂载可写) + dfs_mount("font", "/fal/font", "elm", 0, 0); + + aht10_read_init(); // 任务1+2:启动温湿度采集线程(上云 + 写 Data.txt) + mqtt_task_init(); // 任务1+3:启动 MQTT 线程(上云 + 订阅控制 LED) + + while (1) + { + rt_thread_mdelay(1000); // main 线程保活 + } +} + +/* ============================== 任务1/2:AHT10 采集 ============================== */ + +void aht10_read_task(void *parameter) +{ + float Humi, Temp; + static int count = 0; + rt_device_open(rt_device_find("temp_aht10"), RT_DEVICE_FLAG_RDONLY); + rt_device_open(rt_device_find("humi_aht10"), RT_DEVICE_FLAG_RDONLY); + struct rt_sensor_data aht10_data; + + while (1) + { + rt_device_read(rt_device_find("temp_aht10"), 0, &aht10_data, 1); // 写 data.temp + Temp = aht10_data.data.temp / 10.0f; // 立刻取出,防止被覆盖 + + rt_device_read(rt_device_find("humi_aht10"), 0, &aht10_data, 1); // 写 data.humi + Humi = aht10_data.data.humi / 10.0f; + + /* 任务2:追加写入 Data.txt */ + char line[128]; + count++; + rt_snprintf(line, sizeof(line), + "Temp:%.1f; Humi:%.1f; Count:%d\n", Temp, Humi, count); + + int fd = open("/fal/font/Data.txt", O_RDWR | O_CREAT | O_APPEND, 0); + if (fd >= 0) + { + write(fd, line, rt_strlen(line)); + close(fd); + } + + /* 任务1:组装 JSON 并发布到 EMQX */ + char buf[128]; + rt_snprintf(buf, sizeof(buf), "{\"temp\":%.1f,\"humi\":%.1f}", Temp, Humi); + + mqtt_message_t msg; + memset(&msg, 0, sizeof(msg)); + msg.qos = QOS0; + msg.payloadlen = rt_strlen(buf); + msg.payload = buf; + if (mqtt_client_g != RT_NULL) + { + mqtt_publish(mqtt_client_g, KAWAII_MQTT_PUBTOPIC, &msg); + } + rt_thread_mdelay(3000); + } +} + +int aht10_read_init(void) +{ + struct rt_sensor_config cfg; + cfg.intf.dev_name = AHT10_I2C_BUS; + cfg.intf.user_data = (void *)AHT10_I2C_ADDR; + + if (RT_EOK != rt_hw_aht10_init("aht10", &cfg)) + { + LOG_E("aht10 init failed"); + return -RT_ERROR; + } + + rt_thread_t ath10 = rt_thread_create("aht10_read", aht10_read_task, RT_NULL, 2048, 25, 10); + if (ath10 == RT_NULL) + { + LOG_E("aht10_read thread create failed"); + return -RT_ERROR; + } + rt_thread_startup(ath10); + return RT_EOK; + +} +MSH_CMD_EXPORT(aht10_read_init, aht10_read_init); + +/* ============================== 任务1/3:MQTT 任务 ============================== */ + +/* 订阅回调:云端下发指令到这里处理 */ +static void mqtt_sub_callback(void *client, message_data_t *msg) +{ + /* 任务3:解析 payload 翻转 LED,注意 payload 可能无 '\0' 结尾,用 payloadlen */ + if (msg->message->payloadlen == 10 && + rt_strncmp((char *)msg->message->payload, "led_toggle", 10) == 0) + { + /* 翻转 LED */ + rt_pin_write(PIN_LED_B, !rt_pin_read(PIN_LED_B)); + } + LOG_I("mqtt recv: topic=%s msg=%.*s", msg->topic_name, + (int)msg->message->payloadlen, (char *)msg->message->payload); +} + +static void mqtt_task_entry(void *parameter) +{ + struct netdev *dev = netdev_get_by_name(RT_WLAN_DEVICE_STA_NAME); + int ret = -1; + + /* 等待网络就绪 */ + for (int i = 0; i < 30; i++) + { + if (dev && netdev_is_internet_up(dev)) + break; + rt_thread_mdelay(1000); + } + + mqtt_client_g = mqtt_lease(); + mqtt_set_host(mqtt_client_g, KAWAII_MQTT_HOST); + mqtt_set_port(mqtt_client_g, KAWAII_MQTT_PORT); + mqtt_set_client_id(mqtt_client_g, KAWAII_MQTT_CLIENTID); + mqtt_set_user_name(mqtt_client_g, KAWAII_MQTT_USERNAME); + mqtt_set_password(mqtt_client_g, KAWAII_MQTT_PASSWORD); + mqtt_set_clean_session(mqtt_client_g, 1); + + /* 连接失败自动重试 */ + do + { + ret = mqtt_connect(mqtt_client_g); + if (ret != 0) + { + LOG_E("mqtt connect failed: %d, retry...", ret); + rt_thread_mdelay(5000); + } + } while (ret != 0); + + LOG_I("mqtt connected"); + mqtt_subscribe(mqtt_client_g, KAWAII_MQTT_SUBTOPIC, QOS0, mqtt_sub_callback); + + while (1) + { + rt_thread_mdelay(5000); + } +} + +int mqtt_task_init(void) +{ + rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT); + rt_pin_write(PIN_LED_B, PIN_LOW); + + rt_thread_t tid = rt_thread_create("mqtt_task", mqtt_task_entry, RT_NULL, + 4096, 16, 10); + if (tid == RT_NULL) + return -RT_ERROR; + rt_thread_startup(tid); + return RT_EOK; +} +MSH_CMD_EXPORT(mqtt_task_init, mqtt_task init); diff --git "a/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/test_dev.c" "b/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/test_dev.c" index def9033..57b3b78 100644 --- "a/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/test_dev.c" +++ "b/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/test_dev.c" @@ -3,7 +3,7 @@ #include "test_dev.h" #include -/* 框架层设备对象(对标 pin.c 的 _hw_pin) */ +/* 框架层设备对象 */ static struct rt_device_test _test_dev; /* 分发函数:内核调到这里,再转手调驱动层的 ops */ diff --git "a/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/test_dev.h" "b/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/test_dev.h" index d7b7d07..1492557 100644 --- "a/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/test_dev.h" +++ "b/2026/\347\254\2542\347\273\204/\346\242\201\345\205\210\346\261\207/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/test_dev.h" @@ -31,7 +31,7 @@ struct rt_device_test const struct rt_test_ops *ops; }; -/* 框架层注册 API —— 对标 rt_device_pin_register */ +/* 框架层注册 API */ int rt_device_test_register(const char *name, const struct rt_test_ops *ops, void *user_data); -- Gitee