<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Project | 李嘉渝 | BlackiePiggy</title><link>https://blackiepiggy.github.io/projects/</link><atom:link href="https://blackiepiggy.github.io/projects/index.xml" rel="self" type="application/rss+xml"/><description>Project</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Sun, 19 May 2024 00:00:00 +0000</lastBuildDate><image><url>https://blackiepiggy.github.io/media/icon_hu_b566a8d15eaa8c94.png</url><title>Project</title><link>https://blackiepiggy.github.io/projects/</link></image><item><title>Office2021激活失败解决办法（找不到ospp.vbs）</title><link>https://blackiepiggy.github.io/projects/office/</link><pubDate>Fri, 13 Mar 2026 23:16:00 +0800</pubDate><guid>https://blackiepiggy.github.io/projects/office/</guid><description>&lt;h1 id="问题"&gt;问题&lt;/h1&gt;
&lt;p&gt;今天在使用一键安装工具安装Office2021时遇到激活失败的问题，在水源并没有找到解决办法，具体情况如下图。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260313_231531/media-001-1773414931750.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;已经连接上了交大VPN。 在图示报错信息的目录下并没有找到Microsoft Office文件夹。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260313_231532/media-002-1773414932388.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 id="解决办法"&gt;解决办法&lt;/h1&gt;
&lt;p&gt;用everything扫了一下盘，发现ospp.vbs文件存放在非系统盘（我这里是S盘）下。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260313_231532/media-003-1773414933076.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;可能是因为我执行一键安装程序时是把安装包放在S盘下的原因。 将cmd切换到对应目录下再执行激活程序就可以了（https://software.sjtu.edu.cn/Data/View/313）。如下图。&lt;/p&gt;
&lt;p&gt;这里需要管理员打开cmd，默认打开执行位置在C盘，直接 &lt;code&gt;cd &amp;quot;S:\Microsoft Office\Office16&amp;quot;&lt;/code&gt; 是无效的命令。输入 &lt;code&gt;s:&lt;/code&gt; ，单击回车，成功切换到s盘。再输入 &lt;code&gt;cd Microsoft Office\Office16&lt;/code&gt; ，可以成功切换到目录下。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260313_231533/media-004-1773414933556.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;激活成功。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260313_231533/media-005-1773414934186.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Rezz Goggles复刻</title><link>https://blackiepiggy.github.io/projects/rezz-goggles/</link><pubDate>Fri, 13 Mar 2026 20:44:00 +0800</pubDate><guid>https://blackiepiggy.github.io/projects/rezz-goggles/</guid><description>&lt;p&gt;等待补充&lt;/p&gt;</description></item><item><title>用codex写一个将飞书复制的富文本信息中的media信息自动上传oss并返回上传结果与替换media之后的结果</title><link>https://blackiepiggy.github.io/projects/richtext/</link><pubDate>Thu, 12 Mar 2026 16:50:20 +0800</pubDate><guid>https://blackiepiggy.github.io/projects/richtext/</guid><description>&lt;p&gt;我想写一个网页，实现以下功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主要功能是实现将飞书复制的富文本信息中的media信息自动上传oss并返回上传结果与替换media之后的结果&lt;/li&gt;
&lt;li&gt;oss在页面中提供自己上传oss信息的填写框并验证是否正确连接，先提供阿里云的oss通道。将图片上传到哪里的信息也可以进行选择，或者要求根据富文本文章的标题、或者其他信息自动生成对应新的文件夹。&lt;/li&gt;
&lt;li&gt;网页中给一个粘贴富文本的区域与对应的渲染结果的部分，对于图片、视频这样的media信息进行单独的突出标注以及可以通过网页上的按钮”上一个、下一个“以及有对这种media信息的统计信息&lt;/li&gt;
&lt;li&gt;点击开始替换后开始逐个图片上传并实时显示替换上传进度，最后将替换后的结果和渲染结果展示在网页中。&lt;/li&gt;
&lt;li&gt;上传的富文本中的media可能是本地的图片，可能是飞书这样（&lt;strong&gt;MEDIA_REPLACE_0_1773305378437&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="第一次生成"&gt;第一次生成&lt;/h2&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_164938/media-002-1773305378833.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;网页效果&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_164938/media-003-1773305379286.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="第二次生成"&gt;第二次生成&lt;/h2&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_164938/media-004-1773305379581.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_164938/media-005-1773305379856.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="第三次生成"&gt;第三次生成&lt;/h2&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_164938/media-006-1773305380064.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="cloudflarecodex自动部署"&gt;Cloudflare+CodeX自动部署&lt;/h2&gt;
&lt;p&gt;令牌：_uQbYMaCwao9UBOOh5vuCXEp2g2i-sQ70G6DUqDm&lt;/p&gt;
&lt;p&gt;测试指令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl &amp;#34;https://api.cloudflare.com/client/v4/accounts/fadeb8a5107d577b2344208d1987a722/tokens/verify&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-H &amp;#34;Authorization: Bearer _uQbYMaCwao9UBOOh5vuCXEp2g2i-sQ70G6DUqDm&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_164938/media-007-1773305380349.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_164938/media-008-1773305380542.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;令牌：_uQbYMaCwao9UBOOh5vuCXEp2g2i-sQ70G6DUqDm&lt;/p&gt;
&lt;p&gt;账号ID：fadeb8a5107d577b2344208d1987a722&lt;/p&gt;
&lt;p&gt;我想要的项目名称：richtextautooss&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_164938/media-009-1773305380761.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;自动部署好后，会直接给出对应的网址，&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_164938/media-010-1773305380941.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;经过测试后，是可以成功访问的&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_164938/media-011-1773305381165.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>hugo pages线上部署和本地不一致</title><link>https://blackiepiggy.github.io/projects/hugoproblem/</link><pubDate>Thu, 12 Mar 2026 12:46:18 +0800</pubDate><guid>https://blackiepiggy.github.io/projects/hugoproblem/</guid><description>&lt;h2 id="问题描述"&gt;问题描述&lt;/h2&gt;
&lt;p&gt;线上的Projects页面长这样&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153419/media-001-1773300860192.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;主页的Projects长这样&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153419/media-002-1773300860561.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;本地使用指令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Shell" data-lang="Shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone &amp;lt;你的仓库-url&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;你的仓库-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo --gc --minify
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;验证后，在本地是这样。可以正确展示缩略图&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153419/media-003-1773300860796.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;主页也能正确展示&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153419/media-004-1773300861051.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="解决方案"&gt;解决方案&lt;/h2&gt;
&lt;p&gt;核验本地执行的log：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Microsoft Windows &lt;span class="o"&gt;[&lt;/span&gt;版本 10.0.19044.6937&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt; Microsoft Corporation。保留所有权利。 E:&lt;span class="se"&gt;\&amp;gt;&lt;/span&gt;git clone git@github.com:BlackiePiggy/BlackiePiggy.github.io.git Cloning into &lt;span class="s1"&gt;&amp;#39;BlackiePiggy.github.io&amp;#39;&lt;/span&gt;... remote: Enumerating objects: 391, &lt;span class="k"&gt;done&lt;/span&gt;. remote: Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;391/391&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;. remote: Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;309/309&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;. remote: Total &lt;span class="m"&gt;391&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;delta 112&lt;span class="o"&gt;)&lt;/span&gt;, reused &lt;span class="m"&gt;292&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;delta 57&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;from 0&lt;span class="o"&gt;)&lt;/span&gt; Receiving objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;391/391&lt;span class="o"&gt;)&lt;/span&gt;, 17.44 MiB &lt;span class="p"&gt;|&lt;/span&gt; 5.56 MiB/s, &lt;span class="k"&gt;done&lt;/span&gt;. Resolving deltas: 100% &lt;span class="o"&gt;(&lt;/span&gt;112/112&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;. E:&lt;span class="se"&gt;\&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; BlackiePiggy.github.io E:&lt;span class="se"&gt;\B&lt;/span&gt;lackiePiggy.github.io&amp;gt;pnpm install Lockfile is up to date, resolution step is skipped Packages: +43 +++++++++++++++++++++++++++++++++++++++++++ Progress: resolved 43, reused 43, downloaded 0, added 43, &lt;span class="k"&gt;done&lt;/span&gt; dependencies: + @tailwindcss/cli 4.2.1 + @tailwindcss/typography 0.5.19 + autoprefixer 10.4.24 + postcss 8.5.6 + tailwindcss 4.2.1 ╭ Warning ───────────────────────────────────────────────────────────────────────────────────╮ │ │ │ Ignored build scripts: @parcel/watcher. │ │ Run &lt;span class="s2"&gt;&amp;#34;pnpm approve-builds&amp;#34;&lt;/span&gt; to pick which dependencies should be allowed to run scripts. │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────╯ Done in 524ms using pnpm v10.14.0 E:&lt;span class="se"&gt;\B&lt;/span&gt;lackiePiggy.github.io&amp;gt;hugo --gc --minify Start building sites … hugo v0.157.0-7747abbb316b03c8f353fd3be62d5011fa883ee6+extended windows/amd64 &lt;span class="nv"&gt;BuildDate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2026-02-25T16:38:33Z &lt;span class="nv"&gt;VendorInfo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gohugoio WARN Failed to find page &lt;span class="k"&gt;for&lt;/span&gt; cite shortcode: /publication/preprint WARN Failed to find page &lt;span class="k"&gt;for&lt;/span&gt; cite shortcode: /publication/conference-paper WARN An image named avatar was not found in the /authors/jiayu-li folder WARN An image named avatar was not found in the /authors/李嘉渝 folder │ EN ──────────────────┼───── Pages │ &lt;span class="m"&gt;105&lt;/span&gt; Paginator pages │ &lt;span class="m"&gt;1&lt;/span&gt; Non-page files │ &lt;span class="m"&gt;38&lt;/span&gt; Static files │ &lt;span class="m"&gt;3&lt;/span&gt; Processed images │ &lt;span class="m"&gt;386&lt;/span&gt; Aliases │ &lt;span class="m"&gt;32&lt;/span&gt; Cleaned │ &lt;span class="m"&gt;0&lt;/span&gt; Total in &lt;span class="m"&gt;8459&lt;/span&gt; ms E:&lt;span class="se"&gt;\B&lt;/span&gt;lackiePiggy.github.io&amp;gt;hugo server port &lt;span class="m"&gt;1313&lt;/span&gt; already in use, attempting to use an available port Watching &lt;span class="k"&gt;for&lt;/span&gt; changes in C:/Users/jason/AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/!hugo!blox/hugo-blox-builder/modules/blox-plugin-netlify@v1.1.2/src/layouts, C:/Users/jason/AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/!hugo!blox/hugo-blox-builder/modules/blox-tailwind@v0.5.2/assets/&lt;span class="o"&gt;{&lt;/span&gt;css,dist,js,media&lt;span class="o"&gt;}&lt;/span&gt;, C:/Users/jason/AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/!hugo!blox/hugo-blox-builder/modules/blox-tailwind@v0.5.2/data/icons, C:/Users/jason/AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/!hugo!blox/hugo-blox-builder/modules/blox-tailwind@v0.5.2/i18n, C:/Users/jason/AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/!hugo!blox/hugo-blox-builder/modules/blox-tailwind@v0.5.2/layouts/&lt;span class="o"&gt;{&lt;/span&gt;_markup,_partials,_shortcodes,docs,landing&lt;span class="o"&gt;}&lt;/span&gt;, C:/Users/jason/AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/!hugo!blox/hugo-blox-builder/modules/blox-tailwind@v0.5.2/package.json, E:/BlackiePiggy.github.io/archetypes, E:/BlackiePiggy.github.io/assets/media, E:/BlackiePiggy.github.io/content/&lt;span class="o"&gt;{&lt;/span&gt;authors,event,idea,post,projects,...&lt;span class="o"&gt;}&lt;/span&gt;, E:/BlackiePiggy.github.io/package.json, ... and &lt;span class="m"&gt;1&lt;/span&gt; more Watching &lt;span class="k"&gt;for&lt;/span&gt; config changes in E:&lt;span class="se"&gt;\B&lt;/span&gt;lackiePiggy.github.io&lt;span class="se"&gt;\c&lt;/span&gt;onfig&lt;span class="se"&gt;\_&lt;/span&gt;default, C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\j&lt;/span&gt;ason&lt;span class="se"&gt;\A&lt;/span&gt;ppData&lt;span class="se"&gt;\L&lt;/span&gt;ocal&lt;span class="se"&gt;\h&lt;/span&gt;ugo_cache&lt;span class="se"&gt;\m&lt;/span&gt;odules&lt;span class="se"&gt;\f&lt;/span&gt;ilecache&lt;span class="se"&gt;\m&lt;/span&gt;odules&lt;span class="se"&gt;\p&lt;/span&gt;kg&lt;span class="se"&gt;\m&lt;/span&gt;od&lt;span class="se"&gt;\g&lt;/span&gt;ithub.com&lt;span class="se"&gt;\!&lt;/span&gt;hugo!blox&lt;span class="se"&gt;\h&lt;/span&gt;ugo-blox-builder&lt;span class="se"&gt;\m&lt;/span&gt;odules&lt;span class="se"&gt;\b&lt;/span&gt;lox-plugin-netlify@v1.1.2&lt;span class="se"&gt;\c&lt;/span&gt;onfig.yaml, C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\j&lt;/span&gt;ason&lt;span class="se"&gt;\A&lt;/span&gt;ppData&lt;span class="se"&gt;\L&lt;/span&gt;ocal&lt;span class="se"&gt;\h&lt;/span&gt;ugo_cache&lt;span class="se"&gt;\m&lt;/span&gt;odules&lt;span class="se"&gt;\f&lt;/span&gt;ilecache&lt;span class="se"&gt;\m&lt;/span&gt;odules&lt;span class="se"&gt;\p&lt;/span&gt;kg&lt;span class="se"&gt;\m&lt;/span&gt;od&lt;span class="se"&gt;\g&lt;/span&gt;ithub.com&lt;span class="se"&gt;\!&lt;/span&gt;hugo!blox&lt;span class="se"&gt;\h&lt;/span&gt;ugo-blox-builder&lt;span class="se"&gt;\m&lt;/span&gt;odules&lt;span class="se"&gt;\b&lt;/span&gt;lox-tailwind@v0.5.2&lt;span class="se"&gt;\h&lt;/span&gt;ugo.yaml, E:&lt;span class="se"&gt;\B&lt;/span&gt;lackiePiggy.github.io&lt;span class="se"&gt;\g&lt;/span&gt;o.mod Start building sites … hugo v0.157.0-7747abbb316b03c8f353fd3be62d5011fa883ee6+extended windows/amd64 &lt;span class="nv"&gt;BuildDate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2026-02-25T16:38:33Z &lt;span class="nv"&gt;VendorInfo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gohugoio WARN Failed to find page &lt;span class="k"&gt;for&lt;/span&gt; cite shortcode: /publication/preprint WARN Failed to find page &lt;span class="k"&gt;for&lt;/span&gt; cite shortcode: /publication/conference-paper WARN An image named avatar was not found in the /authors/jiayu-li folder WARN An image named avatar was not found in the /authors/李嘉渝 folder │ EN ──────────────────┼───── Pages │ &lt;span class="m"&gt;105&lt;/span&gt; Paginator pages │ &lt;span class="m"&gt;1&lt;/span&gt; Non-page files │ &lt;span class="m"&gt;38&lt;/span&gt; Static files │ &lt;span class="m"&gt;3&lt;/span&gt; Processed images │ &lt;span class="m"&gt;386&lt;/span&gt; Aliases │ &lt;span class="m"&gt;32&lt;/span&gt; Cleaned │ &lt;span class="m"&gt;0&lt;/span&gt; Built in &lt;span class="m"&gt;1221&lt;/span&gt; ms Environment: &lt;span class="s2"&gt;&amp;#34;development&amp;#34;&lt;/span&gt; Serving pages from disk Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender Web Server is available at http://localhost:8538/ &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt; address 127.0.0.1&lt;span class="o"&gt;)&lt;/span&gt; Press Ctrl+C to stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以发现，本地跑的是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Shell" data-lang="Shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo v0.157.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而你仓库里 Netlify 明确固定的是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Shell" data-lang="Shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HUGO_VERSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.148.2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;并且生产构建命令是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Shell" data-lang="Shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm install &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; hugo --gc --minify -b &lt;span class="nv"&gt;$URL&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pnpm dlx pagefind --source &lt;span class="s1"&gt;&amp;#39;public&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;同一份内容，在不同 Hugo / 主题渲染环境下，生成结果不同。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;而日志里暴露出明显差异：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本地：&lt;code&gt;0.157.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;线上 Netlify：&lt;code&gt;0.148.2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，解决方案是把 工程根目录下&lt;code&gt;netlify.toml&lt;/code&gt; 里的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Shell" data-lang="Shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HUGO_VERSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.148.2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;改成和本地hugo版本一致的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Shell" data-lang="Shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HUGO_VERSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.157.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后重新部署。&lt;/p&gt;
&lt;p&gt;✔成功解决问题&lt;/p&gt;
&lt;h2 id="github解决方案"&gt;Github解决方案&lt;/h2&gt;
&lt;p&gt;修改deploy.yml中的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;env:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WC_HUGO_VERSION: &amp;#39;0.148.2&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; NODE_VERSION: &amp;#39;20&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;为&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;env:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WC_HUGO_VERSION: &amp;#39;0.157.0&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; NODE_VERSION: &amp;#39;20&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后重新部署。&lt;/p&gt;
&lt;p&gt;✔成功解决问题&lt;/p&gt;</description></item><item><title>雷电模拟器实现滑呗抓包</title><link>https://blackiepiggy.github.io/projects/huabei/</link><pubDate>Thu, 12 Mar 2026 12:46:18 +0800</pubDate><guid>https://blackiepiggy.github.io/projects/huabei/</guid><description>&lt;p&gt;涉及工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;雷电模拟器。负责提供安卓环境&lt;/li&gt;
&lt;li&gt;狐狸面具。实测比原版面具好使&lt;/li&gt;
&lt;li&gt;LSPosed。&lt;/li&gt;
&lt;li&gt;微霸。抹机&lt;/li&gt;
&lt;li&gt;滑呗。直接应用市场下载就行。&lt;/li&gt;
&lt;li&gt;BurpSuite。官网下载的Community版本。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="雷电模拟器实现改真机并进入滑呗"&gt;雷电模拟器实现改真机并进入滑呗&lt;/h1&gt;
&lt;h2 id="burpsuite的安装与证书"&gt;BurpSuite的安装与证书&lt;/h2&gt;
&lt;p&gt;BurpSuite是windows上的抓包软件，相当于macos上的Charles。&lt;/p&gt;
&lt;p&gt;具体差别可以参考：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;对比&lt;/th&gt;
&lt;th&gt;Charles&lt;/th&gt;
&lt;th&gt;Burp Suite&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;主要定位&lt;/td&gt;
&lt;td&gt;开发调试&lt;/td&gt;
&lt;td&gt;安全测试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;用户群体&lt;/td&gt;
&lt;td&gt;开发者&lt;/td&gt;
&lt;td&gt;安全工程师 / 渗透测试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;功能复杂度&lt;/td&gt;
&lt;td&gt;简单&lt;/td&gt;
&lt;td&gt;非常强大&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自动漏洞扫描&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;爆破测试&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;插件生态&lt;/td&gt;
&lt;td&gt;几乎没有&lt;/td&gt;
&lt;td&gt;非常丰富&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web漏洞利用&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习成本&lt;/td&gt;
&lt;td&gt;很低&lt;/td&gt;
&lt;td&gt;较高&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;下载网址：https://portswigger.net/burp/releases&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-001-1773300616707.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;BurpSuite第一次打开界面如下，直接点击Next&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-002-1773300617062.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;继续点击Start Burp&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-003-1773300617297.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;进入后主界面如下&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-004-1773300617589.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Proxy Listners进行add一个&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-005-1773300617963.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;下面选择宿主机的IP：&lt;code&gt;192.168.110.98:8899&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-006-1773300618145.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;如下图所示添加成功&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-007-1773300618383.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;浏览器访问&lt;code&gt;192.168.110.98:8899&lt;/code&gt;，显示如下，表示成功，点击②下载证书&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-008-1773300618649.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-009-1773300618882.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="将der证书转换成cer格式"&gt;将der证书转换成CER格式&lt;/h3&gt;
&lt;p&gt;用下面网址进行转换得到CER格式证书：https://fly63.com/tool/certificate_conversion/&lt;/p&gt;
&lt;p&gt;保存下来，后面会用到。&lt;/p&gt;
&lt;h2 id="雷电模拟器的安装"&gt;雷电模拟器的安装&lt;/h2&gt;
&lt;p&gt;官网：https://www.ldmnq.com/&lt;/p&gt;
&lt;p&gt;直接下载安装即可。&lt;/p&gt;
&lt;p&gt;安装完成后，打开应用，会自动安装一个系统，可以就直接使用这个系统，但是需要进行一些设置。&lt;/p&gt;
&lt;p&gt;1（可选），试图切换成手机版显示，方便桌面放下更多的窗口&lt;/p&gt;
&lt;p&gt;2 磁盘共享改为System.vmdk可写入&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-010-1773300619115.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;手机型号我这里设置的是OPPO PCLM10，测试为成功，其他机型没有进行测试，可自行进行测试。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-011-1773300619303.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-012-1773300619509.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;ROOT权限切换为“开启”&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-013-1773300619759.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;此时已经创建好一个安卓9.0的模拟器，点击“启动”&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-014-1773300619993.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="文件的下载与滑呗的安装"&gt;文件的下载与滑呗的安装&lt;/h2&gt;
&lt;p&gt;将下面的文件传入雷电模拟器的共享文件夹。&lt;/p&gt;
&lt;p&gt;主要包括：狐狸面具apk、LSPosed的zip、LSPosed的apk、BurpSuite证书、MT文件管理器、Postern-v3.1.2、微霸。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-015-1773300620212.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;自行下载滑呗，能在本手机上运行的版本即可。当前直接打开滑呗，会显示安全警告，因为可以检测到这是模拟器和ROOT环境，是不允许进入应用的（防抓包）。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-016-1773300620428.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-017-1773300620617.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="狐狸面具安装"&gt;狐狸面具安装&lt;/h2&gt;
&lt;p&gt;这里我是在多开网下载的狐狸面具（https://www.duokaiya.com/786.html），版本是v26.4。&lt;/p&gt;
&lt;p&gt;安装视频可以参考：
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-018-1773300620815.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;直接将狐狸面具的apk拖到模拟器中进行安装。&lt;/p&gt;
&lt;p&gt;给其允许永久超级用户权限。&lt;/p&gt;
&lt;p&gt;可以观察到当前Zygisk等都是没有安装的，版本号也没有显示。&lt;/p&gt;
&lt;p&gt;点击Magisk的安装，允许访问媒体资源。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-019-1773300621034.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-020-1773300621305.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-021-1773300621574.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;选中安装到Recovery，点击下一步，有时候会发现没有直接安装的选项。此时可以关闭应用后台，如果还是不行，就重启几次，过程中可以切换几次IMEI码，以及一定要检查一下是否开启了ROOT权限。&lt;/p&gt;
&lt;p&gt;当安装方式出现了三个选项的时候，选择“直接安装（直接修改/system）”，并点击开始按钮。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-022-1773300621760.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-023-1773300621979.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-024-1773300622158.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;如图显示为安装完成界面。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-025-1773300622371.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;安装完成后，暂时不用重启。先退到桌面，进入“文件管理器”，进入&lt;code&gt;system/xbin&lt;/code&gt;，找到&lt;code&gt;su&lt;/code&gt;文件，长按删除。系统会提示“操作失败”，不重要，因为如果你再次尝试删除，会发现显示文件不存在，说明已经被删除。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-026-1773300622584.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-027-1773300622798.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-028-1773300623011.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;重启设备，进入狐狸面具。可以发现已经有了版本信息。&lt;/p&gt;
&lt;p&gt;点击右上角设置，下滑开启“Zygisk”&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-029-1773300623259.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-030-1773300623549.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="lsposed安装"&gt;LSPosed安装&lt;/h2&gt;
&lt;p&gt;重启手机，再次打开狐狸面具，点击右下角“模块”，然后点击“从本地安装”。找到左上角，选择文件管理器，进入共享文件夹（默认直接点进Pictures即可）。&lt;/p&gt;
&lt;p&gt;单击LSPosed-v1.9.2&amp;hellip;&amp;hellip;zip进行安装&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-031-1773300623754.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-032-1773300623943.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-033-1773300624191.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;安装完成如下图所示。再次重启。&lt;/p&gt;
&lt;p&gt;重启后，下拉任务栏，单击LSPosed已加载区域，可以呼出LSPosed运行界面。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-034-1773300624392.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-035-1773300624617.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-036-1773300624820.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;手机桌面是没有LSPosed的图标的，这是因为其是挂载在系统后台运行的。&lt;/p&gt;
&lt;p&gt;如果想要LSPosed的图标，可以手动将LSPosed的apk拖入安装&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-037-1773300625066.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="微霸的安装与数据的抹除"&gt;微霸的安装与数据的抹除&lt;/h2&gt;
&lt;p&gt;下一步，拖动安装微霸。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-038-1773300625288.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;先不要进入微霸，进入LSPosed，然后点击模块，可以看到微吧霸，点击进入。&lt;/p&gt;
&lt;p&gt;点击”启用模块“，将滑呗等需要隐藏信息的App打上勾。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-039-1773300625530.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-040-1773300625742.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-041-1773300625937.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;点击进入，基于超级用户权限。&lt;/p&gt;
&lt;p&gt;如果正确按照上述步骤操作，进入微霸后会全绿，如下图所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-042-1773300626113.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-043-1773300626347.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;点击”一键改机“，然后点击”选择APP“，选中滑呗。&lt;/p&gt;
&lt;p&gt;退出，重新点击”抹除APP“，然后点击滑呗并确定重置应用。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-044-1773300626547.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-045-1773300626770.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-046-1773300626992.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;最后退出到微霸一键改机主界面，点击一键改机并确定。最后提示请更新，但是实测是起到效果了的。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-047-1773300627195.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-048-1773300627384.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="进入滑呗"&gt;进入滑呗&lt;/h2&gt;
&lt;p&gt;到此可以成功进入滑呗，如下图所示。&lt;/p&gt;
&lt;p&gt;如果还是不行，可以立即重启，以及重启后再重新在微霸进行一键改机的操作，再进入滑呗。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-049-1773300627624.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-050-1773300627885.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 id="雷电模拟器连接burpsuite实现抓包"&gt;雷电模拟器连接BurpSuite实现抓包&lt;/h1&gt;
&lt;p&gt;参考：https://blog.csdn.net/qq_19946787/article/details/147362268&lt;/p&gt;
&lt;h2 id="证书的安装与移动到根目录"&gt;证书的安装与移动到根目录&lt;/h2&gt;
&lt;h3 id="证书的安装"&gt;证书的安装&lt;/h3&gt;
&lt;p&gt;根据前面的教程，已经将BurpSuite的CER格式证书放到了雷电模拟器的共享文件夹中。&lt;/p&gt;
&lt;p&gt;进入到安卓的共享文件夹端，单击CER认证文件，打开方式选择”证书安装程序“。&lt;/p&gt;
&lt;p&gt;给证书取名如”burp“，然后确定。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-051-1773300628100.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-052-1773300628316.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-053-1773300628559.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;安装的时候，由于安卓系统安全性限制，如果没有设置密码，会强制要求你先设置密码。&lt;/p&gt;
&lt;p&gt;例如我这里选择图案解锁。&lt;/p&gt;
&lt;p&gt;然后重新点击一次证书安装程序，系统会提示”已安装burp“。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-054-1773300628775.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-055-1773300628983.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-056-1773300629194.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;安装完成后，进入手机的”设置-安全-加密-信任的凭据-用户“，如果有下图的这个就可以了。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-057-1773300629408.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;但是现在直接进入浏览器进入某个网站例如&lt;code&gt;www.baidu.com&lt;/code&gt;会显示如下图所示。这是因为证书仍然在用户层面，而不是系统层面，正如上一张图所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-058-1773300629606.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;解决的办法是将证书移动到系统根目录。&lt;/p&gt;
&lt;h3 id="移动到根目录"&gt;移动到根目录&lt;/h3&gt;
&lt;p&gt;这里要使用到mt文件管理器，可以从https://mt2.cn/下载安装。&lt;/p&gt;
&lt;p&gt;其中左边框的&lt;code&gt;data/misc/user/0/cacert-added/9a5ba575.0&lt;/code&gt;是刚才已经安装的burpsuite的证书。&lt;/p&gt;
&lt;p&gt;然后右边框的&lt;code&gt;/etc/security/cacerts&lt;/code&gt;是系统的所有其他证书。&lt;/p&gt;
&lt;p&gt;长按左边框的证书，将其移动到右边目录下即可。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-059-1773300629942.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-060-1773300630207.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-061-1773300630413.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;再次查看设置中的证书页面”设置-安全-加密-信任的凭据-系统“，可以发现”用户“中的证书没了，移动到了”系统“中。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-062-1773300630698.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="burpsuite连接模拟器"&gt;BurpSuite连接模拟器&lt;/h2&gt;
&lt;p&gt;前面已经实现了BurpSuite的宿主机端口&lt;code&gt;192.168.110.98:8899&lt;/code&gt;的添加。&lt;/p&gt;
&lt;p&gt;现在要做的是将模拟器的流量转发到这个地址即可实现抓包。&lt;/p&gt;
&lt;p&gt;打开”设置-WLAN-设置-修改按钮“。&lt;/p&gt;
&lt;p&gt;输入代理服务器：&lt;code&gt;192.168.110.98&lt;/code&gt;和端口&lt;code&gt;8899&lt;/code&gt;，保存。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-063-1773300630955.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-064-1773300631140.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="测试引发的问题"&gt;测试引发的问题&lt;/h2&gt;
&lt;p&gt;在模拟器打开例如&lt;code&gt;www.baidu.com&lt;/code&gt;，在Burp中可以成功捕捉到对应域名的请求，说明配置成功。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-065-1773300631460.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="postern实现强制流量转发"&gt;Postern实现强制流量转发&lt;/h2&gt;
&lt;p&gt;上面测试中我们发现浏览器的流量已经可以通过BurpSuite捕捉到。&lt;/p&gt;
&lt;p&gt;进一步的，我们可以开始测试打开滑呗是否能够捕捉到对应的请求，事实上仍然不能成功，具体如下。&lt;/p&gt;
&lt;p&gt;问题现象：如下图所示，当打开滑呗中的某一张图时，左侧的抓包界面并没有任何的变化，说明流量并没有正确打到BurpSuite中。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-066-1773300631843.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;问题原因：这是因为有的app是不会走系统wifi设置的代理的，就像是windows上虽然设置了clash代理但是terminal、git这样的应用仍然不会走clash的代理通道需要单独设置一样。&lt;/p&gt;
&lt;p&gt;解决方法：可以使用Postern来对所有系统的流量强制进行转发到指定端口。&lt;/p&gt;
&lt;p&gt;在https://github.com/postern-overwal/postern-stuff/blob/master/Postern-3.1.2.apk进行postern的apk下载并拖入安装。&lt;/p&gt;
&lt;p&gt;安装完成后打开，显示版本比较旧，但实测可用。&lt;/p&gt;
&lt;p&gt;进入后先点击取消配置VPN，删除现有的所有配置代理和配置规则。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-067-1773300632102.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-068-1773300632292.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-069-1773300632511.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;随后进入”配置代理-添加代理服务器“，然后配置代理服务器的地址和端口是burpsuite设置好的地址端口，代理类型选择HTTPS/HTTP CONNECT。点击保存。&lt;/p&gt;
&lt;p&gt;然后进入”配置规则-添加规则“，然后配置如下面最右边图所示。匹配所有地址、通过代理连接，同时不要勾选”开始抓包“。点击保存。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-070-1773300632733.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-071-1773300632917.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-072-1773300633140.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;最后，点击”打开VPN“，点击确定。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-073-1773300633337.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-074-1773300633580.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="测试滑呗抓包"&gt;测试滑呗抓包&lt;/h2&gt;
&lt;p&gt;配置完成后，再次进入滑呗进行抓包测试。&lt;/p&gt;
&lt;p&gt;如下图所示，可以发现再次进入滑呗照片页面后，可以成功抓取到资源。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-075-1773300633815.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;点击其中的一张图片，在Response界面选择Render，可以看到图片预览图。说明确实成功获取到图片资源。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-076-1773300634195.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 id="当前方法的限制"&gt;当前方法的限制&lt;/h1&gt;
&lt;p&gt;观察图片的Request和Response信息，可以发现能抓取到的图片信息只有两类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;700清晰度的带水印图片&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-077-1773300634487.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;其请求体是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GET /prod/photo_wall/96/2026-03-08/photo/37ee0ee5-ea3f-1190542108089434112_x700.JPG?auth_key=1773287021-45c57fdfb93640e48602a66e10843f6c-0-b63af890daad6c0879ad8d9c09a85382 HTTP/2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host: imgali.fenxuekeji.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-Agent:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connection: Keep-Alive
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Accept-Encoding: gzip, deflate, br
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;300清晰度的不带水印图片&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-078-1773300634755.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;其请求体是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GET /prod/photo_wall/96/2026-03-08/photo/6731605d-e53e-1190542069326073856_x300.JPG?auth_key=1773287021-c718bc118d0d465d9f3e52507efa1234-0-4b64786be6607ec717a21a2ce235d558 HTTP/2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host: imgali.fenxuekeji.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-Agent:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connection: Keep-Alive
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Accept-Encoding: gzip, deflate, br
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="付费图片的抓包"&gt;付费图片的抓包&lt;/h1&gt;
&lt;p&gt;为了搞清楚付费图片的抓包网络请求逻辑，我自费购买了一张1080p 16.9元一张的图片。&lt;/p&gt;
&lt;p&gt;可以看到，购买后的图片右下角会有一个下载按钮。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/media_20260312_153016/media-079-1773300634977.png" alt="img" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;点击下载按钮，能够捕捉到下载图片的请求。图片较大，所以是通过两次请求分批获取的。两次请求的请求体分别是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GET /prod/photo_wall/96/2026-03-08/photo/37ee0ee5-ea3f-1190542108089434112_x3000.JPG?Expires=1773290659&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;OSSAccessKeyId=STS.NZSG6Vx55M3k4A3bRnMULEg6A&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;Signature=QkD9u5%2B7C0m1totVrZ1HTC9b2y0%3D&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;security-token=CAIS2gJ1q6Ft5B2yfSjIr5nmDIzileoU%2BvGANmeChlI7QdpgqqKdozz2IHlPeXVgCe8Zv%2F83nmpQ6fYflokiEsdJHR2YYcAgscgLqV35aoGZsJXlvORZ08ysSDKdU0ZzIUs4xb6rIunGc9KBNnrm9EYqs5aYGBymW1u6S%2B7r7bdsctUQWCShcDNCH604DwB%2BqcgcRxCzXLTXRXyMuGfLC1dysQdRkH527b%2FFoveR8R3Dllb3uIR3zsbTWsH9MZg3YscvA43qjL0nJ%2Fv7vXQOu0QQxsBfl7dZ%2FDrLhNaZDmRK7g%2BOW%2BiuqYQ0cVMpNvdlSvUc9qKkyq0loIvdh4Ps0AxANO1YST7YQI2wR19WtgUw17zTHJeM2BSlurjnXvGdOBP8aliQZQgDvVZ1n7PMrdiIni2bS8npsRmBeVzYaIOOs4oNsoFurH7jhrHnSRXxBdvQv0kWUnrkBRN1X3Z%2BGoABXxamGSIBgXUZoU7ibQtdXYXPY%2BiCoL86qGgFYSKxAdWqFqinM6PDMVjUDxlBwcmfwqOGwyqZrGdL960MVzJexlLYU6nCSUnhF3zosye5FgWXBPdV%2FXG24lzYpW1ZcjACaKPnWZwI9%2B37TeUwZT5fU4M4j%2B1p%2FrPlp7aRjmmg0GIgAA%3D%3D HTTP/1.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Range: bytes=0-822668
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-Agent: FileDownloader/1.7.7
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host: fxphoto.oss-cn-beijing.aliyuncs.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connection: keep-alive
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Accept-Encoding: gzip, deflate, br
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;和&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GET /prod/photo_wall/96/2026-03-08/photo/37ee0ee5-ea3f-1190542108089434112_x3000.JPG?Expires=1773290659&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;OSSAccessKeyId=STS.NZSG6Vx55M3k4A3bRnMULEg6A&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;Signature=QkD9u5%2B7C0m1totVrZ1HTC9b2y0%3D&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;security-token=CAIS2gJ1q6Ft5B2yfSjIr5nmDIzileoU%2BvGANmeChlI7QdpgqqKdozz2IHlPeXVgCe8Zv%2F83nmpQ6fYflokiEsdJHR2YYcAgscgLqV35aoGZsJXlvORZ08ysSDKdU0ZzIUs4xb6rIunGc9KBNnrm9EYqs5aYGBymW1u6S%2B7r7bdsctUQWCShcDNCH604DwB%2BqcgcRxCzXLTXRXyMuGfLC1dysQdRkH527b%2FFoveR8R3Dllb3uIR3zsbTWsH9MZg3YscvA43qjL0nJ%2Fv7vXQOu0QQxsBfl7dZ%2FDrLhNaZDmRK7g%2BOW%2BiuqYQ0cVMpNvdlSvUc9qKkyq0loIvdh4Ps0AxANO1YST7YQI2wR19WtgUw17zTHJeM2BSlurjnXvGdOBP8aliQZQgDvVZ1n7PMrdiIni2bS8npsRmBeVzYaIOOs4oNsoFurH7jhrHnSRXxBdvQv0kWUnrkBRN1X3Z%2BGoABXxamGSIBgXUZoU7ibQtdXYXPY%2BiCoL86qGgFYSKxAdWqFqinM6PDMVjUDxlBwcmfwqOGwyqZrGdL960MVzJexlLYU6nCSUnhF3zosye5FgWXBPdV%2FXG24lzYpW1ZcjACaKPnWZwI9%2B37TeUwZT5fU4M4j%2B1p%2FrPlp7aRjmmg0GIgAA%3D%3D HTTP/1.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Range: bytes=822669-
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-Agent: FileDownloader/1.7.7
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host: fxphoto.oss-cn-beijing.aliyuncs.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connection: keep-alive
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Accept-Encoding: gzip, deflate, br
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="其他思路"&gt;其他思路&lt;/h1&gt;
&lt;p&gt;可以考虑将一张低清晰度不带水印的图片+一张高清晰度带水印的图片同时喂给AI，让AI输出一张不带水印的高清晰度图片。&lt;/p&gt;
&lt;p&gt;参考提示词：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-SQL" data-lang="SQL"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;You&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;are&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;an&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;restoration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;enhancement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;Input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;low&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;but&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;without&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reference&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;only&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;recovering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;frequency&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;such&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;texture&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lighting&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Important&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;copy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reconstruct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Ignore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;regions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Reconstruct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;those&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;areas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;surrounding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;visual&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;without&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Goal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Produce&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;natural&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;looking&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;enhanced&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Rainmeter Daft Punk主题 + WebNowPlaying的网易云音乐Netease Music Web端适配</title><link>https://blackiepiggy.github.io/projects/rainmeter/</link><pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate><guid>https://blackiepiggy.github.io/projects/rainmeter/</guid><description>&lt;h2 id="效果展示"&gt;效果展示&lt;/h2&gt;
&lt;p&gt;&lt;video controls src="2026-02-28 14-07-09.mp4" title="Rainmeter Daft Punk主题"&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;Rainmeter极其轻量便携，允许用户自定义桌面组件，实现美观简洁的高度定制化。其中有Mond这样的出彩并被用户广泛使用的主题，其中的Music Player功能就是亮点。&lt;/p&gt;
&lt;p&gt;由于Mond这样的主题开发时间非常早（2019甚至更早），到现在长期无人维护，导致其无法适应现代流媒体播放器。追溯其原因，Mond 的 Music Player 功能依赖 Rainmeter 自带的 NowPlaying 插件。
NowPlaying 主要通过读取本地播放器（如 Winamp、iTunes、AIMP）的 API 或系统接口来获取播放信息。
但现代流媒体平台（Spotify Web、YouTube、网易云 Web）运行在浏览器沙箱环境中，并不会暴露传统播放器接口，因此 NowPlaying 无法获取播放状态。&lt;/p&gt;
&lt;p&gt;早已有人注意到这样的问题，因此推出了WebNowPlaying这样更为现代化的插件作为解决方案(
)。WebNowPlaying的官方文档中给出了其支持的流媒体播放平台，如下图所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="WebNowPlaying官方支持的网站"
srcset="https://blackiepiggy.github.io/projects/rainmeter/image_hu_1b6ad05159d55018.webp 320w, https://blackiepiggy.github.io/projects/rainmeter/image_hu_39c5f87b7f580723.webp 480w, https://blackiepiggy.github.io/projects/rainmeter/image_hu_e43fe44728fe3ad2.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://blackiepiggy.github.io/projects/rainmeter/image_hu_1b6ad05159d55018.webp"
width="760"
height="443"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;支持列表中并没有国内的平台，如网易云音乐等。于是乎我准备自己进行二次开发以适配网易云的Web端。&lt;/p&gt;
&lt;h2 id="开发过程"&gt;开发过程&lt;/h2&gt;
&lt;h3 id="rainmeter的mond的基础配置"&gt;Rainmeter的Mond的基础配置&lt;/h3&gt;
&lt;p&gt;下载好Rainmeter后，可以从
官方下载Mond的皮肤并单击安装。&lt;/p&gt;
&lt;p&gt;安装完成后，右击Rainmeter小图标，点击“皮肤-打开皮肤目录”，再打开Mond的皮肤根目录，找到&lt;code&gt;Mond\@Resources\Variables.inc&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="alt text"
srcset="https://blackiepiggy.github.io/projects/rainmeter/image-1_hu_5078d677c35791a8.webp 320w, https://blackiepiggy.github.io/projects/rainmeter/image-1_hu_14a41244ae1b9d34.webp 480w, https://blackiepiggy.github.io/projects/rainmeter/image-1_hu_ed8797173264937d.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://blackiepiggy.github.io/projects/rainmeter/image-1_hu_5078d677c35791a8.webp"
width="760"
height="483"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;默认的Variables.inc的内容为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Variables]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Language=English
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Location=SPXX0050
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Unit=m
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ScrollMouseIncrement=0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Format=H
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hidden=0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hidden2=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Player=Winamp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TextColor=255,255,255
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ButtonColor=250,126,0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将其&amp;quot;Player&amp;quot;项修改为WebNowPlaying，即&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Variables]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Language=English
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Location=SPXX0050
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Unit=m
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ScrollMouseIncrement=0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Format=H
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hidden=0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hidden2=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Player=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TextColor=255,255,255
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ButtonColor=250,126,0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;继续找到&lt;code&gt;Mond\Player.ini&lt;/code&gt;，其原始内容为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Rainmeter]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Update=100
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Author=Connect-R
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BackgroundMode=2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SolidColor=0,0,0,1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DynamicWindowSize=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AccurateText=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MouseScrollUpAction=[!SetVariable Scale &amp;#34;(#Scale#+#ScrollMouseIncrement#)&amp;#34;][!WriteKeyValue Variables Scale &amp;#34;(#Scale#+#ScrollMouseIncrement#)&amp;#34;][!Refresh]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MouseScrollDownAction=[!SetVariable Scale &amp;#34;(#Scale#-#ScrollMouseIncrement# &amp;lt; 1 ? 1 : #Scale#-#ScrollMouseIncrement#)&amp;#34;][!WriteKeyValue Variables Scale &amp;#34;(#Scale#-#ScrollMouseIncrement# &amp;lt; 1 ? 1 : #Scale#-#ScrollMouseIncrement#)&amp;#34;][!Refresh]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Variables]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@include=#@#Variables.inc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Scale=2.5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureArtist]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=NowPlaying.dll
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=ARTIST
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitue=&amp;#34;&amp;#34;:&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureTitle]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=NowPlaying.dll
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=TITLE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitue=&amp;#34;&amp;#34;:&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureAlbum]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=NowPlaying.dll
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=ALBUM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitue=&amp;#34;&amp;#34;:&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureProgress]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=NowPlaying.dll
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=PROGRESS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureDuration]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=NowPlaying.dll
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=DURATION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasurePosition]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=NowPlaying.dll
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=POSITION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureStateButton]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=NowPlaying.dll
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=STATE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitute=&amp;#34;0&amp;#34;:&amp;#34;#@#Play.png&amp;#34;,&amp;#34;1&amp;#34;:&amp;#34;#@#Pause.png&amp;#34;,&amp;#34;2&amp;#34;:&amp;#34;#@#Play.png&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureMinutesRemaining]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Calc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Formula=Trunc((MeasureDuration - MeasurePosition)/60)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RegExpSubstitute=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitute=&amp;#34;^(.)$&amp;#34;:&amp;#34;0\1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureSecondsRemaining]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Calc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Formula=((MeasureDuration - MeasurePosition) % 60)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RegExpSubstitute=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitute=&amp;#34;^(.)$&amp;#34;:&amp;#34;0\1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterArtist]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName=MeasureArtist
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringAlign=Center
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringCase=Upper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontFace=Aquatico
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontColor=#TextColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontSize=(4*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(95*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(15*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Text=&amp;#34;%1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterTitle]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName=MeasureTitle
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringAlign=Center
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringCase=Upper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontFace=Aquatico
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontColor=#TextColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontSize=(4*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(95*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(8*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Text=&amp;#34;%1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterDuration]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName=MeasureDuration
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringAlign=Center
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontFace=Quicksand
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontColor=#TextColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontSize=(4*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(10*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(2.5*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Text=&amp;#34;%1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterPosition]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName=MeasureMinutesRemaining
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName2=MeasureSecondsRemaining
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringAlign=Center
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontFace=Quicksand
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontColor=#TextColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontSize=(4*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(185*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(2.5*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Text=&amp;#34;-%1:%2&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterBar]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=Shape
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(23*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(5*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shape=Rectangle 0,0,(150*#Scale#),(1*#Scale#),0 | Fill Color #TextColor#,30 | StrokeWidth 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shape2=Rectangle 0,0,([MeasureProgress]*1.5*#Scale#),(1*#Scale#),0 | Fill Color #TextColor# | StrokeWidth 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shape3=Ellipse ([MeasureProgress]*1.5*#Scale#),(0.5*#Scale#),(1.2*#Scale#) |Fill Color #TextColor# | StrokeWidth 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shape4=Ellipse ([MeasureProgress]*1.5*#Scale#),(0.5*#Scale#),(3.4*#Scale#) |Fill Color #TextColor#,50 | StrokeWidth 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DynamicVariables=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LeftMouseUpAction=[!CommandMeasure &amp;#34;MeasureProgress&amp;#34; &amp;#34;SetPosition $MouseX:%$&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterPrevious]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=Image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageName=#@#Previous.png
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(69*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(35*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W=(13*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageTint=#ButtonColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SolidColor=0,0,0,1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LeftMouseUpAction=[!PluginBang &amp;#34;MeasureStateButton Previous&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterPlayPause]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=Image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageName=[MeasureStateButton]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(20*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(0*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W=(13*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SolidColor=0,0,0,1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageTint=#ButtonColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DynamicVariables=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LeftMouseUpAction=[!CommandMeasure &amp;#34;MeasureStateButton&amp;#34; &amp;#34;PlayPause&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterNext]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=Image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageName=#@#Next.png
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(20*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(0*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W=(13*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageTint=#ButtonColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SolidColor=0,0,0,1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LeftMouseUpAction=[!PluginBang &amp;#34;MeasureStateButton Next&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;应该将所有的&lt;code&gt;Plugin=NowPlaying.dll&lt;/code&gt;修改为&lt;code&gt;Plugin=WebNowPlaying&lt;/code&gt;，即修改为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Rainmeter]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Update=100
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Author=Connect-R
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BackgroundMode=2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SolidColor=0,0,0,1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DynamicWindowSize=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AccurateText=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MouseScrollUpAction=[!SetVariable Scale &amp;#34;(#Scale#+#ScrollMouseIncrement#)&amp;#34;][!WriteKeyValue Variables Scale &amp;#34;(#Scale#+#ScrollMouseIncrement#)&amp;#34;][!Refresh]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MouseScrollDownAction=[!SetVariable Scale &amp;#34;(#Scale#-#ScrollMouseIncrement# &amp;lt; 1 ? 1 : #Scale#-#ScrollMouseIncrement#)&amp;#34;][!WriteKeyValue Variables Scale &amp;#34;(#Scale#-#ScrollMouseIncrement# &amp;lt; 1 ? 1 : #Scale#-#ScrollMouseIncrement#)&amp;#34;][!Refresh]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Variables]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@include=#@#Variables.inc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Scale=2.5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureArtist]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=ARTIST
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitue=&amp;#34;&amp;#34;:&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureTitle]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=TITLE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitue=&amp;#34;&amp;#34;:&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureAlbum]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=ALBUM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitue=&amp;#34;&amp;#34;:&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureProgress]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=PROGRESS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureDuration]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=DURATION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasurePosition]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=POSITION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureStateButton]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=STATE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitute=&amp;#34;0&amp;#34;:&amp;#34;#@#Play.png&amp;#34;,&amp;#34;1&amp;#34;:&amp;#34;#@#Pause.png&amp;#34;,&amp;#34;2&amp;#34;:&amp;#34;#@#Play.png&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureMinutesRemaining]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Calc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Formula=Trunc((MeasureDuration - MeasurePosition)/60)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RegExpSubstitute=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitute=&amp;#34;^(.)$&amp;#34;:&amp;#34;0\1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureSecondsRemaining]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Calc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Formula=((MeasureDuration - MeasurePosition) % 60)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RegExpSubstitute=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitute=&amp;#34;^(.)$&amp;#34;:&amp;#34;0\1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterArtist]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName=MeasureArtist
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringAlign=Center
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringCase=Upper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontFace=Aquatico
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontColor=#TextColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontSize=(4*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(95*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(15*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Text=&amp;#34;%1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterTitle]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName=MeasureTitle
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringAlign=Center
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringCase=Upper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontFace=Aquatico
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontColor=#TextColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontSize=(4*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(95*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(8*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Text=&amp;#34;%1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterDuration]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName=MeasureDuration
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringAlign=Center
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontFace=Quicksand
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontColor=#TextColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontSize=(4*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(10*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(2.5*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Text=&amp;#34;%1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterPosition]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName=MeasureMinutesRemaining
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName2=MeasureSecondsRemaining
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringAlign=Center
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontFace=Quicksand
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontColor=#TextColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontSize=(4*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(185*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(2.5*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Text=&amp;#34;-%1:%2&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterBar]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=Shape
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(23*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(5*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shape=Rectangle 0,0,(150*#Scale#),(1*#Scale#),0 | Fill Color #TextColor#,30 | StrokeWidth 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shape2=Rectangle 0,0,([MeasureProgress]*1.5*#Scale#),(1*#Scale#),0 | Fill Color #TextColor# | StrokeWidth 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shape3=Ellipse ([MeasureProgress]*1.5*#Scale#),(0.5*#Scale#),(1.2*#Scale#) |Fill Color #TextColor# | StrokeWidth 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shape4=Ellipse ([MeasureProgress]*1.5*#Scale#),(0.5*#Scale#),(3.4*#Scale#) |Fill Color #TextColor#,50 | StrokeWidth 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DynamicVariables=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LeftMouseUpAction=[!CommandMeasure &amp;#34;MeasureProgress&amp;#34; &amp;#34;SetPosition $MouseX:%$&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterPrevious]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=Image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageName=#@#Previous.png
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(69*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(35*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W=(13*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageTint=#ButtonColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SolidColor=0,0,0,1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LeftMouseUpAction=[!PluginBang &amp;#34;MeasureStateButton Previous&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterPlayPause]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=Image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageName=[MeasureStateButton]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(20*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(0*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W=(13*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SolidColor=0,0,0,1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageTint=#ButtonColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DynamicVariables=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LeftMouseUpAction=[!CommandMeasure &amp;#34;MeasureStateButton&amp;#34; &amp;#34;PlayPause&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterNext]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=Image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageName=#@#Next.png
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(20*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(0*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W=(13*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageTint=#ButtonColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SolidColor=0,0,0,1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LeftMouseUpAction=[!PluginBang &amp;#34;MeasureStateButton Next&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="安装webnowplaying浏览器插件"&gt;安装WebNowPlaying浏览器插件&lt;/h3&gt;
&lt;p&gt;在
或者
找到WebNowPlaying的插件并安装。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="alt text"
srcset="https://blackiepiggy.github.io/projects/rainmeter/image-2_hu_96a72e8eb318ec97.webp 320w, https://blackiepiggy.github.io/projects/rainmeter/image-2_hu_8390babeaa89843.webp 480w, https://blackiepiggy.github.io/projects/rainmeter/image-2_hu_825697cb6be402ce.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://blackiepiggy.github.io/projects/rainmeter/image-2_hu_96a72e8eb318ec97.webp"
width="760"
height="410"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;成功安装后，可以在浏览器扩展区看到对应的插件图标，先将其固定在常用bar中，然后单击可以看到其显示绿色Connected。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="alt text"
srcset="https://blackiepiggy.github.io/projects/rainmeter/image-3_hu_b0073006c1d1e203.webp 320w, https://blackiepiggy.github.io/projects/rainmeter/image-3_hu_a92299934d5e0690.webp 399w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://blackiepiggy.github.io/projects/rainmeter/image-3_hu_b0073006c1d1e203.webp"
width="399"
height="586"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="测试其他流媒体网站的联通性"&gt;测试其他流媒体网站的联通性&lt;/h3&gt;
&lt;p&gt;到现在，应该可以正确获得到Spotify或者Youtube这样平台的流媒体信息了，随意打开一个网站，然后在桌面的Player插件中检测其是否能正确显示。&lt;/p&gt;
&lt;p&gt;如下图所示，可以看到，当前的显示方式为：左边是总时长，右边是剩余播放时间。这并不符合我们日常的使用习惯，因此我选择将其修改为：左边是已经播放的时间，右边是总时长。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="alt text"
srcset="https://blackiepiggy.github.io/projects/rainmeter/image-4_hu_efdaa6c5dc3bd08a.webp 320w, https://blackiepiggy.github.io/projects/rainmeter/image-4_hu_2c151943830684.webp 480w, https://blackiepiggy.github.io/projects/rainmeter/image-4_hu_601732653746ccb2.webp 543w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://blackiepiggy.github.io/projects/rainmeter/image-4_hu_efdaa6c5dc3bd08a.webp"
width="543"
height="134"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;对应将&lt;code&gt;Player.ini&lt;/code&gt;的内容修改为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Rainmeter]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Update=100
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Author=Connect-R
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BackgroundMode=2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SolidColor=0,0,0,1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DynamicWindowSize=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AccurateText=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MouseScrollUpAction=[!SetVariable Scale &amp;#34;(#Scale#+#ScrollMouseIncrement#)&amp;#34;][!WriteKeyValue Variables Scale &amp;#34;(#Scale#+#ScrollMouseIncrement#)&amp;#34;][!Refresh]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MouseScrollDownAction=[!SetVariable Scale &amp;#34;(#Scale#-#ScrollMouseIncrement# &amp;lt; 1 ? 1 : #Scale#-#ScrollMouseIncrement#)&amp;#34;][!WriteKeyValue Variables Scale &amp;#34;(#Scale#-#ScrollMouseIncrement# &amp;lt; 1 ? 1 : #Scale#-#ScrollMouseIncrement#)&amp;#34;][!Refresh]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Variables]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@include=#@#Variables.inc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Scale=2.8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureArtist]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=ARTIST
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitue=&amp;#34;&amp;#34;:&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureTitle]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=TITLE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitue=&amp;#34;&amp;#34;:&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureAlbum]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=ALBUM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitue=&amp;#34;&amp;#34;:&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureProgress]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=PROGRESS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureDuration]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=DURATION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasurePosition]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=POSITION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureStateButton]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin=WebNowPlaying
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerName=#Player#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PlayerType=STATE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitute=&amp;#34;0&amp;#34;:&amp;#34;#@#Play.png&amp;#34;,&amp;#34;1&amp;#34;:&amp;#34;#@#Pause.png&amp;#34;,&amp;#34;2&amp;#34;:&amp;#34;#@#Play.png&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;; 已播放时间（mm:ss）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureMinutesElapsed]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Calc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Formula=Trunc(MeasurePosition / 60)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RegExpSubstitute=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureSecondsElapsed]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Calc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Formula=Trunc(MeasurePosition % 60)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RegExpSubstitute=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitute=&amp;#34;^(.)$&amp;#34;:&amp;#34;0\1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;; 总时长（mm:ss）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureMinutesDuration]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Calc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Formula=Trunc(MeasureDuration / 60)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RegExpSubstitute=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeasureSecondsDuration]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure=Calc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Formula=Trunc(MeasureDuration % 60)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RegExpSubstitute=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Substitute=&amp;#34;^(.)$&amp;#34;:&amp;#34;0\1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterArtist]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName=MeasureArtist
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringAlign=Center
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringCase=Upper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontFace=Aquatico
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontColor=#TextColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontSize=(4*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(95*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(15*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Text=&amp;#34;%1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterTitle]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName=MeasureTitle
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringAlign=Center
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringCase=Upper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontFace=Aquatico
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontColor=#TextColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontSize=(4*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(95*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(8*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Text=&amp;#34;%1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterElapsed]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName=MeasureMinutesElapsed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName2=MeasureSecondsElapsed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringAlign=Center
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontFace=Quicksand
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontColor=#TextColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontSize=(4*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(10*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(2.5*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Text=&amp;#34;%1:%2&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterDuration]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName=MeasureMinutesDuration
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MeasureName2=MeasureSecondsDuration
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;StringAlign=Center
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontFace=Quicksand
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontColor=#TextColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FontSize=(4*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(185*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(2.5*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Text=&amp;#34;%1:%2&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterBar]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=Shape
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(23*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(5*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shape=Rectangle 0,0,(150*#Scale#),(1*#Scale#),0 | Fill Color #TextColor#,30 | StrokeWidth 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shape2=Rectangle 0,0,([MeasureProgress]*1.5*#Scale#),(1*#Scale#),0 | Fill Color #TextColor# | StrokeWidth 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shape3=Ellipse ([MeasureProgress]*1.5*#Scale#),(0.5*#Scale#),(1.2*#Scale#) |Fill Color #TextColor# | StrokeWidth 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shape4=Ellipse ([MeasureProgress]*1.5*#Scale#),(0.5*#Scale#),(3.4*#Scale#) |Fill Color #TextColor#,50 | StrokeWidth 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DynamicVariables=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LeftMouseUpAction=[!CommandMeasure &amp;#34;MeasureProgress&amp;#34; &amp;#34;SetPosition $MouseX:%$&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;-------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterPrevious]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=Image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageName=#@#Previous.png
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(69*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(35*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W=(13*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageTint=#ButtonColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SolidColor=0,0,0,1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LeftMouseUpAction=[!PluginBang &amp;#34;MeasureStateButton Previous&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterPlayPause]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=Image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageName=[MeasureStateButton]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(20*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(0*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W=(13*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SolidColor=0,0,0,1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageTint=#ButtonColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DynamicVariables=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LeftMouseUpAction=[!CommandMeasure &amp;#34;MeasureStateButton&amp;#34; &amp;#34;PlayPause&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MeterNext]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Meter=Image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageName=#@#Next.png
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;X=(20*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Y=(0*#Scale#)r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W=(13*#Scale#)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AntiAlias=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ImageTint=#ButtonColor#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SolidColor=0,0,0,1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LeftMouseUpAction=[!PluginBang &amp;#34;MeasureStateButton Next&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;即可成功实现，如下图所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="alt text"
srcset="https://blackiepiggy.github.io/projects/rainmeter/image-5_hu_efb0be46b8ae0b2d.webp 320w, https://blackiepiggy.github.io/projects/rainmeter/image-5_hu_8ac5c3441a1a3c0f.webp 480w, https://blackiepiggy.github.io/projects/rainmeter/image-5_hu_56d0028d9041e220.webp 537w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://blackiepiggy.github.io/projects/rainmeter/image-5_hu_efb0be46b8ae0b2d.webp"
width="537"
height="311"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="二次开发---添加网易云web端的支持"&gt;二次开发 - 添加网易云Web端的支持&lt;/h3&gt;
&lt;h4 id="fork并编译现有工程"&gt;Fork并编译现有工程&lt;/h4&gt;
&lt;p&gt;先Fork现有工程
，这里我fork到了自己的仓库：
。&lt;/p&gt;
&lt;p&gt;然后clone到本地，即&lt;code&gt;git clone git@github.com:BlackiePiggy/WebNowPlaying.git&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;随后先进行项目的编译，看是否能成功编译。先执行&lt;code&gt;pnpm install&lt;/code&gt;，再执行&lt;code&gt;pnpm run build&lt;/code&gt;，执行完成后，可以得到产物在&lt;code&gt;/dist&lt;/code&gt;。编译结果示例可以见下图。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="alt text"
srcset="https://blackiepiggy.github.io/projects/rainmeter/image-6_hu_6262cede9e10634d.webp 320w, https://blackiepiggy.github.io/projects/rainmeter/image-6_hu_68eb42e58a088cd0.webp 480w, https://blackiepiggy.github.io/projects/rainmeter/image-6_hu_728feb13d837bb68.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://blackiepiggy.github.io/projects/rainmeter/image-6_hu_6262cede9e10634d.webp"
width="760"
height="318"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;构建好之后，在扩展管理页开启“开发者模式”，加载已解压的扩展，选择 dist/chrome 目录。注意添加自己编译的插件前，要先关闭或者卸载此前加载的官方的插件。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="alt text"
srcset="https://blackiepiggy.github.io/projects/rainmeter/image-7_hu_74385533ff4c755c.webp 320w, https://blackiepiggy.github.io/projects/rainmeter/image-7_hu_211cc015085cb9e2.webp 480w, https://blackiepiggy.github.io/projects/rainmeter/image-7_hu_93f41e64b7a6462d.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://blackiepiggy.github.io/projects/rainmeter/image-7_hu_74385533ff4c755c.webp"
width="760"
height="467"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="alt text"
srcset="https://blackiepiggy.github.io/projects/rainmeter/image-8_hu_d19b60b6a258785b.webp 320w, https://blackiepiggy.github.io/projects/rainmeter/image-8_hu_819363545066a72a.webp 480w, https://blackiepiggy.github.io/projects/rainmeter/image-8_hu_2bd90dfee5a61d3e.webp 673w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://blackiepiggy.github.io/projects/rainmeter/image-8_hu_d19b60b6a258785b.webp"
width="673"
height="265"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id="添加neteasemusic的网站支持逻辑"&gt;添加NeteaseMusic的网站支持逻辑&lt;/h4&gt;
&lt;p&gt;此处通过观察项目&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WebNowPlaying/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ src/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ extension/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ ├─ content/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │ ├─ injected/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │ │ ├─ sites/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │ │ │ ├─ Spotify.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │ │ │ ├─ YouTube.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │ │ │ └─ NeteaseMusic.ts ← 新增
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;里面&lt;code&gt;Spotify.ts&lt;/code&gt;和&lt;code&gt;YouTube.ts&lt;/code&gt;的逻辑来对应写出来了&lt;code&gt;NeteaseMusic.ts&lt;/code&gt;，可以直接在同级目录下新建&lt;code&gt;WebNowPlaying\src\extension\content\injected\sites\NeteaseMusic.ts&lt;/code&gt;，然后在文件中粘贴：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Repeat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;StateMode&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;../../../types&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;_throw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;createDefaultControls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;createSiteInfo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;../utils&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getMeta&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;navigator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mediaSession&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getCover&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getMeta&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;art&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;artwork&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;artwork&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="err"&gt;??&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;artwork&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="err"&gt;??&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="err"&gt;去掉&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;art&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="n"&gt;art&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;parseTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;some&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Number&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isNaN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getTimeText&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="err"&gt;你验证过这里稳定存在：&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;00:32 / 02:54&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;span.j-flag.time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getPositionDuration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getTimeText&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;posStrRaw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;durStrRaw&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parseTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posStrRaw&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parseTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;durStrRaw&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getPlayButton&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="n"&gt;HTMLAnchorElement&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a[data-action=&amp;#34;play&amp;#34;],a[data-action=&amp;#34;pause&amp;#34;]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;isPlaying&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="n"&gt;boolean&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;btn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getPlayButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="err"&gt;你验证：&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pause&amp;#34;&lt;/span&gt; &lt;span class="err"&gt;表示正在播放（点击它会暂停）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pause&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;_throw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;querySelector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;HTMLElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;NeteaseMusic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Site&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;getMeta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;getTimeText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;isPlaying&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="err"&gt;有&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="err"&gt;控制按钮有&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="err"&gt;时间文本有，基本就绪&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="n"&gt;getMeta&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="n"&gt;getPlayButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;getTimeText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;createSiteInfo&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;NeteaseMusic&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getMeta&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="err"&gt;??&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;artist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getMeta&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;artist&lt;/span&gt; &lt;span class="err"&gt;??&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;album&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getMeta&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;album&lt;/span&gt; &lt;span class="err"&gt;??&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getCover&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isPlaying&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="n"&gt;StateMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PLAYING&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;StateMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PAUSED&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getPositionDuration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getPositionDuration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="err"&gt;你目前不需要音量&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;评分&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;循环&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;随机，这里给默认即可&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rating&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Repeat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Repeat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NONE&lt;/span&gt; &lt;span class="err"&gt;的数值一般是&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;（你项目里&lt;/span&gt; &lt;span class="n"&gt;Repeat&lt;/span&gt; &lt;span class="err"&gt;枚举可对照）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;btn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getPlayButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="n"&gt;StateMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PLAYING&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;play&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="n"&gt;StateMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PAUSED&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="n"&gt;StateMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;STOPPED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pause&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;skipPrevious&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a[data-action=&amp;#34;prev&amp;#34;]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;skipNext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a[data-action=&amp;#34;next&amp;#34;]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="err"&gt;你暂时不需要这些&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setPosition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setVolume&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setRating&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setRepeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setShuffle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;controls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;createDefaultControls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NeteaseMusic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;canSetState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;canSkipPrevious&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;canSkipNext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="err"&gt;如果以后你想支持拖动进度，我们再实现&lt;/span&gt; &lt;span class="n"&gt;setPosition&lt;/span&gt; &lt;span class="err"&gt;并把&lt;/span&gt; &lt;span class="n"&gt;canSetPosition&lt;/span&gt; &lt;span class="err"&gt;打开&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;canSetPosition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;NeteaseMusic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此处，使用 navigator.mediaSession.metadata 获取歌曲信息&lt;/p&gt;
&lt;p&gt;使用 DOM 查询控制按钮&lt;/p&gt;
&lt;p&gt;使用 span.j-flag.time 解析播放时间&lt;/p&gt;
&lt;p&gt;通过 data-action 判断播放状态&lt;/p&gt;
&lt;h4 id="修改注入路由支持"&gt;修改注入路由支持&lt;/h4&gt;
&lt;p&gt;在&lt;code&gt;src\extension\content\content.ts&lt;/code&gt;的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; match: () =&amp;gt; window.location.hostname === &amp;#34;music.youtube.com&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &amp;#34;YouTube Music&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; exec,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;后面添加&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; match: () =&amp;gt; window.location.hostname === &amp;#34;music.163.com&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name: &amp;#34;NeteaseMusic&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; exec,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同时找到&lt;code&gt;src\extension\content\injected\injected.ts&lt;/code&gt;，首先在文件头添加&lt;/p&gt;
&lt;p&gt;&lt;code&gt;import NeteaseMusic from &amp;quot;./sites/NeteaseMusic&amp;quot;;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;再在&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;sites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;中添加&lt;code&gt;NeteaseMusic,&lt;/code&gt;项。&lt;/p&gt;
&lt;p&gt;最后在&lt;code&gt;src\utils\settings.ts&lt;/code&gt;的&lt;/p&gt;
&lt;p&gt;&lt;code&gt;export type TSupportedSites =&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;和&lt;/p&gt;
&lt;p&gt;&lt;code&gt;export const SupportedSites: TSupportedSites[] = &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;分别添加&lt;code&gt;| &amp;quot;NeteaseMusic&amp;quot;&lt;/code&gt;和&lt;code&gt;&amp;quot;NeteaseMusic&amp;quot;,&lt;/code&gt;。&lt;/p&gt;
&lt;h4 id="编译项目并测试"&gt;编译项目并测试&lt;/h4&gt;
&lt;p&gt;修改上述内容后，再次在项目根目录执行&lt;code&gt;pnpm install&lt;/code&gt;，再执行&lt;code&gt;pnpm run build&lt;/code&gt;，最后将编译结果加载到扩展程序中，测试效果。正常情况下，可以正常获取到网易云音乐网页端正在播放的内容信息。&lt;/p&gt;</description></item><item><title>Pt-100铂电阻温度检测系统</title><link>https://blackiepiggy.github.io/projects/pt_platnium/</link><pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate><guid>https://blackiepiggy.github.io/projects/pt_platnium/</guid><description>&lt;h2 id="1-项目题目"&gt;1 项目题目&lt;/h2&gt;
&lt;p&gt;Pt铂电阻温度检测系统。&lt;/p&gt;
&lt;h2 id="2-电路系统总体方案介绍"&gt;2 电路系统总体方案介绍&lt;/h2&gt;
&lt;h3 id="21-电路总框架"&gt;2.1 电路总框架&lt;/h3&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903141507.png2025-09-03-14-15-08" alt="图2-1 传感信号电路处理实践电路总体框图" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;如图2-1所示，总体电路主要由传感器-接口电路-加法运算电路-放大电路-低通滤波电路组成。&lt;/p&gt;
&lt;h3 id="22-总体信号处理流程"&gt;2.2 总体信号处理流程&lt;/h3&gt;
&lt;p&gt;如图2-1所示，将Pt100铂电阻串入电桥电路的一个桥臂，随着温度变化，铂电阻阻值发生变化，电桥输出差分信号。将该差分信号与波形发生器产生的高频噪声（预设为1000Hz）通过加法运算电路的两个输入端叠加，模拟真实应用场景下环境中产生的高频噪声信号。随后信号进入差分放大电路或三运放差分放大电路，将信号放大到0~5V区间变化。最后通过一阶有源低通滤波电路滤除高频噪声信号，仅保留电桥输出后放大了的信号。最终信号完成处理，输出到后级电路。&lt;/p&gt;
&lt;p&gt;图2-2展示了整个信号处理电路过程中对信号每个阶段的信号输出结果进行的预估情况。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903141707.png2025-09-03-14-17-07" alt="图2-2 各阶段信号输出结果预估" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="3-个人电路设计部分pt100接口电路与部分差分放大电路调试"&gt;3 个人电路设计部分——PT100接口电路与部分差分放大电路调试&lt;/h2&gt;
&lt;h3 id="31-设计原理"&gt;3.1 设计原理&lt;/h3&gt;
&lt;h4 id="311-pt100简介与特性"&gt;3.1.1 Pt100简介与特性&lt;/h4&gt;
&lt;p&gt;利用金属铂的电阻值随温度变化而变化的物理特性制成的传感器称为铂电阻温度传感器。&lt;/p&gt;
&lt;p&gt;Pt100是一种较常用的热电阻传感器。它是一种铜热电阻，其阻值会随着温度的变化而改变。在0度时，PT100的阻值为100Ω，并且其属于正电阻系数，其电阻和温度变化的关系式如下：&lt;/p&gt;
$$R=R_0(1+\alpha T)$$&lt;p&gt;其测量范围可达-200℃~850℃，热响应时间＜30s，以及其他参数可见表2-7-1。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e8%a1%a82-7-1.png2025-09-03-14-20-53" alt="表2-7-1" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;另外，Pt电阻温度传感器具有精度高，稳定性好，可靠性强，寿命长的优点。&lt;/p&gt;
&lt;h4 id="312-pt100信号线介绍"&gt;3.1.2 Pt100信号线介绍&lt;/h4&gt;
&lt;p&gt;Pt100铂电阻的测量电路主要分为两线制、三线制和四线式三种方式。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;两线式测量&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;传感器电阻变化值与连接导线电阻值共同构成传感器的输出值﹐由于导线电阻带来的附加误差使实际测量值偏高,用于测量精度要求不高的场合,并且导线的长度不宜过长。如图3-1所示，与普通电阻原理相似。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-1%e9%93%82%e7%94%b5%e9%98%bb%e4%ba%8c%e7%ba%bf%e5%bc%8f%e6%b5%8b%e9%87%8f.png2025-09-03-14-22-23" alt="图3-1铂电阻二线式测量" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;三线式测量&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;要求引出的三根导线截面积和长度均相同,测量铂电阻的电路一般是不平衡电桥,铂电阻作为电桥的一个桥臂电阻。将一根导线接到电桥的电源端,其余两根分别接到铂电阻所在的桥臂及与其相邻的桥臂上,当桥路平衡时(压差为0)，通过计算可知&lt;/p&gt;
$$R_1 = R_1 \times \frac{R_3}{R_2}+R_1 \times \frac{r}{R_2}-r $$&lt;p&gt;当R1=R2时,导线电阻的变化对测量结果没有任何影响，这样就消除了导线线路电阻带来的测量误差，但是必须为全等臂电桥，否则不可能完全消除导线电阻的影响，但分析可见，采用三线制会大大减小导线电阻带来的附加误差，工业上一般都采用三线制接法。如图3-2所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-2_%e9%93%82%e7%94%b5%e9%98%bb%e4%b8%89%e7%ba%bf%e5%bc%8f%e6%b5%8b%e9%87%8f.png2025-09-03-14-22-48" alt="图3-2_铂电阻三线式测量" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;四线式测量&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;当测量电阻数值很小时，测试线的电阻可能引人明显误差，四线测量用两条附加测试线提供恒定电流，另两条测试线测量未知电阻的电压降，在电压表输入阻抗足够高的条件下，电流几乎不流过电压表，这样就可以精确测量未知电阻上的压降,通过计算得出电阻值。这种方式的测量方法，铂电阻的连线可以达到十几米，而不受分布式电阻的影响，如图3-3所示,采用同质等长导线。&lt;/p&gt;
&lt;p&gt;=
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-3_%e9%93%82%e7%94%b5%e9%98%bb%e5%9b%9b%e7%ba%bf%e5%bc%8f%e6%b5%8b%e9%87%8f.png2025-09-03-14-23-01" alt="图3-3_铂电阻四线式测量" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;本次实践中采用了三线制的PT100铂电阻传感器。&lt;/p&gt;
&lt;p&gt;如图3-4所示，PT100铂电阻传感器有三根引线，可用A、B、C（对应黑、红、黄）来代表三根线。&lt;/p&gt;
&lt;p&gt;三根线之间有如下规律：A与B或C之间的阻值常温下在110Ω左右，B与C之间为0Ω，B与C在内部是直通的，原则上B与C可视为同一接口。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-4_%e9%93%82%e7%94%b5%e9%98%bb%e4%b8%89%e7%ba%bf%e5%bc%8f%e6%b5%8b%e9%87%8f.png2025-09-03-14-23-22" alt="图3-4_铂电阻三线式测量" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id="313-预估信号输出情况"&gt;3.1.3 预估信号输出情况&lt;/h4&gt;
&lt;p&gt;如图3-5所示，PT100的电阻值随着温度的升高而升高。常温下，PT100铂电阻的阻值为100Ω，另外三个桥臂阻值常采用100Ω的标准电阻，因此有：&lt;/p&gt;
$$u_0 - = \frac{5}{2} = 2.5V; u_o + = \frac{110}{210} \times 5 = 2.619V; u_o = u_o + - u_o - = 119mV$$&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/1.%e5%b8%b8%e6%b8%a9%e4%b8%8b%ef%bc%9a.png2025-09-03-14-23-37" alt="1.常温下：" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/2.0%e5%ba%a6%e4%b8%8b%ef%bc%9a.png2025-09-03-14-24-01" alt="2.0度下：" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/3.100%e5%ba%a6%e4%b8%8b%ef%bc%9a.png2025-09-03-14-24-23" alt="3.100度下：" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/4.600%e5%ba%a6%e4%b8%8b%ef%bc%9a.png2025-09-03-14-24-37" alt="4.600度下：" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;因此在大多数的应用场景下，该接口电路的输出电压范围为0 ~ 500mV，从而差动放大电路放大倍数取5 ~ 10倍，此处没有高温环境，因此取放大10倍即可。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-5_%e9%93%82%e7%94%b5%e9%98%bb%e7%9a%84%e6%b8%a9%e5%ba%a6%e7%89%b9%e6%80%a7%e6%9b%b2%e7%ba%bf.png2025-09-03-14-24-55" alt="图3-5_铂电阻的温度特性曲线" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="32-设计方案与实物搭建"&gt;3.2 设计方案与实物搭建&lt;/h3&gt;
&lt;p&gt;按照前文提及并验证后的设计原理，将PT100铂电阻接入电桥电路的一个桥臂，详细接法见图3-6。铂电阻引线A接恒压源的负极输出，引线B接桥臂一端，引线C接桥臂另一端。此处由于没有插孔，故只能采用绕线式接法。此接法（三线式）的优点已于前文提及。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-6_%e7%94%b5%e8%b7%af%e7%90%86%e8%ae%ba%e8%ae%be%e8%ae%a1%e6%96%b9%e6%a1%88.png2025-09-03-14-25-09" alt="图3-6_电路理论设计方案" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;由于提供的标准电阻没有$110Ω$的，故取$R1=R2=R3=100Ω$，此时在常温下铂电阻传感器有最小的信号输出。&lt;/p&gt;
&lt;p&gt;图3-7展示了该接口电路在不同温度下的Multisim仿真情况，与前文中对预估信号的计算一致。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%28a%290%c2%b0C%e4%b8%8b.png2025-09-03-14-25-22" alt="(a)0°C下" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%28b%29%e5%b8%b8%e6%b8%a9%e4%b8%8b.png2025-09-03-14-25-36" alt="(b)常温下" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%28c%29100%c2%b0C%e4%b8%8b.png2025-09-03-14-25-49" alt="(c)100°C下" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%28d%29600%c2%b0C%e4%b8%8b.png2025-09-03-14-26-05" alt="(d)600°C下" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;center&gt;图3-7 PT100接口电路Multisim仿真&lt;/center&gt;
&lt;p&gt;实物连接图如图3-8所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-8_%e4%bc%a0%e6%84%9f%e5%99%a8%e5%ae%9e%e7%89%a9%e6%8e%a5%e7%ba%bf%e7%a4%ba%e6%84%8f%e5%9b%be.png2025-09-03-14-26-28" alt="图3-8_传感器实物接线示意图" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;图中需要接入面包板的接口均采用导线绕线的方式完成连接，不同引线的连接口信息已在图中用红字标注出来。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-9_%e7%a8%b3%e5%8e%8b%e6%ba%90%e8%bf%9e%e7%ba%bf%e7%a4%ba%e6%84%8f%e5%9b%be.png2025-09-03-14-26-44" alt="图3-9_稳压源连线示意图" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;图3-9展示了传感器连线与稳压源连线的示意图，并旋转旋钮调整至输出电压为5.0V。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-10_%e7%94%b5%e8%b7%af%e6%9d%bf%e8%ae%be%e8%ae%a1%e5%ae%9e%e7%89%a9%e5%9b%be.png2025-09-03-14-27-03" alt="图3-10_电路板设计实物图" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-11_%e5%b8%a6%e4%bf%a1%e5%8f%b7%e8%be%93%e5%85%a5%e7%9a%84%e7%94%b5%e8%b7%af%e6%9d%bf.png2025-09-03-14-27-19" alt="图3-11_带信号输入的电路板" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;图3-10展示了电路板的设计实物图。其中，中间两块$30\times 5$的孔阵每一行是导通的，可视作一个点；两边两块$2\times 25$的孔阵每一列是导通的，可视作一个点。电桥上三个标准电阻从上至下分别为R1、R2、R3，Pt100有1-a和10-a两个孔接入B和C。信号输出端两端口分别为1-e和7-e，通向后级差分放大电路。&lt;/p&gt;
&lt;p&gt;如图3-11所示，将图2-7-10的接口与稳压源与后级电路连接后，接口电路的设计基本完成。其中，特别需要注意，要将整个电路板上的接地处接入统一的公共接地端，如孔10-d连接到右电路板中的“-”列中，并将该列接入稳压源的负极输出端。&lt;/p&gt;
&lt;h3 id="33-电路调试"&gt;3.3 电路调试&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;电路连接&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;按照接口电路原理图2-7-6，连接相应器件于导线，连接好的电路板如图3-10，带信号输入的电路板如图3-11所示。&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;连接信号源后的现象&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如图3-12所示，将万用表调节到200mV挡位，红表笔连接万用表上“VΩ”端，黑表笔连接“COM”端。红色笔头和黑色笔头分别插入常温下$Uo+$和$Uo-$两个信号输出端口。示数稳定后大约波动在175mV左右。实验过程中，不同的万用表测量获得的电压值有所区别，因此该测量结果可能会存在一定的误差。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-12_%e5%b8%b8%e6%b8%a9%e4%b8%8b%e4%bf%a1%e5%8f%b7%e8%be%93%e5%85%a5.png2025-09-03-14-27-44" alt="图3-12_常温下信号输入" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;温度变化后的现象&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;将PT100插入到盛有热水的水杯中，观察万用表200mV下的变化。&lt;/p&gt;
&lt;p&gt;可以观察到，随时间增加，电压表示数以大约每2s增加1mV的速率增加。过程中对万用表示数变化的记录如图3-13所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-13%281%29%e5%8d%87%e6%b8%a9%e5%90%8e%e4%bf%a1%e5%8f%b7%e8%be%93%e5%87%ba.png2025-09-03-14-30-32" alt="图3-13(1)升温后信号输出" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 id="图3-132升温后信号输出"&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-13%282%29%e5%8d%87%e6%b8%a9%e5%90%8e%e4%bf%a1%e5%8f%b7%e8%be%93%e5%87%ba.png2025-09-03-14-30-47" alt="图3-13(2)升温后信号输出" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/h1&gt;
&lt;h3 id="34-出现问题与解决办法"&gt;3.4 出现问题与解决办法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;电阻误差导致输出信号误差&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;与理论计算输出相比，电阻存在一定误差，从图2-7-14中可以看出，用电阻档“2K”测量标准100Ω电阻仅测得88Ω。不同电阻的不同误差导致在常温下电压理论输出119mV变为175mV，属于合理的情况。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-14_%e7%94%b5%e9%98%bb%e8%af%af%e5%b7%ae.png2025-09-03-14-31-03" alt="图3-14_电阻误差" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;解决办法：使用精度更高的温度计对不同电压输出值进行标定，但同样可能会因为电阻通电后温度升高阻值改变造成，从而又会产生误差。故换用精度更高、热稳定性更好的电阻可能会是更好的解决方案。&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;稳压源输出误差&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be3-15_%e7%a8%b3%e5%8e%8b%e6%ba%90%e8%be%93%e5%87%ba%e8%af%af%e5%b7%ae.png2025-09-03-14-31-15" alt="图3-15_稳压源输出误差" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;如图2-7-15所示，稳压电源的输出显示面板上显示为“5.0V”，显示到小数点后一位，再对输出引脚进行电压测量，可以发现电压表的示数为“5.07V”，显示到小数点后两位，这样的情况会造成小数点后两位上存在一定的误差。&lt;/p&gt;
&lt;p&gt;另外，在实验过程中，还有另外一台稳压源机器，输出设置为“5.0V”，但测量输出结果仅有“4.3V”，因此误差达到了0.7V，并且随时间变化，误差还会发生变化，这也会对传感器的输出信号产生影响。&lt;/p&gt;
&lt;p&gt;解决办法：换用稳定精度高的稳压电源；将标准5V信号接入电桥电路前先用万用表对输出信号进行测量，待其稳定到5.00V的时候，再接入电路。&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;600℃极限输出没法进行信号测量&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在实验过程中，由于实验室没有高温加热炉对PT100进行升温，只能采用沸水对电路进行变温测试。因此很难对＞100℃情况下的电桥输出信号进行测量。&lt;/p&gt;
&lt;p&gt;解决办法：使用高温加热炉进行加热。&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;信号输出不稳定&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;实验过程中，出现了信号不稳定甚至丢失的情况，在对众多原因进行排查后，我对所有导线进行了重新绕线，保证其紧密接触，从而解决了信号输出丢失和不稳定的问题。&lt;/p&gt;
&lt;h3 id="35-个人分工任务完成情况"&gt;3.5 个人分工任务完成情况&lt;/h3&gt;
&lt;p&gt;对于我负责的电路接口电路部分，我以较高的完成度实现了所有预先要求的步骤，包括：电路原理的解释，电路仿真情况，电路的实物搭建，电路的调试工作。&lt;/p&gt;
&lt;p&gt;电路原理上设计合理，采用了工程常用的三线式设计，减小了导线误差对电路输出结果的影响。原理上还对预期获得的输出信号进行了理论计算，并因此给出了后级差分放大电路的设计要求。电路仿真中给出的仿真结果与前期理论设计中的计算结果完美契合，验证了设计的合理性。实物搭建合理，电路板元件放置位置合理清晰，并在报告中对接口功能进行了标注。最终的电路调试工作在误差允许范围内验证了电路设计的正确性，整个过程完成情况良好，并且耗时较短。&lt;/p&gt;
&lt;h2 id="4-电路联调"&gt;4 电路联调&lt;/h2&gt;
&lt;h3 id="41-整体联调过程"&gt;4.1 整体联调过程&lt;/h3&gt;
&lt;p&gt;图2-8-1展示了整体联调电路的实物图。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be4-1_%e6%95%b4%e4%bd%93%e8%81%94%e8%b0%83%e7%94%b5%e8%b7%af.png2025-09-03-14-29-36" alt="图4-1_整体联调电路" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;各个电路模块的名称已经在图中进行标注。电路的联调最终没能完成四个模块的信号流通，但我完成了与差分放大电路的联调工作，具体完成情况如下所述。&lt;/p&gt;
&lt;p&gt;图2-8-2展示了与差分放大电路的联调电路。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be4-2_%e4%b8%a4%e6%a8%a1%e5%9d%97%e8%81%94%e8%b0%83%e7%94%b5%e8%b7%af.png2025-09-03-14-29-22" alt="图4-2_两模块联调电路" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;该电路差分电路输出信号测量点为a-4。分别测量接口电路输出信号与差分放大电路输出信号，理论上应该放大10倍。&lt;/p&gt;
&lt;p&gt;测量结果如图2-8-3所示。&lt;/p&gt;
&lt;center&gt;
&lt;img src = "https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903142818.png2025-09-03-14-28-20" width = "50%" style = "transform:rotate(90deg)"&gt;
&lt;img src = "https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903142807.png2025-09-03-14-28-08" width = "38%"&gt;
&lt;br&gt;
图4-3 测量结果
&lt;/center&gt;
&lt;p&gt;从图中可以观察到：PT100接口电路输出电压为0.25V，经差分放大电路后输出信号电压值达到2.43V，$放大倍数 = \frac{2.43}{0.25} = 9.72$，与预期设计的10倍基本匹配。考虑到电路中的各类误差，可以认为设计成功，并且联调成功。&lt;/p&gt;
&lt;h3 id="42-联调中出现的问题与解决办法"&gt;4.2 联调中出现的问题与解决办法&lt;/h3&gt;
&lt;h4 id="421-信号输出值不正确"&gt;4.2.1 信号输出值不正确&lt;/h4&gt;
&lt;p&gt;实验过程中，出现了电压值差值太多，如已经在接口电路输出点达到几伏的电压量级。经过问题排查后，通过统一接入系统地线的方法解决了该问题。从图2-8-2中可以看出，统一地线从左往右第三列蓝线的顶端接入，每个模块电路板中都将地接入到蓝线的一列中。&lt;/p&gt;
&lt;h4 id="422信号输出不稳定"&gt;4.2.2信号输出不稳定&lt;/h4&gt;
&lt;p&gt;实验过程中，某些时刻会出现信号输出不稳定的情况。经过问题排查，发现是因为联调过程中线变多，特别是没有绝缘包层的裸露导线。当某些线互相触碰时，会发生短接，导致信号输出异常。&lt;/p&gt;
&lt;p&gt;解决办法为重新选用长度恰好合适的导线，并且将电路板周边的线材有序摆放。&lt;/p&gt;
&lt;h4 id="423-滤波单独可调联调失败"&gt;4.2.3 滤波单独可调，联调失败&lt;/h4&gt;
&lt;p&gt;至今未找到原因。整体联调也调至此部分。主要对发生故障的原因做一下猜测：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;芯片发生问题。但在调试过程中已经更换过芯片，但问题仍未解决；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;部分导线导通问题。但在调试过程中，我们也利用了万用表的导通档进行了导通测试，并未发现断路情况；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;由于布线交错，特别是垂直交错，可能出现电磁干扰的情况，解决办法是重新布线，避免交错与直角走线。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="43系统总体完成情况"&gt;4.3系统总体完成情况&lt;/h3&gt;
&lt;p&gt;各个模块单独调通，PT100接口电路与差分放大电路的联调成功。&lt;/p&gt;</description></item><item><title>传感器实践报告</title><link>https://blackiepiggy.github.io/projects/sensing/</link><pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate><guid>https://blackiepiggy.github.io/projects/sensing/</guid><description>&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-01.png2025-09-03-17-32-58" alt="最终提交报告-01" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-02.png2025-09-03-17-33-10" alt="最终提交报告-02" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-03.png2025-09-03-17-33-16" alt="最终提交报告-03" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-04.png2025-09-03-17-33-21" alt="最终提交报告-04" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-05.png2025-09-03-17-33-25" alt="最终提交报告-05" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-06.png2025-09-03-17-33-33" alt="最终提交报告-06" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-07.png2025-09-03-17-33-39" alt="最终提交报告-07" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-08.png2025-09-03-17-33-44" alt="最终提交报告-08" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-09.png2025-09-03-17-33-48" alt="最终提交报告-09" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-10.png2025-09-03-17-33-53" alt="最终提交报告-10" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-11.png2025-09-03-17-33-57" alt="最终提交报告-11" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-12.png2025-09-03-17-34-01" alt="最终提交报告-12" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-13.png2025-09-03-17-34-06" alt="最终提交报告-13" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-14.png2025-09-03-17-34-10" alt="最终提交报告-14" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-15.png2025-09-03-17-34-14" alt="最终提交报告-15" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-16.png2025-09-03-17-34-19" alt="最终提交报告-16" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-17.png2025-09-03-17-34-24" alt="最终提交报告-17" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-18.png2025-09-03-17-34-28" alt="最终提交报告-18" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-19.png2025-09-03-17-34-33" alt="最终提交报告-19" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-20.png2025-09-03-17-34-38" alt="最终提交报告-20" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-21.png2025-09-03-17-34-45" alt="最终提交报告-21" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-22.png2025-09-03-17-34-49" alt="最终提交报告-22" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-23.png2025-09-03-17-34-53" alt="最终提交报告-23" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-24.png2025-09-03-17-34-57" alt="最终提交报告-24" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-25.png2025-09-03-17-35-03" alt="最终提交报告-25" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-26.png2025-09-03-17-35-07" alt="最终提交报告-26" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-27.png2025-09-03-17-35-22" alt="最终提交报告-27" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-28.png2025-09-03-17-35-36" alt="最终提交报告-28" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-29.png2025-09-03-17-35-41" alt="最终提交报告-29" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-30.png2025-09-03-17-35-45" alt="最终提交报告-30" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-31.png2025-09-03-17-35-49" alt="最终提交报告-31" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-32.png2025-09-03-17-35-53" alt="最终提交报告-32" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-33.png2025-09-03-17-35-58" alt="最终提交报告-33" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-34.png2025-09-03-17-36-01" alt="最终提交报告-34" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-35.png2025-09-03-17-36-06" alt="最终提交报告-35" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-36.png2025-09-03-17-36-10" alt="最终提交报告-36" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-37.png2025-09-03-17-36-14" alt="最终提交报告-37" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-38.png2025-09-03-17-36-18" alt="最终提交报告-38" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-39.png2025-09-03-17-36-22" alt="最终提交报告-39" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-40.png2025-09-03-17-36-27" alt="最终提交报告-40" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-41.png2025-09-03-17-36-31" alt="最终提交报告-41" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e6%9c%80%e7%bb%88%e6%8f%90%e4%ba%a4%e6%8a%a5%e5%91%8a-42.png2025-09-03-17-36-35" alt="最终提交报告-42" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>基于51单片机的电子秤称重计数系统</title><link>https://blackiepiggy.github.io/projects/dianzicheng/</link><pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate><guid>https://blackiepiggy.github.io/projects/dianzicheng/</guid><description>&lt;h2 id="0-演示效果"&gt;0 演示效果&lt;/h2&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be0-1_%e7%a1%ac%e4%bb%b6%e5%8e%9f%e7%90%86%e5%9b%be.png" alt="图0-1 硬件原理图" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;演示视频：&lt;/p&gt;
&lt;video autoplay loop &gt;
&lt;source src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/video-for-typora/%e6%bc%94%e7%a4%ba%e8%a7%86%e9%a2%91.mp4" type="video/mp4"&gt;
&lt;/video&gt;
&lt;h2 id="1-设计题目"&gt;1 设计题目&lt;/h2&gt;
&lt;p&gt;电子秤称重计数系统。&lt;/p&gt;
&lt;h2 id="2-设计要求"&gt;2 设计要求&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;了解扩展版、HX711模块的功能；&lt;/li&gt;
&lt;li&gt;安装电子秤传感器及支架后，用HX711模块获取测量得到的重力大小，量程为0g~1000g；&lt;/li&gt;
&lt;li&gt;按下“去皮”键，将数值清零，以当前重力为基准，显示重量数值；&lt;/li&gt;
&lt;li&gt;OLED液晶显示物品重量和设置信息。OLED液晶第1行显示物品重量，四舍五入到小数点后2位；第2行显示设定的重量，四舍五入到小数点后1位，当称重超过设定重量后，累积数量加1（建议16个按键的功能分别为：0~9、设置、左移、右移、上移/去皮、下移、确认）；第3行显示自上电以后的累计数量；&lt;/li&gt;
&lt;li&gt;下载程序第一次上电，设定值有默认值，后续如果修改设定值，设定值存入AT24C02，掉电不丢失；&lt;/li&gt;
&lt;li&gt;制定通讯协议，可以通过发送指令，在PC机通过串口助手获取当前的累计数量；&lt;/li&gt;
&lt;li&gt;制定通讯协议，可以发送指令，通过上位机设定重量阈值。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="3-设计背景与设计目的"&gt;3 设计背景与设计目的&lt;/h2&gt;
&lt;p&gt;在农业、工业生产的过程中，我们通常需要对农产品、零件等物品进行分等级或者说质量检测。以果农为例，从果园中收获回来的水果有大有小，质量等级不一致，果农常需要对这些产品进行称重，并计算产品中合格品的数量。&lt;/p&gt;
&lt;p&gt;本设计的目的是为了解决此类问题，例如单个水果质量大于100g符合质量合格要求，通过设计系统将阈值重量输入，只需挨个将水果放上称重台即可完成对合格水果的计数工作。同时我们定义了接口，每当出现一次合格水果后，能发出特定信号，以控制其他装置，例如分拣装置等。这样就能完成流水线式的自动化质量检测，极大提升了生产的效率，节约了时间和人力成本。&lt;/p&gt;
&lt;h2 id="4-设计原理"&gt;4 设计原理&lt;/h2&gt;
&lt;p&gt;该系统主要测量原理是基于电阻式应变片实现的。传感器由横梁（金属）和四个应变片组成。安装示意图如下图4-1所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be4-1_%e4%bc%a0%e6%84%9f%e5%99%a8%e5%ae%89%e8%a3%85%e7%a4%ba%e6%84%8f%e5%9b%be.png" alt="图4-1 传感器安装示意图" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;利用四个应变片组成全桥电路，如图4-2所示。这样的电路结构具有消除平台、改善线性、温度补偿以及增大灵敏度的优点。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be4-2_%e5%85%a8%e6%a1%a5%e7%94%b5%e8%b7%af.png" alt="图4-2 全桥电路" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;此时，电桥输出$U_o=U\frac{\Delta R}{R}$.&lt;/p&gt;
&lt;p&gt;输出电信号经过滤波电路、运放电路、A/D转换电路后可量化为数字量。本模块采用24位精度的AD转换芯片HX-711，具有两路模拟通道输入，内部集成了128倍增益可编程放大器，是一款理想精度、低成本采样前端模块。该传感器的量程可以达到10kg，分辨率可达0.5g，满足本设计题目的要求。&lt;/p&gt;
&lt;h2 id="5-所用仪器与目的"&gt;5 所用仪器与目的&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;标准砝码一组。用于传感器标定。&lt;/li&gt;
&lt;li&gt;万用表。用于电路故障测试。&lt;/li&gt;
&lt;li&gt;电烙铁。用于焊接。&lt;/li&gt;
&lt;li&gt;PC机。用于编程、调试、画图。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="6-总体设计方案"&gt;6 总体设计方案&lt;/h2&gt;
&lt;h3 id="61-硬件框架设计"&gt;6.1 硬件框架设计&lt;/h3&gt;
&lt;p&gt;根据设计题目要求，总体硬件方案设计如下图6-1所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be6-1_%e6%80%bb%e4%bd%93%e7%a1%ac%e4%bb%b6%e6%a1%86%e6%9e%b6.png" alt="图6-1 总体硬件框架" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;该硬件方案图是以做出实物为目标设计的，故部分硬件的驱动电路直接纳入相应的模块中。考虑到团队成员间程序联调方便，采用大家都学过的基于STC89C52的51mini板，晶振频率为固定11.5092MHz，基本能满足电子秤系统的实时性要求与算力要求。&lt;/p&gt;
&lt;p&gt;系统的信号来源于电阻式应变片，使用四个应变片（2个受拉、2个受压），贴在梁式称重传感器上，所用的信号转换电路为HX-711模块，经过传感器的输出电路、放大电路滤波电路、AD转换电路后转换为数字电压量。传感器组成框图如下图6-2所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be6-2_%e4%bc%a0%e6%84%9f%e5%99%a8%e7%bb%84%e6%88%90%e6%a1%86%e5%9b%be.png" alt="图6-2 传感器组成框图" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;MCU通过模拟IIC的方式从HX-711模块读取电压数据，后续还进行如多次采样与滑动窗口滤波进行数据处理，处理后的数据需要利用标准砝码对该传感器进行数据标定，从而完成测量任务。&lt;/p&gt;
&lt;p&gt;人机交互部分由$4\times 4$的薄膜矩阵键盘与0.96寸的OLED构成，矩阵键盘通过一组IO进行中断扫描，实现按键检测。MCU通过IIC对OLED进行读写操作，完成数据的显示。不同按键分别可实现设置、确认、变数、去皮的操作。测量模式下第一行物品重量有与第三行累计重量刷新，设置模式下第二行数据可改，第三行数据不刷新。&lt;/p&gt;
&lt;p&gt;EEPROM部分主要负责完成相关数据的断电存储，通过IIC与MCU互相通信。每次开机后，系统会从EEPROM中取出上次断电前设定值。&lt;/p&gt;
&lt;p&gt;PC上位机主要通过串口的方式与单片机进行通讯，MCU出来的串口通讯时TTL电平，而我们的PC机并不能识别TTL电平，使用51mini板载CH340芯片模拟COM口，完成PC与单片机的通讯。另外，在设计中还考虑使用LORA无线通信模块完成MCU与上位机的交互，不同的LORA模块与其主机用串口通信。&lt;/p&gt;
&lt;h3 id="62-软件框架设计"&gt;6.2 软件框架设计&lt;/h3&gt;
&lt;p&gt;系统软件的主体框架如图6-3所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be6-3_%e8%bd%af%e4%bb%b6%e4%b8%bb%e4%bd%93%e6%a1%86%e6%9e%b6.png" alt="图6-3 软件主体框架" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;主程序开始，进行一系列的初始化，然后进入死循环，一直反复获取测量数据、数据滤波、计数判断、OLED屏幕刷新。与此同时，每5ms进一次中断扫描矩阵键盘按键。串口部分中断将在收到上位机发送的信号时，进入中断完成通讯协议逻辑的实现。框图细节在后续各成员方案中有进一步介绍。&lt;/p&gt;
&lt;h3 id="63--系统性能指标"&gt;6.3 系统性能指标&lt;/h3&gt;
&lt;h2 id="7-个人部分设计方案"&gt;7 个人部分设计方案&lt;/h2&gt;
&lt;h3 id="71-概述"&gt;7.1 概述&lt;/h3&gt;
&lt;p&gt;本人负责系统人机交互部分设计与制作、调试。&lt;/p&gt;
&lt;p&gt;主要内容包括：OLED屏幕的显示接口、矩阵键盘与OLED的协同交互、与其他模块的联调、在整体程序中的性能优化。&lt;/p&gt;
&lt;h3 id="72-功能介绍"&gt;7.2 功能介绍&lt;/h3&gt;
&lt;p&gt;人机交互部分主要由$4\times 4$的薄膜矩阵键盘与0.96寸的OLED屏幕构成，通过一组IO口与MCU的P0连接（键盘），通过P1.0~P1.1分别作为SCL和SDA用于IIC协议通讯（OLED）。矩阵键盘通过行列循环扫描的方式进行检测。为了不占用CPU资源，使用每5ms一次定时器中断的方式实现。&lt;/p&gt;
&lt;p&gt;OLED方面，第一行显示物品重量，保留小数点后一位；第二行显示设定重量，保留小数点后两位；第三行显示累计数量，最大可计数999个。显示屏示意图如下图6-4所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be7-1_OLED%e5%b1%8f%e5%b9%95%e6%98%be%e7%a4%ba%e9%a2%84%e6%9c%9f%e6%95%88%e6%9e%9c.png" alt="图7-1 OLED屏幕显示预期效果" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;系统启动后，初始化过程中会先读出EEPROM中存储的设定重量值，并显示于第二行，随后进入测量模式。测量模式下，OLED会实时刷新第一行和第三行的数据，当物品重量大于设定重量时，累计数量+1.此处会通过软件算法对相邻两次测量进行判断，防止一次测量中累计数量多次累加。按下“A”可实现去皮功能。&lt;/p&gt;
&lt;p&gt;此时按下“*”键后，系统进入设定模式。设定模式下，第一行仍然会实时刷新测得重量，第二行会对可设定位进行反白显示，其效果如下所示。此时按下不同的数字键，反白位就会变成相应数字。按下“C”和“D”键可实现反白位的左移和右移，可循环移动。按下“#”键完成设定，重新进入测量模式，去皮键再次生效。&lt;/p&gt;
&lt;h3 id="73-软件方案"&gt;7.3 软件方案&lt;/h3&gt;
&lt;p&gt;软件（人机交互部分）代码逻辑如下图所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be7-2%e4%ba%ba%e6%9c%ba%e4%ba%a4%e4%ba%92%e9%83%a8%e5%88%86%e4%bb%a3%e7%a0%81%e9%80%bb%e8%be%91.png" alt="图7-2人机交互部分代码逻辑" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;软件框图只选择了重要步骤进行绘制，不完全代表整体程序内容。&lt;/p&gt;
&lt;h3 id="74软件方案说明"&gt;7.4软件方案说明&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;流程解释&lt;/p&gt;
&lt;p&gt;进入主程序后，配置TIM0为定时5ms中断一次，通过IIC的方式向OLED的各个寄存器写入相应的值，已完成OLED的初始化，此时采用默认初始化方式。随后初始化OLED的背景色与显示色，并将OLED上固定不会变的字符写进OLED。这样做的原因是提高屏幕刷新率，因为以STC89C52RC的晶振频率与处理性能，利用负刷新的方式刷新率会极低，具体表现为逐行清除再写入，肉眼可见的慢。而实际需要实时刷新的部分只有9个数字位，即$16\times 8\times 9$个像素，而整个屏幕刷新需要写$128\times 64$个像素，采用这样的刷新方式速率提高了
&lt;/p&gt;
$$
\Delta = \frac{128\times 64-16 \times 8 \times 9}{128\times 64}\times 100\% = 83.6 \%
$$&lt;p&gt;
的速率。需要指出的是，这里物品重量和累计数量开机初始化为0，而设定重量需要先从EEPROM事先存放weight_set变量的寄存器读出u16位数的值并赋给weight_set变量，再进行初始化显示。以上，所有初始化完成。&lt;/p&gt;
&lt;p&gt;预先定义一个bit类型的setting_mode变量，为0时表示测量模式，为1时表示设定模式。&lt;/p&gt;
&lt;p&gt;进入主循环后，先判断模式。若为测量模式，查询“ * ”、“A”按键标志位，若“ * ”按下，则setting_mode=1，下次循环进入设定模式；若“A”按下，则实现去皮功能，去皮的具体原理将会在后文进行阐述；若这两个键均未按下，则进入下一显示环节。若为设定模式，则此时去皮键失效，数字键、确认键与移位键有效。通过三种类型键的组合可以完成对weight_set变量值的更改并返回测量模式。在此过程中若查询到“#”键标志位为按下状态，则将setting_mode值更改回0，并将此时weight_set的值存入EEPROM指定区域，方便下次开机读出，而后进入下一显示环节。（按键更改设定重量值得具体原理会在后文提出）&lt;/p&gt;
&lt;p&gt;显示环节会首先确定目前是测量模式还是设定模式，因为刷新的数据与现实的方式会有所不同。此时若为测量模式，则刷新第三行与第一行数据；若为设定模式，则刷新第一行与第二行数据。其中第二行的数据显示需要对游标位（即可更改位）进行反白显示，从而实现用户与机器的交互方便性。反白的原理会在后文中具体阐述。进行设定模式后停止累计数量的计算与显示，这是符合日常使用习惯的。&lt;/p&gt;
&lt;p&gt;以上为主程序中人机交互部分的程序，对按键的扫描消抖和标志位处理会在定时器中断中实现。将按键操作放在中断中能使系统具有良好的反馈，特别是在较大型、较复杂的系统中，若采取在主循环中扫描的方式会有很大概率产生按键未检测到的情况，这对人机交互来说非常不利，而采取每5ms一次中断的方式，可以保证人类在一次按键动作中用时大约20ms的时间内有效对按键进行检测，并用标志位表示，节省主程序的空间，这样的方式可以保证每次按键都能被检测到。&lt;/p&gt;
&lt;p&gt;中断程序触发后，会对每个按键进行扫描并更新其状态key_sta，具体扫描原理在后文中会进行详细阐述。此时，可以直接判断按键状态并转换标志位吗？显然，此时可能会因按键抖动产生误判，故需“消抖”。但常规的延时消抖在此处并不适用，其理由有两点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;延时消抖会占用CPU资源，毫无意义；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中断不宜停留时间过长。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;因此，此处采用了特殊的消抖方式，其原理大意为：&lt;/p&gt;
&lt;p&gt;​ 1. 第一个5ms进入中断，此时假设“A”的key_sta = 1，即按下，那么进入第1阶段，judge_sta[A] + 1；&lt;/p&gt;
&lt;p&gt;​ 2. 第二个5ms进入中断，此时“A”的key_sta若仍为1，则表明它还是按下的，并已经持续10ms，进入第2阶段，judge_sta[A] + 1；若key_sta = 0，则表明上一次为误判，将judge_sta置0方便下一次判断；&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;第三个5ms进入中断同理，当进入到第四次中断，若key_sta仍为1，表明按键已经按下20ms，足以确定这是一次有效的按键动作，此时终于可以将“A”的标志位置1了，千万不能忘记把judge_sta返回为初始阶段0，方便下一次检测。此原理也就是中断流程图的内容了。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;至此，人机交互主体程序的部分已经介绍完毕。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;各部分原理设计解释&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;矩阵键盘&lt;/p&gt;
&lt;p&gt;$4\times 4$矩阵键盘的原理图如下。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be7-3%ef%bc%881%ef%bc%89_%e7%9f%a9%e9%98%b5%e9%94%ae%e7%9b%98%e5%ae%9e%e4%bd%93%e5%9b%be.png" alt="图7-3（1） 矩阵键盘实体图" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/%e5%9b%be7-3%ef%bc%882%ef%bc%89_Key_Matrix.drawio.png" alt="图7-3（2） Key Matrix.drawio" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;经本人测试将实体键盘按键关系绘制如图7-3。&lt;/p&gt;
&lt;p&gt;扫描原理为：&lt;/p&gt;
&lt;p&gt;先将8个IO口全部置1.column 1输出0，检测Row1，Row2，Row3，Row4的电平。若Row1为0，则“D”按下；若Row2为0，则“#”按下$\dots$；同理，column中仅让column2输出0，分别检测Row1，Row2，Row3，Row4的$\dots$；以此完成column3, column4的输出检测。通过两个4次循环的嵌套，以实现对每个键状态的遍历。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按键更改设定重量值原理&lt;/p&gt;
&lt;p&gt;定义变量Set_No表示设定重点时光标处于的位数，Set_No = 1,2,3,4时分别对应百、十、个、小数位。当数字键按下时，先分离原数字的百、十、个、小数位，再将对应位改为按下键的数值，再通过
&lt;/p&gt;
$$
Weight\_Set = 百位\times1000+十位\times 100+个位\times 10+小数位\times 1
$$&lt;p&gt;
来计算得到新值。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;系统的数字表示方法&lt;/p&gt;
&lt;p&gt;因为C语言没有适用的小数变量，同时为了节约空间、方便显示，故对于物品重量Weight_Measured和设定重量Weight_Set用unsigned int即16位数表示。这是因为量程最大处显示999.9g，这里用9999的整形表示，在显示时拆分每一位分别显示在OLED的固定位置。同理累计数量Accumulated_Counter用u8表示即可。（u16范围：0 ~ 66535；u8范围：0 ~ 255）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;反白显示原理&lt;/p&gt;
&lt;p&gt;涉及到OLED显示原理，这里只需要用取模软件取数字0 ~ 9的阳码即可，加入到字库中并在设定模式下反白显示Set_No的数字即可。此处我为了方便，定义了一个Showchar_Invert()函数，避免了字库索引的复杂。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="8-调试过程与解决的问题"&gt;8 调试过程与解决的问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;问题一：内存不足问题&lt;/p&gt;
&lt;p&gt;在我们小组成员各自模块调试过程中，进展都很顺利，但在联调过程中发现了代码量较大导致编译器不通过的情况，显示为“OVERFLOW”字样。&lt;/p&gt;
&lt;p&gt;众所周知，STC89C52单片机的RAM为512Bytes，ROM为8KBytes。故我们的Code已经超过了8000的数量，程序需要精简。通过微机原理课程学习过的知识与资料的查阅，我主要从以下几个方面对代码量进行了精简，使人机交互部分的代码量从“data = 97.0， code = 6000”降低到了“data = 52.0， code = 4000”。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;精简类型变量。&lt;/p&gt;
&lt;p&gt;原程序中许多二值变量我都用的unsigned char来表示的，后来改为了bit型变量，节约了一部分RAM。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;字库的精简。&lt;/p&gt;
&lt;p&gt;原采用的器件商提供的字库文件，对于本项目大量符号用不到，故自己重新建立了字库与索引方式，节省了大量的ROM空间。这一步使程序体积大幅减小，但仍有优化空间，可采用更小号的字或使用英文代替汉字；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;自己写库函数。&lt;/p&gt;
&lt;p&gt;原来OLED、IIC均使用了网络上提供的现有库函数，发现有两个痛点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;许多函数用不到、可删除；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;部分函数的定义比较占用内存，有精简的空间。当然为了代码量小不惜牺牲部分通用性；&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;改进后OLED、KEY、IIC全部消除，编译 0 error, 0 warning通过。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;结构体和数组的更改。&lt;/p&gt;
&lt;p&gt;经测试发现，结构体和数组对内存空间的占用非常大，原来所有按键信息均定义在一个结构体里的，管理非常方便，但由于本项目特殊性，将按键标志位数组key_flag[i]改为用一个u16 key_flag表示，每一位表示一个按键的标志位状态，为此还添加了一些位操作函数。同理对多个变量进行了类似处理。但如此做损失了系统代码的可修改、可移植性。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;问题二：精度问题&lt;/p&gt;
&lt;p&gt;系统搭建完成后，对传感器进行标定，同时还加入了滑窗滤波，但仍然发现精度只能达到0.2g，具体表现为数据会在标准重量的上下0.1g范围产生波动。小数点后两位同样，波动发生得更厉害，解决办法为换用精度更高的传感器或采用更优秀的滤波算法。不过滤波后的数据如果是基于波动较大的数据，其有效性仍有待考究。&lt;/p&gt;
&lt;p&gt;相应的在人机交互部分我也将显示位数改为了小数点后一位。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;问题三：按键消抖问题&lt;/p&gt;
&lt;p&gt;原采用了循环扫描延时消抖的方法，在放入整体程序联调后发现按键的漏检会较多，故更改为中断多次判断消抖。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>基于LabVIEW+ELVIS Ⅱ的智能交通灯系统</title><link>https://blackiepiggy.github.io/projects/labview_translight/</link><pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate><guid>https://blackiepiggy.github.io/projects/labview_translight/</guid><description>&lt;h1 id="第一部分验证性实验实验报告"&gt;第一部分：验证性实验实验报告&lt;/h1&gt;
&lt;h2 id="一实验题目"&gt;一、实验题目&lt;/h2&gt;
&lt;p&gt;数字I/O输出。&lt;/p&gt;
&lt;h2 id="二实验设备及硬件接线"&gt;二、实验设备及硬件接线&lt;/h2&gt;
&lt;p&gt;实验设备：NI-ELVIS Ⅱ、电脑。
硬件接线：将ELVIS Prototyping Board上的DIO0连接至LED0 ;DIO1连接至LED1;依次连接，直至将DIO7连接至LED7。&lt;/p&gt;
&lt;h2 id="三数据采集程序"&gt;三、数据采集程序&lt;/h2&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903153933.png2025-09-03-15-39-34" alt="20250903153933" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903153941.png2025-09-03-15-39-42" alt="20250903153941" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="四测试结果"&gt;四、测试结果&lt;/h2&gt;
&lt;p&gt;物理通道选择“Dev1/port0/line0:7”，运行编写好的VI，改变布尔数组“Data”中不同位布尔输入值，可以在原型板上看到LED 0-LED7被LabVIEW程序控制而变化，当打开第1个按键时，LED0亮，依次类推进行控制。&lt;/p&gt;
&lt;h1 id="第二部分综合设计实验实验报告"&gt;第二部分：综合设计实验实验报告&lt;/h1&gt;
&lt;h2 id="一实验题目-1"&gt;一、实验题目&lt;/h2&gt;
&lt;p&gt;十字路口交通灯控制程序。&lt;/p&gt;
&lt;h2 id="二实验设备"&gt;二、实验设备&lt;/h2&gt;
&lt;p&gt;NI-ELVIS Ⅱ、电脑。&lt;/p&gt;
&lt;h2 id="三实验原理及设计方案"&gt;三、实验原理及设计方案&lt;/h2&gt;
&lt;h3 id="1实验原理"&gt;1.实验原理&lt;/h3&gt;
&lt;p&gt;（1）交通灯原理分析&lt;/p&gt;
&lt;p&gt;通过日常生活经验与网上资料查询，可以将十字路口交通灯的一个周期、4个阶段进行如下概括：&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154013.png2025-09-03-15-40-14" alt="20250903154013" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;①阶段1：红灯1、绿灯2亮，其他灯灭。此时方向2通行，方向1禁止通行，如图2-1；
②阶段2：红灯1、黄灯2亮，其他灯灭。2方向由绿变为黄，示意停止。此时方向1、2状态均即将变化；
③阶段3：绿灯1、红灯2亮，其他灯灭。此时方向1通行，方向2禁止通行；
④阶段3：黄灯1、红灯2亮，其他灯灭。1方向由绿变为黄，示意停止。此时方向1、2状态均即将变化。
交通灯不断按照以上4个阶段为一个周期进行循环运行。只要将两组布尔灯（6个）分4个阶段，不断赋予其相应的值，便可以实现实验要求。
（2）NI-ELVIS的实现分析&lt;/p&gt;
&lt;p&gt;在NI-ELVIS实验平台上，可以轻松实现I/O口的数字输出。通过DAQmx Write.vi能够不断读取循环体内的目标参数，随后连线将采样输出至I/O口，便可实现I/O口的数字输出过程（详细过程可见ELVIS实验指导书Lab5.1）。
通过此原理，可以将交通灯设置为布尔灯，并对6个布尔灯状态进行采样输出，便可实现实验要求的LED显示变化。&lt;/p&gt;
&lt;h3 id="2设计方案"&gt;2.设计方案&lt;/h3&gt;
&lt;p&gt;具体的程序设计方案见第四大点。此处阐述如何利用ELVIS进行连线设计。
如图2-2，将Prototyping Board上的DIO0-DIO7连接至LED0和LED8，即可利用物理通道“Dev1/port0/line0:7”对LED数字量的输出。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154043.png2025-09-03-15-40-44" alt="20250903154043" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="四程序设计"&gt;四、程序设计&lt;/h2&gt;
&lt;h3 id="1前面板设计"&gt;1.前面板设计&lt;/h3&gt;
&lt;p&gt;如图2-1所示，为一个十字路口模拟图。由于十字路口相对面交通灯状态相同，且实验仅要求用6个LED灯反应变化情况，故仅放置两组6个布尔灯在垂直的两个方向上。中间的数字表示交通灯红绿切换的倒计时。右上角可以手动设定两个方向上绿灯与黄灯的时间，红灯的时间等于另一个方向上绿灯时间加另一个方向上黄灯时间。右下角表示物理通道的选择。&lt;/p&gt;
&lt;h3 id="2程序框图设计"&gt;2.程序框图设计&lt;/h3&gt;
&lt;p&gt;（1）框架设计&lt;/p&gt;
&lt;p&gt;前面已经将交通灯的周期分为4个阶段，故采用条件结构，并设置4个条件入口“0、1、2、3”，在4个条件框内实现该阶段需要执行的内容。设置一个包含元素“0、1、2、3”的一维数组，并在条件结构外套一个大循环，将大循环的计数接线端除以4，取余数来循环索引数组中的4个数字，以此实现循环进入4个条件。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154104.png2025-09-03-15-41-05" alt="20250903154104" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;（2）条件结构内部设计&lt;/p&gt;
&lt;p&gt;每个条件结构中设置一个小循环，循环中将真假布尔常量分别写入各布尔灯的局部变量。再给小循环的移位寄存器赋予一个阶段秒数，进入循环后不断自减1，并通过移位寄存器将数值送入下一次循环。当阶段时间减至0时，本条件结构执行完成，等待下一个入口条件触发。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154114.png2025-09-03-15-41-14" alt="20250903154114" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;（3）采样部分设计&lt;/p&gt;
&lt;p&gt;大循环外，首先创建DAQmx通道，物理通道选择“Dev1/port0/line0:7”，线分组选择“单通道用于所有线”，模式选择“数字输出”。后续连接一个DAQmx开始任务。在采样结束后清楚任务以及连接一个简易错误处理器。
大循环内、小循环外放置一个DAQmx写入函数，并选择“数字1D布尔1通道1采样”。该模式下数据输入格式必须是一维数组，故将6个布尔灯输出控件+2个假常量通过“创建数组”函数创建一个一维数组并连接至DAQmx写入函数的数据口。&lt;/p&gt;
&lt;h2 id="五调试结果"&gt;五、调试结果&lt;/h2&gt;
&lt;p&gt;物理通道选择“Dev1/port0/line0:7”，设置Green1 Time为3s，Green2 Time为3s，两个Yellow Time均为2s。按照“设计方案”连线后，打开Prototyping Board的电源，运行程序。
可以看到，两个方向的交通灯均以3s绿灯，2s黄灯，5s红灯的速率切换。且ELVIS上对应连接的LED灯也随之切换。&lt;/p&gt;
&lt;h2 id="六心得体会"&gt;六、心得体会&lt;/h2&gt;
&lt;p&gt;本次实验框架结构本来采用的顺序执行结构，用四个帧分别运行四个阶段的程序，但是采样无法正确进行，原因分析可能为每次采样时间节点与布尔灯的变化速率出现冲突。本次实验结束后后续还可以对实验进行结构上的改进，实现功能的扩充，并且实现黄灯的闪烁功能。同时，对于题目中要求的“实现较大路口的有直行和左右拐弯的交通灯控制”，本人认为本次的程序无法实现左行与直行的分离控制，更合理的设计方案应该如图2-6，使用箭头形状的红绿灯，每个箭头都可以进行红-绿-黄颜色的变化。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154131.png2025-09-03-15-41-31" alt="20250903154131" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;箭头式的交通灯更为合理，能实现左行与直行的分离控制改进版的程序大致思路：利用箭头图形控件的属性节点-颜色，来进行不同阶段每个箭头不同颜色的交替变换。&lt;/p&gt;</description></item><item><title>微机原理51单片机综合实验</title><link>https://blackiepiggy.github.io/projects/51chip/</link><pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate><guid>https://blackiepiggy.github.io/projects/51chip/</guid><description>&lt;h2 id="题目要求"&gt;题目要求&lt;/h2&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154605.png2025-09-03-15-46-07" alt="20250903154605" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="1-实验原理图"&gt;1 实验原理图&lt;/h2&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154622.png2025-09-03-15-46-23" alt="20250903154622" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;(本图片未更新，图中有错误，74LS138的G1应该连接P2.7)&lt;/p&gt;
&lt;h2 id="2-soure-code"&gt;2 Soure Code&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;程序名称：微机原理及应用综合实验
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;作者：李嘉渝
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;学号：2019213109
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;班级：测控19-3班
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;----------------------------以下为主程序框架-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;----------------------------以下为主程序框架-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;----------------------------以下为主程序框架-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ORG 0000H
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LJMP INIT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ORG 000BH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LJMP ISR_T0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ORG 0013H
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LJMP ISR_INT1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INIT:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LCALL INIT_T0 ;初始化定时器0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LCALL INIT_INT1 ;初始化按键中断1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LCALL INIT_UART ;初始化串口
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV R5,#0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV R7,#100
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MAIN:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; JNB F0,$ ;若F0为1，则主程序可执行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LCALL ADC_TO_R6 ;ADC采样，将采样数据存R6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LCALL ADC_TO_RAM ;将R6中存储的ADC数据存到片外RAM0500H-050AH单元中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LCALL READ_N_OPE ;读PA口状态,将读数与AD转换结果做异或运算，结果存储至40H单元中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LCALL DAC0832 ;取40H单元数送DAC0832转换
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LCALL UART_SEND ;串口发送R6和40H单元的数值
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CLR F0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SJMP MAIN
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ISR_T0:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV TH0,#0FCH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV TL0,#66H ;定时1ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DJNZ R7,NEXT_T ;不到0.1s直接返回主程序
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV R7,#100 ;0.1s时重新赋值
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SETB F0 ;使F0=1，可以进入程序执行主体
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NEXT_T:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RETI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ISR_INT1:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CPL TR0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RETI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;----------------------------以下为封装函数-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;----------------------------以下为封装函数-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;----------------------------以下为封装函数-------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数名称：INIT_T0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数功能：初始化配置定时器0与其中断，使之每1ms进入一次中断
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数说明：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INIT_T0:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ORL TMOD,#01H ;定时器1设置为8位自动重装，定时器0设置为16位模式1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV TH0,#0FCH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV TL0,#66H ;定时1ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SETB ET0 ;开启定时器0中断
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SETB EA ;开启总中断
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SETB TR0 ;启动定时器0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RET
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数名称：INIT_INT1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数功能：初始化按键1中断
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数说明：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INIT_INT1:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SETB EX1 ;开启按键1中断
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SETB PX1 ;调整使INT1中断最高优先级，这样在定时器0中断时也可以触发按键中断
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SETB IT1 ;下降沿触发
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RET
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数名称：INIT_UART
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数功能：初始化串口
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数说明：波特率9600
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INIT_UART:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ORL TMOD,#20H
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV SCON,#40H ;配置串口输出模式
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV TH1,#0FDH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV TL1,#0FDH ;配置定时器1串口波特率为9600，默认SMOD=0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SETB TR1 ;开启定时器1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RET
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数名称：ADC_TO_R6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数功能：ADC采样，将采样数据存R6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数说明：采用数据总线连接方式，端口地址为C000H
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ADC_TO_R6:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV DPTR,#0C000H ;送ADC0809端口地址
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV A,#2 ;送IN2通道地址
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOVX @DPTR,A ;锁存通道地址并启动A/D
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; NOP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; NOP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; JNB P3.2,$ ;等待ADC转换完成
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOVX A,@DPTR ;读ADC转换数据
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV R6,A ;将转换数据放入R6当中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RET
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数名称：ADC_TO_RAM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数功能：将R6中存储的ADC数据存到片外RAM0500H-0509H单元中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数说明：每进一个数据，所有数据往左移一位，原0500H数字被挤掉，新进的数字放在0509H中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ADC_TO_RAM:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV R1,#9 ;搬移数据9次
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV R0,#01H ;转移对象指针
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV R3,#00H ;转移目标指针
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LOOP:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV DPTR,#0500H ;赋起始地址
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV DPL,R0 ;加上转移对象指针，指向被转移对象
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOVX A,@DPTR ;取数至ACC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV DPL,R3 ;指向被转移目标
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOVX @DPTR,A ;转移完成
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; INC R3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; INC R0 ;下一次转移
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DJNZ R1,LOOP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV A,R6 ;将ADC转化结果放到ACC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV DPTR,#0509H
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOVX @DPTR,A ;存至第十个单元
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RET
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数名称：READ_N_OPE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数功能：将ADC数据送至PB口。读PA口状态,将读数与AD转换结果做异或运算，结果存储至40H单元中。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数说明：端口地址B000H
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;READ_N_OPE:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV A,#99H ;8255选择模式0，A口输入，B口输出，C口输入
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV DPTR,#0B003H ;CONTROL口地址
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOVX @DPTR,A ;将控制字写给CONTROL口
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV DPTR,#0B001H ;PB口地址
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV A,R6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOVX @DPTR,A ;将R6的数送PB口
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV DPTR,#0B000H ;PA口地址
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOVX A,@DPTR ;读取PA口地址至ACC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV B,A ;PA口数据暂存B
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV A,R6 ;取AD转换结果
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; XRL A,B ;做异或运算
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV 40H,A ;结果保存至RAM40H单元中
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RET
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数名称：DAC0832
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数功能：取40H单元数送DAC0832转换
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数说明：端口地址D000H
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DAC0832:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV A,40H
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV DPTR,#0D000H
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOVX @DPTR,A
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RET
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数名称：UART_SEND
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数功能：串口发送R6和40H单元的数值
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;函数说明：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;UART_SEND:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV A,R6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV SBUF,A
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; JNB TI,$
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CLR TI ;串口发送R6数值
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV A,40H
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; MOV SBUF,A
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; JNB TI,$
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CLR TI ;串口发送40H单元数值
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RET
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; END
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3-软件流程图"&gt;3 软件流程图&lt;/h2&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154750.png2025-09-03-15-47-52" alt="20250903154750" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="4-proteus仿真"&gt;4 Proteus仿真&lt;/h2&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154807.png2025-09-03-15-48-08" alt="20250903154807" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="5-实验报告"&gt;5 实验报告&lt;/h2&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154849.png2025-09-03-15-48-50" alt="20250903154849" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154855.png2025-09-03-15-48-56" alt="20250903154855" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154859.png2025-09-03-15-49-01" alt="20250903154859" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154905.png2025-09-03-15-49-06" alt="20250903154905" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154910.png2025-09-03-15-49-11" alt="20250903154910" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154919.png2025-09-03-15-49-20" alt="20250903154919" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903154928.png2025-09-03-15-49-29" alt="20250903154928" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>机械手爪部位触觉感应系统</title><link>https://blackiepiggy.github.io/projects/robot_claw/</link><pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate><guid>https://blackiepiggy.github.io/projects/robot_claw/</guid><description>&lt;h2 id="项目背景"&gt;项目背景&lt;/h2&gt;
&lt;p&gt;（1）任务及背景：
对关节式机械手的手爪部位设计触觉传感模块，通过触觉传感信号反馈控制手爪关节处的步进电机运动，使手爪能可靠牢固抓取物体又不损伤物体，并可进行接触力的阈值设定和超阈值报警提示。&lt;/p&gt;
&lt;p&gt;技术要求：
1、 选择合适的触觉传感器类型及具体型号参数，贴于机械手爪的合适位置，检测手爪与物体间的接触力，进行传感测量；
2、 设计触觉信号的传感接口电路，信号放大、滤波、A/D转换等处理电路，使得信号有足够的信噪比，以及步进电机的驱动电路、声光报警电路、及单片机核心控制器和液晶显示电路等；
3、 要求接触力的警戒阈值可显示，超阈值时进行声光报警；
4、 要求液晶实时显示接触力和手爪关节的位移输出量；
5、 需达到的性能指标：手爪运动控制分辨率0.01mm、测力分辨率50mN、测力量程3N。&lt;/p&gt;
&lt;p&gt;非技术因素要求：项目设计时，需考虑经济性、环保性、安全性、行业规定、电磁兼容性等因素。&lt;/p&gt;
&lt;p&gt;（2）工具环境：计算机（电路设计、软件设计）、电子电路设计及仿真工具（如：Proteus、filtCAD等）和实验环境。&lt;/p&gt;
&lt;p&gt;（3）主要参考文献和资料：
1、触觉传感器的类型和原理，传感器方面的资料；
2、步进电机的原理，电机设计相关资料；
3、测量与控制电路方面的资料，电子电路设计方面的资料。
4、单片微机应用技术和软件编程技术方面的资料；&lt;/p&gt;
&lt;p&gt;（4）着重培养的能力：通过本项目，使学生能够根据课题内容搜集相关资料，重点培养对测量与控制电路综合知识的运用能力，掌握工程设计工作的基本要求，培养锻炼团队合作和管理能力，强化学生的工程设计思维和系统理念。&lt;/p&gt;
&lt;h2 id="一-项目总体方案"&gt;一 项目总体方案&lt;/h2&gt;
&lt;h3 id="1-总体方案框图"&gt;1 总体方案框图&lt;/h3&gt;
&lt;p&gt;机械手爪部位触觉感应系统功能的实现主要分解为三个部分，第一部分是通过电阻信号输出电路，放大电路，偏置电路，低通滤波电路以及 ADC 采集电路形成整体的信号生成转化电路，将压力信号转化到 STM32 内置 ADC 可以采集的电压信号范围，第二部分为 STM32 采集压。力信号进行处理，通过 IO 口和 SPI 总线向外围电路发送控制信号，第三部分驱动电路接受控制信号控制外围 LED、蜂鸣器、步进电机等驱动设备。该项目整体的设计方案图如下图1-1。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;电路总体结构框架为：传感器电桥调幅电路——低通滤波电路（滤高频噪声）——三运放差分放大电路——带通滤波电路（滤噪声）——相敏检波电路——低通滤波电路（取均值）。
本综合电路中在传感器调制电路差分输出和三运算放大电路差分输入之间加入两个截止频率为2kHz的低通滤波电路，分别进行低通滤波实现对于外界高频干扰（主要来自于电机的高频干扰）的滤除。带通滤波电路采用一个一阶有源低通滤波器和一个一阶有源高通滤波器组成，截止频率分别为2kHz和500Hz。总体是依次将传感器调制电路、低通滤波电路、三运算放大电路、带通滤波电路和开关式全波相敏检波电路组合形成综合电路设计。电路设计图如图1-2所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-1.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="2-功能总体表现与分析"&gt;2 功能总体表现与分析&lt;/h3&gt;
&lt;p&gt;仿真效果展示
①压力变化时，相敏检波后信号变化如图1-3所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-2.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图1-3 压力变化时相敏检波后信号变化情况&lt;/p&gt;
&lt;p&gt;当我们改变R_1和R_4电阻值时，双边带调幅信号的幅值发生变化，相敏检波后的信号的幅值对应发生变化，同时电压平均值根据其幅值的变化发生变化。由图1-3可见，电压平均值能够跟随相敏检波后的信号的幅值发生变化，但是跟随效果不是很好，反应较慢，实时跟踪效果较差。
②当压力为300g时，输出波形与平均电压如图1-4所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-3.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图1-4 压力为300g时输出的波形
由图16可知，当压力为300g时，输出平均电压约为1V。此时可以看作机械爪稳定抓取了一个物品，受力保持不变，输出电压稳定在一个数值，从而送入ADC，进行之后的显示和电机驱动等环节。
3 团队成员与分工
李嘉渝——调制后二阶压控低通滤波电路设计，全波精密检流电路设计（废弃），OLED、步进电机、MCU控制电路设计，软件代码实现，Proteus控制模拟仿真；
邵光睿——传感器调制电路、三运放放大电路、相敏检波电路设计，电路联调仿真工作；
单林合——ADC选型，AD转换电路设计；
王健城——传感器选型，带通滤波电路设计；
毕世纪——步进电机选型驱动电路设计；
樊小相——声光报警电路设计。&lt;/p&gt;
&lt;h2 id="二-项目各部分介绍"&gt;二 项目各部分介绍&lt;/h2&gt;
&lt;h3 id="1--调制电路设计"&gt;1 调制电路设计&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;传感器输出信号研究：
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根据DF9-40系列柔性薄膜压力传感器的压力-电阻曲线图，如图2-1所示。由于我们选取的量程是300g，可见对应最小阻值为5KΩ。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-4.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-1 DF9-40@500g 压力-电阻曲线图
根据DF9-40的性能指标，如表2-1所示，可以得知当压力为0时，阻值大于10MΩ。
表2-1 DF9-40性能指标
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-5.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
（2）电路设计：
我们采用通过交流供电实现传感器调制。设计电路如图2-2所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-6.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-2 传感器调制电路仿真设计图
调制效果如图2-3所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-7.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-3 传感器调制电路仿真效果图
设R_1和R_4在没有受到压力时（即没有夹取物品时）的阻值为R_1=R_2=R_3=R_4=10MΩ，电桥平衡；在夹取物品受到压力时，R_1和R_4会受到变化，电桥的输出为
U_o=U/4((∆R_1)/R_1 +(∆R_4)/R_4 )
又因为R_1和R_4分别位于机械手爪的两个力臂上，受到的压力相同，所以我们可以将上式写为
U_o=U/2 (∆R_1)/R_1
这样就实现了载波信号U与测量信号的相乘，即实现了调制。
我们采用交流1V供电，即U=1V。因为当压力为300g时，对应阻值为5kΩ，相较于10MΩ差四个数量级，所以我们在电桥中R_1和R_4近似为0，来进行仿真。
①当压力为300g时，R_1和R_4近似为0，输出波形如图2-4所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-8.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-4 压力为300g时传感器调制电路仿真效果图
由图2-4可见我们输出波形的幅值为1V。
②当压力为0时，R_1和R_4=10MΩ，输出波形如图2-5所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-9.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图5 压力为0时传感器调制电路仿真效果图
由图2-5可见我们输出电压为472.154nV，近似为0。&lt;/p&gt;
&lt;h3 id="2--放大电路设计"&gt;2 放大电路设计&lt;/h3&gt;
&lt;p&gt;（1）运算放大器的选型：本次设计我们选择OP07作为我们运算放大器，OP07是一款低失调电压的运算放大器，它采用晶圆级的修调来消除失调，同时还可以通过外部电路进一步减小失调电压。同时具有很低的偏置电流（只有4nA）以及很高的开环增益（最小200V/mv，106dB）。这些特点使得OP07适合用作高增益的仪表放大器。芯片具有±13V的宽输入电压范围，106dB的共模抑制比(CMRR)以及高输入阻抗等特性，使得放大器在放大信号时具有很高的精度。即使在高闭环增益时，也能保证出色的线性度和精度，失调和增益的时间稳定性以及随温度的变化率等参数十分优秀，满足我们的需求。其内部电路图如图2-6所示，管脚图如图2-7所示，极限参数如表2-2所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-10.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-6 OP07内部简化电路图
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-11.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-7 OP07管脚图
表2-2 OP07的极限参数
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-12.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
（2）三运算放大器的设计
由于采用集成的三运算放大器AD623AH总是出现无法仿真的问题，所以我们采用分立的三运算放大器的设计。
设计电路图如图2-8所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-13.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-8 三运算放大器设计图
我们将上端输入电压记为U_i1，输出电压记为U_o1，下端输入电压记为U_i2，输出电压记为U_o2，最后输出电压为U_o。可以前级输出电压的差值为
U_o2-U_o1=(1+(R_17+R_18)/R_20 )(U_i2-U_i1)
后级输出电压U_o为
U_o=R_16/(R_15+R_16 )(1+R_14/R_13 )U_o2-R_14/R_13 U_o1
R_20是增益调节电阻，通过调节其阻值可以实现整个三运算放大器的增益。此电路中我们设置R_17=R_18=25kΩ，然后将R_20调整为50kΩ，所以可得
U_o2-U_o1=2(U_o2-U_o1)
我们同样设置R_13=R_14=R_15=R_16=10MΩ，所以可得
U_o=U_o2-U_o1
于是得
U_o=2(U_o2-U_o1)
即我们将整个电路的电压放大了两倍。
输出电压效果如图2-9所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-14.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-9 三运算放大器输出效果比对图
由图2-9明显可见，输出蓝线的幅值是输入红线的幅值的两倍。&lt;/p&gt;
&lt;h3 id="3--滤波电路设计"&gt;3 滤波电路设计&lt;/h3&gt;
&lt;p&gt;（1）传感器调制后二阶压控源巴特沃斯滤波器的设计
由于调制电路改为了电桥调制，故输出的信号为差分信号，要想在对信号进行差分放大前提高信噪比再进行放大，之前的滤波电路就不再适用了。故此处利用两个二阶低通滤波电路分别对两路差分信号进行滤除高频噪声，具体实现电路如图2-10所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-15.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-10 传感器调制后二阶压控源巴特沃斯滤波器
此时，滤波电路将传感器调制电路与三运放差分放大电路联系起来，使信号被放大前提高了信噪比，有利于得到目标信号。滤波器的截止频率设置在2000Hz，以保证1000Hz调制信号频率处信号基本不被衰减。此处应该保证低频信号增益在滤波过程中不受影响，故不考虑使用切比雪夫滤波器；由于贝塞尔滤波器的下降陡峭程度太小，故会导致滤波效果不好，因此此处采用巴特沃斯滤波器。
对于滤波器的阶数，此处考虑采用二阶滤波电路，考虑到环境高频噪声信号频率可能会变化，故此处采用压控电压源型滤波电路，此电路可通过更改运放的放大倍数来改变滤波器的截止频率，具有较强的灵活性与普适性。
根据压控电压源型滤波电路的传递函数：
H(s)=(K_f Y_1 Y_2)/((Y_1+Y_2+Y_3+Y_4 ) Y_5+[Y_1+(1-K_f ) Y_3+Y_4]Y_2 )
代入计算可得，
H(s)=(K_f∙59.3k∙1.06M)/((59.3k+1.06M+1/(1×10^(-9) s)+0) 1/(100×10^(-12) s)+[59.3k+(1-K_f ) 1/(1×10^(-9) s)+0]1.06M)
求得：
f_0=2000Hz
其传递函数幅频特性曲线如图2-11所示。此处采用AD公司的ADA4062高精密运放，适用于二阶巴特沃斯滤波器设计。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-16.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-11 二阶低通滤波器的幅频特性曲线
假设传感器调制过程中有一个1Mhz的高频噪声信号，因此电桥输出信号为图2-12左图所示。经过二阶低通滤波器后，经过放大2倍，可以得到输出信号如图2-12右图所示。可以看到，高频噪声信号被完全消除，信噪比得到了非常好的提升。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-17.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-12 模拟滤除高频信号
（2）带通滤波器的设计
①带通滤波器原理
带通滤波器是一种仅允许特定频率通过，同时对其余频率的信号进行有效抑制的电路。由于它对信号具有选择性，故而被广泛地应用现在电子设计中。比如RLC振荡回路就是一个模拟带通滤波器。带通滤波器是指能通过某一频率范围内的频率分量、但将其他范围的频率分量衰减到极低水平的滤波器，与带阻滤波器的概念相对。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-18.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-13 模拟滤除高频信号
一个理想的带通滤波器应该有一个完全平坦的通带，在通带内没有放大或者衰减。实际上，并不存在理想的带通滤波器。滤波器并不能够将期望频率范围外的所有频率完全衰减掉，尤其是在所要的通带外还有一个被衰减但是没有被隔离的范围。这通常称为滤波器的滚降现象，并且使用每十倍频的衰减幅度的dB数来表示。
②带通滤波器应用
许多音响装置的频谱分析器均使用此电路作为带通滤波器，以选出各个不同频段的信号，在显示上利用发光二极管点亮的多少来指示出信号幅度的大小。这种有源带通滤波器的中心频率 ，在中心频率fo处的电压增益Ao=B3/2B1，品质因数 ，3dB带宽B=1/(п&lt;em&gt;R3&lt;/em&gt;C)也可根据设计确定的Q、fo、Ao值，去求出带通滤波器的各元件参数值。R1=Q/(2пfoAoC)，R2=Q/((2Q2-Ao)*2пfoC)，R3=2Q/(2пfoC)。上式中，当fo=1KHz时，C取0.01Uf。此电路亦可用于一般的选频放大。 有源带通滤波器电路。
③带通滤波器的设计要求
设计中运放选择TI产品典型的通用双放LM358，LM358里面包括两个高增益、独立的、内部频率补偿的双运放，适用于电压范围很宽的单电源，而且也适用于双电源工作方式，特点方面具有低输入偏置电流、低输入失调电压和失调电流，它的共模输入电压范围较宽，差模输入电压范围等于电源电压范围，单电源供电电压3-32V，双电源供电±1.5-±16V，单位增益带宽为1MHz，适用于一般的带通滤波器的设计，同时具有低功耗的功能，对于设计阶数相对高一些的带通滤波器的话，可以选用TI的四运放LM324，其性能与LM358大体相同，应用起来节省空间。对于运放的要求此设计不是特别高，只要运放的频率满足低通的截止频率即可，如果精确度要求高的话那么首先运放的供电电压要足够稳定，或者选择精密运放，如TLC274A，否则通用的即可，例如推荐TI的LM224四运放。
巴特沃斯带通滤波器幅频响应在通带中具有最平幅度特性，但是从通带到阻带衰减较慢，如果对于过渡带要求稍高，可以增加阶数来实现，否则改选用切比雪夫滤波电路。
④电路设计
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-19.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
2-14 带通滤波器的设计图
本仿真采用由一个高通滤波器和一个低通滤波器组合而成。第一个高通滤波器，其中，电容为1.7uf，电阻为1kΩ，按照公式计算出频率约为900Hz，第二个低通滤波器的电阻为1kΩ，电容为1.4uf根据公式，计算频率约为1100Hz，从而实现在第一个滤波器中滤出频率高于900Hz的信号，而在第二个滤波器中滤出低于1100Hz的信号，而此信号就为我们的整个设计提供频率适宜的信号。
⑤仿真结果显示及讨论
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-20.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
2-15 仿真结果
由此可见，当下降3dB时频率为1.052kHz在我们的设定的900Hz到1100Hz的范围内，故仿真成功
4 相敏检波电路设计
电路设计如图2-10所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-21.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-10 开关式全波相敏检波电路设计图&lt;/p&gt;
&lt;p&gt;（1）双边带条幅信号的获取
用一个幅值为5V，频率为10Hz的正弦交流信号模拟放大电路输出的信号，即调制信号，同时用一个幅值为1V，频率为1kHz的正弦交流信号作为载波信号，因为载波信号的频率要至少大于调制信号频率的10倍，所以，我们选择1kHz，然后将两者通过乘法器进行相乘，从而调制得到双边带调幅信号。波形如图2-11所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-22.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-11 双边带调幅信号波形图
（2）参考信号的选取
参考信号我们选择为与载波信号一样的正弦交流信号。电路中V1通过一个电压比较器LM393N，输出方波，当正交流信号的数值为“+”（即大于0），输出方波也为“+”，当交流信号输出为“-”（即小于0），输出方波也为“-”。效果如图2-12所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-23.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-12 参考信号波形图
由图2-12可以观察到，我们的通过电压比较器输出的方波的频率和极性与参考信号相同。
（3）输出信号判断
当V2输出信号为“+”时，电压比较器输出方波也为“+”，U1导通，则放大器U3A正向输入端想当于接地，只有负向输入端会输入双边带调幅信号，此时u_i也为“+”，通过放大器后，输出
u_o =- R_2/R_1 u_i
又R_1=R_2=10kΩ，所以得u_o =- u_i，输出为“-”； 当V2输出信号为“-”时，电压比较器输出方波也为“-”，U1不导通，则放大器U3A正向输入和负向输入端都会输入双边带调幅信号，此时u_i也为“-”，通过放大器后，输出
u_o =- R_2/R_1 u_i+（1+R_2/R_1 ）u_i=R_2/R_1 u_i
又R_1=R_2=10kΩ，所以得u_o = u_i，输出为“-”。
又因为是双边带调幅信号，对于正弦信号当班个周期进行完后，下班个周期的信号的幅值会相反，所以下一个周期输出就全为“+”。随后以此类推，一正一负。
（4）低通滤波
通过低通滤波，取平均值，得到相敏检波后的信号。最终相敏检波取平均值如图2-13所示。
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/alt_text-24.png" alt="alt text" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
图2-13 相敏检波后的信号波形图
最后我们可以观察到相敏检波的后的信号，与我们分析的一致，半个周期幅值全为“+”，下半个周期就为“-”，最后滤波求平均后的信号与我们前期设计的放大电路输出的信号波形一致。&lt;/p&gt;</description></item><item><title>测试数据处理与误差分析--最小二乘和回归分析的LabVIEW实现</title><link>https://blackiepiggy.github.io/projects/labeviewls/</link><pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate><guid>https://blackiepiggy.github.io/projects/labeviewls/</guid><description>&lt;h1 id="1-模块需求分析与功能设计"&gt;1 模块需求分析与功能设计&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;（1）采用最小二乘法实现数据的处理，并将相关参数显示在前面板上；&lt;/li&gt;
&lt;li&gt;（2）采用回归分析实现测试数据点的显示与拟合曲线的显示，并将斜率$k$、截距$b_0$等参数显示在前面板上；&lt;/li&gt;
&lt;li&gt;（3）重复性测量情况下的方差进行分析，分别求出回归平方和$U$、参与平方和$Q$和离差平方和$S$并显示在前面板上；&lt;/li&gt;
&lt;li&gt;（4）对显著性进行检验，分别计算$F、F_1、F_2$，并利用合理的逻辑从$F$表中取出比较值与$F$进行比较，将显著性检验结果显示在前面板；&lt;/li&gt;
&lt;li&gt;（5）对不确定度进行评定，形成不确定度报告，将重要参数显示在前面板；&lt;/li&gt;
&lt;li&gt;（6）对粗大误差进行判定，如果有，指出数据中的粗大误差位置。如果没有，则判断其中没有。如果数据量小于10，采用格罗布斯法，如果数据量大于10，采用$3 \sigma$ 法则。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="2-程序界面设计"&gt;2 程序界面设计&lt;/h1&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/img-for-typora/202208092145665.png" alt="图2-1 程序前面板" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 id="3-各模块数据处理原理与实现"&gt;3 各模块数据处理原理与实现&lt;/h1&gt;
&lt;h2 id="31-测试过程与数据"&gt;3.1 测试过程与数据&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1.测试过程&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;（1）第一次实验上机完成了回归分析的建立，完成了回归直线的显示并得到了相关参数值；&lt;/li&gt;
&lt;li&gt;（2）第二次实验上机完成了方差分析与显著性检验的功能实现，完成了部分的界面设计；&lt;/li&gt;
&lt;li&gt;（3）在课后完成了最小二乘法和回归分析两种方法完成了数据处理，并完成了粗大误差与不确定度评定的功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2.数据分析&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;（1）最后得到的回归曲线直线方程为：$\hat{u} = 4.37w+1.516$；&lt;/li&gt;
&lt;li&gt;（2）回归系数为4.36826；&lt;/li&gt;
&lt;li&gt;（3）$R^2$相关系数为0.99，相关性非常高，说明重复性测量消除随机误差的效果较好；&lt;/li&gt;
&lt;li&gt;（4）$F、F_2$在0.01的水平上高度显著，$F_1$不显著，说明回归方程不显著可能与实验误差有关；&lt;/li&gt;
&lt;li&gt;（5）不确定度为7.7109，展伸不确定度为17.4248；&lt;/li&gt;
&lt;li&gt;（6）经过格罗布斯判定法，数据中没有粗大误差；&lt;/li&gt;
&lt;li&gt;（7）经过手动验算对比，所有的数据均为正确结果。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="32-基于最小二乘原理的传感器标定"&gt;3.2 基于最小二乘原理的传感器标定&lt;/h2&gt;
&lt;h3 id="321处理原理"&gt;3.2.1处理原理&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;最小二乘法要求最可信赖值应在使参与误差平方和最小的条件下求得。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为了确定$t$个不可直接测量的未知量$X_1,X_2,\cdots,X_t$的估计量$x_1,x_2,\cdots,x_t$，可对与该$t$个未知量有关函数关系的直接测量量$Y$进行$n$次测量，得测量数据$l_1,l_2,\cdots,l_n$，并有：
&lt;/p&gt;
$$
\begin{cases}
Y_1=f_1(X_1,X_2,\cdots,X_t)\\
Y_2=f_2(X_1,X_2,\cdots,X_t)\\
\cdots\\
Y_n=f_n(X_1,X_2,\cdots,X_t)
\end{cases}
$$&lt;p&gt;用矩阵能简化求解该方程的过程：设有列向量&lt;/p&gt;
&lt;p&gt;$L=\begin{bmatrix}l_1\\l_2\\\cdots\\l_n\\\end{bmatrix}$ $\hat{X}=\begin{bmatrix}x_1\\x_2\\\cdots\\x_n\\\end{bmatrix}$$V=\begin{bmatrix}v_1\\v_2\\\cdots\\v_n\\\end{bmatrix}$ $A=\begin{bmatrix}a_11&amp;a_12&amp;\cdots&amp; a_1t\\a_21&amp; a_22&amp;\cdots&amp; a_2t\\\cdots&amp;\cdots&amp;\cdots&amp;\cdots\\a_n1&amp; a_n2&amp;\cdots&amp; a_nt\end{bmatrix}$&lt;/p&gt;
&lt;p&gt;令$V^TV\rightarrow min\quad or\quad V^TPV\rightarrow min$&lt;/p&gt;
&lt;p&gt;经整理可得：
&lt;/p&gt;
$$
\hat{X}=C^{-1}A^TL=(A^TA)^{-1}A^TL \quad or \quad \hat{X}=C^{-1}A^TL=(A^TPA)^{-1}A^TPL
$$&lt;p&gt;
在本题一元线性回归的情境下
$Y=\begin{bmatrix}y_1\\y_2\\\cdots\\y_n\\\end{bmatrix}$ $X=\begin{bmatrix}1&amp;x_1\\1&amp;x_2\\\cdots&amp;\cdots\\1&amp;x_10\\\end{bmatrix}$ $b=\begin{bmatrix}b_0\\b\end{bmatrix}$ $V=\begin{bmatrix}v_1\\v_2\\\cdots\\v_10\end{bmatrix}$&lt;/p&gt;
&lt;p&gt;可利用公式
&lt;/p&gt;
$$
b=(X^TX)^{-1}X^TY=CB
$$&lt;p&gt;
求得。因此需要将$U$的平均测量一维数组与一个$10\times 1$的常量1数组组合后，利用LabVIEW中的矩阵运算函数进行运算。&lt;/p&gt;
&lt;h3 id="322程序实现"&gt;3.2.2程序实现&lt;/h3&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/img-for-typora/202208092138364.png" alt="图3-1 最小二乘实现" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;如图3-1所示，此处Y矩阵为U取平均后的一维数组，X需要将重量一维数组和一个等长度的一维常数组（全1）利用创建数组合成，最后利用各种矩阵运算函数连接相关元素即可。&lt;/p&gt;
&lt;p&gt;在前面板中可与线性回归法结果进行对比。结果完全一致，即$\begin{bmatrix}b_0\\b\end{bmatrix}=\begin{bmatrix}1.516\\4.36826\end{bmatrix}$，设计是成功的。&lt;/p&gt;
&lt;h2 id="33-基于回归分析的传感器标定"&gt;3.3 基于回归分析的传感器标定&lt;/h2&gt;
&lt;h3 id="331-处理原理"&gt;3.3.1 处理原理&lt;/h3&gt;
&lt;p&gt;此处采用了重复性测量，因此进行重复性测量试验的线性回归分析，这与普通一元线性回归有一定的区别。&lt;/p&gt;
&lt;p&gt;计算逻辑如下：&lt;/p&gt;
&lt;p&gt;建模序列：&lt;/p&gt;
$$
x_t,\overline{y_t} \quad (t=1,2,..,N)
$$$$\overline{y_t}=\frac{1}{m}{\sum_{i=1}^{m}{y_{ti}}}$$$$
\begin{cases}
l_{xx}=\sum_{t=1}^{N}{x_t^2-\frac{1}{N}（\sum_{t=1}^{N}{x_t）^2}}\\
l_{xy}=\sum_{t=1}^{N}{x_t{\overline{y_t}}-\frac{1}{N}\sum_{t=1}^{N}{x_t\sum_{t=1}^{N}{{\overline{y_t}}}}}\\
l_{yy}=\sum_{t=1}^{N}{{\overline{y_t}}^2-\frac{1}{N}（\sum_{t=1}^{N}{{\overline{y_t}}）^2}}\\
\end{cases}
$$$$
\begin{cases}
b=\frac{l_{xy}}{l_{xx}}\\
b_0=\overline{y}-b\overline{x}
\end{cases}
$$$$
\hat{y}=b_0+bx
$$&lt;h3 id="332-程序实现"&gt;3.3.2 程序实现&lt;/h3&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/img-for-typora/202208092225610.png" alt="图3-2 回归分析" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;如图3-2所示，步骤主要如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;读取表格文件，索引数组大小得出观测点数量N以及重复性测量次数m；&lt;/li&gt;
&lt;li&gt;索引数组取出横坐标x——重量的一维数组。索引数组取出10组重复性测量的电压数据二维数组；&lt;/li&gt;
&lt;li&gt;通过for循环索引重量的值，并进行累加，进行输出，求平均值、平方和等数据。通过索引循环二维数组电压数据的每一列，再次循环索引求出相同重量下重复性测量的平均值，求出电压平均值一维数组；&lt;/li&gt;
&lt;li&gt;求出电压平均测量值的平均值、平方和、和等；&lt;/li&gt;
&lt;li&gt;求出$l_xx,l_xy,l_yy$；&lt;/li&gt;
&lt;li&gt;利用步骤5求出的数据算出$k,b_0,b,R_2$;&lt;/li&gt;
&lt;li&gt;利用XY图绘制U的平均值——重量的散点图。同时利用$k,b_0$求出第一个点与最后一个测量点的估计值，将两点连线绘制回归曲线。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="34-方差分析与显著性检验"&gt;3.4 方差分析与显著性检验&lt;/h2&gt;
&lt;h3 id="341-处理原理"&gt;3.4.1 处理原理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;方差分析&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;回归平方和：$U=mbl_{xy}, \quad V_U = 1$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;残余平方和：$Q=Q_L+Q_E, \quad V_Q=Nm-2$&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
$$
\begin{cases}
失拟平方和：Q_L = m(l_{yy}-bl_{xy}),\quad V_L=N-2\\
误差平方和：Q_E = \sum_{t=1}^{N}\sum_{i-1}^{m}(y_{ti}-\overline{y_t})^2,\quad V_{QE}=Nm-N
\end{cases}
$$&lt;ol start="3"&gt;
&lt;li&gt;离差平方和：$S=U+Q_L+Q_E,\quad V_S=Nm-1$&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;显著性检验&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;回归方程显著性检验$F$&lt;/p&gt;
$$
F=\frac{U/V_U}{Q/V_Q}
$$$$
\begin{cases}
F显著，说明直线回归方程显著\\
F不显著，回归方程不显著，可能与失拟或实验误差有关
\end{cases}
$$&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$F_1$ 检验&lt;/p&gt;
$$
F_1=\frac{Q_L/V_{QL}}{Q_E/V_{QE}}
$$$$
\begin{cases}
F_1显著，说明失拟误差大\\
F_1不显著，说明回归方程不显著可实验误差有关
\end{cases}
$$&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$F_2$ 检验&lt;/p&gt;
$$
\begin{cases}
F_2显著，说明实验误差是回归方程不显著的主要原因\\
F_2不显著，说明实验误差不是回归方程不显著的唯一原因，可能失拟误差也是回归方程不显著的原因之一
\end{cases}
$$&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;查询F分布表中的$F_{\alpha}(V_U,V_Q),F_{\alpha}(V_L,V_E),F_{\alpha}(V_U,V_E) $，进行比较，得出显著性结果。$F&gt;F_{\alpha}(V_U,V_Q)$表示显著（在$\alpha$水平上），否则不显著。&lt;/p&gt;
&lt;h3 id="342-程序实现"&gt;3.4.2 程序实现&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;方差分析&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/img-for-typora/202208092250167.png" alt="图3-3 方差分析" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;根据公式对数据进行运算处理。如图3-3，分别求得$U,Q,S$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;显著性检验&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/img-for-typora/202208092251055.png" alt="图3-4 显著性检验" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;如图3-4所示，主要步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;利用公式分别求出$F,F_1,F_2$以及$V_Q,V_{QE},V_{QL},V_U$；&lt;/li&gt;
&lt;li&gt;建立三个F表常量二维数组（如图3-7所示），根据不同的$V_Q,V_{QE},V_{QL},V_U$从F表中利用正确逻辑取出比较值。由于F表行列往后不再按照整数+1递增，因此采用公式节点进行数值的计算，例如图3-5中所示逻辑；&lt;/li&gt;
&lt;li&gt;将$F_n$与取出的比较值进行比较，比较逻辑可见图3-6所示。根据不同的比较结果，使用条件结构对输出字符串结果进行对应输出。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/img-for-typora/202208092301161.png" alt="图3-6(1) 比较逻辑" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;center&gt;
&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/img-for-typora/202208092258332.png"&gt;&lt;img src = "https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/img-for-typora/202208092258196.png"&gt;
&lt;br&gt;
图3-6(2) 比较逻辑
&lt;/center&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/img-for-typora/202208151106854.png" alt="图3-7 各个表格" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="35--测量不确定度评定"&gt;3.5 测量不确定度评定&lt;/h2&gt;
&lt;h3 id="351-处理原理"&gt;3.5.1 处理原理&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;A类评定&lt;/p&gt;
&lt;p&gt;通过一系列观测数据的统计分析来评定。&lt;/p&gt;
&lt;p&gt;常用评定方法：贝塞尔法、Peters法、极差法、最大误差法。&lt;/p&gt;
&lt;p&gt;如果用贝塞尔法，评定步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;由一系列观测值：$x_1,x_2,...,x_n.$&lt;/p&gt;
&lt;p&gt;用公式计算：
&lt;/p&gt;
$$
\sigma = \sqrt{\frac{\sum_{i=1}^n{(x_i-\overline{x})^2}}{n-1}}
$$&lt;p&gt;
2.用单词测量值作为测量估计值时，$u=\sigma$.&lt;/p&gt;
&lt;p&gt;3.用算术平均值作为测量估计值时，$u=\frac{\sigma}{\sqrt{n}}$.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;B类评定&lt;/p&gt;
&lt;p&gt;基于经验或其他信息所认定的概率分布来评定。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;分辨率&lt;/p&gt;
&lt;p&gt;实验仪器的电压表最小分辨率为1mV，区间半宽度为$a=0.5mV$，假设为均匀分布，则对应的包含因子为$k=\sqrt{3}$，则由分辨力引起的标准不确定度为$u_0=\frac{a}{\sqrt{3}}$.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;示值误差&lt;/p&gt;
&lt;p&gt;假设示值误差为$U_x=3.5\times10^{-6}\times10V, k=3, u_{x2}=\frac{U_x}{k}.$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;稳定性&lt;/p&gt;
&lt;p&gt;假设24h内电压表稳定度不超过$\pm15\mu V$，均匀分布，则$u_{x3}=\frac{15\mu V}{\sqrt{3}}.$&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="352-程序实现"&gt;3.5.2 程序实现&lt;/h3&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://picture-jasonlee.oss-cn-shanghai.aliyuncs.com/img-for-typora/202208151106184.png" alt="图3-8 不确定度评定" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;如图3-8，主要步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;利用贝塞尔公式对索引出来的电压值进行不确定度进行计算，并且进一步运算得到重复性不确定度；&lt;/li&gt;
&lt;li&gt;利用格罗布斯法，索引得到了一列中的最大值和最小值，方法为循环索引并与移位寄存器中上次比较得到的较大（小）值进行比较；&lt;/li&gt;
&lt;li&gt;求出格罗布斯法公式求出$g$值；&lt;/li&gt;
&lt;li&gt;建立格罗布斯表，根据重复性测量次数索引出比较值；&lt;/li&gt;
&lt;li&gt;将两值进行比较，判定是否存在粗大误差，并将结果利用字符串在前面板进行显示。&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>自动控制原理Matlab仿真</title><link>https://blackiepiggy.github.io/projects/control/</link><pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate><guid>https://blackiepiggy.github.io/projects/control/</guid><description>&lt;h1 id="题目一"&gt;题目一&lt;/h1&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903155253.png2025-09-03-15-52-53" alt="20250903155253" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="1-source-code"&gt;1 Source Code&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;%源代码-实验-题目1%
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;t = 0:0.1:12; num = [1]; %步长；传递函数分母
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zeta1 = 0.1;den1 = [1 2*Zeta1 1]; %Zeta_n即阻尼比取值
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zeta2 = 0.4;den2 = [1 2*Zeta2 1];
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zeta3 = 0.6;den3 = [1 2*Zeta3 1];
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zeta4 = 0.8;den4 = [1 2*Zeta4 1];
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zeta5 = 1;den5 = [1 2*Zeta5 1];
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zeta6 = 0.707;den6 = [1 2*Zeta6 1];
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[y1,x,t] = step(num,den1,t); %构建阶跃响应函数
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[y2,x,t] = step(num,den2,t);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[y3,x,t] = step(num,den3,t);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[y4,x,t] = step(num,den4,t);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[y5,x,t] = step(num,den5,t);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[y6,x,t] = step(num,den6,t);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;plot(t,y1,t,y2,t,y3,t,y4,t,y5,t,y6); %将六个曲线画在一个图上
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grid on;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xlabel(&amp;#39;t/s&amp;#39;);ylabel(&amp;#39;c(t)&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;title(&amp;#39;Unit-Step Response of \phi(s)=\omegan^2/(s^2+2\xi\omegans+\omegan^2)&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text(2.2,1.399,&amp;#39; \leftarrow \xi=0.1&amp;#39;,&amp;#39;FontSize&amp;#39;,13); %箭头注释阻尼比
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text(2.6,1.15,&amp;#39; \leftarrow \xi=0.4&amp;#39;,&amp;#39;FontSize&amp;#39;,13);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text(2.8,1.006,&amp;#39; \leftarrow \xi=0.6&amp;#39;,&amp;#39;FontSize&amp;#39;,13);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text(2.8,0.9283,&amp;#39; \leftarrow \xi=0.707&amp;#39;,&amp;#39;FontSize&amp;#39;,13);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text(2.8,0.8705,&amp;#39; \leftarrow \xi=0.8&amp;#39;,&amp;#39;FontSize&amp;#39;,13);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text(2.8,0.7689,&amp;#39; \leftarrow \xi=1&amp;#39;,&amp;#39;FontSize&amp;#39;,13);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;str = {&amp;#39;\omegan=1&amp;#39;}; %注释Wn取值
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text(1,1.7,str,&amp;#39;FontSize&amp;#39;,13)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-分析"&gt;2 分析&lt;/h2&gt;
&lt;p&gt;题目要求为画二阶系统阶跃响应，故选用step相关指令。由于此处涉及到对t的显示范围和步长的设置，故应用[y0,x,t] = step(num,den,t)指令。此处num为闭环传递函数的分子。由题可知，Wn=1，故num为1，六根曲线可共用。den为分母。此处从0、1到1取6个量0.1, 0.4, 0.6, 0.7, 0.8, 1，分别用变量Zeta n来表示不同阻尼比。&lt;/p&gt;
&lt;p&gt;Wn=1，故分母1s^2+2ξs+1，其系数分别为1，2ξ，1，故den n = [1 2*Zetan 1]。之后利用[yn,x,t] = step(num,den,t)和plot(t,y,&amp;hellip;)来将六根曲线绘制在同一张图上。同时，题目要求进行标注，此处我采用text指令，括号内从左至右分别表示坐标、左箭头、标注内容、字体大小。通过Figure工具栏中的数据游标功能可以确定想添加注释的坐标。&lt;/p&gt;
&lt;h2 id="3-结果"&gt;3 结果&lt;/h2&gt;
&lt;p&gt;如图1-1所示。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903155339.png2025-09-03-15-53-40" alt="20250903155339" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;从图中可以观察到，当阻尼比ξ位于0.1～1之间时，随着ξ的增大，有：超调量Mp%变小，故系统的稳定性变高；曲线第一次与y=1的交点不断右移，即上升时间tr变大；峰值横坐标不断右移，即峰值时间tp变大；调节时间ts变小。即阻尼比越大，时域前期响应变慢，但更快趋于稳定。&lt;/p&gt;
&lt;p&gt;当阻尼比ξ=1时，曲线一直处于y=1下方，即没有超调。但前期响应较慢，快速性不及ξ&amp;lt;1时的系统。ξ=0.707时，具有较好的综合性能。&lt;/p&gt;
&lt;h2 id="4-反思总结"&gt;4 反思总结&lt;/h2&gt;
&lt;p&gt;联想到课程中学习的内容，在二阶系统阶跃时域响应中存在一个&amp;quot;最佳阻尼比&amp;quot;的概念，在本题目中我也将其绘制在了图中。可以看到，在最佳阻尼比的情况下，超调量很小，且响应速度也比较可观，在&amp;quot;快、准、稳&amp;quot;上有一个比较好的平衡。&lt;/p&gt;
&lt;p&gt;另外，对于阻尼比的理解，我将其比喻为&amp;quot;一个反向力&amp;quot;。在阻尼比为0时，即任其震荡，时域响应反应为等幅震荡。随着这个&amp;quot;反向力&amp;quot;增大，其振幅的衰减会加快。当阻尼比大于等于1时，这个力便会大到直接让其不发生震荡。&lt;/p&gt;
&lt;h1 id="题目二"&gt;题目二&lt;/h1&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903155415.png2025-09-03-15-54-16" alt="20250903155415" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="1-source-code-1"&gt;1 Source Code&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;%源代码-实验一-题目3%
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zeta1 = 1; num1 = [1*Zeta1]; %K=1的开环传递函数分子
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zeta2 = 3; num2 = [1*Zeta2]; %K=3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zeta3 = 5; num3 = [1*Zeta3]; %K=5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;den = [1 2 3 2]; %开环传递函数公共分母
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;den4 = [1 2 3 3]; %K=1的闭环传递函数分母
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;den5 = [1 2 3 5]; %K=3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;den6 = [1 2 3 7]; %K=5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;num = [1]; %闭环传递函数公共分子
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;figure(1); %画图1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(211);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sys1 = tf(num1,den); %K=1的开环传递函数
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;margin(sys1); %画Bode图并求裕度
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(212);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nyquist(sys1); %画nyquist图
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grid on;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;figure(2);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(211);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sys2 = tf(num2,den);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;margin(sys2);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(212);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nyquist(sys2);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grid on;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;figure(3);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(211);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sys3 = tf(num3,den);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;margin(sys3);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(212);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nyquist(sys3);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grid on;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;figure(4);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sys4 = tf(num,den4); %K=1的闭环传递函数
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sys5 = tf(num,den5);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sys6 = tf(num,den6);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;t = linspace(0,50); %横轴取值范围0到50
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;y = linspace(-5,5); %横轴取值范围-5到5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;y1 = step(sys4,t); %构建K=1时的阶跃响应函数
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;y2 = step(sys5,t);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;y3 = step(sys6,t);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;plot(t,y1,t,y2,t,y3); %将三个时域响应函数画在一张图上
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-分析过程"&gt;2 分析过程&lt;/h2&gt;
&lt;p&gt;由于将三个Bode图画在同一张图上容易看不清，故将k=1，3，5分别画出其Bode图与Nyquist图。&lt;/p&gt;
&lt;p&gt;由于此处需要求出Bode图的两个裕度，故采用margin()指令，可简易完成该操作，只需分别构建margin()对象系统。分别构建k=1，3，5时的开环函数分子与分母，用sys n = tf(num,n,den)指令对传递函数进行构建。将构建好的sys1,sys2,sys3分别用margin()和nyquist()画图即可。最后，为比较时域动态性能，将三个系统的闭环函数分别构建为sys4，sys5，sys6，并用题目1中的方法画在同一张图上对比。&lt;/p&gt;
&lt;h2 id="3结果"&gt;3.结果&lt;/h2&gt;
&lt;p&gt;如图2-1，当k=1时，由于转折频率前的幅频曲线（对数）直接与L(w)=0dB重合，由margin()指令结果可知，相位裕度为Inf，即无穷大；相位交界频率Wg=1.73rad/s，增益裕度为12dB。两裕量均为正值，故系统稳定。从下方奈氏图可以看出：&lt;/p&gt;
&lt;p&gt;N=0
通过计算开环极点可知P=0，故
Z=N+P=0
即系统稳定。与Bode图判断相吻合。系统中频段Bode图与L(w)=0交界处斜率为0，故稳定性好。但由于wc小，其响应没那么快。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903155519.png2025-09-03-15-55-20" alt="20250903155519" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;如图2-2，k=3时，右上图数据可得wc=1.56rad/s，相位裕度为17.1°，wg不变，增益裕度为2.5dB。此时，系统虽裕量不大，但仍能满足稳定要求。用对数稳定判据可得，相频曲线在wc左侧无穿越，同样可得系统稳定。从奈氏图中可以看出&lt;/p&gt;
&lt;p&gt;N=0
同理 P=0
故 Z=P+N=0
故系统稳定。与Bode图结论吻合。系统中频段wc处以斜率-20dB/dec通过，且离斜率为0的频段较近，具有一定的稳定性，但没有k=1时稳定。wc比k=1时大，故响应变快。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903155537.png2025-09-03-15-55-37" alt="20250903155537" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;如图2-3，k=5时，由图上数据可得wc=1.86rad/s，相位裕度为-9.91°，wg不变，增益裕度为-1.93dB。裕量均为负数，故系统不稳定。从奈氏图中可以看出N=2，因为绕（-1，0）顺时针转了2圈，&lt;/p&gt;
&lt;p&gt;同理 P=0
故 Z=P+N=2不等于0
故系统不稳定。与Bode图判断吻合。系统中频段wc处以斜率-20通过，但离斜率为0的段较远，导致了系统的不稳定。wc相比k=3增大，响应更加快速。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://raw.githubusercontent.com/BlackiePiggy/homepage_picbed/master/homepage_img/20250903155545.png2025-09-03-15-55-46" alt="20250903155545" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="4反思与总结"&gt;4.反思与总结&lt;/h2&gt;
&lt;p&gt;对于中频段特性与时域动态性能的关系研究上，我还绘制了k在三个值下的时域响应曲线。可以从曲线上发现：k越大，系统响应越快，稳定性越差，调节时间越短，增益越大。但当k太大时，会出现失稳的情况，时域曲线表现为发散。如下图所示，与前面对于中频段特性的判断相吻合。&lt;/p&gt;
&lt;p&gt;通过本实验，可以推断：欲使系统稳定，应保证Bode图上w0处斜率尽可能小，且离斜率更小的段更近，离斜率大的段更远。同时，也应使裕量更大，wc在wg左方较远处。这与教材中的结论一致。&lt;/p&gt;</description></item></channel></rss>