<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>dev的艺术空间</title>
  
  
  <link href="https://blog.jzxer.cn/atom.xml" rel="self"/>
  
  <link href="https://blog.jzxer.cn/"/>
  <updated>2026-04-04T16:00:58.308Z</updated>
  <id>https://blog.jzxer.cn/</id>
  
  <author>
    <name>dev</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title></title>
    <link href="https://blog.jzxer.cn/20260405/20250128-esp8266-with-mqtt/"/>
    <id>https://blog.jzxer.cn/20260405/20250128-esp8266-with-mqtt/</id>
    <published>2026-04-04T16:00:58.308Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://randomnerdtutorials.com/esp8266-and-node-red-with-mqtt/">https://randomnerdtutorials.com/esp8266-and-node-red-with-mqtt/</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;参考&quot;&gt;&lt;a href=&quot;#参考&quot; class=&quot;headerlink&quot; title=&quot;参考&quot;&gt;&lt;/a&gt;参考&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://randomnerdtutorials.com/esp8266-and-node-red-with-mqt</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>openclaw 连接 webChat 来控制电脑</title>
    <link href="https://blog.jzxer.cn/20260225/20260225_openclaw_with_im/"/>
    <id>https://blog.jzxer.cn/20260225/20260225_openclaw_with_im/</id>
    <published>2026-02-25T02:54:14.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="0-起因"><a href="#0-起因" class="headerlink" title="0. 起因"></a>0. 起因</h2><p>昨天有个客户找到我，希望做一个能通过手机用openclaw控制电脑的需求。我就尝试了解了一下，正好最近openclaw的热度很高，趁这个机会我看看到底怎么个事儿。</p><h2 id="1-openclaw-介绍"><a href="#1-openclaw-介绍" class="headerlink" title="1. openclaw 介绍"></a>1. openclaw 介绍</h2><p>openClaw（原名Clawdbot、Moltbot，后因版权纠纷更改）在短短一个月内突破 190,000+ stars，成为 GitHub 历史上增长最快的开源项目之一。</p><p>这款由 <a href="https://zhida.zhihu.com/search?content_id=269802431&content_type=Article&match_order=1&q=PSPDFKit&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3NzIyMDMyNzYsInEiOiJQU1BERktpdCIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjI2OTgwMjQzMSwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.uKGT54InlBdDWZYxXQDYgyExakg79al_j2kmkvf7nbk&zhida_source=entity">PSPDFKit</a> 创始人 Peter Steinberger 通过AI编程打造的本地、自托管 AI 个人智能助手，通过将消息平台与 <a href="https://zhida.zhihu.com/search?content_id=269802431&content_type=Article&match_order=1&q=LLM&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3NzIyMDMyNzYsInEiOiJMTE0iLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjoyNjk4MDI0MzEsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MSwiemRfdG9rZW4iOm51bGx9.MAXafWYInunGtJi0cB__QVCcXO9OYe_6kpSrU2oUn1I&zhida_source=entity">LLM</a> 、智能体深度整合，有界面，有第三方集成能力，实现了从电脑操作，日程提醒，会议摘要生成到网页操作等的全场景自动化。</p><p>产品本着能不用人工就不用人工的原则，它的定位是：<strong>适用于任何操作系统的 AI 智能体 Gateway 网关</strong></p><h2 id="2-环境搭建"><a href="#2-环境搭建" class="headerlink" title="2. 环境搭建"></a>2. 环境搭建</h2><h3 id="2-1-安装openclaw"><a href="#2-1-安装openclaw" class="headerlink" title="2.1 安装openclaw"></a>2.1 安装openclaw</h3><p>通过官网提供的几种方式来安装openclaw，我这里用的是默认的脚本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://openclaw.ai/install.sh | bash</span><br></pre></td></tr></table></figure><blockquote><p>国内用户可能需要用魔法，或者尝试其它的安装方式。</p></blockquote><h3 id="2-2-配置-openclaw"><a href="#2-2-配置-openclaw" class="headerlink" title="2.2 配置 openclaw"></a>2.2 配置 openclaw</h3><p>这一步需要配置以下几个内容，按照提示一步步走就行：</p><ul><li>AI 模型提供商（我选kimi）</li><li>Channel（我选了feishu）</li><li>skill（可选，我暂时没选）</li></ul><p>配置完成后，最后会提醒你要以什么形式运行 openclaw，这里可以选web-UI，使用起来更直观。我这里选了TUI。因为我是需要配置一个云端服务，不需要可视化界面。</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20260225225426670.png" alt="截图"></p><p>完了后就可以在：<a href="http://localhost:18789/">http://localhost:18789</a> 看到运行界面了。</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20260225230749839.png" alt="完成安装"></p><h3 id="2-3-编写IM聊天应用"><a href="#2-3-编写IM聊天应用" class="headerlink" title="2.3 编写IM聊天应用"></a>2.3 编写IM聊天应用</h3><p>用 react技术栈写了个聊天应用，接入openclaw的聊天系统。</p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/uTools_GIF_1772032753093.gif" alt="uTools_GIF_1772032753093" style="zoom:80%;" /><p>在会话窗口输入相应的命令电脑会同步出现相同的操作。</p><p>此时还不够完美，客户的需求是需要在手机端远程控制电脑。有点想以前喜欢玩的一个梗：我希望你能通过电脑控制挖掘机炒菜。</p><p>到今天似乎是真的实现了。</p><h3 id="2-4-内网穿透"><a href="#2-4-内网穿透" class="headerlink" title="2.4 内网穿透"></a>2.4 内网穿透</h3><p>这一步我们是为了通过内网穿透的形式把服务暴露到云端。我用的方案是 frp。</p><p>然后就可以肆无忌惮的通过手机来远程控制电脑了。它不同于以往的远程软件的是：这是真正的用AI来帮你处理电脑上的任务，而不是像以往只是远程圈圈点点。</p><h2 id="3-问题列表"><a href="#3-问题列表" class="headerlink" title="3. 问题列表"></a>3. 问题列表</h2><h3 id="3-1-报错不允许的Origin？"><a href="#3-1-报错不允许的Origin？" class="headerlink" title="3.1 报错不允许的Origin？"></a>3.1 报错不允许的Origin？</h3><p>在controlUI里配置白名单。（我猜作者用了 vite）</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;gateway&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    ...</span><br><span class="line">    <span class="attr">&quot;controlUi&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;allowedOrigins&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;https://demo.jzxer.cn&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;http://localhost:3000&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;http://192.168.49.230:3000&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">]</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  ...</span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">昨天有个客户找到我，希望做一个能通过手机用openclaw控制电脑的需求。我就尝试了解了一下，正好最近openclaw的热度很高，趁这个机会我看看到底怎么个事儿。</summary>
    
    
    
    <category term="AI" scheme="https://blog.jzxer.cn/categories/AI/"/>
    
    
    <category term="自动化" scheme="https://blog.jzxer.cn/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    
    <category term="openclaw" scheme="https://blog.jzxer.cn/tags/openclaw/"/>
    
  </entry>
  
  <entry>
    <title>男性力量的磨练</title>
    <link href="https://blog.jzxer.cn/20251227/20251227-thinking/"/>
    <id>https://blog.jzxer.cn/20251227/20251227-thinking/</id>
    <published>2025-12-27T04:10:34.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p> <strong>本文不会让你快乐，但是他会让你：稳、狠、不容易被击垮</strong></p></blockquote><h2 id="1-前言"><a href="#1-前言" class="headerlink" title="1. 前言"></a>1. 前言</h2><p>在我以前还在读书的时候，都喜欢国内的那种柔性美，觉得帅、酷。但是随着年龄的增长，发现真正能带来成长的，是成为一个够硬的男人。</p><p>我很早之前，大约 2020 年左右就开始研究男性力量的内容，其中就有探索男性真正应该有的样子应该是什么样的议题。</p><p>国内的娘炮文化，显然很难让我找到这些东西。得亏我在初中就开始了解欧美的流行文化，那时候还是 mj、florida、snopy dogg这群前人。</p><p>我就往欧美市场找寻，渐渐的发现欧美文化的底蕴，也找到了在外国人眼里男人应该有的样子。期间我看了大量欧美硬汉的片子，比如：汤姆哈迪、杰森斯坦森、道恩强森、阿尔帕西诺…等等。我开始在他们身上寻找共通点，为什么我会非常能感受他们作为男人在女人心中的魅力？他们做对了哪些事儿？</p><img src="http://static.jzxer.cn/blog/%E6%88%AA%E5%B1%8F2025-12-18%2016.55.27.png" style="zoom:50%;" /><h2 id="2-解析硬汉"><a href="#2-解析硬汉" class="headerlink" title="2. 解析硬汉"></a>2. 解析硬汉</h2><blockquote><p><strong>我不是来取悦世界的，我是来承担重量的。</strong></p></blockquote><p>看着这句话，表达的内容虽然简单，但是似乎有一种说不出的语言魅力。似乎不需要看到说话的人，就能感觉到说这话的人不好惹。</p><p>以下我就以我最欣赏的汤老师作为例子，来列举他为什么就能给人这种感觉，我先列举出他的四个核心特质：</p><ol><li><p>身体体承受性：他肩背很厚实，颈部看着很有力量感，看上去就是那种被人快打死了，还能站起来的人</p></li><li><p>情绪控制力：内心汹涌澎湃，但是外在极度克制</p></li><li><p>边缘感和危险感：不讨好、不解释、不急于被理解</p></li><li><p>内在秩序感：生活里有一套极其清晰的自律系统</p></li></ol><p>简单点总结就是：硬 + 稳 + 不废话</p><p>回顾一下汤姆哈迪这年轻时候的放纵就知道，他这种硬，来自于那种人生经过各种千锤百炼的高潮低谷，他经历过：暴力、自毁、成瘾、心理问题种种我们大众认为没救了的点。但是直到有一天清晨他宿醉后在自己的呕吐物堆中醒来，发现这种生活不是他想要的，开始洗心革面，开始让生活步入正轨。这个过程是我们很多人忽略的部分，他最后银幕上的成功，他塑造的那些硬汉形象，都是因为他曾经的经历锻造出来的基本面。可以说，看了他的电影，就基本知道他之前是个什么样的人。而这是我们很多人现在无法做到的。</p><p>这也是我为什么推崇人生就应该去体验，去经历。读书很重要，但是只是通过看书，坐在办公室刷手机就觉得自己能达到这个境界是绝对不可能的。跳出自己的舒适区，才能拓展自己的舒适区。</p><p><strong>实战才是成长最快的途径。</strong></p><h2 id="3-打造硬汉"><a href="#3-打造硬汉" class="headerlink" title="3. 打造硬汉"></a>3. 打造硬汉</h2><p>我搜罗了一些资料，并结合一些自己的经验，总结了以下3个打造硬汉气质的方向。</p><h3 id="3-1-第一阶段：身体层"><a href="#3-1-第一阶段：身体层" class="headerlink" title="3.1 第一阶段：身体层"></a>3.1 第一阶段：身体层</h3><p>这是作为以下所有层的地基，人与人之间最基础的还是通过视觉传达气场。有的人一眼就能看出来他是个什么样的人就是这个原因。</p><p>这一层我们主要就是健身，而健身的主要的目的是：</p><ul><li>增强肩背厚实</li><li>让颈部有力量感</li><li>保持核心稳定</li><li>行走的时候有“压地感”</li></ul><p>具体锻炼细则的话可以按照自身需求和上面描述的方向调整。</p><article class="message is-dark is-default">        <div class="message-header"><p><i class="<图标> mr-2"></i>完成标志</p></div>        <div class="message-body">            <ul><li>训练不再犹豫</li><li>身体开始“厚”起来</li><li>行走节奏变慢</li><li>说话明显变少</li></ul>        </div>    </article><h3 id="3-2-第二阶段：精神层"><a href="#3-2-第二阶段：精神层" class="headerlink" title="3.2 第二阶段：精神层"></a>3.2 第二阶段：精神层</h3><p>可以说 90% 的人都倒在了这里，毕竟人都是有惰性的，并且逃离危险是人的本能，而突破这个思想枷锁的过程确实会让人非常痛苦。但是后期思维方式一旦形成，对人的影响是受益无穷的。</p><p>在这个阶段，我们需要摒弃一些行为，并且养成一个新的行为体系。</p><ol><li>戒掉软行为：长时间刷短视频(&lt;30m)、无意义社交、情绪化输出（解释、抱怨、辩解）</li><li>建立痛苦耐受阈值：每天必须做一件抗拒的事（不舒服、你不想做、你还是做了）</li></ol><p>这是气质转换的核心机制，<strong>虽痛苦，但必须</strong>。</p><article class="message is-dark is-default">        <div class="message-header"><p><i class="<图标> mr-2"></i>完成标志</p></div>        <div class="message-body">            <ul><li><p>他人开始觉得你“不好糊弄”</p></li><li><p>你不再急于表达</p></li><li><p>情绪波动明显降低</p></li><li><p>身体对疲劳的恢复更快</p></li></ul>        </div>    </article><h3 id="3-3-第三阶段：气质与表达"><a href="#3-3-第三阶段：气质与表达" class="headerlink" title="3.3 第三阶段：气质与表达"></a>3.3 第三阶段：气质与表达</h3><p>这个阶段主要是为了形成硬核的语言与行为系统。可以去看一些前文我们提到的那些明星视频。去观察他们的行为举止刻意模仿。</p><ul><li><strong>语言系统：</strong>少解释、少修饰、多陈述事实</li></ul><p><strong>硬汉语言&#x3D;低频、短句、确定性</strong></p><ul><li><strong>姿态与眼神：</strong>肩膀自然下沉，胸腔打开；走路步伐慢半拍；看人时不闪躲，不过度盯着人。</li></ul><article class="message is-dark is-default">        <div class="message-header"><p><i class="<图标> mr-2"></i>完成标志</p></div>        <div class="message-body">            <ul><li><p>你不再焦虑“像不像硬汉”</p></li><li><p>他人开始主动尊重你的边界</p></li><li><p>你对痛苦、失败、孤独的容忍度显著提升</p></li><li><p><strong>你对自己有一种稳定的信任感</strong></p></li></ul>        </div>    </article><h2 id="4-总结"><a href="#4-总结" class="headerlink" title="4. 总结"></a>4. 总结</h2><p>真正的硬，不是没有问题，而是发现自己有问题，承认它，并且不逃避。</p><p>我们要做的不是把自己变成谁，而是要把自己锻造成一个：</p><p><strong>连自己都不敢轻视的人</strong></p>]]></content>
    
    
    <summary type="html">这两天无意间又刷到了汤姆哈迪的视频，看着他的言行举止，似乎体内的荷尔蒙开始觉醒，内心有个声音告诉我，这就是我想要的男性力量样本。</summary>
    
    
    
    <category term="自我提升" scheme="https://blog.jzxer.cn/categories/%E8%87%AA%E6%88%91%E6%8F%90%E5%8D%87/"/>
    
    
    <category term="雄性内核" scheme="https://blog.jzxer.cn/tags/%E9%9B%84%E6%80%A7%E5%86%85%E6%A0%B8/"/>
    
  </entry>
  
  <entry>
    <title>我做自媒体的工具</title>
    <link href="https://blog.jzxer.cn/20251205/20251205_midea_links/"/>
    <id>https://blog.jzxer.cn/20251205/20251205_midea_links/</id>
    <published>2025-12-05T09:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="1bf38d8353c431162af5a38d70297abd73ed6faf1d3a5e3873c1238277ab8c46">d868c18c4df3440fb03b61edb41a2543b4a327508dc6dadedcdd80d1b48b4278737e0c03f5e49371df0e75777488821e983593ac514f1b945cc1544c7199720e263c3a3e6ff280a37fd321d321684a2abf771f81d9a2cb84b3b3a03d9e6fb598ccf37c24a10151949b450ba2cbdc23a8d20ed8aedbd8ab48596f01b3178b06c74c4bbdb5687056779b3f8a85de6af5256bf2d35d83c705c59ac83810ec8d95bd20c3be5672c45f4ef51e251fe1d49ff6b7c876c738f4681fd722c23fecff3188611f666f4a8a2c8c930f747136f620225a469833094f566a0c74f041cb35e0b1c11b4953e3b4f7f965e6fc728301087da025357ee9052005c70e4c6457ba6c2cc7b0980a307df6eecdad90af72d73eda90bebea0be2535f81eac4171e28a43606925d3b11c99102840fb408b62b857a0b404707ca94e0308cd92df8015e81d2517be80dc72721b1238bedfdb2406fbcf2a3192591a0366741d85f57044bfde4bf2eac26543bc7f56b6cb16d072c5feba948429a07cccb8d0161a5cbc3c3949e1618e21d347282a1331a91a5192696b0fab02a3985e36d0aed3e17abd21d4b2a9b4186afd169b2075080649d39366cfa33d41c8e116f0b316b7c3a5fe00d77bfc02317a6e5951215e0cd66cca6c570ad0aaab0e44bd65734408ea9934628fce254c4cd0c04ac60fa3cab3b95a14f29f47f7960b63f4c55909496c69b688118ab1b6c2ab4b7d90d8774546de0a779f23dc1bb1ea09d1d9e4b5db6554008d9fcdfc15fc5584ef110a855270fdd1dde16905eea1b32f0a9bd56377d3c5394efd1bee0e37c3adaffd1e034749e71db95b27e01cace0e7dcbe5a03024b1d8dfb61b5f4751d6916f6cbb43e74b35390a2334f623679fb78e14745a5d22d2eb97bf4f7ea352575186efd89575c8587a21ebfcd29c2836ed864a0f85ce190c26190dae721ba0cd292de0126b14b1fc272f5f0ba0d39e9dc776dd745070650d64a82315fe9569b21a7e6e757e4be80ba47f18bd638b75a9193d6e4d75a2dc9f210d3c3452557098a7c8d2122dca5cf7e498c2f5a60f5a369f86f6ca4e4948ce0876425353c601b2ae4a0aedf1131f9059543c951590210efe23924183d023a6b573bd01fcd020b7ed3d41024314e74da4e87467bd65b4b7a987d3e2fdc243bbb67475c4a9dfe1197bdcf80c553f025910ff53f374bead20f9f4ea2d654abaace2e1f8f587ec00223ae8c6be4af67a2589e6db59c98e4cae7b8935b46c9b0c927045f6809bc9a8140cdd38567ab93e0a13dc62ed2c053eddce2309b48804a1528236234107a48d64969e9b43efb825e8b8e5366ab1cacb3a9bfc4447df462545669be2386e8122f80dd074ec085a79ad69dcf8b11506a15c24ccea0ccb234d7de9e87fbaea0d5386282fa702c35d658963d31f9d56988a46aa6fa503dbe9f3da50dc1709f9ca9ed321a6134d37b915c6dc889edb5e900c4f3d96ce19862f992aa4dcf57e7e3add8ad641c4caf4434d8314c777710c3dbb219948124505c3c6faaf9f15b496e39e462c15838671655c3ca6eed47809cb1f85d4cb302fa4b29d8de3b7691f0afd2bd7fe2adc9eab12fe5cb3aedf0956adf1679b8c71963496cc7ad8ffeac20c2dbe61920e0c2ac4a53d1981aa820f9315b1040450ce7b60f345306f34d33933d6aac37dd475edf254e93ca558f9a079ad10b4cadb3d95c30d73a5e5a9e4430588f8e3c574a032dd61b6f2dc146fc8e1392cf9b82520e44cc70fcc7355818783545ffc45affe7c1d93e3d4e7ca0dffc8c04ee3d09d1b59d751d439768d1ecd103b5bf2dfb7c90761be713722e26d43598841f9b659d12e63d4baef456ab3633c78067cde606260d1a708bb97ab22f77b3e8bed63403cb99eff71ee4ef565a633eeb530989c402a6be08e29fbb5ec803231283f3f3619fd90a42534e27cd0dca47c0035e31ebe117f254717444dbdb3f1a6d5e3387b5e467530a3b29f07a860a3317f7cc3cb158b89592d844ffc373f7fd02c3467850935bb5da62c44a7ea159e6ed0e421bc081a08871c688a63d53f4ddbf09959450c6b5dcd57f47851264bd050fb3dd017f12d7773c7c796aa5dde8a58ed974dbfcd5de6bdf448cdd59abe8df8a557328a1612188b26d20c66acf7bfea2a0c33aeb3475bd574060ed8c7d92e11023dc5f62f98761a0fe2952175ee6383c136f99fa5c0fa1b218333eb586065edef08248dcccbb4ef1acdf5e3e85e3b8faea8eee6a5cc89b5d523dca8a9149b3c8006cdfb1ad9a9ec1634d3174ece7ae6cab3e73ddcb9fc9c3c306755d5c20c4e47b39bc3d5c666210cc532e73bc2f6ab1c95c2309d342092d588b570e63e495722e057a7a40e5373cf2b841f2ab2cba8d9ffc9fd408466654cf261e82dc675dc717a2fff9877123a0ff4baabda5c217209f04a79d4305a4f94cada2a9a18a7bcff6c0b6927538aec9d17d96a0f6754cd210061448c808daa1d9e39d67475ffeddd2a55df3295c353c7980908933fdd7ae630259fe60cf452b307ee440dd9a64d97403221142c7f3349145edc4daca2d3c35db15416f6e7f6b90ed90cbef320583d96c9a7341e54954b94e9dc02b4cb6c1f170fe61a618b58ce894115dddff129c67f5412017a65675f1c77a6bd0f7815cec0e4d4f085f62cd3ff4b7e0447ec107ac126aae9c9d173fb9ec71535c5b610ab691061eeb0eb2e591dcde6de1b0cf9d5f309f04b945ac0851e946bd7a5067cdd4d04bf98a7cc17450c14c606cb87fd107b5117cb6bb1d4aaf086c7c66adb7347081b5c2d83660523dd514e9fccc08408d0d0586259c40c565cb3f4657b8c70b174a29fa705f9c520a3aed35ba05470bb4aa60079ac04dfce88c9d64c72c5d27d4aea54c5a6f956f0264d2026401785163dea62a73cbed1a3eb145a63038958a948d7a3a2f28a69ff6bf7013356cb34ac7ec52309cbe4dda2ea422e0f2d64e66f0dcaf14ce7a4d0f444defce3c806fe1c901613f6457b68a089a76149b52ef9070587ec90fb6692a339dbe4670d59665cbbc808d3f44a5b8cca5ac44f1785b445c3a829c68bc0d6694a6ddbee3c3e1aaa7a96232c44b047f0c63aa3af08d64f711c3a78c7bd0e8efd17c0ff1827c88872251f32ed1d2542069e59be83efc62fda6f0c587e6548b93f5bdfe1050eb1f2e85ff96a0d93d27c6355fe38dae4021c6ca3ace7a73b76073925ed0b1d0f0e0d9ca35a1241af41766d84c2bb7558a849acc410282529b4ee7363cdb9d8d87fd233dae4bd50238bd9e0cad502a389a20c19d0c87327fffb75a8045652139e4c6907a1b4befa21e365aaa4a49bacc4319c5496124a1744064621d071b5a203fa5a03b74b11b70f200bfb7344c90b0523b06b4fac123b992f1c1f3e79da18502d73c435c9478b98caeb7e9d8fb11bb81c498bb306f7f887e5c0956fd5d7e2cf6cb0e937174b10ef2cb3a2cd3d59235f564022f1b291acf5f2ce3ec63f3c05ff0761bac64c74c89fadb049441df53952a0a84fb2abcc515ab342eb08443986382dadf7ed32092d5879dc317819d45075ee9be3ef138555a4b7fd3dd8c714068e027040b71bf2b152da5af3d7beaad2d792fc36e3499dc275a38068e3c37736a4a7cbed84deda8bb4b587f4a1aa66d9cab39e084c03dfdf2ab1c27343656b66799c5b11148b3d5d1b5bf536710b5d27ced01808786f006367315def6a15698c866ff6bc8c1ae7cbe8e9053237d6609fbf1bed11e56b9af710676db138ab11dd7d6bfce8b5322108d825bbc7cea548194cdb9cb371050ecb3a2f739a2c7ca1d5ed79422806c628ba0db01fa2f371f0fc5cb3c0d6665ee1e6791c55d12f8e8ceeb52915ae0ffb8baae95ea91d85e12b844846c10af67e03e861165d2a2797ba40cfea41c0062d09f3ee1662cee432bcd31d4e1f65e6169188f6ee0f706aa9cc5c8186fc1a904a26d5c98bfc50babb05d0945133c333b808f90c7b3030c38b9305c1d2e73ffe34842b7609e5a4e91680abbbdc0f230448c01f5e3455591206058e06770ca3c43bae2ef62f104a5fa3bbf38c42e7cda9d03ee84fd96eb0ce538e77b6f9db1abc383c68341ebf00a815cce234bd37cc5fc566f02bc7b6424f34c0133c5cdd9af813b5d0b3d9b90bbfa3981c5f293d29950f2f6c10c3db054dc502d09d6963648a97f2f703fdf5403986a0f579ff26eeb472a298ce2b654f9c925d1df21b2dec20ec388cfb97eb08b166c5cf227a70952a3fe539c1ce51027ca0f16e79804c95f33db45e2f66261e30a78619510f0e4ac7e4a4f5555d95523ba100862b5a17c32a734c76eb303e9ff431d53cec2084a405eab0d3bd4d633c890e8086a25643167ef44f4066a8662d5fc9343a43e1490f48ecb315a184791e0450009b2ce36ce9c998567451a2e8a3be0ab4e73315d7859bd930ee5fae3a5e70b8f12774315b6bf79d5d5ee5133b8949b8bb34d63878152e6b85cc6547c18170a553346fa2aec1128e4a8e13d346914dee0324fb822a34429cc3e0111378b51d14f6b83edf8e1867baddfd3fa1a73207787c9fa15426a85d2100bf9e4bc15436dcc6196e0ad8b9bb9f7ea08b40f3687028aeeb8e0e1b8649a279e4267067187f41cb05d075d24db0141b883f92d375883f6b80ccede4ab0944c08aa89d6739cd07bf34084746e76b791b18088270955cdd0e734d7b0930d48c44fa5c363c0b3b1a78104c49e46b45b865de3e90532bd6db116b7a12586e5e9f2eb762eb9003e33c44fe217423c513fdebc7142832353481c82db8c130b1e75da5b21f34713e26ecc38d61169f99e66f18055923bd5fa7b294917ae060a608890de347888b3fe4fc4321e0ebae45d4ea780543edab05fff3c84e0d20117f650c2173eb0107152b9f39da0735bf4253156814e322521822e1e0d528f0d8a085f5a410aad833b8d9c90d1ed83c5cf2f0bffe9e05d7c1d658c015ed89fb4ee84ecc8bb13ee37fe3022640efa2679d7be64f3e3ebc5c74e3d3bc3cffa2b00ad19333b43d3ed6364d52507b847404ea25ee32e06dc2fa72b919179f6a4446e73ce9ca66cf00f0350339250bed321bb059571458405de77ae5ecbd4c91103c6967d3b6fcac43963b6d9d450f8a3c916eda48f6e246cf32b99e6991fb785c507285222a76102539492b38a80bdad6eff8da87e7e16e35f74c655ff2cf1c4c5db094a57fc982ac591e76811a3bcf866fb3376b0ac773912e4145d8aaff48c0160ce32f4644b411e10b92803c279333a116c91ce4076f8cfcff0f1f16f7319a4f9941fe202b5392a01e315623deee2198042cf652245e4add7846b14a4bc0ee88e2bb891d1f2f7a854492abdaf269c6fe8ef74a8dd92f37cdb1e4a429b307a4c2f8b843e4cebd10350389b1e03c051a8de52cf570a8f6eac4d41f876fb66c3f0ec36e7762d6ad081f019fc606bbc15de4f0949f14e793f4723999d8fcac20374f247f949bd8a53d8ce9b5ba63c013bdf01d926b54334d4fcc3a32b62ea85260ac48e19bb162c70bb27b49378e82af25a2a46107afbf503bcd6d01a695607bc15e00e20f234bdc52a4d6af7c260bd634add8f418090d46d6f5f29b6753f474a84af873ce67fbe894b8da0312e81e3332377002b68facc9958e32f16122448960273c9780abb054c8c2ead32a16e1667712e061f93a2b8e71992f66c05d66fe703b8ac3a83ce732296bab4c67f48ab02fd1e664116b06e9d22071ace183b9ad39c41bf12b3858382f0d1b83ae2fd58026c48639a215cabe6ea241e85d7b7b30a73c88471480237f1bc54c1615a5edf0e9079a49870e04cea2c1d9193bb491d34e1a447c91f61144c325c851a14eaca2669ad07afc33ab0ecb2ed5e5f5d24e403cafe6b41b689ed2bdf42adc980a5aa07a16275c27ba5e4f959122c43fa97c299ceadb865b82e2d3d8c0aa0867be17d0fa7875bf3c70326ddb9d21e428661f1236c2a</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="自媒体" scheme="https://blog.jzxer.cn/categories/%E8%87%AA%E5%AA%92%E4%BD%93/"/>
    
    
    <category term="工具" scheme="https://blog.jzxer.cn/tags/%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>梦境隐射现实</title>
    <link href="https://blog.jzxer.cn/20251113/20251113_the_dream/"/>
    <id>https://blog.jzxer.cn/20251113/20251113_the_dream/</id>
    <published>2025-11-13T10:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<p>昨晚做了个梦，梦到在和老妈吵架，醒来之后觉得无所谓。</p><p>但是如果从神经分析学的角度来说。它是一种潜意识的映射。存在一种我表面不在意，但是潜意识里很在意的一些事情。</p><p>那是对母亲的一种歇斯底里。</p><p>“你不要染头发，你本来头皮就不好。“。“我之前就是因为染了，头上长痘痘”。”你别不听别人说。”</p><p>那些所谓的关心的话语，在我这里变成一种控制欲，一种被当成物品的不舒服的感觉。</p><p>理性告诉我自己，没啥的只是梦而已，看开一点。</p><p>但是仔细想想，为什么会有这样的梦呢？它的契机是什么？它想要表达什么？它是不是我内心的一种反抗在意志最薄弱的时候通过梦境发泄出来了？</p><p>还是因为，最近太累了？</p><p>不得而知。</p><p>但是我会去关心这个状态。它一定不是一个随便生成的东西。</p><p>它代表某种含义，或许，解决了这个代表的含义，某些潜意识的碎片也会重新被修复起来。</p>]]></content>
    
    
    <summary type="html">昨晚做了个梦，梦到在和老妈吵架，醒来之后觉得无所谓。</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="潜意识" scheme="https://blog.jzxer.cn/tags/%E6%BD%9C%E6%84%8F%E8%AF%86/"/>
    
  </entry>
  
  <entry>
    <title>初次使用 minimind</title>
    <link href="https://blog.jzxer.cn/20251110/20251110_intro_minimind/"/>
    <id>https://blog.jzxer.cn/20251110/20251110_intro_minimind/</id>
    <published>2025-11-10T03:10:34.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>一直在探索市面上轻量化的个人 AI 模型，但是目前像 ds、chatgpt、kimi…都太过于巨大，训练要求也太过于高，所以一直在找是不是有一款阉割版的模型可以提供给个人普通电脑来使用，并且训练。</p><p>有的，兄弟有的。</p><p>这就是本文需要介绍的 minimind 模型。</p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>minimind 模型的安装非常简单，只需要安装好 python 环境和相关的依赖即可。</p><blockquote><p>由于 minimind 模型的依赖比较多，所以建议使用 conda 环境来安装。严格按照官方推荐的 py 版本会减少很多不必要的麻烦。</p></blockquote><p>依次执行以下命令：</p><h3 id="0-创建-conda-环境（可选）"><a href="#0-创建-conda-环境（可选）" class="headerlink" title="0. 创建 conda 环境（可选）"></a>0. 创建 conda 环境（可选）</h3><p>如果没有安装 conda 环境，建议先安装好 conda 环境。<a href="https://docs.conda.io/en/latest/miniconda.html">conda官方网站</a>, 安装结束后运行以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">conda create -n minimind python=3.10.16</span><br><span class="line">conda activate minimind</span><br><span class="line"></span><br><span class="line">python --version <span class="comment"># 查看 py 版本是否为 3.10.16</span></span><br></pre></td></tr></table></figure><p>当然如果你有其它更好的方案，或者想体验这个解决问题的过程，当然也可以跳过这一步。</p><h3 id="1-克隆代码"><a href="#1-克隆代码" class="headerlink" title="1. 克隆代码"></a>1. 克隆代码</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/jingyaogong/minimind.git</span><br></pre></td></tr></table></figure><h3 id="2-安装依赖"><a href="#2-安装依赖" class="headerlink" title="2. 安装依赖"></a>2. 安装依赖</h3><p>记住这里需要进入项目根目录下安装</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> minimind</span><br><span class="line">pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple</span><br></pre></td></tr></table></figure><h3 id="3-下载模型"><a href="#3-下载模型" class="headerlink" title="3. 下载模型"></a>3. 下载模型</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://huggingface.co/jingyaogong/MiniMind2 <span class="comment"># or https://www.modelscope.cn/models/gongjy/MiniMind2</span></span><br></pre></td></tr></table></figure><blockquote><p>注意：这里有可能 model.safetensors 文件下载失败，这是因为 huggingface.co 上的文件比较大，下载速度比较慢。如果下载失败，建议使用 modelscope.cn 上的模型。或者直接下载模型文件手动添加到当前目录。</p></blockquote><h3 id="4-运行-web-界面"><a href="#4-运行-web-界面" class="headerlink" title="4. 运行 web 界面"></a>4. 运行 web 界面</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> scripts</span><br><span class="line">streamlit run web_demo.py</span><br></pre></td></tr></table></figure><p>此时即可在本地浏览器使用 localhost:3000 访问交互界面。</p>]]></content>
    
    
    <summary type="html">minimind 是一个基于 LLM 的轻量化 AI 助手，官方表示它的最小模型大小可以达到惊人的 26m，本文记录部署 minimind 模型的一些使用方法和问题。</summary>
    
    
    
    <category term="AI" scheme="https://blog.jzxer.cn/categories/AI/"/>
    
    
    <category term="人工智能" scheme="https://blog.jzxer.cn/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    <category term="LLM" scheme="https://blog.jzxer.cn/tags/LLM/"/>
    
  </entry>
  
  <entry>
    <title>asr-pro 核心板做一个温湿度模块</title>
    <link href="https://blog.jzxer.cn/20251109/20251109_asrpro_core/"/>
    <id>https://blog.jzxer.cn/20251109/20251109_asrpro_core/</id>
    <published>2025-11-09T09:12:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>前期准备需要：</p><ol><li>asr-pro 核心板</li><li>DHT11 模块</li><li>OLED 显示器一个</li><li>WS2812B 灯带一个</li><li>电池模块一个</li><li>tp4056 模块一个</li><li>喇叭一个</li><li>咪头端子一个</li></ol><h2 id="引脚分配"><a href="#引脚分配" class="headerlink" title="引脚分配"></a>引脚分配</h2><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/20251112130021163.png" alt="引脚介绍"></p><p>| 核心板引脚 | DHT11 模块引脚 | OLED 引脚 | WS2812B 引脚 | 喇叭引脚 | 咪头端子引脚 |<br>| :—: | :—: | :—: | :—: | :—: | :—: | :—: | :—: |<br>| PB6-TX,PB5-RX | PC4 | PA5-sda,PA6-scl | PA4 | SPK | MIC |</p><p>硬件连接如下：</p><ol><li>将 DHT11 模块连接到核心板，VCC 接 3.3V，GND 接 GND，DATA 接 PB6。</li><li>将 OLED 显示器连接到核心板，VCC 接 3.3V，GND 接 GND，SCL 接 PA6，SDA 接 PA5。</li><li>将 WS2812B 灯带连接到核心板，VCC 接 5V，GND 接 GND，DIN 接 PB7。</li></ol><p>突然发现好像25版本的多了虾哥的语音模型，就把语音替换成了魅惑女的声音，效果不错。</p><p>代码的话存在gitee。</p><p>目前有个想法，就是好像可以尝试用这个模块链接esp32-s3，用串口通信实现命令词唤醒识别。<br>这样就可以自定义学习唤醒词。</p>]]></content>
    
    
    <summary type="html">ASRPRO-CORE 是一款低功耗、高性能的离线语音识别模组，支持多种神经网络和多语言识别，适用于家电、玩具等领域。该模组体积小巧，工作电压范围为 3.6V-5V，具有强大的降噪和回声消除能力，识别率超过 98%。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="单片机" scheme="https://blog.jzxer.cn/tags/%E5%8D%95%E7%89%87%E6%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>和 TZ 关于产品外观的讨论</title>
    <link href="https://blog.jzxer.cn/20251108/20251108_chat_with_tz/"/>
    <id>https://blog.jzxer.cn/20251108/20251108_chat_with_tz/</id>
    <published>2025-11-08T03:10:34.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h2><p><strong>只要信念坚定，你会慢慢的向你的信念的方向靠齐，离你认可的成功越来越近。</strong></p><p>我和 tz 的认识起源于我发布的一篇小红书，当时由于我在做产品的外观设计，但是由于我的建模能力确实有限，绘制出来的模型实在不敢恭维，但是我们团队如果想要上 ks 众筹的话，外观设计又是非常重要的一环。</p><p><img src="https://oss.jzxer.cn/blog/202511081357120.png" alt="我做的外观模型，惨不忍睹"></p><p>虽然我知道我花了一定的时间学习建模知识，水平会有所改善，但是它一定会花费我很多的时间精力，我们团队又需要快速的出一个 demo 原型，来验证这个商业闭环的可行性。然后就发生了开头那一幕，在小红书上我认识了 tz。</p><p>7 号晚上 8 点，我和 tz 开了一个线上会议，来讨论关于智能绿植 pico 的产品外观。他是一名工业设计师。而我是一名多年的资深前端工程师，两者的共通之处都是对可视化产品有一定审美。还有一个相似之处就是，我们都对模块化的产品情有独钟。</p><h2 id="概念：万物模块化"><a href="#概念：万物模块化" class="headerlink" title="概念：万物模块化"></a>概念：万物模块化</h2><p>19 年底，我构想了一个概念，我认为生活中的很多物品，它们都可以相互链接，从而实现万物可模块化。</p><p><img src="https://oss.jzxer.cn/blog/202511081417364.png" alt="万物模块化"></p><p>比如手机嵌入笔记本电脑的中心，是不是就可以作为 CPU 或者 GPU 来使用？</p><p>因为我发现，生活中很多的人，他们可能都拥有：<strong>一台笔记本、一个平板电脑、一部手机。</strong></p><p>而笔记本电脑和手机可能用的是同一个处理器。或者平板电脑和手机用的是同一款处理器。这也就是为什么后来出现了折叠手机，三折叠手机。似乎它们就是在满足这样的一种场景。但是思考的方向不是模块化，而是功能更强。</p><p>这带来的弊端就是：<strong>成本的提升，和产品过度堆砌带来的丑陋设计。</strong> 我一直感觉折叠手机挺丑的！</p><p><img src="https://oss.jzxer.cn/blog/8bb3bc250bc19921ca451668044fa0af.jpg" alt="讨论模块化方案"></p><p>而模块化设计的巧妙之处在于：每个模块拆分成独立的产品。而每个产品可以通过组合达到不一样的功能。</p><h2 id="会后"><a href="#会后" class="headerlink" title="会后"></a>会后</h2><p>这次会议结束我有两个很深刻的感触：</p><ol><li>一款产品如果想要实现模块化，它需要思考的点很多，也就有很多的工作需要在前期就要确定好，比如主体模块的分发模式、结构设计。如何让模块与模块之间的衔接更自然合理？</li><li>如果有目标，就去朝这个目标的方向尝试努力，它可能不会给你想要的结果，但是它会帮你去往你想要的那个目标方向去无限接近。这就是做与不做的区别。</li></ol>]]></content>
    
    
    <summary type="html">我和 tz 的认识起源于我发布的一篇小红书，当时由于我在做产品的外观设计，但是由于我的建模能力确实有限，绘制出来的模型实在不敢恭维，但是我们团队如果想要上 ks 众筹的话，外观设计又是非常重要的一环。</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="产品" scheme="https://blog.jzxer.cn/tags/%E4%BA%A7%E5%93%81/"/>
    
  </entry>
  
  <entry>
    <title>热门的 tft UI模块 - LVGL</title>
    <link href="https://blog.jzxer.cn/20251106/20251106_lgvl/"/>
    <id>https://blog.jzxer.cn/20251106/20251106_lgvl/</id>
    <published>2025-11-06T11:12:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>LVGL（Light and Versatile Graphics Library）是一个开源的嵌入式图形库，它提供了丰富的图形组件和功能，可以帮助开发者快速开发出美观、易用的图形界面。LVGL支持多种硬件平台，包括ARM Cortex-M、AVR、ESP32等，并且可以在多种操作系统上运行，包括FreeRTOS、Linux、Windows等。</p><h2 id="特点"><a href="#特点" class="headerlink" title="特点"></a>特点</h2><ul><li>跨平台：LVGL可以在多种硬件平台和操作系统上运行，包括ARM Cortex-M、AVR、ESP32等，并且可以在多种操作系统上运行，包括FreeRTOS、Linux、Windows等。这使得LVGL可以广泛应用于各种嵌入式设备和桌面应用程序中。</li><li>丰富的图形组件：LVGL提供了丰富的图形组件，包括按钮、标签、滑块、图表、列表等，可以帮助开发者快速开发出美观、易用的图形界面。</li><li>高度可定制：LVGL提供了丰富的配置选项，包括字体、颜色、主题等，可以帮助开发者根据自己的需求进行定制。</li><li>高效的性能：LVGL采用了高效的图形算法和内存管理机制，可以在有限的硬件资源上实现高性能的图形渲染。</li><li>开源：LVGL是一个开源的图形库，开发者可以自由地使用、修改和分发LVGL的代码。</li></ul><h2 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h2><p>使用LVGL需要先安装相应的开发环境，包括编译器、库文件等。然后，开发者可以使用LVGL提供的API来创建和管理图形界面，包括添加组件、设置样式、处理事件等。LVGL还提供了丰富的示例代码，可以帮助开发者快速上手。</p><h2 id="示例代码"><a href="#示例代码" class="headerlink" title="示例代码"></a>示例代码</h2><p>以下是一个简单的LVGL示例代码，用于创建一个按钮和一个标签：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;lvgl/lvgl.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">lv_example_btn_1</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">/* 创建一个按钮 */</span></span><br><span class="line">    <span class="type">lv_obj_t</span> * btn = lv_btn_create(lv_scr_act());</span><br><span class="line">    lv_obj_set_size(btn, <span class="number">120</span>, <span class="number">50</span>);</span><br><span class="line">    lv_obj_align(btn, LV_ALIGN_CENTER, <span class="number">0</span>, <span class="number">-40</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 创建一个标签，并添加到按钮中 */</span></span><br><span class="line">    <span class="type">lv_obj_t</span> * label = lv_label_create(btn);</span><br><span class="line">    lv_label_set_text(label, <span class="string">&quot;Button&quot;</span>);</span><br><span class="line">    lv_obj_center(label);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">/* 初始化LVGL */</span></span><br><span class="line">    lv_init();</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 创建一个屏幕 */</span></span><br><span class="line">    <span class="type">lv_obj_t</span> * scr = lv_scr_act();</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 创建一个按钮 */</span></span><br><span class="line">    lv_example_btn_1();</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 运行LVGL任务 */</span></span><br><span class="line">    <span class="keyword">while</span>(<span class="number">1</span>) &#123;</span><br><span class="line">        lv_task_handler();</span><br><span class="line">        usleep(<span class="number">5000</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>LVGL是一个功能强大、易于使用的嵌入式图形库，可以帮助开发者快速开发出美观、易用的图形界面。无论是嵌入式设备还是桌面应用程序，LVGL都可以提供丰富的图形组件和功能，帮助开发者实现自己的创意。</p><h2 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h2><p><a href="https://lvgl.io/">https://lvgl.io/</a><br><a href="https://gitee.com/aHeiDaBai/fluent_ui/blob/master/Fluent_UI/API_DOC.md">https://gitee.com/aHeiDaBai/fluent_ui/blob/master/Fluent_UI/API_DOC.md</a></p>]]></content>
    
    
    <summary type="html">LVGL（Light and Versatile Graphics Library）是一个开源的嵌入式图形库，它提供了丰富的图形组件和功能，可以帮助开发者快速开发出美观、易用的图形界面。LVGL支持多种硬件平台，包括ARM Cortex-M、AVR、ESP32等，并且可以在多种操作系统上运行，包括FreeRTOS、Linux、Windows等。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="esp32" scheme="https://blog.jzxer.cn/tags/esp32/"/>
    
  </entry>
  
  <entry>
    <title>热门的OLED图形库 - U8G2</title>
    <link href="https://blog.jzxer.cn/20251106/20251106_use_u8g2/"/>
    <id>https://blog.jzxer.cn/20251106/20251106_use_u8g2/</id>
    <published>2025-11-06T03:12:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>U8G2 是一个开源的图形库，用于在嵌入式系统中显示图形。它支持多种显示器和微控制器，包括 OLED、LCD、LED 矩阵等。U8G2 提供了丰富的图形函数，包括绘制线条、矩形、圆形、文本等，并且支持多种字体和颜色。</p><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><p>在 platformio 中使用 u8g2 需要安装 u8g2 的库，可以在 platformio.ini 中添加以下内容：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[env:esp32dev]</span></span><br><span class="line"><span class="attr">platform</span> = espressif32</span><br><span class="line"><span class="attr">board</span> = esp32dev</span><br><span class="line"><span class="attr">framework</span> = ardui<span class="literal">no</span></span><br><span class="line"><span class="attr">lib_deps</span> = </span><br><span class="line">    u8g2/u8g2:master</span><br></pre></td></tr></table></figure><h3 id="使用-1"><a href="#使用-1" class="headerlink" title="使用"></a>使用</h3><p>在代码中，首先需要包含 u8g2 的头文件：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;U8g2lib.h&gt;</span></span></span><br></pre></td></tr></table></figure><p>然后，需要创建一个 U8G2 对象，并指定显示器的类型和引脚：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">U8G2_SSD1306_128X64_NONAME_F_HW_I2C <span class="title function_">u8g2</span><span class="params">(U8G2_R0, <span class="comment">/* reset=*/</span> U8X8_PIN_NONE)</span>;</span><br></pre></td></tr></table></figure><p>接下来，可以在 setup() 函数中初始化 u8g2 对象，并在 loop() 函数中绘制图形：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">setup</span><span class="params">()</span> &#123;</span><br><span class="line">  u8g2.begin();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">loop</span><span class="params">()</span> &#123;</span><br><span class="line">  u8g2.firstPage();</span><br><span class="line">  <span class="keyword">do</span> &#123;</span><br><span class="line">    u8g2.setFont(u8g2_font_ncenB08_tr);</span><br><span class="line">    u8g2.drawStr(<span class="number">0</span>, <span class="number">10</span>, <span class="string">&quot;Hello, world!&quot;</span>);</span><br><span class="line">  &#125; <span class="keyword">while</span> ( u8g2.nextPage() );</span><br><span class="line">  delay(<span class="number">1000</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>以上代码将在 OLED 显示器上显示 “Hello, world!”。</p><h2 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h2><p>中文显示：<a href="https://blog.jmaker.com.tw/chinese_oled/">https://blog.jmaker.com.tw/chinese_oled/</a></p>]]></content>
    
    
    <summary type="html">U8G2 是一个开源的图形库，用于在嵌入式系统中显示图形。它支持多种显示器和微控制器，包括 OLED、LCD、LED 矩阵等。U8G2 提供了丰富的图形函数，包括绘制线条、矩形、圆形、文本等，并且支持多种字体和颜色。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="esp32" scheme="https://blog.jzxer.cn/tags/esp32/"/>
    
  </entry>
  
  <entry>
    <title>认清自我之大五模型</title>
    <link href="https://blog.jzxer.cn/20251105/20251105_big5Model/"/>
    <id>https://blog.jzxer.cn/20251105/20251105_big5Model/</id>
    <published>2025-11-04T17:15:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-介绍"><a href="#1-介绍" class="headerlink" title="1. 介绍"></a>1. 介绍</h2><p>大五模型，又称人格海洋（ocean model），从20世纪80年代，它在心理特质理论领域发展起来。在20世纪90年代，该理论确定了五项因素，每项因素可以进一步分为两小项不同的值：</p><p><strong>Openness to experience</strong>： 经验开放性（创新&#x2F;好奇vs一致&#x2F;谨慎）<br><strong>Conscientiousness</strong>： 尽责性（高效&#x2F;有序vs奢侈&#x2F;粗心）<br><strong>Extraversion</strong>： 外向性（开朗&#x2F;活力vs独处&#x2F;矜持）<br><strong>Agreeableness</strong>： 亲和性（友善&#x2F;同情vs批判&#x2F;挑剔）<br><strong>Neuroticism</strong>： 神经质（敏感&#x2F;紧张vs坚韧&#x2F;自信）</p><h2 id="2-我的测试结果"><a href="#2-我的测试结果" class="headerlink" title="2. 我的测试结果"></a>2. 我的测试结果</h2><p>总结：<strong>开放性</strong>：高，<strong>尽责性</strong>：高，<strong>外向性</strong>：高，<strong>亲和性</strong>：高，<strong>神经质</strong>：低</p><p>我们一直在探寻真实自我的路上。</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/%E5%A4%A7%E4%BA%94%E7%BB%93%E8%AE%BA.png" alt="大五模型"></p>]]></content>
    
    
    <summary type="html">我们总是在模仿，而失去了本心真正想要去做的事儿。</summary>
    
    
    
    <category term="自我提升" scheme="https://blog.jzxer.cn/categories/%E8%87%AA%E6%88%91%E6%8F%90%E5%8D%87/"/>
    
    
    <category term="思考" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E8%80%83/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-光照传感器（57）</title>
    <link href="https://blog.jzxer.cn/20251102/20251102-bh1750/"/>
    <id>https://blog.jzxer.cn/20251102/20251102-bh1750/</id>
    <published>2025-11-02T12:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>这是来自罗姆（Rohm）的BH1750 16位环境光传感器。由于光线对人类和大多数其他生物都至关重要，因此检测环境中的光照强度是学习使用微控制器和传感器时一个常见的入门项目。我们是否应该调高显示器的亮度，还是降低亮度以节省电能？机器人应该朝哪个方向移动才能停留在光线最充足的地方？现在是白天还是夜晚？所有这些问题都可以借助BH1750来解决。这是一款小巧、功能强大且价格低廉的光传感器，您可以将其集成到下一个项目中，以实现光线的检测与测量。</p><p>BH1750 提供16位lux光测量，用于测量光的SI单元使其易于与其他值 (如参考和来自其他传感器的测量) 进行比较。能够测量从 0 到 65k+ lux，bh1750。通过一些校准和先进的测量时间调整，它甚至可以说服测量高达100，000 lux。</p><p><img src="/!%5B%5D(https:/oss.jzxer.cn/blog/202511041800148.png)" alt="特写"></p><p>传感器往往采用小型封装，BH1750也不例外。不比米粒大多少，这个方便的光感应朋友需要一些帮助，以便人们进行实验，而没有使用表面贴装零件的愿望或工具。我们是来帮忙的封装在我们的Stemma QT外形的PCB上，BH1750 集成了电压调节器和电平转换电路，使其可以与3.3v设备一起使用，如Raspberry Pi，或 5v 设备。</p><h2 id="引脚介绍"><a href="#引脚介绍" class="headerlink" title="引脚介绍"></a>引脚介绍</h2><p>SCL - I2C 时钟引脚，连接到您微控制器的 I2C 时钟线。该引脚具有电平转换功能，因此可以使用 3-5V 逻辑电平，并且该引脚上带有 10K 上拉电阻。</p><p>SDA - I2C 数据引脚，连接到您微控制器的 I2C 数据线。该引脚具有电平转换功能，因此可以使用 3-5V 逻辑电平，并且该引脚上带有 10K 上拉电阻。</p><p>ADDR&#x2F;AD0 跳线 - I2C 地址选择引脚。将该引脚拉高或在背面焊接跳线短路，可以将 I2C 地址从 0x23 更改为 0x5C。</p><h2 id="示例代码"><a href="#示例代码" class="headerlink" title="示例代码"></a>示例代码</h2><pre><code class="cpp">//  for help look at: https://github.com/Starmbi/hp_BH1750/wiki//  to speed up the measurements you can change the BH1750_MTREG_LOW = 31//  in the hp_BH1750.h file to a lower value#include &lt;Arduino.h&gt;#include &lt;hp_BH1750.h&gt; //  include the library//stores the first MAX_VAL samples in a array.const unsigned int MAX_VAL = 150; //  for Arduino (low memory)                                  //  const unsigned int MAX_VAL = 1500;  //for ESP8266unsigned int val[MAX_VAL]; //  adjust the value to your free memory on the board.hp_BH1750 sens;void setup()&#123;  //  put your setup code here, to run once:  Wire.setClock(400000); //  uncomment this line if you have problems with communication  Serial.begin(9600);  //Serial.begin(115200);       // try this line for faster printing, uncomment the line above  sens.begin(BH1750_TO_GROUND); //  change to (BH1750_TO_VCC) if address pin connected to VCC  sens.calibrateTiming();       //  you need a little brightness for this&#125;void loop()&#123;  //  put your main code here, to run repeatedly:  Serial.println(&quot;***********&quot;);  unsigned int t = millis() + 1000;  unsigned int c = 0;  while (millis() &lt;= t)  &#123;    sens.start(BH1750_QUALITY_LOW, 1); //will be adjusted to lowest allowed MTreg (default = 31)    if (c &lt; MAX_VAL)    &#123;      val[c] = sens.getRaw();    &#125;    else    &#123;      sens.getRaw();    &#125;    yield(); //  feed the watchdog of ESP6682    c++;  &#125;  unsigned int readVal = c;  if (readVal &gt; MAX_VAL)    c = MAX_VAL;  // Serial.print(c);  // Serial.print(char(9));  // Serial.println(sens.getRaw());  for (unsigned int i = 0; i &lt; c; i++)  &#123;    //Serial.print(i);    Serial.print(val[i]);    Serial.print(char(9));    if ((i + 1) % 10 == 0)      Serial.println(&quot;&quot;);    yield(); //  feed the watchdog of ESP6682  &#125;  Serial.println(&quot;&quot;);  Serial.print(readVal);  Serial.println(&quot; Samples per second&quot;);  Serial.println(&quot;&quot;);  delay(1000);&#125;</code></pre><h2 id="参考项目"><a href="#参考项目" class="headerlink" title="参考项目"></a>参考项目</h2><p><a href="https://github.com/Starmbi/hp_BH1750">https://github.com/Starmbi/hp_BH1750</a></p>]]></content>
    
    
    <summary type="html">BH1750 传感器，用于检测光照强度</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="传感器" scheme="https://blog.jzxer.cn/tags/%E4%BC%A0%E6%84%9F%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>构建一手信息，杜绝二手思维</title>
    <link href="https://blog.jzxer.cn/20251031/20251031_think_deeper/"/>
    <id>https://blog.jzxer.cn/20251031/20251031_think_deeper/</id>
    <published>2025-10-31T06:55:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<p>油管一人企业大神提出的观点：我们总是在模仿，而失去了本心真正想要去做的事儿。</p><p>深有体会，七岁那年，老妈问我想要成为什么样的人？我说科学家。这个可能是我们这个年代很多小孩子的目标。</p><p>然而我们的本意真的如此吗？问问我们自己的内心，我们是打心眼里希望成为，还是因为看了新闻，电视而去模仿？</p><p>随着年龄的增长，其实我的目标一直都在变，想成为画家，是因为素描和漫画很好看很高级。想成为舞者，是因为看到南贤俊跳舞很帅。想学 DJ，是因为打碟看着很帅。想成为游戏建模师，是因为感觉游戏建模师名字听上去就很牛逼。</p><p>我一直在寻找，直到现在也在寻找，那件我怀着使命感，想打从心里想要去做的事情。而不考虑任何因素，即使地球毁灭，我也希望是在干这件事情的过程中死去的那样一件事儿。</p><p>这个过程很艰难，因为我们活在一个欲望和信息膨胀的时代，似乎每个人都处在既要又要还要的恶性循环中，我也不例外。</p><p>每天让自己忙忙碌碌也是，到底是真的有这么多的活儿，还是因为恐惧和焦虑？ 是真的忙，还是装作自己很忙。</p><p>我不否认随着年龄增大，我越来越珍惜时间。不去浪费太多时间在不好的人或事儿。但是装作忙碌的忙碌是不是也是一种浪费时间？</p><p>曾经的我是一个生活节奏很慢的人。这是我真正的样子吗？还是我伪装成的样子，或者说在二手思维加工后的样子？</p><p>这个问题，我需要好好思考一下。</p><p>通过提升信噪比，来提升幸福指数吧。（如果遵循二八定律，这个噪应该是 5 小时左右，而 19 小时都应该是信，而我的定义是 3&#x2F;7）</p>]]></content>
    
    
    <summary type="html">我们总是在模仿，而失去了本心真正想要去做的事儿。</summary>
    
    
    
    <category term="自我提升" scheme="https://blog.jzxer.cn/categories/%E8%87%AA%E6%88%91%E6%8F%90%E5%8D%87/"/>
    
    
    <category term="思考" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E8%80%83/"/>
    
  </entry>
  
  <entry>
    <title>快速建立一人企业论(翻译)</title>
    <link href="https://blog.jzxer.cn/20251011/20250529_one_person_company/"/>
    <id>https://blog.jzxer.cn/20251011/20250529_one_person_company/</id>
    <published>2025-10-11T13:55:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="0-前言"><a href="#0-前言" class="headerlink" title="0. 前言"></a>0. 前言</h2><p><strong>本文会给你制定一个60天计划来帮助你赚到 $1000.</strong></p><p>下面的脑图将告诉你读完这篇文章后你会掌握的内容.</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/WRITING.png" alt="writing"></p><p>我会尽量让这篇文章简洁明了、毫无赘述。但要明白，心态建议绝非无用之物。<strong>信念与清晰的目标先于技能与自信。</strong></p><p>如果我絮絮叨叨，那是因为我所写的内容对你而言绝对有必要了解。要是你觉得枯燥乏味，那<strong>很可能恰恰是你会跳过不看的部分</strong>，而之后没取得成效时你又会为此抱怨。</p><p>如果你能赚到1000元，那么你就能赚到10000元。</p><p>当这个流程深入你的大脑，并且变得越来熟练，你会越来越快的得到1000元。</p><p>你会知道：</p><ul><li>你不需要大量的听众。</li><li>你只需要学习1-2个能够得到高回报的技能。</li><li>你的所有行动都是有累计效应的，没有一步是无用功。</li><li>如果你坚持下去，你将获得越来越多的1000元。</li></ul><p>但首先，有一点需要说明。</p><p>如果你是因为想找一种快速点击“给我1000美元”按钮来轻松获利的方法才点进这个视频的，那你很可能会失望而归。</p><p>摒弃那种快速致富的心态吧。</p><p><strong>如果你想掌控自己的收入水平，那就得创业！就这么简单，无可争辩！</strong></p><p>如果你要创业，它所要求的个人特质与朝九晚五的工作截然不同。你要对一切负责。你必须管理好自己、提升自己，并且学会坦然面对创业过程中伴随而来的情绪起伏。</p><p>你会遭到拒绝。</p><p>你会质疑自己是否应该放弃，回到那种仅仅足够舒适得以生存、仅仅没有痛苦得以维持现状的生活。</p><p>看在老天的份上，请下定决心去做那件你知道自己必须做的事，从而掌控自己的生活。</p><p>这是你摆脱困境的出路。</p><p>以下将是我们准备展开的讨论：</p><ul><li>在自由职业者和机构所有者云集的世界里，建立受众群体的重要性</li><li>我们应该说什么和应该推销什么</li><li>微观技能组合——学习两项高收入技能如何让你拥有一个盈利的未来</li><li>微营销：今天就开始吸引客户，无需花数月打造产品或服务</li><li>获取客户的两种方法，让你专注未来60天</li><li>千元挑战：每天执行的具体步骤，把想法变成生意</li></ul><p>这封信相当于一门迷你课程，所以篇幅会有点长。</p><p>咱们开始吧。</p><h2 id="1-建立你的数字店铺"><a href="#1-建立你的数字店铺" class="headerlink" title="1. 建立你的数字店铺"></a>1. 建立你的数字店铺</h2><p>你需要在社交媒体创建你的受众群体网络。</p><p>这就是商业的第一课：<strong>你需要为产品或服务引流</strong>。当下，搭建网站或设计标志并非明智之举，不会让你的时间得到有效利用。</p><p>你无需一开始就拥有百万粉丝，但我敢保证，未来你会希望自己的受众群体不断壮大。</p><p>发送冷邮件和投放付费广告固然不错，但还有更好的方法能达成同样的效果，还能避免最终一无所获。</p><p>你可以发送10000封冷邮件，在广告上投入10000美元，可之后这些人该何去何从呢？通过在社交媒体上创作内容来打造受众群体，能让你达成以下几个目标：</p><ul><li>你能够与关注你的人保持联系。</li><li>它完全免费，你不需要要太多的金钱和许可</li><li>你所创作的每一篇文章都能让受众更倾向于购买（你的产品或服务等相关事物）。</li><li>你可以开发新产品并提高盈利能力。</li><li><strong>人们追随的是你这个人。你并非受困于某种特定的商业模式或技能。</strong></li><li>当你的受众规模足够大时，你就可以放下客户委托的工作，或者去创建那家你一直梦寐以求的初创公司了（因为你已经拥有了潜在的客户以及团队候选成员，无需再花费成百上千美元用于营销和招聘）。</li></ul><p>话不多说，咱们赶紧设置一下你的社交账号资料吧。</p><h2 id="2-确定你想教什么或者想销售什么？"><a href="#2-确定你想教什么或者想销售什么？" class="headerlink" title="2. 确定你想教什么或者想销售什么？"></a>2. 确定你想教什么或者想销售什么？</h2><p>我之前用过很多不同的方式来教这个内容。</p><p>大多数时候，这涉及到创建某种主题树。</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/BUSINESS.jpg" alt="主题树"></p><p>这仍然很有用，我鼓励你使用它，但我想让事情变得稍微简单一点。</p><p>你即将加入你本就身处其中的细分领域。</p><p>回答以下问题，并选择最能满足其中大部分要求的1 - 3个主题：</p><ul><li>在你的搜索记录和YouTube观看历史中，有哪些有价值的内容呢？</li><li>你关注的账号都在讨论些什么？你觉得自己的知识水平与他们相近吗？</li><li>如果你现在要买一本新书，它的主题会是什么？</li><li>当你购买具有教育意义或有助于行为改善的产品（如计划本、软件或健康补剂，而非新衣服或其他生活必需品）时，你会购买什么？</li></ul><p>在生活的大多数领域，成功的关键在于明智地模仿。</p><p>我们都会模仿。我们的大脑是由迄今为止我们所接触到的信息复杂融合而成的。</p><p>人们往往把商业问题过度复杂化了。</p><p>他们觉得如果其他人都涉足某个领域，那这个领域就已经饱和了。</p><p><strong>并非如此。根本不是这样。</strong></p><p>如果其他所有人都在做某件事，那就意味着这件事有利可图。这意味着人们确实有这方面的需求。</p><p>所以，你要做的就是做同样的事情，但要让它在某些方面更具独特性。</p><p>我创办的初创公司Kortex并没有什么革命性或全新的东西。</p><p>到处都在涌现笔记应用和“第二大脑”类应用的仿品。</p><p>让我们脱颖而出的是，基于我们在这个领域积累的经验，我们添加了一些小功能，让产品变得更好了一点点，而大多数人并不具备这样的经验。此外，我们还拥有渠道资源。在未来几年里，与Notion这样的产品竞争对我们来说并非难事。其他应用程序能否与之抗衡就不好说了。</p><p>即便我们达不到Notion的水平，我们的团队规模和成本仅为其一小部分，而且我们没有拿过任何风险投资资金，仅凭借我们所涉足的小众市场，仍能实现八位数的年度经常性收入（ARR）。</p><p>言归正传。</p><p><strong>写下你已阅读过的1 - 3个主题。这些将是你创作内容的灵感来源。</strong></p><p><strong>写下你已购买过的1 - 3门课程、模板或产品。这些将是你重新定位产品或服务的起始点。</strong></p><p><strong>当你真正开始写作和售卖作品时，你才会拥有那些能让你的创作真正独具你个人特色的想法和反馈。</strong></p><p>再读一遍上一句话，并把它牢牢记在心里。</p><p>这可不是一句随便写出来、供人遗忘的话。它将决定你整个创作旅程的走向。</p><h2 id="3-创建你的个人资料"><a href="#3-创建你的个人资料" class="headerlink" title="3. 创建你的个人资料"></a>3. 创建你的个人资料</h2><p>一个优秀的社交媒体资料就是一个了不起的个人成就。</p><p>若想拥有优质的个人资料图片和横幅，你需要了解设计知识和&#x2F;或摄影知识。</p><p>你需要了解撰写个人简介的文案技巧，这样才能写出吸引他人关注（让人想要关注你）的个人简介。</p><p>你需要理解你在个人简介里放的链接所涉及的认知（意识）和转化漏斗（营销漏斗）相关概念。</p><p>你需要了解社交媒体和写作，才能创作出一篇有权威性且能获得不错互动量的置顶帖（并且在帖子结尾巧妙引导用户进入销售漏斗的下一步）。</p><p>现在，你可别拿这当借口，跑去教程地狱里拖延时间。不，你不需要去学设计、文案写作和营销漏斗之类的课程。你需要快速创建个人资料并开始测试。这才是真正掌握这些技能的唯一途径。课程能帮助你学习测试的方法。而技能是你经过测试和筛选后，为取得最佳效果而形成的一系列方法组合。</p><p>以下是做这件事最快的方法：</p><ul><li>观看1 - 3个关于如何拍摄头像照片或制作个人资料照片的YouTube教程，并跟着制作你自己的头像照片&#x2F;个人资料照片。</li><li>根据我们之前讨论的内容撰写你的个人简介。明确你想树立权威的话题领域以及你想要提供的价值主张</li></ul><p>我已经为你做好测试了。就用这个简介模板吧。</p><p>我撰写关于 <strong>[主题]</strong> 的内容。**[从你的产品&#x2F;服务中他们将获得的结果]**。</p><p>如果我的主题是效率提升、写作和个人成长，而我想要售卖的东西与写作相关，那么我的简介会是：</p><p>我撰写关于效率提升、写作和个人成长的内容。学习将写作发展为高收入技能。</p><p>然后，我会链接到我产品&#x2F;服务的第一个步骤，我们会在“微营销产品”部分详细讨论这个步骤。</p><p>要是你觉得自己的个人简介还不够好，那也没关系。别为此担心。就带着现有的简介开始创作内容吧。从整体来看，个人简介并没有那么重要。人们可能只看一两眼就会抛诸脑后。真正能为你带来大量粉丝和销售业绩的是你的内容。你要做的就是创作出足够优质的内容，这样一来，个人简介写成什么样都无关紧要了。</p><p>最后，一个引导你创建个人资料的问题：</p><p><strong>它看起来像是应该有100万粉丝吗？</strong></p><p>如果还没有达成（目标等情况），那么在接下来的6 - 12个月里慢慢改进，直到达成。</p><p>即便没有达成（目标等情况），你仍然可以吸引粉丝并获得收入。</p><h2 id="4-微观技能栈"><a href="#4-微观技能栈" class="headerlink" title="4. 微观技能栈"></a>4. 微观技能栈</h2><p>对于一人企业来说，你最终需要学习每一个能让你熟练的运营一家企业的每个技能。</p><p>现在，要想开始获得收入，你只需要具备几样东西：</p><ul><li><strong>一个流量来源</strong></li><li><strong>一款可供销售的产品或服务</strong></li></ul><p>因此，简化这一过程的两项技能是写作和销售。</p><p>写作很容易上手。你无需具备设计或视频制作经验，甚至不需要写得有多好，只需要写出有影响力的内容即可。所有社交媒体内容都始于写作（没错，就连视频脚本也不例外）。</p><p>销售则是将阅读你文字的人转化为顾客的关键。</p><p>让我们来学习这两方面的基础知识。</p><p><strong>写作以建立受众</strong></p><p>社交媒体内容主要有两种类型：</p><ol><li>短帖文</li></ol><p>这包括推文、Reels（短视频）、Shorts（短视频）、TikTok视频、Instagram上的帖子，以及任何时长在1分钟以内或者字数少于300个字符的内容。</p><p>我在任何平台上最喜欢的一种创作方式是先写一条推文，然后把这条推文复制粘贴到Figma或Canva之类的工具的图片模板中（可以看看我的Instagram页面，了解以图片形式呈现的文字是什么样的）。不，你并不需要在任何短内容平台上发布除文字以外的其他内容来吸引粉丝。</p><p>短帖文有助于让你一直留在人们的视线中，吸引受众，并测试创意。</p><p>短帖文是基础。你每天至少应该发布一条。在X平台（原推特）上，你可以一天发布2 - 3条，以此测试哪些内容适合发布到其他平台，或者可以改编成长帖文。</p><ol start="2"><li>长篇帖子</li></ol><p>这包括X平台上的推文串、Instagram旗下Threads应用上的推文串、Instagram轮播图、领英上的长篇帖子或轮播图，或者我称之为“微型文章”的内容，这类内容近期表现相当不错。</p><p>以下是一个“微型文章”的示例：</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/be-harder-on-yourself-819x1024.png" alt="示例文章"></p><p>无论是发布短文还是长文，图片的美妙之处在于你可以将其发布到任何平台。只需确保图片的尺寸为4×5，这样就能适配Instagram。</p><p>长文具有策略性。如果基于一个经验证的主题（比如你最优质的短文之一），长文极有可能爆火。它们往往能吸引更多粉丝关注。</p><p>问题是，写长文需要花费更多时间。你每周应争取创作1 - 2篇长文，并确保能将其分享出去，这样它们就有机会被更多受众看到。不要依赖算法来助力你实现增长。阅读我的文章《<a href="https://thedankoe.com/letters/how-to-actually-grow-on-social-media-what-they-dont-tell-you/">如何从零粉丝开始打造受众群体</a>》，学习相关方法。</p><p>确保你社交网络中的每个人都每周分享你的长篇帖子。这就是你实现增长的方式。</p><p>你还可以在我时长两小时的写作课程（附有模板）中学习整个流程。</p><p>总结如下：</p><ul><li>每天在X平台发布2 - 3条简短帖子。</li><li>每周在X平台发布1 - 2条长帖子。</li><li>当你的粉丝数量达到5万以上时，再考虑开始在其他平台发布内容。</li></ul><p><strong>为什么选择X平台？</strong></p><p>除了YouTube之外，X平台上的人素质比大多数其他平台的人都高。</p><p>人们登录Instagram、领英（LinkedIn）或TikTok并不是为了接受教育。</p><p>X平台有点像Reddit，但没那么“有毒”，而且你可以关注真实的人。</p><p>你经常上Reddit是为了学习一些你之前不知道的东西。</p><p>而且，在X平台上，你只需要把自己的想法写出来就行。</p><p>接着，选出你最棒的想法，让在其他平台上的发展变得更轻松。</p><p><strong>将一个想法变成一条推文串（thread），再把推文串变成时事通讯，时事通讯变成YouTube视频，视频变成免费下载资料，免费下载资料再转化为一款产品。这就是验证一个好想法的过程。</strong></p><p>那么，你实际上要写些什么内容呢？</p><p>选取你之前选定的主题，然后按照以下步骤操作：</p><p><strong>1.</strong> 将这些主题分解为常见的痛点，并阐述如何解决这些痛点。<br><strong>2.</strong> 借助TweetHunter X侧边栏这类工具，研究其他账号的热门推文，然后从你自己的视角对这些推文进行改写。<br><strong>3.</strong> 阅读书籍，并将社交媒体当作记录笔记的平台——但在撰写这些笔记时，要包含引人入胜的开头、正文和结论。<br><strong>4.</strong> 找到你喜欢的YouTube频道，筛选出其中最热门的视频。然后，以这些视频的标题为切入点，创作你的推文开头和帖子内容。</p><p>现在，开始写作吧。</p><h2 id="5-销售流程"><a href="#5-销售流程" class="headerlink" title="5. 销售流程"></a>5. 销售流程</h2><p>销售就是讲故事。</p><p>你要向对方展示他们能够抵达的未来图景，让他们意识到当前处境存在的痛点，并为他们提供一条从现状（A点）迈向理想状态（B点）的路径。</p><ul><li>痛点</li><li>期望达成的结果</li><li>实现目标的路径（最好是你的独特方法）</li></ul><p>这就是销售的本质。</p><p>这也是内容的本质。</p><p>这也是官网的本质。</p><p>所有优秀且有说服力的事物皆是如此。这不仅仅是一堂关于销售技巧的课程，更是如我们<a href="https://thedankoe.com/letters/the-greatest-skill-of-the-21st-century/">上周所讨论的</a>那般，是关于说服艺术的一课。</p><p>在你所处的每一种情境中都去实践销售之道，无论是写作、与人交谈，还是努力获取收入之时。</p><p>我们不会深入探讨像销售电话这类流程的细节，因为说实话，你无需为此担忧。</p><p>作为一名创作者，你90%的“销售”工作是通过内容来完成的：</p><ul><li>让人们意识到他们的问题&#x2F;痛点；</li><li>为他们提供可尝试和试验的解决方案；</li><li>描绘出他们未来的生活图景，让他们拥有理想的结果。</li></ul><p>大多数企业主并不具备打造受众群体所带来的种种便利条件。</p><p>在下一部分中，我们将探讨一种更实用的营销方式。</p><h2 id="6-微服务"><a href="#6-微服务" class="headerlink" title="6. 微服务"></a>6. 微服务</h2><p>核心要点：</p><p>微服务是一种在你尚未搭建任何实际业务体系时即可开展的服务。</p><p>你只需具备以下条件：</p><p>• 一个社交媒体账号作为你的公开履历。<br>• 能够展现你专业权威的内容（通过阐述问题并给出解决方案，也就是“提供价值”）。<br>• 与点赞、评论、分享你帖子或向你私信提问的人进行沟通的能力。<br>• 若你未主动联系对方，可让他们填写一份问卷以表明兴趣。</p><p>微服务是一种在投入时间将其发展为成熟产品或服务之前，用于测试业务方向的有效方式。</p><p>创建微服务的最佳方式很简单：</p><p>推出一组为期 4 周的一对一服务套餐，售价 1000 美元。</p><p>这能起到以下几个作用：</p><ul><li><strong>1000美元是个合理的价格。如果有人愿意支付这个价格，那就意味着根据你的目标受众（企业家和商业人士通常对这样的高价不会退缩……只要真的想买，大多数人都能负担得起1000美元，此刻别让限制性信念和你缺乏经验的想法占据上风），其他人会愿意为一个更完善的方案支付3000 - 10000美元。</strong></li><li><strong>每周进行4次沟通足以让你的客户取得成果。</strong></li><li><strong>只有少数人能从你为他们代劳的工作中受益（自由职业工作）。但任何人都可能从你在沟通中给予的指导中获益。如果你愿意，你可以将其称为辅导或咨询。</strong></li><li><strong>在售出几套这样的服务后，你就能确定一份完整产品或服务应该包含哪些内容了。</strong></li></ul><p>那么，这4次沟通中具体要包含哪些内容呢？</p><h2 id="7-微服务框架"><a href="#7-微服务框架" class="headerlink" title="7. 微服务框架"></a>7. 微服务框架</h2><p>我们需要一个切入点</p><p>你自信能够完成的事情。</p><h3 id="步骤1：找出一个重大问题"><a href="#步骤1：找出一个重大问题" class="headerlink" title="步骤1：找出一个重大问题"></a>步骤1：找出一个重大问题</h3><p>结合你有相关经验的主要话题，人们面临的一个重大问题是什么？</p><p>你可以通过以下几种方式来寻找：</p><ul><li><strong>撰写关于不同问题的内容，看看哪个问题能获得最多的互动量。</strong></li><li><strong>研究关于该话题的YouTube视频，找出浏览量高的视频，并观看这些视频以明确它们所针对的问题（所有内容都是为了解决某个问题而创作的）。</strong></li><li><strong>关注那些讨论该话题的社交媒体账号，看看他们发布的与问题相关的内容中，哪些表现最佳。</strong></li></ul><p>重大问题通常属于健康、财富和人际关系这三大永恒市场领域。你的任务是选定其中一个领域，并围绕它来确定自己的兴趣方向。</p><p>如果我的兴趣是提高生产力，那么一个重大问题就是人们没有足够的时间或精力让配偶感受到爱意（涉及人际关系），同时在事业上取得进展（涉及财富）。</p><p>你可以进一步深入探究，阐述这些问题会给人们的生活带来怎样的影响。就这个例子而言，他们的夫妻关系可能会变得平淡乏味，进而引发不必要的压力，各种小问题不断累积，最终导致精神上的混乱。你越能清晰地描绘出这些问题对人们生活造成的影响，效果就越好。</p><p>（将上述内容用于创作相关内容。）</p><p>如果我的兴趣是编程或写作，一个大问题就是缺乏一套能让你赚更多钱的技能。你会被学校体系慢慢引导进入一份与你的技能储备无关的职业。这条道路会消磨你用生活做更多事情的精力，还会让你因各种责任而被束缚。</p><p>注意，我不仅是在阐述问题，还在放大这个问题。这一点很重要，或许是你撰写营销邮件、着陆页文案以及各类内容时最重要的部分。</p><p>不要把问题仅仅看作与你所选的主题或兴趣直接相关的事情。</p><p>问题其实是人们生活中已经存在的痛点，而你的主题或兴趣能够解决这个痛点。</p><p>在生活中，人们面临的一个大问题是什么？你的兴趣如何帮助解决这个问题？</p><h3 id="步骤2：描绘理想的生活方式"><a href="#步骤2：描绘理想的生活方式" class="headerlink" title="步骤2：描绘理想的生活方式"></a>步骤2：描绘理想的生活方式</h3><p>与上述问题相反的情况是什么？</p><p>他们想要实现的目标是什么？</p><p>一旦实现目标，他们的生活会是什么样子？</p><p>写下他们理想一天中的 3 个方面。</p><p>对于像提高生产力这样的事情，可以这样做：</p><ul><li>起床后做自己喜欢的工作；</li><li>午后不再感到疲倦和困乏，以便能够高效工作；</li><li>安心入睡，不用担心有一堆积压任务带来压力。</li></ul><p>如果你愿意，还可以列出更多类似内容。</p><h3 id="步骤3：打造独特流程"><a href="#步骤3：打造独特流程" class="headerlink" title="步骤3：打造独特流程"></a>步骤3：打造独特流程</h3><p>那么，你实际提供的服务是什么呢？</p><p>在课程中，你会引导学员完成哪些事项呢？</p><p>最终，你能否将其转化为产品或成熟的服务呢？</p><p>你需要一套属于自己的、独特的流程或体系，并且能够持续对其进行优化。</p><p>就我的“2小时写作课程”而言，这个体系就是“三点内容生态系统”。</p><p>你是如何想出这个体系的呢？</p><ul><li><strong>把某人从第一步（面临的大问题或者他们当下的状态）迈向第二步（理想的生活状态）所需经历的每一个步骤都写下来。</strong></li><li><strong>审视这些步骤，对它们稍加润色。打造一个你认为对你所帮助的人有效的体系。</strong></li><li><strong>为这个流程取一个吸引人的名字。这能激发潜在客户内心的渴望。我创造过许多这样的名字，它们为我带来了如今这样的受众群体，比如“一人企业”“四小时工作制”“精通之道”等等。我通过在大部分内容创作中练习命名（这个内容的名字是“微创作者”，我敢打赌你们中的大多数人正是因为这个名字才关注我的）。</strong></li></ul><h3 id="步骤四：别把事情弄得太复杂。"><a href="#步骤四：别把事情弄得太复杂。" class="headerlink" title="步骤四：别把事情弄得太复杂。"></a>步骤四：别把事情弄得太复杂。</h3><p>在与客户的4次会面中，你要把写好的步骤进行拆分，让它们能在4次会面内完成。</p><p>作为额外的福利，你可以为客户创建一个项目，引导他们完成这些步骤（比如一份生产力规划表、健身计划、撰写新闻通讯或者编写一个小程序）。</p><p>这是你提供的服务：</p><ul><li>解决问题</li><li>期望的效果</li><li>独特的流程来弥合差距</li></ul><p>当你与人合作时，你应将重点放在优化你的产品&#x2F;服务（offer可理解为提供的产品、服务等）以及收集客户评价（推荐信、证明）上。</p><h2 id="8-创建一份筛选调查问卷"><a href="#8-创建一份筛选调查问卷" class="headerlink" title="8. 创建一份筛选调查问卷"></a>8. 创建一份筛选调查问卷</h2><p>我们的大多数客户都将通过内容渠道而来。</p><p>但是，我们需要一个地方让人们表达与我们合作的意向。</p><p>通常情况下，这会是一个着陆页，甚至是一个能展示你产品或服务的完整网站。</p><p>不过现在，先别考虑这些。目前这并非必要之举。</p><p>注册使用JotForm、TypeForm，或者使用谷歌表单。（国内可是使用番茄表单）</p><p>将表单名称命名为“与我一对一合作”。</p><p>将表单描述写为“实施[你的独特流程]”。</p><p>添加与你的服务相关的问题，具体如下：</p><ul><li>姓名</li><li>电子邮箱</li><li>社交媒体账号（这样你就能联系到他们）</li><li>你目前面临的最大难题是什么？（设置与你的主题和服务相关的多项选择题答案）</li><li>你希望30天后自己处于什么状态？（设置与你的主题和服务相关的多项选择题答案）</li><li>“这不是一项免费服务。你是否真心想和我一起实现[期望的结果]？”（设置“是”或“否”的选项）</li></ul><p>问题要简短明了。</p><p>第 4 个问题能让潜在客户意识到自身存在的问题。</p><p>第 5 个问题能激发他们改变的欲望。</p><p>第 6 个问题能在他们心中埋下付费合作的想法。</p><p>你要把这个问卷放在你的内容下方以及个人简介链接里。</p><p>那之后我们该怎么做呢？对于那些没有填写问卷的客户，我们又该如何争取到他们呢？</p><h2 id="9-私信的艺术"><a href="#9-私信的艺术" class="headerlink" title="9. 私信的艺术"></a>9. 私信的艺术</h2><p>当你开始观看线上商业教程时，几乎总会有人建议你通过陌生邮件（cold email）或者给陌生人发私信（cold DM）的方式来为某项你几乎毫无经验技能招揽客户。</p><p>而我们现在已经有了一个至少你对其有一定了解的“产品”（此处“offer”结合语境推测为某种产品、服务或业务机会等 ）。</p><p>现在，我们需要给那些已经喜欢你、想和你交流，并且有可能成为你潜在客户的人发私信。</p><p>避免给随机的人发消息。否则你很可能会在私信和动态里被怼得很惨。</p><p>你要给谁发私信呢？</p><p>• 那些在你与“产品”相关的帖子下评论的人；<br>• 那些转发或分享你与“产品”相关帖子的人；<br>• 那些先主动给你发私信询问问题或者说“嗨”的人；<br>• 那些填写了你筛选问卷的人。</p><p>在我们了解私信里该说什么之前，先来弄清楚什么是“磁性内容”（Magnetic Content）。</p><p>磁性内容指的是篇幅或长或短的帖子，这些帖子围绕痛点、益处、理想生活方式、实用小贴士、对常见建议的个人见解、对其他账号高热内容的改写，以及克服痛点的可行步骤等内容展开……所有这些都与你的“产品”相关。</p><p>一旦你确定了“产品”，围绕它创作内容相对来说就会比较简单。</p><p>评论或分享这些帖子的人，是表达了对相关话题感兴趣的人。向他们发出热情的邀约再合适不过了。他们已经认识你，并且认为你在某方面有一定权威性。</p><p>（顺便说一下：如果你是在YouTube上开展这项工作，你无法直接给这些人发私信，所以你需要告知大家填写筛选问卷，然后通过电子邮件联系他们，或者在Instagram等平台上给他们发私信。）</p><h2 id="10-那么，你在直接消息里该说些什么呢？"><a href="#10-那么，你在直接消息里该说些什么呢？" class="headerlink" title="10. 那么，你在直接消息里该说些什么呢？"></a>10. 那么，你在直接消息里该说些什么呢？</h2><h3 id="1-接着之前的话题继续交流。"><a href="#1-接着之前的话题继续交流。" class="headerlink" title="1) 接着之前的话题继续交流。"></a>1) 接着之前的话题继续交流。</h3><p>如果他们评论或分享了你的一篇帖子，把这篇帖子的链接发给他们，并在私信中“回应”他们的评论。</p><p>如果你是在他们填写了你的问卷后通过私信联系他们，你的任务是简要地再和他们过一遍问卷里的所有问题。</p><p>开头可以这样说：“嘿，[姓名]，我看到你提交了与我合作的申请表。能和我多说说你为什么填这份表吗？你想通过和我合作获得什么？”</p><h3 id="2-询问他们目前相关事情进展如何。"><a href="#2-询问他们目前相关事情进展如何。" class="headerlink" title="2) 询问他们目前相关事情进展如何。"></a>2) 询问他们目前相关事情进展如何。</h3><p>假设他们对所互动帖子的主题感兴趣，问问他们是否正在学习相关内容，或者进展情况如何。</p><p>以健身为例，你可以问：“减肥之旅进展得怎么样了？有没有我能帮上忙的地方？”</p><p>这既能让他们想起自己理想的生活方式，又能让他们意识到自己遇到的困难。</p><p>如果你是在回复他们的问卷，问问他们为解决所列出的问题采取了哪些措施。</p><h3 id="3-给出新颖的建议并提及你的服务。"><a href="#3-给出新颖的建议并提及你的服务。" class="headerlink" title="3) 给出新颖的建议并提及你的服务。"></a>3) 给出新颖的建议并提及你的服务。</h3><p>到这个时候，你应该已经知道是否能帮到他们了。</p><h4 id="1-先提供一些免费的价值内容与知识教育。这能证明你的专业权威性。"><a href="#1-先提供一些免费的价值内容与知识教育。这能证明你的专业权威性。" class="headerlink" title="1. 先提供一些免费的价值内容与知识教育。这能证明你的专业权威性。"></a>1. 先提供一些免费的价值内容与知识教育。这能证明你的专业权威性。</h4><p>针对他们在第二步中提到的内容给出建议，并且尽量让建议不那么基础。就拿健身或提高效率来说，如果只是告诉他们“多喝水”，他们会觉得你不值得合作。要证明你确实有真本事。</p><p>在消息结尾处，提及“实际上我提供一套4次课程来帮助解决这个问题。我会帮你实施[你的独特流程]，简单来说，就是让达成[期望结果]变得稍微容易一些。这4次课程的总费用和一位优秀私人教练的收费相当——1000美元。”</p><p>如果你是在回复他们的问卷，就把最后一段换成说明你提供服务的下一步流程。你可以提到，如果他们感兴趣，你会告知每次课程要讨论的内容、如何安排通话、他们需要完成的项目，同时附上一张1000美元的发票。</p><p>没错，直接报出价格。</p><h4 id="2-处理异议，发送发票。"><a href="#2-处理异议，发送发票。" class="headerlink" title="2. 处理异议，发送发票。"></a>2. 处理异议，发送发票。</h4><p>销售电话或许能起到帮助，但并非必需。如果他们要求通过电话详细沟通，那就有必要进行一次通话。</p><p>刚开始你可能会收到很多拒绝。这很正常。创业初期就是如此。</p><p>请记住，我们的目标是在60天内赚到1000美元。在你获得第一个客户并获得客户评价后，这个目标会更快实现。</p><p>到这一步时，解答他们提出的任何问题。</p><p>等他们问完问题后，给他们发送一个包含Stripe（斯特里普）或贝宝（PayPal）支付链接的发票。</p><h2 id="11-60天行动计划"><a href="#11-60天行动计划" class="headerlink" title="11. 60天行动计划"></a>11. 60天行动计划</h2><p>你会感到困惑和不知所措。</p><p>当你学习新事物时，情况本就如此。</p><p>你的大脑正在努力拓展和成长，就像举重后会肌肉酸痛一样。</p><p>大部分成果会在第30天之后显现。</p><p>要是你还没有取得什么有价值的成果，你可能还没意识到，这里存在着一道自然筛选机制，会筛掉那些并非真心想做这件事的人。</p><p>在我发布的80个YouTube视频里，只有一个视频火了之后，我才真正感觉自己的YouTube频道开始发展起来了。</p><p>对于所有值得拥有的东西而言，一开始往往毫无动静，而后一切都会发生。</p><p>你感觉自己毫无进展，可随着经验的不断积累和沉淀，终会有人给出“同意”“认可”这样的回应。</p><p>接下来说说该重点关注什么。</p><p>不管你是否能立刻取得成果（有些人会），别再沉迷于即时快感，给自己留足60天的时间去赚到第一笔1000美元。</p><h3 id="11-1-创建个人资料后，就别再为此忧心忡忡了。"><a href="#11-1-创建个人资料后，就别再为此忧心忡忡了。" class="headerlink" title="11.1 创建个人资料后，就别再为此忧心忡忡了。"></a>11.1 创建个人资料后，就别再为此忧心忡忡了。</h3><p>不，修改个人简介并不会让你神奇地每月赚到 1 万美元。</p><p>创建好你的个人资料，然后就抛诸脑后吧。</p><p>模板：</p><p>—————————————————————————————————</p><p><strong>我痴迷于探寻无意义事物背后的意义。</strong></p><p><strong>我谈论人类潜能相关的话题：</strong></p><p><strong>• 生产力、专注力与心流状态</strong></p><p><strong>• 哲学与灵性</strong></p><p><strong>• 在平凡中发现乐趣</strong></p><p><strong>生活方式设计：</strong></p><p><strong>• 工作流程优化</strong></p><p><strong>• 少工作多赚钱</strong></p><p><strong>• 习惯养成、日常安排与持续改进</strong></p><p><strong>以及个人创业：</strong></p><p><strong>• 创作者、教练和独立创业者</strong></p><p><strong>• 内容创作体系</strong></p><p><strong>• 现代营销与销售</strong></p><p><strong>• 免费社交媒体流量</strong></p><p><strong>如果你对以上任何内容感兴趣，就跟着我一起探索吧。</strong></p><p><strong>下面简单介绍一下我自己：</strong></p><p><strong>我为那些收入达六位数甚至七位数的创作者和网红担任品牌顾问。</strong></p><p><strong>当他们想从无人问津的“苦命艺术家”变身成为备受赞誉、收入颇丰的网络红人时，就会来找我。</strong></p><p><strong>我帮他们优化工作流程、营销策略和内容创作，让他们每天只需工作两小时，就能收取更高的费用，并让产品和服务实现自动化销售。</strong></p><p><strong>我之所以能做好这份工作，是因为我会先在自己身上实践各种方法，清楚哪些可行，哪些不可行。</strong></p><p><strong>正因如此，我打造的个人品牌在各平台上的粉丝总数已超过260万（补充说明一下，这是我更新这份简介1.5年后的数据，而我在撰写此前那些文章时，粉丝数才15万多）。如今我平均每天只需工作2 - 4小时，还搭建好了能让创意收入持续流入的系统。</strong></p><p><strong>（说这话可能有点像在自夸……但我愿意承受这样的“指责”，好让你不用担心把时间和精力浪费在一个陌生人身上。）</strong></p><p><strong>不过，我会始终秉持尽可能透明的原则，对此我绝不道歉。</strong></p><p><strong>下面是我的一些作品：</strong></p><p><strong>我的文章：<a href="https://thedankoe.com/blog">https://thedankoe.com/blog</a></strong></p><p><strong>《The Koe Letter》：<a href="https://links.thedankoe.com/#letter">https://links.thedankoe.com/#letter</a></strong></p><p><strong>我的网站：</strong><a href="https://thedankoe.com/"><strong>https://thedankoe.com</strong></a></p><p><strong>如果你还想了解更多，可以在所有社交平台上搜索 @thedankoe 找到我。</strong></p><p><strong>或者查看我个人资料置顶区域的链接。</strong></p><p><strong>很高兴你能来到这里！】</strong></p><p><strong>————————————————————————————————</strong></p><h3 id="11-2-每天发布-3-5-条简短帖子。"><a href="#11-2-每天发布-3-5-条简短帖子。" class="headerlink" title="11.2 每天发布 3 - 5 条简短帖子。"></a>11.2 每天发布 3 - 5 条简短帖子。</h3><p>通常我建议每天发布 1 - 2 条简短帖子，这也是我实际的做法。</p><p>你可能会觉得每天发 1 - 2 条帖子更容易，但其实并非如此。想法会催生更多想法。你写得越多，就会有更多灵感，学到更多东西，并且会感觉自己取得了更多进展。</p><p>以下是具体做法：</p><ul><li>开始建立一个收藏夹，收集你喜欢并想要借鉴他人的内容（保存优质的推文、帖子、视频等）。</li><li>在浏览内容、收听播客、阅读书籍或者与人交谈时，随时记下想法。</li><li>围绕你的产品或服务，撰写关于遇到的困难、解决方案、操作指南、分析解读、对不同意的建议发表评论等内容。</li></ul><p>我用 Kortex 来完成上述所有操作。我会在下周的 YouTube 视频中展示我的设置——或者你可以阅读上周的<a href="https://thedankoe.com/letters/the-greatest-skill-of-the-21st-century/">视频</a>来了解具体流程。</p><p>每天记得查看你的评论和转发内容，并给相关人员发送私信。</p><p>Every day or every other day, include a link and call to action to your questionnaire to have more interested people to DM.</p><h3 id="11-3-每周撰写1-2篇长文。"><a href="#11-3-每周撰写1-2篇长文。" class="headerlink" title="11.3) 每周撰写1 - 2篇长文。"></a>11.3) 每周撰写1 - 2篇长文。</h3><p>你吸引读者注意力的时间越长，就越能赢得他们的信任，也能提供更多价值。这就是我写长篇时事通讯的原因。人们不需要额外的理由来参加我的课程或试用Kortex（产品名）。</p><p>时事通讯并非“微创作者”工作流程的一部分。等你把其他方面都安排妥当了，再加入时事通讯这一项。在“一人创业启动计划”中，我们会详细讲解所有这些内容。</p><p>对于长文创作，你可以这样做：</p><ul><li>选取你最出色的文章（或者其他人的优质观点），然后通过推文串（类似长微博的形式）、微型文章（示例）或者长文对其进行拓展。</li><li>利用额外的篇幅分享更多独家秘诀。尽量包含至少一条并非普遍建议或常识的内容。</li><li>在每篇文章的底部插入你的调查问卷链接。</li></ul><p>我个人建议撰写推文串。推文串是由多条相互关联的推文组成的。你之前肯定见过，就是一条接一条的推文评论形式。</p><p>这种形式因其结构特点更能吸引读者的注意力（更易读），能直接引导读者进行行动呼吁（促进销售），而且可以轻松改编成YouTube视频、Instagram图片轮播或者领英图片轮播。此外，其中的每条推文都可以单独提取出来作为新的推文发布。</p><p>长文将是你实现增长和提升销量的主要助力，别忽视它们。</p><p>但是，只有有人关注到你的长文，它们才有意义。</p><h3 id="11-4）让你的帖子获得关注"><a href="#11-4）让你的帖子获得关注" class="headerlink" title="11.4）让你的帖子获得关注"></a>11.4）让你的帖子获得关注</h3><p>在这封信里我没怎么提及这一点（因为我在其他信里已经说得够多了），但算法不太可能让你一夜成名。</p><p>大多数人没有意识到，社交媒体上的粉丝增长需要付出实际努力并具备相应技巧。一旦你明白了这一点，就不会再把它看作是只属于网红的运气游戏了。</p><p>你需要回复大号和小号的动态。</p><p>你需要通过私信与他人交朋友，共同成长。</p><p>你需要创作能@其他人的推文串（threads），这样他们就有理由转发你的内容。</p><p>你可以在《<a href="https://thedankoe.com/letters/how-to-actually-grow-on-social-media-what-they-dont-tell-you/">零粉丝基础打造个人影响力</a>》中学习到所有这些方法。</p><p>任何告诉你不需要做这些事的人，很可能只是在向你提供一种不真实且迎合算法的方法。</p><p>如果你想随心所欲地创作内容、自由表达想法，算法大概率不会青睐你——或者你运气好，赶上一波流量红利，可当平台规则改变时，你就会纳闷为何自己不再有增长势头了。</p><h3 id="11-5）规划你的微服务产品（或微套餐）"><a href="#11-5）规划你的微服务产品（或微套餐）" class="headerlink" title="11.5）规划你的微服务产品（或微套餐）"></a>11.5）规划你的微服务产品（或微套餐）</h3><p>你目前还不需要一个完全成型的产品或服务。</p><p>你只需要打造这样一样东西：</p><p><strong>（1）你在某方面能力高于平均水平；</strong></p><p><strong>（2）它能帮助人们切实解决生活中的某个问题。</strong></p><p>想想自己擅长什么？</p><p>其他人是否想学习这项技能？他们是否已经在学习相关内容了？围绕它是否已经形成了一个行业？你是否关注那些靠此谋生的人？</p><p>太棒了，你已经具备了创办一家价值百万美元公司所需的一切。这可不是开玩笑。你正在亲身经历一场关于人们如何赚钱的现场教学。</p><p>我写这些时事通讯可不是毫无缘由的。没错，我很喜欢写这些东西（不然我会去做更有利可图的事），但我写它们是因为这对我的业务盈利有帮助。</p><p>你所阅读的每一篇文章、访问的每一个落地页、读过的每一封邮件、看过的每一本书等，背后都有经济收益关联。</p><p>你之所以没赚到钱，是因为你没有去创作并销售这类东西。</p><p>当下，你所需要的仅仅是一套包含4次咨询服务的套餐，售价1000美元，用来教别人一些能让他们生活受益的内容。</p><p>健身、一项技能、营养搭配、训练计划制定等等。</p><p>选一个领域，主动为人们提供相关帮助。</p><p>一旦你开始取得成果，并且清楚人们的需求，那就投入更多时间去打造一家“真正的”企业。</p><h3 id="11-6）每周发送30条私信。"><a href="#11-6）每周发送30条私信。" class="headerlink" title="11.6）每周发送30条私信。"></a>11.6）每周发送30条私信。</h3><p>这个数字听起来很多，但实际上非常少，甚至有点可怜。</p><p>那些每月发送数千封冷邮件的自由职业者和机构负责人，要是听到你抱怨每周只发30条消息，估计都会嗤之以鼻。</p><p>不过，每周30条私信，乘以8周，就等于210条私信。</p><p>你只需让不到0.5%你联系过的人接受一份价值1000美元的提议就行，这完全有可能实现。</p><p>但你可能没意识到的是，即便你只拿下一个客户，你也已经建立起了庞大的人脉网络。</p><p>你与210个人有了直接联系。你的粉丝数量可能也增加了几百人。大约有1000人会了解你的专业能力。他们每个人又认识50到500个可以帮你宣传的人。</p><p>你坚持得越久，就会有越多的人表示同意，你的受众群体也会不断壮大，很快就会有人主动找上门来与你合作。</p>]]></content>
    
    
    <summary type="html">我会尽量让这篇文章简洁明了、毫无赘述。但要明白，心态建议绝非无用之物。信念与清晰的目标先于技能与自信。</summary>
    
    
    
    <category term="自我提升" scheme="https://blog.jzxer.cn/categories/%E8%87%AA%E6%88%91%E6%8F%90%E5%8D%87/"/>
    
    
    <category term="商业思维" scheme="https://blog.jzxer.cn/tags/%E5%95%86%E4%B8%9A%E6%80%9D%E7%BB%B4/"/>
    
    <category term="一人企业" scheme="https://blog.jzxer.cn/tags/%E4%B8%80%E4%BA%BA%E4%BC%81%E4%B8%9A/"/>
    
  </entry>
  
  <entry>
    <title>和 k 的邂逅</title>
    <link href="https://blog.jzxer.cn/20250815/20250815_dating_with_k/"/>
    <id>https://blog.jzxer.cn/20250815/20250815_dating_with_k/</id>
    <published>2025-08-15T05:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="ca34b3d15f72187d04e6799ba245a7ae568056b8afb213007cb711846cf388fc">9f569a554bb0ffc9fa3fcbf6978f78998f9a01c057aa06fcf08a6ea1e879789e009916cfd89067bf660a24846b9f383b6bab2cfe696484d7780266a4c646784763e240939b8a9e8768d62359a0ada48e42e4b33e5f8c049a03ab8026e505647a450558c72e1db0888bae1dfdd7c90b1ad713672f1ee31ad3e1b9308eb00a245176e6fde4e30a99e9a0d1b1817208058fc1c225c52965e02e66a5807a89590dc9c29e84d885bde2b8c19d9980cf65b4a56059d9f543f1166dc96dca0330f7ca4152d788b66cb79cc9516a3193de4a277bbd861582c108ea4a44e7a69bf004d862111a3a7017e96a63bcf7877cec1cc4f1a10f9d95d1f6b2e527a8a5f1294fb659c05a958da6a3b4d2db2c132f7ac0613b03d762ec5aebe86df0a6e2dcdabdf47406fb9c883858c8527acce783d26f00266fa876f97d6db3aeabde7f4ebe1f78761d3b804a9498471f61a099cfae8dc98f9cb82357135ade33cb1e8013062fb50760f9aa19035f400db0f91b2d4308f2621440571e34ab83ce2f4c6f9b466ae3ec2fba816d86eab1e23c1ec9315f286075b8641b5d8a9ffe843c31e273c34e1b8e33cabbc3b37cf2c2e899d186c73cee6c1d0843c470ee362e759ef7b7ea4dfe0b4807789908c99b186f79e4d5994d32dce9fe8aefeeb9ac74076cb6f089f935fd839f2ce1f9d2751dba8b93ab7f819a5ad1a5819c848fe650b5f7a18d2660a38027cb820eed6e3ca979cfeed9a6c9a4643f0ed9ba841fe1d8eebe0c41c15cfb0cd23b283bbb5f9225ab9e91d0fed376dae20c02de860a4f4339909ffe24308d7cca273994acb58b405f5776fa348a86672493496707b5068cf9f83aff62a35da61ce431b374af58aef381b99b9bdbeed6739f526ac151b9ce69e68dd627ce44aa5828a67cac735db520af95229a6c4d2deede266afac6baf7da015d34899c8c5d59d4af882e5ca71cb28c62d95e3847a31e08ac50958a560f18794edbac7cab73fb5bb384624db28d675048c9f5382a98f937b6b601b6684b2f8e46470f059d5bb3e6de7c8bf6fbbdfbdbacb973ae126344b21d742748d3b12c78f3a047803b82431f5185a842a92773b009e49eb7ff357dda245e348ab16a13079c59833a1e6436d6845e902d641cf95a1dbf2c4a1869a0392231b1b859d13c0785e6e576b2ba6912e19669233012b7d5f5f848ac425a3370adad325d172af6a3ded82b66e62ca8e1af600d2121d3915778b9f58b943ec1527cb79cb58385c4d524815ac04629fb063be4406f432cf510bdefbb0d1b5cd44cf8cb1ccc0b986bf7bd03e356181e8b818ca87eb764d16376139d406549737b4238b5930298731d3fb6201f3b67b6d2409dc441a435661fb86784e53c5c47664812e92a4b9b221e1f707f24c444759e2c29bb1e745acfe751613c89f9f16b59ef202c536617ba6c25b95f28522bccb713415650b9141ad7a6ac511f141fe7822da3738a67dfaaddf1a4fbea4c9ffdcdf67897b76bd76c2f4f7aae1d7393bb3012d685bba503fb538987fc787e3735fb604172cbd90a96dc213d4dbe5878611087eab16e28235554984d6f5230f57937043cdff67ef6fe26658c5125cc04e60787a2193597be5d0c0f69f47ba38c0432fb3dbd8d7eb49f79d47ecfb5407c8b641a3d76920345b0fde8f3338cbd6d7eabafea5d8165adac8db2e0017eef247fcd50336ac9470ec3d9cca826898a4aba3aa79f69df965e8f1d4b68839d11cc84842a22a696d2609e7186963edc224deaf111da4a5818fd203708e48cf43080f6cbc273d91649acba75cbc9ebc8d05258b5ac84d53e98ba1c4e8ede8e3f3530dc98056a5e4ef75b9d2b893cccd68a777922183314258f0c0dfebb84efe6f1dad49308dcd7d988857e06a36463041bb02eefb48d6961e445e6c6f52eb529c0332dcfbbd0c4bb8ed2f67c07d66d12babd1a1cbaa1dd3703a1f303bf98bc5326ce9a722cc6f386e1bd036398f4a46f87b7097e6e2f9535600524be942b54bdc78ea973a3b2921ed207a2fca66e2e6de6cb32fa58730d7d376c2414ecede016eefff446b6fb10084434178c899c69c13abff0f28bae54f89e6618403395bfc8134b10b9de41f2ecd9c0f546c42d63c44b6a07a6e4e0794cbe2d895a53b9a5ee2f6bc3d9ce50ac5b1f22c94a31b03ac8e83328fb01a46f0374b14277cf40bfa7a6d4054841523e950bed569944bb55ce943cf0b835fd6e3528d6926bd40f8c9537271a3d47f0ab9f940b369377757b6018db7958d9787f936e5f90e4c110b0706dadd286fc87053c80d5a8216a8c71837a98a7591cdddfef9d1423ced604575d6aad18e384edf98a43841b043a33f707c3341e3e0e38208cdc66b1960803bd72383e45ae92e2d2911fadcdda15bae229e910a41fde61b9b926945ec360ce3af863a13e9e059271f93f77379ca7de5ffa8149688e5285d4f29daa90c875aeaaa74653cce8aef17143da3c463db6984ea0906bd3bff6a996ec4d918f92dfd34944bf1057af9d119be53cda0bb88fcb426568959ce1701e7a0c2918d0cdcd0ed1a5d5e901564ff95d503e0113703b2147b4e73bb2706820c1abc186135f3b64d57f24083c9f317c8a6811b257066d458d2df0eeb1ddfb8c28937bb3277dad0085670779c68148381283f85fbca2a77d34d63796ba47968b22913b28a0f7cb29e0b932077498e13feb25e914691e8c20e8ac15e87c491063720f800b2c66ffac2ec959615a8daa03d15e881ca839425342d70172f7cdb50283e32848e05bf76615ab64d044debf2a0b42afc126711f1c76505a333099bf344b171e6f72a1849beb03186d8ac2acd7fef2e50986800ffb141c6df1ef</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
  </entry>
  
  <entry>
    <title>和 kitty 的邂逅</title>
    <link href="https://blog.jzxer.cn/20250618/20250618_dating_with_kitty/"/>
    <id>https://blog.jzxer.cn/20250618/20250618_dating_with_kitty/</id>
    <published>2025-06-18T08:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="7b374bdb55124857811595967972e4f6df0b0d9c5c386422a0159f52cc1078e1">9f569a554bb0ffc9fa3fcbf6978f78998f9a01c057aa06fcf08a6ea1e879789e009916cfd89067bf660a24846b9f383b6bab2cfe696484d7780266a4c64678475cb33bddbb7c346ad378f848caaf767d67301fe4d3de8457fa2cf3b785180e7214558bf76a04f889f0acfb01969aed8a48766a3dbafde157ab89154b3416a39935888098d25d2cadc45bfb89da845724b95fe7514c8d6b967ef5515cded40b83904118e6f8be342bfbfc4546c54ae82115a1ba15de11a49b12cb112b0ce16f479486e9344fe2fa9fda5bb4cfd0c0d562f5f1695d5ce9cd26f5a48c025abf7347348b73d42b801818bc1f8bcbc166c465591afbae73b9651a3bcd85f9af7ca9ba81361882981688dea8044a5f64bac2dea91fb84ea4203058f995ec2160b9a548f56b6a472abaf3a99c61edb94d052969249f61a15c1c1f9653f3e4020f5e8f3eef0f5eeb1bbace25d486974fb42a82d1257a1760f1f7446875d461460d6143c68a8d465c68a812bd7d231fafc23a1b88b3e07ae79591c8501bd51c20e08b829cd55928b91935b1fac3fdc865b2d22e31fc60e7f097f7045303e189911f7bdb4925b37f46a0cae10c39e9ce6d1f3b86329cb6cda003909c6a52a540dedfd734ca33f9ca46b6efbb273a2eddef98f1c3f329eb54fedfcc6a772f24276c58e8ff1cd7aab543238f88e6c6a8cca633e506575c0c87ad01c0a3cf0bb7fefc0140ebff9a8e89d302e67ff8ad2d0a0366950a7c2f6bdb9732266964601456d72d665849410daa0b1e833a4079f1a4098b5529ededb4fa1daaee3a1e7fb569e3a023e4da0b72a246539e80a80d7caaebed8fcf8a8adbea4387172caef246181f1c5ef0f9dc7c5464db32ce211e35a398f86bcabbf1f4948f31c1a11125e0788f2bfad40e92aaa575c8eba02679da3c194495ff6970ca895ffcac0fc374ab1dae63d0f99fef6c52325a43aa8cf3fdaba7e63ac43ac29c45ffebc7fe3aae04fdc21b6348268550259f62b03abc86fcb91441b44d5adb377af4ea71aaa0ccebaa710407177f3d2b753d340de91b6c33af256dc79b242cab0711600358cfd98addfac63f16a0f0b95ab1c5c0ee1bd1e7bcaae3216d4bab2ad3dc6f47ebbab77809a842e1b6969db332b0ed7b1ebd7afc589dad45b7d2ce9d2d757f8d3658fa30fe5eb71fe521aa420fdbb070ba958d58c73126a84e9fe6c712ab5c827ee94e7c6035a18b681819aad5dc35cdba7a8fc7592f2e25f1e8153c4f851612357289c3bfe68d04cf92496e881500521c3e40900b93eb16c3345b04e64ed988aaa7beb4adaa037967b9e9a6e2a412f9b28476e3b3c7b248948b609a394a4e8b83a7e5ea8a41a284e5b8c90031e552ea8ec642660d6f57a2b64e9cd7a43744351ab6bcca26dddf981e23fe60aec0d1a629443d2e23936a296dc3db4acf3ee4ad93b0fcb256eafa7d75a64c2454a14cb999e647890f86c736d6a4c11f7cdef15db6bebdc737424818f9ba39c34d7c51a05b6eab4493222e4adf345f2fd8ec111d59a19044e5fca40ab7bb39411a9b6e53f4c21c03da10750ee876a4e4478c52b523ec2647720943cdd8f8a4a798e87d3ef1e38b368cbd714eb2f726fd592c631aa6f99b51193ccff138a473a3a7cbbfca5f0c6ab6360f3f7376c89e0dc4e3f1433af79ea58e709a134b8c2c12798145735bd85da089778bd327562f86b8074d29b155b3248e5cf59bc5717ffa2bf1fbc1f1f42003539480a889d4c4e5aba191b5585b1b97706f6632dcec787156b4254e9fcba4182d2c6d7442d7b86614f210c63a6c3b97562a26975414b55504a3f8ec66f7f8ee72a61a93e1da3b5e5b5c7f9c9885a7b109b7ca5f7be45fa06eec99b1ae535ac1686308293c9c101da01ae6b87a207e2e99bcd788269f0daf64711df35d871deedcebe0e0882630080901b98cd8751af4ba1161e41a1ac2cadf95536a9ddfd93c48523ae2b5c1d6cbbdfbf662f0cbf7a4b78c906bbc96fd7eb486fba91f923f5e572b4a7c47c77da5c46459c4856a3dd82e38da713b9883fd53ab063f73a3b0c427b7f898ed812fca464dd0117be37dee5d95bcb6a776b1dccc792ab0b6ff729affc6367cd91a52294aa83faef43eadc66795d8109f02eec6a7b3a2dbce0e6c4dd1dcda1f4fac4818e36e18b6183dbb6bab5c25d4974c05a00bf252ab0f9122bff5f9c4bac9597a4a292435e02dbfec21d56d14ad846a8525474517fdf3d2897e7d618e83098abb7b7df9ea41f879b38a8b6c1a71042ca9e24e5c59c210e84ec8f851a1740ce9ee960d713f0454e1cd2571d7561173a1aecf2452416fc64ce78aa98d877810ec3cfbc90514577b06f0b45c2268c26fafee670f381cddd452e0abe6603ac08f335c098920692f51a983d252e5fd36f90cdf787294577f422d7877d8de8702890acac6d8b0d0ce8470e71b798acaca3dd726e386777aedff4bba6c448c8fbf38d293bb4e43c620dfff1a6188e96cb20f778860a09fc403b477a786980ebbab4de4cca5e1f8ee922448a0338af4aa0c9353cafb38aee918502e0466ce6d5561e550bb7830f2c024399816c4914c8ab30f6e02ab04ca36f13d3caea12d89804193e2bd721bc91a2478f7cb66f480eafba5acb506b03aa39ac9bcfa78b69585893b011445c50723c12d011f9af08151d3ece6997e40d88580e4c8ca9fbee22d2ed61bcf5b3325b94336a3de2c651ec4490726e92b317c7ecfe5aecdd3354add3e4220e0776e1130063914dbd1b317b63122148bd7c51f1ca9388bf9bc30c78ece5e67ff261dd4d8469c90cabf80ee3e3083962ad7896ccf7ccb2fbaf184db9b832168dc1300fdab56897b51027908f16a90f3806775c1af3d8e5f546537927fd7f98ad0a43ad927eb1e4c8968b5c1044412f4c8f04979875430fee1bb9e20baf18ef71b6853a0d77ac7b22d2669d8f9b4d6ab58610c9fc3cc7b8fc1024b70603fba07c0a3f1af4764bc6b3c75f40af100a62657663b572fe4aa5739941145f4eb40c1d3ae514db877e55307789d2310ca34da25ccb09b0b7cb1360beee0029847f93a93d97a90661340d6fa960b7de9bf82ab701a7762baccfe8ac8569cbbc78673880f3a07932011aed7f71cab1122dc60f801b6b25543f5e65fb459d49fecebe2cf3a1ad541aa737e1d7b0741035006225dd0e8561245b86f50729d047237ac4919ddd9db148e384f741eaa9c74b0ded0ad4ba4cc99bea041d635b1bc47db02956b37432af298e0494d52a545e95adbb6b070e4fb971e602676ae14db15046222a690ca9926295331a74aedabd1125d74fa3d67ff34e7406f975ff1fc8eac582455f76678ae0d1fed7d1e691aa6776162502ec8097a03b9f7af15c9243f03206b0549e04e11d14bff9192b0b622a9a1dc509be9e6e909630e21b93dce237e537029004b216acd09be9c36c8e99567cb8e14ac291c1f8f254bfddd19f404d744aaa76bb83d1cde6eafdcd2ea1f2d4b3dd649da02204921e7ea9289d49bddefb297bc8fb04cfe7f3729f600fbc0206dba1e392b767ca4596dcc437feae13f9c40d802c3899f90e0ccb0af3ab1fa215737ddedfb6793fe237fd1c54e84895463fac9a13cf547c9188bf91c73c60793a2ee243c51190def6afd15a003ba1c11e7826f019eb6faf9196936a6fa1cd2020833ea1c874d02b2aa14fa24534828bb4d08b4fced64bec63260a16e795a1dec53423ba9c064d4ef0a8541e4470b17ded1725ccff7c0e17cdd24572ec78ed873e6308549d5fa4dce594838a25d1412a3e216c768875e10904202e523537e597dabaeb74c5027039fbaf981a44cfb09cda38e6613a2e4fe3a0f205f4f8c3441e150ffa4d86fa080fbb5f3e62b0e74f738a325c61db4a0c1296b3ce0b81534245f9797dabd417d61a8a4c2e0b818628c917f4d8a281c0553ea964a84e70d74dee08a046b4312d3e3e3fc76b897a1d87c2d47a6c167fb02c71fa4c952c0b42443b07948075c3622395edfc83a55672298488ba76df5c2647fe6cfd5cee4939cbacdf42d09de43eeedda1f33f34c2cf1f557da4fdc6fdb80c5fc9b0ee56d40c5ad55ae34fdf0d6994a64f78663e51457a447842a946b33400678ceea3cbec7560b58f9b7c420aee78134c562962c2734f1f418a17e93270e1b37067dab527c593aa21c7fd617f174b4d1525574d4e6a5a46212a5ccd1ea7786194afa1b1f9f9f87576c79d3ea882a9e848f7758fc3bd965733a711584595f578c656d4cd24500ab93834e30d44f9b73f7d5288d34b263c7e9c575726922a50b5aacbb4cbf904830ae1441722b3a166730011b16e9834f90cce242d85f0ec1ad1d229583ca3c44bb541d4283e8d88110b394992bddcdde7ba4182314a7</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
  </entry>
  
  <entry>
    <title>用 ollama 训练 DeepSeek—R1</title>
    <link href="https://blog.jzxer.cn/20250521/20250521_use_ollama/"/>
    <id>https://blog.jzxer.cn/20250521/20250521_use_ollama/</id>
    <published>2025-05-21T03:55:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>最近在学习如何从0到1生成一个自己独有的AI模型，主要是对未来市场的观望：</p><p>在未来，每个岗位都有一个独有的AI模型作为辅助，类似assistant的存在，它可以以宿主的思维来帮助解决大多数杂糅重复的工作。</p><p>那么如何训练这样的专有模型，就是一件非常值得深入了解的事情。</p><h2 id="探索"><a href="#探索" class="headerlink" title="探索"></a>探索</h2><p>目前我了解到市面上有两个模型管理平台，类似github管理代码一样，一个是：Ollama、一个是Huggingface。</p><p>而Ollama有自己的客户端可以使用，并且界面看上去更加符合我的审美，虽然 huggingface看上去更加庞大点儿，它们的区别就像facebook和Instagram，很遗憾，我喜欢Instagram，所以我选择了 Ollama深入了解。</p><h2 id="训练步骤"><a href="#训练步骤" class="headerlink" title="训练步骤"></a>训练步骤</h2><h3 id="1-下载Ollama客户端"><a href="#1-下载Ollama客户端" class="headerlink" title="1. 下载Ollama客户端"></a>1. 下载Ollama客户端</h3><p>进入官网 <a href="https://ollama.com/">Ollama</a>下载适合自己的客户端文件。并且安装。</p><h3 id="2-按提示安装-model"><a href="#2-按提示安装-model" class="headerlink" title="2. 按提示安装 model"></a>2. 按提示安装 model</h3><p>在安装完之后，ollama会提醒用户执行两个操作：一个是全局安装 ollama 命令行工具、另一个是安装 llama3.2 模型。我们按步骤执行即可。</p><h3 id="3-安装想要的model"><a href="#3-安装想要的model" class="headerlink" title="3. 安装想要的model"></a>3. 安装想要的model</h3><p>因为本篇文章目的是训练 deepseek-R1 模型，所以我们可以进入官方模型页面进行下载：我这里选择的是 5b蒸馏版本。</p><blockquote><p>ollama run deepseek-r1:1.5b</p></blockquote><h3 id="4-微调前的准备"><a href="#4-微调前的准备" class="headerlink" title="4. 微调前的准备"></a>4. 微调前的准备</h3><p>这一步需要执行两个步骤，一个是把ollama服务跑起来，另一个是创建训练任务。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ollama serve   // 运行服务</span><br><span class="line">ollama create my_finetuned_model --base deepseek-r1:1.5b --data /path/to/data.txt        // 创建微调模型任务</span><br></pre></td></tr></table></figure><p>my_finetuned_model：微调任务名称</p><p>&#x2F;path&#x2F;to&#x2F;data.txt：微调模型保存路径</p><h3 id="5-开始训练"><a href="#5-开始训练" class="headerlink" title="5. 开始训练"></a>5. 开始训练</h3><p>开始训练上文创建的训练任务</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ollama train my_finetuned_model</span><br></pre></td></tr></table></figure><ul><li>Ollama 会自动处理模型的加载、数据的读取和训练过程。</li><li>训练过程中，你可以通过 Ollama 的日志查看进度。</li></ul><h3 id="6-模型评估"><a href="#6-模型评估" class="headerlink" title="6. 模型评估"></a>6. 模型评估</h3><p>在训练任务结束之后，我们可以通过以下命令来测试训练结果是否符合预期,如果结果不理想的话可以调整训练参数，如：学习率、训练轮数等，然后重新训练。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ollama run my_finetuned_model <span class="string">&quot;Your test prompt here&quot;</span></span><br></pre></td></tr></table></figure><h3 id="7-保存并导出模型"><a href="#7-保存并导出模型" class="headerlink" title="7. 保存并导出模型"></a>7. 保存并导出模型</h3><p>由于平时使用的场景 tensorflow偏多，这里就以 SavedModel 格式或 Keras 模型格式作为范本来讲解。</p><h4 id="a-安装必要的依赖库"><a href="#a-安装必要的依赖库" class="headerlink" title="a. 安装必要的依赖库"></a>a. 安装必要的依赖库</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install tensorflow tensorflowjs</span><br></pre></td></tr></table></figure><h4 id="b-导出脚本编写"><a href="#b-导出脚本编写" class="headerlink" title="b. 导出脚本编写"></a>b. 导出脚本编写</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> torch</span><br><span class="line"><span class="keyword">import</span> tensorflow <span class="keyword">as</span> tf</span><br><span class="line"><span class="keyword">from</span> transformers <span class="keyword">import</span> AutoModelForCausalLM, AutoTokenizer</span><br><span class="line"></span><br><span class="line"><span class="comment"># 加载 PyTorch 模型</span></span><br><span class="line">model_name = <span class="string">&quot;my_finetuned_model&quot;</span>  <span class="comment"># 替换为你的模型名称</span></span><br><span class="line">tokenizer = AutoTokenizer.from_pretrained(model_name)</span><br><span class="line">model = AutoModelForCausalLM.from_pretrained(model_name)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 将 PyTorch 模型转换为 TensorFlow 模型</span></span><br><span class="line">model.<span class="built_in">eval</span>()  <span class="comment"># 确保模型处于评估模式</span></span><br><span class="line">example_input = tokenizer.encode(<span class="string">&quot;Your example input text here&quot;</span>, return_tensors=<span class="string">&quot;pt&quot;</span>)</span><br><span class="line">example_output = model(example_input)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用 TensorFlow 的 `tf.keras.Model` 构建等效模型</span></span><br><span class="line"><span class="comment"># 注意：这一步可能需要根据具体模型结构进行调整</span></span><br><span class="line">input_ids = tf.keras.Input(shape=(<span class="literal">None</span>,), dtype=tf.int32, name=<span class="string">&quot;input_ids&quot;</span>)</span><br><span class="line">attention_mask = tf.keras.Input(shape=(<span class="literal">None</span>,), dtype=tf.int32, name=<span class="string">&quot;attention_mask&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 构建 TensorFlow 模型</span></span><br><span class="line">tf_model = tf.keras.Model(inputs=[input_ids, attention_mask], outputs=model(input_ids, attention_mask=attention_mask))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 保存为 TensorFlow SavedModel 格式</span></span><br><span class="line">tf_model.save(<span class="string">&quot;/path/to/save/tf_model&quot;</span>)</span><br></pre></td></tr></table></figure><h4 id="c-将tensorflow模型转换为-tensorflowjs模型"><a href="#c-将tensorflow模型转换为-tensorflowjs模型" class="headerlink" title="c. 将tensorflow模型转换为 tensorflowjs模型"></a>c. 将tensorflow模型转换为 tensorflowjs模型</h4><p>使用 tensorflowjs_converter 工具将 TensorFlow SavedModel 转换为 TensorFlow.js 格式。运行以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tensorflowjs_converter --input_format=tf_saved_model /path/to/tf_model /path/to/tfjs_model</span><br></pre></td></tr></table></figure><h3 id="8-在tensorflowjs中使用导出的模型"><a href="#8-在tensorflowjs中使用导出的模型" class="headerlink" title="8. 在tensorflowjs中使用导出的模型"></a>8. 在tensorflowjs中使用导出的模型</h3><h4 id="a-在浏览器中运行"><a href="#a-在浏览器中运行" class="headerlink" title="a. 在浏览器中运行"></a>a. 在浏览器中运行</h4><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">... more code</span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">loadModel</span>(<span class="params"></span>) &#123;</span></span><br><span class="line"><span class="language-javascript">      <span class="keyword">const</span> model = <span class="keyword">await</span> tf.<span class="title function_">loadGraphModel</span>(<span class="string">&#x27;/path/to/save/tfjs_model/model.json&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;Model loaded successfully!&quot;</span>);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">      <span class="comment">// 准备输入数据</span></span></span><br><span class="line"><span class="language-javascript">      <span class="keyword">const</span> input = tf.<span class="title function_">tensor</span>([[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]]); <span class="comment">// 替换为实际输入数据</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">      <span class="comment">// 运行模型</span></span></span><br><span class="line"><span class="language-javascript">      <span class="keyword">const</span> output = model.<span class="title function_">predict</span>(input);</span></span><br><span class="line"><span class="language-javascript">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;Model output:&quot;</span>, output.<span class="title function_">dataSync</span>());</span></span><br><span class="line"><span class="language-javascript">    &#125;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="title function_">loadModel</span>();</span></span><br><span class="line"><span class="language-javascript">  </span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">... more code</span><br></pre></td></tr></table></figure><h4 id="b-在nodejs-中运行"><a href="#b-在nodejs-中运行" class="headerlink" title="b. 在nodejs 中运行"></a>b. 在nodejs 中运行</h4><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> tf = <span class="built_in">require</span>(<span class="string">&#x27;@tensorflow/tfjs-node&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">loadModel</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> model = <span class="keyword">await</span> tf.<span class="title function_">loadGraphModel</span>(<span class="string">&#x27;file:///path/to/save/tfjs_model/model.json&#x27;</span>);</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;Model loaded successfully!&quot;</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 准备输入数据</span></span><br><span class="line">  <span class="keyword">const</span> input = tf.<span class="title function_">tensor</span>([[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]]); <span class="comment">// 替换为实际输入数据</span></span><br><span class="line"></span><br><span class="line">  <span class="comment">// 运行模型</span></span><br><span class="line">  <span class="keyword">const</span> output = model.<span class="title function_">predict</span>(input);</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;Model output:&quot;</span>, output.<span class="title function_">dataSync</span>());</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">loadModel</span>();</span><br></pre></td></tr></table></figure><h2 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h2><p><a href="https://ollama.com/">https://ollama.com</a></p>]]></content>
    
    
    <summary type="html">在未来，每个岗位都有一个独有的AI模型作为辅助，类似assistant的存在，它可以以宿主的思维来帮助解决大多数杂糅重复的工作。那么如何训练这样的专有模型，就是一件非常值得深入了解的事情...</summary>
    
    
    
    <category term="AI" scheme="https://blog.jzxer.cn/categories/AI/"/>
    
    
    <category term="ollama" scheme="https://blog.jzxer.cn/tags/ollama/"/>
    
  </entry>
  
  <entry>
    <title>如何把源码打包成.bin程序</title>
    <link href="https://blog.jzxer.cn/20250131/20250130_how_to_upload_bin/"/>
    <id>https://blog.jzxer.cn/20250131/20250130_how_to_upload_bin/</id>
    <published>2025-01-31T08:50:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>在使用 platformIO 的时候，有的时候涉及到敏感信息，我们并<strong>不希望把程序源码开源</strong>，但是<strong>希望能给用户上手体验</strong>，这个时候.bin 烧录程序就很有用.</p><p>下面简单介绍一下具体的操作步骤。</p><h2 id="生成-bin-文件"><a href="#生成-bin-文件" class="headerlink" title="生成 .bin 文件"></a>生成 .bin 文件</h2><p>在 platformIO 下，一般在调试打包上传的过程中，会自动生成.bin 文件。如果没有生成，点击如下按钮，先生成bin 文件。</p><p>![打包代码为 bin](<a href="https://oss.jzxer.cn/blog/%E6%88%AA%E5%B1%8F2025-01-06">https://oss.jzxer.cn/blog/截屏2025-01-06</a> 16.40.55.png)</p><p>如果打包构建成果的话，以我创建的 esp8266 程序为例，它就会在如下目录位置生成 .bin 文件。</p><p>![bin 文件位置](<a href="https://oss.jzxer.cn/blog/%E6%88%AA%E5%B1%8F2025-01-06">https://oss.jzxer.cn/blog/截屏2025-01-06</a> 16.42.13.png)</p><p>然后就可以通过更改名称来创建想要的烧录程序的版本了。</p><h2 id="烧录-bin"><a href="#烧录-bin" class="headerlink" title="烧录 .bin"></a>烧录 .bin</h2><p>既然我们生成了 .bin 文件，下一步当然就是使用它。目前有两种方式，一个是用 platformIO 烧录，一个就是用esptool.py。我这里只介绍后者。</p><h3 id="1-下载-esptool-py"><a href="#1-下载-esptool-py" class="headerlink" title="1. 下载 esptool.py"></a>1. 下载 esptool.py</h3><p>如果电脑有 brew：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install esptool</span><br></pre></td></tr></table></figure><p>如果没有，执行：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">pip install esptool</span><br><span class="line">// or</span><br><span class="line">pip3 install esptool</span><br></pre></td></tr></table></figure><h3 id="2-烧录"><a href="#2-烧录" class="headerlink" title="2. 烧录"></a>2. 烧录</h3><p>这一步是把打包构建好的 bin文件烧录到对应设备里去。</p><p>首先进入 .bin 所在的文件夹内，执行以下命令：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">esptool.py --port /dev/tty.usbserial-XXXX write_flash 0x1000 firmware.bin</span><br></pre></td></tr></table></figure><ul><li><strong>tty.usbserial-XXXX</strong> 这个指的是你的设备对应的端口号</li><li><code>0x1000</code> 是大多数 ESP32 项目中默认的启动地址。对于不同的项目或开发板，可能需要调整这个值。</li></ul><p>在烧录过程中，<code>esptool.py</code> 会显示进度条和烧录信息。完成后，开发板会自动重启，加载新的固件。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>使用 bin 的好处就是防止不必要的源代码外泄，进一步提升自己隐私的安全性。当然这个功能可能在商业上应用场景更多一点。</p>]]></content>
    
    
    <summary type="html">在使用 platformIO 的时候，有的时候涉及到敏感信息，我们并不希望把程序源码开源，但是希望能给用户上手体验，这个时候.bin 烧录程序就很有用...</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="git" scheme="https://blog.jzxer.cn/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-3386 蓝帽电位器（56）</title>
    <link href="https://blog.jzxer.cn/20250131/20250131_3386_%20potentiometer/"/>
    <id>https://blog.jzxer.cn/20250131/20250131_3386_%20potentiometer/</id>
    <published>2025-01-31T05:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>蓝帽电位器，便宜好用的传感器，可以用来调节 PWM 占空比，调节 LED 亮度，调节蜂鸣器音量等等。</p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>这个传感器的结构特殊，起到关键作用的是中间那个引脚。</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">PB6</td><td align="center">middle</td></tr><tr><td align="center">5 V</td><td align="center">left</td></tr><tr><td align="center">GND</td><td align="center">right</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><p>本案例使用的是 STM32-F103C8 开发板</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> pwmPin = PB6;</span><br><span class="line"><span class="type">int</span> ledPin = PB7;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">115200</span>);</span><br><span class="line">  <span class="comment">// 设置 PWM 引脚为输出模式</span></span><br><span class="line">  <span class="built_in">pinMode</span>(pwmPin, INPUT);</span><br><span class="line">  <span class="built_in">pinMode</span>(ledPin, OUTPUT);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="type">int</span> data = <span class="built_in">analogRead</span>(pwmPin);</span><br><span class="line">  <span class="type">int</span> pwmValue = <span class="built_in">map</span>(data, <span class="number">0</span>, <span class="number">4098</span>, <span class="number">0</span>, <span class="number">255</span>);  <span class="comment">// 将 sensorValue 映射到 0 - 255 的范围</span></span><br><span class="line">  Serial.<span class="built_in">println</span>(pwmValue);</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">100</span>);</span><br><span class="line">  <span class="built_in">analogWrite</span>(ledPin, pwmValue);</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">100</span>);</span><br><span class="line">  <span class="built_in">analogWrite</span>(ledPin, pwmValue);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>待完善…</p><h1 id=""><a href="#" class="headerlink" title=""></a></h1>]]></content>
    
    
    <summary type="html">便宜好用的蓝帽电位器</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-JDY-40无线串口模块(55)</title>
    <link href="https://blog.jzxer.cn/20250129/20250126-y40/"/>
    <id>https://blog.jzxer.cn/20250129/20250126-y40/</id>
    <published>2025-01-29T12:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://blog.csdn.net/m0_55733070/article/details/114333194">https://blog.csdn.net/m0_55733070/article/details/114333194</a></p>]]></content>
    
    
    <summary type="html">通过 esp-now 协议实现 esp 设备之间的信息通讯</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-espNow（54）</title>
    <link href="https://blog.jzxer.cn/20250129/20250129-esp8266-with-espnow/"/>
    <id>https://blog.jzxer.cn/20250129/20250129-esp8266-with-espnow/</id>
    <published>2025-01-29T12:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>通过 esp-now 协议实现 esp 设备之间的信息通讯</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://randomnerdtutorials.com/esp-now-one-to-many-esp8266-nodemcu/">https://randomnerdtutorials.com/esp-now-one-to-many-esp8266-nodemcu/</a></p>]]></content>
    
    
    <summary type="html">通过 esp-now 协议实现 esp 设备之间的信息通讯</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-BME280(53)</title>
    <link href="https://blog.jzxer.cn/20250127/20250127_esp8266_with_ws/"/>
    <id>https://blog.jzxer.cn/20250127/20250127_esp8266_with_ws/</id>
    <published>2025-01-27T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>BME280 是一个用于测量温度、湿度和气压的传感器。它具有 I2C 和 SPI 接口，因此可以轻松集成到各种项目中。在本教程中，我们将使用 ESP8266 和 BME280 传感器来创建一个简单的 Web 服务器，该服务器将传感器数据发送到浏览器。</p><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><p>我们将使用I2C通信与BME280传感器模块。为此，将传感器连接到默认的ESP8266 SCL (GPIO 5) 和SDA (GPIO 4) 引脚，如下面的示意图所示。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*********</span></span><br><span class="line"><span class="comment">  Rui Santos</span></span><br><span class="line"><span class="comment">  Complete instructions at https://RandomNerdTutorials.com/esp8266-nodemcu-websocket-server-sensor/</span></span><br><span class="line"><span class="comment">  </span></span><br><span class="line"><span class="comment">  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.</span></span><br><span class="line"><span class="comment">  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</span></span><br><span class="line"><span class="comment">*********/</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;ESP8266WiFi.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;ESPAsyncTCP.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;ESPAsyncWebServer.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;LittleFS.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino_JSON.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Adafruit_BME280.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Adafruit_Sensor.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Replace with your network credentials</span></span><br><span class="line"><span class="type">const</span> <span class="type">char</span>* ssid = <span class="string">&quot;REPLACE_WITH_YOUR_SSID&quot;</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">char</span>* password = <span class="string">&quot;REPLACE_WITH_YOUR_PASSWORD&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Create AsyncWebServer object on port 80</span></span><br><span class="line"><span class="function">AsyncWebServer <span class="title">server</span><span class="params">(<span class="number">80</span>)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Create a WebSocket object</span></span><br><span class="line"><span class="function">AsyncWebSocket <span class="title">ws</span><span class="params">(<span class="string">&quot;/ws&quot;</span>)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Json Variable to Hold Sensor Readings</span></span><br><span class="line">JSONVar readings;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Timer variables</span></span><br><span class="line"><span class="type">unsigned</span> <span class="type">long</span> lastTime = <span class="number">0</span>;  </span><br><span class="line"><span class="type">unsigned</span> <span class="type">long</span> timerDelay = <span class="number">30000</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Create a sensor object</span></span><br><span class="line">Adafruit_BME280 bme;         <span class="comment">// BME280 connect to ESP32 I2C (GPIO 21 = SDA, GPIO 22 = SCL)</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Init BME280</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">initBME</span><span class="params">()</span></span>&#123;</span><br><span class="line">  <span class="keyword">if</span> (!bme.<span class="built_in">begin</span>(<span class="number">0x76</span>)) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;Could not find a valid BME280 sensor, check wiring!&quot;</span>);</span><br><span class="line">    <span class="keyword">while</span> (<span class="number">1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Get Sensor Readings and return JSON object</span></span><br><span class="line"><span class="function">String <span class="title">getSensorReadings</span><span class="params">()</span></span>&#123;</span><br><span class="line">  readings[<span class="string">&quot;temperature&quot;</span>] = <span class="built_in">String</span>(bme.<span class="built_in">readTemperature</span>());</span><br><span class="line">  readings[<span class="string">&quot;humidity&quot;</span>] =  <span class="built_in">String</span>(bme.<span class="built_in">readHumidity</span>());</span><br><span class="line">  readings[<span class="string">&quot;pressure&quot;</span>] = <span class="built_in">String</span>(bme.<span class="built_in">readPressure</span>()/<span class="number">100.0F</span>);</span><br><span class="line">  String jsonString = JSON.<span class="built_in">stringify</span>(readings);</span><br><span class="line">  <span class="keyword">return</span> jsonString;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Initialize LittleFS</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">initFS</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="keyword">if</span> (!LittleFS.<span class="built_in">begin</span>()) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;An error has occurred while mounting LittleFS&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span>&#123;</span><br><span class="line">   Serial.<span class="built_in">println</span>(<span class="string">&quot;LittleFS mounted successfully&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Initialize WiFi</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">initWiFi</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  WiFi.<span class="built_in">mode</span>(WIFI_STA);</span><br><span class="line">  WiFi.<span class="built_in">begin</span>(ssid, password);</span><br><span class="line">  Serial.<span class="built_in">print</span>(<span class="string">&quot;Connecting to WiFi ..&quot;</span>);</span><br><span class="line">  <span class="keyword">while</span> (WiFi.<span class="built_in">status</span>() != WL_CONNECTED) &#123;</span><br><span class="line">    Serial.<span class="built_in">print</span>(<span class="string">&#x27;.&#x27;</span>);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  Serial.<span class="built_in">println</span>(WiFi.<span class="built_in">localIP</span>());</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">notifyClients</span><span class="params">(String sensorReadings)</span> </span>&#123;</span><br><span class="line">  ws.<span class="built_in">textAll</span>(sensorReadings);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">handleWebSocketMessage</span><span class="params">(<span class="type">void</span> *arg, <span class="type">uint8_t</span> *data, <span class="type">size_t</span> len)</span> </span>&#123;</span><br><span class="line">  AwsFrameInfo *info = (AwsFrameInfo*)arg;</span><br><span class="line">  <span class="keyword">if</span> (info-&gt;<span class="keyword">final</span> &amp;&amp; info-&gt;index == <span class="number">0</span> &amp;&amp; info-&gt;len == len &amp;&amp; info-&gt;opcode == WS_TEXT) &#123;</span><br><span class="line">    <span class="comment">//data[len] = 0;</span></span><br><span class="line">    <span class="comment">//String message = (char*)data;</span></span><br><span class="line">    <span class="comment">// Check if the message is &quot;getReadings&quot;</span></span><br><span class="line">    <span class="comment">//if (strcmp((char*)data, &quot;getReadings&quot;) == 0) &#123;</span></span><br><span class="line">      <span class="comment">//if it is, send current sensor readings</span></span><br><span class="line">      String sensorReadings = <span class="built_in">getSensorReadings</span>();</span><br><span class="line">      Serial.<span class="built_in">print</span>(sensorReadings);</span><br><span class="line">      <span class="built_in">notifyClients</span>(sensorReadings);</span><br><span class="line">    <span class="comment">//&#125;</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">onEvent</span><span class="params">(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, <span class="type">void</span> *arg, <span class="type">uint8_t</span> *data, <span class="type">size_t</span> len)</span> </span>&#123;</span><br><span class="line">  <span class="keyword">switch</span> (type) &#123;</span><br><span class="line">    <span class="keyword">case</span> WS_EVT_CONNECT:</span><br><span class="line">      Serial.<span class="built_in">printf</span>(<span class="string">&quot;WebSocket client #%u connected from %s\n&quot;</span>, client-&gt;<span class="built_in">id</span>(), client-&gt;<span class="built_in">remoteIP</span>().<span class="built_in">toString</span>().<span class="built_in">c_str</span>());</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> WS_EVT_DISCONNECT:</span><br><span class="line">      Serial.<span class="built_in">printf</span>(<span class="string">&quot;WebSocket client #%u disconnected\n&quot;</span>, client-&gt;<span class="built_in">id</span>());</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> WS_EVT_DATA:</span><br><span class="line">      <span class="built_in">handleWebSocketMessage</span>(arg, data, len);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> WS_EVT_PONG:</span><br><span class="line">    <span class="keyword">case</span> WS_EVT_ERROR:</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">initWebSocket</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  ws.<span class="built_in">onEvent</span>(onEvent);</span><br><span class="line">  server.<span class="built_in">addHandler</span>(&amp;ws);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">115200</span>);</span><br><span class="line">  <span class="built_in">initBME</span>();</span><br><span class="line">  <span class="built_in">initWiFi</span>();</span><br><span class="line">  <span class="built_in">initFS</span>();</span><br><span class="line">  <span class="built_in">initWebSocket</span>();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Web Server Root URL</span></span><br><span class="line">  server.<span class="built_in">on</span>(<span class="string">&quot;/&quot;</span>, HTTP_GET, [](AsyncWebServerRequest *request) &#123;</span><br><span class="line">    request-&gt;<span class="built_in">send</span>(LittleFS, <span class="string">&quot;/index.html&quot;</span>, <span class="string">&quot;text/html&quot;</span>);</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  server.<span class="built_in">serveStatic</span>(<span class="string">&quot;/&quot;</span>, LittleFS, <span class="string">&quot;/&quot;</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Start server</span></span><br><span class="line">  server.<span class="built_in">begin</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="keyword">if</span> ((<span class="built_in">millis</span>() - lastTime) &gt; timerDelay) &#123;</span><br><span class="line">    String sensorReadings = <span class="built_in">getSensorReadings</span>();</span><br><span class="line">    Serial.<span class="built_in">print</span>(sensorReadings);</span><br><span class="line">    <span class="built_in">notifyClients</span>(sensorReadings);</span><br><span class="line"></span><br><span class="line">  lastTime = <span class="built_in">millis</span>();</span><br><span class="line"></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  ws.<span class="built_in">cleanupClients</span>();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://randomnerdtutorials.com/esp8266-nodemcu-websocket-server-sensor">https://randomnerdtutorials.com/esp8266-nodemcu-websocket-server-sensor</a></p>]]></content>
    
    
    <summary type="html">我们将使用I2C通信与BME280传感器模块。为此，将传感器连接到默认的ESP8266 SCL (GPIO 5) 和SDA (GPIO 4) 引脚，如下面的示意图所示。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-tft屏（52）</title>
    <link href="https://blog.jzxer.cn/20250124/20250124_tft/"/>
    <id>https://blog.jzxer.cn/20250124/20250124_tft/</id>
    <published>2025-01-24T08:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><table><thead><tr><th>名称</th><th>参数</th></tr></thead><tbody><tr><td>SKU</td><td>MSP0961</td></tr><tr><td>尺寸</td><td>0.96(inch)</td></tr><tr><td>面板材质</td><td>IPS全视角</td></tr><tr><td>驱动芯片</td><td><strong>ST7735S</strong>（注意库的驱动）</td></tr><tr><td>分辨率</td><td>160*80 (Pixel)</td></tr><tr><td>显示接口</td><td>4-line SPI interface</td></tr><tr><td>触摸类型</td><td>无触摸</td></tr><tr><td>有效显示区域(AA区)</td><td>10.80x21.70 (mm)</td></tr><tr><td>模块PCB底板尺寸</td><td>30.00x24.04 (mm)</td></tr><tr><td>工作温度</td><td>-10℃~60℃</td></tr><tr><td>功耗</td><td>TDB</td></tr><tr><td>产品重量（含包装）</td><td>8g</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><table><thead><tr><th>序号</th><th>引脚标号</th><th>说明</th></tr></thead><tbody><tr><td>1</td><td>GND</td><td>液晶屏电源地</td></tr><tr><td>2</td><td>VCC</td><td>液晶屏电源正(3.3V)</td></tr><tr><td>3</td><td>SCL</td><td>液晶屏SPI总线时钟信号</td></tr><tr><td>4</td><td>SDA</td><td>液晶屏SPI总线写数据信号</td></tr><tr><td>5</td><td>RES</td><td>液晶屏复位控制信号（低电平复位）</td></tr><tr><td>6</td><td>DC</td><td>液晶屏寄存器&#x2F;数据选择控制信号（低电平：寄存器，高电平：数据）</td></tr><tr><td>7</td><td>CS</td><td>液晶屏片选控制信号（低电平使能）</td></tr><tr><td>8</td><td>BLK</td><td>液晶屏背光控制信号（高电平点亮，如不需要控制，请接3.3V）</td></tr></tbody></table><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">5 V</td><td align="center">VCC</td></tr><tr><td align="center">D5</td><td align="center">SCL</td></tr><tr><td align="center">D7</td><td align="center">SDA</td></tr><tr><td align="center">D4</td><td align="center">RES</td></tr><tr><td align="center">D3</td><td align="center">DC</td></tr><tr><td align="center">D8</td><td align="center">CS</td></tr><tr><td align="center">3.3V</td><td align="center">BLK</td></tr></tbody></table><h2 id="TFT-eSPI-介绍"><a href="#TFT-eSPI-介绍" class="headerlink" title="TFT_eSPI 介绍"></a>TFT_eSPI 介绍</h2><h3 id="API-大全"><a href="#API-大全" class="headerlink" title="API 大全"></a>API 大全</h3><p>&#x2F;&#x2F;以下大多 API 对 Sprite 类也通用</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//初始化</span></span><br><span class="line">tft.<span class="built_in">init</span>(); </span><br><span class="line"><span class="comment">//填充全屏幕</span></span><br><span class="line">tft.<span class="built_in">fillScreen</span>(<span class="type">uint32_t</span> color); </span><br><span class="line"><span class="comment">//屏幕旋转,参数为：0, 1, 2, 3,分别代表 0°、90°、180°、270°</span></span><br><span class="line">tft.<span class="built_in">setRotation</span>(<span class="type">uint8_t</span> r);     </span><br><span class="line"><span class="comment">//设置光标位置，font是可选参数</span></span><br><span class="line">tft.<span class="built_in">setCursor</span>(<span class="type">int16_t</span> x, <span class="type">int16_t</span> y, <span class="type">uint8_t</span> font);   </span><br><span class="line"><span class="comment">//设置字体颜色</span></span><br><span class="line">tft.<span class="built_in">setTextColor</span>(<span class="type">uint16_t</span> color); </span><br><span class="line"><span class="comment">//设置文本颜色和背景色</span></span><br><span class="line">tft.<span class="built_in">setTextColor</span>(<span class="type">uint16_t</span> fgcolor, <span class="type">uint16_t</span> bgcolor);</span><br><span class="line"><span class="comment">//设置字体大小,文本大小范围为 1~7 的整数,特别注意: 字库7是仿7段数码屏的样式</span></span><br><span class="line">tft.<span class="built_in">setTextSize</span>(<span class="type">uint8_t</span> size);</span><br><span class="line"><span class="comment">//加载字体</span></span><br><span class="line">display.<span class="built_in">loadFont</span>(Final_Frontier_28);    </span><br><span class="line">     <span class="comment">//括号中为示例，大小为28像素的平滑字体。</span></span><br><span class="line">     <span class="comment">//使用平滑字体时最好用setTextColor同时设置好字体和背景颜色，否则可能会不平滑。</span></span><br><span class="line"><span class="comment">//卸载当前字体</span></span><br><span class="line">display.<span class="built_in">unloadFont</span>();</span><br><span class="line"><span class="comment">//打印</span></span><br><span class="line">tft.<span class="built_in">print</span>(<span class="string">&quot;Hello World!&quot;</span>);</span><br><span class="line">tft.<span class="built_in">println</span>(<span class="string">&quot;Hello World!&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//绘制字符串</span></span><br><span class="line"> <span class="comment">//居左</span></span><br><span class="line"> tft.<span class="built_in">drawString</span>(String, <span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">uint8_t</span> font);<span class="comment">//font是可选参数</span></span><br><span class="line"> <span class="comment">//居中</span></span><br><span class="line"> tft.<span class="built_in">drawCentreString</span>(String, <span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">uint8_t</span> font);<span class="comment">//font是可选参数</span></span><br><span class="line"> <span class="comment">//居右</span></span><br><span class="line"> tft.<span class="built_in">drawRightString</span>(String, <span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">uint8_t</span> font);<span class="comment">//font是可选参数</span></span><br><span class="line"><span class="comment">//画点</span></span><br><span class="line">tft.<span class="built_in">drawPixel</span>(<span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//画线</span></span><br><span class="line">tft.<span class="built_in">drawLine</span>(<span class="type">int32_t</span> xs, <span class="type">int32_t</span> ys, <span class="type">int32_t</span> xe, <span class="type">int32_t</span> ye, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//画横线</span></span><br><span class="line">tft.<span class="built_in">drawFastHLine</span>(<span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">int32_t</span> w, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//画竖线</span></span><br><span class="line">tft.<span class="built_in">drawFastVLine</span>(<span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">int32_t</span> h, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//画圆</span></span><br><span class="line"><span class="comment">//空心圆</span></span><br><span class="line">tft.<span class="built_in">drawCircle</span>(<span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">int32_t</span> r, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//实心圆</span></span><br><span class="line">tft.<span class="built_in">fillCircle</span>(<span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">int32_t</span> r, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//空心椭圆</span></span><br><span class="line">tft.<span class="built_in">drawEllipse</span>(<span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">int32_t</span> w, <span class="type">int32_t</span> h, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//实心椭圆</span></span><br><span class="line">tft.<span class="built_in">fillEllipse</span>(<span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">int32_t</span> w, <span class="type">int32_t</span> h, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//画矩形</span></span><br><span class="line"><span class="comment">//空心矩形</span></span><br><span class="line">tft.<span class="built_in">drawRect</span>(<span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">int32_t</span> w, <span class="type">int32_t</span> h, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//实心矩形</span></span><br><span class="line">tft.<span class="built_in">fillRect</span>(<span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">int32_t</span> w, <span class="type">int32_t</span> h, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//空心圆角矩形</span></span><br><span class="line">tft.<span class="built_in">drawRoundRect</span>(<span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">int32_t</span> w, <span class="type">int32_t</span> h, <span class="type">int32_t</span> radius, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//实心圆角矩形</span></span><br><span class="line">tft.<span class="built_in">drawRoundRect</span>(<span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">int32_t</span> w, <span class="type">int32_t</span> h, <span class="type">int32_t</span> radius, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//画三角形</span></span><br><span class="line"><span class="comment">//空心三角形</span></span><br><span class="line">tft.<span class="built_in">drawTriangle</span>(<span class="type">int32_t</span> x1, <span class="type">int32_t</span> y1, <span class="type">int32_t</span> x2, <span class="type">int32_t</span> y2, <span class="type">int32_t</span> x3, <span class="type">int32_t</span> y3, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//实心三角形</span></span><br><span class="line">tft.<span class="built_in">drawTriangle</span>(<span class="type">int32_t</span> x1, <span class="type">int32_t</span> y1, <span class="type">int32_t</span> x2, <span class="type">int32_t</span> y2, <span class="type">int32_t</span> x3, <span class="type">int32_t</span> y3, <span class="type">uint32_t</span> color);</span><br><span class="line"><span class="comment">//显示图片</span></span><br><span class="line">tft.<span class="built_in">pushImage</span>(<span class="type">int32_t</span> x, <span class="type">int32_t</span> y, <span class="type">int32_t</span> w, <span class="type">int32_t</span> h, data);</span><br></pre></td></tr></table></figure><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><h3 id="mai-cpp"><a href="#mai-cpp" class="headerlink" title="mai.cpp"></a>mai.cpp</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="comment">// New background colour</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> TFT_BROWN 0x38E0</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Pause in milliseconds between screens, change to 0 to time font rendering</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> WAIT 1000</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;TFT_eSPI.h&gt;</span> <span class="comment">// Graphics and font library for ILI9341 driver chip</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;SPI.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Wire.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;User_Setup.h&gt;</span></span></span><br><span class="line"></span><br><span class="line">TFT_eSPI tft = <span class="built_in">TFT_eSPI</span>();  <span class="comment">// Invoke library, pins defined in User_Setup.h</span></span><br><span class="line"></span><br><span class="line"><span class="type">unsigned</span> <span class="type">long</span> targetTime = <span class="number">0</span>; <span class="comment">// Used for testing draw times</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">(<span class="type">void</span>)</span> </span>&#123;</span><br><span class="line">  tft.<span class="built_in">init</span>();</span><br><span class="line">  tft.<span class="built_in">setRotation</span>(<span class="number">3</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  targetTime = <span class="built_in">millis</span>();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// First we test them with a background colour set</span></span><br><span class="line">  tft.<span class="built_in">setTextSize</span>(<span class="number">1</span>);</span><br><span class="line">  tft.<span class="built_in">fillScreen</span>(TFT_BLACK);</span><br><span class="line">  tft.<span class="built_in">setTextColor</span>(TFT_GREEN, TFT_BLACK);</span><br><span class="line"></span><br><span class="line">  tft.<span class="built_in">drawString</span>(<span class="string">&quot; !\&quot;#$%&amp;&#x27;()*+,-./0123456&quot;</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">2</span>);</span><br><span class="line">  tft.<span class="built_in">drawString</span>(<span class="string">&quot;789:;&lt;=&gt;?@ABCDEFGHIJKL&quot;</span>, <span class="number">0</span>, <span class="number">16</span>, <span class="number">2</span>);</span><br><span class="line">  tft.<span class="built_in">drawString</span>(<span class="string">&quot;MNOPQRSTUVWXYZ[\\]^_`&quot;</span>, <span class="number">0</span>, <span class="number">32</span>, <span class="number">2</span>);</span><br><span class="line">  tft.<span class="built_in">drawString</span>(<span class="string">&quot;abcdefghijklmnopqrstuvw&quot;</span>, <span class="number">0</span>, <span class="number">48</span>, <span class="number">2</span>);</span><br><span class="line">  <span class="type">int</span> xpos = <span class="number">0</span>;</span><br><span class="line">  xpos += tft.<span class="built_in">drawString</span>(<span class="string">&quot;xyz&#123;|&#125;~&quot;</span>, <span class="number">0</span>, <span class="number">64</span>, <span class="number">2</span>);</span><br><span class="line">  tft.<span class="built_in">drawChar</span>(<span class="number">127</span>, xpos, <span class="number">64</span>, <span class="number">2</span>);</span><br><span class="line">  <span class="built_in">delay</span>(WAIT);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="userSetup-h"><a href="#userSetup-h" class="headerlink" title="userSetup.h"></a>userSetup.h</h3><p>主要更改以下几个地方</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">........</span><br><span class="line"><span class="comment">// Only define one driver, the other ones must be commented out</span></span><br><span class="line"><span class="comment">// #define ILI9341_DRIVER       // Generic driver for common displays</span></span><br><span class="line"><span class="comment">//#define ILI9341_2_DRIVER     // Alternative ILI9341 driver, see https://github.com/Bodmer/TFT_eSPI/issues/1172</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ST7735_DRIVER      <span class="comment">// Define additional parameters below for this display</span></span></span><br><span class="line"><span class="comment">//#define ILI9163_DRIVER     // Define additional parameters below for this display</span></span><br><span class="line"><span class="comment">//#define S6D02A1_DRIVER</span></span><br><span class="line"><span class="comment">//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI</span></span><br><span class="line"><span class="comment">//#define HX8357D_DRIVER</span></span><br><span class="line"><span class="comment">//#define ILI9481_DRIVER</span></span><br><span class="line"><span class="comment">//#define ILI9486_DRIVER</span></span><br><span class="line"><span class="comment">//#define ILI9488_DRIVER     // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)</span></span><br><span class="line"><span class="comment">//#define ST7789_DRIVER      // Full configuration option, define additional parameters below for this display</span></span><br><span class="line"><span class="comment">//#define ST7789_2_DRIVER    // Minimal configuration option, define additional parameters below for this display</span></span><br><span class="line"><span class="comment">//#define R61581_DRIVER</span></span><br><span class="line"><span class="comment">//#define RM68140_DRIVER</span></span><br><span class="line"><span class="comment">//#define ST7796_DRIVER</span></span><br><span class="line"><span class="comment">//#define SSD1351_DRIVER</span></span><br><span class="line"><span class="comment">//#define SSD1963_480_DRIVER</span></span><br><span class="line"><span class="comment">//#define SSD1963_800_DRIVER</span></span><br><span class="line"><span class="comment">//#define SSD1963_800ALT_DRIVER</span></span><br><span class="line"><span class="comment">//#define ILI9225_DRIVER</span></span><br><span class="line"><span class="comment">//#define GC9A01_DRIVER</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Some displays support SPI reads via the MISO pin, other displays have a single</span></span><br><span class="line"><span class="comment">// bi-directional SDA pin and the library will try to read this via the MOSI line.</span></span><br><span class="line"><span class="comment">// To use the SDA line for reading data from the TFT uncomment the following line:</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// #define TFT_SDA_READ      // This option is for ESP32 ONLY, tested with ST7789 and GC9A01 display only</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display</span></span><br><span class="line"><span class="comment">// Try ONE option at a time to find the correct colour order for your display</span></span><br><span class="line"></span><br><span class="line"> <span class="meta">#<span class="keyword">define</span> TFT_RGB_ORDER TFT_RGB  <span class="comment">// Colour order Red-Green-Blue</span></span></span><br><span class="line"><span class="comment">//  #define TFT_RGB_ORDER TFT_BGR  // Colour order Blue-Green-Red</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// For ST7789, ST7735, ILI9163 and GC9A01 ONLY, define the pixel width and height in portrait orientation</span></span><br><span class="line"><span class="comment">// #define TFT_WIDTH  80</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> TFT_WIDTH  128</span></span><br><span class="line"><span class="comment">// #define TFT_WIDTH  172 // ST7789 172 x 320</span></span><br><span class="line"><span class="comment">// #define TFT_WIDTH  170 // ST7789 170 x 320</span></span><br><span class="line"><span class="comment">// #define TFT_WIDTH  240 // ST7789 240 x 240 and 240 x 320</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> TFT_HEIGHT 160</span></span><br><span class="line"><span class="comment">// #define TFT_HEIGHT 128</span></span><br><span class="line"><span class="comment">// #define TFT_HEIGHT 240 // ST7789 240 x 240</span></span><br><span class="line"><span class="comment">// #define TFT_HEIGHT 320 // ST7789 240 x 320</span></span><br><span class="line"><span class="comment">// #define TFT_HEIGHT 240 // GC9A01 240 x 240</span></span><br><span class="line">.......</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>待完善…</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="http://www.lcdwiki.com/zh/0.96inch_IPS_Module">http://www.lcdwiki.com/zh/0.96inch_IPS_Module</a></p><p><a href="https://qwqpap.com/2023/01/esp32%E4%BD%BF%E7%94%A8tft%E5%B1%8F%E5%B9%95%E5%85%A8%E8%B8%A9%E5%9D%91%E6%8C%87%E5%8D%97/">使用tft屏幕全踩坑指南</a></p>]]></content>
    
    
    <summary type="html">液晶屏电源地</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-oled屏（51）</title>
    <link href="https://blog.jzxer.cn/20250123/20250123_oled/"/>
    <id>https://blog.jzxer.cn/20250123/20250123_oled/</id>
    <published>2025-01-23T08:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>你是不是厌倦了在Arduino项目中反复使用字符LCD显示器？事实上，它们已经成为过去。进入梦幻般的OLED（有机发光二极管）显示屏！它们非常轻，几乎像纸一样薄，理论上是灵活的，可以产生更明亮、更清晰的图像。</p><p>OLED显示器有各种尺寸（例如128×64、128×32）和颜色（例如白色，蓝色和双色OLED）。一些OLED显示器具有I2C接口，而另一些则具有SPI接口。</p><p>但是，他们都有的一件事是，他们的核心是强大的单芯片CMOS OLED驱动器控制器-SSD1306，它可以处理所有RAM缓冲，因此您的Arduino几乎不需要工作。</p><p>在本教程中，我们将同时使用I2C和SPI 0.96英寸128×64 OLED显示器。不用担心您的模块是不同的尺寸或颜色；此页面上的信息仍然有用。</p><h2 id="SPI-和-I2C-怎么选？"><a href="#SPI-和-I2C-怎么选？" class="headerlink" title="SPI 和 I2C 怎么选？"></a>SPI 和 I2C 怎么选？</h2><p>SPI通常比I2C快，但需要更多的I&#x2F;O引脚。另一方面，I2C仅需要两个引脚，并且可以与其他I2C外围设备共享。因为这是引脚和速度之间的权衡，所以选择完全取决于场景需要。</p><p><img src="https://oss.jzxer.cn/blog/I2C-OLED-Display-Pinout.png" alt="i2c oled display pinout"></p><p><img src="https://oss.jzxer.cn/blog/SPI-OLED-Display-Pinout.png" alt="spi oled display pinout"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><h3 id="使用-Adafruit-SSD1306"><a href="#使用-Adafruit-SSD1306" class="headerlink" title="使用 Adafruit_SSD1306"></a>使用 Adafruit_SSD1306</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Adafruit_SSD1306.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> SDA_PIN = <span class="number">8</span>;</span><br><span class="line"><span class="type">int</span> SCL_PIN = <span class="number">9</span>;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> SCREEN_WIDTH 128 <span class="comment">// OLED display width, in pixels</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> SCREEN_HEIGHT 64 <span class="comment">// OLED display height, in pixels</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> OLED_RESET     -1 <span class="comment">// Reset pin # (or -1 if sharing Arduino reset pin)</span></span></span><br><span class="line"><span class="function">Adafruit_SSD1306 <span class="title">display</span><span class="params">(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;Wire, OLED_RESET)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">  Wire.<span class="built_in">begin</span>(SDA_PIN, SCL_PIN);</span><br><span class="line"> <span class="comment">// Clear the buffer.</span></span><br><span class="line">  display.<span class="built_in">clearDisplay</span>();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Display Text</span></span><br><span class="line">  display.<span class="built_in">setTextSize</span>(<span class="number">1</span>);</span><br><span class="line">  display.<span class="built_in">setTextColor</span>(WHITE);</span><br><span class="line">  display.<span class="built_in">setCursor</span>(<span class="number">0</span>,<span class="number">28</span>);</span><br><span class="line">  display.<span class="built_in">println</span>(<span class="string">&quot;Hello world!&quot;</span>);</span><br><span class="line">  display.<span class="built_in">display</span>();</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">2000</span>);</span><br><span class="line">  display.<span class="built_in">clearDisplay</span>();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Display Inverted Text</span></span><br><span class="line">  display.<span class="built_in">setTextColor</span>(BLACK, WHITE); <span class="comment">// &#x27;inverted&#x27; text</span></span><br><span class="line">  display.<span class="built_in">setCursor</span>(<span class="number">0</span>,<span class="number">28</span>);</span><br><span class="line">  display.<span class="built_in">println</span>(<span class="string">&quot;Hello world!&quot;</span>);</span><br><span class="line">  display.<span class="built_in">display</span>();</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">2000</span>);</span><br><span class="line">  display.<span class="built_in">clearDisplay</span>();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Changing Font Size</span></span><br><span class="line">  display.<span class="built_in">setTextColor</span>(WHITE);</span><br><span class="line">  display.<span class="built_in">setCursor</span>(<span class="number">0</span>,<span class="number">24</span>);</span><br><span class="line">  display.<span class="built_in">setTextSize</span>(<span class="number">2</span>);</span><br><span class="line">  display.<span class="built_in">println</span>(<span class="string">&quot;Hello!&quot;</span>);</span><br><span class="line">  display.<span class="built_in">display</span>();</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">2000</span>);</span><br><span class="line">  display.<span class="built_in">clearDisplay</span>();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Display Numbers</span></span><br><span class="line">  display.<span class="built_in">setTextSize</span>(<span class="number">1</span>);</span><br><span class="line">  display.<span class="built_in">setCursor</span>(<span class="number">0</span>,<span class="number">28</span>);</span><br><span class="line">  display.<span class="built_in">println</span>(<span class="number">123456789</span>);</span><br><span class="line">  display.<span class="built_in">display</span>();</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">2000</span>);</span><br><span class="line">  display.<span class="built_in">clearDisplay</span>();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Specifying Base For Numbers</span></span><br><span class="line">  display.<span class="built_in">setCursor</span>(<span class="number">0</span>,<span class="number">28</span>);</span><br><span class="line">  display.<span class="built_in">print</span>(<span class="string">&quot;0x&quot;</span>); display.<span class="built_in">print</span>(<span class="number">0xFF</span>, HEX); </span><br><span class="line">  display.<span class="built_in">print</span>(<span class="string">&quot;(HEX) = &quot;</span>);</span><br><span class="line">  display.<span class="built_in">print</span>(<span class="number">0xFF</span>, DEC);</span><br><span class="line">  display.<span class="built_in">println</span>(<span class="string">&quot;(DEC)&quot;</span>); </span><br><span class="line">  display.<span class="built_in">display</span>();</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">2000</span>);</span><br><span class="line">  display.<span class="built_in">clearDisplay</span>();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Display ASCII Characters</span></span><br><span class="line">  display.<span class="built_in">setCursor</span>(<span class="number">0</span>,<span class="number">24</span>);</span><br><span class="line">  display.<span class="built_in">setTextSize</span>(<span class="number">2</span>);</span><br><span class="line">  display.<span class="built_in">write</span>(<span class="number">3</span>);</span><br><span class="line">  display.<span class="built_in">display</span>();</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">2000</span>);</span><br><span class="line">  display.<span class="built_in">clearDisplay</span>();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Scroll full screen</span></span><br><span class="line">  display.<span class="built_in">setCursor</span>(<span class="number">0</span>,<span class="number">0</span>);</span><br><span class="line">  display.<span class="built_in">setTextSize</span>(<span class="number">1</span>);</span><br><span class="line">  display.<span class="built_in">println</span>(<span class="string">&quot;Full&quot;</span>);</span><br><span class="line">  display.<span class="built_in">println</span>(<span class="string">&quot;screen&quot;</span>);</span><br><span class="line">  display.<span class="built_in">println</span>(<span class="string">&quot;scrolling!&quot;</span>);</span><br><span class="line">  display.<span class="built_in">display</span>();</span><br><span class="line">  display.<span class="built_in">startscrollright</span>(<span class="number">0x00</span>, <span class="number">0x07</span>);</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">2000</span>);</span><br><span class="line">  display.<span class="built_in">stopscroll</span>();</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">  display.<span class="built_in">startscrollleft</span>(<span class="number">0x00</span>, <span class="number">0x07</span>);</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">2000</span>);</span><br><span class="line">  display.<span class="built_in">stopscroll</span>();</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">1000</span>);    </span><br><span class="line">  display.<span class="built_in">startscrolldiagright</span>(<span class="number">0x00</span>, <span class="number">0x07</span>);</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">2000</span>);</span><br><span class="line">  display.<span class="built_in">startscrolldiagleft</span>(<span class="number">0x00</span>, <span class="number">0x07</span>);</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">2000</span>);</span><br><span class="line">  display.<span class="built_in">stopscroll</span>();</span><br><span class="line">  display.<span class="built_in">clearDisplay</span>();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Scroll part of the screen</span></span><br><span class="line">  display.<span class="built_in">setCursor</span>(<span class="number">0</span>,<span class="number">0</span>);</span><br><span class="line">  display.<span class="built_in">setTextSize</span>(<span class="number">1</span>);</span><br><span class="line">  display.<span class="built_in">println</span>(<span class="string">&quot;Scroll&quot;</span>);</span><br><span class="line">  display.<span class="built_in">println</span>(<span class="string">&quot;some part&quot;</span>);</span><br><span class="line">  display.<span class="built_in">println</span>(<span class="string">&quot;of the screen.&quot;</span>);</span><br><span class="line">  display.<span class="built_in">display</span>();</span><br><span class="line">  display.<span class="built_in">startscrollright</span>(<span class="number">0x00</span>, <span class="number">0x00</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="使用U8g2"><a href="#使用U8g2" class="headerlink" title="使用U8g2"></a>使用U8g2</h3><blockquote><p>如果是最小系统板，建议不要用这个库,性能要求会比较高</p></blockquote><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;U8g2lib.h&gt;</span></span></span><br><span class="line"> </span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span> U8X8_HAVE_HW_SPI</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;SPI.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span> U8X8_HAVE_HW_I2C</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Wire.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 这里更改为开发板对应的引脚，当前示例以 esp32-c3 为例</span></span><br><span class="line"><span class="function">U8G2_SSD1306_128X64_NONAME_F_SW_I2C <span class="title">u8g2</span><span class="params">(U8G2_R0, <span class="comment">/* clock=*/</span> <span class="number">9</span>, <span class="comment">/* data=*/</span> <span class="number">8</span>, <span class="comment">/* reset=*/</span> U8X8_PIN_NONE)</span></span>;  </span><br><span class="line"><span class="comment">// esp8266</span></span><br><span class="line"><span class="function">U8G2_SSD1306_128X64_NONAME_F_HW_I2C <span class="title">u8g2</span><span class="params">(U8G2_R0, <span class="comment">/* reset=*/</span> U8X8_PIN_NONE)</span></span>; </span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">(<span class="type">void</span>)</span> </span>&#123;</span><br><span class="line">  u8g2.<span class="built_in">begin</span>();</span><br><span class="line"><span class="comment">//  u8x8.setFlipMode(1);   // set number from 1 to 3, the screen word will rotary 180</span></span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">(<span class="type">void</span>)</span> </span>&#123;</span><br><span class="line">  u8g2.<span class="built_in">clearBuffer</span>();                   <span class="comment">// clear the internal memory</span></span><br><span class="line">  u8g2.<span class="built_in">setFont</span>(u8g2_font_ncenB08_tr);   <span class="comment">// choose a suitable font</span></span><br><span class="line">  u8g2.<span class="built_in">drawStr</span>(<span class="number">0</span>,<span class="number">15</span>,<span class="string">&quot;Hello World!&quot;</span>);    <span class="comment">// write something to the internal memory</span></span><br><span class="line">  u8g2.<span class="built_in">sendBuffer</span>();                    <span class="comment">// transfer internal memory to the display</span></span><br><span class="line"><span class="comment">//  delay(1000);  </span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>以下是 ESP32-c3-supermini 上的表现</p><video src="https://oss.jzxer.cn/blog/IMG_20241228_092208.MOV"  width="50%" alt="esp32-c3演示" controls/><p>以下为 esp8266 上演示,可以很明显看到动画的丝滑程度相差还是蛮大的….</p><video src="https://oss.jzxer.cn/blog/1.mp4"  width="50%" alt="esp8266" controls /><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>OLED 显示屏的驱动方式主要有 I2C 和 SPI 两种，I2C 方式适合于简单的应用，而 SPI 方式适合于需要更高性能的应用。在 Arduino 上，可以使用 Adafruit_SSD1306 库来驱动 OLED 显示屏，该库提供了丰富的功能，包括显示文本、数字、ASCII 字符等。在使用该库时，需要根据具体的硬件连接方式选择合适的引脚。</p>]]></content>
    
    
    <summary type="html">OLED显示器有各种尺寸（例如128×64、128×32）和颜色（例如白色，蓝色和双色OLED）。一些OLED显示器具有I2C接口，而另一些则具有SPI接口。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-移位寄存器 74HC595（50）</title>
    <link href="https://blog.jzxer.cn/20250122/20250122_74HC595/"/>
    <id>https://blog.jzxer.cn/20250122/20250122_74HC595/</id>
    <published>2025-01-22T08:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>关于Arduino的好处之一是，它具有相当多的I&#x2F;O口。您可以连接一些按钮，传感器，伺服器等，但是随着设备的增加，有可能很快就会用完引脚。</p><p>解决方案之一就是本文介绍的–移位寄存器，该寄存器使我们可以在Arduino（或任何微控制器）中添加更多的I&#x2F;O引脚。到目前为止，最广泛使用的移位寄存器是74HC595，也称为“595”。</p><p>74HC595只用仅三个输入引脚控制八个不同的输出引脚。如果需要超过8个I&#x2F;O引脚，则可以根据需要尽可能多的链来生成大量的I&#x2F;O引脚。</p><p><img src="https://oss.jzxer.cn/blog/74x595_package-and-pinout-1024x614.png" alt="74HC595"></p><h2 id="工作原理"><a href="#工作原理" class="headerlink" title="工作原理"></a>工作原理</h2><p>74HC595具有两个8位寄存器（可以将其视为“内存容器”）。第一个称为移位寄存器，第二个称为存储&#x2F;闩锁寄存器。</p><p>每次74HC595收到时钟脉冲时，都会发生两件事：</p><ul><li>移位寄存器中包含的位通过一个位置向左移动。位0的值将其推入位1，而位1的值则将其推入位2，依此类推。</li><li>移位寄存器中的位0接受数据引脚上的当前值。在时钟脉冲的上升边缘上，如果数据引脚高，则将1推入移位寄存器，否则为0。</li></ul><p>只要74HC595被计时，这个过程就会继续。</p><p>启用闩锁引脚后，将移位寄存器的内容复制到存储&#x2F;闩锁寄存器。存储寄存器的每个位均链接到IC的输出引脚之一QA-QH。结果，每当存储寄存器中的值更改时，输出就会更改。</p><p>下面的动画将帮助你更好地理解它。</p><p><img src="https://oss.jzxer.cn/blog/74HC595-Shift-Register-Working.gif" alt="74HC595 Shift Register Working"></p><h2 id="Sipo-vs-Piso-Shift寄存器"><a href="#Sipo-vs-Piso-Shift寄存器" class="headerlink" title="Sipo vs Piso Shift寄存器"></a>Sipo vs Piso Shift寄存器</h2><p>有两种类型的移位寄存器：SIPO（并行序列）和PISO（并行在串行中）。</p><p>SIPO可用于控制大量输出，例如LED。尽管PISO可用于收集大量输入，例如按钮，类似于上面讨论的原始 arduino 控制器。</p><p>最受欢迎的SIPO芯片是74HC595，最受欢迎的PISO芯片是74HC165。</p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p><strong>SER</strong>（串行输入）引脚用于一次向移位寄存器发送一位数据。</p><p><strong>SRCLK</strong>（移位寄存器时钟）是移位寄存器的时钟，由正沿触发。这意味着这些比特在时钟的上升沿被推入。</p><p><strong>RCLK</strong>（寄存器时钟&#x2F;锁存）是一个非常重要的引脚。当该引脚被拉高时，移位寄存器的内容被复制到存储&#x2F;锁存寄存器中，最终出现在输出端。因此，锁存引脚可以看作是我们在输出端看到结果之前的最后一步。</p><p><strong>SRCLR</strong>（移位寄存器清除）引脚允许我们重置整个移位寄存器，将所有位设置为零。因为这是一个活动低引脚，我们必须将SRCLR引脚拉低以执行重置。</p><p><strong>OE</strong>（输出启用）也是一个低电平引脚：当拉高时，输出引脚被禁用（设置为高阻抗状态）。当它被拉低时，输出引脚正常工作。</p><p><strong>QA–QH（</strong>输出启用）是输出引脚。</p><p><strong>QH</strong>: 引脚输出移位寄存器的第7位。这允许您对74HC595进行链连接。如果将此引脚连接到另一个74HC595的SER引脚，并向两个IC提供相同的时钟信号，它们的行为就像一个具有16个输出的单个IC。当然，使用这种技术，您可以菊花链连接任意数量的IC。</p><p>将引脚16（VCC）和10（SRCLR）连接到Arduino的5V输出，引脚8（GND）和13（OE）连接到地。这应该使IC保持在正常工作模式。</p><p>接下来，连接将用于控制移位寄存器的三个引脚。将移位寄存器的引脚11（SRCLK）、引脚12（RCLK）和引脚14（SER）分别连接到Arduino的引脚6、5和4。</p><p>剩下的就是将LED连接到输出引脚。将每个LED的阴极（短引脚）连接到公共接地，将每个LED（长引脚）的阳极连接到其各自的移位寄存器输出引脚。</p><p><strong>不要忘记串联一个220Ω的电阻器，以保护LED免受过载。</strong></p><p>连接LED时，确保QA连接到第一个LED，QH连接到最后一个LED；否则，LED将不会以正确的顺序亮起！</p><p>下图显示了如何将所有内容连接起来。</p><p><img src="https://oss.jzxer.cn/blog/Arduino-Wiring-Fritzing-Connections-with-74HC595-Shift-Register.png" alt="Arduino Wiring Fritzing Connections with 74HC595 Shift Register"></p><table><thead><tr><th align="center">arduino</th><th align="center">74HC595</th></tr></thead><tbody><tr><td align="center">GND</td><td align="center">8（GND）、13（OE）</td></tr><tr><td align="center">5 V</td><td align="center">16（vcc）、10（SRCLR）</td></tr><tr><td align="center">pin 2</td><td align="center">14（SER）</td></tr><tr><td align="center">Pin 3</td><td align="center">12（RCLK）</td></tr><tr><td align="center">pin 4</td><td align="center">11（SRCLK）</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> latchPin = A4;      <span class="comment">// Latch pin of 74HC595 is connected to Digital pin 5</span></span><br><span class="line"><span class="type">int</span> clockPin = A3;      <span class="comment">// Clock pin of 74HC595 is connected to Digital pin 6</span></span><br><span class="line"><span class="type">int</span> dataPin = A2;       <span class="comment">// Data pin of 74HC595 is connected to Digital pin 4</span></span><br><span class="line"></span><br><span class="line">byte leds = <span class="number">0</span>;         <span class="comment">// Variable to hold the pattern of which LEDs are currently turned on or off</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="comment">// Set all the pins of 74HC595 as OUTPUT</span></span><br><span class="line">  <span class="built_in">pinMode</span>(latchPin, OUTPUT);</span><br><span class="line">  <span class="built_in">pinMode</span>(dataPin, OUTPUT);  </span><br><span class="line">  <span class="built_in">pinMode</span>(clockPin, OUTPUT);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  leds = <span class="number">0</span>;        <span class="comment">// Initially turns all the LEDs off, by giving the variable &#x27;leds&#x27; the value 0</span></span><br><span class="line">  <span class="built_in">updateShiftRegister</span>();</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">500</span>);</span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="number">8</span>; i++)        <span class="comment">// Turn all the LEDs ON one by one.</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">bitSet</span>(leds, i);                <span class="comment">// Set the bit that controls that LED in the variable &#x27;leds&#x27;</span></span><br><span class="line">    <span class="built_in">updateShiftRegister</span>();</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">500</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">updateShiftRegister</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">   <span class="built_in">digitalWrite</span>(latchPin, LOW);</span><br><span class="line">   <span class="built_in">shiftOut</span>(dataPin, clockPin, LSBFIRST, leds);</span><br><span class="line">   <span class="built_in">digitalWrite</span>(latchPin, HIGH);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://oss.jzxer.cn/blog/74HC595-Shift-Register-Sketch-Output.gif" alt="实验结果"></p><h3 id="使用PWM控制亮度"><a href="#使用PWM控制亮度" class="headerlink" title="使用PWM控制亮度"></a>使用PWM控制亮度</h3><p><img src="https://oss.jzxer.cn/blog/Arduino-PWM-Brightness-Control-Wiring-Fritzing-Connections-with-74HC595-Shift-Register.png" alt="引脚连接"></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> latchPin = A5;           <span class="comment">// Latch pin of 74HC595 is connected to Digital pin 5</span></span><br><span class="line"><span class="type">int</span> clockPin = <span class="number">6</span>;           <span class="comment">// Clock pin of 74HC595 is connected to Digital pin 6</span></span><br><span class="line"><span class="type">int</span> dataPin = A4;            <span class="comment">// Data pin of 74HC595 is connected to Digital pin 4</span></span><br><span class="line"><span class="type">int</span> outputEnablePin = A3;    <span class="comment">// OE pin of 74HC595 is connected to PWM pin 3</span></span><br><span class="line"></span><br><span class="line">byte leds = <span class="number">0</span>;              <span class="comment">// Variable to hold the pattern of which LEDs are currently turned on or off</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(latchPin, OUTPUT);</span><br><span class="line">  <span class="built_in">pinMode</span>(dataPin, OUTPUT);  </span><br><span class="line">  <span class="built_in">pinMode</span>(clockPin, OUTPUT);</span><br><span class="line">  <span class="built_in">pinMode</span>(outputEnablePin, OUTPUT); </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="built_in">setBrightness</span>(<span class="number">255</span>);</span><br><span class="line">  leds = <span class="number">0</span>;                <span class="comment">// Initially turns all the LEDs off, by giving the variable &#x27;leds&#x27; the value 0</span></span><br><span class="line">  <span class="built_in">updateShiftRegister</span>();</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">500</span>);</span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="number">8</span>; i++)        <span class="comment">// Turn all the LEDs ON one by one.</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">bitSet</span>(leds, i);                <span class="comment">// Set the bit that controls that LED in the variable &#x27;leds&#x27;</span></span><br><span class="line">    <span class="built_in">updateShiftRegister</span>();</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">500</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">for</span> (byte b = <span class="number">255</span>; b &gt; <span class="number">0</span>; b--)        <span class="comment">// Gradually fade all the LEDs back to off</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">setBrightness</span>(b);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">50</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">updateShiftRegister</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">   <span class="built_in">digitalWrite</span>(latchPin, LOW);</span><br><span class="line">   <span class="built_in">shiftOut</span>(dataPin, clockPin, LSBFIRST, leds);</span><br><span class="line">   <span class="built_in">digitalWrite</span>(latchPin, HIGH);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setBrightness</span><span class="params">(byte brightness)</span> <span class="comment">// 0 to 255</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="built_in">analogWrite</span>(outputEnablePin, <span class="number">255</span>-brightness);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>74HC595是一个8位串行输入&#x2F;并行输出移位寄存器。它允许您将数据从Arduino发送到8个或更多的输出引脚，而不需要使用Arduino的每个输出引脚。</p>]]></content>
    
    
    <summary type="html">关于Arduino的好处之一是，它具有相当多的I/O口。您可以连接一些按钮，传感器，伺服器等，但是随着设备的增加，有可能很快就会用完引脚。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-步进电机28byj（49）</title>
    <link href="https://blog.jzxer.cn/20250121/20250121_28byj_stepper/"/>
    <id>https://blog.jzxer.cn/20250121/20250121_28byj_stepper/</id>
    <published>2025-01-21T12:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>我们被步进电动机所包围，甚至没有意识到，因为它们都用于许多日常用品中，包括窗户百叶窗，3D打印机，DVD播放器，安全摄像头和CNC机器。我们离步进电动机比您想象的要近得多。</p><p>步进电动机落在传统的直流电动机和伺服电动机之间。它们可以像直流电动机一样连续旋转，并精确地定位（以离散步骤）等伺服电动机。</p><p>如果您刚开始使用步进电动机，那么28ByJ-48是一个不错的选择。它们通常配备基于ULN2003的驾驶员板，使其非常易于使用。</p><h2 id="工作原理"><a href="#工作原理" class="headerlink" title="工作原理"></a>工作原理</h2><p>每个高脉冲发送都会使线圈通电，吸引最接近齿轮的牙齿，并以称为台阶的精确和固定角度增量旋转电动机。</p><p>步进电动机在360度旋转中具有的步骤数实际上是齿轮上的牙齿数量。</p><p><img src="https://oss.jzxer.cn/blog/Stepper-Motor-Working-Animation.gif" alt="stepper motor working animation"></p><p>这些线圈的脉冲方式确定电动机的运行方式：</p><ul><li><p>脉冲的序列确定电动机的旋转方向。</p></li><li><p>脉冲的频率决定了电动机的速度。</p></li><li><p>脉冲的数量确定电动机将转向多远。</p></li></ul><p>通过以正确的序列为线圈通电，电动机旋转。</p><p><img src="https://oss.jzxer.cn/blog/28BYJ48-Stepper-Motor-Gear-Ratio-Explanation.png" alt="28BYJ48 Stepper Motor Gear Ratio Explanation"></p><h2 id="驱动连接"><a href="#驱动连接" class="headerlink" title="驱动连接"></a>驱动连接</h2><p>由于28ByJ-48步进电动机会消耗大量功率，因此无法直接由Arduino等微控制器控制。为了控制电动机，需要诸如ULN2003之类的驱动器IC；因此，该电动机通常带有基于ULN2003的驾驶员板。由于我用的是 L293D，本文会从 L293D 的使用来展开驱动说明。</p><p><img src="https://oss.jzxer.cn/blog/8e8a6bee452bc7131dc32906b42dd0d7.jpg" alt="L293D"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>28ByJ-48单极步进电动机的额定值为5V，每革命提供48个步骤。因此，将外部5V电源连接到EXT_PWR终端。</p><p><strong>不要忘记删除PWR跳线。不要忘记删除PWR跳线。不要忘记删除PWR跳线。</strong></p><p>最后，将电动机连接到步进电机端子M1-M2（端口＃1）或M3-M4（端口＃2）。我们将其连接到M3-M4。</p><p><img src="https://oss.jzxer.cn/blog/Wiring-Unipolar-Stepper-Motor-to-L293D-Motor-Shield-Arduino.png" alt="步进电机连接示意图"></p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;AFMotor.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">//每个输出旋转的步骤数</span></span><br><span class="line"><span class="comment">//根据电机规格进行更改</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> stepsPerRevolution = <span class="number">48</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// connect motor to port #2 (M3 and M4)</span></span><br><span class="line"><span class="function">AF_Stepper <span class="title">motor</span><span class="params">(stepsPerRevolution, <span class="number">2</span>)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;Stepper test!&quot;</span>);</span><br><span class="line"></span><br><span class="line">  motor.<span class="built_in">setSpeed</span>(<span class="number">10</span>);  <span class="comment">// 10 rpm   </span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;Single coil steps&quot;</span>);</span><br><span class="line">  motor.<span class="built_in">step</span>(<span class="number">100</span>, FORWARD, SINGLE); </span><br><span class="line">  motor.<span class="built_in">step</span>(<span class="number">100</span>, BACKWARD, SINGLE); </span><br><span class="line"></span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;Double coil steps&quot;</span>);</span><br><span class="line">  motor.<span class="built_in">step</span>(<span class="number">100</span>, FORWARD, DOUBLE); </span><br><span class="line">  motor.<span class="built_in">step</span>(<span class="number">100</span>, BACKWARD, DOUBLE);</span><br><span class="line"></span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;Interleave coil steps&quot;</span>);</span><br><span class="line">  motor.<span class="built_in">step</span>(<span class="number">100</span>, FORWARD, INTERLEAVE); </span><br><span class="line">  motor.<span class="built_in">step</span>(<span class="number">100</span>, BACKWARD, INTERLEAVE); </span><br><span class="line"></span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;Micrsostep steps&quot;</span>);</span><br><span class="line">  motor.<span class="built_in">step</span>(<span class="number">100</span>, FORWARD, MICROSTEP); </span><br><span class="line">  motor.<span class="built_in">step</span>(<span class="number">100</span>, BACKWARD, MICROSTEP); </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在代码的设置和循环部分中，我们只需调用下面列出的两个功能即可控制电动机的速度和方向。 </p><ul><li><strong>setSpeed（rpm）</strong>设置了电动机的速度，其中rpm是您希望步进的每分钟旋转数量。 </li><li>每次您希望电动机移动时，<strong>step(#steps, direction, steptype)<strong>函数都会调用。</strong>#steps</strong> 是您要采取的步骤的数量。<strong>direction</strong>是向前或向后，<strong>stepstyle</strong>可以是以下任何一个：<ul><li><strong>SINGLE</strong> - 一次线圈一次通电。</li><li><strong>DOUBLE</strong> - 一次启动两个线圈以进行更多的扭矩。</li><li><strong>INTERLEAVE</strong> - 在单个和双重之间进行替代，以在两者之间创建半步。这可能会导致操作更顺畅，但是由于额外的半步，速度降低了一半。</li><li><strong>MICROSTEP</strong> - 在每个整个步骤之间，相邻的线圈都会上下倾斜以创建许多微步骤。这会产生更好的分辨率和更平滑的旋转，但以扭矩为代价。</li></ul></li></ul><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>步进电机是一种非常常见的电机，广泛应用于各种场合。通过本文的学习，我们可以了解到步进电机的原理、驱动连接以及如何使用Arduino控制步进电机。希望本文对您有所帮助！</p>]]></content>
    
    
    <summary type="html">我们被步进电动机所包围，甚至没有意识到，因为它们都用于许多日常用品中，包括窗户百叶窗，3D打印机，DVD播放器，安全摄像头和CNC机器。我们离步进电动机比您想象的要近得多。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-舵机sg90（48）</title>
    <link href="https://blog.jzxer.cn/20250120/20250120_sg90/"/>
    <id>https://blog.jzxer.cn/20250120/20250120_sg90/</id>
    <published>2025-01-20T08:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>有许多电机可供选择，但为工作选择合适的电机很重要。如果您的项目需要精确定位，伺服电机通常是最佳选择。指示他们指向哪里，他们会为你做的。就这么简单！</p><p>它们在各种机器人项目中很有用，例如转向RC型号的前轮或在机器人车上旋转传感器。</p><h2 id="工作原理"><a href="#工作原理" class="headerlink" title="工作原理"></a>工作原理</h2><p>伺服器是使您可以精确控制身体运动的电动机，因为它们通常移至位置而不是不断旋转。它们很容易连接和控制，因为电动机驱动器是直接构建的。</p><p>伺服器包含通过齿轮连接到输出轴的小型直流电动机。输出轴驱动伺服喇叭，还与电位计相连。</p><p><img src="https://oss.jzxer.cn/blog/Servo-Motor-Internal-Structure-Illustration.png" alt="servo motor internal structure illustration"></p><p>电位计提供了控制单元中误差放大器的位置反馈，该放大器将电动机的当前位置与目标位置进行了比较。</p><p>为了响应错误，控制单元调整了电动机的当前位置，以使其与所需的位置匹配。</p><p>在控制工程中，这种机制被称为伺服力机制，或者简称为伺服。这是一个闭环控制系统，它使用负反馈来调整电动机的速度和方向以达到所需的结果。</p><p><img src="https://oss.jzxer.cn/blog/Servo-Motor-Closed-Loop-System-Block-Diagram.png" alt="servo motor closed loop system block diagram"></p><p><img src="https://oss.jzxer.cn/blog/Servo-Motor-Working-Animation.gif" alt="servo motor working animation"></p><blockquote><p>注意: 脉冲与位置之间的确切关系没有标准，因此您可能需要调整草图以调整伺服器的范围。而且，脉搏持续时间在品牌之间可能有所不同。例如，它可能为180度的2.5ms，0度为0.5ms。</p></blockquote><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Servo.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> servoPin = A2;</span><br><span class="line">Servo servo;</span><br><span class="line"><span class="type">int</span> angle = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    servo.<span class="built_in">attach</span>(servoPin);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(angle = <span class="number">0</span>; angle &lt; <span class="number">180</span>; angle++) &#123;</span><br><span class="line">        servo.<span class="built_in">write</span>(angle);</span><br><span class="line">        <span class="built_in">delay</span>(<span class="number">15</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">for</span>(angle = <span class="number">180</span>; angle &gt; <span class="number">0</span>; angle--) &#123;</span><br><span class="line">        servo.<span class="built_in">write</span>(angle);</span><br><span class="line">        <span class="built_in">delay</span>(<span class="number">15</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="用电位器控制"><a href="#用电位器控制" class="headerlink" title="用电位器控制"></a>用电位器控制</h3><p><img src="https://oss.jzxer.cn/blog/Connecting-Servo-Motor-to-Arduino-Uno-For-Potentiometer-Control.png" alt="connecting servo motor to arduino uno for potentiometer control"></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Servo.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> potPin = A0;</span><br><span class="line"><span class="type">int</span> servoPin = A2;</span><br><span class="line">Servo servo;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    servo.<span class="built_in">attach</span>(servoPin);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> reading = <span class="built_in">analogRead</span>(potPin);</span><br><span class="line">    <span class="type">int</span> angle = <span class="built_in">map</span>(reading, <span class="number">0</span>, <span class="number">1023</span>, <span class="number">0</span>, <span class="number">180</span>);  <span class="comment">// 映射角度</span></span><br><span class="line">    servo.<span class="built_in">write</span>(angle);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>舵机是一种非常实用的电机，可以用于各种需要精确控制位置的应用。通过简单的代码和连接，您就可以控制舵机旋转到指定的角度。如果您需要更复杂的控制，例如连续旋转或精确控制速度，您可能需要使用更高级的伺服驱动器。</p>]]></content>
    
    
    <summary type="html">有许多电机可供选择，但为工作选择合适的电机很重要。如果您的项目需要精确定位，伺服电机通常是最佳选择。指示他们指向哪里，他们会为你做的。就这么简单！</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-射频识别模块RC522（47）</title>
    <link href="https://blog.jzxer.cn/20250119/20250119_rc522/"/>
    <id>https://blog.jzxer.cn/20250119/20250119_rc522/</id>
    <published>2025-01-19T11:12:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>借助基于RFID的步行自动结帐解决方案，可以用来实现快速购物车结账。不需要再等待某人一一敲响购物车中的每个物品；现在，利用附加在项目上的RFID标签，将几乎立即检测到购物车中的每个项目。</p><p>对于大多数基于RFID的Arduino项目，RC522 RFID读取器&#x2F;写入模块是一个不错的选择。它是低功率，低成本，非常坚固，易于接入，并且在业余爱好者中非常受欢迎。</p><h2 id="工作原理"><a href="#工作原理" class="headerlink" title="工作原理"></a>工作原理</h2><p>RFID或射频标识系统由两个主要组件组成，标签添加到要识别的客户端和读取标签的服务端。</p><p>读取器由射频模块和产生高频电磁场的天线组成。而标签通常是一个被动设备（没有电池）。它由一个存储和处理信息的微芯片以及用于接收和传输信号的天线。</p><p><img src="https://oss.jzxer.cn/blog/How-RFID-Technology-Works-Reader-Writer-System-Tag-Communication.png" alt="How RFID Technology Works Reader Writer System Tag Communication"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p><img src="https://oss.jzxer.cn/blog/Arduino-Wiring-Fritzing-Connections-with-RC522-RFID-Reader-Writer-Module.png" alt="连接示意图"></p><table><thead><tr><th>RC522</th><th></th><th>Arduino</th></tr></thead><tbody><tr><td>VCC</td><td></td><td>3.3V</td></tr><tr><td>GND</td><td></td><td>GND</td></tr><tr><td>RST</td><td></td><td>A0</td></tr><tr><td>MISO &#x2F; SCL &#x2F; Tx</td><td></td><td>A5</td></tr><tr><td>MOSI</td><td></td><td>A6</td></tr><tr><td>SCK</td><td></td><td>A9</td></tr><tr><td>SS &#x2F; SDA &#x2F; Rx</td><td></td><td>A7</td></tr></tbody></table><blockquote><p>Tips: 用例使用的是 esp32-c3-supermini，对应的引脚是 A4、A5，如果在 platformIO 上开发的话，直接输入引脚名称会提示当前的引脚对应数字号。</p></blockquote><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><h3 id="写入端"><a href="#写入端" class="headerlink" title="写入端"></a>写入端</h3><p>这个是给卡片写入数据的案例。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;SPI.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;MFRC522.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> SS_PIN A7</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> RST_PIN A0</span></span><br><span class="line"></span><br><span class="line"><span class="function">MFRC522 <span class="title">mfrc522</span><span class="params">(SS_PIN, RST_PIN)</span></span>; <span class="comment">// instatiate a MFRC522 reader object.</span></span><br><span class="line">MFRC522::MIFARE_Key key;<span class="comment">// create a MIFARE_Key struct named &#x27;key&#x27;, which will hold the card information</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// this is the block number we will write into and then read.</span></span><br><span class="line"><span class="type">int</span> block = <span class="number">2</span>;</span><br><span class="line"></span><br><span class="line">byte blockcontent[<span class="number">16</span>] = &#123;<span class="string">&quot;Last-Minute-Engg&quot;</span>&#125;; <span class="comment">// an array with 16 bytes to be written into one of the 64 card blocks is defined</span></span><br><span class="line"><span class="comment">// byte blockcontent[16] = &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;;  //all zeros. This can be used to delete a block.</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// This array is used for reading out a block.</span></span><br><span class="line">byte readbackblock[<span class="number">18</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); <span class="comment">// Initialize serial communications with the PC</span></span><br><span class="line">SPI.<span class="built_in">begin</span>();<span class="comment">// Init SPI bus</span></span><br><span class="line">mfrc522.<span class="built_in">PCD_Init</span>(); <span class="comment">// Init MFRC522 card (in case you wonder what PCD means: proximity coupling device)</span></span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;Scan a MIFARE Classic card&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// Prepare the security key for the read and write functions.</span></span><br><span class="line"><span class="keyword">for</span> (byte i = <span class="number">0</span>; i &lt; <span class="number">6</span>; i++)</span><br><span class="line">&#123;</span><br><span class="line">key.keyByte[i] = <span class="number">0xFF</span>; <span class="comment">// keyByte is defined in the &quot;MIFARE_Key&quot; &#x27;struct&#x27; definition in the .h file of the library</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">// Look for new cards</span></span><br><span class="line"><span class="keyword">if</span> (!mfrc522.<span class="built_in">PICC_IsNewCardPresent</span>())</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Select one of the cards</span></span><br><span class="line"><span class="keyword">if</span> (!mfrc522.<span class="built_in">PICC_ReadCardSerial</span>())</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;card selected&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// the blockcontent array is written into the card block</span></span><br><span class="line"><span class="built_in">writeBlock</span>(block, blockcontent);</span><br><span class="line"></span><br><span class="line"><span class="comment">// read the block back</span></span><br><span class="line"><span class="built_in">readBlock</span>(block, readbackblock);</span><br><span class="line"><span class="comment">// uncomment below line if you want to see the entire 1k memory with the block written into it.</span></span><br><span class="line"><span class="comment">// mfrc522.PICC_DumpToSerial(&amp;(mfrc522.uid));</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// print the block contents</span></span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;read block: &quot;</span>);</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j &lt; <span class="number">16</span>; j++)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">write</span>(readbackblock[j]);</span><br><span class="line">&#125;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Write specific block</span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">writeBlock</span><span class="params">(<span class="type">int</span> blockNumber, byte arrayAddress[])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">// this makes sure that we only write into data blocks. Every 4th block is a trailer block for the access/security info.</span></span><br><span class="line"><span class="type">int</span> largestModulo4Number = blockNumber / <span class="number">4</span> * <span class="number">4</span>;</span><br><span class="line"><span class="type">int</span> trailerBlock = largestModulo4Number + <span class="number">3</span>; <span class="comment">// determine trailer block for the sector</span></span><br><span class="line"><span class="keyword">if</span> (blockNumber &gt; <span class="number">2</span> &amp;&amp; (blockNumber + <span class="number">1</span>) % <span class="number">4</span> == <span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">print</span>(blockNumber);</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot; is a trailer block:&quot;</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">2</span>;</span><br><span class="line">&#125;</span><br><span class="line">Serial.<span class="built_in">print</span>(blockNumber);</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot; is a data block:&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// authentication of the desired block for access</span></span><br><span class="line">byte status = mfrc522.<span class="built_in">PCD_Authenticate</span>(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &amp;key, &amp;(mfrc522.uid));</span><br><span class="line"><span class="keyword">if</span> (status != MFRC522::STATUS_OK)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;PCD_Authenticate() failed: &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">println</span>(mfrc522.<span class="built_in">GetStatusCodeName</span>(status));</span><br><span class="line"><span class="keyword">return</span> <span class="number">3</span>; <span class="comment">// return &quot;3&quot; as error message</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// writing the block</span></span><br><span class="line">status = mfrc522.<span class="built_in">MIFARE_Write</span>(blockNumber, arrayAddress, <span class="number">16</span>);</span><br><span class="line"><span class="comment">// status = mfrc522.MIFARE_Write(9, value1Block, 16);</span></span><br><span class="line"><span class="keyword">if</span> (status != MFRC522::STATUS_OK)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;MIFARE_Write() failed: &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">println</span>(mfrc522.<span class="built_in">GetStatusCodeName</span>(status));</span><br><span class="line"><span class="keyword">return</span> <span class="number">4</span>; <span class="comment">// return &quot;4&quot; as error message</span></span><br><span class="line">&#125;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;block was written&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Read specific block</span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">readBlock</span><span class="params">(<span class="type">int</span> blockNumber, byte arrayAddress[])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="type">int</span> largestModulo4Number = blockNumber / <span class="number">4</span> * <span class="number">4</span>;</span><br><span class="line"><span class="type">int</span> trailerBlock = largestModulo4Number + <span class="number">3</span>; <span class="comment">// determine trailer block for the sector</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// authentication of the desired block for access</span></span><br><span class="line">byte status = mfrc522.<span class="built_in">PCD_Authenticate</span>(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &amp;key, &amp;(mfrc522.uid));</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (status != MFRC522::STATUS_OK)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;PCD_Authenticate() failed (read): &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">println</span>(mfrc522.<span class="built_in">GetStatusCodeName</span>(status));</span><br><span class="line"><span class="keyword">return</span> <span class="number">3</span>; <span class="comment">// return &quot;3&quot; as error message</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// reading a block</span></span><br><span class="line">byte buffersize = <span class="number">18</span>;<span class="comment">// we need to define a variable with the read buffer size, since the MIFARE_Read method below needs a pointer to the variable that contains the size...</span></span><br><span class="line">status = mfrc522.<span class="built_in">MIFARE_Read</span>(blockNumber, arrayAddress, &amp;buffersize); <span class="comment">//&amp;buffersize is a pointer to the buffersize variable; MIFARE_Read requires a pointer instead of just a number</span></span><br><span class="line"><span class="keyword">if</span> (status != MFRC522::STATUS_OK)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;MIFARE_read() failed: &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">println</span>(mfrc522.<span class="built_in">GetStatusCodeName</span>(status));</span><br><span class="line"><span class="keyword">return</span> <span class="number">4</span>; <span class="comment">// return &quot;4&quot; as error message</span></span><br><span class="line">&#125;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;block was read&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="读取端"><a href="#读取端" class="headerlink" title="读取端"></a>读取端</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;SPI.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;MFRC522.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> RST_PIN 9</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> SS_PIN 10</span></span><br><span class="line"></span><br><span class="line">MFRC522 <span class="title function_">mfrc522</span><span class="params">(SS_PIN, RST_PIN)</span>; <span class="comment">// Create MFRC522 instance</span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">setup</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">Serial.begin(<span class="number">9600</span>); <span class="comment">// Initialize serial communications with the PC</span></span><br><span class="line">SPI.begin();<span class="comment">// Init SPI bus</span></span><br><span class="line">mfrc522.PCD_Init(); <span class="comment">// Init MFRC522 card (in case you wonder what PCD means: proximity coupling device)</span></span><br><span class="line">Serial.println(<span class="string">&quot;Scan a MIFARE Classic card&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">loop</span><span class="params">()</span> &#123;</span><br><span class="line"><span class="comment">// Look for new cards</span></span><br><span class="line"><span class="keyword">if</span> (!mfrc522.PICC_IsNewCardPresent())</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Select one of the cards</span></span><br><span class="line"><span class="keyword">if</span> (!mfrc522.PICC_ReadCardSerial())</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">Serial.println(<span class="string">&quot;card selected&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// print UID</span></span><br><span class="line">Serial.print(<span class="string">&quot;UID: &quot;</span>); <span class="keyword">for</span> (byte i = <span class="number">0</span>; i &lt; mfrc522.uid.size; i++) &#123;</span><br><span class="line">Serial.print(mfrc522.uid.uidByte[i] &lt; <span class="number">0x10</span> ? <span class="string">&quot; 0&quot;</span> : <span class="string">&quot; &quot;</span>);</span><br><span class="line">Serial.print(mfrc522.uid.uidByte[i], HEX);</span><br><span class="line">&#125;</span><br><span class="line">Serial.println();</span><br><span class="line"></span><br><span class="line"><span class="comment">// Halt PICC</span></span><br><span class="line">mfrc522.PICC_HaltA();</span><br><span class="line"><span class="comment">// Stop encryption on PCD</span></span><br><span class="line">mfrc522.PCD_StopCrypto1();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>RC522 是一款非接触式IC卡读写器，可以用于读取和写入MIFARE Classic卡。在本文中，我们介绍了如何使用Arduino和RC522来读取和写入MIFARE Classic卡。我们首先介绍了如何初始化RC522，然后介绍了如何读取和写入MIFARE Classic卡。最后，我们提供了一个完整的示例代码，演示了如何使用Arduino和RC522来读取和写入MIFARE Classic卡。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://blog.jzxer.cn/">dev 的艺术空间</a></p><p><a href="https://lastminuteengineers.com/how-rfid-works-rc522-arduino-tutorial/">RC522</a></p>]]></content>
    
    
    <summary type="html">借助基于RFID的步行自动结帐解决方案，可以用来实现快速购物车结账。不需要再等待某人一一敲响购物车中的每个物品；现在，利用附加在项目上的RFID标签，将几乎立即检测到购物车中的每个项目。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="esp32" scheme="https://blog.jzxer.cn/tags/esp32/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-水位传感器（46）</title>
    <link href="https://blog.jzxer.cn/20250118/20250118_water/"/>
    <id>https://blog.jzxer.cn/20250118/20250118_water/</id>
    <published>2025-01-18T08:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>如果你曾经有一个热水器爆炸或试图建造潜水电子产品，那么你就会知道检测到水的重要性。</p><p>这款水位传感器它可以用来测量水位，监测污水坑，检测降雨并检测泄漏。</p><h2 id="工作原理"><a href="#工作原理" class="headerlink" title="工作原理"></a>工作原理</h2><p><img src="https://oss.jzxer.cn/blog/Water-Level-Sensor-Working.gif" alt="原理"></p><p><img src="https://oss.jzxer.cn/blog/Water-Level-Sensor-Calibration.png" alt="状态"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> sensorPower 3</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> sensorPin A2</span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> val = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">pinMode</span>(sensorPower, OUTPUT);</span><br><span class="line"><span class="built_in">digitalWrite</span>(sensorPower, LOW);</span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="type">int</span> level = <span class="built_in">readSensor</span>();</span><br><span class="line"></span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;Water level: &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">println</span>(level);</span><br><span class="line"></span><br><span class="line"><span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">readSensor</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">digitalWrite</span>(sensorPower, HIGH); <span class="comment">// Turn the sensor ON</span></span><br><span class="line"><span class="built_in">delay</span>(<span class="number">10</span>); <span class="comment">// wait 10 milliseconds</span></span><br><span class="line">val = <span class="built_in">analogRead</span>(sensorPin); <span class="comment">// Read the analog value form sensor</span></span><br><span class="line"><span class="built_in">digitalWrite</span>(sensorPower, LOW); <span class="comment">// Turn the sensor OFF</span></span><br><span class="line"><span class="keyword">return</span> val; <span class="comment">// send current reading</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>水位传感器可以用来测量水位，监测污水坑，检测降雨并检测泄漏。</p>]]></content>
    
    
    <summary type="html">这款水位传感器它可以用来测量水位，监测污水坑，检测降雨并检测泄漏。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-土壤湿度传感器（45）</title>
    <link href="https://blog.jzxer.cn/20250117/20250117_soil_humidity/"/>
    <id>https://blog.jzxer.cn/20250117/20250117_soil_humidity/</id>
    <published>2025-01-17T07:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>当听到 “智能花园” 一词时，想到的第一件事是监视土壤水分水平并自动向植物提供必要量的水的系统。</p><p>使用该系统，只有在需要时才能浇水，避免过度或不足的植物。如果您想构建这样的系统，毫无疑问，您将需要土壤水分传感器。</p><h2 id="工作原理"><a href="#工作原理" class="headerlink" title="工作原理"></a>工作原理</h2><p>带有两个暴露导体的叉形探头充当可变电阻器（类似于电位计），其电阻随土壤含水量而变化。</p><p><img src="https://oss.jzxer.cn/blog/Soil-Moisture-Sensor-Working.gif" alt="原理图"></p><p>电阻大小随土壤水分而变化：</p><p>土壤中的水越多，电导率越好，电阻越高。</p><p>土壤中的水越少，电导率就越低，因此电阻越高。</p><p>然后传感器根据电阻产生输出电压，通过测量我们可以确定土壤水分水平。</p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin A3</td><td align="center">Digital Signal</td></tr><tr><td align="center">Pin A2</td><td align="center">Analog Signal</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> soilWet 500 <span class="comment">// Define max value we consider soil &#x27;wet&#x27;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> soilDry 750 <span class="comment">// Define min value we consider soil &#x27;dry&#x27;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> sensorPower A3</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> sensorPin A2</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">pinMode</span>(sensorPower, OUTPUT);</span><br><span class="line"><span class="built_in">digitalWrite</span>(sensorPower, LOW);</span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="type">int</span> moisture = <span class="built_in">readSensor</span>();</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;Analog Output: &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">println</span>(moisture);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (moisture &lt; soilWet)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;Status: Soil is too wet&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (moisture &gt;= soilWet &amp;&amp; moisture &lt; soilDry)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;Status: Soil moisture is perfect&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;Status: Soil is too dry - time to water!&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="built_in">delay</span>(<span class="number">1000</span>); <span class="comment">// Take a reading every second for testing</span></span><br><span class="line">Serial.<span class="built_in">println</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">readSensor</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">digitalWrite</span>(sensorPower, HIGH); <span class="comment">// Turn the sensor ON</span></span><br><span class="line"><span class="built_in">delay</span>(<span class="number">10</span>); <span class="comment">// Allow power to settle</span></span><br><span class="line"><span class="type">int</span> val = <span class="built_in">analogRead</span>(sensorPin); <span class="comment">// Read the analog value form sensor</span></span><br><span class="line"><span class="built_in">digitalWrite</span>(sensorPower, LOW); <span class="comment">// Turn the sensor OFF</span></span><br><span class="line"><span class="keyword">return</span> val; <span class="comment">// Return analog moisture value</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="拓展"><a href="#拓展" class="headerlink" title="拓展"></a>拓展</h3><p>可以搭配显示屏和蜂鸣器，做一个智能浇花系统系统。当然，如果接入钉钉通知就更好了。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>土壤湿度传感器是智能灌溉系统的重要组成部分，它可以帮助我们更好地管理植物的生长环境，提高农作物的产量和质量。通过使用土壤湿度传感器，我们可以避免过度或不足的浇水，从而减少水资源浪费和植物损伤。同时，土壤湿度传感器还可以与其他传感器和设备进行集成，实现更复杂的智能灌溉系统。</p>]]></content>
    
    
    <summary type="html">使用该系统，只有在需要时才能浇水，避免过度或不足的植物。如果您想构建这样的系统，毫无疑问，您将需要土壤水分传感器。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-麦克风前置放大器MX98357（44）</title>
    <link href="https://blog.jzxer.cn/20250116/20250116-max98357/"/>
    <id>https://blog.jzxer.cn/20250116/20250116-max98357/</id>
    <published>2025-01-16T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><img src="https://oss.jzxer.cn/blog/max98357%E6%92%AD%E6%94%BE%E6%8E%A5%E7%BA%BF%E5%9B%BE.jpg" alt="max98357播放接线图"></p><h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p>在麦克风内部，有一个薄的隔膜和背板。它们在一起形成了电容器。</p><p>当声音经过麦克风时，声音产生的声波撞到了隔膜，使其振动。</p><p>随着隔膜振动的振动，它离背板更近或远。这种运动改变了它们之间的电容。电容的这种变化会在板上产生电压，我们可以测量以确定声音的幅度。</p><p><img src="https://oss.jzxer.cn/blog/Electret-Microphone-Working.gif" alt="原理图"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://arduinogetstarted.com/tutorials/arduino-button-debounce">https://arduinogetstarted.com/tutorials/arduino-button-debounce</a></p><p><a href="https://lastminuteengineers.com/max4466-arduino-tutorial/">https://lastminuteengineers.com/max4466-arduino-tutorial/</a></p>]]></content>
    
    
    <summary type="html">max98357播放接线图</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-麦克风前置放大器MX4466（42）</title>
    <link href="https://blog.jzxer.cn/20250114/20250114_mx4466/"/>
    <id>https://blog.jzxer.cn/20250114/20250114_mx4466/</id>
    <published>2025-01-14T02:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>这是一个精心设计的模块，具有灵活的电源电压和可调节的增益，使其适用于广泛的音频应用。该模块特别适用于实时语音更换器，音频录制&#x2F;采样以及使用快速傅立叶变换（FFT）算法的音频反应性项目。</p><h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p>在麦克风内部，有一个薄的隔膜和背板。它们在一起形成了电容器。</p><p>当声音经过麦克风时，声音产生的声波撞到了隔膜，使其振动。</p><p>随着隔膜振动的振动，它离背板更近或远。这种运动改变了它们之间的电容。电容的这种变化会在板上产生电压，我们可以测量以确定声音的幅度。</p><p><img src="https://oss.jzxer.cn/blog/Electret-Microphone-Working.gif" alt="原理图"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><p>下面介绍一个简单的驱动示例</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> sampleWindow = <span class="number">50</span>;  <span class="comment">// Sample window width in mS (50 mS = 20Hz)</span></span><br><span class="line"><span class="type">int</span> <span class="type">const</span> AMP_PIN = A2;       <span class="comment">// Preamp output pin connected to A0</span></span><br><span class="line"><span class="type">unsigned</span> <span class="type">int</span> sample;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="type">unsigned</span> <span class="type">long</span> startMillis = <span class="built_in">millis</span>(); <span class="comment">// Start of sample window</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> peakToPeak = <span class="number">0</span>;   <span class="comment">// peak-to-peak level</span></span><br><span class="line"></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> signalMax = <span class="number">0</span>;</span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> signalMin = <span class="number">1024</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// collect data for 50 mS and then plot data</span></span><br><span class="line">  <span class="keyword">while</span> (<span class="built_in">millis</span>() - startMillis &lt; sampleWindow)</span><br><span class="line">  &#123;</span><br><span class="line">    sample = <span class="built_in">analogRead</span>(AMP_PIN);</span><br><span class="line">    <span class="keyword">if</span> (sample &lt; <span class="number">1024</span>)  <span class="comment">// toss out spurious readings</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> (sample &gt; signalMax)</span><br><span class="line">      &#123;</span><br><span class="line">        signalMax = sample;  <span class="comment">// save just the max levels</span></span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">else</span> <span class="keyword">if</span> (sample &lt; signalMin)</span><br><span class="line">      &#123;</span><br><span class="line">        signalMin = sample;  <span class="comment">// save just the min levels</span></span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  peakToPeak = signalMax - signalMin;  <span class="comment">// max - min = peak-peak amplitude</span></span><br><span class="line">  Serial.<span class="built_in">println</span>(peakToPeak);</span><br><span class="line">  <span class="comment">//double volts = (peakToPeak * 5.0) / 1024;  // convert to volts</span></span><br><span class="line">  <span class="comment">//Serial.println(volts);</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="拓展"><a href="#拓展" class="headerlink" title="拓展"></a>拓展</h3><p>这个模块可以通过和 LED 连接做一个类似光随声动的项目。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>MX4466 是一个简单易用的麦克风前置放大器模块，适用于各种音频应用。通过简单的引脚连接和代码示例，可以轻松实现音频信号的采集和处理。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://arduinogetstarted.com/tutorials/arduino-button-debounce">https://arduinogetstarted.com/tutorials/arduino-button-debounce</a></p><p><a href="https://lastminuteengineers.com/max4466-arduino-tutorial/">https://lastminuteengineers.com/max4466-arduino-tutorial/</a></p>]]></content>
    
    
    <summary type="html">这是一个精心设计的模块，具有灵活的电源电压和可调节的增益，使其适用于广泛的音频应用。该模块特别适用于实时语音更换器，音频录制/采样以及使用快速傅立叶变换（FFT）算法的音频反应性项目。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-游戏手柄 adkeyboard（41）</title>
    <link href="https://blog.jzxer.cn/20250113/20250113_ad_keyboard/"/>
    <id>https://blog.jzxer.cn/20250113/20250113_ad_keyboard/</id>
    <published>2025-01-13T09:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>游戏</p><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;ezAnalogKeypad.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="function">ezAnalogKeypad <span class="title">keypad</span><span class="params">(A2)</span></span>;  <span class="comment">// create ezAnalogKeypad object that attach to pin A0</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// MUST READ: You MUST run the calibration example, press key one-by-one to get the analog values</span></span><br><span class="line">  <span class="comment">// The below values is just an example, your keypad&#x27;s value may be different</span></span><br><span class="line">  keypad.<span class="built_in">setNoPressValue</span>(<span class="number">0</span>);  <span class="comment">// analog value when no key is pressed</span></span><br><span class="line">  keypad.<span class="built_in">registerKey</span>(<span class="string">&#x27;1&#x27;</span>, <span class="number">100</span>); <span class="comment">// analog value when the key &#x27;1&#x27; is pressed</span></span><br><span class="line">  keypad.<span class="built_in">registerKey</span>(<span class="string">&#x27;2&#x27;</span>, <span class="number">150</span>); <span class="comment">// analog value when the key &#x27;2&#x27; is pressed</span></span><br><span class="line">  keypad.<span class="built_in">registerKey</span>(<span class="string">&#x27;3&#x27;</span>, <span class="number">200</span>); <span class="comment">// analog value when the key &#x27;3&#x27; is pressed</span></span><br><span class="line">  keypad.<span class="built_in">registerKey</span>(<span class="string">&#x27;4&#x27;</span>, <span class="number">250</span>); <span class="comment">// analog value when the key &#x27;4&#x27; is pressed</span></span><br><span class="line">  keypad.<span class="built_in">registerKey</span>(<span class="string">&#x27;*&#x27;</span>, <span class="number">450</span>); <span class="comment">// analog value when the key &#x27;*&#x27; is pressed</span></span><br><span class="line">  keypad.<span class="built_in">registerKey</span>(<span class="string">&#x27;0&#x27;</span>, <span class="number">500</span>); <span class="comment">// analog value when the key &#x27;0&#x27; is pressed</span></span><br><span class="line">  keypad.<span class="built_in">registerKey</span>(<span class="string">&#x27;#&#x27;</span>, <span class="number">550</span>); <span class="comment">// analog value when the key &#x27;#&#x27; is pressed</span></span><br><span class="line">  keypad.<span class="built_in">registerKey</span>(<span class="string">&#x27;d9&#x27;</span>, <span class="number">4095</span>); <span class="comment">// analog value when the key &#x27;#&#x27; is pressed</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="type">unsigned</span> <span class="type">char</span> key = keypad.<span class="built_in">getKey</span>();</span><br><span class="line">  <span class="keyword">if</span> (key) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(key);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">游戏手柄</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>《精益副业》阅读笔记</title>
    <link href="https://blog.jzxer.cn/20250113/20250113_focus_parttime_job/"/>
    <id>https://blog.jzxer.cn/20250113/20250113_focus_parttime_job/</id>
    <published>2025-01-13T02:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>重新打磨对于副业的认识。以及如何优雅的开启一个副业？实现低付出高收益。这个内容不光体现在副业上，即使是作为主业，也具有一定的参考意义。</p><h2 id="流程"><a href="#流程" class="headerlink" title="流程"></a>流程</h2><h3 id="商业模式画布"><a href="#商业模式画布" class="headerlink" title="商业模式画布"></a>商业模式画布</h3><p>我们需要针对用户的痛点，找到需求，实现我们的价值主张。</p><img src="https://oss.jzxer.cn/blog/9750c7270996b4b3418ed4716e9108072b7b2676188813eced11e4796ebbb0d8.png" alt="商业画布" style="zoom:50%;" /><img src="https://oss.jzxer.cn/blog/image-20250113110023125.png" alt="商业模式画布翻译" style="zoom:50%;" /><h3 id="价值主张画布"><a href="#价值主张画布" class="headerlink" title="价值主张画布"></a>价值主张画布</h3><p>【价值主张】：作为一个商业模式最重要的一环，根据用户的痛点提出解决方案，从而构建一个完善的产品链路来服务用户。从中收取一定的报酬达到获得收益。</p><blockquote><p>Tips: 针对不同的用户群体有不同的客户细分，也就是更垂直于固定群体的价值主张。</p></blockquote><p><img src="https://oss.jzxer.cn/blog/40c7f0651751c07084942a525f4493f7f5722d10e4ad3c3043c2807b05b4f1a7.png" alt="价值主张"></p><h3 id="最小可信性产品"><a href="#最小可信性产品" class="headerlink" title="最小可信性产品"></a>最小可信性产品</h3><p>在了解到了用户痛点之后，提出一个<strong>最小可行</strong>解决方案，在这个方案上丢入市场进行<strong>测试</strong>。</p><p>这个过程叫价值假设的验证，其中最重要的两个关键字是：<strong>最小、可行。</strong></p><p>在这个验证得到证实之后，就会得到所谓的<strong>产品与市场的契合度（Product-Market Fit，缩写为 PMF））</strong>。来给我们接下来的判断做为参考。在PMF得到有效验证之前，我们专注的都是在价值假设的验证上，而不是功能的丰富度。</p><p><img src="https://oss.jzxer.cn/blog/00441d19139213da4e96cf4c512c25e008b0cb9174d9ef87850d25e02f2241ff.png" alt="最小可信性产品开发流程"></p><blockquote><p><strong>最小可信性产品的开发模式，不要在完美上去追求商业价值，而是循序渐进的找到用户需求，快速响应。</strong></p></blockquote><h2 id="实践经验"><a href="#实践经验" class="headerlink" title="实践经验"></a>实践经验</h2><h3 id="商业设计"><a href="#商业设计" class="headerlink" title="商业设计"></a>商业设计</h3><p>通常来讲，我们会面临的抉择，往往是在两类截然不同的设计之间。一类剑走偏锋、足够深刻，能理解它的一类人特别地喜欢，而不理解的又特别讨厌它；另一类设计，<strong>看似中庸，然而平中见奇，不同层次的人都可以看到自己喜欢的点。</strong></p><p>如果这个设计要拿去参加艺术大赛，可能前者更合适。但如果用于商业产品，那我觉得应该选择后者。因为归根结底，它是用来承载功能、向客户传递品牌质感的，而不是要体现它自身有多深刻，那样反而喧宾夺主了。</p><p><strong>商业更多的是对市场的妥协，另类是个性的体现，两者需要区分开来。</strong></p><h3 id="简洁既美"><a href="#简洁既美" class="headerlink" title="简洁既美"></a>简洁既美</h3><p>每个人的兴趣和爱好都是不同的，要做一个设计或者塑造一种风格，让绝大部分人都喜欢上是很难的。但我们幸运的发现，设计如果足够简洁的话，就不容易包含太多触发各种反感的点，更容易获得绝大部分人的喜爱。</p><p>而对于副业来讲，简洁风格的方案所需要的设计和开发资源都相对较少，配合起来又比较容易协调，所以简洁风格是我们的首选。</p><h3 id="设计通用的四大原则"><a href="#设计通用的四大原则" class="headerlink" title="设计通用的四大原则"></a>设计通用的四大原则</h3><p>这四个原则分别是<strong>「重复」，「对比」，「对齐」和「亲密性」。</strong></p><h3 id="2A3R漏斗和增长优化"><a href="#2A3R漏斗和增长优化" class="headerlink" title="2A3R漏斗和增长优化"></a>2A3R漏斗和增长优化</h3><p>用户从了解产品到转化付费的过程。</p><img src="https://oss.jzxer.cn/blog/50235337647e114f8f3cbcbd57e52728ff49ed4c5875dabd31f9d5c13c50361e.png" alt="用户转化模型" style="zoom:33%;" /><p>优化方向包括：</p><ol><li><strong>获客层：</strong>我们可以加大推广力度，让访问人数从十万变成一百万，这样就能卖掉一万套软件了。</li><li><strong>留存层：</strong>我们可以优化「用户登入」环节，在微信里边做成自动登录，这样把原来 10% 的激活转化提高为 30%，这样即使依然是 10 万访客，销售额也会变为 3000 套。</li><li><strong>付费层：</strong>我们可以强化「付费转化」环节，给第一次访问的用户一个限时折扣，比如 1 个小时内购买，买一送一。如果能拉升 10% 的支付转化，我们的销售也会上升。</li></ol><h4 id="留存层优化"><a href="#留存层优化" class="headerlink" title="留存层优化"></a>留存层优化</h4><p>留存层优化主要用于一些基于高粘度增长引擎的业务，或者免费+付费模式的产品。在这些模式下，用户需要经过很长时间的使用，才会付费。如果留存做不好，用户熬不到付费那天。</p><p>对于福利单词而言，留存层优化可以通过推送通知、定时提醒等功能来做。因为背单词本来就是一个周期性行为，所以我们有足够的理由去召回用户。</p><h4 id="推荐层优化"><a href="#推荐层优化" class="headerlink" title="推荐层优化"></a>推荐层优化</h4><p>现在的流量已经是非常贵的了，所以我们必须珍惜每一滴流量。通过旧用户带来新用户，可以为我们提供免费流量；如果做得足够好，流量甚至能像滚雪球一样不断变大。这就是推荐层优化要做的事情。</p><p>在我们的应用中，我们可以选择几个用户情绪高涨的点来做分享触发：</p><ol><li>完成当天的背单词目标，比如背了 100 个单词</li><li>完成有挑战的任务，比如连续 30 个单词不出错</li><li>看到赏心悦目的图片，比如看到超级呆萌的猫</li></ol><p>在这些时刻，我们都可以引导用户通过海报来分享他们的激动心情，同时为我们带来新的用户。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p><strong>商业的本质是找到用户的痛点，缓解对方的痛苦。来实现交易。</strong></p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p>《增长黑客》：系统化地讲述了如果建立增长实验机制并从中受益。</p><p>《病毒循环》：记录了众多流量传奇。</p>]]></content>
    
    
    <summary type="html">重新打磨对于副业的认识。以及如何优雅的开启一个副业？实现低付出高收益。这个内容不光体现在副业上，即使是作为主业，也具有一定的参考意义。</summary>
    
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/categories/%E9%98%85%E8%AF%BB/"/>
    
    
    <category term="创业" scheme="https://blog.jzxer.cn/tags/%E5%88%9B%E4%B8%9A/"/>
    
    <category term="金融" scheme="https://blog.jzxer.cn/tags/%E9%87%91%E8%9E%8D/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-手扫挥手感应开关模块（40）</title>
    <link href="https://blog.jzxer.cn/20250112/20250112_hand_wave_sensor/"/>
    <id>https://blog.jzxer.cn/20250112/20250112_hand_wave_sensor/</id>
    <published>2025-01-12T09:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该传感器不需要编程即可使用，傻瓜式接入。</p><img src="https://oss.jzxer.cn/blog/截屏2024-12-21 17.52.15.png" alt="连接" style="zoom:50%;" /><img src="https://oss.jzxer.cn/blog/截屏2024-12-21 17.49.41.png" alt="连接" style="zoom:50%;" /><h2 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> sensorPin = <span class="number">2</span>; <span class="comment">//定义传感器连接的引脚</span></span><br><span class="line"><span class="type">int</span> sensorValue = <span class="number">0</span>; <span class="comment">//定义传感器数值</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">setup</span><span class="params">()</span> &#123;</span><br><span class="line">  Serial.begin(<span class="number">9600</span>); <span class="comment">//初始化串口通信</span></span><br><span class="line">  pinMode(sensorPin, INPUT); <span class="comment">//设置传感器引脚为输入模式</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="type">void</span> <span class="title function_">loop</span><span class="params">()</span> &#123;</span><br><span class="line">  </span><br><span class="line">  sensorValue = digitalRead(sensorPin); <span class="comment">//读取传感器数值</span></span><br><span class="line">  <span class="keyword">if</span> (sensorValue == HIGH) &#123; <span class="comment">//如果传感器检测到挥手</span></span><br><span class="line">    Serial.println(<span class="string">&quot;挥手&quot;</span>); <span class="comment">//串口输出挥手信息</span></span><br><span class="line">  &#125;</span><br><span class="line">  delay(<span class="number">100</span>); <span class="comment">//延时100毫秒</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>该传感器不需要编程即可使用，傻瓜式接入。</p>]]></content>
    
    
    <summary type="html">该传感器不需要编程即可使用，傻瓜式接入。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-微型热释电人体红外传感器（39）</title>
    <link href="https://blog.jzxer.cn/20250111/20250111_sr312_body_sensor/"/>
    <id>https://blog.jzxer.cn/20250111/20250111_sr312_body_sensor/</id>
    <published>2025-01-11T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><img src="https://oss.jzxer.cn/blog/hc-sr312-miniature-human-body-sensor-module-pir-module-infrared-module-pyroelectric-human-body-infrared-sensor_2048x.jpg" alt="引脚示例"></p><p><img src="https://oss.jzxer.cn/blog/O1CN015xywmr1GJl2iCVhjK_!!3459570602.jpg" alt="img"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> pin = <span class="number">2</span>; </span><br><span class="line"><span class="type">int</span> value;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(pin, INPUT); </span><br><span class="line">  <span class="built_in">digitalWrite</span>(pin, HIGH);</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  value = <span class="built_in">digitalRead</span>(pin); </span><br><span class="line">  <span class="keyword">if</span> (value == LOW) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;Signal detected!&quot;</span>);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 100 ms break</span></span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 10 ms break</span></span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;No signal detected!&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>HC-SR312是基于红外线技术的自动控制模块，专用于感应周围人体的存在。</p>]]></content>
    
    
    <summary type="html">HC-SR312是基于红外线技术的自动控制模块，专用于感应周围人体的存在。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-ws2812LED（38）</title>
    <link href="https://blog.jzxer.cn/20250110/20250110_WS2812_LED_strip/"/>
    <id>https://blog.jzxer.cn/20250110/20250110_WS2812_LED_strip/</id>
    <published>2025-01-10T07:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>一个基于 WS2812 驱动的 LED 灯带模块。</p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">D1</td></tr><tr><td align="center">5 V</td><td align="center">4-7VDC</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><blockquote><p>注意：如果是串联的话就是灯带 1 的 D1接灯带 2 的 D0，因为 D1 是输入口，D0 是输出口。</p></blockquote><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><p>通过修改 NUMPIXELS 的数量，理论可以控制无数个灯的显示状态</p><h3 id="普通动画"><a href="#普通动画" class="headerlink" title="普通动画"></a>普通动画</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Adafruit_NeoPixel.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 控制 WS2812 灯条的引脚编号</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PIN 2</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义控制的 LED 数量</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> NUMPIXELS 8</span></span><br><span class="line"></span><br><span class="line"><span class="function">Adafruit_NeoPixel <span class="title">pixels</span><span class="params">(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 相邻 LED 之间的延迟，单位毫秒</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> DELAYVAL 500</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.</span></span><br><span class="line">  <span class="comment">// Any other board, you can remove this part (but no harm leaving it):</span></span><br><span class="line"><span class="meta">#<span class="keyword">if</span> defined(__AVR_ATtiny85__) &amp;&amp; (F_CPU == 16000000)</span></span><br><span class="line"><span class="built_in">clock_prescale_set</span>(clock_div_1);</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="comment">// END of Trinket-specific code.</span></span><br><span class="line"></span><br><span class="line">  pixels.<span class="built_in">begin</span>(); <span class="comment">// INITIALIZE NeoPixel strip object (REQUIRED)</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 在这里编写你的代码，控制LED灯条的亮灭和颜色</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">pixels.<span class="built_in">clear</span>(); <span class="comment">// Set all pixel colors to &#x27;off&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// The first NeoPixel in a strand is #0, second is 1, all the way up</span></span><br><span class="line"><span class="comment">// to the count of pixels minus one.</span></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; NUMPIXELS; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255</span></span><br><span class="line"><span class="comment">// Here we&#x27;re using a moderately bright green color:</span></span><br><span class="line">pixels.<span class="built_in">setPixelColor</span>(i, pixels.<span class="built_in">Color</span>(<span class="number">150</span>, <span class="number">150</span>, <span class="number">20</span>));</span><br><span class="line">pixels.<span class="built_in">show</span>(); <span class="comment">// Send the updated pixel colors to the hardware.</span></span><br><span class="line"><span class="built_in">delay</span>(DELAYVAL); <span class="comment">// Pause before next pass through loop</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://oss.jzxer.cn/blog/WS2812B-Simple-Color-Wipe.gif" alt="结果"></p><h3 id="彩虹条"><a href="#彩虹条" class="headerlink" title="彩虹条"></a>彩虹条</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Adafruit_NeoPixel.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PIN 2</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> NUMPIXELS 8</span></span><br><span class="line"></span><br><span class="line"><span class="function">Adafruit_NeoPixel <span class="title">pixels</span><span class="params">(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  pixels.<span class="built_in">begin</span>(); </span><br><span class="line">  pixels.<span class="built_in">setBrightness</span>(<span class="number">10</span>);</span><br><span class="line">  pixels.<span class="built_in">show</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">for</span>(<span class="type">long</span> firstPixelHue = <span class="number">0</span>; firstPixelHue &lt; <span class="number">5</span>*<span class="number">65536</span>; firstPixelHue += <span class="number">256</span>) &#123;</span><br><span class="line">    pixels.<span class="built_in">rainbow</span>(firstPixelHue);</span><br><span class="line">    pixels.<span class="built_in">show</span>();</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">10</span>);  </span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://oss.jzxer.cn/blog/WS2812B-Rainbow-Cycle-20241224224255168.gif" alt="ws2812b rainbow cycle"></p><h3 id="跑马灯"><a href="#跑马灯" class="headerlink" title="跑马灯"></a>跑马灯</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Adafruit_NeoPixel.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 控制 WS2812 灯条的引脚编号</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PIN 2</span></span><br><span class="line"><span class="comment">// 定义控制的 LED 数量</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> NUMPIXELS 8</span></span><br><span class="line"></span><br><span class="line"><span class="function">Adafruit_NeoPixel <span class="title">strip</span><span class="params">(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  strip.<span class="built_in">begin</span>();</span><br><span class="line">  strip.<span class="built_in">setBrightness</span>(<span class="number">10</span>);</span><br><span class="line">  strip.<span class="built_in">show</span>(); </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">theaterChase</span><span class="params">(<span class="type">uint32_t</span> color, <span class="type">int</span> wait)</span> </span>&#123;</span><br><span class="line">  <span class="keyword">for</span>(<span class="type">int</span> a=<span class="number">0</span>; a&lt;<span class="number">10</span>; a++) &#123; </span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> b=<span class="number">0</span>; b&lt;<span class="number">3</span>; b++) &#123;</span><br><span class="line">      strip.<span class="built_in">clear</span>();         </span><br><span class="line">      <span class="keyword">for</span>(<span class="type">int</span> c=b; c&lt;strip.<span class="built_in">numPixels</span>(); c += <span class="number">3</span>) &#123;</span><br><span class="line">        strip.<span class="built_in">setPixelColor</span>(c, color); </span><br><span class="line">      &#125;</span><br><span class="line">      strip.<span class="built_in">show</span>();</span><br><span class="line">      <span class="built_in">delay</span>(wait); </span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="built_in">theaterChase</span>(strip.<span class="built_in">Color</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>), <span class="number">50</span>); <span class="comment">// White</span></span><br><span class="line">  <span class="built_in">theaterChase</span>(strip.<span class="built_in">Color</span>(<span class="number">255</span>,   <span class="number">0</span>,   <span class="number">0</span>), <span class="number">50</span>); <span class="comment">// Red</span></span><br><span class="line">  <span class="built_in">theaterChase</span>(strip.<span class="built_in">Color</span>(  <span class="number">0</span>,   <span class="number">0</span>, <span class="number">255</span>), <span class="number">50</span>); <span class="comment">// Blue</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://oss.jzxer.cn/blog/WS2812B-Theater-Marquee-Chasing-Lights.gif" alt="ws2812b theater marquee chasing lights"></p><h3 id="雪花"><a href="#雪花" class="headerlink" title="雪花"></a>雪花</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Adafruit_NeoPixel.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 控制 WS2812 灯条的引脚编号</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PIN 2</span></span><br><span class="line"><span class="comment">// 定义控制的 LED 数量</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> NUMPIXELS 8</span></span><br><span class="line"></span><br><span class="line"><span class="function">Adafruit_NeoPixel <span class="title">strip</span><span class="params">(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  strip.<span class="built_in">begin</span>(); <span class="comment">// INITIALIZE NeoPixel strip object (REQUIRED)</span></span><br><span class="line">  strip.<span class="built_in">setBrightness</span>(<span class="number">10</span>); <span class="comment">// Set BRIGHTNESS to about 4% (max = 255)</span></span><br><span class="line">  strip.<span class="built_in">show</span>();            <span class="comment">// Initialize all pixels to &#x27;off&#x27;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="type">int</span> pixel[<span class="number">60</span>];</span><br><span class="line">  <span class="keyword">for</span>(<span class="type">int</span> p=<span class="number">0</span>; p&lt;<span class="number">60</span>; p++)&#123;</span><br><span class="line">    pixel[p] = <span class="built_in">random</span>(<span class="number">0</span>,<span class="number">255</span>); </span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// Run some snowflake cycles</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> j=<span class="number">0</span>; j&lt;<span class="number">200</span>; j++) &#123;</span><br><span class="line">    <span class="comment">// Every five cycles, light a new pixel</span></span><br><span class="line">    <span class="keyword">if</span>((j%<span class="number">5</span>)==<span class="number">0</span>)&#123;</span><br><span class="line">      strip.<span class="built_in">setPixelColor</span>(<span class="built_in">random</span>(<span class="number">0</span>,<span class="number">60</span>), <span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// Dim all pixels by 10</span></span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> p=<span class="number">0</span>; p&lt;<span class="number">60</span>; p++)&#123;</span><br><span class="line">      strip.<span class="built_in">setPixelColor</span>(p, pixel[p],pixel[p],pixel[p] );</span><br><span class="line">      pixel[p] =  pixel[p] - <span class="number">10</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    strip.<span class="built_in">show</span>();</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://oss.jzxer.cn/blog/WS2812B-Snowflakes.gif" alt="ws2812b snowflakes"></p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>WS2812B 是一款非常实用的 LED 灯带模块，它具有低功耗、高亮度、易控制等特点，非常适合用于各种照明和装饰项目。通过使用 Arduino 和 Adafruit NeoPixel 库，我们可以轻松地控制 WS2812B 灯带的亮灭和颜色，实现各种炫酷的动画效果。</p>]]></content>
    
    
    <summary type="html">一个基于 WS2812 驱动的 LED 灯带模块。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-GPS北斗定位多卫星系统导航GNSS模块（37）</title>
    <link href="https://blog.jzxer.cn/20250109/20250109-gps/"/>
    <id>https://blog.jzxer.cn/20250109/20250109-gps/</id>
    <published>2025-01-09T08:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>淘宝上买的一款 GPS 定位芯片</p><p><img src="https://oss.jzxer.cn/blog/O1CN01iof3oT27Z2Fv9YG61_!!3201337810.jpg" alt="引脚款"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p><img src="https://oss.jzxer.cn/blog/O1CN01cWFyqN27Z2Fv8HVfU_!!3201337810.jpg" alt="引脚定义"></p><p><img src="https://oss.jzxer.cn/blog/O1CN01oZbzpC27Z2FwE2ODW_!!3201337810.jpg" alt="引脚说明"></p><p><img src="https://oss.jzxer.cn/blog/O1CN01rjRF3t27Z2FulsQfx_!!3201337810.jpg" alt="基础参数"></p><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;SoftwareSerial.h&gt;</span></span></span><br><span class="line"></span><br><span class="line">SoftwareSerial <span class="title function_">mySerial</span><span class="params">(<span class="number">2</span>, <span class="number">3</span>)</span>; <span class="comment">// RX, TX</span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">setup</span><span class="params">()</span> &#123;</span><br><span class="line">  Serial.begin(<span class="number">9600</span>);</span><br><span class="line">  <span class="keyword">while</span> (!Serial);</span><br><span class="line">  mySerial.begin(<span class="number">9600</span>);</span><br><span class="line">  <span class="keyword">while</span> (!mySerial);</span><br><span class="line">  Serial.println(<span class="string">&quot;The GPS is ready to read!&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">loop</span><span class="params">()</span> &#123;</span><br><span class="line">  <span class="keyword">if</span> (mySerial.available()) &#123;</span><br><span class="line">    Serial.write(mySerial.read());</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (Serial.available()) &#123;</span><br><span class="line">    mySerial.write(Serial.read());</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2>]]></content>
    
    
    <summary type="html">淘宝上买的一款 GPS 定位芯片</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-热释电人体红外传感器（36）</title>
    <link href="https://blog.jzxer.cn/20250108/20250108_touch/"/>
    <id>https://blog.jzxer.cn/20250108/20250108_touch/</id>
    <published>2025-01-08T08:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>电容式触摸传感器模块基于专用TTP223触摸传感器IC。该模块提供了一个11 x 10.5mm的集成触摸感应区域，传感器范围约为5mm。当触发传感器时，板载LED将点亮。触发后，模块输出将从其空闲的低电平切换到高电平。通过焊接跳线允许将其工作模式重新配置为低电平有效或触发输出。</p><p>TTP223是1键触摸板检测器IC，适用于检测电容性元件的变化。它功耗非常低，工作电压仅为2.0V〜5.5V。快速模式下的响应时间最大约为60mS，低功耗模式下@ VDD &#x3D; 3V的响应时间为220mS。灵敏度可以通过外部电容（0〜50pF）来调节。</p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> pin = <span class="number">2</span>; </span><br><span class="line"><span class="type">int</span> value;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(pin, INPUT); </span><br><span class="line">  <span class="built_in">digitalWrite</span>(pin, HIGH);</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  value = <span class="built_in">digitalRead</span>(pin); </span><br><span class="line">  <span class="keyword">if</span> (value == LOW) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;Signal detected!&quot;</span>);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 100 ms break</span></span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 10 ms break</span></span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;No signal detected!&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>该模块可以用于检测人体接近，可以作为触摸开关使用，也可以用于其他需要检测人体接近的应用场景。</p>]]></content>
    
    
    <summary type="html">该模块提供了一个11 x 10.5mm的集成触摸感应区域，传感器范围约为5mm。当触发传感器时，板载LED将点亮。触发后，模块输出将从其空闲的低电平切换到高电平。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-热释电人体红外传感器（35）</title>
    <link href="https://blog.jzxer.cn/20250107/20250107_body_sensor/"/>
    <id>https://blog.jzxer.cn/20250107/20250107_body_sensor/</id>
    <published>2025-01-07T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>HC-SR602是基于红外线技术的自动控制模块，专用于感应周围人体的存在。该模块相较于HC-SR501，灵敏度较高，抗干扰能力大，且简单易用。</p><p><img src="https://oss.jzxer.cn/blog/O1CN01IyPszp1GJlOiHA6I5_!!3459570602.png" alt="img"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> pin = <span class="number">2</span>; </span><br><span class="line"><span class="type">int</span> value;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(pin, INPUT); </span><br><span class="line">  <span class="built_in">digitalWrite</span>(pin, HIGH);</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  value = <span class="built_in">digitalRead</span>(pin); </span><br><span class="line">  <span class="keyword">if</span> (value == LOW) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;Signal detected!&quot;</span>);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 100 ms break</span></span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 10 ms break</span></span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;No signal detected!&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>HC-SR602是一款灵敏度高、抗干扰能力强的人体红外传感器，适用于各种需要感应人体存在的场景。通过简单的引脚连接和代码编写，即可实现人体感应功能。</p>]]></content>
    
    
    <summary type="html">HC-SR602是基于红外线技术的自动控制模块，专用于感应周围人体的存在。该模块相较于HC-SR501，灵敏度较高，抗干扰能力大，且简单易用。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-磁簧模块（34）</title>
    <link href="https://blog.jzxer.cn/20250106/20250106_Reed_magnet/"/>
    <id>https://blog.jzxer.cn/20250106/20250106_Reed_magnet/</id>
    <published>2025-01-06T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块包含一个微型簧片磁铁开关，当检测到磁场时，该开关会使两个输入引脚短路。开关内部有两个接触舌，在磁场存在的情况下相互吸引，从而闭合电路。一旦检测到磁场，两个输入引脚就会连接在一起。该模块非常适合门窗报警、位置传感器或其他需要检测磁铁存在的项目。它易于集成，提供了一种可靠的磁场检测方法。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Operating voltage</td><td align="center">3,3 V - 5 V</td></tr><tr><td align="center">Dimensions</td><td align="center">19 x 18,5 x 9 mm</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 10</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> pin = <span class="number">10</span>; </span><br><span class="line"><span class="type">int</span> value;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(pin, INPUT); </span><br><span class="line">  <span class="built_in">digitalWrite</span>(pin, HIGH);</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  value = <span class="built_in">digitalRead</span>(pin); </span><br><span class="line">  <span class="keyword">if</span> (value == LOW) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;Signal detected!&quot;</span>);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 100 ms break</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>磁簧模块是一种简单而有效的磁场检测传感器，适用于各种需要检测磁铁存在的项目。通过连接到开发板上的 gpio 接口，可以轻松地检测到磁铁的存在，从而实现各种功能。</p>]]></content>
    
    
    <summary type="html">该模块非常适合门窗报警、位置传感器或其他需要检测磁铁存在的项目。它易于集成，提供了一种可靠的磁场检测方法。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-超声波传感器（33）</title>
    <link href="https://blog.jzxer.cn/20250104/20250104_ultra/"/>
    <id>https://blog.jzxer.cn/20250104/20250104_ultra/</id>
    <published>2025-01-04T04:12:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块能测量 <strong>2cm</strong> 至 <strong>3m</strong> 之间的距离。最小精度约为 <strong>3mm</strong>，原理是模拟蝙蝠的超声波信号传递方式。当将信号（降边缘）应用于扳机输入时，传感器开始距离测量。结果是作为PWM TTL信号以回波输出输出。</p><p>超声波距离传感器对于障碍物检测，距离测量，水平指标和各种工业应用特别有用。由于其高精度和快速响应时间（测量之间的最小时间为 <strong>50µs</strong>），传感器可以实时可靠地工作。</p><p>该模块具有通用性，为需要准确距离测量的项目提供了简单有效的解决方案。</p><table><thead><tr><th align="center">Technical Specifications</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Measurable distance</td><td align="center">2 cm - 300 cm</td></tr><tr><td align="center">Measurement resolution</td><td align="center">3 mm</td></tr><tr><td align="center">Min. time between measurements</td><td align="center">50 µs</td></tr></tbody></table><h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p>该模块显示了如何使用超声波扬声器和麦克风来测量与物体的距离而无需接触的距离。原理是基于以下事实：在恒定温度下，空气中的声速几乎保持恒定：<strong>20°C 下为 343.2 m&#x2F;s</strong>。</p><p>由此，可以将距离测量转换为时间测量，然后通过对应公式计算距离。</p><p><img src="https://oss.jzxer.cn/blog/530px-ky-050-Senden+EmpfangenEN.png" alt="img"></p><p>当触发时，超声波传感器发出的超声波噪声最大为 <strong>200µs</strong>。超声波传感器发出40 kHz信号。这意味着在传感器发出超声波噪声的200µs内发出了8个周期（边缘变化）。为了从到达40 kHz信号的这8个周期，如下所示。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">一秒钟的时间数= 40000</span><br><span class="line">时间= 1s</span><br><span class="line">单个时期的持续时间：1S / 40000 = 25µS **</span><br><span class="line">超声声音的最大长度 = 200US</span><br><span class="line">单个周期的持续时间 = 25</span><br><span class="line">超声声音中的时期数：200µs / 25µs = 8</span><br></pre></td></tr></table></figure><p>该原理保持简单，PCB上的传感器发出了超声波声，然后从对象反射并由PCB上的麦克风拾取。使用超声是因为它超出了人耳的听力范围（约20Hz-22kHz）。</p><p>当在“触发输入引脚”接收10μs长的启动信号（ActiveHigh）时，超声信号的传输启动。传输后，在“回声输出信号引脚”（ActiveHigh）上激活信号。如果现在在麦克风上再次拾取反射信号，则在检测后再次停用回声信号。可以测量和转换为距离之间的激活和停用回声信号之间的时间，因为这也对应于 <strong>超声信号覆盖扬声器 - &gt;反射壁之间的距离 - &gt;麦克风之间的距离</strong>。然后通过近似恒定的空气速度来进行转换 - 然后距离是行进距离的一半。</p><p><img src="https://oss.jzxer.cn/blog/859px-KY-050-EN.png" alt="计算逻辑"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin 2</td><td align="center">Echo</td></tr><tr><td align="center">Pin 3</td><td align="center">Trigger</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义Trig和Echo引脚</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> Trig 3</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> Echo 2</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> Bee 4</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="comment">// 初始化串口通信</span></span><br><span class="line">  Serial.<span class="built_in">begin</span>(                                                                                                                            );</span><br><span class="line">  <span class="built_in">pinMode</span>(Bee, OUTPUT);</span><br><span class="line">  <span class="comment">// 设置Trig引脚为输出模式</span></span><br><span class="line">  <span class="built_in">pinMode</span>(Trig, OUTPUT);</span><br><span class="line">  <span class="comment">// 设置Echo引脚为输入模式</span></span><br><span class="line">  <span class="built_in">pinMode</span>(Echo, INPUT);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="comment">// 给Trig引脚发送一个低电平，持续至少2微秒</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(Trig, LOW);</span><br><span class="line">  <span class="built_in">delayMicroseconds</span>(<span class="number">2</span>);</span><br><span class="line">  <span class="comment">// 给Trig引脚发送一个高电平，持续10微秒，触发超声波发射</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(Trig, HIGH);</span><br><span class="line">  <span class="built_in">delayMicroseconds</span>(<span class="number">10</span>);</span><br><span class="line">  <span class="comment">// 将Trig引脚设置为低电平</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(Trig, LOW);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 读取Echo引脚的高电平持续时间（单位：微秒）</span></span><br><span class="line">  <span class="type">long</span> duration = <span class="built_in">pulseIn</span>(Echo, HIGH);</span><br><span class="line">  <span class="comment">// 计算距离（单位：厘米），声速约为340m/s，因此需要除以2（往返距离）</span></span><br><span class="line">  <span class="type">float</span> distance = (duration / <span class="number">2</span>) / <span class="number">29.1</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 根据距离调整蜂鸣器频率</span></span><br><span class="line">  <span class="keyword">if</span> (distance &lt; <span class="number">30</span>) &#123; <span class="comment">// 如果距离小于30厘米</span></span><br><span class="line">    <span class="built_in">tone</span>(Bee, <span class="number">1000</span> - distance * <span class="number">10</span>); <span class="comment">// 距离越近，频率越高</span></span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="built_in">noTone</span>(Bee); <span class="comment">// 距离大于或等于30厘米，蜂鸣器不发声</span></span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 在串口监视器中输出距离</span></span><br><span class="line">  Serial.<span class="built_in">print</span>(<span class="string">&quot;Distance: &quot;</span>);</span><br><span class="line">  Serial.<span class="built_in">print</span>(distance);</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot; cm&quot;</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 等待一段时间再次测量</span></span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">100</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如果代码正常运行的话，终端就会提示类似以下代码：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Distance: 41.31 cm</span><br><span class="line">Distance: 41.31 cm</span><br><span class="line">Distance: 41.31 cm</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>超声波传感器是一种常用的距离测量传感器，可以用于各种应用场景，如障碍物检测、距离测量、水平指标等。通过简单的代码示例，我们可以轻松地实现超声波传感器的使用，并获取距离信息。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://blog.jzxer.cn/">dev 的艺术空间</a></p>]]></content>
    
    
    <summary type="html">超声波距离传感器对于障碍物检测，距离测量，水平指标和各种工业应用特别有用。由于其高精度和快速响应时间（测量之间的最小时间为 **50µs**），传感器可以实时可靠地工作。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="esp32" scheme="https://blog.jzxer.cn/tags/esp32/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-旋转编码器（32）</title>
    <link href="https://blog.jzxer.cn/20250103/20250103-luckyfox-pico/"/>
    <id>https://blog.jzxer.cn/20250103/20250103-luckyfox-pico/</id>
    <published>2025-01-03T04:12:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>Luckfox Pico RV1103 Linux Micro Development 板，集成ARM Cortex-A7&#x2F;RISC-V MCU&#x2F;NPU&#x2F;ISP处理器。</p><p>单核ARM Cortex-A7 32位核心具有集成霓虹灯和FPU</p><p>内置的RockChip自我开发的第四代NPU具有较高的计算精度，并支持INT4，INT8和INT16混合量化。INT8的计算能力为0.5顶部，最多可用于INT4的顶部。</p><p>内置的自我开发的第三代ISP3.2，支持4百万像素，具有多个图像增强和校正算法，例如HDR，WDR，多级噪声降低等。</p><p>具有强大的编码性能，支持智能编码模式并根据场景节省自适应流，节省了传统CBR模式的50％以上的比特率，以便相机的图像具有高定义，尺寸较小，将存储空间加倍。</p><p>内置的RISC-V MCU支持低功耗和快速启动，同时支持250毫秒的快速图片捕获和加载AI模型库，以“在一秒钟内”实现面部识别</p><p>内置16位DRAM DDR2，能够维持苛刻的记忆带宽</p><p>与内置的POR，Audio编解码器和Mac Phy集成</p><p><img src="https://oss.jzxer.cn/blog/Luckfox-Pico-details-intro.jpg" alt="img"></p><ol><li><p><strong>USB Type-C connector</strong></p></li><li><p><strong>ACT-LED</strong></p></li><li><p><strong>引导按钮</strong>：电源进入下载模式时按它</p></li><li><p><strong>TF卡插槽</strong></p></li><li><p><strong>RV1103</strong>：带有内置手臂Cortex-A7核心的视觉处理器SOC</p></li><li><p><strong>CSI相机界面</strong>：MIPI CSI 2-lane</p></li><li><p><strong>GPIO header</strong></p></li><li><p><strong>USB测试垫</strong></p></li><li><p>**引导测试垫 **</p></li><li><p><strong>麦克风测试垫</strong></p></li><li><p><strong>以太网接口垫</strong></p></li></ol><table><thead><tr><th align="center"><strong>Processor</strong></th><th align="center">Cortex <a href="mailto:&#65;&#x37;&#64;&#x31;&#46;&#50;&#x47;&#72;&#x7a;">&#65;&#x37;&#64;&#x31;&#46;&#50;&#x47;&#72;&#x7a;</a> + RISC-V</th></tr></thead><tbody><tr><td align="center"><strong>NPU</strong></td><td align="center">0.5TOPS, supports int4, int8 and int16</td></tr><tr><td align="center"><strong>ISP</strong></td><td align="center">Input 4M @30fps (Max)</td></tr><tr><td align="center"><strong>Memory</strong></td><td align="center">64MB DDR2</td></tr><tr><td align="center"><strong>USB</strong></td><td align="center">USB 2.0 Host&#x2F;Device</td></tr><tr><td align="center"><strong>Camera</strong></td><td align="center">MIPI CSI 2-lane</td></tr><tr><td align="center"><strong>GPIO</strong></td><td align="center">24 × GPIO pins</td></tr><tr><td align="center"><strong>Ethernet port</strong></td><td align="center">10&#x2F;100M Ethernet controller and embedded PHY</td></tr><tr><td align="center"><strong>Default Storage</strong></td><td align="center">TF card (Not included)</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p><img src="https://oss.jzxer.cn/blog/Luckfox-Pico-details-inter.jpg" alt="引脚介绍"></p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+ V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin 2</td><td align="center">CLK</td></tr><tr><td align="center">Pin 3</td><td align="center">DT</td></tr><tr><td align="center">Pin 4</td><td align="center">SW</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"></span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>待完善…</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://blog.jzxer.cn/">dev 的艺术空间</a></p><p><a href="https://www.luckfox.com/EN-Luckfox-Pico">pico</a></p>]]></content>
    
    
    <summary type="html">这种旋转开关非常适合需要精确位置和运动信息的应用，例如电子设备的用户界面、机器控制或旋转测量系统。它提供准确可靠的输入，是许多项目的通用组件。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="esp32" scheme="https://blog.jzxer.cn/tags/esp32/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-旋转编码器（32）</title>
    <link href="https://blog.jzxer.cn/20250103/20250103_%20Rotary_encoder/"/>
    <id>https://blog.jzxer.cn/20250103/20250103_%20Rotary_encoder/</id>
    <published>2025-01-03T04:12:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>旋转编码器在旋转时通过其输出输出开关的运动方向和当前位置。</p><p>两个输出的状态随着每一步而变化，从而可以确定旋转方向。旋转方向由输出状态变化的顺序决定：根据哪个输出首先改变状态，可以检测开关是顺时针还是逆时针转动。</p><p>这种旋转开关非常适合需要精确位置和运动信息的应用，例如电子设备的用户界面、机器控制或旋转测量系统。它提供准确可靠的输入，是许多项目的通用组件。</p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p><strong>SW：</strong>是按钮开关的输出（低电平有效）。当按下旋钮时，电压变低。</p><p><strong>DT（输出 B）</strong>：与CLK输出类似，但滞后于CLK 90°相移。该输出用于确定旋转方向。</p><p><strong>CLK（输出A）</strong>：是用于确定旋转量的主要输出脉冲。每次仅通过一个制动装置（咔嗒声）向任一方向转动旋钮时，“CLK”输出就会经历一个先高后低的周期。</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+ V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin 2</td><td align="center">CLK</td></tr><tr><td align="center">Pin 3</td><td align="center">DT</td></tr><tr><td align="center">Pin 4</td><td align="center">SW</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Rotary Encoder Inputs</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CLK 2</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> DT 3</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> SW 4</span></span><br><span class="line"> </span><br><span class="line"><span class="type">int</span> counter = <span class="number">0</span>;</span><br><span class="line"><span class="type">int</span> currentStateCLK;</span><br><span class="line"><span class="type">int</span> lastStateCLK;</span><br><span class="line">String currentDir =<span class="string">&quot;&quot;</span>;</span><br><span class="line"><span class="type">unsigned</span> <span class="type">long</span> lastButtonPress = <span class="number">0</span>;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        </span><br><span class="line"><span class="comment">// Set encoder pins as inputs</span></span><br><span class="line"><span class="built_in">pinMode</span>(CLK,INPUT);</span><br><span class="line"><span class="built_in">pinMode</span>(DT,INPUT);</span><br><span class="line"><span class="built_in">pinMode</span>(SW, INPUT_PULLUP);</span><br><span class="line"> </span><br><span class="line"><span class="comment">// Setup Serial Monitor</span></span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line"> </span><br><span class="line"><span class="comment">// Read the initial state of CLK</span></span><br><span class="line">lastStateCLK = <span class="built_in">digitalRead</span>(CLK);</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        </span><br><span class="line"><span class="comment">// Read the current state of CLK</span></span><br><span class="line">currentStateCLK = <span class="built_in">digitalRead</span>(CLK);</span><br><span class="line"> </span><br><span class="line"><span class="comment">// If last and current state of CLK are different, then pulse occurred</span></span><br><span class="line"><span class="comment">// React to only 1 state change to avoid double count</span></span><br><span class="line"><span class="keyword">if</span> (currentStateCLK != lastStateCLK  &amp;&amp; currentStateCLK == <span class="number">1</span>)&#123;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// If the DT state is different than the CLK state then</span></span><br><span class="line"><span class="comment">// the encoder is rotating CCW so decrement</span></span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">digitalRead</span>(DT) != currentStateCLK) &#123;</span><br><span class="line">counter --;</span><br><span class="line">currentDir =<span class="string">&quot;CCW&quot;</span>;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line"><span class="comment">// Encoder is rotating CW so increment</span></span><br><span class="line">counter ++;</span><br><span class="line">currentDir =<span class="string">&quot;CW&quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;Direction: &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(currentDir);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; | Counter: &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">println</span>(counter);</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// Remember last CLK state</span></span><br><span class="line">lastStateCLK = currentStateCLK;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// Read the button state</span></span><br><span class="line"><span class="type">int</span> btnState = <span class="built_in">digitalRead</span>(SW);</span><br><span class="line"> </span><br><span class="line"><span class="comment">//If we detect LOW signal, button is pressed</span></span><br><span class="line"><span class="keyword">if</span> (btnState == LOW) &#123;</span><br><span class="line"><span class="comment">//if 50ms have passed since last LOW pulse, it means that the</span></span><br><span class="line"><span class="comment">//button has been pressed, released and pressed again</span></span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">millis</span>() - lastButtonPress &gt; <span class="number">50</span>) &#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;Button pressed!&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// Remember last button press event</span></span><br><span class="line">lastButtonPress = <span class="built_in">millis</span>();</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// Put in a slight delay to help debounce the reading</span></span><br><span class="line"><span class="built_in">delay</span>(<span class="number">1</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>以上代码如果烧录成功的话，在串口监视器会打印如下内容：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">Direction: CW | Counter: 6</span><br><span class="line">Direction: CW | Counter: 7</span><br><span class="line">Direction: CW | Counter: 8</span><br><span class="line">Direction: CW | Counter: 9</span><br><span class="line">Direction: CW | Counter: 10</span><br><span class="line">Direction: CW | Counter: 11</span><br><span class="line">Direction: CW | Counter: 12</span><br><span class="line">Direction: CW | Counter: 13</span><br><span class="line">Button pressed!</span><br><span class="line">Button pressed!</span><br><span class="line">Direction: CCW | Counter: 12</span><br><span class="line">Direction: CCW | Counter: 11</span><br><span class="line">Direction: CCW | Counter: 10</span><br><span class="line">Direction: CW | Counter: 11</span><br><span class="line">Direction: CCW | Counter: 10</span><br><span class="line">Direction: CCW | Counter: 9</span><br><span class="line">Direction: CCW | Counter: 8</span><br><span class="line">Direction: CCW | Counter: 7</span><br><span class="line">Direction: CCW | Counter: 6</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>通过旋转编码器，我们可以实现精确的旋转控制，并且通过按钮可以触发一些事件。这种传感器在许多应用场景中都非常实用，例如电子设备的用户界面、机器控制或旋转测量系统。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://blog.jzxer.cn/">dev 的艺术空间</a></p>]]></content>
    
    
    <summary type="html">这种旋转开关非常适合需要精确位置和运动信息的应用，例如电子设备的用户界面、机器控制或旋转测量系统。它提供准确可靠的输入，是许多项目的通用组件。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="esp32" scheme="https://blog.jzxer.cn/tags/esp32/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-三轴陀螺仪GY-521（31）</title>
    <link href="https://blog.jzxer.cn/20250102/20250102_xyz/"/>
    <id>https://blog.jzxer.cn/20250102/20250102_xyz/</id>
    <published>2025-01-02T11:12:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>GY-521模块是一款基于MPU-6050 MEMS（微机电系统）的分线板（Breakout Board），MPU-6050具有一个3轴陀螺仪、一个3轴加速度计、数字运动处理器（DMP）和温度传感器。数字运动处理器可用于直接在电路板上处理复杂算法。通常，DMP处理将来自传感器的原始值转换为稳定位置数据的算法。本篇文章将简要介绍GY-521 &#x2F; MPU-6050模块。主要介绍如何检索原始传感器值。通过使用I2C串行数据总线检索传感器值，该总线仅需要两条线（SCL和SDA）。如果您打算使用所有功能，或者需要可靠且稳定的位置数据，那么我建议您先看看现成的库.</p><p><img src="https://oss.jzxer.cn/blog/MEMS-Accelerometer-Working.gif" alt="原理图"></p><h2 id="前期准备"><a href="#前期准备" class="headerlink" title="前期准备"></a>前期准备</h2><ol><li>Esp32-c3-supermini x 1</li></ol><p><img src="https://oss.jzxer.cn/blog/dimension.png" alt="esp32-c3-supermini"></p><ol><li>数据线 x 1</li></ol><p><img src="https://oss.jzxer.cn/blog/esp32c3foot1.jpeg" alt="ESP32C3引脚映射"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><blockquote><p>Tips: 用例使用的是 esp32-c3-supermini，对应的引脚是 A4、A5，如果在 platformIO 上开发的话，直接输入引脚名称会提示当前的引脚对应数字号。</p></blockquote><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin A4</td><td align="center">SCL</td></tr><tr><td align="center">Pin A5</td><td align="center">SDA</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;Wire.h&quot;</span></span></span><br><span class="line"> <span class="comment">// This library allows you to communicate with I2C devices.</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> MPU_ADDR = <span class="number">0x68</span>; <span class="comment">// I2C address of the MPU-6050. If AD0 pin is set to HIGH, the I2C address will be 0x69.</span></span><br><span class="line"><span class="type">int16_t</span> accelerometer_x, accelerometer_y, accelerometer_z; <span class="comment">// variables for accelerometer raw data</span></span><br><span class="line"><span class="type">int16_t</span> gyro_x, gyro_y, gyro_z; <span class="comment">// variables for gyro raw data</span></span><br><span class="line"><span class="type">int16_t</span> temperature; <span class="comment">// variables for temperature data</span></span><br><span class="line"><span class="type">char</span> tmp_str[<span class="number">7</span>]; <span class="comment">// temporary variable used in convert function</span></span><br><span class="line"><span class="function"><span class="type">char</span> *<span class="title">convert_int16_to_str</span><span class="params">(<span class="type">int16_t</span> i)</span></span></span><br><span class="line"><span class="function"></span>&#123; <span class="comment">// converts int16 to string. Moreover, resulting strings will have the same length in the debug monitor.</span></span><br><span class="line"><span class="built_in">sprintf</span>(tmp_str, <span class="string">&quot;%6d&quot;</span>, i);</span><br><span class="line"><span class="keyword">return</span> tmp_str;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">Wire.<span class="built_in">begin</span>();</span><br><span class="line">Wire.<span class="built_in">beginTransmission</span>(MPU_ADDR); <span class="comment">// Begins a transmission to the I2C slave (GY-521 board)</span></span><br><span class="line">Wire.<span class="built_in">write</span>(<span class="number">0x6B</span>);<span class="comment">// PWR_MGMT_1 register</span></span><br><span class="line">Wire.<span class="built_in">write</span>(<span class="number">0</span>);<span class="comment">// set to zero (wakes up the MPU-6050)</span></span><br><span class="line">Wire.<span class="built_in">endTransmission</span>(<span class="literal">true</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">Wire.<span class="built_in">beginTransmission</span>(MPU_ADDR);</span><br><span class="line">Wire.<span class="built_in">write</span>(<span class="number">0x3B</span>); <span class="comment">// starting with register 0x3B (ACCEL_XOUT_H) [MPU-6000 and MPU-6050 Register Map and Descriptions Revision 4.2, p.40]</span></span><br><span class="line">Wire.<span class="built_in">endTransmission</span>(<span class="literal">false</span>); <span class="comment">// the parameter indicates that the Arduino will send a restart. As a result, the connection is kept active.</span></span><br><span class="line">Wire.<span class="built_in">requestFrom</span>(MPU_ADDR, <span class="number">7</span> * <span class="number">2</span>, <span class="literal">true</span>); <span class="comment">// request a total of 7*2=14 registers</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// &quot;Wire.read()&lt;&lt;8 | Wire.read();&quot; means two registers are read and stored in the same variable</span></span><br><span class="line">accelerometer_x = Wire.<span class="built_in">read</span>() &lt;&lt; <span class="number">8</span> | Wire.<span class="built_in">read</span>(); <span class="comment">// reading registers: 0x3B (ACCEL_XOUT_H) and 0x3C (ACCEL_XOUT_L)</span></span><br><span class="line">accelerometer_y = Wire.<span class="built_in">read</span>() &lt;&lt; <span class="number">8</span> | Wire.<span class="built_in">read</span>(); <span class="comment">// reading registers: 0x3D (ACCEL_YOUT_H) and 0x3E (ACCEL_YOUT_L)</span></span><br><span class="line">accelerometer_z = Wire.<span class="built_in">read</span>() &lt;&lt; <span class="number">8</span> | Wire.<span class="built_in">read</span>(); <span class="comment">// reading registers: 0x3F (ACCEL_ZOUT_H) and 0x40 (ACCEL_ZOUT_L)</span></span><br><span class="line">temperature = Wire.<span class="built_in">read</span>() &lt;&lt; <span class="number">8</span> | Wire.<span class="built_in">read</span>();<span class="comment">// reading registers: 0x41 (TEMP_OUT_H) and 0x42 (TEMP_OUT_L)</span></span><br><span class="line">gyro_x = Wire.<span class="built_in">read</span>() &lt;&lt; <span class="number">8</span> | Wire.<span class="built_in">read</span>();<span class="comment">// reading registers: 0x43 (GYRO_XOUT_H) and 0x44 (GYRO_XOUT_L)</span></span><br><span class="line">gyro_y = Wire.<span class="built_in">read</span>() &lt;&lt; <span class="number">8</span> | Wire.<span class="built_in">read</span>();<span class="comment">// reading registers: 0x45 (GYRO_YOUT_H) and 0x46 (GYRO_YOUT_L)</span></span><br><span class="line">gyro_z = Wire.<span class="built_in">read</span>() &lt;&lt; <span class="number">8</span> | Wire.<span class="built_in">read</span>();<span class="comment">// reading registers: 0x47 (GYRO_ZOUT_H) and 0x48 (GYRO_ZOUT_L)</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// print out data</span></span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;aX = &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="built_in">convert_int16_to_str</span>(accelerometer_x));</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; | aY = &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="built_in">convert_int16_to_str</span>(accelerometer_y));</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; | aZ = &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="built_in">convert_int16_to_str</span>(accelerometer_z));</span><br><span class="line"><span class="comment">// the following equation was taken from the documentation [MPU-6000/MPU-6050 Register Map and Description, p.30]</span></span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; | tmp = &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(temperature / <span class="number">340.00</span> + <span class="number">36.53</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; | gX = &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="built_in">convert_int16_to_str</span>(gyro_x));</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; | gY = &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="built_in">convert_int16_to_str</span>(gyro_y));</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; | gZ = &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="built_in">convert_int16_to_str</span>(gyro_z));</span><br><span class="line">Serial.<span class="built_in">println</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// delay</span></span><br><span class="line"><span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如果代码正常运行的话，终端就会提示类似以下代码：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">aX = -13748 | aY =  -5500 | aZ =   1668 | tmp = 18.74 | gX =   4967 | gY =    -34 | gZ =    -70</span><br><span class="line">aX = -13820 | aY =  -5500 | aZ =   1544 | tmp = 18.79 | gX =   5007 | gY =    -44 | gZ =    -76</span><br><span class="line">aX = -13740 | aY =  -5508 | aZ =   1580 | tmp = 18.74 | gX =   4986 | gY =    -32 | gZ =    -42</span><br><span class="line">aX = -13788 | aY =  -5576 | aZ =   1572 | tmp = 18.84 | gX =   5001 | gY =    -26 | gZ =    -85</span><br><span class="line">aX = -13828 | aY =  -5544 | aZ =   1556 | tmp = 18.84 | gX =   5009 | gY =    -63 | gZ =    -80</span><br><span class="line">aX = -13788 | aY =  -5420 | aZ =   1460 | tmp = 18.74 | gX =   4991 | gY =    -16 | gZ =    -35</span><br><span class="line">aX = -13632 | aY =  -5448 | aZ =   1500 | tmp = 18.79 | gX =   4749 | gY =   -115 | gZ =   -666</span><br><span class="line">aX = -13552 | aY =  -5452 | aZ =   1680 | tmp = 18.74 | gX =   5001 | gY =   -113 | gZ =   -239</span><br><span class="line">aX = -13844 | aY =  -5584 | aZ =   1580 | tmp = 18.84 | gX =   4982 | gY =    -41 | gZ =   -102</span><br><span class="line">aX = -13816 | aY =  -5524 | aZ =   1552 | tmp = 18.79 | gX =   5006 | gY =    -43 | gZ =    -98</span><br><span class="line">aX = -13768 | aY =  -5500 | aZ =   1624 | tmp = 18.79 | gX =   5004 | gY =    -42 | gZ =    -55</span><br><span class="line">aX = -13732 | aY =  -5412 | aZ =   1540 | tmp = 18.84 | gX =   4989 | gY =    -47 | gZ =   -126</span><br><span class="line">aX = -13916 | aY =  -5468 | aZ =   1568 | tmp = 18.74 | gX =   5026 | gY =   -102 | gZ =    -14</span><br><span class="line">aX = -13732 | aY =  -5552 | aZ =   1696 | tmp = 18.69 | gX =   5017 | gY =     -5 | gZ =    -52</span><br><span class="line">aX = -13784 | aY =  -5380 | aZ =   1612 | tmp = 18.84 | gX =   4994 | gY =    -23 | gZ =    -31</span><br><span class="line">aX = -13752 | aY =  -5580 | aZ =   1596 | tmp = 18.74 | gX =   5002 | gY =    -17 | gZ =    -52</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>通过以上步骤，我们就可以在 Arduino 上使用 MPU6050 了。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://blog.jzxer.cn/">dev 的艺术空间</a></p><p><strong>示例的库：</strong><a href="https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050%E3%80%82">https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050。</a></p>]]></content>
    
    
    <summary type="html">GY-521模块是一款基于MPU-6050 MEMS（微机电系统）的分线板（Breakout Board），MPU-6050具有一个3轴陀螺仪、一个3轴加速度计、数字运动处理器（DMP）和温度传感器。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="esp32" scheme="https://blog.jzxer.cn/tags/esp32/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-麦克风声音传感器（高精度）（30）</title>
    <link href="https://blog.jzxer.cn/20250101/20250101_Microphone_sound/"/>
    <id>https://blog.jzxer.cn/20250101/20250101_Microphone_sound/</id>
    <published>2025-01-01T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>当前麦克风检测到声音时，具有高灵敏度的麦克风声音传感器会发出信号。传感器的灵敏度可以用控制器来调节，这样它就可以对不同音量的声音做出反应。这种传感器非常适合需要检测和响应声音的项目，例如语音控制、监控系统或交互式安装。可调节的灵敏度使传感器能够适应不同的环境条件和特定要求。</p><p>该版本是高敏感度款，另外还有一款 ky-038，是属于正常精度的版本：</p><p><img src="https://sensorkit.joy-it.net/files/files/sensors/KY-038/KY-038.png" alt="ky-038"></p><h2 id="传感器功能"><a href="#传感器功能" class="headerlink" title="传感器功能"></a>传感器功能</h2><p>该传感器的电路板上有两个功能组件：前传感器单元，它对环境进行物理测量，并将其作为模拟信号输出到第二个单元，即比较器。比较器将传感器的测量值与旋转电位计上设置的值进行比较，如果超过旋转电位计上的值，则在数字引脚和LED L1上输出逻辑高信号。</p><p>请注意：信号已反转。如果测量到高值，则会导致模拟输出端的电压值较低。顺时针增加灵敏度，逆时针减小灵敏度。</p><p>旋转电位计可按如下方式设置：</p><p><img src="https://oss.jzxer.cn/blog/sensitivity-en.png" alt="img"></p><blockquote><p>小 tip：通过旋转旋钮，调整到合适的灵敏度才能看到传感器上的灯光随着声音的变化而亮暗。</p></blockquote><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>该传感器非常适合阈值测量。这意味着，一旦超过用户在旋转电位计上设置的阈值，传感器就会发出数字高信号。这里应该注意的是，数字信号是旋转电位计上设置的值与传感器上测量值的比较，然后由安装在板上的<strong>LM393</strong>比较器进行比较。旋转电位计的设定值是阈值，用于定义逻辑高信号。</p><p>数字输出：如果检测到磁场，则在此处输出信号</p><p>模拟输出：传感器单元的直接测量值</p><p>LED1：表示传感器有电压</p><p>LED2：表示检测到磁场</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin 5</td><td align="center">Digital Signal</td></tr><tr><td align="center">Pin A2</td><td align="center">Analog Signal</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> analog_input = A2; </span><br><span class="line"><span class="type">int</span> digital_input = <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">pinMode</span>(analog_input, INPUT);</span><br><span class="line"><span class="built_in">pinMode</span>(digital_input, INPUT);</span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="type">float</span> analog_value;</span><br><span class="line"><span class="type">int</span> digital_value;</span><br><span class="line"></span><br><span class="line">analog_value = <span class="built_in">analogRead</span>(analog_input) * (<span class="number">5.0</span> / <span class="number">1023.0</span>);</span><br><span class="line">digital_value = <span class="built_in">digitalRead</span>(digital_input);</span><br><span class="line"></span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;Analog voltage value: &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(analog_value, <span class="number">4</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; V, \t Threshold value: &quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (digital_value == <span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;reached&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;not yet reached&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;----------------------------------------------------------------&quot;</span>);</span><br><span class="line"><span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>该传感器非常适合需要检测和响应声音的项目，例如语音控制、监控系统或交互式安装。可调节的灵敏度使传感器能够适应不同的环境条件和特定要求。</p>]]></content>
    
    
    <summary type="html">该模块非常适合检测和测量磁场，这在速度传感器、位置传感器或各种控制和监测系统等应用中非常有用。它提供了一种对磁场做出反应的简单方法，并且用途广泛。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-烟雾传感器（43）</title>
    <link href="https://blog.jzxer.cn/20250101/20250115_smoke_sensor/"/>
    <id>https://blog.jzxer.cn/20250101/20250115_smoke_sensor/</id>
    <published>2025-01-01T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.307Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>MQ135是测量空气污染情况常用的一个传感器，具有代表性，价格低，寿命长，敏感度也OK，主要用于测量空气中二氧化碳，氮氧化物，氨气，酒精，苯类等。这几样气体可以说都属于家用空气污染测定中的重要成份，因此用这个传感器刚刚好。</p><p>MQ135气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在污染气体时，传感器的电导率随空气中污染气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。</p><blockquote><p>注意：<code>pm2.5</code>的话要用另外类型的传感器，比如<code>SDS011</code>。</p></blockquote><p><img src="https://oss.jzxer.cn/blog/2148a3978aeec2c1d8a6b14bd01ae4cc.png" alt="接线图"></p><p><strong>D0：</strong>表示存在可燃气体。当气体浓度超过阈值时（可以通过灵敏度调节旋钮控制），输出高电平，否则输出低电平。</p><p><strong>A0：</strong>产生的模拟输出电压与气体浓度成正比，因此较高的浓度会导致较高的电压和较低的浓度导致较低的电压。</p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin A3</td><td align="center">Digital Signal</td></tr><tr><td align="center">Pin A2</td><td align="center">Analog Signal</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;MQUnifiedsensor.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> placa <span class="string">&quot;esp32-c3&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> Voltage_Resolution 5</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> pin A2</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> type <span class="string">&quot;MQ-135&quot;</span>     </span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ADC_Bit_Resolution 10    <span class="comment">// 10 bits ADC</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> RatioMQ135CleanAir 3.6   <span class="comment">// RS / R0 = 3.6 ppm</span></span></span><br><span class="line"></span><br><span class="line"><span class="function">MQUnifiedsensor <span class="title">MQ135</span><span class="params">(placa, Voltage_Resolution, ADC_Bit_Resolution, pin, type)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">  <span class="comment">/*****************************  MQ Init ********************************************/</span> </span><br><span class="line">  <span class="comment">//Remarks: Configure the pin of arduino as input.</span></span><br><span class="line">  <span class="comment">/************************************************************************************/</span> </span><br><span class="line">  MQ135.<span class="built_in">setRegressionMethod</span>(<span class="number">1</span>); <span class="comment">// 调用函数设置回归方法</span></span><br><span class="line">  MQ135.<span class="built_in">init</span>(); </span><br><span class="line">  Serial.<span class="built_in">print</span>(<span class="string">&quot;Calibrating please wait.&quot;</span>);</span><br><span class="line">  <span class="type">float</span> calcR0 = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">1</span>; i&lt;=<span class="number">10</span>; i ++)</span><br><span class="line">  &#123;</span><br><span class="line">    MQ135.<span class="built_in">update</span>();</span><br><span class="line">    calcR0 += MQ135.<span class="built_in">calibrate</span>(RatioMQ135CleanAir);   <span class="comment">// 校准测量值</span></span><br><span class="line">    Serial.<span class="built_in">print</span>(<span class="string">&quot;.&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  MQ135.<span class="built_in">setR0</span>(calcR0/<span class="number">10</span>);</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;  done!.&quot;</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span>(<span class="built_in">isinf</span>(calcR0)) &#123;Serial.<span class="built_in">println</span>(<span class="string">&quot;Warning: Conection issue, R0 is infinite (Open circuit detected) please check your wiring and supply&quot;</span>); <span class="keyword">while</span>(<span class="number">1</span>);&#125;</span><br><span class="line">  <span class="keyword">if</span>(calcR0 == <span class="number">0</span>)&#123;Serial.<span class="built_in">println</span>(<span class="string">&quot;Warning: Conection issue found, R0 is zero (Analog pin shorts to ground) please check your wiring and supply&quot;</span>); <span class="keyword">while</span>(<span class="number">1</span>);&#125;</span><br><span class="line">  <span class="comment">/*****************************  MQ CAlibration ********************************************/</span> </span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;** Values from MQ-135 ****&quot;</span>);</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;|    CO   |  Alcohol |   CO2  |  Toluen  |  NH4  |  Aceton  |&quot;</span>);  </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  MQ135.<span class="built_in">update</span>(); <span class="comment">// Update data, the arduino will read the voltage from the analog pin</span></span><br><span class="line"></span><br><span class="line">  MQ135.<span class="built_in">setA</span>(<span class="number">605.18</span>); </span><br><span class="line">MQ135.<span class="built_in">setB</span>(<span class="number">-3.937</span>);</span><br><span class="line">  <span class="type">float</span> CO = MQ135.<span class="built_in">readSensor</span>();  <span class="comment">// 一氧化碳</span></span><br><span class="line"></span><br><span class="line">  MQ135.<span class="built_in">setA</span>(<span class="number">77.255</span>); </span><br><span class="line">MQ135.<span class="built_in">setB</span>(<span class="number">-3.18</span>);</span><br><span class="line">  <span class="type">float</span> Alcohol = MQ135.<span class="built_in">readSensor</span>();  <span class="comment">// 酒精</span></span><br><span class="line"></span><br><span class="line">  MQ135.<span class="built_in">setA</span>(<span class="number">110.47</span>); </span><br><span class="line">MQ135.<span class="built_in">setB</span>(<span class="number">-2.862</span>);</span><br><span class="line">  <span class="type">float</span> CO2 = MQ135.<span class="built_in">readSensor</span>();   <span class="comment">// 二氧化碳</span></span><br><span class="line"></span><br><span class="line">  MQ135.<span class="built_in">setA</span>(<span class="number">44.947</span>); </span><br><span class="line">MQ135.<span class="built_in">setB</span>(<span class="number">-3.445</span>);</span><br><span class="line">  <span class="type">float</span> Toluene = MQ135.<span class="built_in">readSensor</span>();  <span class="comment">// 甲苯</span></span><br><span class="line">  </span><br><span class="line">  MQ135.<span class="built_in">setA</span>(<span class="number">102.2</span> );</span><br><span class="line">MQ135.<span class="built_in">setB</span>(<span class="number">-2.473</span>);</span><br><span class="line">  <span class="type">float</span> NH4 = MQ135.<span class="built_in">readSensor</span>();   <span class="comment">// 氨氮</span></span><br><span class="line"></span><br><span class="line">  MQ135.<span class="built_in">setA</span>(<span class="number">34.668</span>); </span><br><span class="line">MQ135.<span class="built_in">setB</span>(<span class="number">-3.369</span>);</span><br><span class="line">  <span class="type">float</span> Acetone = MQ135.<span class="built_in">readSensor</span>();   <span class="comment">// 丙酮</span></span><br><span class="line">  </span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;|   &quot;</span>); Serial.<span class="built_in">print</span>(CO); </span><br><span class="line">  Serial.<span class="built_in">print</span>(<span class="string">&quot;   |   &quot;</span>); Serial.<span class="built_in">print</span>(Alcohol);</span><br><span class="line">  Serial.<span class="built_in">print</span>(<span class="string">&quot;   |   &quot;</span>); Serial.<span class="built_in">print</span>(CO2 + <span class="number">400</span>); </span><br><span class="line">  Serial.<span class="built_in">print</span>(<span class="string">&quot;   |   &quot;</span>); Serial.<span class="built_in">print</span>(Toluene); </span><br><span class="line">  Serial.<span class="built_in">print</span>(<span class="string">&quot;   |   &quot;</span>); Serial.<span class="built_in">print</span>(NH4); </span><br><span class="line">  Serial.<span class="built_in">print</span>(<span class="string">&quot;   |   &quot;</span>); Serial.<span class="built_in">print</span>(Acetone);</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;   |&quot;</span>); </span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">500</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="拓展"><a href="#拓展" class="headerlink" title="拓展"></a>拓展</h3><p>可以搭配显示屏和蜂鸣器，做一个空气检测系统。当然，如果接入钉钉通知就更好了。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>MQ135传感器是检测空气中可燃气体的重要传感器，可以用于家庭、工业等场合的空气检测。通过简单的电路和代码，可以实现对其的读取和显示。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://lastminuteengineers.com/mq2-gas-senser-arduino-tutorial/">mq2-gas</a></p>]]></content>
    
    
    <summary type="html">MQ135传感器是MQ传感器系列中最广泛使用的传感器之一。它是MOS（金属氧化物半导体）传感器。金属氧化物传感器也被称为化学晶体，因为传感是基于暴露于气体时感应材料的耐药性的变化。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-金属触摸传感器（29）</title>
    <link href="https://blog.jzxer.cn/20241231/20241231_%20METAL_TOUCH/"/>
    <id>https://blog.jzxer.cn/20241231/20241231_%20METAL_TOUCH/</id>
    <published>2024-12-31T07:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>当触摸传感器的前金属尖端时，金属触摸传感器会发出信号。此触摸检测使其非常适合需要简单直观的用户界面的应用程序。传感器的灵敏度可以使用控制器调整，以便它可以响应不同的触摸级。该传感器非常适合互动项目，控件和其他触摸触发的应用程序。</p><h2 id="传感器功能"><a href="#传感器功能" class="headerlink" title="传感器功能"></a>传感器功能</h2><p>该传感器的电路板上有两个功能组件：前传感器单元，它对环境进行物理测量，并将其作为模拟信号输出到第二个单元，即比较器。比较器将传感器的测量值与旋转电位计上设置的值进行比较，如果超过旋转电位计上的值，则在数字引脚和LED L1上输出逻辑高信号。</p><p>请注意：信号已反转。如果测量到高值，则会导致模拟输出端的电压值较低。顺时针增加灵敏度，逆时针减小灵敏度。</p><p>旋转电位计可按如下方式设置：</p><p><img src="https://oss.jzxer.cn/blog/sensitivity-en.png" alt="img"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>该传感器非常适合阈值测量。这意味着，一旦超过用户在旋转电位计上设置的阈值，传感器就会发出数字高信号。这里应该注意的是，数字信号是旋转电位计上设置的值与传感器上测量值的比较，然后由安装在板上的<strong>LM393</strong>比较器进行比较。旋转电位计的设定值是阈值，用于定义逻辑高信号。</p><p>数字输出：如果检测到磁场，则在此处输出信号</p><p>模拟输出：传感器单元的直接测量值</p><p>LED1：表示传感器有电压</p><p>LED2：表示检测到磁场</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin 5</td><td align="center">Digital Signal</td></tr><tr><td align="center">Pin A2</td><td align="center">Analog Signal</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> analog_input = A2; </span><br><span class="line"><span class="type">int</span> digital_input = <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">pinMode</span>(analog_input, INPUT);</span><br><span class="line"><span class="built_in">pinMode</span>(digital_input, INPUT);</span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="type">float</span> analog_value;</span><br><span class="line"><span class="type">int</span> digital_value;</span><br><span class="line"></span><br><span class="line">analog_value = <span class="built_in">analogRead</span>(analog_input) * (<span class="number">5.0</span> / <span class="number">1023.0</span>);</span><br><span class="line">digital_value = <span class="built_in">digitalRead</span>(digital_input);</span><br><span class="line"></span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;Analog voltage value: &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(analog_value, <span class="number">4</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; V, \t Threshold value: &quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (digital_value == <span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;reached&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;not yet reached&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;----------------------------------------------------------------&quot;</span>);</span><br><span class="line"><span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>金属触摸传感器是一种简单而有效的触摸检测传感器，适用于各种需要简单直观用户界面的应用。通过调整旋转电位计的设置，可以轻松调整传感器的灵敏度，以适应不同的触摸级别。该传感器的电路板上有两个功能组件：前传感器单元和比较器，它们共同工作以检测磁场并输出数字信号。通过连接到Arduino或其他控制器，可以轻松实现触摸检测功能，并将其应用于各种项目。</p>]]></content>
    
    
    <summary type="html">该模块非常适合检测和测量磁场，这在速度传感器、位置传感器或各种控制和监测系统等应用中非常有用。它提供了一种对磁场做出反应的简单方法，并且用途广泛。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-类比霍尔磁力模块（28）</title>
    <link href="https://blog.jzxer.cn/20241230/20241230_Bihor_magnetic_sensor/"/>
    <id>https://blog.jzxer.cn/20241230/20241230_Bihor_magnetic_sensor/</id>
    <published>2024-12-30T07:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><strong>BIHOR</strong> 磁传感器模块使用<strong>AH49E</strong>霍尔效应传感器，可以检测磁场。如果没有磁场，传感器输出的电压大约是电源电压的一半。</p><p>如果磁铁的南极靠近传感器的标记侧，输出电压就会增加。如果北极接近，电压会降低。这些变化是均匀的，能够精确检测磁方向。</p><p>该模块非常适合检测和测量磁场，这在速度传感器、位置传感器或各种控制和监测系统等应用中非常有用。它提供了一种对磁场做出反应的简单方法，并且用途广泛。</p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin A2</td><td align="center">Signal</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> sensorPin = A5; <span class="comment">// The input pin is declared here</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="comment">// Serial output in 9600 baud</span></span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;KY-035 Magnetic field detection&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// The program measures the current voltage value at the sensor,</span></span><br><span class="line"><span class="comment">// calculates the current resistance value of the sensor from this and the known series resistance</span></span><br><span class="line"><span class="comment">// resistance value of the sensor and outputs the results to the serial output</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;      </span><br><span class="line">    <span class="comment">// Current voltage value is measured...</span></span><br><span class="line">    <span class="type">int</span> rawValue = <span class="built_in">analogRead</span>(sensorPin);</span><br><span class="line">    <span class="type">float</span> voltage = rawValue * (<span class="number">5.0</span>/<span class="number">1023</span>) * <span class="number">1000</span>;  </span><br><span class="line">    <span class="type">float</span> resitance = <span class="number">10000</span> * (voltage / (<span class="number">5000.0</span> - voltage));</span><br><span class="line">         </span><br><span class="line">    <span class="comment">// ... and printed here to the serial interface</span></span><br><span class="line">    Serial.<span class="built_in">print</span>(<span class="string">&quot;Voltage value: &quot;</span>); </span><br><span class="line">    Serial.<span class="built_in">print</span>(voltage);</span><br><span class="line">    Serial.<span class="built_in">print</span>(<span class="string">&quot; mV, \t Resistance value: &quot;</span>); </span><br><span class="line">    Serial.<span class="built_in">print</span>(resitance); </span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot; Ohm&quot;</span>);</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;---------------------------------------&quot;</span>);</span><br><span class="line"> </span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>通过这个项目，我们了解了如何使用霍尔效应传感器来检测磁场，并使用 Arduino 来读取传感器的输出。这个传感器可以用于各种应用，如速度传感器、位置传感器或各种控制和监测系统。通过调整代码，我们可以根据需要调整传感器的灵敏度，以满足不同的应用需求。</p>]]></content>
    
    
    <summary type="html">该模块非常适合检测和测量磁场，这在速度传感器、位置传感器或各种控制和监测系统等应用中非常有用。它提供了一种对磁场做出反应的简单方法，并且用途广泛。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-寻迹模块（27）</title>
    <link href="https://blog.jzxer.cn/20241229/20241229_find_line_sensor/"/>
    <id>https://blog.jzxer.cn/20241229/20241229_find_line_sensor/</id>
    <published>2024-12-29T07:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该线跟踪传感器模块检测传感器前方是否有光反射或光吸收表面，并在数字端输出结果。这种能力使该模块成为控制系统的理想选择，例如用于机器人自主线路跟踪的控制系统。机器人可以使用这个传感器沿着地板上的反射线精确地沿着预定的路径导航。传感器的灵敏度可以通过两个控制器进行调节，以确保在不同的照明条件和路面条件下达到最佳性能。这为机器人和自动化领域的广泛应用提供了可靠和可定制的解决方案。</p><p><strong>状态1：</strong>线路跟踪器在线路上【模块上的LED：关闭】[<strong>传感器信号：数字打开</strong>]。</p><p><img src="https://oss.jzxer.cn/blog/202412181639953.png" alt="状态1"></p><p><strong>状态2：</strong>线路跟踪器在线路外【模块上的LED：打开】[传感器信号：数字关闭]。</p><p><img src="https://oss.jzxer.cn/blog/linetracking2.jpg" alt="状态2"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin 2</td><td align="center">Signal</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> obstacle_detector = A2;</span><br><span class="line"><span class="type">int</span> value;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">pinMode</span>(obstacle_detector, INPUT); </span><br><span class="line"><span class="built_in">digitalWrite</span>(obstacle_detector, HIGH);</span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">value = <span class="built_in">digitalRead</span>(obstacle_detector);</span><br><span class="line"><span class="keyword">if</span> (value == LOW)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;Obstacle recognized&quot;</span>);</span><br><span class="line"><span class="built_in">delay</span>(<span class="number">200</span>); <span class="comment">// 200 ms break</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>寻迹模块是机器人自主导航的重要传感器，通过检测地面上的光线反射，机器人可以沿着预定的路径精确导航。</p>]]></content>
    
    
    <summary type="html">这种能力使该模块成为控制系统的理想选择，例如用于机器人自主线路跟踪的控制系统。机器人可以使用这个传感器沿着地板上的反射线精确地沿着预定的路径导航。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-3mmLED（25）</title>
    <link href="https://blog.jzxer.cn/20241227/20241227_red_green_led/"/>
    <id>https://blog.jzxer.cn/20241227/20241227_red_green_led/</id>
    <published>2024-12-27T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该LED模块包含两个红色和绿色的LED，它们通过公共阴极相互连接。这意味着两个LED共享相同的负极连接，从而简化了电路。例如，通过控制各个LED，您可以生成不同的颜色信号来指示操作状态或警告。紧凑的设计和易于集成使该模块非常适合需要彩色可视化的各种应用，如控制系统、显示器或装饰项目。</p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 11</td><td align="center">LED Red</td></tr><tr><td align="center">Pin 10</td><td align="center">LED Green</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> pin = <span class="number">10</span>; </span><br><span class="line"><span class="type">int</span> value;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(pin, INPUT); </span><br><span class="line">  <span class="built_in">digitalWrite</span>(pin, HIGH);</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  value = <span class="built_in">digitalRead</span>(pin); </span><br><span class="line">  <span class="keyword">if</span> (value == LOW) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;Signal detected!&quot;</span>);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 100 ms break</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>通过使用该模块，您可以轻松地实现彩色可视化，从而提高系统的可读性和用户体验。</p>]]></content>
    
    
    <summary type="html">紧凑的设计和易于集成使该模块非常适合需要彩色可视化的各种应用，如控制系统、显示器或装饰项目。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-障碍物探测模块（26）</title>
    <link href="https://blog.jzxer.cn/20241227/20241228_Obstacle_detector/"/>
    <id>https://blog.jzxer.cn/20241227/20241228_Obstacle_detector/</id>
    <published>2024-12-27T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该障碍探测器使用红外光检测障碍物。当发射的红外光撞到障碍物时，光电二极管会响应和检查。可以使用两个控制器设置检测到障碍物的距离。该模块在控制系统中特别有用，例如在机器人中使用的模块在障碍前自动停止自动停止。它可以精确地检测对象，使机器人可以安全导航并避免碰撞。</p><p><strong>状态1</strong>：探测器前方没有障碍物【模块上的LED：关闭】[<strong>传感器信号&#x3D;数字开启</strong>]</p><p><strong>状态2</strong>：探测器检测到障碍物【模块上的LED：开启】[<strong>传感器信号&#x3D;数字关闭</strong>]</p><p>该传感器还具有启用线。这条线可用于激活或停用传感器的检测。然而，在传感器的输送状态下，启用线被停用，因此传感器永久处于活动状态。如果需要启用线的功能，则必须移除跳线EN（图片中的绿色），并向启用引脚施加相应的控制信号。</p><blockquote><p>注意：传感器还配备了两个可调节的控制器。通过这些，可以调整传感器的可测量距离和灵敏度。</p></blockquote><p><img src="https://oss.jzxer.cn/blog/Einstellr%C3%A4derEN.png" alt="正视图"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">-</td><td align="center">Enable</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin A2</td><td align="center">Signal</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> obstacle_detector = A2;</span><br><span class="line"><span class="type">int</span> value;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">pinMode</span>(obstacle_detector, INPUT); </span><br><span class="line"><span class="built_in">digitalWrite</span>(obstacle_detector, HIGH);</span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">value = <span class="built_in">digitalRead</span>(obstacle_detector);</span><br><span class="line"><span class="keyword">if</span> (value == LOW)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;Obstacle recognized&quot;</span>);</span><br><span class="line"><span class="built_in">delay</span>(<span class="number">200</span>); <span class="comment">// 200 ms break</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>该障碍物探测模块可以精确地检测对象，使机器人可以安全导航并避免碰撞。敏感性的简单调整使传感器具有多种应用程序，以用于障碍物检测很重要的各种应用。</p>]]></content>
    
    
    <summary type="html">它可以精确地检测对象，使机器人可以安全导航并避免碰撞。敏感性的简单调整使传感器具有多种应用程序，以用于障碍物检测很重要的各种应用。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-热敏温度传感器（24）</title>
    <link href="https://blog.jzxer.cn/20241226/20241226_Temperature_sensor_monitor/"/>
    <id>https://blog.jzxer.cn/20241226/20241226_Temperature_sensor_monitor/</id>
    <published>2024-12-26T04:55:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块包含一个NTC热敏电阻，可以测量-55°C至+125°C的温度。热敏电阻的电阻会根据温度而变化：随着温度的升高，电阻会降低。这种行为使其成为监控阈值的理想选择。您可以使用旋转电位计设置所需的温度阈值。一旦测量的温度超过该阈值，传感器就会发出数字高信号。内置比较器用于比较设定值和测量值。此外，一个LED指示传感器何时被供电，另一个LED在超过阈值时亮起。该模块非常适合需要可靠温度监测的应用，例如在加热控制系统或空调系统中。</p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin 5</td><td align="center">Digital Signal</td></tr><tr><td align="center">Pin A2</td><td align="center">Analog Signal</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> analog_input = A2; </span><br><span class="line"><span class="type">int</span> digital_input = <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">pinMode</span>(analog_input, INPUT);</span><br><span class="line"><span class="built_in">pinMode</span>(digital_input, INPUT);</span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="type">float</span> analog_value;</span><br><span class="line"><span class="type">int</span> digital_value;</span><br><span class="line"></span><br><span class="line">analog_value = <span class="built_in">analogRead</span>(analog_input) * (<span class="number">5.0</span> / <span class="number">1023.0</span>);</span><br><span class="line">digital_value = <span class="built_in">digitalRead</span>(digital_input);</span><br><span class="line"></span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;Analog voltage value: &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(analog_value, <span class="number">4</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; V, \t Threshold value: &quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (digital_value == <span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;reached&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;not yet reached&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;----------------------------------------------------------------&quot;</span>);</span><br><span class="line"><span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>热敏温度传感器是一种常用的温度监测设备，通过测量热敏电阻的电阻变化来感知温度。该传感器具有高精度和稳定性，适用于各种温度监测应用。通过Arduino和传感器模块的连接，可以实现对温度的实时监测和报警功能。</p>]]></content>
    
    
    <summary type="html">该模块非常适合需要可靠温度监测的应用，例如在加热控制系统或空调系统中。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-魔术光杯模块（23）</title>
    <link href="https://blog.jzxer.cn/20241225/20241225_magic_cup/"/>
    <id>https://blog.jzxer.cn/20241225/20241225_magic_cup/</id>
    <published>2024-12-25T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>当检测到冲击时，魔术灯杯模块将打开或关闭LED。如果检测到振动，则激活或停用LED，并将相应的控制信号转发为信号输出。可以读取此信号以监视LED的状态。该模块是使用对运动或振动反应的应用，例如交互式灯，玩具或警报系统。通过将触发信号转发到信号输出中，其他系统或微控制器可以检测到振动并相应地做出反应。</p><table><thead><tr><th align="center">Input voltage</th><th align="center">Series resistor</th></tr></thead><tbody><tr><td align="center">3.3 V</td><td align="center">120 Ω</td></tr><tr><td align="center">5 V</td><td align="center">220 Ω</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin 5</td><td align="center">signal</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> led = <span class="number">2</span> ;<span class="comment">// Declaration of the LED output pin</span></span><br><span class="line"><span class="type">int</span> shock_sensor = <span class="number">5</span>; <span class="comment">// Declaration of the sensor input pin</span></span><br><span class="line"><span class="type">int</span> value; <span class="comment">// Temporary variable</span></span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(led, OUTPUT); <span class="comment">// Initialization output pin</span></span><br><span class="line">  <span class="built_in">pinMode</span>(shock_sensor, INPUT); <span class="comment">// Initialization sensor pin</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(shock_sensor, HIGH); <span class="comment">// Activation of internal pull-up resistor</span></span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  value = <span class="built_in">digitalRead</span>(shock_sensor); <span class="comment">// The current signal at the sensor is read out</span></span><br><span class="line">  <span class="comment">// If a signal is detected, the LED is switched on.</span></span><br><span class="line">  <span class="keyword">if</span> (value == HIGH) &#123;</span><br><span class="line">    <span class="built_in">digitalWrite</span> (led, LOW);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">200</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span> <span class="built_in">digitalWrite</span>(led, HIGH);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>魔术光杯模块非常适合门窗报警、位置传感器或其他需要检测磁铁存在的项目。它易于集成，提供了一种可靠的磁场检测方法。</p>]]></content>
    
    
    <summary type="html">该模块非常适合门窗报警、位置传感器或其他需要检测磁铁存在的项目。它易于集成，提供了一种可靠的磁场检测方法。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-火焰传感器（22）</title>
    <link href="https://blog.jzxer.cn/20241224/20241224_flame_sensor/"/>
    <id>https://blog.jzxer.cn/20241224/20241224_flame_sensor/</id>
    <published>2024-12-24T03:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块是专门为检测明火而开发的。所附的光电二极管对明火产生的光谱特别敏感。这使得该模块能够可靠地检测火焰并对其做出反应。它非常适合安全应用，如火灾探测系统或火灾报警器，在这些应用中，快速准确地检测火焰至关重要。易于集成到各种系统中，使该模块成为消防和其他火灾探测重要应用的有价值的组件。</p><h2 id="传感器功能"><a href="#传感器功能" class="headerlink" title="传感器功能"></a>传感器功能</h2><p>该传感器的电路板上有两个功能组件：前传感器单元，它对环境进行物理测量，并将其作为模拟信号输出到第二个单元，即比较器。比较器将传感器的测量值与旋转电位计上设置的值进行比较，如果超过旋转电位计上的值，则在数字引脚和LED L1上输出逻辑高信号。</p><p>请注意：信号已反转。如果测量到高值，则会导致模拟输出端的电压值较低。</p><p>旋转电位计可按如下方式设置：</p><p><img src="https://oss.jzxer.cn/blog/sensitivity-en.png" alt="img"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>该传感器非常适合阈值测量。这意味着，一旦超过用户在旋转电位计上设置的阈值，传感器就会发出数字高信号。这里应该注意的是，数字信号是旋转电位计上设置的值与传感器上测量值的比较，然后由安装在板上的<strong>LM393</strong>比较器进行比较。旋转电位计的设定值是阈值，用于定义逻辑高信号。</p><p>数字输出：如果检测到磁场，则在此处输出信号</p><p>模拟输出：传感器单元的直接测量值</p><p>LED1：表示传感器有电压</p><p>LED2：表示检测到磁场</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin 5</td><td align="center">Digital Signal</td></tr><tr><td align="center">Pin A2</td><td align="center">Analog Signal</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> analog_input = A2; </span><br><span class="line"><span class="type">int</span> digital_input = <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">pinMode</span>(analog_input, INPUT);</span><br><span class="line"><span class="built_in">pinMode</span>(digital_input, INPUT);</span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="type">float</span> analog_value;</span><br><span class="line"><span class="type">int</span> digital_value;</span><br><span class="line"></span><br><span class="line">analog_value = <span class="built_in">analogRead</span>(analog_input) * (<span class="number">5.0</span> / <span class="number">1023.0</span>);</span><br><span class="line">digital_value = <span class="built_in">digitalRead</span>(digital_input);</span><br><span class="line"></span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;Analog voltage value: &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(analog_value, <span class="number">4</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; V, \t Threshold value: &quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (digital_value == <span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;reached&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;not yet reached&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;----------------------------------------------------------------&quot;</span>);</span><br><span class="line"><span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>火焰传感器是一种用于检测火焰的传感器，广泛应用于火灾探测、火灾报警等安全领域。通过Arduino和火焰传感器，可以实现火焰检测系统的开发，提高火灾预警的准确性和及时性。</p>]]></content>
    
    
    <summary type="html">它非常适合安全应用，如火灾探测系统或火灾报警器，在这些应用中，快速准确地检测火焰至关重要。易于集成到各种系统中，使该模块成为消防和其他火灾探测重要应用的有价值的组件。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-模拟磁簧传感器（21）</title>
    <link href="https://blog.jzxer.cn/20241223/20241223_%20magnetic_field/"/>
    <id>https://blog.jzxer.cn/20241223/20241223_%20magnetic_field/</id>
    <published>2024-12-23T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块包含一个模拟簧片磁传感器，用于检测磁场并将此信息转发到数字输出。簧片触点由玻璃管中的两个薄触点弹簧组成，在磁场存在的情况下，它们会相互靠近。这会闭合一个电触点，从而切换信号。</p><p>当传感器检测到磁场时，它会闭合触点并发出数字信号。这使得簧片磁传感器非常适合需要检测磁体存在的应用，例如门窗报警器、位置传感器或其他安全和监控系统。簧片磁传感器的简单操作和可靠性使其成为许多需要检测磁场的项目的有用组件。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Chipset</td><td align="center">AH49E, LM393</td></tr><tr><td align="center">Sensor type</td><td align="center">Hall Effect Transistor&#x2F;Switch</td></tr><tr><td align="center">Accuracy</td><td align="center">9 to 12 Bit</td></tr><tr><td align="center">Functional range</td><td align="center">5V (depending on the components)</td></tr></tbody></table><h2 id="传感器功能"><a href="#传感器功能" class="headerlink" title="传感器功能"></a>传感器功能</h2><p>该传感器的电路板上有两个功能组件：前传感器单元，它对环境进行物理测量，并将其作为模拟信号输出到第二个单元，即比较器。比较器将传感器的测量值与旋转电位计上设置的值进行比较，如果超过旋转电位计上的值，则在数字引脚和LED L1上输出逻辑高信号。</p><p>请注意：信号已反转。如果测量到高值，则会导致模拟输出端的电压值较低。</p><p>旋转电位计可按如下方式设置：</p><p><img src="https://oss.jzxer.cn/blog/sensitivity-en.png" alt="img"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>该传感器非常适合阈值测量。这意味着，一旦超过用户在旋转电位计上设置的阈值，传感器就会发出数字高信号。这里应该注意的是，数字信号是旋转电位计上设置的值与传感器上测量值的比较，然后由安装在板上的<strong>LM393</strong>比较器进行比较。旋转电位计的设定值是阈值，用于定义逻辑高信号。</p><p>数字输出：如果检测到磁场，则在此处输出信号</p><p>模拟输出：传感器单元的直接测量值</p><p>LED1：表示传感器有电压</p><p>LED2：表示检测到磁场</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin 5</td><td align="center">Digital Signal</td></tr><tr><td align="center">Pin A2</td><td align="center">Analog Signal</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> analog_input = A2; </span><br><span class="line"><span class="type">int</span> digital_input = <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">pinMode</span>(analog_input, INPUT);</span><br><span class="line"><span class="built_in">pinMode</span>(digital_input, INPUT);</span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="type">float</span> analog_value;</span><br><span class="line"><span class="type">int</span> digital_value;</span><br><span class="line"></span><br><span class="line">analog_value = <span class="built_in">analogRead</span>(analog_input) * (<span class="number">5.0</span> / <span class="number">1023.0</span>);</span><br><span class="line">digital_value = <span class="built_in">digitalRead</span>(digital_input);</span><br><span class="line"></span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;Analog voltage value: &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(analog_value, <span class="number">4</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; V, \t Threshold value: &quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (digital_value == <span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;reached&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;not yet reached&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;----------------------------------------------------------------&quot;</span>);</span><br><span class="line"><span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>簧片磁传感器是一种简单而有效的检测磁场的传感器，适用于各种需要检测磁体存在的应用。通过连接到Arduino，可以轻松地读取传感器的模拟和数字输出，并根据需要进行处理。</p>]]></content>
    
    
    <summary type="html">当传感器检测到磁场时，它会闭合触点并发出数字信号。这使得簧片磁传感器非常适合需要检测磁体存在的应用，例如门窗报警器、位置传感器或其他安全和监控系统。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-可调霍尔磁力模块（20）</title>
    <link href="https://blog.jzxer.cn/20241222/20241222_%20Linear_magnetic_hall_sensor/"/>
    <id>https://blog.jzxer.cn/20241222/20241222_%20Linear_magnetic_hall_sensor/</id>
    <published>2024-12-22T03:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块包含一个霍尔效应开关，用于检测磁场并对其作出反应。在空闲状态下，当没有外部磁场存在时，输出电压通常是电源电压的一半。当南磁极接近传感器的标记侧时，输出电压增加。另一方面，北磁极会降低输出电压。这些波动是对称的，能够进行精确的阈值测量。</p><p>一旦超过预设阈值，传感器就会发出数字高信号。该阈值通过旋转电位计设置，并通过内置的<strong>LM393</strong>比较器与传感器的测量值进行比较。如果超过设定值，传感器将输出逻辑高信号。</p><p>数字输出表示是否检测到磁场，而模拟输出提供传感器单元的直接测量值。两个LED指示工作状态：<strong>LED1</strong> 表示传感器有电压，<strong>LED2</strong> 在检测到磁场时亮起。</p><p>该模块非常适合需要检测和测量磁场的应用，例如速度传感器、位置传感器或安全系统。凭借<strong>AH49E</strong>芯片组和<strong>LM393</strong>比较器，它为磁场检测提供了可靠和精确的解决方案。该传感器在5V的电源电压下工作，精度为9至12位。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Chipset</td><td align="center">AH49E, LM393</td></tr><tr><td align="center">Sensor type</td><td align="center">Hall Effect Transistor&#x2F;Switch</td></tr><tr><td align="center">Accuracy</td><td align="center">9 to 12 Bit</td></tr><tr><td align="center">Functional range</td><td align="center">5V (depending on the components)</td></tr></tbody></table><h2 id="传感器功能"><a href="#传感器功能" class="headerlink" title="传感器功能"></a>传感器功能</h2><p>该传感器的电路板上有两个功能组件：前传感器单元，它对环境进行物理测量，并将其作为模拟信号输出到第二个单元，即比较器。比较器将传感器的测量值与旋转电位计上设置的值进行比较，如果超过旋转电位计上的值，则在数字引脚和LED L1上输出逻辑高信号。</p><p>请注意：信号已反转。如果测量到高值，则会导致模拟输出端的电压值较低。</p><p>旋转电位计可按如下方式设置：</p><p><img src="https://oss.jzxer.cn/blog/sensitivity-en.png" alt="img"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>该传感器非常适合阈值测量。这意味着，一旦超过用户在旋转电位计上设置的阈值，传感器就会发出数字高信号。这里应该注意的是，数字信号是旋转电位计上设置的值与传感器上测量值的比较，然后由安装在板上的<strong>LM393</strong>比较器进行比较。旋转电位计的设定值是阈值，用于定义逻辑高信号。</p><p><img src="https://oss.jzxer.cn/blog/KY-024.svg" alt="引脚示例"></p><p>数字输出：如果检测到磁场，则在此处输出信号</p><p>模拟输出：传感器单元的直接测量值</p><p>LED1：表示传感器有电压</p><p>LED2：表示检测到磁场</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin 5</td><td align="center">Digital Signal</td></tr><tr><td align="center">Pin A2</td><td align="center">Analog Signal</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> analog_input = A2; </span><br><span class="line"><span class="type">int</span> digital_input = <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">pinMode</span>(analog_input, INPUT);</span><br><span class="line"><span class="built_in">pinMode</span>(digital_input, INPUT);</span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="type">float</span> analog_value;</span><br><span class="line"><span class="type">int</span> digital_value;</span><br><span class="line"></span><br><span class="line">analog_value = <span class="built_in">analogRead</span>(analog_input) * (<span class="number">5.0</span> / <span class="number">1023.0</span>);</span><br><span class="line">digital_value = <span class="built_in">digitalRead</span>(digital_input);</span><br><span class="line"></span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;Analog voltage value: &quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(analog_value, <span class="number">4</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; V, \t Threshold value: &quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (digital_value == <span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;reached&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;not yet reached&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;----------------------------------------------------------------&quot;</span>);</span><br><span class="line"><span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>通过将位置作为模拟电压输出，可以轻松地将操纵杆集成到各种电子系统中，以提供准确和直观的控制。</p>]]></content>
    
    
    <summary type="html">通过将位置作为模拟电压输出，可以轻松地将操纵杆集成到各种电子系统中，以提供准确和直观的控制。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-xy游戏手柄（19）</title>
    <link href="https://blog.jzxer.cn/20241221/20241221_joystick/"/>
    <id>https://blog.jzxer.cn/20241221/20241221_joystick/</id>
    <published>2024-12-21T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块检测操纵杆的X和Y位置，并将其作为输出引脚处的模拟电压输出。每个轴，X和Y都安装了单独的电位器。在空闲状态下，电位计在中间，这意味着电阻和电压相同。</p><p>如果更改X或Y轴的位置，则电阻会根据新位置而变化。电阻的这种变化导致电阻值之间可以测量的电压值。这允许确定轴的确切位置。</p><p>该模块非常适合在需要精确检测运动的游戏，机器人技术或其他项目中的控制系统等应用程序。通过将位置作为模拟电压输出，可以轻松地将操纵杆集成到各种电子系统中，以提供准确和直观的控制。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Operating voltage</td><td align="center">3,3 V - 5 V</td></tr><tr><td align="center">Dimensions</td><td align="center">19 x 18,5 x 9 mm</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">5 V</td><td align="center">+5V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr><tr><td align="center">Pin A2</td><td align="center">VRy</td></tr><tr><td align="center">Pin A3</td><td align="center">VRx</td></tr><tr><td align="center">Pin 5</td><td align="center">Button</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> joystick_X = A0; <span class="comment">// x-axis signal</span></span><br><span class="line"><span class="type">int</span> joystick_Y = A1; <span class="comment">// y-axis signal</span></span><br><span class="line"><span class="type">int</span> joystick_button = <span class="number">3</span>; <span class="comment">// button</span></span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(joystick_button, INPUT);</span><br><span class="line">  <span class="built_in">digitalWrite</span>(joystick_button, HIGH);  </span><br><span class="line">  Serial.<span class="built_in">begin</span> (<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="type">float</span> temp_x, temp_y;</span><br><span class="line">  <span class="type">int</span> button_value;</span><br><span class="line">   </span><br><span class="line">  temp_x = <span class="built_in">analogRead</span>(joystick_X); </span><br><span class="line">  temp_y = <span class="built_in">analogRead</span>(joystick_Y);</span><br><span class="line">  button_value = <span class="built_in">digitalRead</span>(joystick_button);</span><br><span class="line">   </span><br><span class="line">  Serial.<span class="built_in">print</span> (<span class="string">&quot;x-axis: &quot;</span>); </span><br><span class="line">  Serial.<span class="built_in">print</span> (temp_x, DEC);  </span><br><span class="line">  Serial.<span class="built_in">print</span> (<span class="string">&quot;V, \ty-axis: &quot;</span>);</span><br><span class="line">  Serial.<span class="built_in">print</span> (temp_y, DEC);  </span><br><span class="line">  Serial.<span class="built_in">print</span> (<span class="string">&quot;V, \tbutton: &quot;</span>);</span><br><span class="line">  <span class="keyword">if</span> (button_value == <span class="number">1</span>) &#123;</span><br><span class="line">      Serial.<span class="built_in">println</span>(<span class="string">&quot;not pressed&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span> &#123;</span><br><span class="line">      Serial.<span class="built_in">println</span>(<span class="string">&quot;pressed&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">10</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>通过使用操纵杆模块，可以轻松地将操纵杆集成到各种电子系统中，以提供准确和直观的控制。通过将位置作为模拟电压输出，可以轻松地将操纵杆集成到各种电子系统中，以提供准确和直观的控制。</p>]]></content>
    
    
    <summary type="html">通过将位置作为模拟电压输出，可以轻松地将操纵杆集成到各种电子系统中，以提供准确和直观的控制。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>观《茶馆》，品国相</title>
    <link href="https://blog.jzxer.cn/20241221/20241221_tea_bar/"/>
    <id>https://blog.jzxer.cn/20241221/20241221_tea_bar/</id>
    <published>2024-12-21T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>《<strong>茶馆</strong>》，1982年<a href="https://zh.wikipedia.org/wiki/%E8%B0%A2%E6%B7%BB">谢添</a>执导中国电影，根据<a href="https://zh.wikipedia.org/wiki/%E8%80%81%E8%88%8D">老舍</a>1957年发表的话剧《<a href="https://zh.wikipedia.org/wiki/%E8%8C%B6%E9%A6%86_(%E8%AF%9D%E5%89%A7)">茶馆</a>》改编而来。</p><p>本片获1982年<a href="https://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9B%BD%E6%96%87%E5%8C%96%E9%83%A8%E4%BC%98%E7%A7%80%E5%BD%B1%E7%89%87%E5%A5%96">中国文化部优秀影片奖</a>特别奖[<a href="https://zh.wikipedia.org/zh-cn/%E8%8C%B6%E9%A6%86_(%E7%94%B5%E5%BD%B1)#cite_note-1">1]</a>和<a href="https://zh.wikipedia.org/wiki/%E7%AC%AC3%E5%B1%8A%E4%B8%AD%E5%9B%BD%E7%94%B5%E5%BD%B1%E9%87%91%E9%B8%A1%E5%A5%96">第3届中国电影金鸡奖</a>特别奖[<a href="https://zh.wikipedia.org/zh-cn/%E8%8C%B6%E9%A6%86_(%E7%94%B5%E5%BD%B1)#cite_note-2">2]</a>。</p><h2 id="故事分析"><a href="#故事分析" class="headerlink" title="故事分析"></a>故事分析</h2><p>“虽然我爱国，但是谁爱我啊？“ 说这句话的角色是我整个影片最深刻点的。因为我在他身上看到了我的影子，一辈子正义感十足。路见不平，拔刀相助。但是最终的结果是到了七十多岁还是个卖花生的人。最后三人会面的时候，虽然大家都在调侃和回忆，但是他的无奈尽显在脸上。像他这样不向命运低头，坚持做自己，真的值得吗？最后换来的是连送终的人都没有，怕最后死了没钱，捡了别人丧事的钱币提前烧给自己…</p><p>为国为民的秦二爷，一心想着为国家付出一份力，充满野心。最后自己的四十年沉淀事业被像蚂蚁一样被踩死。岁月在他脸上同样划下残忍的伤疤。不知道在背后经历了多少次的绝望和痛苦。也不知道他挣扎了多少回…</p><p>一辈子只希望过个平凡日子的掌柜。最终也因为世事无常，人生一点都不平常，各种鸡毛到了老的时候尽数显现出来。做了一辈子老实人。但是社会没有放过他。可能一生也没做过什么坏事，但是也是无法善终。挺让人唏嘘的。最后的画面，当大难临头的时候，身边的人都无法留在身边一个一个离开，最后只剩下孤单一人的时候。那种感觉看着真挺不是滋味的。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>他们每一个人的角色都我都看到了我的影子，最早是秦二爷，然后是常四爷，最后是掌柜的…</p><p>变通总是会在经历了大磨难之后开始，我也不知道未来我是什么样子.或许每一次的磨难都成就了现在的我。</p><p>也或许变成了本拉登，谁知道呢？</p><p>我要做的就是遵从自己的内心，成为内心想成为的那个人，没有任何的二元评判，只有做自己，并且活下去。</p>]]></content>
    
    
    <summary type="html">“虽然我爱国，但是谁爱我啊？“ 说这句话的角色是我整个影片最深刻点的。因为我在他身上看到了我的影子，一辈子正义感十足。</summary>
    
    
    
    <category term="观影笔记" scheme="https://blog.jzxer.cn/categories/%E8%A7%82%E5%BD%B1%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="纪录片" scheme="https://blog.jzxer.cn/tags/%E7%BA%AA%E5%BD%95%E7%89%87/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-继电器（18）</title>
    <link href="https://blog.jzxer.cn/20241219/20241219_relais/"/>
    <id>https://blog.jzxer.cn/20241219/20241219_relais/</id>
    <published>2024-12-19T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块包含一个用于切换更高电流的5V继电器。一旦向开关的电压输入端施加5V电压，继电器就会切换施加的电压。这允许对其进行控制，以便安全地打开和关闭较大的电气负载。</p><p>继电器模块有两个输出端子：</p><p><strong>NC（常闭）</strong>：此输出默认关闭，无需电气切换。这意味着只要继电器未激活，电流就会流过这条路径。</p><p><strong>NO（常开）</strong>：默认情况下，此输出是打开的，没有电气开关。这意味着电流仅在继电器激活时流过此路径。</p><p>通过这两个输出端子，您可以控制电路在空闲状态下是闭合还是断开，并通过向继电器的电压输入施加5V来相应地改变电流供应。该模块非常适合需要安全切换更高负载或设备的应用，例如家庭自动化系统、工业控制系统或其他需要可靠电源切换的项目。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Voltage range (AC)</td><td align="center">0 V - 240 V AC at 10 A</td></tr><tr><td align="center">Voltage range (DC)</td><td align="center">0 V - 28 V DC at 10 A</td></tr><tr><td align="center">Required switching current</td><td align="center">ca. 15 - 20 mA</td></tr><tr><td align="center">Relay type</td><td align="center">Changeover switch</td></tr><tr><td align="center">Dimensions</td><td align="center">53 x 18 x 20 mm</td></tr></tbody></table><blockquote><p><strong>注意：在超过30 V的电压下工作，特别是在电源电压（230 V）下工作可能会导致人身伤害，甚至可能致命。我们建议，只有具备适当的技术专长才能进行更高电压的工作。</strong></p></blockquote><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><p><img src="https://oss.jzxer.cn/blog/KY-019.svg" alt="示意图"></p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 10</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> pin = <span class="number">10</span>; </span><br><span class="line"><span class="type">int</span> value;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(pin, INPUT); </span><br><span class="line">  <span class="built_in">digitalWrite</span>(pin, HIGH);</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="comment">// “NO” is now short-circuited</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(pin, HIGH); </span><br><span class="line">  <span class="built_in">delay</span>(delayTime * <span class="number">1000</span>);</span><br><span class="line">  <span class="comment">// “NC” is now short-circuited</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(pin, LOW); </span><br><span class="line">  <span class="built_in">delay</span>(delayTime * <span class="number">1000</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>继电器模块非常适合需要安全切换更高负载或设备的应用，例如家庭自动化系统、工业控制系统或其他需要可靠电源切换的项目。通过简单的代码示例，我们可以轻松控制继电器的开关状态，实现各种自动化控制需求。</p>]]></content>
    
    
    <summary type="html">模块非常适合需要安全切换更高负载或设备的应用，例如家庭自动化系统、工业控制系统或其他需要可靠电源切换的项目。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-无源蜂鸣器（12）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_%20passive_piezo_buzzer/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_%20passive_piezo_buzzer/</id>
    <published>2024-12-18T04:56:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>使用此模块，您可以通过使用PWM信号来控制被动压电蜂鸣器来生成不同的声音。PWM信号是特殊的电信号，可以以不同的频率发送以产生不同的声音。蜂鸣器可以产生1.5 kHz至2.5 kHz的声音。它的电压为3.3 V至5 V，且小巧，紧凑，尺寸为18.5 x 15 mm。如果您在项目中需要声信号或警报音调并且易于集成，则此模块是理想的选择。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Operating voltage</td><td align="center">3,3 V - 5 V</td></tr><tr><td align="center">Tone generation range</td><td align="center">1,5 kHz - 2,5 kHz</td></tr><tr><td align="center">Dimensions</td><td align="center">18,5 x 15 mm</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 3</td><td align="center">Signal</td></tr><tr><td align="center">-</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><h3 id="1-普通版"><a href="#1-普通版" class="headerlink" title="1. 普通版"></a>1. 普通版</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> buzzer = <span class="number">8</span> ; <span class="comment">// Declaration of the buzzer output pin</span></span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(buzzer, OUTPUT); <span class="comment">// Initialization as output pin</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="type">unsigned</span> <span class="type">char</span> i;</span><br><span class="line">  <span class="keyword">while</span>(<span class="number">1</span>) &#123;</span><br><span class="line">    <span class="comment">// In this program, the buzzer is controlled alternately with two different frequencies</span></span><br><span class="line">    <span class="comment">// The signal here consists of a square wave voltage.</span></span><br><span class="line">    <span class="comment">// Turning the buzzer on and off then generates a tone that corresponds approximately to the frequency.</span></span><br><span class="line">    <span class="comment">// The frequency is defined by how long the on and off phases are</span></span><br><span class="line">     </span><br><span class="line">    <span class="comment">// 1.frequency</span></span><br><span class="line">    <span class="keyword">for</span>(i = <span class="number">0</span>; i &lt;<span class="number">80</span>; i++) &#123;</span><br><span class="line">      <span class="built_in">digitalWrite</span>(buzzer, HIGH);</span><br><span class="line">      <span class="built_in">delay</span>(<span class="number">1</span>);</span><br><span class="line">      <span class="built_in">digitalWrite</span>(buzzer, LOW);</span><br><span class="line">      <span class="built_in">delay</span>(<span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 1 second pause</span></span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 2.frequency</span></span><br><span class="line">    <span class="keyword">for</span>(i = <span class="number">0</span>; i &lt;<span class="number">100</span>; i++) &#123;</span><br><span class="line">      <span class="built_in">digitalWrite</span>(buzzer, HIGH);</span><br><span class="line">      <span class="built_in">delay</span>(<span class="number">2</span>) ;</span><br><span class="line">      <span class="built_in">digitalWrite</span>(buzzer, LOW);</span><br><span class="line">      <span class="built_in">delay</span>(<span class="number">2</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 1 second pause</span></span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>无源蜂鸣器产生的声音很大，最小音量为85dB，非常适合需要清晰可听声音信号的应用。例如，这可用于报警系统、警告系统或各种电子设备中的声反馈。</p>]]></content>
    
    
    <summary type="html">它产生的声音很大，最小音量为85dB，非常适合需要清晰可听声音信号的应用。例如，这可用于报警系统、警告系统或各种电子设备中的声反馈。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-三色LED（15）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_3led/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_3led/</id>
    <published>2024-12-18T04:55:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><img src="https://oss.jzxer.cn/blog/KY-016.png" alt="img"></p><p>该LED模块包含通过公共阴极连接的红色，蓝色和绿色LED。红色LED的正向电压为1.8 V，而绿色和蓝色LED则需要2.8V。所有LED的正向电流为20 mA。使用此模块，您可以通过调整单个LED的亮度来创建不同的颜色。它是需要视觉信号或彩色显示器的应用。通用阴极使连接并集成到各种项目中，无论是用于装饰照明，状态显示还是其他创意应用程序。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Forward voltage [Red]</td><td align="center">1.8 V</td></tr><tr><td align="center">Forward voltage [Green, Blue]</td><td align="center">2.8 V</td></tr><tr><td align="center">Forward current</td><td align="center">20 mA</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">LED Red</td></tr><tr><td align="center">Pin 3</td><td align="center">LED Green</td></tr><tr><td align="center">Pin 4</td><td align="center">LED Blue</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><h3 id="1-普通版"><a href="#1-普通版" class="headerlink" title="1. 普通版"></a>1. 普通版</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> led_red = A2; <span class="comment">// Pin for red</span></span><br><span class="line"><span class="type">int</span> led_green = A3; <span class="comment">// Pin for green</span></span><br><span class="line"><span class="type">int</span> led_blue = A4; <span class="comment">// Pin for blue</span></span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(led_red, OUTPUT); </span><br><span class="line">  <span class="built_in">pinMode</span>(led_green, OUTPUT);</span><br><span class="line">  <span class="built_in">pinMode</span>(led_blue, OUTPUT); </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_red, HIGH); <span class="comment">// red LED is switched on</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_green, LOW); <span class="comment">// green LED is switched off</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_blue, LOW); <span class="comment">// blue LED is switched off</span></span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">3000</span>); </span><br><span class="line">  </span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_red, LOW); <span class="comment">// red LED is switched off</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_green, HIGH); <span class="comment">// green LED is switched on</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_blue, LOW); <span class="comment">// blue LED is switched off</span></span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">3000</span>);</span><br><span class="line">   </span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_red, LOW); <span class="comment">// red LED is switched off</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_green, LOW); <span class="comment">// green LED is switched off</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_blue, HIGH); <span class="comment">// blue LED is switched on</span></span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">3000</span>); </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-渐变版"><a href="#2-渐变版" class="headerlink" title="2. 渐变版"></a>2. 渐变版</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// led pin 定义</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> redPin = A2;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> greenPin = A3;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> bluePin = A4;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> freq = <span class="number">5000</span>; <span class="comment">// PWM 信号频率（单位 Hz）</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> redChannel = <span class="number">0</span>; <span class="comment">// PWM 通道</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> greenChannel = <span class="number">1</span>; <span class="comment">// PWM 通道</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> blueChannel = <span class="number">2</span>; <span class="comment">// PWM 通道</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> resolution = <span class="number">8</span>; <span class="comment">// PWM 分辨率，8位代表 0-255 的范围</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">  <span class="built_in">ledcSetup</span>(redChannel, freq, resolution);</span><br><span class="line">  <span class="built_in">ledcAttachPin</span>(redPin, redChannel);</span><br><span class="line">  <span class="built_in">ledcSetup</span>(greenChannel, freq, resolution);</span><br><span class="line">  <span class="built_in">ledcAttachPin</span>(greenPin, greenChannel);</span><br><span class="line">  <span class="built_in">ledcSetup</span>(blueChannel, freq, resolution);</span><br><span class="line">  <span class="built_in">ledcAttachPin</span>(bluePin, blueChannel);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="comment">// 让 PWM 渐变从 0 到 255（亮度从暗到亮）</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> dutyCycle = <span class="number">0</span>; dutyCycle &lt;= <span class="number">255</span>; dutyCycle++) &#123;</span><br><span class="line">    <span class="built_in">ledcWrite</span>(redChannel, dutyCycle); <span class="comment">// 设置 PWM 占空比</span></span><br><span class="line">    <span class="built_in">ledcWrite</span>(greenChannel, <span class="number">255</span> - dutyCycle); <span class="comment">// 设置 PWM 占空比</span></span><br><span class="line">    <span class="built_in">ledcWrite</span>(blueChannel, <span class="number">128</span> - dutyCycle); <span class="comment">// 设置 PWM 占空比</span></span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">10</span>); <span class="comment">// 延迟 10 毫秒，实现渐变效果</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 让 PWM 渐变从 255 到 0（亮度从亮到暗）</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> dutyCycle = <span class="number">255</span>; dutyCycle &gt;= <span class="number">0</span>; dutyCycle--) &#123;</span><br><span class="line">    <span class="built_in">ledcWrite</span>(redChannel, dutyCycle); <span class="comment">// 设置 PWM 占空比</span></span><br><span class="line">    <span class="built_in">ledcWrite</span>(greenChannel, <span class="number">255</span> - dutyCycle); <span class="comment">// 设置 PWM 占空比</span></span><br><span class="line">    <span class="built_in">ledcWrite</span>(blueChannel, <span class="number">128</span> - dutyCycle); <span class="comment">// 设置 PWM 占空比</span></span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">10</span>); <span class="comment">// 延迟 10 毫秒，实现渐变效果</span></span><br><span class="line">  &#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>三色LED模块通过调整单个LED的亮度来创建不同的颜色，非常适合需要视觉信号或彩色显示器的应用。</p>]]></content>
    
    
    <summary type="html">使用此模块，您可以通过调整单个LED的亮度来创建不同的颜色。它是需要视觉信号或彩色显示器的应用。通用阴极使连接并集成到各种项目中，无论是用于装饰照明，状态显示还是其他创意应用程序。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-有源蜂鸣器（5）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_active_piezo_buzzer/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_active_piezo_buzzer/</id>
    <published>2024-12-18T04:55:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块包含一个主动蜂鸣器，当它被提供电压时，会立即发出声音。与无源蜂鸣器不同，该模块不需要外部方波电压来产生声音。一旦向信号引脚施加至少3.3V的电压，蜂鸣器就会自动产生必要的方波电压，并发出频率为2.5kHz的音调。</p><p>蜂鸣器在3.3V至5V的电压范围内工作，需要30mA的最大电流。它产生的声音很大，最小音量为85dB，非常适合需要清晰可听声音信号的应用。例如，这可用于报警系统、警告系统或各种电子设备中的声反馈。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Operating voltage</td><td align="center">3,3 V - 5 V</td></tr><tr><td align="center">Maximum current</td><td align="center">30 mA</td></tr><tr><td align="center">Tone frequency</td><td align="center">2,5kHz ± 300 Hz</td></tr><tr><td align="center">Minimum sound output</td><td align="center">85 dB</td></tr><tr><td align="center">Operating temperature</td><td align="center">-20 °C - 70 °C</td></tr><tr><td align="center">Storage temperature</td><td align="center">-30 °C - 105 °C</td></tr><tr><td align="center">Dimensions</td><td align="center">19 x 15,5 x 11 mm</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 3</td><td align="center">Signal</td></tr><tr><td align="center">-</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><h3 id="1-普通版"><a href="#1-普通版" class="headerlink" title="1. 普通版"></a>1. 普通版</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> buzzer = <span class="number">3</span>;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(buzzer, OUTPUT); </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">digitalWrite</span>(buzzer, HIGH);</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">2000</span>); </span><br><span class="line">  <span class="built_in">digitalWrite</span>(buzzer, LOW); </span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">2000</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>有源蜂鸣器是一种非常方便的发声设备，它不需要外部方波电压来产生声音，只需要提供电压即可。它的声音大，最小音量为85dB，非常适合需要清晰可听声音信号的应用。</p>]]></content>
    
    
    <summary type="html">它产生的声音很大，最小音量为85dB，非常适合需要清晰可听声音信号的应用。例如，这可用于报警系统、警告系统或各种电子设备中的声反馈。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之- NTC温度传感器（13）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_temprature_sensor/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_temprature_sensor/</id>
    <published>2024-12-18T04:55:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块包含一个NTC热敏电阻，可以测量-55°C至+125°C范围内的温度。NTC热敏电阻（负温度系数）具有电阻随温度升高而降低的特性。电阻值的这种变化使得计算相应的温度成为可能。</p><p>温度和电阻之间的关系不是线性的，但可以在数学上近似。电阻的变化可以通过使用分压器来确定。分压器由已知的固定电阻和热敏电阻的可变电阻组成。当向分压器施加电压时，根据电阻值对电压进行分压。通过测量热敏电阻两端的电压，可以计算出电流电阻。</p><p>然后，这些电阻值可以转换为温度。随附的代码示例中描述了确定温度的精确计算方法和数学方法。该模块非常适合需要精确温度测量的应用，例如气候控制、监测系统和其他温度相关过程。由于其高精度和宽测量范围，它为许多温度测量任务提供了可靠的解决方案。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Operating voltage</td><td align="center">3,3 V - 5 V</td></tr><tr><td align="center">Measuring range</td><td align="center">-55 °C to +125 °C</td></tr><tr><td align="center">Measurement accuracy</td><td align="center">± 0,5 °C</td></tr><tr><td align="center">Known resistance</td><td align="center">10 kΩ</td></tr><tr><td align="center">Specific resistance of the NTC</td><td align="center">3950 Ω</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">A2</td><td align="center">Signal</td></tr><tr><td align="center">-</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><h3 id="1-普通版"><a href="#1-普通版" class="headerlink" title="1. 普通版"></a>1. 普通版</h3><p>以下代码我自己算出来是不太准的，可能哪个地方计算的不对，后续优化：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> ntc = A2;</span><br><span class="line"><span class="type">double</span> raw_value;</span><br><span class="line"><span class="type">double</span> voltage;</span><br><span class="line"><span class="type">double</span> temperature;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(ntc, INPUT);</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  raw_value = <span class="built_in">analogRead</span>(ntc); </span><br><span class="line">  voltage = raw_value * <span class="number">5.0</span> / <span class="number">1023.0</span>;</span><br><span class="line"><span class="keyword">if</span> (voltage &gt;= <span class="number">0</span> &amp;&amp; voltage &lt;= <span class="number">5.0</span>) &#123;</span><br><span class="line"><span class="comment">// 使用电压计算温度</span></span><br><span class="line">temperature = ((voltage / <span class="number">5.0</span>) * <span class="number">10000.0</span>) / (<span class="number">1.0</span> - (voltage / <span class="number">5.0</span>));</span><br><span class="line"><span class="comment">// 进一步处理温度值</span></span><br><span class="line">temperature = <span class="number">1.0</span> / ((<span class="number">1.0</span> / <span class="number">298.15</span>) + (<span class="number">1.0</span> / <span class="number">3950.0</span>) * <span class="built_in">log</span>(temperature / <span class="number">10000.0</span>));</span><br><span class="line"><span class="comment">// 将温度从开尔文转换为摄氏度</span></span><br><span class="line">temperature = temperature - <span class="number">273.15</span>;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;Temperature: &quot;</span> + <span class="built_in">String</span>(temperature) + <span class="string">&quot; °C&quot;</span>);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;Invalid voltage value: &quot;</span> + <span class="built_in">String</span>(voltage));</span><br><span class="line">&#125;</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>该模块非常适合需要精确温度测量的应用，例如气候控制、监测系统和其他温度相关过程。由于其高精度和宽测量范围，它为许多温度测量任务提供了可靠的解决方案。</p>]]></content>
    
    
    <summary type="html">该模块非常适合需要精确温度测量的应用，例如气候控制、监测系统和其他温度相关过程。由于其高精度和宽测量范围，它为许多温度测量任务提供了可靠的解决方案。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之- 温湿度模块DHT11（14）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_temprature_wet/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_temprature_wet/</id>
    <published>2024-12-18T04:55:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>DHT11传感器是紧凑设计的温度和湿度传感器的组合。它以±2°C的精度测量0°C至50°C的温度，以±5%的精度测量20%至90%的相对湿度。由于其低采样率，该传感器每两秒钟只提供一次新的读数，使其成为长期测量的理想选择。DHT11易于集成到Arduino和Raspberry Pi等微控制器平台中，并且由于工厂校准，不需要额外的校准。其稳健的设计和可靠性使其成为温室、气候控制系统和仓库监控等连续监测项目的最佳选择。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Chipset</td><td align="center">DHT11</td></tr><tr><td align="center">Communication Protocol</td><td align="center">1-Wire</td></tr><tr><td align="center">Measuring range</td><td align="center">0 °C to 50 °C</td></tr><tr><td align="center">Measurement accuracy</td><td align="center">±2 °C</td></tr><tr><td align="center">Measurement Accuracy</td><td align="center">±5 % RH</td></tr><tr><td align="center">Measurable humidity</td><td align="center">20-90 % RH</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">pin 2</td><td align="center">Signal</td></tr><tr><td align="center">-</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><h3 id="1-普通版"><a href="#1-普通版" class="headerlink" title="1. 普通版"></a>1. 普通版</h3><p>该案例用到以下两个库：</p><ul><li><a href="https://github.com/adafruit/DHT-sensor-library">DHT-sensor-library</a></li><li><a href="https://github.com/adafruit/Adafruit_Sensor">Adafruit Unified Sensor</a></li></ul><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Adafruit_Sensor.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;DHT.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;DHT_U.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> DHTPIN A2</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> DHTTYPE DHT11   <span class="comment">// DHT 11</span></span></span><br><span class="line"><span class="function">DHT <span class="title">dht</span><span class="params">(DHTPIN, DHTTYPE)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">  dht.<span class="built_in">begin</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">  <span class="comment">// Humidity is measured</span></span><br><span class="line">  <span class="type">float</span> humidity = dht.<span class="built_in">readHumidity</span>();</span><br><span class="line">  <span class="comment">// Temperature is measured</span></span><br><span class="line">  <span class="type">float</span> temperature = dht.<span class="built_in">readTemperature</span>();</span><br><span class="line">  <span class="comment">// Checks whether the measurements have run through without errors</span></span><br><span class="line">  <span class="comment">// If an error is detected, an error message is output here</span></span><br><span class="line">  <span class="keyword">if</span> (<span class="built_in">isnan</span>(humidity) || <span class="built_in">isnan</span>(temperature)) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;Error when reading out the sensor&quot;</span>);</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="comment">// Output to the serial console</span></span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;-----------------------------------------------------------&quot;</span>);</span><br><span class="line">  Serial.<span class="built_in">print</span>(<span class="string">&quot; Humidity: &quot;</span>);</span><br><span class="line">  Serial.<span class="built_in">print</span>(humidity);</span><br><span class="line">  Serial.<span class="built_in">print</span>(<span class="string">&quot; %\t&quot;</span>);</span><br><span class="line">  Serial.<span class="built_in">print</span>(<span class="string">&quot; Temperature: &quot;</span>);</span><br><span class="line">  Serial.<span class="built_in">print</span>(temperature);</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot; °C &quot;</span>);</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;-----------------------------------------------------------&quot;</span>);</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot; &quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>DHT11传感器是一款简单易用的温湿度传感器，适用于各种需要测量温度和湿度的场合。通过简单的连接和代码编写，就可以轻松实现温湿度的测量和显示。同时，DHT11传感器具有高精度、低功耗和稳定性等优点，使其成为许多应用场景的首选传感器。</p>]]></content>
    
    
    <summary type="html">DHT11易于集成到Arduino和Raspberry Pi等微控制器平台中，并且由于工厂校准，不需要额外的校准。其稳健的设计和可靠性使其成为温室、气候控制系统和仓库监控等连续监测项目的最佳选择。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-光遮断模块（11）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_%20light_barrier/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_%20light_barrier/</id>
    <published>2024-12-18T04:50:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块包含一个光栅，只要光束不中断，光栅就会发出信号。如果有什么东西挡住了光束，信号也会中断。这使得该模块非常适合需要检测中断或移动的应用。</p><p>光电传感器在3.3V至5V的工作电压下工作，使其与各种微控制器和单板计算机兼容。此类模块通常用于安全系统、计数设备或自动控制系统，以检测物体的存在或移动。</p><p>由于其简单的操作和可靠的检测，该模块为许多需要通道或运动监测的项目提供了实用的解决方案。其紧凑的尺寸和易于集成使其成为广泛应用的有用组件。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Forward voltage [red]</td><td align="center">1,8 V</td></tr><tr><td align="center">Forward voltage [green, blue]</td><td align="center">2,8 V</td></tr><tr><td align="center">Forward current</td><td align="center">20 mA</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">Arduino</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 2</td><td align="center">signal</td></tr><tr><td align="center">5V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><h3 id="1-普通版"><a href="#1-普通版" class="headerlink" title="1. 普通版"></a>1. 普通版</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> pin = <span class="number">2</span>; </span><br><span class="line"><span class="type">int</span> value;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(pin, INPUT); </span><br><span class="line">  <span class="built_in">digitalWrite</span>(pin, HIGH);</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  value = <span class="built_in">digitalRead</span>(pin); </span><br><span class="line">  <span class="keyword">if</span> (value == LOW) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;Signal detected!&quot;</span>);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 100 ms break</span></span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;No signal detected!&quot;</span>);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 100 ms break</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>光遮断模块是一种常用的传感器，可以用于检测物体的存在或移动。它的工作原理是通过检测光束是否被中断来工作，因此可以用于各种安全系统、计数设备或自动控制系统。</p>]]></content>
    
    
    <summary type="html">光电传感器在3.3V至5V的工作电压下工作，使其与各种微控制器和单板计算机兼容。此类模块通常用于安全系统、计数设备或自动控制系统，以检测物体的存在或移动。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-三色LED（10）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_rgb_led_ky009/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_rgb_led_ky009/</id>
    <published>2024-12-18T04:44:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该LED模块包含三个不同的颜色，分别为红色、蓝色和绿色。这三个LED通过公共阴极相互连接，这意味着它们都共享相同的负极连接。红色LED需要1.8V的电压才能点亮，而绿色和蓝色LED每个都需要2.8V的电压。所有LED都在20mA的电流下工作。</p><p>利用这个模块，您可以通过调整单个LED的亮度来创建各种颜色组合。通过混合红色、绿色和蓝色，几乎可以创建可见光谱的所有颜色。该模块非常适合需要视觉信号、显示器或装饰性照明效果的项目。</p><p>紧凑的设计允许轻松集成到各种电路和项目中。无论您是初学者还是经验丰富的开发人员，这款LED模块都能为您的照明需求提供灵活多样的解决方案。得益于清晰的色彩输出和简单的控制，您可以实现创意和令人印象深刻的灯光装置。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Forward voltage [red]</td><td align="center">1,8 V</td></tr><tr><td align="center">Forward voltage [green, blue]</td><td align="center">2,8 V</td></tr><tr><td align="center">Forward current</td><td align="center">20 mA</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 10</td><td align="center">LED RED</td></tr><tr><td align="center">Pin 11</td><td align="center">LED GREEN</td></tr><tr><td align="center">Pin 12</td><td align="center">LED BLUE</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><h3 id="1-普通版"><a href="#1-普通版" class="headerlink" title="1. 普通版"></a>1. 普通版</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> led_red = <span class="number">10</span>; <span class="comment">// Pin for red</span></span><br><span class="line"><span class="type">int</span> led_green = <span class="number">11</span>; <span class="comment">// Pin for green</span></span><br><span class="line"><span class="type">int</span> led_blue = <span class="number">12</span>; <span class="comment">// Pin for blue</span></span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="comment">// Initialization of output pins for the LEDs</span></span><br><span class="line">  <span class="built_in">pinMode</span>(led_red, OUTPUT); </span><br><span class="line">  <span class="built_in">pinMode</span>(led_green, OUTPUT);</span><br><span class="line">  <span class="built_in">pinMode</span>(led_blue, OUTPUT); </span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// Main program loop</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_red, HIGH); <span class="comment">// red LED is switched on</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_green, LOW); <span class="comment">// green LED is switched off</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_blue, LOW); <span class="comment">// blue LED is switched off</span></span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">3000</span>); <span class="comment">// Wait for 3 seconds</span></span><br><span class="line">  </span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_red, LOW); <span class="comment">// red LED is switched off</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_green, HIGH); <span class="comment">// green LED is switched on</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_blue, LOW); <span class="comment">// blue LED is switched off</span></span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">3000</span>); <span class="comment">// Wait for 3 seconds</span></span><br><span class="line">   </span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_red, LOW); <span class="comment">// red LED is switched off</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_green, LOW); <span class="comment">// green LED is switched off</span></span><br><span class="line">  <span class="built_in">digitalWrite</span>(led_blue, HIGH); <span class="comment">// blue LED is switched on</span></span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">3000</span>); <span class="comment">// Wait for 3 seconds</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="2-进阶版"><a href="#2-进阶版" class="headerlink" title="2. 进阶版"></a>2. 进阶版</h3><blockquote><p>注意这里的引脚要支持 pwm</p></blockquote><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="comment">// led pin 定义</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> redPin = A2;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> greenPin = A3;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> bluePin = A4;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> freq = <span class="number">5000</span>; <span class="comment">// PWM 信号频率（单位 Hz）</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> redChannel = <span class="number">0</span>; <span class="comment">// PWM 通道</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> greenChannel = <span class="number">1</span>; <span class="comment">// PWM 通道</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> blueChannel = <span class="number">2</span>; <span class="comment">// PWM 通道</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> resolution = <span class="number">8</span>; <span class="comment">// PWM 分辨率，8位代表 0-255 的范围</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">  <span class="built_in">ledcSetup</span>(redChannel, freq, resolution);</span><br><span class="line">  <span class="built_in">ledcAttachPin</span>(redPin, redChannel);</span><br><span class="line">  <span class="built_in">ledcSetup</span>(greenChannel, freq, resolution);</span><br><span class="line">  <span class="built_in">ledcAttachPin</span>(greenPin, greenChannel);</span><br><span class="line">  <span class="built_in">ledcSetup</span>(blueChannel, freq, resolution);</span><br><span class="line">  <span class="built_in">ledcAttachPin</span>(bluePin, blueChannel);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> dutyCycle = <span class="number">0</span>; dutyCycle &lt;= <span class="number">255</span>; dutyCycle++) &#123;</span><br><span class="line">    <span class="built_in">ledcWrite</span>(redChannel, dutyCycle); <span class="comment">// 设置 PWM 占空比</span></span><br><span class="line">    <span class="built_in">ledcWrite</span>(greenChannel, <span class="number">255</span> - dutyCycle); <span class="comment">// 设置 PWM 占空比</span></span><br><span class="line">    <span class="built_in">ledcWrite</span>(blueChannel, <span class="number">128</span> - dutyCycle); <span class="comment">// 设置 PWM 占空比</span></span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">10</span>); <span class="comment">// 延迟 10 毫秒，实现渐变效果</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 让 PWM 渐变从 255 到 0（亮度从亮到暗）</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> dutyCycle = <span class="number">255</span>; dutyCycle &gt;= <span class="number">0</span>; dutyCycle--) &#123;</span><br><span class="line">    <span class="built_in">ledcWrite</span>(redChannel, dutyCycle); <span class="comment">// 设置 PWM 占空比</span></span><br><span class="line">    <span class="built_in">ledcWrite</span>(greenChannel, <span class="number">255</span> - dutyCycle); <span class="comment">// 设置 PWM 占空比</span></span><br><span class="line">    <span class="built_in">ledcWrite</span>(blueChannel, <span class="number">128</span> - dutyCycle); <span class="comment">// 设置 PWM 占空比</span></span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">10</span>); <span class="comment">// 延迟 10 毫秒，实现渐变效果</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>通过这个模块，您可以通过调整单个LED的亮度来创建各种颜色组合。通过混合红色、绿色和蓝色，几乎可以创建可见光谱的所有颜色。该模块非常适合需要视觉信号、显示器或装饰性照明效果的项目。</p>]]></content>
    
    
    <summary type="html">利用这个模块，您可以通过调整单个LED的亮度来创建各种颜色组合。通过混合红色、绿色和蓝色，几乎可以创建可见光谱的所有颜色。该</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-红外接收模块（9）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_reciver_ky022/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_reciver_ky022/</id>
    <published>2024-12-18T04:40:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块可以接收红外信号，并将其转换为输出端发出的数字信号。当检测到红外信号时，模块上的集成LED会短暂闪烁，提供信号接收的视觉确认。它非常适合使用红外遥控器或其他红外信号的项目。由于其简单的操作和可靠的信号处理，该模块可以很容易地集成到各种电子项目中，例如实现远程控制或无线传输数据。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Operating voltage</td><td align="center">3,3 V - 5 V</td></tr><tr><td align="center">Operating current</td><td align="center">0,4 - 1,5 mA</td></tr><tr><td align="center">Reception range</td><td align="center">18 m</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>在PCB上，可以直接焊接所需的电阻器。焊接电阻器的位置位于PCB上连接引脚的正上方。</p><p><img src="https://oss.jzxer.cn/blog/KY-022.svg" alt="示例图"></p><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 10</td><td align="center">Signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><p>在两个传感器模块的帮助下，KY-005和KY-022可以构建具有红外遥控器和红外接收器的系统。为此，除两个模块外，还需要两个Arduinos。然后，这些充当信号的发射机和接收器。</p><p>借助传感器模块KY-022，可以构建红外接收器。为此，只需要红外接收器模块和一个单一的arduino。Arduino充当接收器，并将信号输出到串行控制台。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;PinDefinitionsAndMore.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;IRremote.hpp&gt;</span> </span></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * Specify which protocol(s) should be used for decoding.</span></span><br><span class="line"><span class="comment"> * If no protocol is defined, all protocols (except Bang&amp;Olufsen) are active.</span></span><br><span class="line"><span class="comment"> * This must be done before the #include &lt;IRremote.hpp&gt;.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="comment">//#define DECODE_DENON        // Includes Sharp</span></span><br><span class="line"><span class="comment">//#define DECODE_JVC</span></span><br><span class="line"><span class="comment">//#define DECODE_KASEIKYO</span></span><br><span class="line"><span class="comment">//#define DECODE_PANASONIC    // Alias for DECODE_KASEIKYO</span></span><br><span class="line"><span class="comment">//#define DECODE_LG</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> DECODE_NEC          <span class="comment">// Includes Apple and Onkyo. To enable all protocols, simply comment/uncomment this line.</span></span></span><br><span class="line"><span class="comment">//#define DECODE_SAMSUNG</span></span><br><span class="line"><span class="comment">//#define DECODE_SONY</span></span><br><span class="line"><span class="comment">//#define DECODE_RC5</span></span><br><span class="line"><span class="comment">//#define DECODE_RC6</span></span><br><span class="line"><span class="comment">//#define DECODE_BOSEWAVE</span></span><br><span class="line"><span class="comment">//#define DECODE_LEGO_PF</span></span><br><span class="line"><span class="comment">//#define DECODE_MAGIQUEST</span></span><br><span class="line"><span class="comment">//#define DECODE_WHYNTER</span></span><br><span class="line"><span class="comment">//#define DECODE_FAST</span></span><br><span class="line"><span class="comment">//#define DECODE_DISTANCE_WIDTH // Universal decoder for pulse distance protocols</span></span><br><span class="line"><span class="comment">//#define DECODE_HASH         // special decoder for all protocols</span></span><br><span class="line"><span class="comment">//#define DECODE_BEO          // This protocol must always be activated manually, i.e. it is NOT activated if no protocol is defined. It prevents the decoding of SONY!</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//#define DEBUG               // Enable this to get lots of nice debug output from the decoders.</span></span><br><span class="line"><span class="comment">//#define RAW_BUFFER_LENGTH  750 // 750 is required for remote controls for air conditioning systems. Standard is 200.</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    Serial.<span class="built_in">begin</span>(<span class="number">115200</span>);</span><br><span class="line">    <span class="keyword">while</span> (!Serial)</span><br><span class="line">    IrReceiver.<span class="built_in">begin</span>(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="built_in">F</span>(<span class="string">&quot;KY-022: Infrared receiver test&quot;</span>));</span><br><span class="line">    Serial.<span class="built_in">print</span>(<span class="built_in">F</span>(<span class="string">&quot;Ready to receive IR signals from protocols: &quot;</span>));</span><br><span class="line">    <span class="built_in">printActiveIRProtocols</span>(&amp;Serial);</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="built_in">F</span>(<span class="string">&quot;at the pin &quot;</span> <span class="built_in">STR</span>(IR_RECEIVE_PIN)));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (IrReceiver.<span class="built_in">decode</span>()) &#123;</span><br><span class="line">        <span class="keyword">if</span> (IrReceiver.decodedIRData.protocol == UNKNOWN) &#123;</span><br><span class="line">            Serial.<span class="built_in">println</span>(<span class="built_in">F</span>(<span class="string">&quot;Received noise or an unknown (or not yet activated) protocol&quot;</span>));</span><br><span class="line">            IrReceiver.<span class="built_in">printIRResultRawFormatted</span>(&amp;Serial, <span class="literal">true</span>);</span><br><span class="line">            IrReceiver.<span class="built_in">resume</span>(); </span><br><span class="line">        &#125; </span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            IrReceiver.<span class="built_in">resume</span>();</span><br><span class="line">            IrReceiver.<span class="built_in">printIRResultShort</span>(&amp;Serial);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>红外接收模块KY-022是一种简单而有效的红外信号接收器，可以轻松集成到各种电子项目中。通过连接到Arduino，可以轻松实现红外信号的接收和解析，从而实现远程控制或其他红外信号传输功能。</p>]]></content>
    
    
    <summary type="html">该模块可以接收红外信号，并将其转换为输出端发出的数字信号。当检测到红外信号时，模块上的集成LED会短暂闪烁，提供信号接收的视觉确认。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-红外发射模块（8）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_%20infrared_ky005/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_%20infrared_ky005/</id>
    <published>2024-12-18T04:35:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块包含一个发射红外光的发光二极管。红外光是人眼看不见的，但它经常被用于许多实际应用中，如遥控器或物体识别。二极管在1.1V的电压和20mA的电流下工作。根据输入电压，使用串联电阻器保护LED并确保平稳运行非常重要。这些串联电阻器确保通过二极管的电流量正确，使其能够有效和安全地使用。该模块非常适合需要红外光的项目，为您的红外应用提供了一种可靠而简单的解决方案。</p><table><thead><tr><th align="center">技术参数</th><th align="center"></th></tr></thead><tbody><tr><td align="center">正向电压（Vf）</td><td align="center">1,1 V</td></tr><tr><td align="center">正向电流（If）</td><td align="center">20 mA</td></tr><tr><td align="center">发射波长</td><td align="center">940 nm</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>在PCB上，可以直接焊接所需的电阻器。焊接电阻器的位置位于PCB上连接引脚的正上方。</p><p><img src="https://oss.jzxer.cn/blog/005-Vorwiderst%C3%A4nde.svg" alt="平面图"></p><p><img src="https://oss.jzxer.cn/blog/KY-005.svg" alt="示例图"></p><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 10</td><td align="center">Signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><p>注意：借助两个传感器模块KY-005和KY-022，可以构建一个具有红外遥控和红外接收器的系统。为此，除了两个模块外，还需要两个开发板。然后，用它们来充当信号的发射器和接收器。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">if</span> !defined(ARDUINO_ESP32C3_DEV) </span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> DISABLE_CODE_FOR_RECEIVER </span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;PinDefinitionsAndMore.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;IRremote.hpp&gt;</span> </span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="built_in">pinMode</span>(LED_BUILTIN, OUTPUT);</span><br><span class="line"></span><br><span class="line">    Serial.<span class="built_in">begin</span>(<span class="number">115200</span>);</span><br><span class="line">    <span class="keyword">while</span> (!Serial)</span><br><span class="line"></span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="built_in">F</span>(<span class="string">&quot;KY-005: Infrared transmitter test&quot;</span>));</span><br><span class="line">    Serial.<span class="built_in">print</span>(<span class="built_in">F</span>(<span class="string">&quot;Send IR signals to pin &quot;</span>));</span><br><span class="line">    Serial.<span class="built_in">println</span>(IR_SEND_PIN);</span><br><span class="line"></span><br><span class="line">    IrSender.<span class="built_in">begin</span>();</span><br><span class="line">    <span class="built_in">disableLEDFeedback</span>(); </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">uint8_t</span> sCommand = <span class="number">0x34</span>;</span><br><span class="line"><span class="type">uint8_t</span> sRepeats = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>();</span><br><span class="line">    Serial.<span class="built_in">print</span>(<span class="built_in">F</span>(<span class="string">&quot;Now being sent: address=0x00, command=0x&quot;</span>));</span><br><span class="line">    Serial.<span class="built_in">print</span>(sCommand, HEX);</span><br><span class="line">    Serial.<span class="built_in">print</span>(<span class="built_in">F</span>(<span class="string">&quot;, repeats=&quot;</span>));</span><br><span class="line">    Serial.<span class="built_in">print</span>(sRepeats);</span><br><span class="line">    Serial.<span class="built_in">println</span>();</span><br><span class="line"></span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="built_in">F</span>(<span class="string">&quot;Sending standard NEC with 8-bit address&quot;</span>));</span><br><span class="line">    Serial.<span class="built_in">flush</span>();</span><br><span class="line"></span><br><span class="line">    <span class="comment">// The receiver output for the first loop must be: Protocol=NEC Address=0x102 Command=0x34 Raw-Data=0xCB340102 (32 bits)</span></span><br><span class="line">    IrSender.<span class="built_in">sendNEC</span>(<span class="number">0x00</span>, sCommand, sRepeats);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/*</span></span><br><span class="line"><span class="comment">     * Increment send values</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    sCommand += <span class="number">0x11</span>;</span><br><span class="line">    sRepeats++;</span><br><span class="line">    <span class="keyword">if</span> (sRepeats &gt; <span class="number">4</span>) &#123;</span><br><span class="line">        sRepeats = <span class="number">4</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">1000</span>); </span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>红外发射模块KY-005是一种常用的红外发射器，可以用于各种红外应用，如遥控器或物体识别。通过连接到Arduino开发板，可以轻松实现红外信号的发射。</p>]]></content>
    
    
    <summary type="html">该模块包含一个发射红外光的发光二极管。红外光是人眼看不见的，但它经常被用于许多实际应用中，如遥控器或物体识别。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-光敏电阻KY018（17）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_%20Photoresistor/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_%20Photoresistor/</id>
    <published>2024-12-18T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><blockquote><p>注意！此传感器不再包含在传感器套件的版本2中，已被KY-054传感器所取代！</p></blockquote><p>该模块包含一个LDR电阻（光传感器），其电阻值随亮度的增加而降低。可以使用电压分离器确定LDR的电阻，其中已知电压在10kΩ的固定电阻上分配，并且LDR的可变电阻。通过测量电压分离器中的电压，可以计算LDR的电流电阻，因此可以计算光强度。模块的工作电压在3.3 V和5 V之间，紧凑型尺寸为21 x 15 x 6 mm，促进整合到各个项目中。该模块非常适合要检测到环境亮度的应用，例如在自动化照明系统中，亮度传感器和许多其他光相关应用。确定亮度的确切计算方法在附加的代码示例中描述。</p><p><img src="https://oss.jzxer.cn/blog/KY-018-LDR-Kurve-EN.svg" alt="img"></p><table><thead><tr><th align="center">Technical data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">Operating voltage</td><td align="center">3,3 V - 5 V</td></tr><tr><td align="center">Fixed known resistance</td><td align="center">10 kΩ</td></tr><tr><td align="center">Dimensions</td><td align="center">21 x 15 x 6 mm</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 10</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> photo_resistor = A2;</span><br><span class="line"><span class="type">int</span> rawValue;</span><br><span class="line"><span class="type">float</span> voltage;</span><br><span class="line"><span class="type">float</span> resistance;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">rawValue = <span class="built_in">analogRead</span>(photo_resistor);</span><br><span class="line">voltage = rawValue * (<span class="number">5.0</span> / <span class="number">1023</span>) * <span class="number">1000</span>;</span><br><span class="line">resistance = <span class="number">10000</span> * (voltage / (<span class="number">5000.0</span> - voltage));</span><br><span class="line"></span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;Voltage level: &quot;</span>);   <span class="comment">// 电压值</span></span><br><span class="line">Serial.<span class="built_in">print</span>(voltage);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot; mV&quot;</span>);</span><br><span class="line">Serial.<span class="built_in">print</span>(<span class="string">&quot;,\t Resistance value: &quot;</span>);  <span class="comment">// 电阻值</span></span><br><span class="line">Serial.<span class="built_in">print</span>(resistance);</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot; Ohm&quot;</span>);</span><br><span class="line">Serial.<span class="built_in">println</span>(<span class="string">&quot;----------------------------------------------------------------&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="built_in">delay</span>(<span class="number">500</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>光敏电阻是一种常见的传感器，可以用于检测环境亮度。通过测量光敏电阻的电阻值，可以计算出环境亮度。在本文中，我们介绍了光敏电阻KY018的使用方法，包括引脚连接和代码示例。希望本文对您有所帮助！</p>]]></content>
    
    
    <summary type="html">按钮模块配备了一个按钮，该按钮在按下按钮时将两个信号输出在一起。它的工作电压范围为3.3 V至5 V，并且可以在-25°C至105°C的温度范围内进行操作。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-倾斜开关（16）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_angle/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_angle/</id>
    <published>2024-12-18T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>该模块包含一个倾斜开关，该开关根据倾斜角度缩短输入引脚。开关内部是一个小球，当位置变化时，可以连接触点。当模块倾斜时，球会移动并关闭电路，产生信号。这个简单但有效的原理可以检测倾斜的变化，非常适合诸如安全和警报系统，运动检测或各种项目中的开关机制等应用。该模块易于集成，并提供了一种可靠的检测倾斜度和运动的方式。</p><p>还有另外一款：</p><p><img src="https://oss.jzxer.cn/blog/202412181501080.png" alt="KY020"></p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin 10</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> pin = <span class="number">10</span>; </span><br><span class="line"><span class="type">int</span> value;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(pin, INPUT); </span><br><span class="line">  <span class="built_in">digitalWrite</span>(pin, HIGH);</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  value = <span class="built_in">digitalRead</span>(pin); </span><br><span class="line">  <span class="keyword">if</span> (value == LOW) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;Signal detected!&quot;</span>);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 100 ms break</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>倾斜开关是一种简单的传感器，可以检测倾斜的变化。它适用于各种项目，如安全和警报系统、运动检测等。通过将倾斜开关连接到开发板，可以轻松检测倾斜的变化，并根据需要进行相应的操作。</p>]]></content>
    
    
    <summary type="html">当模块倾斜时，球会移动并关闭电路，产生信号。这个简单但有效的原理可以检测倾斜的变化，非常适合诸如安全和警报系统，运动检测或各种项目中的开关机制等应用。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-按钮模块（7）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_button_ky004/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_button_ky004/</id>
    <published>2024-12-18T04:30:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>按钮模块配备了一个按钮，该按钮在按下按钮时将两个信号输出在一起。它的工作电压范围为3.3 V至5 V，并且可以在-25°C至105°C的温度范围内进行操作。按钮模块的使用寿命为100,000个致动周期，可提供高可靠性和耐用性。按钮模块是需要可靠且耐用的按钮开关的应用。</p><p>初学者通常会遇到两个常见的问题：</p><p><strong>1. 浮动输入问题</strong></p><p>症状：输入引脚的读取值与按钮的按压状态不匹配。</p><p>原因：输入引脚不使用上拉或下拉电阻。</p><p>解决方案：使用上拉或下拉电阻。它将在本教程中描述</p><p><strong>2. 聊天现象</strong></p><p>仅在某些需要检测到按压数量的应用中考虑它。</p><p>症状：按下按钮，但Arduino代码多次检测到。</p><p>原因：由于机械和物理问题，按钮（或开关）的状态很快在低和高之间切换几次</p><table><thead><tr><th align="center">技术参数</th><th align="center"></th></tr></thead><tbody><tr><td align="center">电压</td><td align="center">3,3 V - 5 V</td></tr><tr><td align="center">尺寸</td><td align="center">18 x 15 x 6 mm</td></tr><tr><td align="center">使用寿命</td><td align="center">100,000</td></tr><tr><td align="center">适用温度</td><td align="center">-25 °C - 105°C</td></tr></tbody></table><h2 id="工作原理"><a href="#工作原理" class="headerlink" title="工作原理"></a>工作原理</h2><p>一般这种按钮都有四个引脚，但是大多数情况下只需要连接其中两个即可。</p><p>![按钮引脚展示](<a href="https://oss.jzxer.cn/blog/%E6%88%AA%E5%B1%8F2025-01-15">https://oss.jzxer.cn/blog/截屏2025-01-15</a> 10.41.40.png)</p><p>那么问题来了，既然只用到了两个引脚，为什么它却有四个引脚呢？</p><p>答案是这样的设计能让它在 pcb 板上更好的抵抗外界的压力。</p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p><img src="https://oss.jzxer.cn/blog/截屏2025-01-15 10.43.08.png" alt="引脚状态" style="zoom:50%;" />pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">PB6</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><h3 id="1-监听按键点击事件"><a href="#1-监听按键点击事件" class="headerlink" title="1. 监听按键点击事件"></a>1. 监听按键点击事件</h3><p>该实例使用的是 STM32C103开发板</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">const</span> <span class="type">int</span> BUTTON_PIN = PB6; <span class="comment">// the number of the pushbutton pin</span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> lastState = HIGH; <span class="comment">// the previous state from the input pin</span></span><br><span class="line"><span class="type">int</span> currentState;    <span class="comment">// the current reading from the input pin</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">  <span class="built_in">pinMode</span>(BUTTON_PIN, INPUT_PULLUP);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  currentState = <span class="built_in">digitalRead</span>(BUTTON_PIN);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span>(lastState == LOW &amp;&amp; currentState == HIGH)</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;The state changed from LOW to HIGH&quot;</span>);</span><br><span class="line"></span><br><span class="line">  lastState = currentState;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-按键长按事件"><a href="#2-按键长按事件" class="headerlink" title="2. 按键长按事件"></a>2. 按键长按事件</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">const</span> <span class="type">int</span> BUTTON_PIN = PB6; <span class="comment">// the number of the pushbutton pin</span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> lastState = LOW; <span class="comment">// the previous state from the input pin</span></span><br><span class="line"><span class="type">int</span> currentState;    <span class="comment">// the current reading from the input pin</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">  <span class="built_in">pinMode</span>(BUTTON_PIN, INPUT_PULLUP);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  currentState = <span class="built_in">digitalRead</span>(BUTTON_PIN);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span>(lastState == HIGH &amp;&amp; currentState == LOW)</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;The button is pressed&quot;</span>);</span><br><span class="line">  <span class="keyword">else</span> <span class="keyword">if</span>(lastState == LOW &amp;&amp; currentState == HIGH)</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;The button is released&quot;</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// save the the last state</span></span><br><span class="line">  lastState = currentState;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="3-防抖"><a href="#3-防抖" class="headerlink" title="3. 防抖"></a>3. 防抖</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">const</span> <span class="type">int</span> BUTTON_PIN = PB6;        <span class="comment">// the number of the pushbutton pin</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> DEBOUNCE_DELAY = <span class="number">50</span>;   <span class="comment">// the debounce time; increase if the output flickers</span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> lastSteadyState = LOW;       <span class="comment">// the previous steady state from the input pin</span></span><br><span class="line"><span class="type">int</span> lastFlickerableState = LOW;  <span class="comment">// the previous flickerable state from the input pin</span></span><br><span class="line"><span class="type">int</span> currentState;                <span class="comment">// the current reading from the input pin</span></span><br><span class="line"></span><br><span class="line"><span class="type">unsigned</span> <span class="type">long</span> lastDebounceTime = <span class="number">0</span>;  <span class="comment">// the last time the output pin was toggled</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">  <span class="built_in">pinMode</span>(BUTTON_PIN, INPUT_PULLUP);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="comment">// read the state of the switch/button:</span></span><br><span class="line">  currentState = <span class="built_in">digitalRead</span>(BUTTON_PIN);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (currentState != lastFlickerableState) &#123;</span><br><span class="line">    <span class="comment">// reset the debouncing timer</span></span><br><span class="line">    lastDebounceTime = <span class="built_in">millis</span>();</span><br><span class="line">    <span class="comment">// save the the last flickerable state</span></span><br><span class="line">    lastFlickerableState = currentState;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> ((<span class="built_in">millis</span>() - lastDebounceTime) &gt; DEBOUNCE_DELAY) &#123;</span><br><span class="line">    <span class="keyword">if</span> (lastSteadyState == HIGH &amp;&amp; currentState == LOW)</span><br><span class="line">      Serial.<span class="built_in">println</span>(<span class="string">&quot;The button is pressed&quot;</span>);</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (lastSteadyState == LOW &amp;&amp; currentState == HIGH)</span><br><span class="line">      Serial.<span class="built_in">println</span>(<span class="string">&quot;The button is released&quot;</span>);</span><br><span class="line"></span><br><span class="line">    lastSteadyState = currentState;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>按钮模块的使用非常简单，只需要连接两个引脚即可。在代码中，我们可以通过读取引脚的状态来判断按钮是否被按下，从而实现各种功能。同时，为了防止按钮的抖动对系统的影响，我们还可以使用防抖技术来确保按钮状态的稳定。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://arduinogetstarted.com/tutorials/arduino-button">https://arduinogetstarted.com/tutorials/arduino-button</a></p><p><a href="https://github.com/ArduinoGetStarted/button">ezbutton</a></p>]]></content>
    
    
    <summary type="html">按钮模块配备了一个按钮，该按钮在按下按钮时将两个信号输出在一起。它的工作电压范围为3.3 V至5 V，并且可以在-25°C至105°C的温度范围内进行操作。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-震动开关（6）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_%20vibrations/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_%20vibrations/</id>
    <published>2024-12-18T04:20:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>KY-002冲击和振动传感器是用于检测冲击和振动的精确模块。它由导电外壳和一个内部弹簧组成。如果发生冲击，弹簧将接触接触到外壳，从而产生电信号。这种简单的设计使振动可靠，快速检测。</p><p>从技术上讲，KY-002的电压在3.3 V到5 V范围内运行。紧凑的设计有助于整合到各种项目中。KY-002凭借其稳健性和易用性，非常适合在安全系统中应用，需要检测到门和窗户上的振动，以及用于监视机器和系统的工业自动化中，以实现异常振动。该传感器还可以用于测量运动和健身部门的振动和冲击。</p><table><thead><tr><th align="center">技术参数</th><th align="center"></th></tr></thead><tbody><tr><td align="center">电压</td><td align="center">3,3 V - 5 V</td></tr><tr><td align="center">尺寸</td><td align="center">18,5 mm x 15 mm</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p><img src="https://oss.jzxer.cn/blog/KY-002.svg" alt="示例图"></p><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> pin = <span class="number">10</span>; </span><br><span class="line"><span class="type">int</span> value;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(pin, INPUT); </span><br><span class="line">  <span class="built_in">digitalWrite</span>(pin, HIGH);</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  value = <span class="built_in">digitalRead</span>(pin); </span><br><span class="line">  <span class="keyword">if</span> (value == LOW) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;Signal detected!&quot;</span>);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 100 ms break</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>KY-002冲击和振动传感器是一种简单而有效的工具，用于检测冲击和振动。它具有紧凑的设计和可靠的性能，适用于各种安全系统和工业自动化应用。通过简单的连接和编程，可以轻松地将KY-002集成到项目中，实现快速、可靠的振动检测。</p>]]></content>
    
    
    <summary type="html">KY-002冲击和振动传感器是用于检测冲击和振动的精确模块。它由导电外壳和一个内部弹簧组成。如果发生冲击，弹簧将接触接触到外壳，从而产生电信号。这种简单的设计使振动可靠，快速检测。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-温度模拟传感器（5）</title>
    <link href="https://blog.jzxer.cn/20241218/20241219_%20temperature/"/>
    <id>https://blog.jzxer.cn/20241218/20241219_%20temperature/</id>
    <published>2024-12-18T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><strong>DS18B20</strong> 是一种数字温度模拟传感器，可以测量摄氏度的温度。它提供不同的精度级别，从9位到12位。这意味着它可以提供非常精确的测量，更高的比特数可以提供更精确的温度测量。DS18B20的测量范围在 <strong>-55°C</strong> 至 <strong>+125°C</strong> 之间，在 <strong>-10°C</strong> 至 <strong>+85°C</strong> 的范围内精度为 <strong>±0.5°C</strong>。</p><p><strong>DS18B20</strong> 使用所谓的 <strong>1-wire</strong> 总线与微处理器通信。这意味着只需要一条数据线来交换信息。传感器甚至可以从这条数据线获取电力，因此不需要额外的电源。这种操作模式被称为 <strong>“寄生功率”</strong>。</p><p>每个DS18B20传感器都有一个唯一的64位串行代码。它就像每个传感器的唯一标识号，这意味着几个DS18B20传感器可以连接到同一个1-Wire总线，并且仍然可以单独识别和读取。这使得使用多个传感器实现网络变得容易。</p><p>该传感器在许多应用中特别有用，例如在供暖、通风和空调（HVAC）系统中，用于建筑物或机器中的温度监测以及过程监测和控制系统中。其他应用包括医疗设备、工业控制系统和冷却系统中的温度监测。</p><p>总之，DS18B20为温度测量提供了一种精确灵活的解决方案，布线简单，可以集成到具有多个传感器的复杂系统中。</p><table><thead><tr><th align="center">Technical Data</th><th align="center"></th></tr></thead><tbody><tr><td align="center">芯片</td><td align="center">DS18B20</td></tr><tr><td align="center">通信协议</td><td align="center">1-Wire</td></tr><tr><td align="center">准确性</td><td align="center">9 to 12 Bit</td></tr><tr><td align="center">测量范围</td><td align="center">-55 °C to +125 °C</td></tr><tr><td align="center">测量精度</td><td align="center">±0.5 °C from -10 °C to +85 °C</td></tr></tbody></table><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p><img src="https://oss.jzxer.cn/blog/KY-001.svg" alt="示例图"></p><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;OneWire.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;DallasTemperature.h&gt;</span>            </span></span><br><span class="line"></span><br><span class="line"><span class="function">OneWire <span class="title">oneWire</span><span class="params">(<span class="number">2</span>)</span></span>;</span><br><span class="line"><span class="function">DallasTemperature <span class="title">sensors</span><span class="params">(&amp;oneWire)</span></span>;    </span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">    sensors.<span class="built_in">begin</span>();  </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    sensors.<span class="built_in">requestTemperatures</span>();</span><br><span class="line">    Serial.<span class="built_in">print</span>(<span class="string">&quot;Temperature: &quot;</span>);</span><br><span class="line">    Serial.<span class="built_in">print</span>(sensors.<span class="built_in">getTempCByIndex</span>(<span class="number">0</span>));</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot; °C&quot;</span>);</span><br><span class="line"></span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">1000</span>); </span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2>]]></content>
    
    
    <summary type="html">DS18B20是一种数字温度模拟传感器，可以测量摄氏度的温度。它提供不同的精度级别，从9位到12位。这意味着它可以提供非常精确的测量，更高的比特数可以提供更精确的温度测量。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>108个传感器之-霍尔磁力（4）</title>
    <link href="https://blog.jzxer.cn/20241218/20241218_huoer/"/>
    <id>https://blog.jzxer.cn/20241218/20241218_huoer/</id>
    <published>2024-12-18T02:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>霍尔磁力传感器是一个具有特定磁性特性的集成电路，其已集成到传感器中的所有必要组件，并提供了对磁场的敏感性。该模块在高达+80°C的温度下稳定运行，对温度和供应电压变化不敏感。每个设备配备了 <strong>A3144</strong> 芯片组，包括反向极性保护二极管，方形霍尔电压发生器，温度补偿电路，小信号放大器，施密特触发器和开放的收集器输出。</p><p><img src="https://oss.jzxer.cn/blog/KY-003.svg" alt="引脚图"></p><p>该模块在接触磁场时，晶体管会切换，可以在信号输出处读出作为数字值。此功能使霍尔磁力传感器非常适合需要对磁场检测和测量的应用，从而提供高可靠性和精度。</p><h2 id="引脚连接"><a href="#引脚连接" class="headerlink" title="引脚连接"></a>引脚连接</h2><p>pin 引脚连接开发板的 gpio 接口即可：</p><table><thead><tr><th align="center">DEV BOARD</th><th align="center">Sensor</th></tr></thead><tbody><tr><td align="center">Pin</td><td align="center">signal</td></tr><tr><td align="center">5 V</td><td align="center">+V</td></tr><tr><td align="center">GND</td><td align="center">GND</td></tr></tbody></table><h2 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> hall = <span class="number">10</span>; </span><br><span class="line"><span class="type">int</span> value;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(hall, INPUT); </span><br><span class="line">  <span class="built_in">digitalWrite</span>(hall, HIGH);</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">  value = <span class="built_in">digitalRead</span>(hall); </span><br><span class="line">  <span class="keyword">if</span> (value == LOW) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;Signal detected&quot;</span>);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 100 ms break</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>待完善…</p>]]></content>
    
    
    <summary type="html">该模块在接触磁场时，晶体管会切换，可以在信号输出处读出作为数字值。此功能使霍尔磁力传感器非常适合需要对磁场检测和测量的应用，从而提供高可靠性和精度。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>初识 STM32F103C8T6</title>
    <link href="https://blog.jzxer.cn/20241216/20241216_%20STM32F103C8T6_intro/"/>
    <id>https://blog.jzxer.cn/20241216/20241216_%20STM32F103C8T6_intro/</id>
    <published>2024-12-16T03:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>之前一直都是在玩 arduino 和 esp 系列的开发板，一直没玩过 stm 系列的，所以上网买了几款来尝试一下，顺便了解一下它们之间的区别。买了两种颜色，该实验使用的是蓝色款。个人还是比较喜欢粉色（hhh，粉嫩大叔的怪癖）。</p><p><img src="https://oss.jzxer.cn/blog/image-20241216093330524.png" alt="蓝色款版本才 6 块钱"></p><blockquote><p>由于使用 platformIO 开发代码写入有问题，所以接下来的操作是基于 arduino-IDE。</p></blockquote><h2 id="环境配置"><a href="#环境配置" class="headerlink" title="环境配置"></a>环境配置</h2><h3 id="1-软件安装"><a href="#1-软件安装" class="headerlink" title="1. 软件安装"></a>1. 软件安装</h3><p>这一步我默认你安装了 arduino-IDE，不知道怎么安装的话，上百度搜搜就有了。</p><p>然后需要让 arduino 支持 stm32 系列的开发板，所以这里需要录入相关的开发板插件，打开首选项控制面板，把以下的开发板管理地址填入,然后点击确定。</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://dan.drown.org/stm32duino/package_STM32duino_index.json</span><br></pre></td></tr></table></figure><p>![首选项](<a href="https://oss.jzxer.cn/blog/%E6%88%AA%E5%B1%8F2025-01-06">https://oss.jzxer.cn/blog/截屏2025-01-06</a> 12.08.44.png)</p><h3 id="2-下载开发板套件"><a href="#2-下载开发板套件" class="headerlink" title="2. 下载开发板套件"></a>2. 下载开发板套件</h3><p>然后在开发板管理器中搜索 stm32，安装相应的开发板套件。</p><p>![开发板管理](<a href="https://oss.jzxer.cn/blog/%E6%88%AA%E5%B1%8F2025-01-06">https://oss.jzxer.cn/blog/截屏2025-01-06</a> 12.10.29.png)</p><h3 id="3-选择当前开发板"><a href="#3-选择当前开发板" class="headerlink" title="3. 选择当前开发板"></a>3. 选择当前开发板</h3><p>最后在开发板选择栏，选择当前使用的开发板就可以了，完美！</p><p>![选择开发板](<a href="https://oss.jzxer.cn/blog/%E6%88%AA%E5%B1%8F2025-01-06">https://oss.jzxer.cn/blog/截屏2025-01-06</a> 12.12.12.png)</p><h3 id="4-引线连接"><a href="#4-引线连接" class="headerlink" title="4. 引线连接"></a>4. 引线连接</h3><p>首先需要有一个 usb 转 TTL 模块，按如下所示连接开发板。</p><p><img src="https://oss.jzxer.cn/blog/jiexian.jpeg" alt="TTL"></p><p>到这一步，我们就可以把ttl 模块连上电脑烧录程序了。</p><h2 id="引脚记录"><a href="#引脚记录" class="headerlink" title="引脚记录"></a>引脚记录</h2><ul><li><code>GND</code>，<code>3.3v</code>都是内部相通的。<code>3.3v</code>直接给单片机供电，<code>5v</code>接口会通过LDO稳压芯片给单片机供电。</li><li><code>microusb</code>只能供电不能下载。</li><li>另一端<code>swd</code>下载接口，和跳线帽搭配使用 ，<code>Jlink</code>，<code>STlink</code>都可以。</li><li>跳线后可串口下载（<code>PA9</code> <code>PA10</code>）,建议<code>swd</code>,方便测试。</li><li><code>PC13</code>连指示灯。</li><li><code>B12``PB15</code>是<code>SPI2</code>，<code>PA4``7</code>是<code>SPI1</code>, <code>PA9</code> <code>PA10</code>是<code>串口1</code>，<code>PA2</code> <code>PA3</code>是<code>串口2</code>,<code>PB10</code> <code>PB11</code>是<code>串口3</code>，<code>PB6~PB9</code>一般可以用于<code>pwm输出</code>，对应<code>TIM4</code>。 <code>PC13~15</code> 用于时钟相关。</li><li><code>VB</code>用于后备电源供电。</li><li><code>ADC</code>接口：<code>PA0~PA7,PB0 PB1</code>。<strong>尽量别用<code>PB3 PB4 PA15</code>，它们和下载口相关。</strong></li></ul><h2 id="代码烧录"><a href="#代码烧录" class="headerlink" title="代码烧录"></a>代码烧录</h2><blockquote><p>这里需要注意的点是，如果是使用串口烧录，波特率一定要是 115200。不然烧录就会失败。</p></blockquote><h3 id="1-点亮板上的-LED"><a href="#1-点亮板上的-LED" class="headerlink" title="1. 点亮板上的 LED"></a>1. 点亮板上的 LED</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">115200</span>);</span><br><span class="line">  <span class="built_in">pinMode</span>(PC13, OUTPUT);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;Hello World!&quot;</span>);</span><br><span class="line">  <span class="built_in">digitalWrite</span>(PC13, HIGH);</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">  <span class="built_in">digitalWrite</span>(PC13, LOW);</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-点亮-OLED-屏幕"><a href="#2-点亮-OLED-屏幕" class="headerlink" title="2. 点亮 OLED 屏幕"></a>2. 点亮 OLED 屏幕</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line">#include &lt;Adafruit_GFX.h&gt;</span><br><span class="line">#include &lt;Adafruit_SSD1306.h&gt;</span><br><span class="line"></span><br><span class="line">#define OLED_I2C_ADDR 0x3C</span><br><span class="line">#define OLED_WIDTH 128</span><br><span class="line">#define OLED_HEIGHT 64</span><br><span class="line"></span><br><span class="line">Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT, &amp;Wire);</span><br><span class="line"></span><br><span class="line">#define FRAME_DELAY (42)</span><br><span class="line">#define FRAME_WIDTH (64)</span><br><span class="line">#define FRAME_HEIGHT (64)</span><br><span class="line">#define FRAME_COUNT (sizeof(frames) / sizeof(frames[0]))</span><br><span class="line">const byte PROGMEM frames[][512] = &#123;</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,248,0,0,0,0,0,0,1,252,0,0,0,0,0,0,3,158,0,0,0,0,0,0,3,15,0,0,0,0,0,0,3,7,0,0,0,0,0,0,3,131,128,248,0,0,0,0,1,193,193,252,0,0,0,1,129,224,225,206,0,0,0,7,224,224,241,134,0,0,0,15,248,112,115,134,0,0,0,14,62,56,59,134,0,0,0,12,15,156,27,134,0,0,0,12,7,254,31,134,0,0,0,14,1,254,31,134,0,0,0,7,128,127,31,134,0,0,0,3,224,31,15,134,0,0,0,1,248,31,15,134,0,0,0,0,126,15,15,134,0,0,0,0,31,7,15,134,0,0,0,0,7,131,135,134,0,0,0,0,3,195,7,134,0,0,0,0,1,192,7,134,0,0,0,0,3,224,3,134,0,0,0,0,31,240,1,6,0,0,0,0,127,240,0,6,0,0,0,0,248,0,0,6,0,0,0,1,224,0,0,6,0,0,0,3,192,0,0,6,0,0,0,7,128,0,0,6,0,0,0,15,2,0,0,7,0,0,0,30,15,248,0,7,128,0,0,28,31,255,0,3,192,0,0,56,60,127,0,1,224,0,0,56,120,3,128,0,240,0,0,56,240,1,128,0,120,0,0,31,224,1,192,0,60,0,0,31,224,0,192,0,28,0,0,15,240,0,224,0,28,0,0,63,248,0,96,0,28,0,0,60,56,0,112,0,28,0,0,28,28,0,112,0,28,0,0,28,14,0,224,0,28,0,0,14,14,1,192,0,28,0,0,14,7,131,128,0,28,0,0,7,3,255,0,0,28,0,0,3,1,254,0,0,28,0,0,3,128,28,0,0,28,0,0,1,128,0,0,0,28,0,0,1,192,0,0,0,28,0,0,0,192,0,0,0,28,0,0,0,224,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,62,0,63,224,28,0,0,0,31,1,255,252,28,0,0,0,7,255,255,255,156,0,0,0,1,255,128,7,252,0,0,0,0,124,0,0,252,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,248,0,0,0,0,0,0,1,252,0,0,0,0,0,0,3,158,0,0,0,0,0,0,3,15,0,0,0,0,0,0,3,7,0,0,0,0,0,0,3,131,128,248,0,0,0,0,1,193,193,252,0,0,0,1,129,224,225,206,0,0,0,7,224,224,241,134,0,0,0,15,248,112,115,134,0,0,0,14,62,56,59,134,0,0,0,12,15,156,27,134,0,0,0,12,7,254,31,134,0,0,0,14,1,254,31,134,0,0,0,7,128,127,31,134,0,0,0,3,224,31,15,134,0,0,0,1,248,31,15,134,0,0,0,0,126,15,15,134,0,0,0,0,31,7,15,134,0,0,0,0,7,131,135,134,0,0,0,0,3,195,7,134,0,0,0,0,1,192,7,134,0,0,0,0,3,224,3,134,0,0,0,0,31,240,1,6,0,0,0,0,127,240,0,6,0,0,0,0,248,0,0,6,0,0,0,1,224,0,0,6,0,0,0,3,192,0,0,6,0,0,0,7,128,0,0,6,0,0,0,15,2,0,0,7,0,0,0,30,15,248,0,7,128,0,0,28,31,255,0,3,192,0,0,56,60,127,0,1,224,0,0,56,120,3,128,0,240,0,0,56,240,1,128,0,120,0,0,31,224,1,192,0,60,0,0,31,224,0,192,0,28,0,0,15,240,0,224,0,28,0,0,63,248,0,96,0,28,0,0,60,56,0,112,0,28,0,0,28,28,0,112,0,28,0,0,28,14,0,224,0,28,0,0,14,14,1,192,0,28,0,0,14,7,131,128,0,28,0,0,7,3,255,0,0,28,0,0,3,1,254,0,0,28,0,0,3,128,28,0,0,28,0,0,1,128,0,0,0,28,0,0,1,192,0,0,0,28,0,0,0,192,0,0,0,28,0,0,0,224,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,62,0,63,224,28,0,0,0,31,1,255,252,28,0,0,0,7,255,255,255,156,0,0,0,1,255,128,7,252,0,0,0,0,124,0,0,252,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,248,0,0,0,0,0,0,1,252,0,0,0,0,0,0,3,158,0,0,0,0,0,0,3,15,0,0,0,0,0,0,3,7,0,0,0,0,0,0,3,131,128,248,0,0,0,0,1,193,193,252,0,0,0,1,129,224,225,206,0,0,0,7,224,224,241,134,0,0,0,15,248,112,115,134,0,0,0,14,62,56,59,134,0,0,0,12,15,156,27,134,0,0,0,12,7,254,31,134,0,0,0,14,1,254,31,134,0,0,0,7,128,127,31,134,0,0,0,3,224,31,15,134,0,0,0,1,248,31,15,134,0,0,0,0,126,15,15,134,0,0,0,0,31,7,15,134,0,0,0,0,7,131,135,134,0,0,0,0,3,195,7,134,0,0,0,0,1,192,7,134,0,0,0,0,3,224,3,134,0,0,0,0,31,240,1,6,0,0,0,0,127,240,0,6,0,0,0,0,248,0,0,6,0,0,0,1,224,0,0,6,0,0,0,3,192,0,0,6,0,0,0,7,128,0,0,6,0,0,0,15,2,0,0,7,0,0,0,30,15,248,0,7,128,0,0,28,31,255,0,3,192,0,0,56,60,127,0,1,224,0,0,56,120,3,128,0,240,0,0,56,240,1,128,0,120,0,0,31,224,1,192,0,60,0,0,31,224,0,192,0,28,0,0,15,240,0,224,0,28,0,0,63,248,0,96,0,28,0,0,60,56,0,112,0,28,0,0,28,28,0,112,0,28,0,0,28,14,0,224,0,28,0,0,14,14,1,192,0,28,0,0,14,7,131,128,0,28,0,0,7,3,255,0,0,28,0,0,3,1,254,0,0,28,0,0,3,128,28,0,0,28,0,0,1,128,0,0,0,28,0,0,1,192,0,0,0,28,0,0,0,192,0,0,0,28,0,0,0,224,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,62,0,63,224,28,0,0,0,31,1,255,252,28,0,0,0,7,255,255,255,156,0,0,0,1,255,128,7,252,0,0,0,0,124,0,0,252,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,248,0,0,0,0,0,0,1,252,0,0,0,0,0,0,3,158,0,0,0,0,0,0,3,15,0,0,0,0,0,0,3,7,0,0,0,0,0,0,3,131,128,248,0,0,0,0,1,193,193,252,0,0,0,1,129,224,225,206,0,0,0,7,224,224,241,134,0,0,0,15,248,112,115,134,0,0,0,14,62,56,59,134,0,0,0,12,15,156,27,134,0,0,0,12,7,254,31,134,0,0,0,14,1,254,31,134,0,0,0,7,128,127,31,134,0,0,0,3,224,31,15,134,0,0,0,1,248,31,15,134,0,0,0,0,126,15,15,134,0,0,0,0,31,7,15,134,0,0,0,0,7,131,135,134,0,0,0,0,3,195,7,134,0,0,0,0,1,192,7,134,0,0,0,0,3,224,3,134,0,0,0,0,31,240,1,6,0,0,0,0,127,240,0,6,0,0,0,0,248,0,0,6,0,0,0,1,224,0,0,6,0,0,0,3,192,0,0,6,0,0,0,7,128,0,0,6,0,0,0,15,2,0,0,7,0,0,0,30,15,248,0,7,128,0,0,28,31,255,0,3,192,0,0,56,60,127,0,1,224,0,0,56,120,3,128,0,240,0,0,56,240,1,128,0,120,0,0,31,224,1,192,0,60,0,0,31,224,0,192,0,28,0,0,15,240,0,224,0,28,0,0,63,248,0,96,0,28,0,0,60,56,0,112,0,28,0,0,28,28,0,112,0,28,0,0,28,14,0,224,0,28,0,0,14,14,1,192,0,28,0,0,14,7,131,128,0,28,0,0,7,3,255,0,0,28,0,0,3,1,254,0,0,28,0,0,3,128,28,0,0,28,0,0,1,128,0,0,0,28,0,0,1,192,0,0,0,28,0,0,0,192,0,0,0,28,0,0,0,224,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,62,0,63,224,28,0,0,0,31,1,255,252,28,0,0,0,7,255,255,255,156,0,0,0,1,255,128,7,252,0,0,0,0,124,0,0,252,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,240,0,0,0,0,0,0,3,248,0,0,0,0,0,0,7,188,0,0,0,0,0,0,7,30,0,0,0,0,0,0,7,15,0,0,0,0,0,0,7,7,128,248,0,0,0,0,3,131,193,252,0,0,0,0,3,193,227,220,0,0,0,3,129,224,243,142,0,0,0,7,240,240,115,142,0,0,0,15,252,120,59,142,0,0,0,28,63,188,27,142,0,0,0,28,15,254,31,142,0,0,0,28,1,254,31,142,0,0,0,14,0,127,31,142,0,0,0,15,192,31,15,142,0,0,0,7,240,31,15,134,0,0,0,0,252,15,15,134,0,0,0,0,63,7,15,134,0,0,0,0,15,131,135,134,0,0,0,0,3,195,7,134,0,0,0,0,1,192,7,134,0,0,0,0,3,224,3,134,0,0,0,0,31,240,1,6,0,0,0,0,127,240,0,6,0,0,0,0,248,0,0,6,0,0,0,1,224,0,0,6,0,0,0,3,192,0,0,6,0,0,0,7,128,0,0,6,0,0,0,15,2,0,0,7,0,0,0,30,15,248,0,7,128,0,0,28,31,255,0,3,192,0,0,56,60,127,0,1,224,0,0,56,120,3,128,0,240,0,0,56,240,1,128,0,120,0,0,31,224,1,192,0,60,0,0,31,224,0,192,0,28,0,0,15,240,0,224,0,28,0,0,63,248,0,96,0,28,0,0,60,56,0,112,0,28,0,0,28,28,0,112,0,28,0,0,28,14,0,224,0,28,0,0,14,14,1,192,0,28,0,0,14,7,131,128,0,28,0,0,7,3,255,0,0,28,0,0,3,1,254,0,0,28,0,0,3,128,28,0,0,28,0,0,1,128,0,0,0,28,0,0,1,192,0,0,0,28,0,0,0,192,0,0,0,28,0,0,0,224,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,62,0,63,224,28,0,0,0,31,1,255,252,28,0,0,0,7,255,255,255,156,0,0,0,1,255,128,7,252,0,0,0,0,124,0,0,252,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,224,0,0,0,0,0,0,7,240,0,0,0,0,0,0,15,248,0,0,0,0,0,0,14,60,0,0,0,0,0,0,14,30,0,0,0,0,0,0,14,15,0,240,0,0,0,0,7,7,129,248,0,0,0,0,7,131,195,252,0,0,0,0,3,192,227,12,0,0,0,3,129,224,115,12,0,0,0,15,248,240,59,14,0,0,0,15,255,120,31,14,0,0,0,28,31,254,31,14,0,0,0,28,3,254,31,14,0,0,0,28,0,127,31,14,0,0,0,30,0,31,15,14,0,0,0,15,224,31,15,142,0,0,0,7,252,15,15,142,0,0,0,0,255,7,15,142,0,0,0,0,15,131,135,142,0,0,0,0,3,195,7,142,0,0,0,0,1,192,7,142,0,0,0,0,3,224,3,142,0,0,0,0,31,240,1,6,0,0,0,0,127,240,0,6,0,0,0,0,248,0,0,6,0,0,0,1,224,0,0,6,0,0,0,3,192,0,0,6,0,0,0,7,128,0,0,6,0,0,0,15,2,0,0,7,0,0,0,30,15,248,0,7,128,0,0,28,31,255,0,3,192,0,0,56,60,127,0,1,224,0,0,56,120,3,128,0,240,0,0,56,240,1,128,0,120,0,0,31,224,1,192,0,60,0,0,31,224,0,192,0,28,0,0,15,240,0,224,0,28,0,0,63,248,0,96,0,28,0,0,60,56,0,112,0,28,0,0,28,28,0,112,0,28,0,0,28,14,0,224,0,28,0,0,14,14,1,192,0,28,0,0,14,7,131,128,0,28,0,0,7,3,255,0,0,28,0,0,3,1,254,0,0,28,0,0,3,128,28,0,0,28,0,0,1,128,0,0,0,28,0,0,1,192,0,0,0,28,0,0,0,192,0,0,0,28,0,0,0,224,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,62,0,63,224,28,0,0,0,31,1,255,252,28,0,0,0,7,255,255,255,156,0,0,0,1,255,128,7,252,0,0,0,0,124,0,0,252,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,231,128,0,0,0,0,0,0,227,192,0,0,0,0,0,0,225,192,0,0,0,0,0,0,240,224,0,0,0,0,0,0,112,112,62,0,0,0,0,48,56,56,127,0,0,0,0,252,28,60,119,0,0,0,1,255,30,28,227,128,0,0,3,143,239,14,227,128,0,0,3,131,255,6,227,128,0,0,3,128,127,135,227,128,0,0,1,224,31,135,195,128,0,0,0,248,15,135,195,128,0,0,0,126,7,135,195,128,0,0,0,31,135,199,195,128,0,0,0,7,195,195,195,128,0,0,0,1,195,195,195,128,0,0,0,0,225,195,195,0,0,0,0,0,225,195,195,0,0,0,0,7,240,3,195,0,0,0,0,31,240,1,195,0,0,0,0,127,240,1,195,0,0,0,0,240,16,0,3,0,0,0,1,224,0,0,3,0,0,0,7,192,0,0,3,0,0,0,15,0,0,0,3,0,0,0,14,15,128,0,7,0,0,0,12,63,240,0,7,0,0,0,12,127,254,0,3,128,0,0,15,240,63,0,3,128,0,0,7,192,7,0,1,192,0,0,3,0,3,128,0,224,0,0,0,0,3,128,0,112,0,0,15,224,1,128,0,120,0,0,63,240,1,192,0,60,0,0,60,120,0,192,0,28,0,0,24,60,0,224,0,28,0,0,28,28,0,224,0,28,0,0,12,14,1,192,0,28,0,0,14,14,3,128,0,28,0,0,6,7,199,0,0,28,0,0,7,3,254,0,0,28,0,0,3,1,254,0,0,28,0,0,3,128,28,0,0,28,0,0,1,128,0,0,0,28,0,0,1,192,0,0,0,28,0,0,0,224,0,0,0,28,0,0,0,240,0,0,0,28,0,0,0,124,0,0,0,28,0,0,0,30,0,0,0,28,0,0,0,15,128,255,128,28,0,0,0,7,255,255,252,28,0,0,0,1,255,255,255,156,0,0,0,0,252,0,31,252,0,0,0,0,0,0,1,252,0,0,0,0,0,0,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,63,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,115,128,0,0,0,0,0,96,97,128,0,0,0,0,1,240,113,192,0,0,0,0,3,248,113,192,0,0,0,0,7,188,48,192,0,0,0,0,7,30,56,224,0,0,0,0,7,15,56,224,240,0,0,0,3,135,152,99,248,0,0,0,1,195,216,115,188,0,0,0,1,225,220,115,28,0,0,0,0,240,220,119,12,0,0,0,0,112,252,119,28,0,0,0,0,56,248,126,28,0,0,0,0,24,120,126,24,0,0,0,0,24,120,124,56,0,0,0,0,24,120,124,56,0,0,0,127,220,112,124,56,0,0,1,255,252,48,120,48,0,0,1,248,252,48,248,112,0,0,3,128,124,0,248,112,0,0,3,192,28,0,240,112,0,0,1,248,0,0,112,96,0,0,0,255,0,0,32,224,0,0,0,31,128,0,0,224,0,0,0,3,192,0,0,192,0,0,0,0,240,0,1,192,0,0,0,0,120,0,1,192,0,0,0,0,60,0,1,192,0,0,0,0,14,0,1,128,0,0,31,192,14,0,1,192,0,0,63,240,6,0,1,192,0,0,56,112,7,0,0,192,0,0,56,56,7,0,0,192,0,0,28,28,3,0,0,224,0,0,28,28,3,128,0,112,0,0,12,14,7,128,0,56,0,0,14,14,7,0,0,28,0,0,6,7,142,0,0,28,0,0,7,3,252,0,0,28,0,0,7,1,252,0,0,28,0,0,3,128,56,0,0,28,0,0,3,128,0,0,0,28,0,0,1,192,0,0,0,28,0,0,1,224,0,0,0,28,0,0,0,240,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,60,0,0,0,28,0,0,0,31,0,0,0,28,0,0,0,7,192,0,0,28,0,0,0,3,255,192,0,28,0,0,0,1,255,255,0,28,0,0,0,0,3,255,240,28,0,0,0,0,0,7,254,28,0,0,0,0,0,0,63,252,0,0,0,0,0,0,3,252,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,31,0,0,0,0,0,3,240,63,128,0,0,0,0,7,248,113,192,0,0,0,0,7,56,113,192,0,0,0,0,6,24,113,192,0,0,0,0,6,28,97,192,0,0,0,0,7,28,97,128,0,0,0,0,7,12,97,128,0,0,0,0,7,12,225,128,0,0,0,0,3,14,225,128,0,0,0,30,3,14,227,135,0,0,0,127,3,142,227,143,192,0,0,119,131,143,195,159,224,0,0,99,195,143,195,188,224,0,0,112,243,143,135,56,96,0,0,120,115,15,135,112,96,0,0,56,59,15,6,224,224,0,0,28,31,15,14,225,192,0,0,14,31,14,15,193,192,0,0,7,15,14,15,131,128,0,0,7,135,12,31,131,128,0,0,3,131,0,31,7,0,0,0,1,192,0,62,7,0,0,0,0,224,0,30,14,0,0,0,0,224,0,28,28,0,0,0,0,112,0,8,28,0,0,3,128,56,0,0,56,0,0,31,224,56,0,0,56,0,0,63,240,28,0,0,112,0,0,56,120,28,0,0,112,0,0,24,56,12,0,0,224,0,0,28,28,12,0,0,224,0,0,28,28,14,0,0,192,0,0,14,14,14,0,0,192,0,0,14,14,14,0,0,192,0,0,6,7,28,0,0,192,0,0,7,7,156,0,0,224,0,0,7,3,248,0,0,224,0,0,3,128,240,0,0,120,0,0,3,128,112,0,0,60,0,0,1,192,0,0,0,28,0,0,0,224,0,0,0,28,0,0,0,224,0,0,0,28,0,0,0,112,0,0,0,28,0,0,0,56,0,0,0,28,0,0,0,60,0,0,0,28,0,0,0,31,0,0,0,28,0,0,0,15,128,0,0,28,0,0,0,7,240,0,0,28,0,0,0,1,252,0,0,28,0,0,0,0,63,128,0,28,0,0,0,0,7,240,0,28,0,0,0,0,0,254,0,28,0,0,0,0,0,31,192,28,0,0,0,0,0,3,252,28,0,0,0,0,0,0,127,252,0,0,0,0,0,0,31,252,0,0,0,0,0,0,1,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,127,1,240,0,0,0,0,0,119,131,248,0,0,0,0,0,227,135,60,0,0,0,0,0,227,135,28,0,0,0,0,0,227,142,28,0,0,0,0,0,227,142,28,0,0,0,15,128,227,140,24,0,0,0,31,192,227,156,56,0,0,0,60,224,227,156,56,0,0,0,56,224,195,152,48,0,0,0,56,112,195,184,112,0,0,0,56,48,195,184,112,0,0,0,28,56,195,240,97,240,0,0,28,29,195,240,231,248,0,0,14,29,195,224,231,56,0,0,6,13,195,193,206,28,0,0,7,15,199,193,156,28,0,0,3,135,135,131,184,56,0,0,3,135,135,131,112,56,0,0,1,195,135,7,240,112,0,0,1,195,134,7,224,240,0,0,0,225,0,15,193,224,0,0,0,224,0,15,129,192,0,0,0,112,0,31,3,128,0,1,128,112,0,14,7,128,0,31,224,56,0,4,7,0,0,63,240,56,0,0,14,0,0,28,120,28,0,0,28,0,0,28,56,28,0,0,60,0,0,28,28,28,0,0,56,0,0,14,12,28,0,0,112,0,0,14,14,28,0,0,96,0,0,14,14,28,0,0,224,0,0,7,7,28,0,0,224,0,0,7,7,152,0,0,192,0,0,3,3,248,0,0,192,0,0,3,129,240,0,0,192,0,0,3,128,240,0,0,224,0,0,1,192,32,0,0,224,0,0,0,192,0,0,0,120,0,0,0,224,0,0,0,60,0,0,0,112,0,0,0,28,0,0,0,112,0,0,0,28,0,0,0,56,0,0,0,28,0,0,0,28,0,0,0,28,0,0,0,15,0,0,0,28,0,0,0,7,192,0,0,28,0,0,0,3,240,0,0,28,0,0,0,0,252,0,0,28,0,0,0,0,63,0,0,28,0,0,0,0,15,224,0,28,0,0,0,0,1,248,0,28,0,0,0,0,0,126,0,28,0,0,0,0,0,31,192,28,0,0,0,0,0,7,248,28,0,0,0,0,0,0,255,252,0,0,0,0,0,0,31,252,0,0,0,0,0,0,3,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,0,0,0,0,0,0,254,3,224,0,0,0,0,0,231,7,240,0,0,0,0,1,199,14,56,0,0,0,0,1,195,14,56,0,0,0,0,1,195,12,56,0,0,0,0,1,195,28,56,0,0,0,15,1,195,28,48,0,0,0,63,129,195,24,112,0,0,0,57,193,195,56,112,0,0,0,48,225,195,56,112,0,0,0,112,225,195,48,96,0,0,0,56,113,195,112,225,224,0,0,56,113,199,224,231,240,0,0,28,57,135,225,199,248,0,0,28,29,135,193,206,56,0,0,14,29,135,195,156,24,0,0,14,15,135,131,184,56,0,0,7,15,135,135,120,56,0,0,3,7,135,7,240,112,0,0,3,135,134,7,224,224,0,0,1,195,6,15,192,224,0,0,1,195,0,15,129,192,0,0,0,224,0,31,3,128,0,0,0,224,0,31,7,128,0,0,0,112,0,14,7,0,0,15,192,112,0,12,14,0,0,63,224,56,0,0,28,0,0,60,240,56,0,0,28,0,0,24,56,24,0,0,56,0,0,28,24,24,0,0,112,0,0,28,28,28,0,0,112,0,0,12,12,28,0,0,224,0,0,14,14,28,0,0,224,0,0,14,6,28,0,0,192,0,0,7,7,56,0,0,192,0,0,7,7,184,0,0,192,0,0,3,3,240,0,0,192,0,0,3,128,240,0,0,224,0,0,1,192,96,0,0,224,0,0,1,192,0,0,0,120,0,0,0,224,0,0,0,60,0,0,0,224,0,0,0,28,0,0,0,112,0,0,0,28,0,0,0,56,0,0,0,28,0,0,0,60,0,0,0,28,0,0,0,30,0,0,0,28,0,0,0,15,128,0,0,28,0,0,0,3,224,0,0,28,0,0,0,1,252,0,0,28,0,0,0,0,127,0,0,28,0,0,0,0,15,192,0,28,0,0,0,0,3,240,0,28,0,0,0,0,0,252,0,28,0,0,0,0,0,31,128,28,0,0,0,0,0,7,240,28,0,0,0,0,0,0,255,252,0,0,0,0,0,0,31,252,0,0,0,0,0,0,3,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,3,128,0,0,0,0,1,252,7,224,0,0,0,0,1,206,15,240,0,0,0,0,1,134,12,112,0,0,0,0,1,135,28,48,0,0,0,0,1,135,28,48,0,0,0,0,1,135,24,112,0,0,0,30,1,135,56,112,0,0,0,63,129,135,56,96,0,0,0,127,129,135,48,224,0,0,0,113,193,135,112,224,0,0,0,96,193,135,112,192,0,0,0,112,225,134,224,195,224,0,0,112,115,135,225,199,240,0,0,56,115,135,193,206,112,0,0,56,59,135,195,156,56,0,0,28,59,143,131,184,56,0,0,14,31,143,135,120,48,0,0,14,31,15,7,112,112,0,0,7,15,14,14,224,224,0,0,7,7,14,15,193,224,0,0,3,135,12,31,129,192,0,0,1,194,0,31,131,128,0,0,1,192,0,31,7,128,0,0,0,224,0,30,7,0,0,0,0,224,0,28,14,0,0,7,128,112,0,8,30,0,0,63,224,112,0,0,28,0,0,63,240,56,0,0,56,0,0,56,112,56,0,0,112,0,0,56,56,24,0,0,112,0,0,28,24,24,0,0,224,0,0,28,28,24,0,0,224,0,0,12,12,24,0,0,192,0,0,14,14,28,0,0,192,0,0,14,7,56,0,1,192,0,0,7,7,184,0,1,192,0,0,7,3,240,0,0,192,0,0,3,129,240,0,0,224,0,0,3,128,96,0,0,224,0,0,1,192,0,0,0,120,0,0,1,224,0,0,0,60,0,0,0,224,0,0,0,28,0,0,0,112,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,60,0,0,0,28,0,0,0,30,0,0,0,28,0,0,0,15,128,0,0,28,0,0,0,7,224,0,0,28,0,0,0,1,252,0,0,28,0,0,0,0,127,0,0,28,0,0,0,0,15,192,0,28,0,0,0,0,3,240,0,28,0,0,0,0,0,254,0,28,0,0,0,0,0,31,128,28,0,0,0,0,0,7,240,28,0,0,0,0,0,0,255,252,0,0,0,0,0,0,31,252,0,0,0,0,0,0,3,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,3,128,0,0,0,0,1,252,7,224,0,0,0,0,1,206,15,240,0,0,0,0,1,134,12,112,0,0,0,0,1,135,28,48,0,0,0,0,1,135,28,48,0,0,0,0,1,135,24,112,0,0,0,30,1,135,56,112,0,0,0,63,129,135,56,96,0,0,0,127,129,135,48,224,0,0,0,113,193,135,112,224,0,0,0,96,193,135,112,192,0,0,0,112,225,134,224,195,224,0,0,112,115,135,225,199,240,0,0,56,115,135,193,206,112,0,0,56,59,135,195,156,56,0,0,28,59,143,131,184,56,0,0,14,31,143,135,120,48,0,0,14,31,15,7,112,112,0,0,7,15,14,14,224,224,0,0,7,7,14,15,193,224,0,0,3,135,12,31,129,192,0,0,1,194,0,31,131,128,0,0,1,192,0,31,7,128,0,0,0,224,0,30,7,0,0,0,0,224,0,28,14,0,0,7,128,112,0,8,30,0,0,63,224,112,0,0,28,0,0,63,240,56,0,0,56,0,0,56,112,56,0,0,112,0,0,56,56,24,0,0,112,0,0,28,24,24,0,0,224,0,0,28,28,24,0,0,224,0,0,12,12,24,0,0,192,0,0,14,14,28,0,0,192,0,0,14,7,56,0,1,192,0,0,7,7,184,0,1,192,0,0,7,3,240,0,0,192,0,0,3,129,240,0,0,224,0,0,3,128,96,0,0,224,0,0,1,192,0,0,0,120,0,0,1,224,0,0,0,60,0,0,0,224,0,0,0,28,0,0,0,112,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,60,0,0,0,28,0,0,0,30,0,0,0,28,0,0,0,15,128,0,0,28,0,0,0,7,224,0,0,28,0,0,0,1,252,0,0,28,0,0,0,0,127,0,0,28,0,0,0,0,15,192,0,28,0,0,0,0,3,240,0,28,0,0,0,0,0,254,0,28,0,0,0,0,0,31,128,28,0,0,0,0,0,7,240,28,0,0,0,0,0,0,255,252,0,0,0,0,0,0,31,252,0,0,0,0,0,0,3,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,3,128,0,0,0,0,1,252,7,224,0,0,0,0,1,206,15,240,0,0,0,0,1,134,12,112,0,0,0,0,1,135,28,48,0,0,0,0,1,135,28,48,0,0,0,0,1,135,24,112,0,0,0,30,1,135,56,112,0,0,0,63,129,135,56,96,0,0,0,127,129,135,48,224,0,0,0,113,193,135,112,224,0,0,0,96,193,135,112,192,0,0,0,112,225,134,224,195,224,0,0,112,115,135,225,199,240,0,0,56,115,135,193,206,112,0,0,56,59,135,195,156,56,0,0,28,59,143,131,184,56,0,0,14,31,143,135,120,48,0,0,14,31,15,7,112,112,0,0,7,15,14,14,224,224,0,0,7,7,14,15,193,224,0,0,3,135,12,31,129,192,0,0,1,194,0,31,131,128,0,0,1,192,0,31,7,128,0,0,0,224,0,30,7,0,0,0,0,224,0,28,14,0,0,7,128,112,0,8,30,0,0,63,224,112,0,0,28,0,0,63,240,56,0,0,56,0,0,56,112,56,0,0,112,0,0,56,56,24,0,0,112,0,0,28,24,24,0,0,224,0,0,28,28,24,0,0,224,0,0,12,12,24,0,0,192,0,0,14,14,28,0,0,192,0,0,14,7,56,0,1,192,0,0,7,7,184,0,1,192,0,0,7,3,240,0,0,192,0,0,3,129,240,0,0,224,0,0,3,128,96,0,0,224,0,0,1,192,0,0,0,120,0,0,1,224,0,0,0,60,0,0,0,224,0,0,0,28,0,0,0,112,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,60,0,0,0,28,0,0,0,30,0,0,0,28,0,0,0,15,128,0,0,28,0,0,0,7,224,0,0,28,0,0,0,1,252,0,0,28,0,0,0,0,127,0,0,28,0,0,0,0,15,192,0,28,0,0,0,0,3,240,0,28,0,0,0,0,0,254,0,28,0,0,0,0,0,31,128,28,0,0,0,0,0,7,240,28,0,0,0,0,0,0,255,252,0,0,0,0,0,0,31,252,0,0,0,0,0,0,3,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,3,128,0,0,0,0,1,252,7,224,0,0,0,0,1,206,15,240,0,0,0,0,1,134,12,112,0,0,0,0,1,135,28,48,0,0,0,0,1,135,28,48,0,0,0,0,1,135,24,112,0,0,0,30,1,135,56,112,0,0,0,63,129,135,56,96,0,0,0,127,129,135,48,224,0,0,0,113,193,135,112,224,0,0,0,96,193,135,112,192,0,0,0,112,225,134,224,195,224,0,0,112,115,135,225,199,240,0,0,56,115,135,193,206,112,0,0,56,59,135,195,156,56,0,0,28,59,143,131,184,56,0,0,14,31,143,135,120,48,0,0,14,31,15,7,112,112,0,0,7,15,14,14,224,224,0,0,7,7,14,15,193,224,0,0,3,135,12,31,129,192,0,0,1,194,0,31,131,128,0,0,1,192,0,31,7,128,0,0,0,224,0,30,7,0,0,0,0,224,0,28,14,0,0,7,128,112,0,8,30,0,0,63,224,112,0,0,28,0,0,63,240,56,0,0,56,0,0,56,112,56,0,0,112,0,0,56,56,24,0,0,112,0,0,28,24,24,0,0,224,0,0,28,28,24,0,0,224,0,0,12,12,24,0,0,192,0,0,14,14,28,0,0,192,0,0,14,7,56,0,1,192,0,0,7,7,184,0,1,192,0,0,7,3,240,0,0,192,0,0,3,129,240,0,0,224,0,0,3,128,96,0,0,224,0,0,1,192,0,0,0,120,0,0,1,224,0,0,0,60,0,0,0,224,0,0,0,28,0,0,0,112,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,60,0,0,0,28,0,0,0,30,0,0,0,28,0,0,0,15,128,0,0,28,0,0,0,7,224,0,0,28,0,0,0,1,252,0,0,28,0,0,0,0,127,0,0,28,0,0,0,0,15,192,0,28,0,0,0,0,3,240,0,28,0,0,0,0,0,254,0,28,0,0,0,0,0,31,128,28,0,0,0,0,0,7,240,28,0,0,0,0,0,0,255,252,0,0,0,0,0,0,31,252,0,0,0,0,0,0,3,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,3,128,0,0,0,0,1,252,7,224,0,0,0,0,1,206,15,240,0,0,0,0,1,134,12,112,0,0,0,0,1,135,28,48,0,0,0,0,1,135,28,48,0,0,0,0,1,135,24,112,0,0,0,30,1,135,56,112,0,0,0,63,129,135,56,96,0,0,0,127,129,135,48,224,0,0,0,113,193,135,112,224,0,0,0,96,193,135,112,192,0,0,0,112,225,134,224,195,224,0,0,112,115,135,225,199,240,0,0,56,115,135,193,206,112,0,0,56,59,135,195,156,56,0,0,28,59,143,131,184,56,0,0,14,31,143,135,120,48,0,0,14,31,15,7,112,112,0,0,7,15,14,14,224,224,0,0,7,7,14,15,193,224,0,0,3,135,12,31,129,192,0,0,1,194,0,31,131,128,0,0,1,192,0,31,7,128,0,0,0,224,0,30,7,0,0,0,0,224,0,28,14,0,0,7,128,112,0,8,30,0,0,63,224,112,0,0,28,0,0,63,240,56,0,0,56,0,0,56,112,56,0,0,112,0,0,56,56,24,0,0,112,0,0,28,24,24,0,0,224,0,0,28,28,24,0,0,224,0,0,12,12,24,0,0,192,0,0,14,14,28,0,0,192,0,0,14,7,56,0,1,192,0,0,7,7,184,0,1,192,0,0,7,3,240,0,0,192,0,0,3,129,240,0,0,224,0,0,3,128,96,0,0,224,0,0,1,192,0,0,0,120,0,0,1,224,0,0,0,60,0,0,0,224,0,0,0,28,0,0,0,112,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,60,0,0,0,28,0,0,0,30,0,0,0,28,0,0,0,15,128,0,0,28,0,0,0,7,224,0,0,28,0,0,0,1,252,0,0,28,0,0,0,0,127,0,0,28,0,0,0,0,15,192,0,28,0,0,0,0,3,240,0,28,0,0,0,0,0,254,0,28,0,0,0,0,0,31,128,28,0,0,0,0,0,7,240,28,0,0,0,0,0,0,255,252,0,0,0,0,0,0,31,252,0,0,0,0,0,0,3,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,3,128,0,0,0,0,1,252,7,224,0,0,0,0,1,206,15,240,0,0,0,0,1,134,12,112,0,0,0,0,1,135,28,48,0,0,0,0,1,135,28,48,0,0,0,0,1,135,24,112,0,0,0,30,1,135,56,112,0,0,0,63,129,135,56,96,0,0,0,127,129,135,48,224,0,0,0,113,193,135,112,224,0,0,0,96,193,135,112,192,0,0,0,112,225,134,224,195,224,0,0,112,115,135,225,199,240,0,0,56,115,135,193,206,112,0,0,56,59,135,195,156,56,0,0,28,59,143,131,184,56,0,0,14,31,143,135,120,48,0,0,14,31,15,7,112,112,0,0,7,15,14,14,224,224,0,0,7,7,14,15,193,224,0,0,3,135,12,31,129,192,0,0,1,194,0,31,131,128,0,0,1,192,0,31,7,128,0,0,0,224,0,30,7,0,0,0,0,224,0,28,14,0,0,7,128,112,0,8,30,0,0,63,224,112,0,0,28,0,0,63,240,56,0,0,56,0,0,56,112,56,0,0,112,0,0,56,56,24,0,0,112,0,0,28,24,24,0,0,224,0,0,28,28,24,0,0,224,0,0,12,12,24,0,0,192,0,0,14,14,28,0,0,192,0,0,14,7,56,0,1,192,0,0,7,7,184,0,1,192,0,0,7,3,240,0,0,192,0,0,3,129,240,0,0,224,0,0,3,128,96,0,0,224,0,0,1,192,0,0,0,120,0,0,1,224,0,0,0,60,0,0,0,224,0,0,0,28,0,0,0,112,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,60,0,0,0,28,0,0,0,30,0,0,0,28,0,0,0,15,128,0,0,28,0,0,0,7,224,0,0,28,0,0,0,1,252,0,0,28,0,0,0,0,127,0,0,28,0,0,0,0,15,192,0,28,0,0,0,0,3,240,0,28,0,0,0,0,0,254,0,28,0,0,0,0,0,31,128,28,0,0,0,0,0,7,240,28,0,0,0,0,0,0,255,252,0,0,0,0,0,0,31,252,0,0,0,0,0,0,3,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,3,128,0,0,0,0,1,252,7,224,0,0,0,0,1,206,15,240,0,0,0,0,1,134,12,112,0,0,0,0,1,135,28,48,0,0,0,0,1,135,28,48,0,0,0,0,1,135,24,112,0,0,0,30,1,135,56,112,0,0,0,63,129,135,56,96,0,0,0,127,129,135,48,224,0,0,0,113,193,135,112,224,0,0,0,96,193,135,112,192,0,0,0,112,225,134,224,195,224,0,0,112,115,135,225,199,240,0,0,56,115,135,193,206,112,0,0,56,59,135,195,156,56,0,0,28,59,143,131,184,56,0,0,14,31,143,135,120,48,0,0,14,31,15,7,112,112,0,0,7,15,14,14,224,224,0,0,7,7,14,15,193,224,0,0,3,135,12,31,129,192,0,0,1,194,0,31,131,128,0,0,1,192,0,31,7,128,0,0,0,224,0,30,7,0,0,0,0,224,0,28,14,0,0,7,128,112,0,8,30,0,0,63,224,112,0,0,28,0,0,63,240,56,0,0,56,0,0,56,112,56,0,0,112,0,0,56,56,24,0,0,112,0,0,28,24,24,0,0,224,0,0,28,28,24,0,0,224,0,0,12,12,24,0,0,192,0,0,14,14,28,0,0,192,0,0,14,7,56,0,1,192,0,0,7,7,184,0,1,192,0,0,7,3,240,0,0,192,0,0,3,129,240,0,0,224,0,0,3,128,96,0,0,224,0,0,1,192,0,0,0,120,0,0,1,224,0,0,0,60,0,0,0,224,0,0,0,28,0,0,0,112,0,0,0,28,0,0,0,120,0,0,0,28,0,0,0,60,0,0,0,28,0,0,0,30,0,0,0,28,0,0,0,15,128,0,0,28,0,0,0,7,224,0,0,28,0,0,0,1,252,0,0,28,0,0,0,0,127,0,0,28,0,0,0,0,15,192,0,28,0,0,0,0,3,240,0,28,0,0,0,0,0,254,0,28,0,0,0,0,0,31,128,28,0,0,0,0,0,7,240,28,0,0,0,0,0,0,255,252,0,0,0,0,0,0,31,252,0,0,0,0,0,0,3,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,0,0,0,0,0,0,254,3,224,0,0,0,0,0,231,7,240,0,0,0,0,1,199,14,56,0,0,0,0,1,195,14,56,0,0,0,0,1,195,12,56,0,0,0,0,1,195,28,56,0,0,0,15,1,195,28,48,0,0,0,63,129,195,24,112,0,0,0,57,193,195,56,112,0,0,0,48,225,195,56,112,0,0,0,112,225,195,48,96,0,0,0,56,113,195,112,225,224,0,0,56,113,199,224,231,240,0,0,28,57,135,225,199,248,0,0,28,29,135,193,206,56,0,0,14,29,135,195,156,24,0,0,14,15,135,131,184,56,0,0,7,15,135,135,120,56,0,0,3,7,135,7,240,112,0,0,3,135,134,7,224,224,0,0,1,195,6,15,192,224,0,0,1,195,0,15,129,192,0,0,0,224,0,31,3,128,0,0,0,224,0,31,7,128,0,0,0,112,0,14,7,0,0,15,192,112,0,12,14,0,0,63,224,56,0,0,28,0,0,60,240,56,0,0,28,0,0,24,56,24,0,0,56,0,0,28,24,24,0,0,112,0,0,28,28,28,0,0,112,0,0,12,12,28,0,0,224,0,0,14,14,28,0,0,224,0,0,14,6,28,0,0,192,0,0,7,7,56,0,0,192,0,0,7,7,184,0,0,192,0,0,3,3,240,0,0,192,0,0,3,128,240,0,0,224,0,0,1,192,96,0,0,224,0,0,1,192,0,0,0,120,0,0,0,224,0,0,0,60,0,0,0,224,0,0,0,28,0,0,0,112,0,0,0,28,0,0,0,56,0,0,0,28,0,0,0,60,0,0,0,28,0,0,0,30,0,0,0,28,0,0,0,15,128,0,0,28,0,0,0,3,224,0,0,28,0,0,0,1,252,0,0,28,0,0,0,0,127,0,0,28,0,0,0,0,15,192,0,28,0,0,0,0,3,240,0,28,0,0,0,0,0,252,0,28,0,0,0,0,0,31,128,28,0,0,0,0,0,7,240,28,0,0,0,0,0,0,255,252,0,0,0,0,0,0,31,252,0,0,0,0,0,0,3,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,127,1,240,0,0,0,0,0,119,131,248,0,0,0,0,0,227,135,60,0,0,0,0,0,227,135,28,0,0,0,0,0,227,142,28,0,0,0,0,0,227,142,28,0,0,0,15,128,227,140,24,0,0,0,31,192,227,156,56,0,0,0,60,224,227,156,56,0,0,0,56,224,195,152,48,0,0,0,56,112,195,184,112,0,0,0,56,48,195,184,112,0,0,0,28,56,195,240,97,240,0,0,28,29,195,240,231,248,0,0,14,29,195,224,231,56,0,0,6,13,195,193,206,28,0,0,7,15,199,193,156,28,0,0,3,135,135,131,184,56,0,0,3,135,135,131,112,56,0,0,1,195,135,7,240,112,0,0,1,195,134,7,224,240,0,0,0,225,0,15,193,224,0,0,0,224,0,15,129,192,0,0,0,112,0,31,3,128,0,1,128,112,0,14,7,128,0,31,224,56,0,4,7,0,0,63,240,56,0,0,14,0,0,28,120,28,0,0,28,0,0,28,56,28,0,0,60,0,0,28,28,28,0,0,56,0,0,14,12,28,0,0,112,0,0,14,14,28,0,0,96,0,0,14,14,28,0,0,224,0,0,7,7,28,0,0,224,0,0,7,7,152,0,0,192,0,0,3,3,248,0,0,192,0,0,3,129,240,0,0,192,0,0,3,128,240,0,0,224,0,0,1,192,32,0,0,224,0,0,0,192,0,0,0,120,0,0,0,224,0,0,0,60,0,0,0,112,0,0,0,28,0,0,0,112,0,0,0,28,0,0,0,56,0,0,0,28,0,0,0,28,0,0,0,28,0,0,0,15,0,0,0,28,0,0,0,7,192,0,0,28,0,0,0,3,240,0,0,28,0,0,0,0,252,0,0,28,0,0,0,0,63,0,0,28,0,0,0,0,15,224,0,28,0,0,0,0,1,248,0,28,0,0,0,0,0,126,0,28,0,0,0,0,0,31,192,28,0,0,0,0,0,7,248,28,0,0,0,0,0,0,255,252,0,0,0,0,0,0,31,252,0,0,0,0,0,0,3,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">  &#123;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,31,0,0,0,0,0,3,240,63,128,0,0,0,0,7,248,113,192,0,0,0,0,7,56,113,192,0,0,0,0,6,24,113,192,0,0,0,0,6,28,97,192,0,0,0,0,7,28,97,128,0,0,0,0,7,12,97,128,0,0,0,0,7,12,225,128,0,0,0,0,3,14,225,128,0,0,0,30,3,14,227,135,0,0,0,127,3,142,227,143,192,0,0,119,131,143,195,159,224,0,0,99,195,143,195,188,224,0,0,112,243,143,135,56,96,0,0,120,115,15,135,112,96,0,0,56,59,15,6,224,224,0,0,28,31,15,14,225,192,0,0,14,31,14,15,193,192,0,0,7,15,14,15,131,128,0,0,7,135,12,31,131,128,0,0,3,131,0,31,7,0,0,0,1,192,0,62,7,0,0,0,0,224,0,30,14,0,0,0,0,224,0,28,28,0,0,0,0,112,0,8,28,0,0,3,128,56,0,0,56,0,0,31,224,56,0,0,56,0,0,63,240,28,0,0,112,0,0,56,120,28,0,0,112,0,0,24,56,12,0,0,224,0,0,28,28,12,0,0,224,0,0,28,28,14,0,0,192,0,0,14,14,14,0,0,192,0,0,14,14,14,0,0,192,0,0,6,7,28,0,0,192,0,0,7,7,156,0,0,224,0,0,7,3,248,0,0,224,0,0,3,128,240,0,0,120,0,0,3,128,112,0,0,60,0,0,1,192,0,0,0,28,0,0,0,224,0,0,0,28,0,0,0,224,0,0,0,28,0,0,0,112,0,0,0,28,0,0,0,56,0,0,0,28,0,0,0,60,0,0,0,28,0,0,0,31,0,0,0,28,0,0,0,15,128,0,0,28,0,0,0,7,240,0,0,28,0,0,0,1,252,0,0,28,0,0,0,0,63,128,0,28,0,0,0,0,7,240,0,28,0,0,0,0,0,254,0,28,0,0,0,0,0,31,192,28,0,0,0,0,0,3,252,28,0,0,0,0,0,0,127,252,0,0,0,0,0,0,31,252,0,0,0,0,0,0,1,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0&#125;,</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">void setup() &#123;</span><br><span class="line">  display.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDR);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">int frame = 0;</span><br><span class="line">void loop() &#123;</span><br><span class="line">  display.clearDisplay();</span><br><span class="line">  display.drawBitmap(32, 0, frames[frame], FRAME_WIDTH, FRAME_HEIGHT, 1);</span><br><span class="line">  display.display();</span><br><span class="line">  frame = (frame + 1) % FRAME_COUNT;</span><br><span class="line">  delay(FRAME_DELAY);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><img src="https://oss.jzxer.cn/blog/截屏2025-01-14 17.27.45.png" alt="效果展示" style="zoom:50%;" /><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>这个开发板我真的花了很多时间研究，因为平时一直都使用 platformIO 开发，遗憾的始终烧录不成功。本来都打算放弃了。</p><p>就尝试用 arduino-IDE 试试，竟然成功了，虽然我也不知道到底问题出在哪，但最少买的几个 stm32 系列开发板不至于放在那吃灰了。</p><blockquote><p>不过后续还是会尝试用 platformIO 的开发方案。请请期待。</p></blockquote><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://animator.wokwi.com/">animator</a></p>]]></content>
    
    
    <summary type="html">超高性价比的一个 stm32 开发板，新手入门推荐</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="stm32" scheme="https://blog.jzxer.cn/tags/stm32/"/>
    
  </entry>
  
  <entry>
    <title>在单片机上用 JavaScript 来开发</title>
    <link href="https://blog.jzxer.cn/20241209/20241209_esp8266_with_espruino_jiaoben/"/>
    <id>https://blog.jzxer.cn/20241209/20241209_esp8266_with_espruino_jiaoben/</id>
    <published>2024-12-09T13:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="封面图"><a href="#封面图" class="headerlink" title="封面图"></a>封面图</h2><p><strong>待拍摄</strong></p><h2 id="内容大纲"><a href="#内容大纲" class="headerlink" title="内容大纲"></a>内容大纲</h2><table><thead><tr><th align="center">画面</th><th align="center">镜头</th><th>对白</th></tr></thead><tbody><tr><td align="center">给一个 eclips、visial sduio 的图片展示，再切 JavaScript、espruino 的logo展示</td><td align="center">图片切换，带点视频更好</td><td>你还在用 C 语言开发单片机吗？如果是，那你就 out 了，这期视频我就带你怎么用 JavaScript 在单片机上开发。</td></tr><tr><td align="center">设备展示</td><td align="center"></td><td></td></tr><tr><td align="center"></td><td align="center"></td><td></td></tr><tr><td align="center"></td><td align="center"></td><td></td></tr><tr><td align="center"></td><td align="center"></td><td></td></tr><tr><td align="center"></td><td align="center"></td><td></td></tr></tbody></table><h2 id="设备清单"><a href="#设备清单" class="headerlink" title="设备清单"></a>设备清单</h2><table><thead><tr><th align="center">名称</th><th align="center">数量</th></tr></thead><tbody><tr><td align="center">Esp8266 开发板</td><td align="center">1</td></tr><tr><td align="center">DHT11</td><td align="center">1</td></tr><tr><td align="center">土壤湿度传感器</td><td align="center">1</td></tr><tr><td align="center">TFT 屏幕</td><td align="center">1</td></tr><tr><td align="center">LED 灯珠</td><td align="center">1</td></tr><tr><td align="center">洞洞板 5*7</td><td align="center">2</td></tr><tr><td align="center">2.5mm 铜柱（公）</td><td align="center">8</td></tr><tr><td align="center">2.5mm 铜柱（母）</td><td align="center">4</td></tr></tbody></table><h2 id="故事背景"><a href="#故事背景" class="headerlink" title="故事背景"></a>故事背景</h2><p>作为一个前端老将，最希望的事情就是万物皆可 JavaScript，所以在最近研究的单片机项目里看到很多都是基于c++、python的，让我的前端技能毫无用武之地，所以一直在想有没有一个办法可以把这些技能给重新用起来呢？既然 micropython 都有了，是不是应该也有个 microscript 类似的玩意儿？</p><p>所谓但凡一件事儿，只要肯花心思，就一定有解决办法，通过不懈努力果然让我找到了解决方案，那就是：<strong>espruino</strong></p><p>本文将会带你从 0 开始，用 esp8266 开发一个基于 espruino 的小项目。</p><h2 id="环境烧录"><a href="#环境烧录" class="headerlink" title="环境烧录"></a>环境烧录</h2><p>这一步就是让 esp8266 开发板能够运行 JavaScript 代码。</p><p>我们来到<a href="espruino.com">官网</a> 找到对应的 .bin 文件的烧录程序。我选择的是4M版本：espruino_2v25_esp8266_4mb。</p><p>连接上设备，电脑终端进入当前脚本的目录，在在目录下执行以下两个脚本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 擦除开发板的所有内容</span></span><br><span class="line">esptool.py --port <span class="variable">$&#123;你的设备地址：/dev/usbXXX&#125;</span> --baud 115200 erase_flash</span><br><span class="line"></span><br><span class="line"><span class="comment"># 烧录程序</span></span><br><span class="line">esptool.py --port <span class="variable">$&#123;你的设备地址：/dev/usbXXX&#125;</span> --baud 460800 write_flash \</span><br><span class="line">  --flash_freq 80m --flash_mode qio --flash_size 4MB-c1 \</span><br><span class="line">  0x0000 <span class="string">&quot;boot_v1.6.bin&quot;</span> 0x1000 espruino_esp8266_user1.bin \</span><br><span class="line">  0x3FC000  esp_init_data_default.bin 0x3FE000 blank.bin</span><br></pre></td></tr></table></figure><p>到这一步就可以开始愉快的写 javascript 到开发板了。</p>]]></content>
    
    
    <summary type="html">作为一个前端老将，最希望的事情就是万物皆可 JavaScript，所以在最近研究的单片机项目里看到很多都是基于c++、python的，让我的前端技能毫无用武之地，所以一直在想有没有一个办法可以把这些技能给重新用起来呢？既然 micropython 都有了，是不是应该也有个 microscript 类似的玩意儿？</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="esp8266" scheme="https://blog.jzxer.cn/tags/esp8266/"/>
    
  </entry>
  
  <entry>
    <title>【ros2】机器人操作系统之二：节点</title>
    <link href="https://blog.jzxer.cn/20241207/20241207-ros2-with-node/"/>
    <id>https://blog.jzxer.cn/20241207/20241207-ros2-with-node/</id>
    <published>2024-12-07T11:44:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>接上文 <a href="https://blog.jzxer.cn/">ros2初窥</a>，我们学会了怎么搭建一个ros2 的开发环境，接下来就尝试了解一下它其中的一个概念叫节点。</p><h2 id="创建节点流程"><a href="#创建节点流程" class="headerlink" title="创建节点流程"></a>创建节点流程</h2><p>代码中出现的函数大家未来会经常用到，大家先不用纠结函数的具体使用方法，更重要的是理解节点的编码流程。</p><p>总结一下，想要实现一个节点，代码的实现流程是这样做：</p><ul><li>编程接口初始化</li><li>创建节点并初始化</li><li>实现节点功能</li><li>销毁节点并关闭接口</li></ul><p>大家如果有学习过C++或者Pyhton的话，应该可以发现这里我们使用的是面向过程的编程方法，这种方式虽然实现简单，但是对于稍微复杂一点的机器人系统，就很难做到模块化编码。</p><h2 id="案例一：hello-world-面向过程"><a href="#案例一：hello-world-面向过程" class="headerlink" title="案例一：hello world(面向过程)"></a>案例一：hello world(面向过程)</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ros2 run learning_node node_helloworld</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">代码中出现的函数大家未来会经常用到，大家先不用纠结函数的具体使用方法，更重要的是理解节点的编码流程。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="ros" scheme="https://blog.jzxer.cn/tags/ros/"/>
    
    <category term="人工智能" scheme="https://blog.jzxer.cn/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    <category term="robot" scheme="https://blog.jzxer.cn/tags/robot/"/>
    
  </entry>
  
  <entry>
    <title>初窥机器人操作系统 ros2</title>
    <link href="https://blog.jzxer.cn/20241207/20241206_ros2_learning/"/>
    <id>https://blog.jzxer.cn/20241207/20241206_ros2_learning/</id>
    <published>2024-12-07T10:44:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景介绍"><a href="#背景介绍" class="headerlink" title="背景介绍"></a>背景介绍</h2><p>作为一个理工出生的人，从小就梦想自己能造机器人，能看到机器人与人共存的社会状态。但是技术壁垒是非常大的一个坎（加上自己也很懒，hhh）。</p><p>正不巧的是，在研究单片机去实现一些应用的时候，发现了机器人开发系统 ros，好家伙，这玩意儿可以用 python 作为开发语言，惊喜的是还有 JavaScript 的相关工具库。</p><p><img src="https://oss.jzxer.cn/blog/image-20241206200505983.png" alt="我可来精神了"></p><p>话不多说，就是干！</p><h2 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h2><p>第一步就是搭建 ros机器人系统，我选择了更新一点的 ros2，它在原来的架构的基础上添加了更多的拓展性，并且性能上也比原来的ros1要好很多，毕竟底层架构都变了。另外也为了与时俱进，我可不想在学了一年之后又要开始学习2。索性一步到位选了 ros2。</p><p><img src="https://oss.jzxer.cn/blog/image26-16532775781034.png" alt="ros1和ros2对比"></p><p>开发板的话我手头正好还有一块 香橙派zero3 拿来用，看看能不能把它的最后一滴性能给榨干。之前的文章我介绍过这块板子，总体算的上是物美价廉。</p><h3 id="方法一：脚本安装（推荐）"><a href="#方法一：脚本安装（推荐）" class="headerlink" title="方法一：脚本安装（推荐）"></a>方法一：脚本安装（推荐）</h3><p>接下来开始搭建流程，目前国内的话有个叫 鱼香ros 的博主有一个一键搭建脚本很好用，直接运行脚本，并且按提示操作即可。脚本如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget http://fishros.com/install -O fishros &amp;&amp; . fishros</span><br></pre></td></tr></table></figure><p>建议选择 <strong>humble</strong> 版本，从官方文档的介绍来说，<strong>humble</strong> 版本最稳定并且支持的时间最长，当然如果想要体验最新版的快乐也可以试试 iron 和 jazzy 版本：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">Jazzy Jalisco：</span><br><span class="line">发布日期：<span class="number">2024</span>年<span class="number">5</span>月<span class="number">23</span>日。</span><br><span class="line">支持平台：Ubuntu <span class="number">24.04</span> (Noble)、Windows <span class="number">10</span> (Visual Studio <span class="number">2019</span>)、RHEL <span class="number">9</span>、macOS、Debian Bookworm。</span><br><span class="line">生命周期：长期支持（LTS）版本，支持到<span class="number">2029</span>年<span class="number">5</span>月。</span><br><span class="line">新特性：改进了与 Gazebo 的集成，新增了多个功能和改进，如 common_interfaces、image_transport、ros2cli、rosbag2 和 rviz2 的更新。</span><br><span class="line"></span><br><span class="line">Iron Irwini：</span><br><span class="line">发布日期：<span class="number">2023</span>年<span class="number">5</span>月<span class="number">23</span>日。</span><br><span class="line">支持平台：Ubuntu <span class="number">22.04</span> (Jammy)、Windows <span class="number">10</span> (Visual Studio <span class="number">2019</span>)、RHEL <span class="number">9</span>。</span><br><span class="line">生命周期：短期支持，支持到<span class="number">2024</span>年<span class="number">11</span>月。</span><br><span class="line"></span><br><span class="line">Humble Hawksbill：</span><br><span class="line">发布日期：<span class="number">2022</span>年<span class="number">5</span>月<span class="number">23</span>日。</span><br><span class="line">支持平台：Ubuntu <span class="number">22.04</span> (Jammy)、Windows <span class="number">10</span> (Visual Studio <span class="number">2019</span>)、RHEL <span class="number">8</span>。</span><br><span class="line">生命周期：长期支持（LTS）版本，支持到<span class="number">2027</span>年<span class="number">5</span>月</span><br><span class="line"></span><br><span class="line">Galactic Geochelone：</span><br><span class="line">发布日期：<span class="number">2021</span>年<span class="number">5</span>月<span class="number">23</span>日。</span><br><span class="line">支持平台：Ubuntu <span class="number">20.04</span> (Focal)、Windows <span class="number">10</span> (Visual Studio <span class="number">2019</span>)。</span><br><span class="line">生命周期：短期支持，支持到<span class="number">2022</span>年<span class="number">12</span>月</span><br><span class="line"></span><br><span class="line">Foxy Fitzroy：</span><br><span class="line">发布日期：<span class="number">2020</span>年<span class="number">6</span>月<span class="number">5</span>日。</span><br><span class="line">支持平台：Ubuntu <span class="number">20.04</span> (Focal)、MacOS <span class="number">10.14</span> (Mojave)、Windows <span class="number">10</span> (Visual Studio <span class="number">2019</span>)。</span><br><span class="line">生命周期：长期支持（LTS）版本，支持到<span class="number">2023</span>年<span class="number">6</span>月</span><br></pre></td></tr></table></figure><p>然后就是漫长的等待了，等待进度条结束即下载完成。</p><p><img src="https://oss.jzxer.cn/blog/image-20241206201908130.png" alt="ros2下载中"></p><h3 id="2-方法二：命令行安装"><a href="#2-方法二：命令行安装" class="headerlink" title="2. 方法二：命令行安装"></a>2. 方法二：命令行安装</h3><h4 id="2-1-设置编码"><a href="#2-1-设置编码" class="headerlink" title="2.1. 设置编码"></a>2.1. 设置编码</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ sudo apt update &amp;&amp; sudo apt install locales</span><br><span class="line">$ sudo locale-gen en_US en_US.UTF-8</span><br><span class="line">$ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 </span><br><span class="line">$ <span class="built_in">export</span> LANG=en_US.UTF-8</span><br></pre></td></tr></table></figure><h4 id="2-2-修改源"><a href="#2-2-修改源" class="headerlink" title="2.2. 修改源"></a>2.2. 修改源</h4><p>这一步的作用主要是因为，Ubuntu 默认的镜像仓库源是国外，所以速度上会很慢，也有概率会连接不上。所以就需要修改它的源来提升速度。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ sudo apt update &amp;&amp; sudo apt install curl gnupg lsb-release </span><br><span class="line">$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg </span><br><span class="line">$ <span class="built_in">echo</span> <span class="string">&quot;deb [arch=<span class="subst">$(dpkg --print-architecture)</span> signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu <span class="subst">$(source /etc/os-release &amp;&amp; echo $UBUNTU_CODENAME)</span> main&quot;</span> | sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/ros2.list &gt; /dev/null</span><br></pre></td></tr></table></figure><h3 id="2-3-安装-ros2"><a href="#2-3-安装-ros2" class="headerlink" title="2.3. 安装 ros2"></a>2.3. 安装 ros2</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ sudo apt update</span><br><span class="line">$ sudo apt upgrade</span><br><span class="line">$ sudo apt install ros-humble-desktop</span><br></pre></td></tr></table></figure><h4 id="2-4-修改环境变量"><a href="#2-4-修改环境变量" class="headerlink" title="2.4. 修改环境变量"></a>2.4. 修改环境变量</h4><p>注意这里的 setup.bash 脚本是安装ros之后生成的，文件路引以ros的路径为主</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">source</span> /opt/ros/humble/setup.bash</span><br><span class="line">$ <span class="built_in">echo</span> <span class="string">&quot; source /opt/ros/humble/setup.bash&quot;</span> &gt;&gt; ~/.bashrc </span><br></pre></td></tr></table></figure><p>终端输入 ros2来测试是否安装成功：</p><p><img src="https://oss.jzxer.cn/blog/image-20241206211630555.png" alt="ros2测试"></p><h2 id="案例1：hello-world"><a href="#案例1：hello-world" class="headerlink" title="案例1：hello world"></a>案例1：hello world</h2><p>这一步用来测试底层通信是否正常。首先创建一个发布者：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ros2 run demo_nodes_cpp talker</span><br></pre></td></tr></table></figure><p>然后创建另外一个终端，创建一个订阅者</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ros2 run demo_nodes_py listener</span><br></pre></td></tr></table></figure><p>如果终端发布和订阅的信息正常打印说明通信没问题，以上就是设计模式里最基本的发布订阅模式。</p><h2 id="案例2：会动的乌龟"><a href="#案例2：会动的乌龟" class="headerlink" title="案例2：会动的乌龟"></a>案例2：会动的乌龟</h2><p>这个是 ros 最经典的测试功能的项目。</p><h3 id="1-召唤乌龟"><a href="#1-召唤乌龟" class="headerlink" title="1. 召唤乌龟"></a>1. 召唤乌龟</h3><p>通过以下命令召唤出一只乌龟</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ros2 run turtlesim turtlesim_node</span><br></pre></td></tr></table></figure><p>它大概会是这个样子：</p><p><img src="https://oss.jzxer.cn/blog/image-20241206212540078.png" alt="乌龟"></p><h3 id="2-添加摇杆"><a href="#2-添加摇杆" class="headerlink" title="2. 添加摇杆"></a>2. 添加摇杆</h3><p>接下来就是让它动起来，另外开一个终端，执行以下命令，这句命令可以让你在键盘上通过方向键操作乌龟的行进方向：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ros2 run turtlesim turtle_teleop_key</span><br></pre></td></tr></table></figure><h3 id="3-命令行控制乌龟"><a href="#3-命令行控制乌龟" class="headerlink" title="3. 命令行控制乌龟"></a>3. 命令行控制乌龟</h3><p>以下的代码是给乌龟（turtle1）发布一个命令，数据结构为geometry_msgs&#x2F;msg&#x2F;Twist，json 内容为具体传递的数据变量来控制乌龟的行动。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist <span class="string">&quot;&#123;linear: &#123;x: 2.0, y: 0.0, z: 0.0&#125;, angular: &#123;x: 0.0, y: 0.0, z: 1.8&#125;&#125;&quot;</span></span><br></pre></td></tr></table></figure><p>不出意外这个乌龟会开始做圆周运动，如下所示。</p><p><img src="https://oss.jzxer.cn/blog/202412071142202.png" alt="乌龟运动轨迹"></p><p>如果是想立刻控制乌龟执行某个指令，则可以使用：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 乌龟会逆时针转动</span></span><br><span class="line">ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute <span class="string">&quot;theta: 3&quot;</span></span><br></pre></td></tr></table></figure><h3 id="4-新增一个乌龟"><a href="#4-新增一个乌龟" class="headerlink" title="4. 新增一个乌龟"></a>4. 新增一个乌龟</h3><p>以下代码的意思是创建一个 坐标为 x：2，y：2，z: 0.2,名字叫 <strong>Raphael</strong> 的乌龟。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ros2 service call /spawn turtlesim/srv/Spawn <span class="string">&quot;&#123;x: 2, y: 2, theta: 0.2, name: &#x27;raphael&#x27;&#125;&quot;</span></span><br></pre></td></tr></table></figure><h3 id="5-查看系统当前运行中节点"><a href="#5-查看系统当前运行中节点" class="headerlink" title="5. 查看系统当前运行中节点"></a>5. 查看系统当前运行中节点</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">ros2 node list</span><br><span class="line"><span class="comment"># print</span></span><br><span class="line"><span class="comment"># /turtlesim</span></span><br><span class="line"><span class="comment"># ...</span></span><br></pre></td></tr></table></figure><h3 id="6-查看系统某个节点详细信息"><a href="#6-查看系统某个节点详细信息" class="headerlink" title="6. 查看系统某个节点详细信息"></a>6. 查看系统某个节点详细信息</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ ros2 node info /turtlesim </span><br></pre></td></tr></table></figure><p>这个时候会打印出 &#x2F;turtlesim 这个节点下的所有类型信息：</p><p><img src="https://oss.jzxer.cn/blog/image-20241207115518707.png" alt="所有服务信息"></p><h3 id="7-录制动作和重放"><a href="#7-录制动作和重放" class="headerlink" title="7. 录制动作和重放"></a>7. 录制动作和重放</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 开始录制</span></span><br><span class="line">ros2 bag record /turtle1/cmd_vel</span><br><span class="line"><span class="comment"># 重放动作</span></span><br><span class="line">ros2 bag play rosbag2_2022_04_11-17_35_40/</span><br></pre></td></tr></table></figure><p>执行上述命令来操作之前录制的动作回放。</p><h2 id="创建工作空间"><a href="#创建工作空间" class="headerlink" title="创建工作空间"></a>创建工作空间</h2><h3 id="第一步：创建一个-workspace-目录"><a href="#第一步：创建一个-workspace-目录" class="headerlink" title="第一步：创建一个 workspace 目录"></a>第一步：创建一个 workspace 目录</h3><p>这个目录可以是自己经常使用的一个文件夹，在这个文件夹创建一个工作空间，名字可以自定义，我这里取名就叫 ros2-turturial。</p><h3 id="第二步：安装-rosdepc"><a href="#第二步：安装-rosdepc" class="headerlink" title="第二步：安装 rosdepc"></a>第二步：安装 rosdepc</h3><p>ros 库的一个安装工具，会自动识别当前目录下所有的依赖并且自动安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sudo pip3 install rosdepc</span><br><span class="line">sudo rosdepc init</span><br><span class="line">rosdepc update</span><br><span class="line"><span class="comment"># 以下这行代码在工作空间根目录执行</span></span><br><span class="line">rosdepc install -i --from-path src --rosdistro humble -y</span><br></pre></td></tr></table></figure><p>执行完以上的代码，如果最后提示：#All required rosdeps installed successfully，工作空间就算是安装完依赖了。</p><blockquote><p>如果出现无法下载的情况，试试执行：<strong>sudo apt-get update</strong></p></blockquote><h3 id="第三步：安装-colcon"><a href="#第三步：安装-colcon" class="headerlink" title="第三步：安装 colcon"></a>第三步：安装 colcon</h3><p>colcon 是ros 的编译工具，执行以下代码来完成项目的编译：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install python3-colcon-ros</span><br><span class="line">colcon build</span><br></pre></td></tr></table></figure><p>当终端提示：Summary: 21 packages finished [4min 26s]，即为安装完成。</p><h3 id="第四步：设置环境变量"><a href="#第四步：设置环境变量" class="headerlink" title="第四步：设置环境变量"></a>第四步：设置环境变量</h3><p>这一步主要是为了能在每次进入终端的时候，让全局能够访问到我们的功能位置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&quot; source ~/<span class="variable">$&#123;你的工作空间路径&#125;</span>/install/local_setup.sh&quot;</span> &gt;&gt; ~/.bashrc</span><br></pre></td></tr></table></figure><h2 id="创建一个功能包"><a href="#创建一个功能包" class="headerlink" title="创建一个功能包"></a>创建一个功能包</h2><p>这个功能主要是当我们想要复用一个能力，或者是想把我们自己封装的一个能力分享给别人使用的时候。</p><p>就可以通过 build 一个功能包的方式去将它封装起来。在src目录下执行以下代码：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ros2 pkg create --build-type &lt;build-type&gt; &lt;package_name&gt;</span><br></pre></td></tr></table></figure><ul><li><strong>build-type</strong>： 如果使用C++或者C，那这里就跟ament_cmake，如果使用Python，就跟ament_python；</li><li><strong>package_name</strong>：包名称</li></ul><p>用这个语句创建的功能包，一般从文件结构就可以分辨出来是用的 c 还是 python，从便利性上来说的话，c 需要二次编译，而 python 可以直接使用。但是性能上 python 肯定是不如 c 的。所以看情况取舍吧。</p><h2 id="vscode-插件推荐"><a href="#vscode-插件推荐" class="headerlink" title="vscode 插件推荐"></a>vscode 插件推荐</h2><ol><li>ros：代码提示</li><li>cmake：c++</li><li>IntelliCode：代码自动补全</li><li>Python：python代码提示</li><li>URDF：机器人模型文件识别</li><li>msg langurage support</li></ol><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://book.guyuehome.com/ROS2">ros2</a></p><p><a href="https://blog.jzxer.cn/">dev 的艺术空间</a></p>]]></content>
    
    
    <summary type="html">在研究单片机去实现一些应用的时候，发现了机器人开发系统 ros，好家伙，这玩意儿可以用 python 作为开发语言，惊喜的是还有 JavaScript 的相关工具库。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="ros" scheme="https://blog.jzxer.cn/tags/ros/"/>
    
    <category term="人工智能" scheme="https://blog.jzxer.cn/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    <category term="robot" scheme="https://blog.jzxer.cn/tags/robot/"/>
    
  </entry>
  
  <entry>
    <title>用 vscode 在单片机上写 python 是什么体验？</title>
    <link href="https://blog.jzxer.cn/20241205/20241205_micorpy_with_esp32C3/"/>
    <id>https://blog.jzxer.cn/20241205/20241205_micorpy_with_esp32C3/</id>
    <published>2024-12-05T09:12:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>我是个很讨厌 C 系语言的人（中文发音不算🌚）。任何应用如果是用 c++、c 开发的，多少我都会有点反感，原因很简单，它写起来不美观，看上去也不够优雅，重点是它晦涩难懂，虽然我知道它性能好。但也不影响我打心眼里讨厌它！</p><p><img src="https://oss.jzxer.cn/blog/image-20241205170224113.png" alt="真的很讨厌！"></p><p>所以我在任何以其它语言实现的🐂🍺项目的时候，都会思考：</p><p><strong>能不能用node来实现它？（再不济 python 也行啊！）</strong></p><p>功夫不负有心人。虽然没有找到 JavaScript 的解决方案，但是在调试 esp32 主板的时候无意发现了 micropython 这玩意儿。从官网上看它基本上和 python 语法上没啥差别。想到能在单片机上运行python代码，也算是很开心了。</p><p>说干就干。以下是我用 vscode 搭建一个 micropython 开发环境并且运行了一个简单项目的过程。</p><h2 id="前期准备"><a href="#前期准备" class="headerlink" title="前期准备"></a>前期准备</h2><ol><li>ESP32-c3-supermini x 1</li></ol><p><img src="https://oss.jzxer.cn/blog/dimension.png" alt="esp32-c3-supermini"></p><ol><li>数据线 x 1</li></ol><h2 id="涉及的技术"><a href="#涉及的技术" class="headerlink" title="涉及的技术"></a>涉及的技术</h2><p>micropython、tailwindcss、vscode</p><p><img src="https://oss.jzxer.cn/blog/esp32c3foot1.jpeg" alt="ESP32C3引脚映射"></p><h2 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h2><blockquote><p>以下内容我就默认你懂一点 python 的语法</p></blockquote><h3 id="1-安装-Pymakr"><a href="#1-安装-Pymakr" class="headerlink" title="1. 安装 Pymakr"></a>1. 安装 Pymakr</h3><p>主要是用来识别单片机、并且上传下载代码的一个插件。这个简单，在 vscode 的插件库安装就好了</p><p><img src="https://oss.jzxer.cn/blog/image-20241205171010168.png" alt="image-20241205171010168"></p><p>在vscode 上有另外一个更热门的插件：<strong>RT-Thread</strong>，但是我体验下来，因为我是用的 mac 开发，芯片都识别不出来，相当不好用👎，所以放弃了。windows 用户可能比较友好吧。</p><h3 id="2-烧录-micropython"><a href="#2-烧录-micropython" class="headerlink" title="2. 烧录 micropython"></a>2. 烧录 micropython</h3><p>进入官网，进入 download 页面，选择适合自己主板的驱动进去，下载 xxx.bin 文件。（最新的就行）</p><p><img src="https://oss.jzxer.cn/blog/image-20241205171501184.png" alt="esp32-c3"></p><p>下载好了之后，通过终端进入这个文件所在的根目录，依次执行以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 擦除esp32c3 的所有数据</span></span><br><span class="line">esptool.py --chip esp32c3 --port <span class="variable">$&#123;当前设备的端口&#125;</span> erase_flash</span><br><span class="line"></span><br><span class="line"><span class="comment"># 烧录系统到主板</span></span><br><span class="line">esptool.py --chip esp32c3 --port <span class="variable">$&#123;当前设备的端口&#125;</span> --baud 460800 write_flash -z 0x0 <span class="variable">$&#123;下载的文件完整文件名&#125;</span></span><br></pre></td></tr></table></figure><p>当终端输出 success，说明你烧录成功了！接下来就可以愉快的编写 python 代码了。</p><h3 id="3-连接设备"><a href="#3-连接设备" class="headerlink" title="3. 连接设备"></a>3. 连接设备</h3><p>把设备通过usb连接到电脑，打开 vscode 侧边的tab页面，一般就会显示当前连接的设备。我这里是已经连接的状态。</p><p><img src="https://oss.jzxer.cn/blog/image-20241206181936542.png" alt="资源管理器"></p><p>如果这个时候如上图所示，上传、下载、打开文件夹都是灰色状态，但是设备是已经连上的，说明设备在执行命令中，可以通过下面的 <strong>stop script</strong>， 让它停下来，对应用进行操作。一般这个界面我只会用到这个功能和 <strong>soft reset device</strong> 偏多。</p><p><img src="https://oss.jzxer.cn/blog/image-20241206182208464.png" alt="弹框"></p><h3 id="4-上传代码"><a href="#4-上传代码" class="headerlink" title="4. 上传代码"></a>4. 上传代码</h3><p>设备正常连接，退出执行代码状态之后，就是正式的编写脚本的阶段了，这个时候自由发挥就好了。就正常的编写 python 脚本。</p><p>需要注意的点是，如果通过 pymakr 创建的示例代码会自动创建三个文件：<strong>boot.py、main.py、pymakr.conf</strong></p><p>它们分别代表的作用是：</p><ul><li>boot.py: 初始化脚本，一般这里面执行的内容都是一次性的，比如初始化wifi这种。</li><li>main.py: 正式脚本，里面就是正常的逻辑代码。</li><li>pymakr.conf: 配置文件，这个是必须的，作为项目的可配置内容，具体参数可以参考官网。</li></ul><p>在本文中我提供一个在初始化 wifi连接的方法，如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># boot.py -- run on boot-up</span></span><br><span class="line"><span class="keyword">from</span> machine <span class="keyword">import</span> Pin</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> network</span><br><span class="line"></span><br><span class="line">ssid = <span class="string">&#x27;Xiaomi_xxx&#x27;</span></span><br><span class="line">password = <span class="string">&#x27;xxxxxxxxx&#x27;</span></span><br><span class="line">light = Pin(<span class="number">8</span>, Pin.OUT)</span><br><span class="line"></span><br><span class="line">station = network.WLAN(network.STA_IF)</span><br><span class="line">station.active(<span class="literal">True</span>)</span><br><span class="line">light.value(<span class="number">1</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;start...&quot;</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;connecting...&quot;</span>)</span><br><span class="line"><span class="comment">#  连接超时设置</span></span><br><span class="line">station.connect(ssid, password)</span><br><span class="line"><span class="keyword">while</span> station.isconnected() == <span class="literal">False</span>:</span><br><span class="line">  <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;Connection successful: &#x27;</span>)</span><br><span class="line"><span class="built_in">print</span>(station.ifconfig())</span><br><span class="line"><span class="comment"># 关闭 LED 灯</span></span><br><span class="line">time.sleep(<span class="number">1</span>)</span><br><span class="line">light.value(<span class="number">0</span>)</span><br></pre></td></tr></table></figure><p>代码写好之后，点击上传按钮，再点击开发板上的 reset 键即可运行。</p><p><img src="https://oss.jzxer.cn/blog/image-20241206193422716.png" alt="esp32-c3"></p><p>如果代码正常运行并且 wifi 连接成功的话，单片机的指示灯会先亮一下，再变暗，终端就会提示类似以下代码：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Connection successful: </span><br><span class="line">(<span class="string">&#x27;192.168.xx.xx&#x27;</span>, <span class="string">&#x27;255.255.255.0&#x27;</span>, <span class="string">&#x27;192.168.xx.1&#x27;</span>, <span class="string">&#x27;192.168.xx.1&#x27;</span>)</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>这是第一次使用 micropython 作为开发环境搭建的一个项目，问题其实还是蛮多的，最值得诟病的还是速度确实很慢，这个和 esp32-c3 的架构有关系。根据查阅的相关资料说明，这款开发板不太适合 micropython 的开发模式，据说它会比正常的 C++ 开发模式慢100倍…</p><p>但是说实话，开发的爽感还是有的，但是如果追求性能和稳定性就不太推荐了。可以选择其它性能更好的板子。</p><p>所以在使用了这个 demo之后，我还是切回了正常的 platformIO 开发模式😂。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://blog.jzxer.cn/">dev 的艺术空间</a></p><p><a href="https://garywill.github.io/chiblog/post/esp32/">gary W</a></p>]]></content>
    
    
    <summary type="html">在调试 esp32 主板的时候无意发现了 micropython 这玩意儿。从官网上看它基本上和 python 没差，虽然还有点距离。但是想到能在单片机上运行python代码，也是很开心了。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="esp32" scheme="https://blog.jzxer.cn/tags/esp32/"/>
    
    <category term="python" scheme="https://blog.jzxer.cn/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>通过 gitea 上传各种 package包</title>
    <link href="https://blog.jzxer.cn/20241129/20241129_gitea_insert_package/"/>
    <id>https://blog.jzxer.cn/20241129/20241129_gitea_insert_package/</id>
    <published>2024-11-29T03:50:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>由于之前 nas 上装了 gitea 镜像，在实际应用过程中，因为我主要用的语言是 JavaScript，所以会有很多用到依赖库，但是这个依赖库还没有想好要不要开源。所以想有没有一个办法可以自己搭一个类似<a href="https://verdaccio.org/">Verdaccio</a> 这种私有化部署的开源方案.</p><p>最近发现 gitea 集成了这种功能。这可把我乐坏了。以下就是参考官网的一个使用手册发布一个 npm 包的过程。</p><p><img src="https://oss.jzxer.cn/blog/%E6%88%AA%E5%B1%8F2024-11-29%2011.52.28.png" alt="软件包"></p><h2 id="支持列表"><a href="#支持列表" class="headerlink" title="支持列表"></a>支持列表</h2><p>总的来说，它支持的安装包还是很丰富的，我这里只用到了 docker 和 npm 包。所以本文只会对这两个包的发布和下载展开说明。</p><table><thead><tr><th>Name</th><th>Language</th><th>Package client</th></tr></thead><tbody><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/alpine">Alpine</a></td><td>-</td><td><code>apk</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/cargo">Cargo</a></td><td>Rust</td><td><code>cargo</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/chef">Chef</a></td><td>-</td><td><code>knife</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/composer">Composer</a></td><td>PHP</td><td><code>composer</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/conan">Conan</a></td><td>C++</td><td><code>conan</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/conda">Conda</a></td><td>-</td><td><code>conda</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/container">Container</a></td><td>-</td><td>任何符合OCI规范的客户端</td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/cran">CRAN</a></td><td>R</td><td>-</td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/debian">Debian</a></td><td>-</td><td><code>apt</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/generic">Generic</a></td><td>-</td><td>任何HTTP客户端</td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/go">Go</a></td><td>Go</td><td><code>go</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/helm">Helm</a></td><td>-</td><td>任何HTTP客户端, <code>cm-push</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/maven">Maven</a></td><td>Java</td><td><code>mvn</code>, <code>gradle</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/npm">npm</a></td><td>JavaScript</td><td><code>npm</code>, <code>yarn</code>, <code>pnpm</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/nuget">NuGet</a></td><td>.NET</td><td><code>nuget</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/pub">Pub</a></td><td>Dart</td><td><code>dart</code>, <code>flutter</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/pypi">PyPI</a></td><td>Python</td><td><code>pip</code>, <code>twine</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/packages/rpm">RPM</a></td><td>-</td><td><code>yum</code>, <code>dnf</code>, <code>zypper</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/rubygems">RubyGems</a></td><td>Ruby</td><td><code>gem</code>, <code>Bundler</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/rubygems">Swift</a></td><td>Swift</td><td><code>swift</code></td></tr><tr><td><a href="https://docs.gitea.com/zh-cn/usage/packages/vagrant">Vagrant</a></td><td>-</td><td><code>vagrant</code></td></tr></tbody></table><h2 id="npm-注册表"><a href="#npm-注册表" class="headerlink" title="npm 注册表"></a>npm 注册表</h2><h3 id="1-要求"><a href="#1-要求" class="headerlink" title="1. 要求"></a>1. 要求</h3><p>首先需要安装 <a href="https://nodejs.org/en/download/">Node.js</a> 以及与之配套的软件包管理器，例如 <a href="https://classic.yarnpkg.com/en/docs/install">Yarn</a> 或 <a href="https://docs.npmjs.com/downloading-and-installing-node-js-and-npm/">npm</a> 或者 pnpm，我这里使用的是 npm。</p><p>该注册表支持<a href="https://docs.npmjs.com/misc/scope/">作用域（带@前缀）</a>和非作用域软件包。</p><p>以下示例使用具有作用域 <code>@jzx/test</code> 的 <code>npm</code> 包。</p><h3 id="2-配置注册表"><a href="#2-配置注册表" class="headerlink" title="2. 配置注册表"></a>2. 配置注册表</h3><p>我这里和官方文档不一样的点是，我发布的验证信息通过 .npmrc 和 package.json 来管理。</p><p>首先在项目根目录下创建 .<strong>npmrc</strong>，并在 .<strong>npmrc</strong> 中添加以下代码：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">//git.jzxer.cn/api/packages/<span class="variable">$&#123;your username&#125;</span>/npm/:_authToken=<span class="variable">$&#123;your accessToken&#125;</span></span><br><span class="line">@jzx:registry=https://git.jzxer.cn/api/packages/devlifestyle/npm/</span><br></pre></td></tr></table></figure><p>这段代码的意思是，当你发布包的时候走这个权限校验，这里的<strong>accessToken</strong>去gitea的个人信息页面申请即可。（记得加上作用域，这里的作用域最好是别和官方npm的冲突）</p><p>然后在 package.json 中添加以下代码：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;publishConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;registry&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://git.jzxer.cn/api/packages/$&#123;username&#125;/npm/&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>username 可以填写你的用户名称，如果是组织下的依赖包则填写组织名称。</p><blockquote><p>这种写法的好处就是不需要像官方的写法一样每次都去填写 npm config set …。</p></blockquote><h3 id="3-发布依赖"><a href="#3-发布依赖" class="headerlink" title="3. 发布依赖"></a>3. 发布依赖</h3><p>在终端执行 npm publish，如果返回版本信息则表示发布成功。</p><p><img src="https://oss.jzxer.cn/blog/Nov-29-2024%2012-27-53.gif" alt="发布成功"></p><h3 id="4-依赖下载"><a href="#4-依赖下载" class="headerlink" title="4. 依赖下载"></a>4. 依赖下载</h3><p>由于上文中.npmrc中添加了作用域，所以直接 npm i 包名称即可下载成功。</p><h2 id="container-注册表"><a href="#container-注册表" class="headerlink" title="container 注册表"></a>container 注册表</h2><p>这个是 <strong>docker</strong> 的镜像包的推送和下载方法。</p><h3 id="1-要求-1"><a href="#1-要求-1" class="headerlink" title="1. 要求"></a>1. 要求</h3><p>电脑上有 <a href="docker.com">docker</a> ，并且熟悉 Dockerfile 的基本语法。我这里给一些基本的语法解释说明。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">FROM <span class="comment">#基础镜像，一切从这里开始构建</span></span><br><span class="line">MAINTAINER<span class="comment">#镜像是谁写的，姓名+邮箱</span></span><br><span class="line">RUN<span class="comment">#镜像构建时需要运行的命令</span></span><br><span class="line">ADD<span class="comment">#步骤，tomcat镜像，这个tomcat压缩包；添加内容</span></span><br><span class="line">WORKDIR<span class="comment">#镜像工作目录</span></span><br><span class="line">VOLUME<span class="comment">#挂载的目录</span></span><br><span class="line">EXPOSE<span class="comment">#暴露端口配置</span></span><br><span class="line">CMD<span class="comment">#指定这个容器启动的时候要运行的命令,只有最后一个会生效，可被替代</span></span><br><span class="line">ENTRYPOINT<span class="comment">#指定这个容器启动的时候要运行的命令，可以追加命令</span></span><br><span class="line">ONBUILD<span class="comment">#当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令，触发指令</span></span><br><span class="line">COPY<span class="comment">#类似ADD,将我们的文件拷贝至镜像中</span></span><br><span class="line">ENV<span class="comment">#构建的时候设置环境变量</span></span><br></pre></td></tr></table></figure><p>接下来就可以跟着我一起来操作了。</p><h3 id="2-创建-Dockerfile"><a href="#2-创建-Dockerfile" class="headerlink" title="2. 创建 Dockerfile"></a>2. 创建 Dockerfile</h3><p>创建一个文件夹 demo。进入该文件夹中创建一个 Dockerfile 文件，写入以下内容：</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> ubuntu:<span class="number">18.04</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> . /app</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> sh /app/start.sh</span></span><br></pre></td></tr></table></figure><h3 id="3-添加容器内容"><a href="#3-添加容器内容" class="headerlink" title="3. 添加容器内容"></a>3. 添加容器内容</h3><p>创建一个 start.sh 文件, 写入以下内容：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;Hello World&#x27;</span></span><br><span class="line"><span class="comment">#自己再写点其他的也行</span></span><br></pre></td></tr></table></figure><h3 id="4-登录-docker"><a href="#4-登录-docker" class="headerlink" title="4. 登录 docker"></a>4. 登录 docker</h3><p>需要登录自己的私有docker地址，因为默认的地址是 docker的官方源：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker login gitea.example.com</span><br></pre></td></tr></table></figure><p>按要求输入账号和密码</p><h3 id="5-打包-docker-镜像"><a href="#5-打包-docker-镜像" class="headerlink" title="5. 打包 docker 镜像"></a>5. 打包 docker 镜像</h3><p>这一步是为了按照 Dockerfile 中的内容打包成 docker可识别的镜像，执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker build -t your-image-name:tag .</span><br></pre></td></tr></table></figure><p>Your-image-name 是你要打包的包名称，这里建议不要和官方仓库重复，方便以后开源同步推送，tag 是版本号。</p><h3 id="6-给镜像打标签"><a href="#6-给镜像打标签" class="headerlink" title="6. 给镜像打标签"></a>6. 给镜像打标签</h3><p>因为需要推送的是私有仓库，这一步是必要的：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker tag your-image-name:tag gitea.example.com/<span class="variable">$&#123;yourname&#125;</span>/your-image-name:tag</span><br></pre></td></tr></table></figure><h3 id="7-推送-下载"><a href="#7-推送-下载" class="headerlink" title="7. 推送&#x2F;下载"></a>7. 推送&#x2F;下载</h3><p>推送代码执行如下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker push gitea.example.com/<span class="variable">$&#123;yourname&#125;</span>/your-image-name:tag</span><br></pre></td></tr></table></figure><p>下载镜像执行以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker pull gitea.example.com/<span class="variable">$&#123;yourname&#125;</span>/your-image-name:tag</span><br></pre></td></tr></table></figure><h3 id="8-保存到当前文件夹（可选）"><a href="#8-保存到当前文件夹（可选）" class="headerlink" title="8. 保存到当前文件夹（可选）"></a>8. 保存到当前文件夹（可选）</h3><p>如果有额外需求，比如说当前的电脑无法联网，可以尝试下载到本地，然后再执行部署。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker save -o your-image-name.tar your-image-name:tag</span><br></pre></td></tr></table></figure><p>用本地文件部署</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker load -i your--local-image-name.tar</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>以上就是使用 gitea 的软件包模块的完整流程。其它的软件包也是同理，可以去参考 gitea 的官方文档。</p><p>总的来说难度不高，下一期尝试一下把部署的流程通过 gitea-runner 实现自动化发布。这样就不用每次都手动去发布了。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://docs.gitea.com/">gitea</a></p><p><a href="https://blog.jzxer.cn/">dev的艺术空间</a></p>]]></content>
    
    
    <summary type="html">因为我主要用的语言是 JavaScript，所以会有很多用到依赖库，但是这个依赖库还没有想好要不要开源。所以想有没有一个办法可以自己搭一个类似[Verdaccio](https://verdaccio.org/) 这种私有化部署的开源方案...</summary>
    
    
    
    <category term="nas" scheme="https://blog.jzxer.cn/categories/nas/"/>
    
    
    <category term="gitea" scheme="https://blog.jzxer.cn/tags/gitea/"/>
    
    <category term="工具" scheme="https://blog.jzxer.cn/tags/%E5%B7%A5%E5%85%B7/"/>
    
    <category term="自动化" scheme="https://blog.jzxer.cn/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>学习并训练 tensorflow 的语音识别模型</title>
    <link href="https://blog.jzxer.cn/20241128/20241128_learning_tf_voice/"/>
    <id>https://blog.jzxer.cn/20241128/20241128_learning_tf_voice/</id>
    <published>2024-11-28T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>玩了单片机有一段时间了，预期自己的AI智能管家的语音通话功能还相差万里，所以想尝试着看看能不能从现有的技术方案找一个合适的，我对这个模型的预期很简单：</p><ol><li>能实现语音唤醒</li><li>能支持语音交互</li><li>可以支持nodejs最好</li><li>低功耗，高性能，响应速度快</li><li>容易部署，可以在香橙派上部署，如果能部署到单片机上最佳</li></ol><p>为什么要这么设计的原因是为了未来我发布的产品能够集成这些功能并且实现最小化的维护成本和最快最稳定的部署成本。</p><p>正所谓只要用心啥事儿都有上帝帮忙的，这可不被我找到了speech-commands方案。下面就来看看它的部署方案。</p><h2 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h2><h3 id="1-Parcel-快速构建"><a href="#1-Parcel-快速构建" class="headerlink" title="1. Parcel 快速构建"></a>1. Parcel 快速构建</h3><p>由于是实例项目，只是为了学习它的功能调用，所以这里我使用的是 parcel，后期我也会大量的使用这个工具，因为它零配置开箱即用，对快速上手某个库很有帮助。</p><h3 id="2-关闭浏览器的https安全校验"><a href="#2-关闭浏览器的https安全校验" class="headerlink" title="2. 关闭浏览器的https安全校验"></a>2. 关闭浏览器的https安全校验</h3><ul><li><p><strong>Chrome和Edge浏览器</strong>：在浏览器地址栏输入<code>chrome://flags/#unsafely-treat-insecure-origin-as-secure</code>，然后将该设置从Disabled切换到Enabled，并在输入框中填写需要开启的域名，重启浏览器后生效。</p></li><li><p><strong>Firefox浏览器</strong>：在浏览器地址栏输入<code>about:config</code>，搜索并修改以下两项为<code>true</code>：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">media.devices.insecure.enabled = true</span><br><span class="line">media.getusermedia.insecure.enabled = true</span><br></pre></td></tr></table></figure><p>修改后重启浏览器。</p></li></ul><p>上述两个问题解决了的话就可以正式开始进入开发环境了。</p><h2 id="快速上手"><a href="#快速上手" class="headerlink" title="快速上手"></a>快速上手</h2><h3 id="1-收集数据"><a href="#1-收集数据" class="headerlink" title="1. 收集数据"></a>1. 收集数据</h3><h4 id="1-1-首先第一步，我们需要先收集模型数据"><a href="#1-1-首先第一步，我们需要先收集模型数据" class="headerlink" title="1.1 首先第一步，我们需要先收集模型数据"></a>1.1 首先第一步，我们需要先收集模型数据</h4><p>以下代码添加到 <code>&lt;body&gt;</code> 标记的 <code>&lt;div id=&quot;console&quot;&gt;</code> 前面，即可为应用添加一个简单的界面：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;button id=<span class="string">&quot;left&quot;</span> onmousedown=<span class="string">&quot;collect(0)&quot;</span> onmouseup=<span class="string">&quot;collect(null)&quot;</span>&gt;<span class="title class_">Left</span>&lt;/button&gt;</span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">button</span> <span class="attr">id</span>=<span class="string">&quot;right&quot;</span> <span class="attr">onmousedown</span>=<span class="string">&quot;collect(1)&quot;</span> <span class="attr">onmouseup</span>=<span class="string">&quot;collect(null)&quot;</span>&gt;</span>Right<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">button</span> <span class="attr">id</span>=<span class="string">&quot;noise&quot;</span> <span class="attr">onmousedown</span>=<span class="string">&quot;collect(2)&quot;</span> <span class="attr">onmouseup</span>=<span class="string">&quot;collect(null)&quot;</span>&gt;</span>Noise<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span></span><br></pre></td></tr></table></figure><h4 id="1-2-然后把以下的代码加到-index-js-中"><a href="#1-2-然后把以下的代码加到-index-js-中" class="headerlink" title="1.2 然后把以下的代码加到 index.js 中"></a>1.2 然后把以下的代码加到 index.js 中</h4><p>注释掉之前的 predictWord 方法代码，添加以下代码：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="variable constant_">NUM_FRAMES</span> = <span class="number">3</span>;</span><br><span class="line"><span class="keyword">let</span> examples = [];</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">collect</span>(<span class="params">label</span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (recognizer.<span class="title function_">isListening</span>()) &#123;</span><br><span class="line">    <span class="keyword">return</span> recognizer.<span class="title function_">stopListening</span>();</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (label == <span class="literal">null</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  recognizer.<span class="title function_">listen</span>(<span class="keyword">async</span> (&#123; <span class="attr">spectrogram</span>: &#123; frameSize, data &#125; &#125;) =&gt; &#123;</span><br><span class="line">    <span class="keyword">let</span> vals = <span class="title function_">normalize</span>(data.<span class="title function_">subarray</span>(-frameSize * <span class="variable constant_">NUM_FRAMES</span>));  <span class="comment">// 截取最后3帧数据</span></span><br><span class="line">    examples.<span class="title function_">push</span>(&#123; vals, label &#125;);  <span class="comment">// 将数据(696个数字，频谱信息)和标签（左、右、噪音）存入examples数组</span></span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#console&#x27;</span>).<span class="property">textContent</span> =</span><br><span class="line">      <span class="string">`<span class="subst">$&#123;examples.length&#125;</span> examples collected`</span>;</span><br><span class="line">  &#125;, &#123;</span><br><span class="line">    <span class="attr">overlapFactor</span>: <span class="number">0.999</span>,  <span class="comment">// 重叠因子</span></span><br><span class="line">    <span class="attr">includeSpectrogram</span>: <span class="literal">true</span>,  <span class="comment">// 显示频谱图</span></span><br><span class="line">    <span class="attr">invokeCallbackOnNoiseAndUnknown</span>: <span class="literal">true</span> <span class="comment">// 在噪音和未知情况下调用回调</span></span><br><span class="line">  &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">normalize</span>(<span class="params">x</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> mean = -<span class="number">100</span>;  <span class="comment">// 均值 0</span></span><br><span class="line">  <span class="keyword">const</span> std = <span class="number">10</span>;  <span class="comment">// 标准差 1</span></span><br><span class="line">  <span class="keyword">return</span> x.<span class="title function_">map</span>(<span class="function"><span class="params">x</span> =&gt;</span> (x - mean) / std); <span class="comment">// 归一化</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="1-3-移除-app-中的-predictWord"><a href="#1-3-移除-app-中的-predictWord" class="headerlink" title="1.3 移除 app 中的  predictWord"></a>1.3 移除 app 中的  predictWord</h4><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">app</span>(<span class="params"></span>) &#123;</span><br><span class="line"> recognizer = speechCommands.<span class="title function_">create</span>(<span class="string">&#x27;BROWSER_FFT&#x27;</span>);</span><br><span class="line"> <span class="keyword">await</span> recognizer.<span class="title function_">ensureModelLoaded</span>();</span><br><span class="line"> <span class="comment">// predictWord() no longer called.</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="代码分解"><a href="#代码分解" class="headerlink" title="代码分解"></a>代码分解</h4><p>Html 界面中添加的三个标记为“Left”“Right”和“Noise”的按钮，分别对应于我们希望模型识别的三个命令。按下这些按钮会调用我们新添加的 <code>collect()</code> 函数，该函数会为模型创建训练示例。</p><p><code>collect()</code> 会将 <code>label</code> 与 <code>recognizer.listen()</code> 的输出相关联。由于 <code>includeSpectrogram</code> 为 true<code>,</code> <code>recognizer.listen()</code> 会给出 1 秒音频的原始声谱图（频率数据），分 43 帧，因此每帧的音频时长约为 23 毫秒：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">recognizer.<span class="title function_">listen</span>(<span class="keyword">async</span> (&#123;<span class="attr">spectrogram</span>: &#123;frameSize, data&#125;&#125;) =&gt; &#123;</span><br><span class="line">...</span><br><span class="line">&#125;, &#123;<span class="attr">includeSpectrogram</span>: <span class="literal">true</span>&#125;);</span><br></pre></td></tr></table></figure><p>由于我们想使用较短的声音而不是文字来控制滑块，因此我们仅考虑最后 3 帧（约 70 毫秒）：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> vals = <span class="title function_">normalize</span>(data.<span class="title function_">subarray</span>(-frameSize * <span class="variable constant_">NUM_FRAMES</span>));</span><br></pre></td></tr></table></figure><p>为了避免数值问题，我们将数据归一化，使平均值为 0，标准差为 1。在这种情况下，声谱图值通常是 -100 左右的较大负值，偏差为 10：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> mean = -<span class="number">100</span>;</span><br><span class="line"><span class="keyword">const</span> std = <span class="number">10</span>;</span><br><span class="line"><span class="keyword">return</span> x.<span class="title function_">map</span>(<span class="function"><span class="params">x</span> =&gt;</span> (x - mean) / std);</span><br></pre></td></tr></table></figure><p>最后，每个训练样本都包含 2 个字段：</p><ul><li><strong><code>label</code></strong>**<em>*</em>***：0、1 和 2 分别表示“左”和“右”和“噪音”。</li><li><strong><code>vals</code></strong>**<em>*</em>***：696 个数字，包含频率信息（声谱图）</li></ul><p>并将所有数据存储在 <code>examples</code> 变量中：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">examples.<span class="title function_">push</span>(&#123;vals, label&#125;);</span><br></pre></td></tr></table></figure><h3 id="2-测试收集数据功能"><a href="#2-测试收集数据功能" class="headerlink" title="2. 测试收集数据功能"></a>2. 测试收集数据功能</h3><blockquote><p><strong>注意</strong>：测试数据收集后，系统会将样本丢弃，因此不要浪费时间收集过多数据！</p></blockquote><p>在浏览器中打开 <strong>index.html</strong>，您应该会看到与 3 个命令相对应的 3 个按钮。如果您通过本地文件访问麦克风，则必须启动网络服务器并使用 <code>http://localhost:port/</code>。</p><p>如需收集每条指令的示例，请在 <strong>按住</strong> 每个按钮 3-4 秒的同时（或连续）发出一致的声音。官方建议收集大约150 个样本。我们可以用打响指代表 <strong>Left</strong>，用吹口哨代表 <strong>Right</strong>，启动&#x2F;关闭电脑静音功能来表示 <strong>Noice</strong>。</p><p>页面上显示的计数器会随着样本的增多而变大。可以随时通过在控制台中的 <code>examples</code> 变量调用 console.log() 来检查数据。此阶段的目标是测试数据收集流程。</p><h3 id="3-训练模型"><a href="#3-训练模型" class="headerlink" title="3. 训练模型"></a>3. 训练模型</h3><p>第一步：在 html 的 noice 之后添加以下内容：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">br</span>/&gt;</span><span class="tag">&lt;<span class="name">br</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">button</span> <span class="attr">id</span>=<span class="string">&quot;train&quot;</span> <span class="attr">onclick</span>=<span class="string">&quot;train()&quot;</span>&gt;</span>Train<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br></pre></td></tr></table></figure><p>第二步：将以下内容添加到 <strong>index.js</strong> 中的现有代码中：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line">...more code</span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">INPUT_SHAPE</span> = [<span class="variable constant_">NUM_FRAMES</span>, <span class="number">232</span>, <span class="number">1</span>];  <span class="comment">// 输入形状 每帧是 23 毫秒的音频，包含 232 个对应于不同频率的数字</span></span><br><span class="line"><span class="keyword">let</span> model;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 该函数用于训练模型。</span></span><br><span class="line"><span class="comment"> * 函数内部可能包含训练的具体逻辑，例如数据迭代、参数更新、损失计算等操作。</span></span><br><span class="line"><span class="comment"> * 具体的训练过程会根据不同的模型和训练数据而有所不同。</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">Object</span>&#125; <span class="variable">model</span> - 要训练的模型对象，该对象应该已经被初始化。</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">Array</span>&#125; <span class="variable">data</span> - 用于训练的数据，通常是一个数组，包含训练样本。</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">Object</span>&#125; <span class="variable">options</span> - 训练的选项，可能包含学习率、迭代次数等参数。</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@returns</span> &#123;<span class="type">Object</span>&#125; 训练好的模型对象，可能包含更新后的参数和训练结果信息。</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">train</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="title function_">toggleButtons</span>(<span class="literal">false</span>);  <span class="comment">// 禁用按钮</span></span><br><span class="line">  <span class="keyword">const</span> ys = tf.<span class="title function_">oneHot</span>(examples.<span class="title function_">map</span>(<span class="function"><span class="params">e</span> =&gt;</span> e.<span class="property">label</span>), <span class="number">3</span>);  <span class="comment">// 将标签转换为 one-hot 编码  左、右、噪音  3个类别  3个数字  0 1 2</span></span><br><span class="line">  <span class="keyword">const</span> xsShape = [examples.<span class="property">length</span>, ...<span class="variable constant_">INPUT_SHAPE</span>]; <span class="comment">// 输入形状  训练样本数量  输入形状  每帧是 23 毫秒的音频，包含 232 个对应于不同频率的数字</span></span><br><span class="line">  <span class="keyword">const</span> xs = tf.<span class="title function_">tensor</span>(<span class="title function_">flatten</span>(examples.<span class="title function_">map</span>(<span class="function"><span class="params">e</span> =&gt;</span> e.<span class="property">vals</span>)), xsShape); <span class="comment">// 将训练数据转换为张量</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">await</span> model.<span class="title function_">fit</span>(xs, ys, &#123;  <span class="comment">// 训练模型  训练次数 10 次  每批次 16 个样本  每批次训练完后更新模型参数</span></span><br><span class="line">    <span class="attr">batchSize</span>: <span class="number">16</span>,</span><br><span class="line">    <span class="attr">epochs</span>: <span class="number">10</span>,</span><br><span class="line">    <span class="attr">callbacks</span>: &#123;</span><br><span class="line">      <span class="attr">onEpochEnd</span>: <span class="function">(<span class="params">epoch, logs</span>) =&gt;</span> &#123;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#console&#x27;</span>).<span class="property">textContent</span> =</span><br><span class="line">          <span class="string">`Accuracy: <span class="subst">$&#123;(logs.acc * <span class="number">100</span>).toFixed(<span class="number">1</span>)&#125;</span>% Epoch: <span class="subst">$&#123;epoch + <span class="number">1</span>&#125;</span>`</span>;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;);</span><br><span class="line">  tf.<span class="title function_">dispose</span>([xs, ys]);  <span class="comment">// 释放内存</span></span><br><span class="line">  <span class="title function_">toggleButtons</span>(<span class="literal">true</span>);  <span class="comment">// 启用按钮</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 该函数用于构建模型。</span></span><br><span class="line"><span class="comment"> * 具体的构建逻辑需要根据实际情况在函数内部实现。</span></span><br><span class="line"><span class="comment"> * 可能会涉及到数据处理、模型初始化、参数设置等操作。</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">Object</span>&#125; <span class="variable">config</span> - 构建模型所需的配置对象，包含各种参数信息。</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@returns</span> &#123;<span class="type">Object</span>&#125; 构建好的模型对象，具体结构取决于模型的实现。</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">buildModel</span>(<span class="params"></span>) &#123;</span><br><span class="line">  model = tf.<span class="title function_">sequential</span>();  <span class="comment">// 顺序模型</span></span><br><span class="line">  model.<span class="title function_">add</span>(tf.<span class="property">layers</span>.<span class="title function_">depthwiseConv2d</span>(&#123;   <span class="comment">// 2维卷积层</span></span><br><span class="line">    <span class="attr">depthMultiplier</span>: <span class="number">8</span>,   <span class="comment">// 8个卷积核</span></span><br><span class="line">    <span class="attr">kernelSize</span>: [<span class="variable constant_">NUM_FRAMES</span>, <span class="number">3</span>],  <span class="comment">// 3个卷积核</span></span><br><span class="line">    <span class="attr">activation</span>: <span class="string">&#x27;relu&#x27;</span>, <span class="comment">// 激活函数</span></span><br><span class="line">    <span class="attr">inputShape</span>: <span class="variable constant_">INPUT_SHAPE</span>   <span class="comment">// 输入形状</span></span><br><span class="line">  &#125;));</span><br><span class="line">  model.<span class="title function_">add</span>(tf.<span class="property">layers</span>.<span class="title function_">maxPooling2d</span>(&#123; <span class="attr">poolSize</span>: [<span class="number">1</span>, <span class="number">2</span>], <span class="attr">strides</span>: [<span class="number">2</span>, <span class="number">2</span>] &#125;));   <span class="comment">// 最大池化层</span></span><br><span class="line">  model.<span class="title function_">add</span>(tf.<span class="property">layers</span>.<span class="title function_">flatten</span>());  <span class="comment">// 展平层</span></span><br><span class="line">  model.<span class="title function_">add</span>(tf.<span class="property">layers</span>.<span class="title function_">dense</span>(&#123; <span class="attr">units</span>: <span class="number">3</span>, <span class="attr">activation</span>: <span class="string">&#x27;softmax&#x27;</span> &#125;));   <span class="comment">// 全连接层</span></span><br><span class="line">  <span class="keyword">const</span> optimizer = tf.<span class="property">train</span>.<span class="title function_">adam</span>(<span class="number">0.01</span>);   <span class="comment">// 优化器  梯度下降算法  学习率 0.01</span></span><br><span class="line">  model.<span class="title function_">compile</span>(&#123;  <span class="comment">// 编译模型</span></span><br><span class="line">    optimizer,  <span class="comment">// 优化器</span></span><br><span class="line">    <span class="attr">loss</span>: <span class="string">&#x27;categoricalCrossentropy&#x27;</span>, <span class="comment">// 损失函数  交叉熵损失函数</span></span><br><span class="line">    <span class="attr">metrics</span>: [<span class="string">&#x27;accuracy&#x27;</span>]  <span class="comment">//   准确率   预测正确的概率</span></span><br><span class="line">  &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">toggleButtons</span>(<span class="params">enable</span>) &#123;</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;button&#x27;</span>).<span class="title function_">forEach</span>(<span class="function"><span class="params">b</span> =&gt;</span> b.<span class="property">disabled</span> = !enable);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 该函数用于将嵌套数组扁平化。</span></span><br><span class="line"><span class="comment"> * 它接收一个数组作为输入，该数组可以包含任意深度的嵌套数组。</span></span><br><span class="line"><span class="comment"> * 函数会递归地将嵌套数组中的元素提取出来，最终返回一个一维数组。</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">Array</span>&#125; <span class="variable">arr</span> - 要扁平化的数组</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@returns</span> &#123;<span class="type">Array</span>&#125; 扁平化后的一维数组</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">flatten</span>(<span class="params">tensors</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> size = tensors[<span class="number">0</span>].<span class="property">length</span>;</span><br><span class="line">  <span class="keyword">const</span> result = <span class="keyword">new</span> <span class="title class_">Float32Array</span>(tensors.<span class="property">length</span> * size);</span><br><span class="line">  tensors.<span class="title function_">forEach</span>(<span class="function">(<span class="params">arr, i</span>) =&gt;</span> result.<span class="title function_">set</span>(arr, i * size));</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br><span class="line">...more code</span><br></pre></td></tr></table></figure><p>第三步：在 app 函数中添加 <code>buildModel()</code> 方法：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">async function app() &#123;</span><br><span class="line"> recognizer = speechCommands.create(&#x27;BROWSER_FFT&#x27;);</span><br><span class="line"> await recognizer.ensureModelLoaded();</span><br><span class="line"> buildModel();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="代码分解-1"><a href="#代码分解-1" class="headerlink" title="代码分解"></a>代码分解</h4><p>概括来讲，我们要做两件事：<code>buildModel()</code> 定义模型架构，<code>train()</code> 使用收集的数据训练模型。</p><p><strong>模型架构</strong></p><p>该模型有 4 个层：用于处理音频数据的卷积层（表示为声谱图）、一个最大池层、一个扁平化层，以及一个映射到以下 3 个操作的密集层：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">model = tf.<span class="title function_">sequential</span>();  <span class="comment">// 顺序模型</span></span><br><span class="line">  model.<span class="title function_">add</span>(tf.<span class="property">layers</span>.<span class="title function_">depthwiseConv2d</span>(&#123;   <span class="comment">// 2维卷积层</span></span><br><span class="line">    <span class="attr">depthMultiplier</span>: <span class="number">8</span>,   <span class="comment">// 8个卷积核</span></span><br><span class="line">    <span class="attr">kernelSize</span>: [<span class="variable constant_">NUM_FRAMES</span>, <span class="number">3</span>],  <span class="comment">// 3个卷积核</span></span><br><span class="line">    <span class="attr">activation</span>: <span class="string">&#x27;relu&#x27;</span>, <span class="comment">// 激活函数</span></span><br><span class="line">    <span class="attr">inputShape</span>: <span class="variable constant_">INPUT_SHAPE</span>   <span class="comment">// 输入形状</span></span><br><span class="line">  &#125;));</span><br><span class="line">  model.<span class="title function_">add</span>(tf.<span class="property">layers</span>.<span class="title function_">maxPooling2d</span>(&#123; <span class="attr">poolSize</span>: [<span class="number">1</span>, <span class="number">2</span>], <span class="attr">strides</span>: [<span class="number">2</span>, <span class="number">2</span>] &#125;));   <span class="comment">// 最大池化层</span></span><br><span class="line">  model.<span class="title function_">add</span>(tf.<span class="property">layers</span>.<span class="title function_">flatten</span>());  <span class="comment">// 展平层</span></span><br><span class="line">  model.<span class="title function_">add</span>(tf.<span class="property">layers</span>.<span class="title function_">dense</span>(&#123; <span class="attr">units</span>: <span class="number">3</span>, <span class="attr">activation</span>: <span class="string">&#x27;softmax&#x27;</span> &#125;));   <span class="comment">// 全连接层</span></span><br></pre></td></tr></table></figure><p>模型的输入形状是 <code>[NUM_FRAMES, 232, 1]</code>，其中每帧是 23 毫秒的音频，包含 232 个对应于不同频率的数字（选择了 232 个，因为这是捕获人类语音所需的频率范围量）。在此 Codelab 中，我们将使用时长为 3 帧的样本（样本时长约为 70 毫秒），因为我们通过发出声音来控制滑块，而不是读出整个字词。</p><p>我们编译模型，使其准备好进行训练：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">const optimizer = tf.train.adam(0.01);   // 优化器  梯度下降算法  学习率 0.01</span><br><span class="line">  model.compile(&#123;  // 编译模型</span><br><span class="line">    optimizer,  // 优化器</span><br><span class="line">    loss: &#x27;categoricalCrossentropy&#x27;, // 损失函数  交叉熵损失函数</span><br><span class="line">    metrics: [&#x27;accuracy&#x27;]  //   准确率   预测正确的概率</span><br><span class="line">  &#125;);</span><br></pre></td></tr></table></figure><p>我们使用 <a href="https://arxiv.org/abs/1412.6980">Adam 优化器</a>（深度学习中常用的优化器）和 <code>categoricalCrossEntropy</code>（用于分类的标准损失函数）处理损失函数。简而言之，它会测量预测的概率（每个类别一个概率）与真实类别中的概率为 100%，所有其他类别中的概率为 0% 的差距。我们还提供 <code>accuracy</code> 作为监控的指标，这可提供每个训练周期后模型正确获取样本的百分比。</p><p><strong>训练</strong></p><p>使用批量大小为 16 的数据对数据进行 10 次（周期）训练（一次处理 16 个样本），并在界面中显示当前的准确率：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">await</span> model.<span class="title function_">fit</span>(xs, ys, &#123;  <span class="comment">// 训练模型  训练次数 10 次  每批次 16 个样本  每批次训练完后更新模型参数</span></span><br><span class="line">    <span class="attr">batchSize</span>: <span class="number">16</span>,</span><br><span class="line">    <span class="attr">epochs</span>: <span class="number">10</span>,</span><br><span class="line">    <span class="attr">callbacks</span>: &#123;</span><br><span class="line">      <span class="attr">onEpochEnd</span>: <span class="function">(<span class="params">epoch, logs</span>) =&gt;</span> &#123;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#console&#x27;</span>).<span class="property">textContent</span> =</span><br><span class="line">          <span class="string">`Accuracy: <span class="subst">$&#123;(logs.acc * <span class="number">100</span>).toFixed(<span class="number">1</span>)&#125;</span>% Epoch: <span class="subst">$&#123;epoch + <span class="number">1</span>&#125;</span>`</span>;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;);</span><br></pre></td></tr></table></figure><h3 id="4-实时更新监听声音"><a href="#4-实时更新监听声音" class="headerlink" title="4. 实时更新监听声音"></a>4. 实时更新监听声音</h3><p>现在我们可以训练模型了。接下来添加一个可以验证训练模型结果的滑块，先将以下代码添加到index.html “<strong>Train</strong>”之后：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">button</span> <span class="attr">id</span>=<span class="string">&quot;train&quot;</span> <span class="attr">onclick</span>=<span class="string">&quot;train()&quot;</span>&gt;</span>Train<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">br</span>/&gt;</span><span class="tag">&lt;<span class="name">br</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">button</span> <span class="attr">id</span>=<span class="string">&quot;listen&quot;</span> <span class="attr">onclick</span>=<span class="string">&quot;listen()&quot;</span>&gt;</span>Listen<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;range&quot;</span> <span class="attr">id</span>=<span class="string">&quot;output&quot;</span> <span class="attr">min</span>=<span class="string">&quot;0&quot;</span> <span class="attr">max</span>=<span class="string">&quot;10&quot;</span> <span class="attr">step</span>=<span class="string">&quot;0.1&quot;</span>&gt;</span></span><br></pre></td></tr></table></figure><p>然后在 <strong>index.js</strong> 中添加以下内容：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 该函数用于将滑动条的值移动到指定的标签。</span></span><br><span class="line"><span class="comment"> * 它接收一个标签张量作为输入，该张量包含预测的标签值。</span></span><br><span class="line"><span class="comment"> * 函数会根据标签值更新滑动条的位置，以模拟滑动条的移动。</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">Tensor</span>&#125; <span class="variable">labelTensor</span> - 包含预测标签值的张量</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@returns</span> &#123;<span class="type">void</span>&#125;</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">moveSlider</span>(<span class="params">labelTensor</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> label = (<span class="keyword">await</span> labelTensor.<span class="title function_">data</span>())[<span class="number">0</span>];  <span class="comment">// 获取标签值</span></span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;console&#x27;</span>).<span class="property">textContent</span> = label;  <span class="comment">//   输出标签值</span></span><br><span class="line">  <span class="keyword">if</span> (label == <span class="number">2</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">let</span> delta = <span class="number">0.1</span>;</span><br><span class="line">  <span class="keyword">const</span> prevValue = +<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;output&#x27;</span>).<span class="property">value</span>; <span class="comment">// 获取滑动条的当前值</span></span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;output&#x27;</span>).<span class="property">value</span> = prevValue + (label === <span class="number">0</span> ? -delta : delta);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 该函数用于开始监听语音输入。</span></span><br><span class="line"><span class="comment"> * 它会检查当前是否正在监听语音输入，如果是，则停止监听；否则，开始监听语音输入。</span></span><br><span class="line"><span class="comment"> * 监听过程中，函数会更新按钮的状态和文本，以模拟按钮的点击效果。</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@returns</span> &#123;<span class="type">void</span>&#125;</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">listen</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (recognizer.<span class="title function_">isListening</span>()) &#123;</span><br><span class="line">    recognizer.<span class="title function_">stopListening</span>();</span><br><span class="line">    <span class="title function_">toggleButtons</span>(<span class="literal">true</span>);</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;listen&#x27;</span>).<span class="property">textContent</span> = <span class="string">&#x27;Listen&#x27;</span>;</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="title function_">toggleButtons</span>(<span class="literal">false</span>);</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;listen&#x27;</span>).<span class="property">textContent</span> = <span class="string">&#x27;Stop&#x27;</span>;</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;listen&#x27;</span>).<span class="property">disabled</span> = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">  recognizer.<span class="title function_">listen</span>(<span class="keyword">async</span> (&#123; <span class="attr">spectrogram</span>: &#123; frameSize, data &#125; &#125;) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> vals = <span class="title function_">normalize</span>(data.<span class="title function_">subarray</span>(-frameSize * <span class="variable constant_">NUM_FRAMES</span>)); <span class="comment">// 截取最后3帧数据</span></span><br><span class="line">    <span class="keyword">const</span> input = tf.<span class="title function_">tensor</span>(vals, [<span class="number">1</span>, ...<span class="variable constant_">INPUT_SHAPE</span>]); <span class="comment">// 将数据转换为张量</span></span><br><span class="line">    <span class="keyword">const</span> probs = model.<span class="title function_">predict</span>(input);  <span class="comment">// 预测</span></span><br><span class="line">    <span class="keyword">const</span> predLabel = probs.<span class="title function_">argMax</span>(<span class="number">1</span>);  <span class="comment">// 预测标签</span></span><br><span class="line">    <span class="keyword">await</span> <span class="title function_">moveSlider</span>(predLabel);  <span class="comment">// 移动滑动条 0 左 1 右 2 噪音</span></span><br><span class="line">    tf.<span class="title function_">dispose</span>([input, probs, predLabel]);  <span class="comment">// 释放内存</span></span><br><span class="line">  &#125;, &#123;</span><br><span class="line">    <span class="attr">overlapFactor</span>: <span class="number">0.999</span>,</span><br><span class="line">    <span class="attr">includeSpectrogram</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="attr">invokeCallbackOnNoiseAndUnknown</span>: <span class="literal">true</span></span><br><span class="line">  &#125;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="代码分解-2"><a href="#代码分解-2" class="headerlink" title="代码分解"></a>代码分解</h4><p><strong>实时预测</strong></p><p><code>listen()</code> 会监听麦克风并进行实时预测。该代码与 <code>collect()</code> 方法非常相似，该方法会将原始声谱图归一化并删除最后 <code>NUM_FRAMES</code> 帧以外的所有帧。唯一的区别在于，我们还会调用经过训练的模型，以获取预测结果：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">const probs = model.predict(input);</span><br><span class="line">const predLabel = probs.argMax(1);</span><br><span class="line">await moveSlider(predLabel);</span><br></pre></td></tr></table></figure><p><code>model.predict(input)</code> 的输出是形状为 <code>[1, numClasses]</code> 的张量，表示类别数量的概率分布。简而言之，这只是每个可能输出类别的一组置信度，总和为 1。张量的外维度为 1，因为这是批次（单个样本）的大小。</p><p>为了将概率分布转换为表示最可能类别的单个整数，我们调用 <code>probs.argMax(1)</code> 以返回概率最高的类别索引。我们将一个“1”作为轴参数，因为我们想要计算最后一个维度 <code>numClasses</code> 的 <code>argMax</code>。</p><p><strong>更新滑块</strong></p><p><code>moveSlider()</code>：如果标签为 0（“左”），则减小滑块的值；如果标签为 1（“右”），则减小滑块的值；如果标签为 2（“噪声”），则忽略该值。</p><p><strong>处置张量</strong></p><p>要清理 GPU 内存，我们必须对输出张量手动调用 tf.dispose()。手动 <code>tf.dispose()</code> 的替代方案是将函数调用封装在 <code>tf.tidy()</code> 中，但这不能用于异步函数。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tf.<span class="title function_">dispose</span>([input, probs, predLabel]);</span><br></pre></td></tr></table></figure><h3 id="5-测试最终结果"><a href="#5-测试最终结果" class="headerlink" title="5. 测试最终结果"></a>5. 测试最终结果</h3><p>在浏览器中打开 <strong>index.html</strong>，并按照与上一部分相同的操作，使用对应于 3 个命令的 3 个按钮收集数据。收集数据时，记得 <strong>按住</strong> 每个按钮 3-4 秒。</p><p>收集样本后，按 <strong>训练</strong> 按钮。这将开始训练模型，建议模型的准确率超过 90%。如果模型性能不佳，尝试收集更多数据。</p><p>训练完成后，按 <strong>Listen</strong> 按钮，使用麦克风进行声音输入来查看滑块的变化！</p><p>![结果](<a href="https://oss.jzxer.cn/blog/%E6%88%AA%E5%B1%8F2024-11-29">https://oss.jzxer.cn/blog/截屏2024-11-29</a> 10.06.59.png)</p><h2 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h2><p>自己动手尝试过训练模型了之后，就觉得这种关于神经网络学习的东西确实是博大精深。虽然自己还只是入门，已经感受到那种思维的严谨和神奇了。</p><p>接下来就是尝试着把这种东西通过实战用起来了。</p><p><a href="https://blog.jzxer.cn/">dev的艺术空间</a></p><p>参考资料：<a href="https://codelabs.developers.google.com/?hl=zh-cn&category=aiandmachinelearning&text=tensorflowjs">tensorflowjs</a></p>]]></content>
    
    
    <summary type="html">玩了单片机有一段时间了，预期自己的AI智能管家的语音通话功能还相差万里，所以想尝试着看看能不能从现有的技术方案找一个合适的，我对这个模型的预期很简单</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="tensorflow" scheme="https://blog.jzxer.cn/tags/tensorflow/"/>
    
    <category term="语音识别" scheme="https://blog.jzxer.cn/tags/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB/"/>
    
  </entry>
  
  <entry>
    <title>esp32-cam 接入tensorflowjs 实现人脸特征识别</title>
    <link href="https://blog.jzxer.cn/20241125/20241125-esp32-cam-with-tensorflow/"/>
    <id>https://blog.jzxer.cn/20241125/20241125-esp32-cam-with-tensorflow/</id>
    <published>2024-11-25T09:10:34.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h2><p>之前写过一篇关于 esp32-cam 接入 opencv 的文章，但是因为 Python 毕竟不是我的主修，而且如果想在 esp32-cam 中移植一个 Python 的模型也不现实，光是本地加载的人脸训练模型就超过了10m。</p><p>但是每次启动摄像头想使用人脸识别服务的时候必须要本地电脑启动 opencv 又很繁琐，操作起来也不流畅。所以我在思考有没有一个更加便捷的方案能够全部一体化，我只需要开机就能实现人脸识别。</p><p>功夫不负有心人，正巧前段时间接触了 tensorflowjs 这玩意儿就特别适合做这件事儿。并且是用我熟悉的 JavaScript 编写，对我这么一个老前端人，非常友好。</p><p>话不多说，开搞。</p><h2 id="前期准备"><a href="#前期准备" class="headerlink" title="前期准备"></a>前期准备</h2><p>首先需要熟悉 platformIO 和 arduino 的基本开发（js 那就不用说了…不会可以不看了）。最好再去了解一下什么是 <strong>tensorflow</strong>。并且了解什么时候需要用到它。</p><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><h3 id="1-cam-在使用-micro-口连接无法烧录"><a href="#1-cam-在使用-micro-口连接无法烧录" class="headerlink" title="1. cam 在使用 micro 口连接无法烧录"></a>1. cam 在使用 micro 口连接无法烧录</h3><p>不要直接用 micro 底座来烧录程序，会有莫名其妙的问题，建议用串口烧录，再用底座辅助供电比较合适。</p>]]></content>
    
    
    <summary type="html">之前写过一篇关于 esp32-cam 接入 opencv 的文章，但是因为 Python 毕竟不是我的主修，而且如果想在 esp32-cam 中移植一个 Python 的模型也不现实，光是本地加载的人脸训练模型就超过了10m。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="tensorflow" scheme="https://blog.jzxer.cn/tags/tensorflow/"/>
    
    <category term="esp32" scheme="https://blog.jzxer.cn/tags/esp32/"/>
    
    <category term="人脸识别" scheme="https://blog.jzxer.cn/tags/%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB/"/>
    
  </entry>
  
  <entry>
    <title>使用 esp32-cam 搭配 opencv 实现人脸识别</title>
    <link href="https://blog.jzxer.cn/20241121/20241121_esp32_cam_with_face/"/>
    <id>https://blog.jzxer.cn/20241121/20241121_esp32_cam_with_face/</id>
    <published>2024-11-21T03:44:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前提摘要"><a href="#前提摘要" class="headerlink" title="前提摘要"></a>前提摘要</h2><p>之前介绍了如何通过 esp32-cam 实现一个家用监控。但是光有监控没有智能识别总少了点味道，所以本文主要是探索人脸识别 + 物体识别的功能。</p><p>原理很简单，这里需要一个上位机和一个下位机。上位机用来算法处理接受到的数据，下位机用来接<strong>收处</strong>理完之后的内容。并通过构建一个可视化窗口展示结果。</p><p><img src="https://oss.jzxer.cn/blog/image-20241123191409523.png" alt="思维导图"></p><p>这里的上位机就是<strong>香橙派</strong>，下位机就是 <strong>esp32</strong>。我们可以理解成esp32 拍摄的数据就是没加字幕的电影，而 orangePI 就是加字幕工具，加好字幕之后呈现在我们面前的就是所谓的<strong>熟肉</strong>。</p><p>本文主要的难点就是捕获esp32 的视频流数据，然后对原始视频流进行二次加工的过程。</p><h2 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h2><ol><li>esp32-cam x 1</li><li>香橙派 zero3 x1 （这个按需求来，只要是服务器就行）</li><li>杜邦线若干</li></ol><h2 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h2><p>在这个案例中需要注意的是我们需要了解一些关于 python 相关的知识。环境部分为 <strong>esp32-cam</strong> 部分和 <strong>opencv</strong> 部分。编辑器都是统一用的 vscode（我就是它的脑残粉）</p><h3 id="1-esp32-cam-部分"><a href="#1-esp32-cam-部分" class="headerlink" title="1. esp32-cam 部分"></a>1. esp32-cam 部分</h3><p>这个可以参考我之前的<a href="/20241108/20241117_esp32_cam/">案例</a>，其它的基本没有什么大的改动，照抄就行。</p><h3 id="2-opencv部分"><a href="#2-opencv部分" class="headerlink" title="2. opencv部分"></a>2. opencv部分</h3><p>重点是这个部分，我们需要安装一个 python 环境来支持这个功能的使用。安装 python 直接上官网下载自己需要的平台，下载最新的就好（3.0 版本的）。然后通过控制台输入以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">python --version</span><br><span class="line">// or python3 --version</span><br></pre></td></tr></table></figure><p>如果输出版本号就说明安装成功了。</p><p>接下来就安装 opencv 的依赖包了。输入以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip install opencv-python requests</span><br><span class="line">// or pip3 install opencv-python requests</span><br></pre></td></tr></table></figure><p>这里安装接下来需要用到的两个依赖包。</p><p>然后在当前摄像头项目根目录下新建一个文件，代码如下：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">url = <span class="string">&#x27;http://192.168.xx.xx:81/stream&#x27;</span>   <span class="comment">// 这里填入当前 esp32 访问的 web 地址即可</span></span><br><span class="line">cap = cv2.<span class="title class_">VideoCapture</span>(url)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> not cap.<span class="title function_">isOpened</span>():</span><br><span class="line">    <span class="title function_">print</span>(<span class="string">&quot;Failed to open video stream!&quot;</span>)</span><br><span class="line">    <span class="title function_">exit</span>()</span><br><span class="line"></span><br><span class="line">#初始化人脸识别器（默认的人脸haar级联）</span><br><span class="line">prototxt_path = <span class="string">&quot;used/deploy.prototxt.txt&quot;</span>     <span class="comment">// 这个文件可以去 opencv 官方网站去下载</span></span><br><span class="line">model_path = <span class="string">&quot;used/res10_300x300_ssd_iter_140000.caffemodel&quot;</span>   <span class="comment">// 这个文件可以去 opencv 官方网站去下载</span></span><br><span class="line">model = cv2.<span class="property">dnn</span>.<span class="title function_">readNetFromCaffe</span>(prototxt_path, model_path)</span><br><span class="line">flash = <span class="number">0</span></span><br><span class="line">frame = <span class="number">9</span></span><br><span class="line">requests.<span class="title function_">get</span>(<span class="string">&quot;http://192.168.xx.xx/flash?var=led_intensity&amp;val=&#123;&#125;&quot;</span>.<span class="title function_">format</span>(flash))</span><br><span class="line"></span><br><span class="line"># 设置视频编码器和输出文件</span><br><span class="line">def <span class="title function_">face_select</span>(image): </span><br><span class="line">    h, w = image.<span class="property">shape</span>[:<span class="number">2</span>]</span><br><span class="line">    blob = cv2.<span class="property">dnn</span>.<span class="title function_">blobFromImage</span>(image, <span class="number">1.0</span>, (<span class="number">300</span>, <span class="number">300</span>))</span><br><span class="line">    model.<span class="title function_">setInput</span>(blob)</span><br><span class="line">    output = np.<span class="title function_">squeeze</span>(model.<span class="title function_">forward</span>())</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="title function_">range</span>(<span class="number">0</span>, output.<span class="property">shape</span>[<span class="number">0</span>]):</span><br><span class="line">        confidence = output[i, <span class="number">2</span>]</span><br><span class="line">        <span class="keyword">if</span> confidence &gt; <span class="number">0.9</span>:</span><br><span class="line">            box = output[i, <span class="number">3</span>:<span class="number">7</span>] * np.<span class="title function_">array</span>([w, h, w, h])</span><br><span class="line">            start_x, start_y, end_x, end_y = box.<span class="title function_">astype</span>(np.<span class="property">int64</span>)</span><br><span class="line">            cv2.<span class="title function_">rectangle</span>(image, (start_x, start_y), (end_x, end_y), color=(<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>), thickness=<span class="number">2</span>)</span><br><span class="line">            </span><br><span class="line">            cv2.<span class="title function_">putText</span>(image, f<span class="string">&quot;&#123;confidence*100:.2f&#125;%&quot;</span>, (start_x, start_y-<span class="number">5</span>), cv2.<span class="property">FONT_HERSHEY_SIMPLEX</span>, <span class="number">1</span>, (<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>), <span class="number">2</span>)</span><br><span class="line">            cv2.<span class="title function_">putText</span>(image, f<span class="string">&quot;&#123;confidence*100:.2f&#125;%&quot;</span>, (start_x, start_y-<span class="number">5</span>), cv2.<span class="property">FONT_HERSHEY_SIMPLEX</span>, <span class="number">1</span>, (<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>), <span class="number">2</span>)</span><br><span class="line">    cv2.<span class="title function_">putText</span>(image, f<span class="string">&quot;flash:&#123;flash:d&#125;&quot;</span>, (<span class="number">5</span>, <span class="number">30</span>), cv2.<span class="property">FONT_HERSHEY_SIMPLEX</span>, <span class="number">1</span>, (<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>), <span class="number">2</span>)</span><br><span class="line">    cv2.<span class="title function_">putText</span>(image, f<span class="string">&quot;frame:&#123;frame:d&#125;&quot;</span>, (<span class="number">5</span>, <span class="number">60</span>), cv2.<span class="property">FONT_HERSHEY_SIMPLEX</span>, <span class="number">1</span>, (<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>), <span class="number">2</span>)</span><br><span class="line"> </span><br><span class="line">    cv2.<span class="title function_">imshow</span>(<span class="string">&#x27;image&#x27;</span>,image)</span><br><span class="line"> </span><br><span class="line"><span class="keyword">while</span> <span class="title class_">True</span>:</span><br><span class="line">    _, image = cap.<span class="title function_">read</span>()   </span><br><span class="line">    <span class="title function_">face_select</span>(image)</span><br><span class="line">    key=<span class="title function_">chr</span>(cv2.<span class="title function_">waitKey</span>(<span class="number">1</span>) &amp; <span class="number">0xFF</span>)</span><br><span class="line">    # 按下 <span class="string">&#x27;q&#x27;</span> 键退出循环</span><br><span class="line">    <span class="keyword">if</span> key == <span class="string">&#x27;q&#x27;</span>:</span><br><span class="line">        cv2.<span class="title function_">destroyAllWindows</span>()</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">cap.<span class="title function_">release</span>()</span><br></pre></td></tr></table></figure><p>很简单的操作。</p><h2 id="拓展"><a href="#拓展" class="headerlink" title="拓展"></a>拓展</h2><p>对于之前 esp32-cam 的代码由于使用的是示例代码没有什么好讲的。填好 wifi 信息，然后通过控制台打印的 ip 地址访问即可。</p><p>但是示例代码里面的几个 api 我们可以了解一下，比如 &#x2F;status 这个 api，通过这个 api 我们可以获取在示例代码的环境下可以修改的参数。以下是可以修改的所有参数。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">&quot;0xd3&quot;: 8,</span><br><span class="line">&quot;0x111&quot;: 0,</span><br><span class="line">&quot;0x132&quot;: 9,</span><br><span class="line">&quot;xclk&quot;: 20,</span><br><span class="line">&quot;pixformat&quot;: 4,</span><br><span class="line">&quot;framesize&quot;: 8,</span><br><span class="line">&quot;quality&quot;: 10,</span><br><span class="line">&quot;brightness&quot;: 0,</span><br><span class="line">&quot;contrast&quot;: 0,</span><br><span class="line">&quot;saturation&quot;: 0,</span><br><span class="line">&quot;sharpness&quot;: 0,</span><br><span class="line">&quot;special_effect&quot;: 0,</span><br><span class="line">&quot;wb_mode&quot;: 0,</span><br><span class="line">&quot;awb&quot;: 1,</span><br><span class="line">&quot;awb_gain&quot;: 1,</span><br><span class="line">&quot;aec&quot;: 1,</span><br><span class="line">&quot;aec2&quot;: 0,</span><br><span class="line">&quot;ae_level&quot;: 0,</span><br><span class="line">&quot;aec_value&quot;: 168,</span><br><span class="line">&quot;agc&quot;: 1,</span><br><span class="line">&quot;agc_gain&quot;: 0,</span><br><span class="line">&quot;gainceiling&quot;: 0,</span><br><span class="line">&quot;bpc&quot;: 0,</span><br><span class="line">&quot;wpc&quot;: 1,</span><br><span class="line">&quot;raw_gma&quot;: 1,</span><br><span class="line">&quot;lenc&quot;: 1,</span><br><span class="line">&quot;hmirror&quot;: 0,</span><br><span class="line">&quot;dcw&quot;: 1,</span><br><span class="line">&quot;colorbar&quot;: 0,</span><br><span class="line">&quot;led_intensity&quot;: 0</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>里面的所有参数都可以通过调用 post 请求 <strong>&#x2F;control?var&#x3D;xx&amp;val&#x3D;xx</strong> 这样的形式来修改回调画面的显示情况。例如：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">control?var=hmirror&amp;val=<span class="number">1</span></span><br></pre></td></tr></table></figure><p>快点动手试试吧。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>总体使用下来，发现 opencv 识别的人脸模型不够精确，并且对像素要求比较高，也可能是我的模型不够精准。所以后面我又重新找了 tensorflow 的方案替代。这个就留着下篇在分享吧。</p><p><a href="https://blog.jzxer.cn/">dev 的艺术空间</a></p>]]></content>
    
    
    <summary type="html">通过 opencv 识别 esp32-cam 的图片流，返回人脸识别数据</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="人脸识别" scheme="https://blog.jzxer.cn/tags/%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB/"/>
    
    <category term="python" scheme="https://blog.jzxer.cn/tags/python/"/>
    
    <category term="opencv" scheme="https://blog.jzxer.cn/tags/opencv/"/>
    
  </entry>
  
  <entry>
    <title>《笑傲江湖》引发的深入思考</title>
    <link href="https://blog.jzxer.cn/20241119/20241119_linqingxia_movie/"/>
    <id>https://blog.jzxer.cn/20241119/20241119_linqingxia_movie/</id>
    <published>2024-11-19T14:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h2><p>“有人的地方就有江湖。”</p><p>“人在江湖，身不由己。“</p><p>这是一部金庸的作品，看完之后我脑海里有很多的联想：东方不败的中性美、令狐冲的放荡不羁、任盈盈的小鸟依人。狡诈的任我行。</p><h2 id="观东方不败"><a href="#观东方不败" class="headerlink" title="观东方不败"></a>观东方不败</h2><p>这都是一个人笔下塑造的一个个鲜活的形象。不知道为什么，我无法讨厌东方不败。某些程度上我还想成为令狐冲。这种人物之间的关系和影片人物的塑造我能称之为真正的艺术。一种即使是断背之恋也能让人接受并且感觉美好的艺术。我爱你，你爱他、她爱他、他爱她。各种曲折的角色故事。</p><p>它让我有一种如果反派是这样的话，那也是可以原谅。如果男人真的会美到如此不可方物，我也可以爱上的感觉。</p><p>那种感觉真的很美好，是不是说很多的断背之恋也和剧中的令狐冲和东方不败一样，是一种遵从内心世界追求的一种形式。</p><p><img src="https://oss.jzxer.cn/blog/maxresdefault.jpg" alt="写尽江湖的恩怨情仇，终究难逃宿命"></p><h2 id="成为令狐冲"><a href="#成为令狐冲" class="headerlink" title="成为令狐冲"></a>成为令狐冲</h2><p>令狐冲的性格很洒脱，爱喝酒，喝上头了还会耍剑。只想远离江湖恩怨，平静且安宁的过好这一生。</p><p>这是一种真的追求自我精神实现的一种表现，如果在古代，我应该也会去成为这样的人。</p><p>人格魅力的绽放永远不是随波逐流，是要有自己鲜明的特点，然后放大它吸引欣赏自己的人。</p><p><strong>一生如此，知音难求。若无知音，路仍要走</strong></p><h2 id="唯我独尊任我行"><a href="#唯我独尊任我行" class="headerlink" title="唯我独尊任我行"></a>唯我独尊任我行</h2><p>任我行作为日月神教的教主，确实有非常手段。野心也很大，但是野心的背后一定是生灵涂炭。虽然这是自然法则。但是我也很反感这样的人。</p><p>如果生在这个时代，任我行在任何领域也会是一个很牛逼的人。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>在影片观看结束完，我最深思的地方就是成为令狐冲这件事儿，归隐田园，从此不过问江湖之事。这不就像是我现在做的事儿？</p><p>但是仔细的问问我的内心：<strong>是不是仍然在这个世俗的法则中游离？是不是还记得曾经的初心？</strong></p><p>人生是一辈子的事情，我要过好一个怎么样的人生？我想要花一辈子做什么样的事情？我真的在做吗？真的在努力吗？这都是围绕在心头的疑问，我都要一个个靠自己找到答案。</p><p>这个世界太浮躁了，每个人都没办法沉下心来做事情。每个人都在为了利益而挣扎。也许大多数人到死的那一刻都不会明白：<strong>我这一生究竟是为啥而活着？</strong> 我不想成为这样的人，所以趁自己还年轻，还能做事儿，去做，去尝试，去经历。</p><p>沉浸在孤独感中，每个人生而孤独，孤零零的来到这个世界，也注定孤零零的离开。享受孤独，是成就自己的开始。</p><p>— dev</p><p><a href="https://blog.jzxer.cn/">dev 的艺术空间</a></p>]]></content>
    
    
    <summary type="html">沉浸在孤独感中，每个人生而孤独，孤零零的来到这个世界，也注定孤零零的离开。享受孤独，是成就自己的开始。</summary>
    
    
    
    <category term="观影笔记" scheme="https://blog.jzxer.cn/categories/%E8%A7%82%E5%BD%B1%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="武侠片" scheme="https://blog.jzxer.cn/tags/%E6%AD%A6%E4%BE%A0%E7%89%87/"/>
    
    <category term="金庸" scheme="https://blog.jzxer.cn/tags/%E9%87%91%E5%BA%B8/"/>
    
  </entry>
  
  <entry>
    <title>用 L293D 电机驱动板来做一个小车</title>
    <link href="https://blog.jzxer.cn/20241110/20241110_arduino_with_%20L293D/"/>
    <id>https://blog.jzxer.cn/20241110/20241110_arduino_with_%20L293D/</id>
    <published>2024-11-10T02:10:34.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>在使用 Arduino 开发的过程中，我们会碰到使用直流电机的场景，但是直流电机一般不是开发板直接驱动的，需要一个辅助开发板来帮助运作，所以今天这篇文章就是介绍基于 L293D 的驱动板。</p><blockquote><p>老样子，本文案例还是基于 platformIO + vscode 的开发模式，如果还不太了解的可以看之前的文章。</p></blockquote><h2 id="前期准备"><a href="#前期准备" class="headerlink" title="前期准备"></a>前期准备</h2><ol><li>Arduino uno X 1</li><li>L2930D 驱动板 X 1</li><li>马达 x 1（最多支持 4 个）</li></ol><h2 id="板子原理"><a href="#板子原理" class="headerlink" title="板子原理"></a>板子原理</h2><p>按照板子上的接口来看，这个驱动可以同时驱动 4 个直流电机（或者 2 个步进电机）。还可以驱动两个舵机。</p><p><img src="https://oss.jzxer.cn/blog/498afed7862fd946b8d6420eea94ef2c.png" alt="l293d 支持"></p><p><img src="https://oss.jzxer.cn/blog/f8a76016b71765fba44076546b864d25.jpeg" alt="l293d电机驱动板芯片组"></p><p>主要起作用的就是中间的三个小方块，#1 和 #2 是电机驱动模块，74HC595是整个驱动板的核心驱动。</p><h3 id="供电模块"><a href="#供电模块" class="headerlink" title="供电模块"></a>供电模块</h3><p>板子支持Arduino 供电，也支持外置电源供电，外置电源的供电电压在 4.5 - 25V 之间。这里需要特别注意的是，如果外接电源超过了 12v，一定要断开 Power Supply，不然会烧毁。低于这个电压则无所谓。</p><blockquote><p>外接电源超过 12V，断开 Power supply。</p></blockquote><p><img src="https://oss.jzxer.cn/blog/80442549f105bae06a3bfc2b0e121a2d.jpeg" alt="L293D电机驱动屏蔽电源"></p><h3 id="电机驱动接口"><a href="#电机驱动接口" class="headerlink" title="电机驱动接口"></a>电机驱动接口</h3><p>如下图所示的就是四个直流电机的接口，在直流电机的模式下，介于两个电机中间的GND接口不需要连接。</p><p>对于直流和步进电机控制，扩展板使用引脚 <strong>D3、D4、D5、D6、D7、D8、D11 和 D12。</strong></p><p>D9和D10用于控制伺服电机。D10 连接到舵机 1，而 D9 连接到舵机 2。</p><p><img src="https://oss.jzxer.cn/blog/83b6ace33f17bd04b89fd815440481e5.jpeg" alt="l293d 电机驱动器屏蔽直流电机连接"></p><p>下图就是两个步进电机的接口。</p><p><img src="https://oss.jzxer.cn/blog/26f1b7e7027e023f9eb5018eb6255d1c.jpeg" alt="l293d电机驱动器屏蔽步进电机连接"></p><p>下图是两个舵机的接口，注意使用这个功能的时候，只能使用像 SG90 这样的小型舵机。太大的功率带不动。</p><p>当然这两个接口如果不接舵机也可以自己自定义去连接一些其它的外设，比如我就是一个拿来接红外线接收器，另一个来接超声波避障。</p><p><img src="https://oss.jzxer.cn/blog/d96090e4c61f0c6060e03dc44d753ce7.jpeg" alt="l293d电机驱动器屏蔽伺服电机连接"></p><h3 id="其它接口"><a href="#其它接口" class="headerlink" title="其它接口"></a>其它接口</h3><p>下图所示的A0-A5接口对应的是原Arduino uno开发板上的模拟引脚。另外开发板上也额外提供了6组 5V输出口，这个就看自己的需要了，当然外设接的多，电就消耗的更多。</p><p>还有 D0、D1、D2、D13 这几个引脚在这个板子上也是不用的，如果需要的话也可以利用起来。</p><blockquote><p>目前这些额外的引脚比较麻烦的点就是，需要额外的焊接。</p></blockquote><p><img src="https://oss.jzxer.cn/blog/76aeb300b6fce0483f76a6c58f9d6142.jpeg" alt="l293d 电机驱动器屏蔽复位 LED 电阻阵列原型"></p><h2 id="代码参考"><a href="#代码参考" class="headerlink" title="代码参考"></a>代码参考</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;IRremote.hpp&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;AFMotor.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="function">AF_DCMotor <span class="title">motorRight</span><span class="params">(<span class="number">3</span>)</span></span>;</span><br><span class="line"><span class="function">AF_DCMotor <span class="title">motorLeft</span><span class="params">(<span class="number">4</span>)</span></span>;</span><br><span class="line"><span class="meta">#<span class="keyword">define</span> IR_RECEIVE_PIN 10</span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> ledPin = A5;</span><br><span class="line"><span class="type">int</span> LED_CODE = <span class="number">12</span>;</span><br><span class="line"><span class="type">bool</span> ledState = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> currentDirection = FORWARD;   <span class="comment">// 记录一个当前全局的方向</span></span><br><span class="line"><span class="type">int</span> speed = <span class="number">0</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> LEFT = <span class="number">8</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> RIGHT = <span class="number">90</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> STOP = <span class="number">28</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> speedStep = <span class="number">50</span>; <span class="comment">// 每次增加的速度</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> maxSpeed = <span class="number">250</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">handleCar</span><span class="params">(<span class="type">int</span> code)</span> </span>&#123;</span><br><span class="line">    <span class="comment">// 当当前点击的按钮与当前方向不一致时，停止当前方向的转动</span></span><br><span class="line">    <span class="keyword">if</span> (currentDirection != code) &#123;</span><br><span class="line">        motorLeft.<span class="built_in">run</span>(RELEASE);   <span class="comment">// 这四条语句作用是使用关键字RELEASE作为run函数的参数。</span></span><br><span class="line">        motorRight.<span class="built_in">run</span>(RELEASE);   <span class="comment">// 在这种情况下，AFMotor扩展板将会停止为电机旋转提供动力。</span></span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (speed &lt; maxSpeed) &#123;</span><br><span class="line">            speed += speedStep; </span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">switch</span> (code)</span><br><span class="line">    &#123;</span><br><span class="line">    <span class="keyword">case</span> FORWARD:</span><br><span class="line">        currentDirection = FORWARD;</span><br><span class="line">        motorLeft.<span class="built_in">run</span>(FORWARD);</span><br><span class="line">        motorRight.<span class="built_in">run</span>(FORWARD);</span><br><span class="line">        motorLeft.<span class="built_in">setSpeed</span>(speed);</span><br><span class="line">        motorRight.<span class="built_in">setSpeed</span>(speed);    </span><br><span class="line">        <span class="built_in">delay</span>(<span class="number">10</span>);                </span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> BACKWARD:</span><br><span class="line">        currentDirection = BACKWARD;</span><br><span class="line">        motorLeft.<span class="built_in">run</span>(BACKWARD); /</span><br><span class="line">        motorRight.<span class="built_in">run</span>(BACKWARD); </span><br><span class="line">        motorLeft.<span class="built_in">setSpeed</span>(speed);</span><br><span class="line">        motorRight.<span class="built_in">setSpeed</span>(speed);    </span><br><span class="line">        <span class="built_in">delay</span>(<span class="number">10</span>);     </span><br><span class="line">    <span class="keyword">case</span> LEFT:</span><br><span class="line">        currentDirection = LEFT;</span><br><span class="line">        motorRight.<span class="built_in">setSpeed</span>(speed);</span><br><span class="line">        motorLeft.<span class="built_in">setSpeed</span>(speed);</span><br><span class="line">        motorLeft.<span class="built_in">run</span>(FORWARD);</span><br><span class="line">        motorRight.<span class="built_in">run</span>(BACKWARD);</span><br><span class="line">    <span class="keyword">case</span> RIGHT:</span><br><span class="line">        currentDirection = RIGHT;</span><br><span class="line">        motorRight.<span class="built_in">setSpeed</span>(speed);</span><br><span class="line">        motorLeft.<span class="built_in">setSpeed</span>(speed);</span><br><span class="line">        motorLeft.<span class="built_in">run</span>(BACKWARD);</span><br><span class="line">        motorRight.<span class="built_in">run</span>(FORWARD);</span><br><span class="line">        <span class="keyword">break</span>; </span><br><span class="line">    <span class="keyword">case</span> STOP:</span><br><span class="line">        currentDirection = STOP;</span><br><span class="line">        motorLeft.<span class="built_in">run</span>(RELEASE);</span><br><span class="line">        motorRight.<span class="built_in">run</span>(RELEASE);</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">default</span>:</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">String rx_data;</span><br><span class="line"><span class="comment">//  串口中断函数</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Serial_callback</span><span class="params">()</span> </span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (!Serial.<span class="built_in">available</span>()) &#123;</span><br><span class="line">        rx_data = <span class="string">&quot;&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Serial.<span class="built_in">println</span>(Serial.<span class="built_in">available</span>());</span><br><span class="line">    <span class="keyword">while</span> (Serial.<span class="built_in">available</span>())</span><br><span class="line">    &#123;</span><br><span class="line">        rx_data += <span class="built_in">char</span>(Serial.<span class="built_in">read</span>());</span><br><span class="line">        <span class="built_in">delay</span>(<span class="number">5</span>); <span class="comment">//这里不能去掉，要给串口处理数据的时间</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (rx_data != <span class="string">&quot;&quot;</span>) </span><br><span class="line">    &#123;</span><br><span class="line">        Serial.<span class="built_in">println</span>(rx_data);</span><br><span class="line">        <span class="keyword">if</span> (rx_data == <span class="string">&quot;code=8&quot;</span>) &#123;</span><br><span class="line">            <span class="built_in">digitalWrite</span>(ledPin, LOW); <span class="comment">// 设置LED的状态</span></span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (rx_data == <span class="string">&quot;code=7&quot;</span>) &#123;</span><br><span class="line">            <span class="built_in">digitalWrite</span>(ledPin, HIGH); <span class="comment">// 设置LED的状态</span></span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (rx_data == <span class="string">&quot;code=24&quot;</span>) &#123;</span><br><span class="line">            <span class="built_in">handleCar</span>(FORWARD);</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (rx_data == <span class="string">&quot;code=82&quot;</span>) &#123;</span><br><span class="line">            <span class="built_in">handleCar</span>(BACKWARD);</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (rx_data == <span class="string">&quot;code=28&quot;</span>) &#123;</span><br><span class="line">            <span class="built_in">handleCar</span>(STOP);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    Serial.<span class="built_in">begin</span>(<span class="number">9600</span>); </span><br><span class="line">    <span class="built_in">pinMode</span>(ledPin, OUTPUT);</span><br><span class="line">    <span class="comment">// 小车初始化</span></span><br><span class="line">    motorRight.<span class="built_in">setSpeed</span>(speed);</span><br><span class="line">    motorLeft.<span class="built_in">setSpeed</span>(speed);</span><br><span class="line">    motorRight.<span class="built_in">run</span>(RELEASE);</span><br><span class="line">    motorLeft.<span class="built_in">run</span>(RELEASE);</span><br><span class="line">    IrReceiver.<span class="built_in">begin</span>(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (IrReceiver.<span class="built_in">decode</span>()) &#123;</span><br><span class="line">        <span class="keyword">if</span> (IrReceiver.decodedIRData.protocol == UNKNOWN) &#123;</span><br><span class="line">            IrReceiver.<span class="built_in">printIRResultRawFormatted</span>(&amp;Serial, <span class="literal">true</span>);</span><br><span class="line">            IrReceiver.<span class="built_in">resume</span>();</span><br><span class="line">        &#125; </span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">switch</span> (IrReceiver.decodedIRData.command) &#123;</span><br><span class="line">            <span class="keyword">case</span> <span class="number">24</span>:</span><br><span class="line">                <span class="built_in">handleCar</span>(FORWARD);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> <span class="number">82</span>:</span><br><span class="line">                <span class="built_in">handleCar</span>(BACKWARD);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> <span class="number">8</span>:</span><br><span class="line">                <span class="built_in">handleCar</span>(LEFT);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> <span class="number">90</span>:</span><br><span class="line">                <span class="built_in">handleCar</span>(RIGHT);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> <span class="number">28</span>:</span><br><span class="line">                <span class="built_in">handleCar</span>(STOP);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> <span class="number">12</span>:</span><br><span class="line">                ledState = !ledState; <span class="comment">// 切换LED的状态</span></span><br><span class="line">                <span class="built_in">digitalWrite</span>(ledPin, ledState ? HIGH : LOW); <span class="comment">// 设置LED的状态</span></span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">default</span>:</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            IrReceiver.<span class="built_in">resume</span>();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">Serial_callback</span>();</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">100</span>); <span class="comment">// 延迟一段时间，以避免频繁触发</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>整体来说这个驱动板还是挺简单使用的，但是主要的问题是由于这个板子是外置的，在使用的时候会覆盖原来开发板的所有接口，导致有部分接口直接废弃了，但是又想加入一些新功能的场景就很操蛋。</p><p>比如我想加个红外线传感器，再加个 esp8266 开发板连接 wifi 实现无线控制，这种情况串口接口就不太够用了。属实有点操蛋。</p><p>另外由于这个板子可以同时驱动 4 个马达，但是我的小车是双轮的，这就导致我另外两个端口一直用不上，也很浪费，所以建议如果和我一样使用的是双马达的话，还是建议用另外一款驱动板 L298N，最大程度的利用端口。</p><p><img src="https://oss.jzxer.cn/blog/SouthEast.png" alt="img"></p><h2 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h2><p><a href="https://blog.jzxer.cn/">dev 的艺术空间</a></p>]]></content>
    
    
    <summary type="html">在使用 Arduino 开发的过程中，我们会碰到使用直流电机的场景，但是直流电机一般不是开发板直接驱动的，需要一个辅助开发板来帮助运作，所以今天这篇文章就是介绍基于 L293D 的驱动板。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>用 esp32-cam 实现在线摄像头</title>
    <link href="https://blog.jzxer.cn/20241108/20241117_esp32_cam/"/>
    <id>https://blog.jzxer.cn/20241108/20241117_esp32_cam/</id>
    <published>2024-11-08T01:40:34.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>Esp32-cam 是一款是由安信可科技开发的一款小尺寸摄像头模块。它基于ESP32-WROVER系列，搭载了ESP32-D0WD处理器。这款模块不仅具有 <strong>Wi-Fi</strong> 和蓝牙功能，还提供了摄像头接口。</p><p><img src="https://oss.jzxer.cn/blog/0a3122fc99d54013b18f817d55af51f7.jpeg" alt="Esp32-cam"></p><ul><li><strong>处理器</strong>：ESP32-CAM由ESP32-D0WD提供动力，这是一款双核处理器，最大时钟速度为240 MHz。</li><li><strong>内存</strong>：它内置了520 KB的SRAM，并支持外部microSD卡以获取额外的存储空间。</li><li><strong>摄像头接口</strong>：该模块通常使用OV2640摄像头，但足够灵活以支持其他类型的摄像头。</li><li><strong>连接性</strong>：具有内置的Wi-Fi和蓝牙，可轻松集成到物联网生态系统中。</li><li><strong>GPIO引脚</strong>：具有多个GPIO引脚，用于连接外围设备和传感器。</li><li><strong>电源管理</strong>：支持多种休眠模式。</li><li><strong>其他特性</strong>：支持STA&#x2F;AP&#x2F;STA+AP工作模式，支持Smart Config&#x2F;AirKiss一键配网</li></ul><h2 id="前期准备"><a href="#前期准备" class="headerlink" title="前期准备"></a>前期准备</h2><ol><li>Esp32-cam x 1</li><li>杜邦线若干</li><li>usb 转 ttl x 1</li></ol><h2 id="代码参考"><a href="#代码参考" class="headerlink" title="代码参考"></a>代码参考</h2><h3 id="1-配置环境"><a href="#1-配置环境" class="headerlink" title="1. 配置环境"></a>1. 配置环境</h3><p>按照下图选择开发板驱动和开发框架，我这里选的是 Arduino。</p><p>![截屏2024-11-17 22.13.34](<a href="https://oss.jzxer.cn/blog/%E6%88%AA%E5%B1%8F2024-11-17">https://oss.jzxer.cn/blog/截屏2024-11-17</a> 22.13.34.png)</p><p>如果是初次下载这个时间可能比较漫长，耐心等一下。下载成功以后把 platformIO.ini 配置文件添加以下参数：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[env:esp32cam]</span><br><span class="line">platform = espressif32</span><br><span class="line">board = esp32cam</span><br><span class="line">framework = arduino</span><br><span class="line">monitor_speed = <span class="number">115200</span></span><br></pre></td></tr></table></figure><h3 id="2-写入代码"><a href="#2-写入代码" class="headerlink" title="2. 写入代码"></a>2. 写入代码</h3><p>进入 <a href="https://github.com/espressif/arduino-esp32">arduino-esp32</a> 官网把 camerawebserver 的那个案例代码拷贝到 src 目录下。修改 main.cpp 文件下的 wifi 账号密码为自己家的就可以了，非常简单。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">.........</span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;camera_pins.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// ===========================</span></span><br><span class="line"><span class="comment">// Enter your WiFi credentials</span></span><br><span class="line"><span class="comment">// 大概在这个位置</span></span><br><span class="line"><span class="comment">// ===========================</span></span><br><span class="line"><span class="type">const</span> <span class="type">char</span> *ssid = <span class="string">&quot;Xiaomi_F2ED&quot;</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">char</span> *password = <span class="string">&quot;123456&quot;</span>;</span><br><span class="line">.......</span><br></pre></td></tr></table></figure><h3 id="3-上传代码"><a href="#3-上传代码" class="headerlink" title="3. 上传代码"></a>3. 上传代码</h3><p>正常按照流程编译上传代码到开发板即可，记得上传的时候要短接 IO0 和GND。</p><h2 id="实机演示"><a href="#实机演示" class="headerlink" title="实机演示"></a>实机演示</h2><p>演示的时候一定要记得先把IO0 和 GND 先断开连接，然后再按一下键盘上的reset 按钮。不出意外等待一会儿，控制台会提示wifi连接成功。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="title class_">WiFi</span> connected</span><br><span class="line"><span class="title class_">Camera</span> <span class="title class_">Ready</span>! <span class="title class_">Use</span> <span class="string">&#x27;http://192.168.xx.xx&#x27;</span> to connect</span><br></pre></td></tr></table></figure><p><img src="https://oss.jzxer.cn/blog/Monica_2024-11-17_22-22-53_%E5%89%AF%E6%9C%AC2.png" alt="web 界面"></p><h2 id="问题汇总"><a href="#问题汇总" class="headerlink" title="问题汇总"></a>问题汇总</h2><h3 id="1-error-‘ledcattach’-was-not-declared-in-this-scope"><a href="#1-error-‘ledcattach’-was-not-declared-in-this-scope" class="headerlink" title="1. error: ‘ledcattach’ was not declared in this scope"></a>1. error: ‘ledcattach’ was not declared in this scope</h3><p>在复用官网的源码的时候会报这个错误，这个时候我判断其实是因为 <strong>platformIO</strong> 加载的 <strong>esp32-cam</strong> 的驱动还是老版本的，而老版本只支持 <strong>ledcAttachPin</strong> 这个 API，所以我的解决方案就是把 api 给改掉</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">ledcAttach</span>(pin, <span class="number">5000</span>, <span class="number">8</span>);</span><br><span class="line"><span class="comment">// 改成</span></span><br><span class="line"><span class="built_in">ledcAttachPin</span>(pin, <span class="number">5000</span>);</span><br></pre></td></tr></table></figure><h3 id="2-控制台一直打印乱码，或者代码上传，什么都不输出。"><a href="#2-控制台一直打印乱码，或者代码上传，什么都不输出。" class="headerlink" title="2. 控制台一直打印乱码，或者代码上传，什么都不输出。"></a>2. 控制台一直打印乱码，或者代码上传，什么都不输出。</h3><p>这个情况很坑，很有可能是下载器的问题，目前某宝上购买的产品会带一块拓展下载板，我在使用这个拓展板直接USB 连接是无效的，如果可以建议还是使用 usb 转 ttl 的下载模式。</p><p><strong>注意：在使用这个模式的时候，上传代码短接 IO0 和 GND，运行代码的时候断开并且按下 “reset”。</strong></p><p>![短接 IO0 和 GND](<a href="https://oss.jzxer.cn/blog/%E6%88%AA%E5%B1%8F2024-11-17">https://oss.jzxer.cn/blog/截屏2024-11-17</a> 22.03.32_副本.png)</p><p><a href="https://blog.jzxer.cn/">dev 的艺术空间</a></p>]]></content>
    
    
    <summary type="html">esp32-cam 是一款是由安信可科技开发的一款小尺寸摄像头模块。它基于ESP32-WROVER系列，搭载了ESP32-D0WD处理器。这款模块不仅具有 **Wi-Fi** 和蓝牙功能，还提供了摄像头接口。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="esp32" scheme="https://blog.jzxer.cn/tags/esp32/"/>
    
  </entry>
  
  <entry>
    <title>初次使用 ESP8266</title>
    <link href="https://blog.jzxer.cn/20241107/20241107_play_with_esp8266/"/>
    <id>https://blog.jzxer.cn/20241107/20241107_play_with_esp8266/</id>
    <published>2024-11-07T07:30:34.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<h2 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h2><p>之前玩的入门级主板 Arduino uno 虽然引脚简单，但是苦于没有无线连接模块，比如：wifi、蓝牙…这些,如果我想要制作一些远程项目这样还是挺麻烦的，所以我在想有没有这么一块板子能够满足的。</p><p>正巧之前买了个 esp-8266，上面就带这些功能，这篇文章会带你深入了解 esp8266，并且在 platformIO 上写一个连接wifi的demo。</p><h2 id="初识-esp8266-wifi板"><a href="#初识-esp8266-wifi板" class="headerlink" title="初识 esp8266 wifi板"></a>初识 esp8266 wifi板</h2><p><img src="https://oss.jzxer.cn/blog/452dccd79f890d278f16d631a35cc21e.png" alt="ESP8266 引脚详情"></p><p>需要注意的是，ESP8266芯片有17个GPIO引脚（GPIO0～GPIO16）。这些引脚中的 GPIO2 是板子上的 LED 灯， GPIO6～GPIO11 被用于连接开发板的 <strong>Flash Memory</strong>。如果在实验电路中使用GPIO6～GPIO11，NodeMCU开发板将无法正常工作。（因此建议不要使用 <strong>GPIO6～GPIO11</strong>）</p><p><img src="https://oss.jzxer.cn/blog/image-20241107160434306.png" alt="原理介绍"></p><h2 id="上传-html-文件"><a href="#上传-html-文件" class="headerlink" title="上传 html 文件"></a>上传 html 文件</h2><p><img src="https://oss.jzxer.cn/blog/image-20241107193133567.png" alt="上传步骤"></p><ol><li><p>在项目根目录下新建一个 data 文件夹</p></li><li><p>在 data 文件夹内创建一个 index.html 文件，内容可以参考如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;zh-CN&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">title</span>&gt;</span>dev 的艺术空间<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">dev 的 esp8266 测试网页</span><br><span class="line">    https://blog.jzxer.cn</span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>选择 build image -&gt; upload image，如果正常进行的话就会显示为以下界面。</p><p><img src="https://oss.jzxer.cn/blog/image-20241107215000857.png" alt="上传成功界面"></p></li></ol><blockquote><p> 需要注意的一点是：如果上传闪存文件失败，试着检查一下串口通讯的频率是多少，115200 目前是个有效值.如果还不行再试试其它的串口数值。</p></blockquote><h2 id="文件系统"><a href="#文件系统" class="headerlink" title="文件系统"></a>文件系统</h2><p>这一步让 esp8266 拥有访问开发板闪存中文件的能力，只需要做两步。</p><ul><li>第一步：启动闪存文件系统</li></ul><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (LittleFS.<span class="built_in">begin</span>()) &#123;</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;LittleFS Started.&quot;</span>);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;LittleFS Failed to Start.&quot;</span>);</span><br><span class="line">&#125;   </span><br></pre></td></tr></table></figure><ul><li>第二步：读取文件</li></ul><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (LittleFS.<span class="built_in">exists</span>(path)) &#123;               </span><br><span class="line">  File file = LittleFS.<span class="built_in">open</span>(path, <span class="string">&quot;r&quot;</span>);          <span class="comment">// 则尝试打开该文件</span></span><br><span class="line">  server.<span class="built_in">streamFile</span>(file, contentType);<span class="comment">// 并且将该文件返回给浏览器</span></span><br><span class="line">  file.<span class="built_in">close</span>();                                <span class="comment">// 并且关闭文件</span></span><br><span class="line">  <span class="keyword">return</span> <span class="literal">true</span>;                                 <span class="comment">// 返回true</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><p>注意这里我使用的是 LittleFS 库，老版本的可能会用到 FS 或者是 SPIFFS 等。逻辑是一样的。</p></blockquote><h2 id="内网穿透"><a href="#内网穿透" class="headerlink" title="内网穿透"></a>内网穿透</h2><p>既然是物联网，那么就一定需要一个能在远程操作自家设备的方式，这个时候我们就可以使用内网穿透的形式，前提满足的条件是：<strong>内网穿透服务和设备在同一个局域网下。</strong></p><p>那么操作起来也很简单，链路大概是：<strong>ESP8266连接家中wifi</strong> <strong>-&gt; 获取 IP -&gt; 把 IP 内网穿透出去</strong> </p><h3 id="1-连上家里的wifi"><a href="#1-连上家里的wifi" class="headerlink" title="1. 连上家里的wifi"></a>1. 连上家里的wifi</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;ESP8266WiFi.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">//  Wi-Fi 网络名称和密码</span></span><br><span class="line"><span class="type">const</span> <span class="type">char</span>* ssid = <span class="string">&quot;devlifestyle&quot;</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">char</span>* password = <span class="string">&quot;123456&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  WiFi.<span class="built_in">begin</span>(ssid, password);  <span class="comment">// 连接到Wi-Fi网络</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">while</span> (WiFi.<span class="built_in">status</span>() != WL_CONNECTED) &#123;</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">500</span>);</span><br><span class="line">    Serial.<span class="built_in">print</span>(<span class="string">&quot;.&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="string">&quot;WiFi connected. SSID is:&quot;</span>);</span><br><span class="line">  Serial.<span class="built_in">println</span>(WiFi.<span class="built_in">SSID</span>());              <span class="comment">// 通过串口监视器输出连接的WiFi名称</span></span><br><span class="line">  Serial.<span class="built_in">print</span>(<span class="string">&quot;IP address: \t&quot;</span>);</span><br><span class="line">  Serial.<span class="built_in">println</span>(WiFi.<span class="built_in">localIP</span>());         <span class="comment">// 获取 WIFI 给的 ip 地址</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这里就完成了一个基本的wifi连接功能，但是这种连接方式的弊端就是，每换一个wifi就要重新修改一下源码，所以最佳的办法是先 AP 再 STA 的方式联网。这个就是后话了👀,后续有机会在其它项目里再展开讲</p><h2 id="问题汇总"><a href="#问题汇总" class="headerlink" title="问题汇总"></a>问题汇总</h2><h3 id="1-控制台乱码"><a href="#1-控制台乱码" class="headerlink" title="1. 控制台乱码"></a>1. 控制台乱码</h3><p>使用的编辑器是 vscode，可能会出现乱码的情况，不要慌，先确认一下编译格式是不是 GBK，不是的话，就把这两个地方改一下。（慎重）</p><ol><li><p>设置 -&gt; 搜索 编码 &gt; 把编码格式改为 GBK</p><p><img src="https://oss.jzxer.cn/blog/image-20241109173422640.png" alt="找到 Encoding"></p></li><li><p>关闭终端控制是否检测</p></li></ol><p><img src="https://oss.jzxer.cn/blog/image-20241109173638889.png" alt="设置页面"></p><h3 id="2-串口传输，接收端乱码"><a href="#2-串口传输，接收端乱码" class="headerlink" title="2. 串口传输，接收端乱码"></a>2. 串口传输，接收端乱码</h3><p>这个场景比较复杂，场景是通过 ESP8266 连接其它单片机，比如 Arduino uno。造成这个结果的原因有很多，我目前总结出了两个方案，可以都试一试。</p><ol><li>如果用的是 platformIO，确保根目录下的 platformio.ini 文件里的串口频率和连接的设备是同一个频率：</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">monitor_speed = 9600</span><br></pre></td></tr></table></figure><ol start="2"><li>确保串口通信接口没有接反，正确的串口通信是：设备 ARX - 设备BTX、设备A TX - 设备B RX，它是一个回路闭环。接反了也可能会产生乱码。</li></ol><blockquote><p>网上有人说和 esp8266 的供电电压有关，要用 3.7v 供电，我尝试了5v 供电是 ok的。</p></blockquote><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>待完善…</p>]]></content>
    
    
    <summary type="html">之前玩的入门级主板 Arduino uno 虽然引脚简单，但是苦于没有无线连接模块，比如：wifi、蓝牙...这些,如果我想要制作一些远程项目这样还是挺麻烦的，所以我在想有没有这么一块板子能够满足的。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="vscode" scheme="https://blog.jzxer.cn/tags/vscode/"/>
    
    <category term="ESP8266" scheme="https://blog.jzxer.cn/tags/ESP8266/"/>
    
  </entry>
  
  <entry>
    <title>使用 ASRPRO-01 做一个智能语音助手</title>
    <link href="https://blog.jzxer.cn/20241106/20241106-use-asrpro-01/"/>
    <id>https://blog.jzxer.cn/20241106/20241106-use-asrpro-01/</id>
    <published>2024-11-06T03:10:34.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h2><p>与其说是智能语音助手，其实是有点想还原木头生前的状态。</p><p>我的一只猫崽子也去世了几个月了，偶尔无意间还是会想起它，正好这次机会，感觉如果给语音助手塞几个猫咪的叫声词条，再给它搞一个猫咪外形的外壳，会不会挺有趣的。</p><h2 id="前期准备"><a href="#前期准备" class="headerlink" title="前期准备"></a>前期准备</h2><ol><li>ASRPRO-01 开发板 x 1</li><li>wav 格式猫咪叫声语音片段若干</li><li>数据线</li></ol><h2 id="介绍一下开发板"><a href="#介绍一下开发板" class="headerlink" title="介绍一下开发板"></a>介绍一下开发板</h2><p>这次使用的开发板是鹿小班的版本,相关的引脚介绍可以看下图（虽然有点模糊，将就一下吧）</p><p>可以看到这块板子有一个 5v 接口和 3.3v 接口，其中 5v 接口是双向的，既可以供电也可以被供电，看自己的需要。</p><p><img src="https://oss.jzxer.cn/blog/180550jkcrk5prrbpv33cv.png" alt="引脚分布图"></p><blockquote><p>PS: 这个其实还有一个核心板的版本，价格是这个的一半，但是需要自己焊针脚，也不能用 usb 烧录，稍微会麻烦一点。</p></blockquote><h2 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h2>]]></content>
    
    
    <summary type="html">我的一只猫崽子也去世了几个月了，偶尔无意间还是会想起它，正好这次机会，感觉如果给语音助手塞几个猫咪的叫声词条，再给它搞一个猫咪外形的外壳，会不会挺有趣的。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="vscode" scheme="https://blog.jzxer.cn/tags/vscode/"/>
    
  </entry>
  
  <entry>
    <title>笑了，在 arduino uno 上用红外线遥控器点灯</title>
    <link href="https://blog.jzxer.cn/20241106/20241106_arduino_with_%20infrared/"/>
    <id>https://blog.jzxer.cn/20241106/20241106_arduino_with_%20infrared/</id>
    <published>2024-11-06T03:10:34.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<h2 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h2><p>最近在用 <strong>arduino uno</strong> 开发智能小车，红外线无线操作的时候碰到了一些问题，参照网上的教程基本都是老掉牙的很丑代码或者方案… 好好好，既然没有现成的，那就自己参考官方案例琢磨，通过本文记录一下，也希望能对更多人有所帮助。</p><h2 id="前期准备"><a href="#前期准备" class="headerlink" title="前期准备"></a>前期准备</h2><ol><li><p>arduino 开发板 x 1</p></li><li><p>红外线遥控器 x 1</p><p><img src="https://oss.jzxer.cn/blog/image-20241111155923760.png" alt="红外线遥控器"></p></li><li><p>Ky-022 红外线接收模块 x 1</p></li><li><p>杜邦线若干</p></li></ol><h2 id="环境配置"><a href="#环境配置" class="headerlink" title="环境配置"></a>环境配置</h2><p>这个项目我是基于 platformIO + vscode 的形式开发，更符合时代的进步（arduino-ide是什么玩意儿…界面看吐了都)</p><p>我愿称这个搭配为最强生产力，至少对于做前端的我来说很好上手。</p><h3 id="1-安装-IRremote-依赖"><a href="#1-安装-IRremote-依赖" class="headerlink" title="1. 安装 IRremote 依赖"></a>1. 安装 IRremote 依赖</h3><p>这个库主要是来负责接收红外线信号，使用起来也是相当的方便。首先去到 platformIO 的首页，进入 library 找到这个库下载就行。</p><p><img src="https://oss.jzxer.cn/blog/image-20241111160122864.png" alt="IRremote"></p><h3 id="2-线路连接"><a href="#2-线路连接" class="headerlink" title="2. 线路连接"></a>2. 线路连接</h3><p>传感器 GND 连 uno GND，VCC 连接 3.3v 或者 5v，DAT 我这里由于其它端口暂时被占用，连接的是 10 号引脚（理论上2、3、5、6、9、10、11 都可）。</p><p><img src="https://oss.jzxer.cn/blog/image-20241111160652824.png" alt="连接示例"></p><h2 id="开发流程"><a href="#开发流程" class="headerlink" title="开发流程"></a>开发流程</h2><blockquote><p>记得插上你的开发设备，并通电。</p></blockquote><h3 id="1-测试红外线设备"><a href="#1-测试红外线设备" class="headerlink" title="1. 测试红外线设备"></a>1. 测试红外线设备</h3><p>把下面的代码烧录进 arduino 设备。然后打开串口监视页面，按下遥控器，看终端是否会打印出值。如果返回，那说明正常连接成功，可以进行下一步了。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;IRremote.hpp&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">    IrReceiver.<span class="built_in">begin</span>(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (IrReceiver.<span class="built_in">decode</span>()) &#123;</span><br><span class="line">        <span class="keyword">if</span> (IrReceiver.decodedIRData.protocol != UNKNOWN) &#123;</span><br><span class="line">            Serial.<span class="built_in">println</span>(IrReceiver.decodedIRData.command);    <span class="comment">// 打印接收到的值</span></span><br><span class="line">            IrReceiver.<span class="built_in">resume</span>();</span><br><span class="line">            IrReceiver.<span class="built_in">printIRResultShort</span>(&amp;Serial);</span><br><span class="line">            IrReceiver.<span class="built_in">printIRSendUsage</span>(&amp;Serial);</span><br><span class="line">        &#125; </span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-写入-LED-判断语句"><a href="#2-写入-LED-判断语句" class="headerlink" title="2. 写入 LED 判断语句"></a>2. 写入 LED 判断语句</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;IRremote.hpp&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> ledPin = A5;  <span class="comment">// 我这里给 LED 的引脚是 A5</span></span><br><span class="line"><span class="type">int</span> LED_CODE = <span class="number">22</span>;       <span class="comment">//  led 对应的按钮，数字0 的code</span></span><br><span class="line"><span class="type">bool</span> ledState = <span class="literal">false</span>; </span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">    IrReceiver.<span class="built_in">begin</span>(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);  <span class="comment">// 初始化红外线接收模块</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="comment">// 当接收到红外线信号时</span></span><br><span class="line">    <span class="keyword">if</span> (IrReceiver.<span class="built_in">decode</span>()) &#123;</span><br><span class="line">        <span class="keyword">if</span> (IrReceiver.decodedIRData.protocol != UNKNOWN) &#123;</span><br><span class="line">            <span class="keyword">switch</span> (IrReceiver.decodedIRData.command) &#123;</span><br><span class="line">              <span class="keyword">case</span> LED_CODE:</span><br><span class="line">                  ledState = !ledState; <span class="comment">// 切换LED的状态</span></span><br><span class="line">                  <span class="built_in">digitalWrite</span>(ledPin, ledState ? HIGH : LOW); <span class="comment">// 设置LED的状态</span></span><br><span class="line">                  <span class="keyword">break</span>;</span><br><span class="line">              <span class="keyword">default</span>:</span><br><span class="line">                  <span class="comment">// 其他情况不作处理</span></span><br><span class="line">                  <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            IrReceiver.<span class="built_in">resume</span>();</span><br><span class="line">            IrReceiver.<span class="built_in">printIRResultShort</span>(&amp;Serial);</span><br><span class="line">            IrReceiver.<span class="built_in">printIRSendUsage</span>(&amp;Serial);</span><br><span class="line">        &#125; </span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>把代码上传到uno，不出意外的话，led就会随着点击数字0键，开启关闭切换。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>完整案例我加入了控制小车移动的控制，包括蜂鸣器做喇叭的代码，虽然小车移动左右方向还有点问题，但是问题不大，今天先写到这里，晚安，玛卡巴卡。</p><p>首发：<a href="http://blog.jzxer.cn/">dev 的艺术空间</a></p>]]></content>
    
    
    <summary type="html">最近在用 arduino 开发智能小车，开发红外线模块的时候碰到了一些问题，参照网上的教程基本都是老掉牙的代码或者方案...，好好好，既然没有现成的，那就自己参考官方案例琢磨</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="vscode" scheme="https://blog.jzxer.cn/tags/vscode/"/>
    
  </entry>
  
  <entry>
    <title>home-assistant 添加家里的小米设备</title>
    <link href="https://blog.jzxer.cn/20241105/20241105_homeassistant_add_xiaomi/"/>
    <id>https://blog.jzxer.cn/20241105/20241105_homeassistant_add_xiaomi/</id>
    <published>2024-11-05T11:30:34.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>家里的智能设备虽然很多，但是不同的设备来自于不同的厂商就很烦，因为手机里有天猫精灵、涂鸦智能、米家…一系列的APP…笨重的不行</p><p>所以一直在想有没有一个丝滑的办法，all in one，把所有的智能家居设备都整合到一个 app 里面，并且能实现外网穿透远程访问呢？这样既降</p><p><strong>home-assistant</strong> 就是一个很好的选择。</p><blockquote><p><strong>温馨提示：</strong>以下的内容我是基于群晖的指南，因为需要保持服务长期在线。所以基本条件就是你有一台服务器，如果有一台外网的服务器那就更好了。</p></blockquote><h2 id="开整"><a href="#开整" class="headerlink" title="开整"></a>开整</h2><h3 id="1-安装-home-assistant"><a href="#1-安装-home-assistant" class="headerlink" title="1. 安装 home-assistant"></a>1. 安装 home-assistant</h3><p>我这里使用的是 docker 版本的 home-assistant，所以前提是你这边电脑上安装了 docker，可以按照下面的命令安装即可（如果安装太慢的话可以考虑切换国内的 docker 镜像源，这里我就不介绍了）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker pull homeassistant/home-assistant</span><br></pre></td></tr></table></figure><p>镜像安装好了，运行以下代码创建一个服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">docker run -d \</span><br><span class="line">  --name home-assistant \</span><br><span class="line">  --privileged \</span><br><span class="line">  --restart=unless-stopped \</span><br><span class="line">  -e TZ=Asia/Shanghai \</span><br><span class="line">  -v <span class="variable">$&#123;你自己想要映射的电脑路径&#125;</span>:/config \</span><br><span class="line">  --network=host \</span><br><span class="line">  homeassistant/home-assistant</span><br></pre></td></tr></table></figure><p>服务创建好之后，运行 ${你的服务器ip}:8123 进入首页配置。当进入这个页面的时候，恭喜你，安装成功了！</p><p><img src="https://oss.jzxer.cn/blog/image-20241106233252255.png" alt="home-assitant 首页"></p><h3 id="2-安装-HACS"><a href="#2-安装-HACS" class="headerlink" title="2. 安装 HACS"></a>2. 安装 HACS</h3><p>通过以上安装流程之后，我们需要安装一个类似应用商店的工具 <strong>HACS</strong>，首先我默认你懂得了一些 docker 的语句。它的安装流程如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">// 这个语句是进入 docker 镜像</span><br><span class="line">root@debian:~<span class="comment"># docker exec -it home-assistant bash</span></span><br><span class="line">//  这个语句是在 docker 镜像中执行，目的是安装 HACS</span><br><span class="line">debian:/config<span class="comment"># wget -O - https://get.hacs.xyz | bash -</span></span><br></pre></td></tr></table></figure><p>安装完之后重启，你就能在 <strong>设置 - 设备与服务 - 添加集成</strong> 里找到 HACS</p><p><img src="https://oss.jzxer.cn/blog/image-20241106234051072.png" alt="设置 - 设备与服务 - 添加集成"></p><h3 id="3-安装-hass-xiaomi-miot"><a href="#3-安装-hass-xiaomi-miot" class="headerlink" title="3. 安装 hass-xiaomi-miot"></a>3. 安装 hass-xiaomi-miot</h3><p>到这里为止，你还没有安装关于 xiaomi 的依赖，HACS 只是一个应用商店，而接下来我们需要安装一个 接入小米设备的应用，进入 HACS，搜索 <strong>hass-xiaomi-miot</strong>，下载它。</p><p><img src="https://oss.jzxer.cn/blog/image-20241106234340105.png" alt="hass-xiaomi-miot"></p><h3 id="4-登录小米账号"><a href="#4-登录小米账号" class="headerlink" title="4. 登录小米账号"></a>4. 登录小米账号</h3><p>回到首页，我们继续进入之前进入的 <strong>设置 - 设备与服务 - 添加设备</strong>，搜索 <strong>hass-xiaomi-miot</strong>，然后选择账号集成模式，登录自己的账号（如果第一次登录失败，没关系再来一次），直到登录成功为止。</p><p>按照流程接入想要展示的设备，然后就可以在页面上 <strong>设备</strong> 界面看到如下结果。</p><p><img src="https://oss.jzxer.cn/blog/image-20241106234905669.png" alt="设备界面"></p><h3 id="5-APP-远程操作（可选）"><a href="#5-APP-远程操作（可选）" class="headerlink" title="5. APP 远程操作（可选）"></a>5. APP 远程操作（可选）</h3><p>你需要把自己服务器通过内网穿透的方式映射到外网上来，方法的话去网上搜索内网穿透，或者看我之前关于内网穿透的文章。然后在app上输入自己外网的 IP+端口号，登录自己注册的账户就大功告成了，展示的内容和网页展示的基本没区别。</p><p><img src="https://oss.jzxer.cn/blog/image-20241106235315799.png" alt="home-assistant APP"></p><h2 id="参考工具"><a href="#参考工具" class="headerlink" title="参考工具"></a>参考工具</h2><p>home-assistant 拓展程序： <a href="https://github.com/hacs-china/integration">hacs</a></p><p>小米拓展：<a href="https://gitee.com/al-one/hass-xiaomi-miot/#https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Fhacs-china%2Fintegration">hass-xiaomi-miot</a></p><p><a href="https://blog.jzxer.cn/">首发</a></p>]]></content>
    
    
    <summary type="html">家里的智能设备虽然很多，但是不同的设备来自于不同的厂商就很烦，因为手机里有天猫精灵、涂鸦智能、米家...一系列的APP...笨重的不行</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="homeassistant" scheme="https://blog.jzxer.cn/tags/homeassistant/"/>
    
    <category term="xiaomi" scheme="https://blog.jzxer.cn/tags/xiaomi/"/>
    
    <category term="小米" scheme="https://blog.jzxer.cn/tags/%E5%B0%8F%E7%B1%B3/"/>
    
  </entry>
  
  <entry>
    <title>启动 PlatformIO 与 VSCode 的终极组合，点燃你的 Arduino 开发之旅</title>
    <link href="https://blog.jzxer.cn/20241105/20241105_use_platformIO/"/>
    <id>https://blog.jzxer.cn/20241105/20241105_use_platformIO/</id>
    <published>2024-11-05T03:10:34.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>之前一直用的 arduino-IDE 开发单片机项目，真的到处都是诟病，界面丑、没有代码提示、拓展性不好、关键插件下载还经常连接不上（因为得用魔法)</p><p>直到我最近接触了 platformIO，这可太爽了，因为它是搭载在 vscode 上的一款插件，所以对于我这个资深老前端来说，无异于无任何学习成本😂…</p><p>说干就干，本篇内容我大概介绍一下 platform 如何集成到 vscode 中，并且写一个小的小灯闪烁的 demo。</p><h2 id="前期准备"><a href="#前期准备" class="headerlink" title="前期准备"></a>前期准备</h2><ol><li>arduino uno R3 开发板 X 1</li></ol><p><img src="https://oss.jzxer.cn/blog/A000066_03.front_934x700.jpg" alt="Arduino Uno R3"></p><ol start="2"><li>电源线 X 1</li><li>数据线 X 1</li><li>杜邦线若干（可选）</li><li>led 灯泡 X 1 （可选）</li><li>10KΩ 电阻 X 1（可选）</li></ol><h2 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h2><h3 id="1-安装-vscode"><a href="#1-安装-vscode" class="headerlink" title="1. 安装 vscode"></a>1. 安装 vscode</h3><p>这一步很简单，上 <a href="https://code.visualstudio.com/">官网</a></p><h3 id="2-安装-platformIO"><a href="#2-安装-platformIO" class="headerlink" title="2. 安装 platformIO"></a>2. 安装 platformIO</h3><p>到 vscode 的插件里搜索 platformIO 并下载，第一次下载可能需要时间比较久，如果用魔法的话可以加快下载速度。<img src="https://oss.jzxer.cn/blog/image-20241105143222155.png" alt="platformIO"></p><p>下载完之后在左侧菜单栏会多出来一个 ICON，点击即可到达首页</p><p><img src="https://oss.jzxer.cn/blog/image-20241105143420414.png" alt="image-20241105143420414"></p><p>到这一步就可以开始我们的第一个项目了</p><h2 id="创建项目"><a href="#创建项目" class="headerlink" title="创建项目"></a>创建项目</h2><h3 id="1-选择-new-project"><a href="#1-选择-new-project" class="headerlink" title="1. 选择 new project"></a>1. 选择 new project</h3><p><img src="https://oss.jzxer.cn/blog/image-20241105143538107.png" alt="新建项目"></p><h3 id="2-填写项目信息"><a href="#2-填写项目信息" class="headerlink" title="2. 填写项目信息"></a>2. 填写项目信息</h3><p>这里的 Framework 默认 Arduino 就好了</p><p><img src="https://oss.jzxer.cn/blog/image-20241105143707323.png" alt="项目信息">这些信息填写完之后，我们就可以愉快的进行开发了，具体的项目结构大概如下图所示：</p><p><img src="https://oss.jzxer.cn/blog/image-20241105143949844.png" alt="目录结构"></p><p>其中 main.cpp 为当前项目主入口文件，接下来插上你的设备开始测试吧。</p><h2 id="参考代码"><a href="#参考代码" class="headerlink" title="参考代码"></a>参考代码</h2><h3 id="1-使用开发板自带的-lED"><a href="#1-使用开发板自带的-lED" class="headerlink" title="1. 使用开发板自带的 lED"></a>1. 使用开发板自带的 lED</h3><p>这个案例是如果你手边没有我上文说到的可选配件的话，可以尝试一下光靠主板 LED 驱动的方案。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span>   <span class="comment">// 引入 Arduino 依赖库</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="built_in">pinMode</span>(LED_BUILTIN, OUTPUT);    <span class="comment">//  LED_BUILTIN 是默认的板上的 LED 灯，gpio 默认引脚是 13</span></span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="built_in">digitalWrite</span>(LED_BUILTIN, HIGH);</span><br><span class="line">  Serial.<span class="built_in">print</span>(<span class="string">&quot;blink\n&quot;</span>);</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">500</span>);</span><br><span class="line">  <span class="built_in">digitalWrite</span>(LED_BUILTIN, LOW);</span><br><span class="line">  <span class="built_in">delay</span>(<span class="number">500</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>上面代码写完以后，然后点击底部菜单的上传按钮：</p><p><img src="https://oss.jzxer.cn/blog/image-20241105144200104.png" alt="上传到 arduino"></p><p>如果看到开发板上的led灯在闪烁，说明上传成功了</p><p>![led 闪烁](<a href="https://oss.jzxer.cn/blog/Nov-05-2024">https://oss.jzxer.cn/blog/Nov-05-2024</a> 14-29-32.gif)</p><h3 id="2-外接一个-LED"><a href="#2-外接一个-LED" class="headerlink" title="2. 外接一个 LED"></a>2. 外接一个 LED</h3><p>如果手边有额外的LED 配件的话，也可以按照下面的连接方式，代码还是和上文中的一样</p><p>![进阶版](<a href="https://oss.jzxer.cn/blog/Nov-05-2024">https://oss.jzxer.cn/blog/Nov-05-2024</a> 14-43-21.gif)</p><h2 id="问题汇总"><a href="#问题汇总" class="headerlink" title="问题汇总"></a>问题汇总</h2><h3 id="1-关于工程初始化卡顿问题"><a href="#1-关于工程初始化卡顿问题" class="headerlink" title="1. 关于工程初始化卡顿问题"></a>1. 关于工程初始化卡顿问题</h3><p>一般是因为国内网络环境的影响。目前我解决的办法如下：</p><h4 id="第一步：修改pip镜像源"><a href="#第一步：修改pip镜像源" class="headerlink" title="第一步：修改pip镜像源"></a>第一步：修改pip镜像源</h4><p>找到 .platformIO&#x2F;prev&#x2F;pip.conf 文件，写入以下代码：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[global]</span><br><span class="line">index-url = https://mirrors.aliyun.com/pypi/simple/</span><br><span class="line">proxy = http://127.0.0.1:7890</span><br><span class="line"></span><br><span class="line">[install]</span><br><span class="line">trusted-host = mirrors.aliyun.com</span><br></pre></td></tr></table></figure><h4 id="第二步：删除-cache-文件夹"><a href="#第二步：删除-cache-文件夹" class="headerlink" title="第二步：删除 .cache 文件夹"></a>第二步：删除 .cache 文件夹</h4><p>进入 .platformIO&#x2F; 目录，删除当前目录下 .cache 文件夹。</p><h4 id="第三步：修改-bash-profile"><a href="#第三步：修改-bash-profile" class="headerlink" title="第三步：修改 bash_profile"></a>第三步：修改 bash_profile</h4><p>如果还是不行的话，就进入这个文件中，添加两个参数，如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> http_proxy=http://127.0.0.1:7890</span><br><span class="line"><span class="built_in">export</span> https_proxy=http://127.0.0.1:7890</span><br></pre></td></tr></table></figure><h4 id="第四步：vscode配置"><a href="#第四步：vscode配置" class="headerlink" title="第四步：vscode配置"></a>第四步：vscode配置</h4><p>![proxy](<a href="https://oss.jzxer.cn/blog/%E6%88%AA%E5%B1%8F2025-01-27">https://oss.jzxer.cn/blog/截屏2025-01-27</a> 20.55.12.png)</p><p>![vscode proxy](<a href="https://oss.jzxer.cn/blog/%E6%88%AA%E5%B1%8F2025-01-27">https://oss.jzxer.cn/blog/截屏2025-01-27</a> 20.56.00.png)</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>以上就是 使用 platformIO 开发arduino项目的过程，当然目前使用的是最基础的默认开发板，如果想要玩其它的板子比如 esp32、esp8266…那就需要更多的配置，以后我会一一分享。</p><p>技术就是提升生活质量的一种方式，如果能够通过分享把这种方式分享出去，那么就会有更多的人能把生活过得更好。</p><p>首发：<a href="https://blog.jzxer.cn/">dev 的艺术空间</a></p>]]></content>
    
    
    <summary type="html">直到我最近接触了 platformIO，这可太爽了，因为它是搭载在 vscode 上的一款插件，所以对于我这个资深老前端来说，无异于无任何学习成本😂...</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="vscode" scheme="https://blog.jzxer.cn/tags/vscode/"/>
    
  </entry>
  
  <entry>
    <title>香橙派 和 Arduino，哪个更适合你？</title>
    <link href="https://blog.jzxer.cn/20241105/20241105_diffrent_about_arduino_and_orangepi/"/>
    <id>https://blog.jzxer.cn/20241105/20241105_diffrent_about_arduino_and_orangepi/</id>
    <published>2024-11-05T02:34:34.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>最近发现总有人傻傻的分不清 <strong>香橙派</strong> 和 <strong>Arduino</strong> 到底有什么不同？就想很早之前的我一样。</p><p>正好这俩我现在都有，通过这一段时间的使用下来，我大概总结了他们的使用场景和优缺点对比。</p><h2 id="不同点"><a href="#不同点" class="headerlink" title="不同点"></a>不同点</h2><ol><li><strong>服务器和单片机</strong>：香橙派严格意义来说是一台电脑，只是尺寸比较小而已，即使不录入程序，接上屏幕也可以看到终端界面。而 Arduino 属于单片机产品，它只能执行一个程序。</li><li><strong>价格</strong>：香橙派 zero 3 售价一百多，而 Arduino uno 只要十几块，所以从价格上来说，单片机更占优势。</li><li><strong>性能</strong>：即使最低配的香橙派服务器，也能运行 node，python 这些程序，而 Arduino 则不行，它只支持 c++ 环境。</li><li><strong>开发环境</strong>：香橙派可以把系统烧录到主机，然后直接在主机里面编写程序运行程序，而 Arduino 只能依赖电脑开发然后上传到主机里面去。相对来说香橙派更方便。</li><li><strong>功能</strong>：香橙派一般主机自己就集成了很多功能，比如红外线、蓝牙、wifi。但是Arduino 必须要买额外的模块，并且通过引脚的形式介入到主板通过编程才能使用。</li></ol><h2 id="相同点"><a href="#相同点" class="headerlink" title="相同点"></a>相同点</h2><ol><li><strong>都可以烧录程序</strong>：香橙派和 Arduino 开发板，都可以通过 ide 通过 USB 接口把程序上传到设备里去。</li><li><strong>尺寸都很小巧</strong>：它们的尺寸都很小，相比较传统服务器，更有便携性。</li></ol><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>从选择来看，如果只是想要单一功能，比如时钟、红外线遥控、监控摄像头，Arduino 会更有性价比。</p><p>相反如果是想要一个便携的设备，并且想要运行大型应用，比如数据库，AI 算法模型…等。那可以使用 香橙派。</p><p>应用场景的不同，决定了它们在自己的领域会有不同的专精度。</p>]]></content>
    
    
    <summary type="html">最近发现总有人傻傻的分不清 **香橙派** 和 **Arduino** 到底有什么不同？就想很早之前的我一样。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="香橙派" scheme="https://blog.jzxer.cn/tags/%E9%A6%99%E6%A9%99%E6%B4%BE/"/>
    
    <category term="orangePI" scheme="https://blog.jzxer.cn/tags/orangePI/"/>
    
  </entry>
  
  <entry>
    <title>健身给我带来的变化和好处</title>
    <link href="https://blog.jzxer.cn/20241104/20241104_bodybuilding_is_important/"/>
    <id>https://blog.jzxer.cn/20241104/20241104_bodybuilding_is_important/</id>
    <published>2024-11-04T14:11:00.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>今天从健身房出来，感觉全世界都是我的，但是在去健身房的前半小时我还慵懒的瘫在床上，犹豫着要不要去，懒惰在左右着我的大脑。</p><p>为什么健身前后会有这么大的差距？锻炼身体到底给我的身体带来了什么样的变化？</p><p>它是怎么影响着我的身体和情绪的？我开始陷入了思考。</p><h2 id="启示录"><a href="#启示录" class="headerlink" title="启示录"></a>启示录</h2><p>那是 2016 年的暑假，我第一次踏入健身房，在前一天我还是个病怏怏的瘫痪儿童，因为肺炎躺在床上打点滴。小飞（我的大学同学，也是当时在出租屋的室友）看见我这个死样子，实在忍不住了，拉起我就往健身房里拖。</p><p>我当时是百般不情愿，但是又想做点什么，趋于这哥们的淫威我还是去了。</p><p>第一次体验了健身房大汗淋淋的快感之后，从此便一发不可收拾。</p><p><img src="https://oss.jzxer.cn/blog/202411042241939.png" alt="第一次进健身房"></p><p><img src="https://oss.jzxer.cn/blog/202411042243457.png" alt="一个月后"></p><p><img src="https://oss.jzxer.cn/blog/202411042245602.png" alt="两个月之后"></p><p><img src="https://oss.jzxer.cn/blog/202411042247790.png" alt="现在"></p><p>回顾这些变化，不得不说，健身给我带来的好处蛮多的，我大概列出来以下几个点，是比较明显的：</p><ol><li>精气神很足，以前很容易犯困，感觉每天都睡不饱，很会睡觉</li><li>心态非常乐观，虽然以前也挺乐观的，但是每次从健身房出来我都感觉：I dont give a shit 的感觉</li><li>身材好了，健身之前只有 105-107 之间浮动，大学那俩月胖了 10 斤，到了 24 年，好家伙，直接上了 130 斤，虽然离我想要的 135 还差一点儿，不过也不错，穿衣显瘦，脱衣有肉，这就是质感🤣。</li><li>气质好了，随着健身时间的累积，我更感觉内心的那种男人的内核开始觉醒，举手投足间，我都感觉自己很有自信，是一个有魅力的人。</li><li>更有耐心了，健身是一个需要长期坚持的过程，从 16 年到 24 年，虽然中间断了一段时间，但是总的来说还是坚持了很久，培养了自己的耐心，对很多事情都能更包容和沉得住气。这真的是非常大的收获。</li></ol><p>以上就是我能想到的，健身对我带来的好处，接下来我谈谈，对未来的展望。</p><h2 id="展望未来"><a href="#展望未来" class="headerlink" title="展望未来"></a>展望未来</h2><p>健身是一辈子的事情，我会一直坚持下去。大概率黄河水流干了我也不会停止吧。因为它对我的影响真的太大了。我也很谢谢自己能够一直坚持到现在。</p><p>未来我希望自己的体重能在保证正常体脂率的情况下介于：135-140 之间。因为之前有到超过 135 过，但是看着还是很瘦…所以可能 140 是一个理想体重。</p><p>今年做了一个很大的决定就是真正决定离开前端这个行业了，我有两个考量：一方面我认为前端这个行业对我来说已经没有发展前景了，因为年纪在这里，而且市场行情也不太行了。另一方面也是我觉得最重要的一点，我认为时机到了，30 出头的年纪，是时候开始找寻自己愿意为之奋斗一生的事业了。迟早是要面对的，逼一逼自己，舒适区待太久了，也该被折磨一下了。</p><p>坚持健身也是希望我能用接下来 5-10 年的时间保持一个好的身体的情况下，去在自己喜欢的领域发光发热。说的更伟大一点就是，为造福人类做一些微不足道的贡献。</p><p>好了，时间不早了，该睡了，晚安。</p>]]></content>
    
    
    <summary type="html">为什么健身前后会有这么大的差距？锻炼身体到底给我的身体带来了什么样的变化？它是怎么影响着我的身体和情绪的？我开始陷入了思考</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="健身" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E8%BA%AB/"/>
    
    <category term="bodybuilding" scheme="https://blog.jzxer.cn/tags/bodybuilding/"/>
    
  </entry>
  
  <entry>
    <title>《财富自由之路》阅读笔记</title>
    <link href="https://blog.jzxer.cn/20241026/20241026_free_money_way/"/>
    <id>https://blog.jzxer.cn/20241026/20241026_free_money_way/</id>
    <published>2024-10-26T02:11:00.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>无意间打开李笑来老师的这本书，本来对国内的书籍不报什么希望的，但是看了之后确实收货了不少，所以记录一些印象比较深刻的知识点。</p><p>财富自由的概念于我而言：一辈子在做自己喜欢做的事情的时候，不需要考虑经济来源。</p><h2 id="知识点"><a href="#知识点" class="headerlink" title="知识点"></a>知识点</h2><ol><li><p>把一份时间 <strong>卖给更多的用户</strong></p></li><li><p>从商业角度讲刚需是用户以为的刚需</p></li><li><p>善于使用第三种商业思维：购买他人的时间</p></li><li><p><strong>注意力 &gt; 时间 &gt; 金钱</strong></p></li><li><p>人生三大坑：没事儿凑热闹、喜欢随大流、为别人操碎了心</p></li><li><p>活在未来</p><p>我的思考：这个概念相比比较热门的词汇 <strong>活在当下</strong> ，感觉上又刷新了一层认知，但是对于每个人的理解不一样，李先生更偏向于活在未来，我更偏向活在当下，放眼未来的视角。因为人生是不可测的，就像经常说的一句古话：意外和明天不知道哪个先到来。活在当下很重要，当然也不是说盲目的去活在当下，也不是说对未来就没有任何规划，我们可以对未来有一个大概的预期，所做的事情都往那个预期的方向努力。剩下的时间会给我们答案。</p></li></ol><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>时间宝贵，注意力更宝贵，收缩自己的专注力在更愿意花时间的事情上，然后深挖某个特定的领域，成为这个领域的佼佼者。</p><p>如果可以的话，能用钱解决的事情，尽量用钱解决，所以首当其冲的是赚足够的钱，然后通过购买他人的时间来完成自己的目标。</p><p>永远要保持信心，对自己有信心，对未来有信心。我们这一生只有一次，去做一点不一样的，或者可能改变世界的事情。</p><p>想法在脑海里永远都是想法，最重要的是落地（这句话我说烂了，但是还是会在执行的时候有搁置和阻力），我在努力的去找到一个好的方案来让执行起来更加的方便。</p>]]></content>
    
    
    <summary type="html">李笑来的通往财富自由之路，找到了其中的一些重点标注出来</summary>
    
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/categories/%E9%98%85%E8%AF%BB/"/>
    
    
    <category term="财富自由" scheme="https://blog.jzxer.cn/tags/%E8%B4%A2%E5%AF%8C%E8%87%AA%E7%94%B1/"/>
    
    <category term="IBM" scheme="https://blog.jzxer.cn/tags/IBM/"/>
    
    <category term="金融" scheme="https://blog.jzxer.cn/tags/%E9%87%91%E8%9E%8D/"/>
    
  </entry>
  
  <entry>
    <title>《拖延心理学》读后感</title>
    <link href="https://blog.jzxer.cn/20241023/20241023_about_tuoyan/"/>
    <id>https://blog.jzxer.cn/20241023/20241023_about_tuoyan/</id>
    <published>2024-10-23T14:22:00.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>花费了大半年时间，应该是拖延了大半年时间，总算是把这本书给啃完了。</p><p>整体来说这本书对我来说意义蛮大的，让我对我自己又有了新的认识，重新找到了奋斗的方法和方向。所以特别针对书中的重点做一些总结和归纳。</p><p>具体分为以下几点：</p><ol><li>在无意识状态下，写作 20 分钟</li><li>每个周末为下周做计划</li><li>把脚步放慢，从小目标开始</li><li>在确定的任务之外再制定计划</li><li>奶酪式时间分配法</li><li>合理的奖励机制</li><li>充分利用自己最 high 的时刻</li></ol><p>接下来我会按照以上的点，一个一个的展开分析。</p><h2 id="展开说说"><a href="#展开说说" class="headerlink" title="展开说说"></a>展开说说</h2><h3 id="1-在无意识状态下，写作20分钟"><a href="#1-在无意识状态下，写作20分钟" class="headerlink" title="1. 在无意识状态下，写作20分钟"></a>1. 在无意识状态下，写作20分钟</h3><p>这条说明的是，我们 80% 的思考大脑都是出于一个无意识状态，所以很多时候可以通过书写内容来找到灵感，找到内心深处的那个思考。</p><p>在操作的时候就是，一股脑的写，不管这个写的东西是不是合理，写就是了，写着写着你就会发现没想到自己想了这么多自己意识不到的东西。</p><h3 id="2-每个周末为下周做计划"><a href="#2-每个周末为下周做计划" class="headerlink" title="2. 每个周末为下周做计划"></a>2. 每个周末为下周做计划</h3><p>无计划，就是失败的开始。</p><p>上面这句话就可以证明做计划的重要性，这个可以搭配第四条一起食用。</p><h3 id="3-把脚步放慢，从小目标开始"><a href="#3-把脚步放慢，从小目标开始" class="headerlink" title="3. 把脚步放慢，从小目标开始"></a>3. 把脚步放慢，从小目标开始</h3><p>很多时候我们做事情都是在直接朝着一个很宏大的目标去用劲儿，但是如果目标没有达到的话，而且大概率不会短时间内达到，所以就会产生挫败感。正因为这个挫败感，没办法产生正向反馈，那也就后期慢慢失去了激情和兴趣，目标也就无法达成。</p><p>试着把这个大目标拆分成 n 个确实可执行的小目标，这个小目标越小，给你达到这个目标带来的成就感也就更足。他也就更有持续性。</p><p>记住这个小目标一定满足两点：<strong>可量化和可执行。</strong></p><h3 id="4-确定任务之外在订计划"><a href="#4-确定任务之外在订计划" class="headerlink" title="4. 确定任务之外在订计划"></a>4. 确定任务之外在订计划</h3><p>以前我有个坏习惯，就是喜欢排计划表的时候，把所有代办事项都排的满满当当的，这也就造成每次办事当天发现时间更本不够用，或者各种冲突事件没有留一个 gap 节点导致延期…等等</p><p>在这里我们可以把已经确定的任务罗列出来，去整理这一周剩下的可利用时间，再去排计划，这样排出来的计划就更有可执行性。并且完成的可能性更高。</p><h3 id="5-奶酪式时间分配法"><a href="#5-奶酪式时间分配法" class="headerlink" title="5. 奶酪式时间分配法"></a>5. 奶酪式时间分配法</h3><p>顾名思义，奶酪有很多的气孔，所以我们可以在生活中的碎片化时间去安排任务。因为我们不太可能总是有很多连续的大长块的时间。</p><p>利用好那些 1 分钟、5 分钟、10 分钟，见缝插针式植入任务，把分配的任务切分的更细，去满足在这么短的时间切片中可以利用的场景。例如我可以用一分钟写一个签名，5 分钟写一个大纲、10 分钟完成一个总结…这都是碎片化时间的利用来完成最终的目标。</p><h3 id="6-合理的奖励机制"><a href="#6-合理的奖励机制" class="headerlink" title="6. 合理的奖励机制"></a>6. 合理的奖励机制</h3><p>如果一个人每天都在玩，都在躺平，都在娱乐，他真正的内心其实是比较空虚的。</p><p>人的本能在于创造价值，而持续的创造价值，需要一个好的反馈机制去维持，怎么达到一个正向反馈，就可以通过在完成了一个任务之后，去安排等价位的奖赏。比如造出了火箭，那么就可以奖励自己去火星上度假一天。改好了一个惊世骇俗的 bug，那就可以奖励自己去米其林餐厅搓一顿。</p><h3 id="7-充分利用自己最嗨的时间"><a href="#7-充分利用自己最嗨的时间" class="headerlink" title="7. 充分利用自己最嗨的时间"></a>7. 充分利用自己最嗨的时间</h3><p>由于人的个体差异性，所以每个人的兴奋时间点和低落时间点是不一样的，比如我就是早上比较 high，晚上就是个死尸。所以这个时候就可以去就生物习惯安排自己的时间。</p><p>让自己达到效率最大化。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>以上就是我在看了《拖延心理学》的读后感。</p><p>整体来说这是本很有用的书，质量很高，对我认识自己有了很大的帮助，也对我后面去落地执行一些事情有很大的启发。</p>]]></content>
    
    
    <summary type="html">很多时候我们做事情都是在直接朝着一个很宏大的目标去用劲儿，但是如果目标没有达到的话，而且大概率不会短时间内达到，所以就会产生挫败感</summary>
    
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/categories/%E9%98%85%E8%AF%BB/"/>
    
    
    <category term="读后感" scheme="https://blog.jzxer.cn/tags/%E8%AF%BB%E5%90%8E%E6%84%9F/"/>
    
    <category term="心理学" scheme="https://blog.jzxer.cn/tags/%E5%BF%83%E7%90%86%E5%AD%A6/"/>
    
    <category term="拖延" scheme="https://blog.jzxer.cn/tags/%E6%8B%96%E5%BB%B6/"/>
    
  </entry>
  
  <entry>
    <title>Orange pi 连接温度传感器</title>
    <link href="https://blog.jzxer.cn/20241009/20241009_orangepi_18b20/"/>
    <id>https://blog.jzxer.cn/20241009/20241009_orangepi_18b20/</id>
    <published>2024-10-09T07:34:34.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>阅读门槛：需要了解一些香橙派开发板的基础知识（可以去看看我之前的文章有介绍），linux系统的相关知识，并且会看基本的python代码，我的机子烧录的系统是 Ubuntu22，其它系统的话可以作为参考。</p></blockquote><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>本文主要记录通过 orangePi（香橙派）连接温度传感器，并用Python 脚本最终实现温度监控的过程。主要是其间有不少坑，我也算是提前踩了，希望对你们有用。</p><h2 id="前期准备"><a href="#前期准备" class="headerlink" title="前期准备"></a>前期准备</h2><ol><li>orangePI zero 3（其它的板子也行）</li><li>面包板</li><li>Ds18b20 温度传感器</li><li>小灯珠（可选）</li></ol><h2 id="操作流程"><a href="#操作流程" class="headerlink" title="操作流程"></a>操作流程</h2><h3 id="1-线路连接"><a href="#1-线路连接" class="headerlink" title="1. 线路连接"></a>1. 线路连接</h3><p>首先我们需要知道开发板的每个pin针脚代表的意思。可以参考我之前的介绍orangePI的文章。</p><p>当知道原理的情况下，连接起来就很简单。</p><p>我们需要知道的是温度传感器上有三个引脚，分别对应的：</p><ol><li>红色：电源(我接的是5v电压，由于温度传感器可以支持3.3v - 5.5v电压，所以 3v 电压引脚也是可以的)</li><li>灰色：地线</li><li>绿色：数据传输（理论上只要是gpio的口都可以，我这里连接的是pin12引脚）</li></ol><p>连接原理图参考如下：</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/%E6%B8%A9%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8%E8%BF%9E%E6%8E%A5%E5%9B%BE.drawio.png" alt="温度传感器连接图"></p><p>我这里用了额外的连接线方便用小灯珠调试，实际操作过程中这个额外的连接杜邦线可以不用，按照上面的连接原理形成一个电路闭环即可，实物连接图如下：</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/connect_pic.jpg" alt="connect_pic"></p><p>线连接好，基本上已经成功一半了。接下来就是代码的编写了。</p><h3 id="2-安装环境依赖"><a href="#2-安装环境依赖" class="headerlink" title="2. 安装环境依赖"></a>2. 安装环境依赖</h3><p>这里我用到了一个依赖包 wiringpi，默认情况下香橙派是自带的，这个步骤就可以跳过。</p><p>如果系统没有的话也可以自己安装一下，步骤也很简单（以下步骤需要在root权限下运行）</p><h4 id="一、安装依赖包"><a href="#一、安装依赖包" class="headerlink" title="一、安装依赖包"></a>一、安装依赖包</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">root@orangepi:~# sudo apt-get update</span><br><span class="line">root@orangepi:~# sudo apt-get -y install git swig python3-dev python3-setuptools</span><br></pre></td></tr></table></figure><h4 id="二、下载-wiringOP-Python-的源码"><a href="#二、下载-wiringOP-Python-的源码" class="headerlink" title="二、下载 wiringOP-Python 的源码"></a>二、下载 wiringOP-Python 的源码</h4><blockquote><p>注意，下面的 <strong>git clone</strong><strong>–recursive</strong> 命令会自动下载 <strong>wiringOP</strong> 的源码，因为<strong>wiringOP-Python</strong> 是依赖 <strong>wiringOP</strong> 的。请确保下载过程没有因为网络问题而报错。 </p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">root@orangepi:~# git clone --recursive https://github.com/orangepi-xunlong/wiringOP-Python -b next root@orangepi:~# cd wiringOP-Python</span><br><span class="line">root@orangepi:~/wiringOP-Python# git submodule update --init --remote</span><br></pre></td></tr></table></figure><h4 id="三、编译-wiringOP-Python"><a href="#三、编译-wiringOP-Python" class="headerlink" title="三、编译 wiringOP-Python"></a>三、编译 wiringOP-Python</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">root@orangepi:~# cd wiringOP-Python</span><br><span class="line">root@orangepi:~/wiringOP-Python# python3 generate-bindings.py &gt; bindings.i root@orangepi:~/wiringOP-Python# sudo python3 setup.py install</span><br></pre></td></tr></table></figure><h4 id="四、查看安装是否成功"><a href="#四、查看安装是否成功" class="headerlink" title="四、查看安装是否成功"></a>四、查看安装是否成功</h4><p>当提示下面的内容，则表示安装成功了！</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">root@orangepi:~/wiringOP-Python# python3 -c &quot;import wiringpi; help(wiringpi)&quot; Help on module wiringpi:</span><br><span class="line">NAME wiringpi</span><br><span class="line">DESCRIPTION</span><br><span class="line"># This file was automatically generated by SWIG (http://www.swig.org).</span><br><span class="line"># Version 4.0.2</span><br><span class="line">#</span><br><span class="line"># Do not make changes to this file unless you know what you are doing--modify</span><br><span class="line"># the SWIG interface file instead.</span><br><span class="line">...</span><br></pre></td></tr></table></figure><h3 id="3-代码编写"><a href="#3-代码编写" class="headerlink" title="3. 代码编写"></a>3. 代码编写</h3><p>创建一个脚本叫：index.py，参考以下代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># index.py</span></span><br><span class="line"><span class="keyword">import</span> wiringpi</span><br><span class="line"><span class="keyword">from</span> wiringpi <span class="keyword">import</span> GPIO</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line">PIN = <span class="number">6</span>  <span class="comment"># 这里对应的是物理针脚 12号</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">oneWireReset</span>(<span class="params">pin</span>):</span><br><span class="line">wiringpi.pinMode(pin, GPIO.OUTPUT)</span><br><span class="line">wiringpi.digitalWrite(pin, GPIO.HIGH)</span><br><span class="line">wiringpi.digitalWrite(pin, GPIO.LOW)</span><br><span class="line">wiringpi.delayMicroseconds(<span class="number">500</span>)</span><br><span class="line">wiringpi.digitalWrite(pin, GPIO.HIGH)</span><br><span class="line">wiringpi.delayMicroseconds(<span class="number">60</span>)</span><br><span class="line">wiringpi.pinMode(pin, GPIO.INPUT)</span><br><span class="line"><span class="keyword">if</span> <span class="keyword">not</span> wiringpi.digitalRead(pin):</span><br><span class="line">ack = <span class="number">1</span></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">ack = <span class="number">0</span></span><br><span class="line">wiringpi.delayMicroseconds(<span class="number">500</span>)</span><br><span class="line"><span class="keyword">return</span> ack</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">writeBit</span>(<span class="params">pin, bit</span>):</span><br><span class="line">wiringpi.pinMode(pin, GPIO.OUTPUT)</span><br><span class="line">wiringpi.digitalWrite(pin, GPIO.LOW)</span><br><span class="line">wiringpi.delayMicroseconds(<span class="number">2</span>)</span><br><span class="line">wiringpi.digitalWrite(pin, bit)</span><br><span class="line">wiringpi.delayMicroseconds(<span class="number">80</span>)</span><br><span class="line">wiringpi.digitalWrite(pin, GPIO.HIGH)</span><br><span class="line">wiringpi.delayMicroseconds(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">oneWireSendComm</span>(<span class="params">pin, byte</span>):</span><br><span class="line">i = <span class="number">0</span></span><br><span class="line"><span class="keyword">while</span> i &lt; <span class="number">8</span>:</span><br><span class="line">sta = byte &amp; <span class="number">0x01</span></span><br><span class="line">writeBit(pin, sta)</span><br><span class="line">byte &gt;&gt;= <span class="number">1</span></span><br><span class="line">i += <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">readBit</span>(<span class="params">pin</span>):</span><br><span class="line">wiringpi.pinMode(pin, GPIO.OUTPUT)</span><br><span class="line">wiringpi.digitalWrite(pin, GPIO.HIGH)</span><br><span class="line">wiringpi.digitalWrite(pin, GPIO.LOW)</span><br><span class="line">wiringpi.delayMicroseconds(<span class="number">2</span>)</span><br><span class="line">wiringpi.digitalWrite(pin, GPIO.HIGH)</span><br><span class="line"></span><br><span class="line">wiringpi.pinMode(pin, GPIO.INPUT)</span><br><span class="line">wiringpi.delayMicroseconds(<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">tmp = wiringpi.digitalRead(pin)</span><br><span class="line">wiringpi.delayMicroseconds(<span class="number">40</span>)</span><br><span class="line"><span class="keyword">return</span> tmp</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">oneWireReceive</span>(<span class="params">pin</span>):</span><br><span class="line">i = <span class="number">0</span></span><br><span class="line">k = <span class="number">0</span></span><br><span class="line"><span class="keyword">while</span> i &lt; <span class="number">8</span>:</span><br><span class="line">j = readBit(pin)</span><br><span class="line">k = (j &lt;&lt; <span class="number">7</span>) | (k &gt;&gt; <span class="number">1</span>)</span><br><span class="line">i += <span class="number">1</span></span><br><span class="line">k = k &amp; <span class="number">0x00FF</span></span><br><span class="line"><span class="keyword">return</span> k</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">tempchange</span>(<span class="params">lsb, msb</span>):</span><br><span class="line"><span class="keyword">if</span> (msb &gt;= <span class="number">0xF0</span>):</span><br><span class="line">msb = <span class="number">255</span> - msb</span><br><span class="line">lsb = <span class="number">256</span> - lsb</span><br><span class="line">tem = -(msb*<span class="number">16</span>*<span class="number">16</span> + lsb)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">tem = (msb*<span class="number">16</span>*<span class="number">16</span> + lsb)</span><br><span class="line">temp = tem*<span class="number">0.0625</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;Current Temprature: %.2f&quot;</span>%(temp))</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">wiringpi.wiringPiSetup()</span><br><span class="line">lsb = <span class="number">0</span></span><br><span class="line">msb = <span class="number">0</span></span><br><span class="line"><span class="keyword">if</span> oneWireReset(PIN):</span><br><span class="line">oneWireSendComm(PIN, <span class="number">0xcc</span>)</span><br><span class="line">oneWireSendComm(PIN, <span class="number">0x44</span>)</span><br><span class="line"><span class="keyword">if</span> oneWireReset(PIN):</span><br><span class="line">oneWireSendComm(PIN, <span class="number">0xcc</span>)</span><br><span class="line">oneWireSendComm(PIN, <span class="number">0xbe</span>)</span><br><span class="line">lsb = oneWireReceive(PIN)</span><br><span class="line">msb = oneWireReceive(PIN)</span><br><span class="line">tempchange(lsb, msb)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:       <span class="comment"># 创建一个循环，两秒钟输出一次温度信息</span></span><br><span class="line">main()</span><br><span class="line">time.sleep(<span class="number">2</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="4-结果展示"><a href="#4-结果展示" class="headerlink" title="4. 结果展示"></a>4. 结果展示</h3><p>运行脚本：python index.py, 就会有当前实时温度信息展示</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/Oct-09-2024%2017-44-50.gif" alt="Oct-09-2024 17-44-50"></p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>随着对开发板的日渐熟悉，我越来越坚定软件硬件都是服务于人类的。每个人都可以通过自己DIY来让自己的生活更上一层楼。而这需要的成本是非常低的。</p><p>我的快乐很简单，就是自己动手创造一个自己喜欢的生活方式，构建一个自己想要的世界。拜拜👋</p>]]></content>
    
    
    <summary type="html">本文主要记录通过 orangePi（香橙派）连接温度传感器，并用Python 脚本最终实现温度监控的过程。主要是其间有不少坑。。。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="香橙派" scheme="https://blog.jzxer.cn/tags/%E9%A6%99%E6%A9%99%E6%B4%BE/"/>
    
    <category term="orangePI" scheme="https://blog.jzxer.cn/tags/orangePI/"/>
    
    <category term="python" scheme="https://blog.jzxer.cn/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>入门级高性价比单片机 -- arduino uno</title>
    <link href="https://blog.jzxer.cn/20240925/20241014-intro-arduino-uno/"/>
    <id>https://blog.jzxer.cn/20240925/20241014-intro-arduino-uno/</id>
    <published>2024-09-25T02:24:00.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>单片机就是通过给一个芯片主板写入一套程序，这个芯片只会去执行这一套程序的载体。</p><p>所以单片机理论上具有功能单一性，换个角度说，相比较买一台开发板（微型服务器）来说的话，它的价格更低。</p><p>本文要介绍的机器就是市面上比较热门的入门级单片机 arduino uno R3，看到上面密密麻麻的小孔是不是密集恐惧症犯了，然后觉得会很难很可怕，事实上懂得了原理的话，非常简单，用 10 行不到的代码就能实现一个 led 闪烁功能。</p><p>话不多说，开始介绍</p><h2 id="了解-uno-R3"><a href="#了解-uno-R3" class="headerlink" title="了解 uno R3"></a>了解 uno R3</h2><h3 id="1-初识主板"><a href="#1-初识主板" class="headerlink" title="1. 初识主板"></a>1. 初识主板</h3><p>以下主要讲一下表示的各个模块分别有什么作用。</p><ul><li><strong>CH340G</strong>: 和计算机通信接口，这里需要接入特定的 USB 连接线。</li></ul><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20241014142545478.png" alt="image-20241014142545478"></p><h3 id="2-电路图"><a href="#2-电路图" class="headerlink" title="2. 电路图"></a>2. 电路图</h3><p>从下面开始，就开始介绍电路图了，但是这里的电路图和上面图片对应的有些地方不一样，因为下面的是uno 的电路图，我在网上找不到…</p><p>我会从所有的引脚开始介绍（<strong>R3 的拓展引脚板子上也有标注，看了下面的介绍，也大概知道个所以然了</strong>）</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20241014143539714.png" alt="image-20241014143539714"></p>]]></content>
    
    
    <summary type="html">所以单片机理论上具有功能单一性，换个角度说，相比较买一台开发板（微型服务器）来说的话，它的价格更低。</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="单片机" scheme="https://blog.jzxer.cn/tags/%E5%8D%95%E7%89%87%E6%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>Shapr3D建模入门（一） - 水桶</title>
    <link href="https://blog.jzxer.cn/20240925/20240925_shapr3d_turtorial_1/"/>
    <id>https://blog.jzxer.cn/20240925/20240925_shapr3d_turtorial_1/</id>
    <published>2024-09-25T02:24:00.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<h2 id="文章简介"><a href="#文章简介" class="headerlink" title="文章简介"></a>文章简介</h2><p>最近迷上了3d建模，所以试着用 <strong>shapr3d</strong> 建一个水桶的模型，官方有参考文档，我在这个基础上加上了一些细节。</p><p>最终效果展示</p><iframe src="https://collaborate.shapr3d.com/v/aG8flfDDIJZSCMCbARzII" title="Shapr3D Webviewer" width="640" height="640" frameborder="0" allow="web-share; xr-spatial-tracking" loading="lazy" scrolling="no" referrerpolicy="origin-when-cross-origin" allowfullscreen></iframe><h2 id="操作步骤"><a href="#操作步骤" class="headerlink" title="操作步骤"></a>操作步骤</h2><h3 id="1-创建基础草图"><a href="#1-创建基础草图" class="headerlink" title="1. 创建基础草图"></a>1. 创建基础草图</h3><p>切换到顶部视图视角创建一个椭圆，定义底部的尺寸，我这里是宽150mm，高90mm。</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240927094542033.png" alt="image-20240927094542033"></p><h3 id="2-创建主体"><a href="#2-创建主体" class="headerlink" title="2. 创建主体"></a>2. 创建主体</h3><p>选中椭圆，复制另外一个椭圆，拉到顶部距离150的高度，添加倾斜角度以形成桶身。</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240927094755350.png" alt="image-20240927094755350"></p><h3 id="3-添加倒角"><a href="#3-添加倒角" class="headerlink" title="3. 添加倒角"></a>3. 添加倒角</h3><p>在顶部和底部之间添加倒角，以形成平滑的过渡。我这里给的是8mm</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240927094918716.png" alt="image-20240927094918716"></p><h3 id="4-创建分隔曲面"><a href="#4-创建分隔曲面" class="headerlink" title="4. 创建分隔曲面"></a>4. 创建分隔曲面</h3><p>使用前视图创建一个草图，绘制一条曲线，然后使用挤出命令创建一个分隔曲面。</p><h3 id="5-分割主体"><a href="#5-分割主体" class="headerlink" title="5. 分割主体"></a>5. 分割主体</h3><p>使用分隔曲面将主体分割成两部分，并删除多余的部分。</p><h3 id="6-创建偏移效果"><a href="#6-创建偏移效果" class="headerlink" title="6. 创建偏移效果"></a>6. 创建偏移效果</h3><p>选择外表面并拖动以创建偏移效果。</p><h3 id="7-添加圆角"><a href="#7-添加圆角" class="headerlink" title="7. 添加圆角"></a>7. 添加圆角</h3><p>在底部边缘添加圆角，以便于手持。</p><h3 id="8-创建出水口"><a href="#8-创建出水口" class="headerlink" title="8. 创建出水口"></a>8. 创建出水口</h3><p>在左侧添加一个出水口，使用扫描命令创建出水口的形状。</p><h3 id="9-添加细节"><a href="#9-添加细节" class="headerlink" title="9. 添加细节"></a>9. 添加细节</h3><p>在底部添加凹槽，使手持时手指有空间。</p><h3 id="10-创建把手"><a href="#10-创建把手" class="headerlink" title="10. 创建把手"></a>10. 创建把手</h3><p>这部分可能会在第二部分的教程中介绍。</p><h3 id="11-组装所有部分"><a href="#11-组装所有部分" class="headerlink" title="11. 组装所有部分"></a>11. 组装所有部分</h3><p>将所有单独的部分组装成一个完整的水桶。</p><h3 id="12-添加表面圆角"><a href="#12-添加表面圆角" class="headerlink" title="12. 添加表面圆角"></a>12. 添加表面圆角</h3><p>在设计完成后，添加表面圆角以增加美观性。</p><h3 id="13-添加把手"><a href="#13-添加把手" class="headerlink" title="13. 添加把手"></a>13. 添加把手</h3><p>把手主要用到的命令是扫掠，这个命令会以创建的图形为基础，选中的线段为路径生成一个立体模型。</p>]]></content>
    
    
    <summary type="html">用shapr3d建一个水桶的模型，官方有参考文档，但是我在这个基础上加上了一些细节...</summary>
    
    
    
    <category term="3d打印" scheme="https://blog.jzxer.cn/categories/3d%E6%89%93%E5%8D%B0/"/>
    
    
    <category term="shapr3d" scheme="https://blog.jzxer.cn/tags/shapr3d/"/>
    
    <category term="3d建模" scheme="https://blog.jzxer.cn/tags/3d%E5%BB%BA%E6%A8%A1/"/>
    
    <category term="拓竹" scheme="https://blog.jzxer.cn/tags/%E6%8B%93%E7%AB%B9/"/>
    
  </entry>
  
  <entry>
    <title>和妹子逛完街，写了个 AI 智能穿搭系统</title>
    <link href="https://blog.jzxer.cn/20240827/20240827-Ai_jiyi_start/"/>
    <id>https://blog.jzxer.cn/20240827/20240827-Ai_jiyi_start/</id>
    <published>2024-08-27T03:34:00.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>想直接看成品演示的可以直接划到文章底部</p></blockquote><h1 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h1><p>故事起源在和一个妹子去逛衣服店的时候，试来试去的难以取舍，最终消耗了我一个小时。虽然这个时间不多，<br>但这个时间黑神话悟空足矣让我打完虎先锋</p><p>回家我就灵光一闪，是不是可以搞一个AI智能穿搭，只需要上传自己的照片和对应的衣服图片就能实现在线试衣服呢？</p><p>说干就干，我就开始构思方案，画原型。<br>俗话说万事开头难，事实上这个构思到动工就耗费了我一个礼拜，因为一直在构思怎么样的交互场景会让用户使用起来比较丝滑，并且容易上手。</p><p>目前实现的功能有：</p><ul><li>✅ 用户信息展示</li><li>✅ AI 生成穿搭</li><li>✅ 风格大厅</li></ul><p>待完成：</p><ul><li>私人衣柜</li><li>AI 换鞋</li></ul><h1 id="经过"><a href="#经过" class="headerlink" title="经过"></a>经过</h1><h2 id="1-画产品原型"><a href="#1-画产品原型" class="headerlink" title="1. 画产品原型"></a>1. 画产品原型</h2><p>起初第一个版本的产品原型由于是自己构思没有任何参考，直接上手撸代码的，想到啥就画啥，所以布局非常传统，配色也非常普通（蚂蚁蓝），所以感觉没有太多的时尚气息（个人觉得丑的一逼，不像是互联网的产物）。因为重构掉了，老的现在没有了，我懒就不重新找回来截图了，直接画个当时的样子，大概长成下面这样：</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829104107115.png" alt="image-20240829104107115"></p><p>丑的我忍不了，我就去设计师专门用的网站参(chao)考(xi)了一下，找来找去，终于有了下面的最终版原型图</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829104148447.png" alt="image-20240829104148447"></p><h2 id="2-配色选择"><a href="#2-配色选择" class="headerlink" title="2. 配色选择"></a>2. 配色选择</h2><p>大家知道，所有的UI设计，都离不开主题色的选择，比如：淘宝橙、飞猪橙、果粒橙…，目的一方面是为了打造品牌形象，另一方面也是为了提升品牌辨识度，让你看到这个颜色就会想起它</p><p>那我必须也得跟上时代的潮流，选了 $#c1a57b$ 这款低调而又不失奢华的色值作为主题色，英雄不问出处，问就是借鉴。</p><h2 id="3-技术选型"><a href="#3-技术选型" class="headerlink" title="3. 技术选型"></a>3. 技术选型</h2><p>我对技术的定义是：技术永远服务于产品，能高效全面帮助我开发出一款应用，并且能保证后续的稳定性和可维护性，啥技术我都行。当然如果这门技术我优先会从我属性的板块去找。</p><p>经过各种权衡和比较，最后敲定下来了技术选型方案：</p><ul><li><strong>前端</strong>：taro （为了后续可能会有小程序端做准备）</li><li><strong>后端</strong>：koajs （实际使用的是midway，基于koajs，主要是比较喜欢koa的轻量化架构）</li><li><strong>数据库</strong>：mongodb （别问，问就是简单易上手）</li><li><strong>代码仓库</strong>：gitea</li><li><strong>CI</strong>：gitea-runner</li><li><strong>部署工具</strong>：pm2</li><li><strong>静态文件托管</strong>：阿里云OSS</li></ul><h2 id="4-撸代码"><a href="#4-撸代码" class="headerlink" title="4. 撸代码"></a>4. 撸代码</h2><p>这里我只挑一些个人感觉相对需要注意的地方展开讲讲</p><h3 id="4-1-图片转存"><a href="#4-1-图片转存" class="headerlink" title="4.1 图片转存"></a>4.1 图片转存</h3><p>由于我生成图片的API图片链接会在一天之后失效，所以我需要在调用任务详情的时候，把这个文件转存到我自己的oss服务器，这里我总结出来的思路是：【1. 保存在本地暂存文件夹】-【2. 调用node流式读取接口】-【3. 保存到oss】-【4. 返回替换原来的链接】</p><p>具体代码参考如下：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> tempDir = path.<span class="title function_">join</span>(<span class="title function_">tmpdir</span>(), <span class="string">&#x27;temp-upload-files&#x27;</span>)</span><br><span class="line"><span class="keyword">const</span> link = url.<span class="title function_">parse</span>(src);</span><br><span class="line"><span class="keyword">const</span> fileName = path.<span class="title function_">basename</span>(link.<span class="property">pathname</span>)</span><br><span class="line"><span class="keyword">const</span> localPath = path.<span class="title function_">join</span>(tempDir, <span class="string">`/<span class="subst">$&#123;fileName&#125;</span>`</span>); <span class="comment">// 生成保存路径</span></span><br><span class="line"><span class="keyword">let</span> request</span><br><span class="line"><span class="keyword">if</span> (link.<span class="property">protocol</span> === <span class="string">&#x27;https:&#x27;</span>) &#123;</span><br><span class="line">    request = https</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    request = http</span><br><span class="line">&#125;</span><br><span class="line">request.<span class="title function_">get</span>(src, <span class="keyword">async</span> (response) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> fileStream = <span class="keyword">await</span> fs.<span class="title function_">createWriteStream</span>(localPath);  <span class="comment">// 保存到本地暂存路径</span></span><br><span class="line">    </span><br><span class="line">    <span class="keyword">await</span> response.<span class="title function_">pipe</span>(fileStream);</span><br><span class="line">    fileStream.<span class="title function_">on</span>(<span class="string">&quot;error&quot;</span>, <span class="function">(<span class="params">error</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&quot;保存图片出错：&quot;</span>, error);</span><br><span class="line">      <span class="title function_">reject</span>(error)</span><br><span class="line">    &#125;);</span><br><span class="line">    fileStream.<span class="title function_">on</span>(<span class="string">&#x27;finish&#x27;</span>, <span class="keyword">async</span> res =&gt; &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;暂存完成，开始上传：&#x27;</span>, res)</span><br><span class="line">      <span class="keyword">let</span> result = <span class="keyword">await</span> <span class="variable language_">this</span>.<span class="property">ossService</span>.<span class="title function_">put</span>(<span class="string">`/<span class="subst">$&#123;params.saveDir || <span class="string">&#x27;tmp&#x27;</span>&#125;</span>/<span class="subst">$&#123;fileName&#125;</span>`</span>, localPath);</span><br><span class="line">      <span class="keyword">if</span> (!result) <span class="keyword">return</span></span><br><span class="line">      <span class="title function_">resolve</span>(result)</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>这里的request因为我不想引入其它的库所以这样写，如果有更好的方案，可以在评论区告知一下。</p><blockquote><p>这里需要注意的一个地方是，上传的这个 localPath 最好是自己做一下处理，我这边没有处理，因为可能两个用户同时上传，他们的文件名称相同的时候，可能会出现覆盖的情况，包括后面的oss保存也是。</p></blockquote><h3 id="4-2-文件流式上传中间件"><a href="#4-2-文件流式上传中间件" class="headerlink" title="4.2 文件流式上传中间件"></a>4.2 文件流式上传中间件</h3><p>因为默认的接口处理是不处理流式调用的，所以需要自己创建一个中间件来拦截处理一下，下面给出我的参考代码：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">SSE</span> &#123;</span><br><span class="line">    <span class="attr">ctx</span>: <span class="title class_">Context</span></span><br><span class="line">    <span class="title function_">constructor</span>(<span class="params">ctx: Context</span>) &#123;</span><br><span class="line">        ctx.<span class="property">status</span> = <span class="number">200</span>;</span><br><span class="line">        ctx.<span class="title function_">set</span>(<span class="string">&#x27;Content-Type&#x27;</span>, <span class="string">&#x27;text/event-stream&#x27;</span>);</span><br><span class="line">        ctx.<span class="title function_">set</span>(<span class="string">&#x27;Cache-Control&#x27;</span>, <span class="string">&#x27;no-cache&#x27;</span>);</span><br><span class="line">        ctx.<span class="title function_">set</span>(<span class="string">&#x27;Connection&#x27;</span>, <span class="string">&#x27;keep-alive&#x27;</span>);</span><br><span class="line">        ctx.<span class="property">res</span>.<span class="title function_">writeHead</span>(<span class="number">200</span>, &#123;</span><br><span class="line">            <span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;text/event-stream&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;Cache-Control&#x27;</span>: <span class="string">&#x27;no-cache&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;Connection&#x27;</span>: <span class="string">&#x27;keep-alive&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;Transfer-Encoding&#x27;</span>: <span class="string">&#x27;chunked&#x27;</span></span><br><span class="line">        &#125;);</span><br><span class="line">        ctx.<span class="property">res</span>.<span class="title function_">flushHeaders</span>();</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">ctx</span> = ctx;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="title function_">send</span>(<span class="params">data: any</span>) &#123;</span><br><span class="line">        <span class="comment">// string</span></span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">typeof</span> data === <span class="string">&quot;string&quot;</span>) &#123;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="title function_">push</span>(data);</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (data.<span class="property">id</span>) &#123;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="title function_">push</span>(<span class="string">`id: <span class="subst">$&#123;data.id&#125;</span>\n`</span>);</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (data.<span class="property">event</span>) &#123;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="title function_">push</span>(<span class="string">`event: <span class="subst">$&#123;data.event&#125;</span>\n`</span>);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">          <span class="keyword">const</span> text = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(data)</span><br><span class="line">          <span class="variable language_">this</span>.<span class="title function_">push</span>(<span class="string">`data: <span class="subst">$&#123;text&#125;</span>\n\n`</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="title function_">push</span>(<span class="params">data: any</span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">ctx</span>.<span class="property">res</span>.<span class="title function_">write</span>(data);</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">ctx</span>.<span class="property">res</span>.<span class="title function_">flushHeaders</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="title function_">close</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">ctx</span>.<span class="property">res</span>.<span class="title function_">end</span>();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">@<span class="title class_">Middleware</span>()</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> <span class="title class_">StreamMiddleware</span> implements <span class="title class_">IMiddleware</span>&lt;<span class="title class_">Context</span>, <span class="title class_">NextFunction</span>&gt; &#123;</span><br><span class="line">  <span class="comment">// ?------------ 中间件处理逻辑 -----------------</span></span><br><span class="line">    <span class="title function_">resolve</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">async</span> (<span class="attr">ctx</span>: <span class="title class_">Context</span>, <span class="attr">next</span>: <span class="title class_">NextFunction</span>) =&gt; &#123;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (ctx.<span class="property">res</span>.<span class="property">headersSent</span>) &#123;</span><br><span class="line">                <span class="keyword">if</span> (!ctx.<span class="property">sse</span>) &#123;</span><br><span class="line">                    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;[sse]: response headers already sent, unable to create sse stream&#x27;</span>);</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">next</span>();</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">const</span> sse = <span class="keyword">new</span> <span class="title function_">SSE</span>(ctx);</span><br><span class="line">            ctx.<span class="property">sse</span> = sse;</span><br><span class="line">            <span class="keyword">await</span> <span class="title function_">next</span>();</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (!ctx.<span class="property">body</span>) &#123;</span><br><span class="line">                ctx.<span class="property">body</span> = ctx.<span class="property">sse</span>;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                ctx.<span class="property">sse</span>.<span class="title function_">send</span>(ctx.<span class="property">body</span>);</span><br><span class="line">                ctx.<span class="property">body</span> = sse;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    public <span class="title function_">match</span>(<span class="attr">ctx</span>: <span class="title class_">Context</span>): boolean &#123;</span><br><span class="line">      <span class="comment">// ?------------ 不带 stream 前缀默认都不是流式接口 -----------------</span></span><br><span class="line">      <span class="keyword">if</span> (ctx.<span class="property">path</span>.<span class="title function_">indexOf</span>(<span class="string">&#x27;stream&#x27;</span>) &lt; <span class="number">0</span>) <span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">static</span> <span class="title function_">getName</span>(): string &#123;</span><br><span class="line">      <span class="keyword">return</span> <span class="string">&#x27;stream&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="4-3-mongodb-数据库的权限"><a href="#4-3-mongodb-数据库的权限" class="headerlink" title="4.3 mongodb 数据库的权限"></a>4.3 mongodb 数据库的权限</h3><p>这里尽量不要使用root权限的数据库角色，可以创建一个只有当前数据库权限的角色，具体可以网上找相关文档，怎么为某个collection创建账户。</p><h1 id="实机演示"><a href="#实机演示" class="headerlink" title="实机演示"></a>实机演示</h1><h2 id="1-提交素材，创建任务"><a href="#1-提交素材，创建任务" class="headerlink" title="1. 提交素材，创建任务"></a>1. 提交素材，创建任务</h2><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/upload.gif"></p><h2 id="2-获取生成图片"><a href="#2-获取生成图片" class="headerlink" title="2. 获取生成图片"></a>2. 获取生成图片</h2><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/done.gif"></p><h2 id="3-展示大厅（待完善）"><a href="#3-展示大厅（待完善）" class="headerlink" title="3. 展示大厅（待完善）"></a>3. 展示大厅（待完善）</h2><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829104459820.png" alt="image-20240829104459820"></p><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><p>当然现在目前这个还是内测版本，功能还不够健全，还有很多地方需要打磨，包括用户信息页面的展示是否合理,UI的排版,数据库表的设计等等</p><p>通过观察生活用现有的技术创造一些价值，对我来说就是一种幸福且有意义的事儿。</p><blockquote><p>如果想要体验的可以后台私信我。如果你也有很棒的想法想交流一下，也可以私我。</p></blockquote><p>我是dev，下期见（太懒了我，更新频率太低）</p><p><a href="blog.jzxer.cn">个人博客</a></p><p><a href="note.jzxer.cn">灵感中心</a></p>]]></content>
    
    
    <summary type="html">故事起源在和一个妹子去逛衣服店的时候，试来试去的难以取舍，最终消耗了我一个小时。虽然这个时间不多...</summary>
    
    
    
    <category term="灵感" scheme="https://blog.jzxer.cn/categories/%E7%81%B5%E6%84%9F/"/>
    
    
    <category term="AI" scheme="https://blog.jzxer.cn/tags/AI/"/>
    
    <category term="fashion" scheme="https://blog.jzxer.cn/tags/fashion/"/>
    
    <category term="穿搭" scheme="https://blog.jzxer.cn/tags/%E7%A9%BF%E6%90%AD/"/>
    
  </entry>
  
  <entry>
    <title>【nas专栏】用私有云 nas 搭建 gitea 仓库的快乐你不懂</title>
    <link href="https://blog.jzxer.cn/20240730/20240730-nas_gitea/"/>
    <id>https://blog.jzxer.cn/20240730/20240730-nas_gitea/</id>
    <published>2024-07-30T07:22:00.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>阅读提示：在我之前的 <a href="https://juejin.cn/post/7360980866794946570">文章</a> 介绍了如何搭建一个自己的私有云nas服务的思路和方法。本文对自己有 nas 私有云或者服务器，并且有docker的胖友帮助可能更多，其它胖友可以选择性观看</p></blockquote><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>对于开发人员来说，最重要的莫过于自己写的代码（质量咱先不说）。虽然现在有很多的的代码托管平台，比如：github、gitee、coding、aliyun…</p><p>但是！！</p><p>最终你的代码都是放在别人家的服务器上，虽然大公司大平台理论不会出现什么意外，但是由于国内的政策，指不定哪天你的<strong>代码由于某某政策就被封了</strong>，又或者是公司运维是个实习生，一不小心把 mv 写成了 rm -rf</p><p>所以代码掌握在别人手里，你永远没有主动权，国内某某云盘和谐视频资源就是一个很好的例子。人家想怎么样<strong>你没得选。只能任人鱼肉</strong>！！！</p><p>我一个老油条开发哪能受的了这委屈，就开始想着用我 nas 上的 docker 镜像本地部署一套。</p><h2 id="文章大纲"><a href="#文章大纲" class="headerlink" title="文章大纲"></a>文章大纲</h2><ol><li>介绍</li><li>环境配置</li><li>gitea 搭建</li><li>迁移项目到 gitea</li><li>总结</li><li>其它</li></ol><h3 id="1-介绍"><a href="#1-介绍" class="headerlink" title="1. 介绍"></a>1. 介绍</h3><p>gitea 是目前市面上非常轻量化的代码管理仓库,它的优势主要有：</p><ol><li><p>安装和配置简单：可视化界面部署</p></li><li><p>性能强，速度快：底层用的 go 编写</p></li><li><p>兼容性好：完全兼容 git</p></li><li><p>占用内存超级小：到底有多小呢，看下图</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829105415239.png" alt="image-20240829105415239"></p></li></ol><blockquote><p>我转头看看 gitlab 快3个G的安装大小，这还要什么自行车，四舍五入一下等于不占内存，果断选择gitea。</p></blockquote><ol start="5"><li>拓展性强：企业和个人都可以根据需要自己添加拓展</li></ol><h3 id="2-环境配置"><a href="#2-环境配置" class="headerlink" title="2. 环境配置"></a>2. 环境配置</h3><p>本文会以黑群晖的 docker 方案为主。（理论有 docker 的服务器方法也是一样的。）<br>所以胖友首先你得先大概了解群晖，后面看起来不会那么吃力。</p><h4 id="2-1-前期准备"><a href="#2-1-前期准备" class="headerlink" title="2.1 前期准备"></a>2.1 前期准备</h4><p>在 docker container 安装gitea 和 gitea-runner 两个镜像文件：</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829105441423.png" alt="image-20240829105441423"></p><h4 id="2-2-创建docker用户组"><a href="#2-2-创建docker用户组" class="headerlink" title="2.2 创建docker用户组"></a>2.2 创建docker用户组</h4><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829105505710.png" alt="image-20240829105505710"></p><ol><li>打开控制面板 - 进入用户与群组</li><li>新增群组</li><li>自定义群组名称，我这里是docker</li><li>给 docker 群组分配 docker 文件夹的权限</li><li>一直点下一步，直至生效</li></ol><h4 id="2-3-添加-gitea-账号"><a href="#2-3-添加-gitea-账号" class="headerlink" title="2.3 添加 gitea 账号"></a>2.3 添加 gitea 账号</h4><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829105527930.png" alt="image-20240829105527930"></p><p>和上面用户群组的操作基本一致，区别是在【用户群组】那把 docker 的群组权限给这个新创建的 gitea 用户。然后一直默认下一步即可。</p><p>至此，基本的环境配置已经完成，开始装机。</p><h3 id="3-gitea-搭建"><a href="#3-gitea-搭建" class="headerlink" title="3. gitea 搭建"></a>3. gitea 搭建</h3><p>进入 docker container 运行上文下载的镜像文件。（下文中我的镜像是运行中，所以是不可编辑状态，不影响安装流程）</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829105540884.png" alt="image-20240829105540884"></p><h4 id="3-1-给镜像实例命名"><a href="#3-1-给镜像实例命名" class="headerlink" title="3.1 给镜像实例命名"></a>3.1 给镜像实例命名</h4><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829105552073.png" alt="image-20240829105552073"></p><h4 id="3-2-端口和文件映射"><a href="#3-2-端口和文件映射" class="headerlink" title="3.2 端口和文件映射"></a>3.2 端口和文件映射</h4><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829105605716.png" alt="image-20240829105605716"></p><p>其中前面是本地服务器映射路径，后面是容器内的映射：</p><ol><li>4122 映射 gitea 容器的 ssh 免密登录端口</li><li>4100 映射 gitea 容器的服务端口 </li><li>&#x2F;docker&#x2F;gitea 映射容器的 &#x2F;data 文件夹，用来存储 gitea 服务的数据（&#x2F;docker&#x2F;gitea 这个路径可以自定义更改）</li><li>&#x2F;docker&#x2F;gitea&#x2F;repositories 映射容器的 &#x2F;data&#x2F;git&#x2F;repositories 文件夹,里面是所有的git仓库地址（&#x2F;docker&#x2F;repositories 这个路径可以自定义更改）</li></ol><h4 id="3-3-环境变量映射"><a href="#3-3-环境变量映射" class="headerlink" title="3.3 环境变量映射"></a>3.3 环境变量映射</h4><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829105620231.png" alt="image-20240829105620231"></p><ul><li>USER：填写上文创建的那个账号，我这里是：gitea</li><li>GITEA_CUSTOM：这个默认就好</li><li>USER_UID: 执行以下命令获取</li><li>USER_GID：执行以下命令获取</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">devlifestyle:~$ <span class="built_in">id</span> gitea</span><br><span class="line">uid=1029(gitea) gid=100(<span class="built_in">users</span>) <span class="built_in">groups</span>=100(<span class="built_in">users</span>),65538(docker)</span><br></pre></td></tr></table></figure><p>其它参数都不用改，直接默认下一步启动就可以了。</p><h4 id="3-4-配置-gitea"><a href="#3-4-配置-gitea" class="headerlink" title="3.4 配置 gitea"></a>3.4 配置 gitea</h4><p>容器启动后，访问 <code>http://ip:4100</code> 进入 Gitea 的配置页面。</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829105649654.png" alt="image-20240829105649654"></p><p>确认无误后点击确认，即可进入gitea界面</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829105702810.png" alt="image-20240829105702810"></p><h3 id="4-迁移其它仓库项目"><a href="#4-迁移其它仓库项目" class="headerlink" title="4. 迁移其它仓库项目"></a>4. 迁移其它仓库项目</h3><p>gitea 支持其它仓库一键同步的功能，目前主流的 git 仓库平台都是支持的，即使不支持，只要符合git规范的也可以迁移过来。只是不能批量迁移，你只能手动一个个去拉取。</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829105714915.png" alt="image-20240829105714915"></p><h3 id="5-总结"><a href="#5-总结" class="headerlink" title="5. 总结"></a>5. 总结</h3><p>本篇文章写到这，其实发现如果是自己有个服务器，有docker 不是nas环境也是可以使用的</p><p>如果从个人角度出发，加上你自己的服务器配置不高，我是不建议安装 gitlab 的，光快 3G 的内存不说，其实里面的很多功能你这辈子也用不上。写个前后端项目，然后用 gitea action 自动部署，有的时候几个人一起协同写个项目，整个工作流都很丝滑，完全够用。</p><p>下篇文章我介绍一下怎么接入 gitea action 实现自动部署，让你解放双手，只需推送代码，即可享受即推即用的快乐。还不了解 gitea action 是啥的朋友可以去看看我之前写的<a href="https://juejin.cn/post/7348703569053597733">《通过 gitHub Action 自动发布博客文章》</a>，原理是一样的。</p><h3 id="6-其它"><a href="#6-其它" class="headerlink" title="6. 其它"></a>6. 其它</h3><p>希望我的分享能帮到你。</p><p>dev，一个艺术家，非传统前端架构师，坚持健身（一周三练）、在学 popping，会🎸、会📹、会🎨、喜欢自驾看世界，爱思考，爱生活。梦想40岁退休。<br><a href="blog.jiangzhixiong.com">个人博客</a></p><p>全网唯一ID: dev的艺术空间</p>]]></content>
    
    
    <summary type="html">所以代码掌握在别人手里，你永远没有主动权，国内某某云盘和谐视频资源就是一个很好的例子...</summary>
    
    
    
    <category term="nas" scheme="https://blog.jzxer.cn/categories/nas/"/>
    
    
    <category term="私有云" scheme="https://blog.jzxer.cn/tags/%E7%A7%81%E6%9C%89%E4%BA%91/"/>
    
    <category term="git" scheme="https://blog.jzxer.cn/tags/git/"/>
    
    <category term="群晖" scheme="https://blog.jzxer.cn/tags/%E7%BE%A4%E6%99%96/"/>
    
  </entry>
  
  <entry>
    <title>纠正一个 qiankun 使用的错误 🤏</title>
    <link href="https://blog.jzxer.cn/20240529/20240506_a_error_about_qiankun/"/>
    <id>https://blog.jzxer.cn/20240529/20240506_a_error_about_qiankun/</id>
    <published>2024-05-29T14:11:41.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>个人观点，仅供参考</p></blockquote><h2 id="起因"><a href="#起因" class="headerlink" title="起因"></a>起因</h2><p>最近几个月，由于一直在研究关于微前端架构，和帮助组员分享微前端的使用以及各种规范的制定。所以难免会上网求助网友，通过搜索文章来找答案。在这个找答案的过程中，我是挺失望的，10篇文章9篇不合格，讲的是啥玩意儿。</p><p>我发现很多人的文章里面，由于自己可能对概念了解的不够深，自己分析错了方向，从而其实会对我们产生一些误导，因为就即使是官方出的文档，你也不能保证它说的概念是对的。</p><p>如果使用的是 <strong>qiankun</strong>，并且你的是单端口应用，那么你就根本没必要使用下面这个配置，否则你所谓的微前端实质上 <strong>根本没生效</strong>，虽然你确实能够正常访问到你的项目，但是主子应用之间根本没关联上，<strong>all in one</strong> 的目的就是个摆设。<br><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829111053713.png" alt="image-20240829111053713"></p><p>正确的做法是，只需要做到把子应用放在主应用的目录下那一步就够了，在主应用里注册好相关的应用信息，子应用设置好对应的 <strong>pablicPach</strong> 就ok👌。上面那个过程属于画蛇添足。</p><p>为什么我观察到了这个问题？问的好，因为我在主应用全部挂载完成的生命周期打印了一个日志没有输出，子应用的已挂在到主应用上日志也没有输出。那从我的角度看，这个就算不上是 <strong>真正意义上的微前端</strong>。只能算是 <strong>使用同一个端口nginx转发的不同应用。</strong></p><p>他们之间是有本质区别的，因为如果只是 <strong>nginx</strong> 路由转发，我不用微前端也能做到相同的事儿。</p><h2 id="思考"><a href="#思考" class="headerlink" title="思考"></a>思考</h2><p>到这里，其实问题已经解释的差不多了，但是我仔细想了想，为什么会出现这样的问题？<br>是因为自己懒惰，还是因为市面上很多问题其实问题解决方案都停留在表面。根本不够深入。</p><p>那就造成了一个现象：自己变得懒了，解决问题的一方又是半桶水。恶性循环。最终自己本来有能力解决这个问题，也变得像太久没使用的齿轮生了锈。</p><p>我想我还是让自己这个齿轮动起来吧。</p><h2 id="自我介绍"><a href="#自我介绍" class="headerlink" title="自我介绍"></a>自我介绍</h2><p>一个艺术家，非传统前端，最近在学popping，喜欢自驾，爱思考，爱生活。</p><blockquote><p>生命很短，不要被自己的大脑束缚，做你想做的。    - jiangzhixiong</p><p><a href="https://blog.jiangzhixiong.com/">博客</a><br>[灵感笔记](</p></blockquote>]]></content>
    
    
    <summary type="html">最近几个月，由于一直在研究关于微前端架构，和帮助组员分享微前端的使用以及各种规范的制定。所以难免会上网求助网友，通过搜索文章来找答案。在这个找答案的过程中，我是挺失望的，10篇文章9篇不合格，讲的是啥玩意儿。</summary>
    
    
    
    <category term="前端" scheme="https://blog.jzxer.cn/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="微前端" scheme="https://blog.jzxer.cn/tags/%E5%BE%AE%E5%89%8D%E7%AB%AF/"/>
    
    <category term="microApp" scheme="https://blog.jzxer.cn/tags/microApp/"/>
    
    <category term="nginx" scheme="https://blog.jzxer.cn/tags/nginx/"/>
    
  </entry>
  
  <entry>
    <title>程序员真的很死板很无聊吗？</title>
    <link href="https://blog.jzxer.cn/20240529/20240529_why_most_coder_is_boring/"/>
    <id>https://blog.jzxer.cn/20240529/20240529_why_most_coder_is_boring/</id>
    <published>2024-05-29T13:32:41.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<hr><blockquote><p>你的生活快乐吗？如果把工作和生活10等分，你会怎么分配你的时间？</p></blockquote><h2 id="故事背景"><a href="#故事背景" class="headerlink" title="故事背景"></a>故事背景</h2><p>前几天随手分享了一个关于我每天早上吃的补充剂的照片，没想到有很多小伙伴留言反馈，着实挺出乎我意料</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829110613124.png" alt="image-20240829110613124"></p><p>不禁让我想起一句自黑的老梗：想结婚找程序员，钱多话少死的早，虽然是调侃，但是也反映了大众对程序员团体的刻板映象确实很糟糕。</p><p>加上我身边很多同行业的同事这个毛病那个毛病的，30出头就脂肪肝…这也让我产生了一些思考：</p><ul><li>我们这个行业的从业者，在到了25岁、30岁、35岁、40岁的<strong>生活状况，健康状况分别是怎么样的</strong>？</li><li>会运动吗？吃的健康吗？身体还好吗？</li><li>是不是真的像网上说的一样，程序员很无聊，很宅，死板？</li></ul><p>所以我真的很好奇，大多数开发的生活状态是怎么样的，今天我分享一下我作为一个开发的日常，想看看我的生活是不是具有普遍性。（多图预警）</p><h2 id="自我介绍"><a href="#自我介绍" class="headerlink" title="自我介绍"></a>自我介绍</h2><p>先来自我介绍一下，我叫dev，今年32岁（中年男人了），是个从业快7年的前端，主攻 <strong>React</strong> 技术栈，目前在一家ToG的公司做架构师。现在一边写基建一边在带人，基本脱离了业务代码的编写（偶尔）。</p><p>工作之余会写写文章，发发视频，阐述一些我认知的价值观和能提升生活幸福度的方法。下面是我平时的生活状态，兴趣比价广泛，基本上喜欢什么干什么（人生苦短及时行乐）：</p><ol><li><p>喜欢旅游，尤其那些山山水水，它会让我的内心平静安定<br><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829110640986.png" alt="image-20240829110640986"><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829110727499.png" alt="image-20240829110727499"></p></li><li><p>喜欢画画，从初中开始，课本就是我的绘画本</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829110801814.png" alt="image-20240829110801814"></p></li><li><p>会弹吉他，大学玩过乐队，也受邀在很多地方表演过<br><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829110822324.png" alt="image-20240829110822324"></p></li><li><p>目前喜欢上了popping，因为它很酷【在学】</p></li><li><p>因为很爱健康方面的知识，2024年准备考健康管理师</p></li></ol><h2 id="养生日常"><a href="#养生日常" class="headerlink" title="养生日常"></a>养生日常</h2><h3 id="7点起床，7-30做饭"><a href="#7点起床，7-30做饭" class="headerlink" title="7点起床，7.30做饭"></a>7点起床，7.30做饭</h3><p>早上7点起床，洗漱完之后，喝一杯温水，7:30 准备今天的伙食。（因为公司提供早餐，周末会自己做）</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829110843945.png" alt="image-20240829110843945"></p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829110858171.png" alt="image-20240829110858171"></p><blockquote><p>我不太喜欢吃外卖，因为我感觉很多外卖的食材不新鲜，而且大多为了可以放的时间久一点，盐分含量过高了！这是我每天早上早起做饭的动力之一。</p></blockquote><h3 id="9点到公司，开始工作吃早饭"><a href="#9点到公司，开始工作吃早饭" class="headerlink" title="9点到公司，开始工作吃早饭"></a>9点到公司，开始工作吃早饭</h3><p>早餐一般我会搭配文章开头的补剂一起吃。上班的时间我就快速跳过了，应该大部分时间和大家一样：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">9点30-12点：工作时间</span><br><span class="line">12点-1点：中饭时间</span><br><span class="line">1点-1点30：午休半小时</span><br><span class="line">1点30-5点30：工作时间</span><br></pre></td></tr></table></figure><h3 id="5点30下班"><a href="#5点30下班" class="headerlink" title="5点30下班"></a>5点30下班</h3><p>一般我会在公司待到6点半，因为我习惯6点准时吃饭，吃完之后再回来打个卡下班。常规操作。</p><p>下班之后我的安排一般是：周一8点撸铁，周三周五都有 <strong>popping</strong> 课，周二周四一般就在家写点东西，或者拍点东西，看看书啥的学习一下。</p><h2 id="周末"><a href="#周末" class="headerlink" title="周末"></a>周末</h2><h3 id="周六外出"><a href="#周六外出" class="headerlink" title="周六外出"></a>周六外出</h3><p>周五一到，令人兴奋的周末就要来了。一般周四周五就会大概想好周六的行程。有时候三五好友，有时候一个人，找个偏僻的乡村，搭个帐篷，架个躺椅，平静的过一天～（手机关机，啥都别来烦我）</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829110911853.png" alt="image-20240829110911853"></p><h3 id="周日创作"><a href="#周日创作" class="headerlink" title="周日创作"></a>周日创作</h3><p>一般很少会连续两天出去玩儿，所以周日会安排自己学习一些新的东西，比如最近就在备考健康管理师，周日基本上午都在复习，周日下午就灵活安排，可能刷刷剧，撸撸猫，兴致来了晚上也会去上课，因为周日晚上也有一节课。<br>灵感来了也会写写文章，不管技术型的或者是生活向的，想到啥写啥，我很喜欢这种自由创作的感觉。让我有对生活的掌控感。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>以上就是我的日常生活，最近很喜欢一个成语：<strong>向死而生</strong>。我认为人到了一定年纪之后就会从学生变为布道者。写这篇文章的目的也很简单，希望能通过自己的生活态度告诉外界，我们也懂生活，我们也有自己对于生活的态度。</p><p>当我们光着屁股来到这个世界上，死的时候除了我们这一辈子的经历也是光着屁股走。所以我希望死的那一天，回顾我的一生，能很有底气的告诉自己：<strong>这一生无憾了！</strong></p><p>这些年不断的犯错，不断的纠正。从以前天上地下唯我独尊的摇滚少年，到现在成熟低调的中年男人。总结下来，我发现想要的生活其实很简单：</p><ol><li><strong>有爱我和我爱的人</strong></li><li><strong>有我喜欢做的事情</strong></li><li><strong>身体健康（能比同龄人看起来年轻10岁我就心满意足了👀）</strong></li></ol><p>希望这篇文章能帮到你重新认识生活，评论区也可以留下你对自己生活的态度，和你认为对自己生活的掌控感有多少？</p><blockquote><p>感谢观看🙏</p></blockquote><h2 id="其它"><a href="#其它" class="headerlink" title="其它"></a>其它</h2><p><a href="blog.jiangzhixiong.com">个人博客</a><br>[灵感中心](</p>]]></content>
    
    
    <summary type="html">你的生活快乐吗？如果把工作和生活10等分，你会怎么分配你的时间？</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="健康" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7/"/>
    
    <category term="程序猿" scheme="https://blog.jzxer.cn/tags/%E7%A8%8B%E5%BA%8F%E7%8C%BF/"/>
    
    <category term="养生" scheme="https://blog.jzxer.cn/tags/%E5%85%BB%E7%94%9F/"/>
    
  </entry>
  
  <entry>
    <title>宝贝儿，听说 npm 你还在手动发包？</title>
    <link href="https://blog.jzxer.cn/20240520/20240520_u_still_npm_use_hand/"/>
    <id>https://blog.jzxer.cn/20240520/20240520_u_still_npm_use_hand/</id>
    <published>2024-05-20T01:34:00.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>本文涉及的技术：yml语法、changeset、git-action</p></blockquote><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>事情的是这样的，在我的仓库项目里有<strong>11 个npm包</strong>，后续可能还要增加，它们都需要定期发布到我们的 npm 私有仓库去。</p><p><img src="http://jzx-drive.oss-cn-hangzhou.aliyuncs.com/note/2024/05/21/011659-image.png" alt="image.png"></p><p>而每次发包都需要在<strong>本地经历打包</strong>这个又臭又长的过程，全程需要 <strong>15分钟</strong> 左右，<strong>什么玩意儿？</strong><br><img src="http://jzx-drive.oss-cn-hangzhou.aliyuncs.com/note/2024/05/21/011714-image.png" alt="image.png"><br>为什么TMD这么久？？<strong>代码5分钟，打包半小时？</strong></p><p>关键我在打包的过程中还什么都不能做，只能等待它完成，这肯定是有问题的，所以我就开始找方案，能不能有个优化方案，让我只需要执行推送代码的步骤，就能实现<strong>自动发布？</strong></p><h2 id="技术调研"><a href="#技术调研" class="headerlink" title="技术调研"></a>技术调研</h2><p>说干就干，首先我们整理出思维导图，在这个过程中我们具体需要经历哪些步骤：</p><p><img src="http://jzx-drive.oss-cn-hangzhou.aliyuncs.com/note/2024/05/21/011736-image.png" alt="image.png"></p><p>我们可以看到，在提交代码之后的步骤，就是我们需要交给机器去做的部分，这部分也是占用最多时间的部分。也是我最头疼最想搞定的部分。</p><p>根据思维导图可以看到，开发完成之后我们有两个关键步骤：</p><ol><li>生成变更日志、统一更改npm包版本</li><li>将其它任务交给 gitHook。不懂<a href="https://github.com/features/actions">actions</a>的同学可以去这先学习一下基本的api。</li></ol><h2 id="落地实践"><a href="#落地实践" class="headerlink" title="落地实践"></a>落地实践</h2><h3 id="第一步：生成日志"><a href="#第一步：生成日志" class="headerlink" title="第一步：生成日志"></a>第一步：生成日志</h3><p>代码开发完成之后，我们需要记录一下我们做了哪些变更，这一步我们需要安装一个包管理器 <strong>changeset</strong>，然后执行：</p><blockquote><p>pnpx changeset add</p></blockquote><p><img src="http://jzx-drive.oss-cn-hangzhou.aliyuncs.com/note/2024/05/21/011820-add.gif" alt="changest.gif"></p><p>然后就会在对应的npm包根目录下的changelog.md 生成日志，major（大版本）、minor（小版本）、patch（补丁）。选择自己想要的。如下图：</p><p><img src="http://jzx-drive.oss-cn-hangzhou.aliyuncs.com/note/2024/05/21/011836-image.png" alt="image.png"></p><h3 id="第1-5步：打版本号"><a href="#第1-5步：打版本号" class="headerlink" title="第1.5步：打版本号"></a>第1.5步：打版本号</h3><p>继续执行：</p><blockquote><p>npx changeset version</p></blockquote><p>这一步的作用是帮你自动更改所有npm包 <strong>package.json下的版本号</strong>。</p><h3 id="第二步：配置-github的workflow脚本"><a href="#第二步：配置-github的workflow脚本" class="headerlink" title="第二步：配置 github的workflow脚本"></a>第二步：配置 github的workflow脚本</h3><p>看到这里我假设你知道关于yml的基本语法了。（乖，看不懂别硬看了👀）</p><p>在项目根目录创建 .github&#x2F;workflows 文件夹，在文件夹内取一个以yml结尾的文件，比如 deploy.yml, 内容的话可以参考我下面的。（当然git-actions商店有很多成品脚本，你可以选择自己想要的，在原有的基础上更改）</p><p>直接上代码：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">nicecode</span> <span class="string">flow</span>     <span class="string">//</span> <span class="string">脚本名称</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span> [<span class="string">&#x27;main&#x27;</span>]      <span class="string">//</span> <span class="string">监听哪个分支</span></span><br><span class="line"></span><br><span class="line"><span class="attr">permissions:</span>                </span><br><span class="line">  <span class="attr">contents:</span> <span class="string">read</span>            </span><br><span class="line">  <span class="attr">pages:</span> <span class="string">write</span></span><br><span class="line">  <span class="attr">id-token:</span> <span class="string">write</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">publish-npm:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span>         <span class="string">//</span> <span class="string">运行服务器环境</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span>            <span class="string">//</span> <span class="string">需要的依赖镜像</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/setup-node@v3</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="number">20</span></span><br><span class="line">          <span class="attr">registry-url:</span> <span class="string">https://registry.npmjs.org</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Setup</span> <span class="string">pnpm</span>                 <span class="string">//</span> <span class="string">安装</span> <span class="string">pnpm</span> <span class="string">依赖</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">pnpm/action-setup@v3</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">version:</span> <span class="number">8</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">pnpm</span> <span class="string">install</span>                <span class="string">//</span> <span class="string">安装项目依赖</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">pnpm</span> <span class="string">run</span> <span class="string">npm:build</span>          <span class="string">//</span>  <span class="string">打包npm包</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">pnpm</span> <span class="string">run</span> <span class="string">pub</span>                <span class="string">//</span>  <span class="string">发布npm包</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">          <span class="attr">NODE_AUTH_TOKEN:</span> <span class="string">$&#123;&#123;secrets.npm_token&#125;&#125;</span>         <span class="string">//</span> <span class="string">给于npm包的发布权限</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">docs-build</span>                                  <span class="string">//</span> <span class="string">//</span>  <span class="string">打包文档,如果你没有对应的文档，这里可以跳过不配置</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">pnpm</span> <span class="string">run</span> <span class="string">docs:build</span>                          </span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">docs-deploy</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">peaceiris/actions-gh-pages@v3</span>              <span class="string">//</span> <span class="string">发布文档</span>     </span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">github_token:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.ACTION_SECRET</span> <span class="string">&#125;&#125;</span>       <span class="string">//</span> <span class="string">给于仓库推送代码到</span> <span class="string">gh-page</span> <span class="string">分支的权限</span></span><br><span class="line">          <span class="attr">publish_dir:</span> <span class="string">./docs-dist</span></span><br></pre></td></tr></table></figure><p>我主要提示几个配置的重点：</p><ol><li>npm的token的获取，可以通过npm账号的 accessToken 页面获取（<a href="https://www.npmjs.com/settings">听说你在找我</a>）：<br><img src="http://jzx-drive.oss-cn-hangzhou.aliyuncs.com/note/2024/05/21/011849-image.png" alt="image.png"></li><li>gitAction token 则到github的token页获取 ，如果你的npm包没有文档类打包类的需求，这一部分可以不配置（<a href="https://github.com/settings/tokens">戳我</a>）<br><img src="http://jzx-drive.oss-cn-hangzhou.aliyuncs.com/note/2024/05/21/011857-image.png" alt="image.png"></li></ol><p>配置完之后，在github上的actions界面就可以看到执行中的脚本，大概长成下面这样：</p><p><img src="http://jzx-drive.oss-cn-hangzhou.aliyuncs.com/note/2024/05/21/011905-image.png" alt="image.png"><br><img src="http://jzx-drive.oss-cn-hangzhou.aliyuncs.com/note/2024/05/21/011913-image.png" alt="image.png"></p><blockquote><p>如果你的脚本前面全是✔，恭喜你，成功生效了！</p></blockquote><h2 id="关于我"><a href="#关于我" class="headerlink" title="关于我"></a>关于我</h2><p>一个艺术家，非传统前端架构师，最近在学popping，喜欢自驾旅游，爱思考，爱生活。</p><p><img src="http://jzx-drive.oss-cn-hangzhou.aliyuncs.com/note/2024/05/21/012217-image.png" alt="image.png"></p><blockquote><p>生命很短，做你想做的。 -  dev<br>首发：<a href="https://blog.jiangzhixiong.com/">个人博客</a>、<a href="https://note.jzxer.cn/">灵感笔记</a></p></blockquote>]]></content>
    
    
    <summary type="html">而每次发包都需要在本地经历打包这个又臭又长的过程，全程需要15分钟左右，什么玩意儿？...</summary>
    
    
    
    <category term="前端" scheme="https://blog.jzxer.cn/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="CI" scheme="https://blog.jzxer.cn/tags/CI/"/>
    
    <category term="github" scheme="https://blog.jzxer.cn/tags/github/"/>
    
    <category term="npm" scheme="https://blog.jzxer.cn/tags/npm/"/>
    
  </entry>
  
  <entry>
    <title>答应我，不要再用console.log调试了</title>
    <link href="https://blog.jzxer.cn/20240428/20240418_dont_use_consolelog/"/>
    <id>https://blog.jzxer.cn/20240428/20240418_dont_use_consolelog/</id>
    <published>2024-04-28T06:11:41.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<p>事情是这样的，因为我经常会接到一些 <strong>CR</strong>，就时常会看到推上来的 console.log 写在代码里没删…<br>这太要命了，要知道这在明治维新时期可是要浸猪笼的</p><p>所以，今天正好趁这个机会，分享一下我平时是怎么调试代码的<br><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829111647413.png" alt="image-20240829111647413"></p><blockquote><p>注意：我用的是 vscode,其它IDE按照这个思路，大差不差</p></blockquote><h2 id="1-调试配置"><a href="#1-调试配置" class="headerlink" title="1. 调试配置"></a>1. 调试配置</h2><p>要实现最基本的配置其实很简单,你只需要在你的项目根目录文件夹下创建一个 <strong>.vscode&#x2F;launch.json</strong> 文件就行，然后里面写入你想要调试的那个页面，也就是你本的开发环境起用的链接，比如我下面举个🌰：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="string">&quot;configurations&quot;</span>: [</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="string">&quot;type&quot;</span>: <span class="string">&quot;chrome&quot;</span>,       <span class="comment">// 模式：chrome、edge 可选</span></span><br><span class="line">      <span class="string">&quot;name&quot;</span>: <span class="string">&quot;lambo&quot;</span>,        <span class="comment">// 调试的名称，可以自定义</span></span><br><span class="line">      <span class="string">&quot;request&quot;</span>: <span class="string">&quot;launch&quot;</span>,    <span class="comment">// 请求配置类型：可以是 attach 或者 launch</span></span><br><span class="line">      <span class="string">&quot;url&quot;</span>: <span class="string">&quot;http://localhost:8000/meta&quot;</span>   <span class="comment">// 你当前想要调试的页面地址</span></span><br><span class="line">    &#125;,</span><br><span class="line">    ...   <span class="comment">// 你可以创建多个调试配置，方便快速启动</span></span><br><span class="line">  ]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="2-打断点"><a href="#2-打断点" class="headerlink" title="2. 打断点"></a>2. 打断点</h2><p>进入想要修改的代码页面，把鼠标移到想要打断点的那一行，把鼠标悬浮在这一行的最前面，会出现一个点，提示你打断点，你点击就会变红，比如：</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829111701107.png" alt="image-20240829111701107"></p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829111710945.png" alt="image-20240829111710945"></p><p>这个时候你打开vscode的拓展菜单上的那个小蜘蛛（根据你使用的icon库的不同，可能会有些区别）：</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829111722005.png" alt="image-20240829111722005"></p><p>你会发现你所有打的断点都会在左下角的断点面板内，你可以点击前面的勾选框选择是否需要使用这个断点：<br><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829111737970.png" alt="image-20240829111737970"></p><h2 id="3-启动调试"><a href="#3-启动调试" class="headerlink" title="3. 启动调试"></a>3. 启动调试</h2><p>确定好你需要调试的断点位置之后，点击运行，这里运行你之前配置的那个名称的脚本：<br><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829111748792.png" alt="image-20240829111748792"></p><p>然后不出意外，会新开一个chrome的页面，因为这个是vscode自带的chrome浏览器，所以它非常的纯粹，任何的数据都是一次性的，就像无痕模式一样，你关掉就彻底清除了，所以调试起来很方便。</p><p>当你跳转到你对应节点的时候，左侧变量面板，会给你展示当前断点位置所的所有变量（包括组件，全局），我们大多数时候看local面板就行：</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829111758777.png" alt="image-20240829111758777"></p><p>然后按F5跳到下一个断点，一直调试到你觉得满意的结果为止。</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829111807837.png" alt="image-20240829111807837"></p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>如果你想增加你的工作效率，并且往更高阶的前端进发，调试的能力是必不可少的，另外debug还有很多拓展性的功能，你可以借这个机会去了解一下，比如它的监视，还有调用堆栈…等等</p>]]></content>
    
    
    <summary type="html">如果你想增加你的工作效率，并且往更高阶的前端进发，调试的能力是必不可少的，另外debug还有很多拓展性的功能，你可以借这个机会去了解一下，比如它的监视，还有调用堆栈...</summary>
    
    
    
    <category term="前端" scheme="https://blog.jzxer.cn/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="vscode" scheme="https://blog.jzxer.cn/tags/vscode/"/>
    
    <category term="debug" scheme="https://blog.jzxer.cn/tags/debug/"/>
    
    <category term="chrome" scheme="https://blog.jzxer.cn/tags/chrome/"/>
    
  </entry>
  
  <entry>
    <title>【nas专栏】快速上手！家用黑群晖搭建指南（一）</title>
    <link href="https://blog.jzxer.cn/20240424/20240424_quick_nas_build/"/>
    <id>https://blog.jzxer.cn/20240424/20240424_quick_nas_build/</id>
    <published>2024-04-24T08:22:41.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<ul><li><blockquote><p>应很多小伙伴的都想了解 <strong>NAS</strong> 相关的知识，借此机会记录一下这俩月折腾 <strong>NAS</strong> 的经历，希望对大家JYM有用，这一系列的文章会一直更新下去，手把手带你从0开始了解 <strong>NAS</strong></p></blockquote><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>我搭建黑群晖的初衷呢，一方面感觉是买<strong>云服务器很贵</strong>；另外一方面的就是我的隐私<strong>信息安全得不到保障</strong>，比如某某盘总是莫名其妙删我东西，某某平台删我评论一样，我很烦。说到底数据的掌控权不在我的手里我就会没有安全感。</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829112217452.png" alt="image-20240829112217452"><br>当然抛开以上数据安全层面来说，更最重要的一点是：我想要搭建自己的：<strong>电影院，云端相册，云图书馆、云笔记本</strong>；我希望我所有的资源都在云上有一份，能够有一个<strong>控制权完全在我手上</strong>的私人网络领地，让我可以猥琐欲为！</p><p>经过多方调研，黑群晖就非常符合我的应用场景。早就听说了它的大名，奈何一直没去实操，实操之后才发现真的香！<br>今天我就分享一下我搭建黑群晖云端数据储存的解决方案。</p><h3 id="1-硬件选择"><a href="#1-硬件选择" class="headerlink" title="1. 硬件选择"></a>1. 硬件选择</h3><p>第一步，明确一下搭建黑群晖涉及的<strong>硬件选择</strong>：首先你得准备一台主机，无论是旧电脑还是新购置的小型服务器都行。咱们要控制成本，但也不能图便宜买了不合适的硬件， 因为一般群晖都需要24小时在线，所以硬件方面的尽量需要选择一些能够长时间待机的硬件。</p><ul><li><p><strong>硬盘：</strong> 我推荐选择nas专属硬盘或者是固态硬盘， 因为这里我建议最低配置买两个1T+的固态硬盘，如果预算不足的同学可以买一个固态和一个机械，后面我会教你怎么样去合理的使用它们。</p></li><li><p><strong>内存：</strong> 建议最少4G以上,当然2G也能用，看你自己</p></li><li><p><strong>CPU：</strong> 选择i3 8100或者8400以上（预算有限 AMD 也不是不可以）<br>其它的配置按自己的经济实力来搭配。</p></li></ul><h3 id="2-制作启动盘"><a href="#2-制作启动盘" class="headerlink" title="2. 制作启动盘"></a>2. 制作启动盘</h3><p>硬件选好之后，接下来就是开始系统的安装，首先<strong>制作启动U盘</strong>，我们会用到群晖的DSM系统，目前最新的版本是7.2系统，建议如果电脑配置比较低的话，选6版本的系统，如果电脑配置高的话，可以尝试选择7的系统，考虑到6系统比较稳定，7系统功能方面会更加的完善，这个看个人的选择。<br><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829112234365.png" alt="image-20240829112234365"></p><blockquote><p>市面上的安装系统真的很全面了，除了一些定制化场景，其它真的就无脑下一步就够了…</p></blockquote><h3 id="3-系统安装"><a href="#3-系统安装" class="headerlink" title="3. 系统安装"></a>3. 系统安装</h3><p>启动U盘制作好之后，通过U盘启动电脑并安装DSM，首先找到你<strong>电脑的bios系统启动方式</strong>，设置为U盘启动，然后会进入引导界面，这个时候等个几分钟，大概出来一个IP地址的界面，通知你说 <strong>success</strong>，类似下图：<br><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829112244966.png" alt="群晖引导界面"><br>意思是你可以通过这个地址访问了，那恭喜你安装成功了，通过界面提供的账号密码登录到指定ip的服务器上去设置自己的账号即可。</p><p><img src="https://ji-blog-static.oss-cn-beijing.aliyuncs.com/blog/image-20240829112310056.png" alt="image-20240829112310056"></p><p>进入系统界面大概长这样。整个搭建过程可以说是既实用又能带给你成就感的DIY项目。一旦搭建成功，你就可以远程访问你的文件，享受私人云服务的快感了。</p><h3 id="推荐程序"><a href="#推荐程序" class="headerlink" title="推荐程序"></a>推荐程序</h3><p>搭建好的同学可以先试着下载这些应用先自己摸索一下：</p><ul><li>Video station - 私人电影院（这个装依赖套件可能需要个脚本）</li><li>Note station 云记事本</li><li>photo station - 云相册</li><li>drive station - 云硬盘</li><li>kavita - 云图书馆</li><li>download station - 离线下载套件</li><li>hyper backup - 数据备份</li></ul><h2 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h2><p>现在是4月23日晚上23:21分，没想到这个点还在码字，这个文章我也是想到啥写了啥，没怎么太多的逻辑性，怎么舒服怎么来（虽然脑子挺懵），所以如果大家觉得还有疑惑的想了解的地方可以在下方留言，看到了都会回。</p><p>下一期分享：<strong>《NAS上的热门程序具体怎么使用》</strong>。</p></li></ul>]]></content>
    
    
    <summary type="html">我搭建黑群晖的初衷呢，一方面感觉是买云服务器很贵；另外一方面的就是我的隐私信息安全得不到保障，比如某某盘总是莫名其妙删我东西，某某平台删我评论一样，很烦...</summary>
    
    
    
    <category term="nas" scheme="https://blog.jzxer.cn/categories/nas/"/>
    
    
    <category term="黑群晖" scheme="https://blog.jzxer.cn/tags/%E9%BB%91%E7%BE%A4%E6%99%96/"/>
    
    <category term="私有云" scheme="https://blog.jzxer.cn/tags/%E7%A7%81%E6%9C%89%E4%BA%91/"/>
    
  </entry>
  
  <entry>
    <title>服务器运维管理面板1panel入门配置</title>
    <link href="https://blog.jzxer.cn/20240415/20240415-use1Panel/"/>
    <id>https://blog.jzxer.cn/20240415/20240415-use1Panel/</id>
    <published>2024-04-15T12:32:41.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>自己有一台服务器，但是很多时候的处理，比如新应用的安装，性能监控，都是需要手动登录vps服务器去查看的，一直在尝试找一款能直接使用的类似宝塔的运维面板。</p><p>功夫不负有心人，找到了 1panel, 整体来说，用着还挺舒服的。</p><p>正巧借这个机会，记录一下踩坑日记，简单的可以官网看懂的的我这里就忽略了，以下是我觉得几个比较难理解的板块：</p><ol><li>登录模块</li><li>网站域名映射</li><li>https证书申请注意事项</li><li>守护进程管理</li><li>面板如何转换为域名登录</li></ol><blockquote><p>待更新…</p></blockquote>]]></content>
    
    
    <summary type="html">自己有一台服务器，但是很多时候的处理，比如新应用的安装，性能监控，都是需要手动登录vps服务器去查看的，一直在尝试找一款能直接使用的类似宝塔的运维面板。</summary>
    
    
    
    <category term="开发工具" scheme="https://blog.jzxer.cn/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="ECS" scheme="https://blog.jzxer.cn/tags/ECS/"/>
    
    <category term="云服务器" scheme="https://blog.jzxer.cn/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>如何使用obs 连接 LogicPro 录制视频？</title>
    <link href="https://blog.jzxer.cn/20240408/20240408_obsWithLogic/"/>
    <id>https://blog.jzxer.cn/20240408/20240408_obsWithLogic/</id>
    <published>2024-04-07T16:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>录制视频的开始工作，需要用到的工具，OBS 和 Logic Pro、声卡（midiplus studio 2）、手机（goPro）</p><h2 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h2><ol><li><p>打开 Logic Pro, 把 输入源和输出源都设置为声卡。</p></li><li><p>打开 OBS，加入 macOS 音频输入源，将源设为：桌面采集。</p></li></ol><h2 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h2><p><a href="https://community.gopro.com/s/article/GoPro-Webcam?language=en_US#gettingstartedmac">web camera</a><br><a href="https://sspai.com/post/77677">直播入门攻略</a><br><a href="https://sspai.com/post/77973">直播入门攻略2</a></p>]]></content>
    
    
    <summary type="html">想录视频的时候通过obs 连接 LogicPro 来使用处理后的音频，免去后期音频的加工</summary>
    
    
    
    <category term="自媒体" scheme="https://blog.jzxer.cn/categories/%E8%87%AA%E5%AA%92%E4%BD%93/"/>
    
    
    <category term="LogicPro" scheme="https://blog.jzxer.cn/tags/LogicPro/"/>
    
    <category term="OBS" scheme="https://blog.jzxer.cn/tags/OBS/"/>
    
  </entry>
  
  <entry>
    <title>electron 保姆级入</title>
    <link href="https://blog.jzxer.cn/20240404/20240403_firstTimeUseElectron/"/>
    <id>https://blog.jzxer.cn/20240404/20240403_firstTimeUseElectron/</id>
    <published>2024-04-04T13:32:41.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>Electron 是一个由 GitHub 开发的开源桌面应用程序开发框架，可以使用 HTML、CSS 和 JavaScript 构建跨平台的桌面应用程序，如编辑器、IDE、通讯工具等。Electron 允许开发者直接访问操作系统的原生 API，并且具有丰富的第三方库和工具支持。</p><p>适用场景: 如果你需要构建桌面应用程序，并且希望在不同的操作系统上使用相同的技术栈，并且需要充分利用操作系统的原生功能，那么 Electron 是一个不错的选择。</p><p>缺点：相较于纯原生应用，Electron 应用可能会占用更多的系统资源，并且在性能上可能略逊一筹；对于需要在移动平台上运行的应用，Electron 并不是首选方案。</p><blockquote><p>以下内容，我默认你了解前端 js、css、html 相关的知识，并且对 webpack 打包工具有一定的了解。不了解的话，我建议你去了解一下。</p></blockquote><h2 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h2><ol><li>首先你要保证你的电脑安装了 <a href="https://nodejs.org/en"><strong>node</strong></a>，并且版本在 16+。</li><li>IDE 不用我说了吧，我这里用的是 <a href="https://code.visualstudio.com/">vscode</a></li><li>建议使用 pnpm 作为安装工具，全新的安装依赖模式，扁平化管理依赖包，降低重复安装率，安装速度更快</li><li>在 .npmrc 中添加国内源，我使用的是淘宝官方镜像：<a href="https://registry.npmmirror.com/">https://registry.npmmirror.com</a></li></ol><h2 id="开发一个-Hello-World-应用"><a href="#开发一个-Hello-World-应用" class="headerlink" title="开发一个 Hello World 应用"></a>开发一个 Hello World 应用</h2><h3 id="1-首先初始化目录"><a href="#1-首先初始化目录" class="headerlink" title="1. 首先初始化目录"></a>1. 首先初始化目录</h3><p>基本的 git 仓库构建，npm init、.gitignore 安排上</p><h3 id="2-安装-Electron"><a href="#2-安装-Electron" class="headerlink" title="2. 安装 Electron"></a>2. 安装 Electron</h3><p>只需要下面一句代码</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i electron</span><br></pre></td></tr></table></figure><h3 id="3-在-package-json-中添加执行命令"><a href="#3-在-package-json-中添加执行命令" class="headerlink" title="3. 在 package.json 中添加执行命令"></a>3. 在 package.json 中添加执行命令</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="string">&quot;script&quot;</span>: <span class="string">&quot;electron .&quot;</span></span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="4-创建网页"><a href="#4-创建网页" class="headerlink" title="4. 创建网页"></a>4. 创建网页</h3><p>在 electron 中，每个窗口展示都是一个网页，可以从本地的 html 或者远程网址加载，本示例加载的是本地的 html 文件</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span> /&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- 这个 CSP 部分的介绍可以去看看关于安全的板块，建议加上 --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span></span></span><br><span class="line"><span class="tag">      <span class="attr">http-equiv</span>=<span class="string">&quot;Content-Security-Policy&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">content</span>=<span class="string">&quot;default-src &#x27;self&#x27;; script-src &#x27;self&#x27;&quot;</span></span></span><br><span class="line"><span class="tag">    /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span></span></span><br><span class="line"><span class="tag">      <span class="attr">http-equiv</span>=<span class="string">&quot;X-Content-Security-Policy&quot;</span></span></span><br><span class="line"><span class="tag">      <span class="attr">content</span>=<span class="string">&quot;default-src &#x27;self&#x27;; script-src &#x27;self&#x27;&quot;</span></span></span><br><span class="line"><span class="tag">    /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>First Electron Application<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">h1</span>&gt;</span>hello nicenote!<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;info&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>j710328466.github.io<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;./renderer.ts&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="5-创建-preload-预加载脚本"><a href="#5-创建-preload-预加载脚本" class="headerlink" title="5. 创建 preload 预加载脚本"></a>5. 创建 preload 预加载脚本</h3><p>在根目录下创建 preload.ts 文件，这个模块功能主要是把客户端的一些底层能力暴露给浏览器端，写入：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// preload.ts</span></span><br><span class="line"><span class="keyword">import</span> &#123; contextBridge  &#125; <span class="keyword">from</span> <span class="string">&#x27;electron/core&#x27;</span></span><br><span class="line"></span><br><span class="line">contextBridge.<span class="title function_">exposeInMainWorld</span>(<span class="string">&#x27;baseAPI&#x27;</span>, &#123;</span><br><span class="line">  <span class="attr">getNodeVersion</span>: <span class="function">() =&gt;</span> process.<span class="property">versions</span>.<span class="property">node</span>,   <span class="comment">// 获取node版本</span></span><br><span class="line">  <span class="attr">getChromeVersion</span>: <span class="function">() =&gt;</span> process.<span class="property">versions</span>.<span class="property">chrome</span>,  <span class="comment">// 获取chrome版本</span></span><br><span class="line">  <span class="attr">getElectronVersion</span>: <span class="function">() =&gt;</span> process.<span class="property">versions</span>.<span class="property">electron</span> <span class="comment">// 获取 electron版本</span></span><br><span class="line">  <span class="attr">setTitle</span>: <span class="function">(<span class="params">title: string</span>) =&gt;</span> ipcRenderer.<span class="title function_">send</span>(<span class="string">&#x27;set-title&#x27;</span>, title)  <span class="comment">// 设置显示的标题</span></span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p><strong>versions</strong>: 注入 windows 的全局 api 对象实例，里面透传了 node 版本号，chrome 版本号，electron 版本号，和修改标题事件</p><h3 id="6-创建-renderer-渲染层脚本"><a href="#6-创建-renderer-渲染层脚本" class="headerlink" title="6. 创建 renderer 渲染层脚本"></a>6. 创建 renderer 渲染层脚本</h3><p>这个其实就是正常开发中的 JavaScript 脚本，无非就是比原本的 windows 实例多了一些 API (这里是由 preload 注入的 baseAPI)：</p><figure class="highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> info = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;info&#x27;</span>);</span><br><span class="line">info.<span class="property">innerText</span> = <span class="string">`</span></span><br><span class="line"><span class="string">  This app is using Chrome (v<span class="subst">$&#123;baseAPI.getChromeVersion()&#125;</span>), </span></span><br><span class="line"><span class="string">  Node.js (v<span class="subst">$&#123;baseAPI.getNodeVersion()&#125;</span>), </span></span><br><span class="line"><span class="string">  Electron (v<span class="subst">$&#123;baseAPI.getElectronVersion()&#125;</span>)</span></span><br><span class="line"><span class="string">`</span>;</span><br><span class="line"></span><br><span class="line"><span class="variable language_">window</span>.<span class="property">onload</span> = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  baseAPI.<span class="title function_">setTitle</span>(<span class="string">&#x27;修改标题为-nicecode&#x27;</span>);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h3 id="5-创建主应用文件-main-ts"><a href="#5-创建主应用文件-main-ts" class="headerlink" title="5. 创建主应用文件 main.ts"></a>5. 创建主应用文件 main.ts</h3><figure class="highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; app, <span class="title class_">BrowserWindow</span>, ipcMain &#125; <span class="keyword">from</span> <span class="string">&#x27;electron/core&#x27;</span>;</span><br><span class="line"><span class="keyword">import</span> path <span class="keyword">from</span> <span class="string">&#x27;node:path&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建窗口视图，高度600 宽度 800</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">createWindow</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">const</span> win = <span class="keyword">new</span> <span class="title class_">BrowserWindow</span>(&#123;</span><br><span class="line">    <span class="attr">width</span>: <span class="number">800</span>,</span><br><span class="line">    <span class="attr">height</span>: <span class="number">600</span>,</span><br><span class="line">    <span class="attr">webPreferences</span>: &#123;</span><br><span class="line">      <span class="attr">preload</span>: path.<span class="title function_">join</span>(__dirname, <span class="string">&#x27;preload.js&#x27;</span>),</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 监听修改标题事件, 和上文中的send相呼应</span></span><br><span class="line">  ipcMain.<span class="title function_">on</span>(<span class="string">&#x27;set-title&#x27;</span>, <span class="function">(<span class="params">event, title</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> webContents = event.<span class="property">sender</span>;</span><br><span class="line">    <span class="keyword">const</span> win = <span class="title class_">BrowserWindow</span>.<span class="title function_">fromWebContents</span>(webContents);</span><br><span class="line">    win.<span class="title function_">setTitle</span>(title);</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  app.<span class="title function_">on</span>(<span class="string">&#x27;activate&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="title class_">BrowserWindow</span>.<span class="title function_">getAllWindows</span>().<span class="property">length</span> === <span class="number">0</span>) &#123;</span><br><span class="line">      <span class="title function_">createWindow</span>();</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  win.<span class="title function_">loadFile</span>(<span class="string">&#x27;index.html&#x27;</span>);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 监听 app 加载完成实例</span></span><br><span class="line">app.<span class="title function_">on</span>(<span class="string">&#x27;ready&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  <span class="title function_">createWindow</span>();</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 监听点击关闭窗口，同时销毁 app 实例</span></span><br><span class="line">app.<span class="title function_">on</span>(<span class="string">&#x27;window-all-closed&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">if</span> (process.<span class="property">platform</span> !== <span class="string">&#x27;darwin&#x27;</span>) app.<span class="title function_">quit</span>();</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><ul><li><strong>app</strong>: 控制应用的事件生命周期</li><li><strong>BrowserWindow</strong>: 创建和管理应用窗口</li><li><strong>ipcRenderer</strong>: 进程间通信模块，通过 send 创建可调用事件</li><li><strong>ipcMain</strong>: 进程间通信模块，通过 on 监听事件</li></ul><h2 id="基本概念"><a href="#基本概念" class="headerlink" title="基本概念"></a>基本概念</h2><p>结合上面的案例我们可以看到，electron 应用是分两层的，我把它定义为：一层是主应用层 main，一层是渲染层 renderer</p><p>它们的区别主要是：</p><p>主应用层：主要是用来桥接原生系统和应用，和构建这个 app 在操作系统中的展示样式，属于外框。<br>渲染层：主要就是这个应用的功能，我们可以简单的理解成，它可以独立于外壳之外单独运行的一套 H5 页面。</p><ul><li>了解 Electron 的主要 API，如 <code>app</code>、<code>BrowserWindow</code>、<code>ipcMain</code> 和 <code>ipcRenderer</code> 等</li><li>简要介绍 Electron 的进程间通信机制</li></ul><h2 id="资源与社区"><a href="#资源与社区" class="headerlink" title="资源与社区"></a>资源与社区</h2><p>我调研了相关的一系列客户端的解决方案总共有三个：electron、flutter、react-native。为啥我选择了 electron。</p><p>具体来说的话相对其它俩，我感觉上手更快，前端基本可以做到无缝衔接，没有什么额外的语法。另外一点的话它更贴近原生，后期做一些交互场景和动画也会更加丝滑。</p><p><strong>前端为啥叫前端，就是因为我们更关注视觉和交互，抛弃了这个前端还剩啥？</strong></p><h3 id="Flutter"><a href="#Flutter" class="headerlink" title="Flutter"></a>Flutter</h3><p>Flutter 是一个由谷歌开发的跨平台应用程序开发框架，可以同时用于构建 iOS、Android、Web 和桌面应用程序。Flutter 使用 Dart 编程语言，具有热重载、丰富的 UI 组件、优秀的性能和良好的可定制性等优势。</p><p>适用场景：如果你需要构建移动应用程序，并且希望在 iOS 和 Android 平台上使用相同的代码库，并且追求高性能和精美的用户界面，那么 Flutter 是一个很好的选择。</p><h3 id="React-Native"><a href="#React-Native" class="headerlink" title="React Native"></a>React Native</h3><p>React Native 是一个由 Facebook 开发的框架，用于构建原生移动应用程序，它使用 JavaScript 和 React 来编写界面和业务逻辑。React Native 允许开发者使用相同的代码库构建 iOS 和 Android 平台上的应用，同时保持接近原生应用的性能和用户体验。</p><p>适用场景：能够快速构建跨平台移动应用，减少了开发和维护成本；具有优秀的性能和用户体验，接近原生应用的效果；社区庞大，有大量的组件和库可供使用。</p><p>缺点：对于某些特定的原生功能和性能要求，可能需要编写原生代码来进行扩展和优化；在一些复杂的 UI 或动画场景下，性能可能会有所折扣。</p><h2 id="结论"><a href="#结论" class="headerlink" title="结论"></a>结论</h2><p>用 electron 搭建一个普通的 PC 客户端对于前端工程师是很简单的，语法也基本和 js 一模一样，主要是要熟悉它和操作系统的通信，可能需要更多的经验和能力。</p><p>一般情况下，PC 端应用更适合使用 Electron，因为它更贴近底层，中间有一层 node 桥接，让你调用操作系统的底层能力会更丝滑。而移动端应用更适合使用 React Native 或者 flutter，他们会让用户有更好的交互和性能体验。</p><p>下回我讲讲客户端打包，和我在打包过程中发现的一些问题，踩的一些坑。</p>]]></content>
    
    
    <summary type="html">Electron 是一个由 GitHub 开发的开源桌面应用程序开发框架，可以使用 HTML、CSS 和 JavaScript 构建跨平台的桌面应用程序，如编辑器、IDE、通讯工具等。Electron 允许开发者直接访问操作系统的原生 API，并且具有丰富的第三方库和工具支持。</summary>
    
    
    
    <category term="前端" scheme="https://blog.jzxer.cn/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="客户端" scheme="https://blog.jzxer.cn/tags/%E5%AE%A2%E6%88%B7%E7%AB%AF/"/>
    
    <category term="electron" scheme="https://blog.jzxer.cn/tags/electron/"/>
    
    <category term="混合开发" scheme="https://blog.jzxer.cn/tags/%E6%B7%B7%E5%90%88%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>electron 踩坑大全</title>
    <link href="https://blog.jzxer.cn/20240404/20240411_electronUseImprove/"/>
    <id>https://blog.jzxer.cn/20240404/20240411_electronUseImprove/</id>
    <published>2024-04-04T13:32:41.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>现在的electron社区已经非常成熟了，但是中文社区其实也不是特别的完善，因为对文档的不够熟悉可能踩了一些坑，在这里做一下记录，以便回归。</p><h2 id="进阶功能"><a href="#进阶功能" class="headerlink" title="进阶功能"></a>进阶功能</h2><h3 id="添加-filter-滤镜"><a href="#添加-filter-滤镜" class="headerlink" title="添加 filter 滤镜"></a>添加 filter 滤镜</h3><p><a href="https://www.nuevodevel.com/nuevo/showcase/filters">https://www.nuevodevel.com/nuevo/showcase/filters</a></p><h2 id="踩坑记录"><a href="#踩坑记录" class="headerlink" title="踩坑记录"></a>踩坑记录</h2><h3 id="Illegal-invocation-Function-must-be-called-on-an-object-of-type-App"><a href="#Illegal-invocation-Function-must-be-called-on-an-object-of-type-App" class="headerlink" title="Illegal invocation: Function must be called on an object of type App"></a>Illegal invocation: Function must be called on an object of type App</h3><p>这个问题主要来自，ipc 调用报错，解决方案目前也没找到：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 示例代码</span></span><br><span class="line">ipcMain.<span class="title function_">handle</span>(<span class="string">&#x27;getPlatform&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  app.<span class="title function_">getPath</span>(<span class="string">&#x27;appData&#x27;</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="string">`hi, i&#x27;m from <span class="subst">$&#123;process.platform&#125;</span>`</span>;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>这会导致在客户端调用的时候，报错。</p><h2 id="签名报错-sha512-checksum-mismatch-expected"><a href="#签名报错-sha512-checksum-mismatch-expected" class="headerlink" title="签名报错: sha512 checksum mismatch, expected"></a>签名报错: sha512 checksum mismatch, expected</h2><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sha512 checksum mismatch, expected 6LQI2d9BPC3Xs0ZoTQe1o3tPiA28c7+<span class="title class_">PY69Q</span>9i/pD8lY45psMtHuLwv3vRckiVr3Zx1cbNyLlBR8STwCdcHwtA==, got <span class="title class_">SfLnj0</span>czCr7vVbgAev1PTV7gYnEtx8gyEUGx5QIO9AWoArCPHLz8JLTKweAA42/<span class="title class_">Zysx77</span>xuhxN1cgAcjKsRZlw==</span><br></pre></td></tr></table></figure><p>参考：<a href="https://www.electron.build/code-signing">https://www.electron.build/code-signing</a></p><ul><li>将 Electron 应用打包成可执行文件</li><li>在不同平台上发布应用，如 Windows、macOS 和 Linux</li><li>选择适合的打包工具，如 electron-builder、electron-packager 等</li></ul><h2 id="进阶主题"><a href="#进阶主题" class="headerlink" title="进阶主题"></a>进阶主题</h2><ul><li>处理文件系统和网络请求</li><li>添加本地数据库支持</li><li>集成原生功能，如系统托盘、菜单栏等</li><li>实现应用更新和自动更新机制</li></ul><h2 id="性能优化与调试"><a href="#性能优化与调试" class="headerlink" title="性能优化与调试"></a>性能优化与调试</h2><ul><li>使用 Chrome 开发者工具进行调试</li><li>优化应用的启动时间和内存占用</li><li>处理大文件和复杂计算任务的性能优化技巧</li></ul><h2 id="常见问题与解决方案"><a href="#常见问题与解决方案" class="headerlink" title="常见问题与解决方案"></a>常见问题与解决方案</h2><ul><li>处理 Electron 版本升级带来的兼容性问题</li><li>解决常见的打包和发布问题</li><li>处理跨平台开发中的差异性</li></ul><h3 id="打包的时候会报错：operation-not-permitted"><a href="#打包的时候会报错：operation-not-permitted" class="headerlink" title="打包的时候会报错：operation not permitted"></a>打包的时候会报错：operation not permitted</h3><p>这个问题是我在 windows 系统上发现的，原因是当前文件夹下的文件只有只读权限，试着把只读权限关掉就好了。</p>]]></content>
    
    
    <summary type="html">现在的electron社区已经非常成熟了，但是中文社区其实也不是特别的完善，因为对文档的不够熟悉可能踩了一些坑，在这里做一下记录，以便回归。</summary>
    
    
    
    <category term="前端" scheme="https://blog.jzxer.cn/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="客户端" scheme="https://blog.jzxer.cn/tags/%E5%AE%A2%E6%88%B7%E7%AB%AF/"/>
    
    <category term="electron" scheme="https://blog.jzxer.cn/tags/electron/"/>
    
    <category term="混合开发" scheme="https://blog.jzxer.cn/tags/%E6%B7%B7%E5%90%88%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>观看行尸走肉-存活之人1</title>
    <link href="https://blog.jzxer.cn/20240404/20240404_seeWalkingDead/"/>
    <id>https://blog.jzxer.cn/20240404/20240404_seeWalkingDead/</id>
    <published>2024-04-04T07:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<h2 id="自由"><a href="#自由" class="headerlink" title="自由"></a>自由</h2><p>瑞克砍掉自己的手，只是为了能得到自由。</p><p>逃了4次，都没有成功，他想自己决定自己的生活，而不是由其它人为他决定，即使它用斧头砍断了自己的左手作为代价。</p><p>因为它知道，他不想活在一个不属于自己的世界，他想要在自己的世界活着，他希望余生能有一个幸福的家，有家人陪伴。</p><p>他是一个渴望自由的人，知道自己想要什么，我也一样，我们都在找到自己的那条路，找到自己，找到自己的生活。</p><p>虽然生活会有很多生不由己，但是选择权一直在我们的手上。我们可以随时改变。</p><p>随波逐流，逆天改命，都是一种选择。只是这个选择我们要去承受这个后果。可能会让你飞黄腾达，也可能让你一蹶不振。</p><h2 id="平静"><a href="#平静" class="headerlink" title="平静"></a>平静</h2><p>此刻我在写这篇文章的心境非常平静，像水面一样。我想通了很多东西，想明白了人活着的真正意义。</p><p>它确实在根本上来说是没有意义，但是你可以选择，去做一些事情，去度过这个人生。</p><p>碌碌无为是一种活法，勇攀高峰也是一种活法。人最终都会走向死亡，最终都会化为尘埃。</p><p>人很脆弱，人的时间也很有限，我是愿意花时间去享受生活的人。享受这个世界的点点滴滴。享受这个世界上沿途的风景。不管它怎么样，它始终都在那里。</p>]]></content>
    
    
    <summary type="html">2024年新出的行尸走肉衍生剧-存活之人1，观影有感，墙内的人无法逃离</summary>
    
    
    
    <category term="观影笔记" scheme="https://blog.jzxer.cn/categories/%E8%A7%82%E5%BD%B1%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="行尸走肉" scheme="https://blog.jzxer.cn/tags/%E8%A1%8C%E5%B0%B8%E8%B5%B0%E8%82%89/"/>
    
    <category term="美剧" scheme="https://blog.jzxer.cn/tags/%E7%BE%8E%E5%89%A7/"/>
    
    <category term="walking dead" scheme="https://blog.jzxer.cn/tags/walking-dead/"/>
    
  </entry>
  
  <entry>
    <title>纪念我的小儿子🐱</title>
    <link href="https://blog.jzxer.cn/20240401/20240401_mycatisdie/"/>
    <id>https://blog.jzxer.cn/20240401/20240401_mycatisdie/</id>
    <published>2024-04-01T14:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<p>2024年3月31日上午6点多，因为我的粗心，我可爱的宝宝木头永远离开了我，从22楼的阳台跌落下去。</p><p><img src="/img/gallery/2024/2024-04-30-3.jpg" alt="2020年刚接来的时候"></p><p>据楼下1楼的领居告诉我，它死的时候全身都是血，从眼睛耳朵流出来，奄奄一息。<br>当我听到她描述的时候，我真的很痛苦很自责，虽然我不喜欢说一些如果当时的那些大道理，但是我知道当时我注意一点的话，他可能就不会死。</p><p>想着我刚把它接来的时候它那么嫩嫩的，傻傻的，虽然也不知道出于什么目的，我也就是遵从内心，给它取了个名字叫木头。当时石灰也还在，它们经常嬉戏打闹，生活也蛮有乐趣。</p><p><img src="/img/gallery/2024/2024-04-30-5.jpg" alt="和石灰的合照"></p><p>自从石灰走了之后，我怕它孤单寂寞，正巧朋友卖猫，我就又去领养了一个布偶给它作伴，前面两只猫也是像敌人一样，后面也开始好起来了，渐渐的，生活也算是其乐融融。就这样，我和它度过了4年。</p><p><img src="/img/gallery/2024/2024-04-30-4.jpg" alt="喜欢在我练琴的时候踩我键盘"></p><p>好想它慵懒的看着我的样子，它真的非常的乖，也不喜欢闹腾，我总是戏称它为油腻大叔，它的表情也确实很油腻，每次我坐在桌子前看书或者工作的时候，它都会跳到我的腿上来，特别粘人。</p><p>有的时候它犯错了，我也会揍他，但是它也从来不记仇，该黏我的时候还是黏我。</p><p><img src="/img/gallery/2024/2024-04-30-8.JPG" alt="我生日的时候拍的一组表情包"><br><img src="/img/gallery/2024/2024-04-30-9.JPG" alt="我生日的时候拍的一组表情包2"><br><img src="/img/gallery/2024/2024-04-30-10.JPG" alt="我生日的时候拍的一组表情包3"><br><img src="/img/gallery/2024/2024-04-30-11.JPG" alt="我生日的时候拍的一组表情包4"></p><p>我因为工作原因，也因为一些个人任性的一些原因，经常搬家，最离谱的一次是从杭州搬家到上海，4个月之后又搬了回来，它这一路过来，也算是和我见了不少市面了。</p><p>它陪了我四年，给我带来了很多回忆，陪我走过了我的人生低谷期，我在这想，如果当时我那段抑郁的时候，没有它，是不是会是另外一个结果。本来我认为它会陪我更久一点，可能10年，最少也要8年吧…</p><p>但是没想到它这么早就离开了我，今天我的脑子都是懵的，我真的还没有缓过来，一时半会儿接受不了，毕竟4年，还没有适应回到家没有它盯着门口看着我的日子，没有适应它会围着我用屁股蹭我的日子。</p><p>希望天堂的你能够开心，希望你能够下辈子投一个细心的主人的胎。</p><p><img src="/img/gallery/2024/2024-04-30.jpg" alt="在上海的时候"><br><img src="/img/gallery/2024/2024-04-30-2.jpg" alt="在上海的时候"></p><p>没想到周末回一次南昌，最后是这个结果，一点预兆也没有，也没有一点信号，最后给我留下的，只有伤痛和悔恨，我应该会难受一阵子吧。</p><p>值得庆幸的是，这次有很多人帮助了我，给我出主意的画室老师，陌生的两个给我打电话发短信帮我的领居，还有告诉我它线索的一个领居。让我重新找到了人间的一些温暖，让我感受到有的时候不是没有温暖，是在于环境，你在什么样的环境下，就会酝酿出什么样的人和性格。</p><p>找到属于自己的那个圈子，找到真实的自我，可能你没那么冷血，可能这个社会没那么糟糕。</p><video src="/img/gallery/2024/2024-04-30-7.MP4" /><video src="/img/gallery/2024/2024-04-30-5.MOV" /><video src="/img/gallery/2024/2024-04-30-6.MP4" />]]></content>
    
    
    <summary type="html">2024年3月31日上午6点多，因为我的粗心，我可爱的宝宝木头永远离开了我，从22楼的阳台跌落下去。</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="养猫日志" scheme="https://blog.jzxer.cn/tags/%E5%85%BB%E7%8C%AB%E6%97%A5%E5%BF%97/"/>
    
  </entry>
  
  <entry>
    <title>2024年微前端实战详细说明（qiankun + umi + antd）</title>
    <link href="https://blog.jzxer.cn/20240325/20240325_microAppBuild/"/>
    <id>https://blog.jzxer.cn/20240325/20240325_microAppBuild/</id>
    <published>2024-03-25T13:32:41.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>接上文，因为公司新项目涉及到多个系统，且系统之间有相互共用的模块与页面，为了降低开发成本，就搭建了这套系统。<br>本文档涵盖了从环境准备到前端开发，主子项目部署、打包配置，nginx 配置等一系列关键步骤。其中 nginx 相关配置的模块我认为是最重要的模块。需要反复摩擦几次。</p><p>在开始下文前，我默认你大概了解了：umi、qiankun、antd、nginx 的使用，并对微前端的架构模式和使用场景有所了解。</p><blockquote><p>不知道？那你还不去看看相关的资料？</p></blockquote><h2 id="项目介绍"><a href="#项目介绍" class="headerlink" title="项目介绍"></a>项目介绍</h2><p>目前该项目使用微前端架构方案，一共包含 1 个主项目，4 个子项目。其中 3 个项目为业务层，1 个项目为基建层。</p><p>本文配置的子项目可以直接嵌套在主项目中，子项目也可以单独脱离出来单独使用（授权登录的话需要自己做一些额外的配置）。</p><table><thead><tr><th>项目名称</th><th>说明</th></tr></thead><tbody><tr><td>main</td><td>整套系统的框架，外壳</td></tr><tr><td>app1</td><td>a 系统</td></tr><tr><td>app2</td><td>b 系统</td></tr><tr><td>app3</td><td>c 系统</td></tr><tr><td>app4</td><td>公共能力</td></tr></tbody></table><h2 id="开发流程"><a href="#开发流程" class="headerlink" title="开发流程"></a>开发流程</h2><p>这里介绍一下，各个仓库的起始开发流程和规范。</p><h3 id="第一步：初始化开发环境"><a href="#第一步：初始化开发环境" class="headerlink" title="第一步：初始化开发环境"></a>第一步：初始化开发环境</h3><ol><li>通过 git 把仓库代码 clone 到本地，从对应的版本分支创建一条自己的 feature 分支。</li><li>执行 pnpm i, 等待依赖安装完之后，执行 pnpm run start 进行本地开发。</li><li>注入登录模块，开发环境下可以通过该配置绕过登录授权调试（<strong>重要</strong>）</li></ol><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> slave <span class="keyword">from</span> <span class="string">&#x27;@nicecode/slave&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> qiankun = &#123;</span><br><span class="line">  <span class="comment">/**</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">* 子应用的生命周期，每次进入都会调用 mount 方法，通常我们在这里触发应用的渲染方法</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  <span class="keyword">async</span> <span class="title function_">mount</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="comment">// 注入子应用登录跳转</span></span><br><span class="line">    slave.<span class="title function_">init</span>(&#123;</span><br><span class="line">      <span class="comment">// jumpToLogin: false,     // 是否跳转登录页，默认打开，如果开发调试可以关闭跳转</span></span><br><span class="line">      <span class="attr">jumpUrl</span>: <span class="string">`https://base.nicecode.com/material/login`</span>,</span><br><span class="line">    &#125;);</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>链接上的 会告诉用户跳转到哪个页面去授权登录，但是页面上要有 from 或者是 to 字段。用来授权回跳，理论上跳转的优先级是：属性 to &gt; 属性 from &gt; 链接上的 to &gt; 链接上的 from<br>一般授权成功跳转回来的链接上会带上 token 字段，例如：<br><a href="http://j710328466.github.io/nicenote?token=xxxxxxxxxx">http://j710328466.github.io/nicenote?token=xxxxxxxxxx</a></p><h3 id="第二步：代码推送"><a href="#第二步：代码推送" class="headerlink" title="第二步：代码推送"></a>第二步：代码推送</h3><ol><li>执行 git add .，暂存所有待推送文件。</li><li>执行 git commit -m “${commitMsg}” commitMsg 可以为当前的修改内容，遵循 commit 提交规范，例如：feat(package): 修改配置包属性<br>在这个阶段会执行相对应的 lint fix 和 prettier fix，不要跳过！</li><li>待 lint 校验通过之后，再执行 git push 提交代码到远程。</li><li>在 gitlab 提交 mr 到对应分支，并且指定相关人员 CR。</li></ol><h3 id="第三步：触发镜像配置-CI"><a href="#第三步：触发镜像配置-CI" class="headerlink" title="第三步：触发镜像配置 CI"></a>第三步：触发镜像配置 CI</h3><p>进入 gitlab 的流水线触发即可，再次打开服务器地址就能看到最新的页面了！</p><h2 id="项目配置"><a href="#项目配置" class="headerlink" title="项目配置"></a>项目配置</h2><p>微前端架构的好处就是整体是一个可插拔的结构，按需加载引用子项目</p><h3 id="4-1-主应用"><a href="#4-1-主应用" class="headerlink" title="4.1 主应用"></a>4.1 主应用</h3><h4 id="第一步：在-app-ts-中注册子应用"><a href="#第一步：在-app-ts-中注册子应用" class="headerlink" title="第一步：在 app.ts 中注册子应用"></a>第一步：在 app.ts 中注册子应用</h4><p>按需接入相应的应用，这里的 APP_ENV 用来区分本地环境和生产环境的加载路由，可以通过在 umijs 的 define 属性定义，再通过 npm 命令传递，详细可以参考 umijs 手册</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> qiankun = &#123;</span><br><span class="line">  <span class="attr">apps</span>: [</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">name</span>: <span class="string">&#x27;app1&#x27;</span>,</span><br><span class="line">      <span class="attr">entry</span>:</span><br><span class="line">        <span class="variable constant_">APP_ENV</span> === <span class="string">&#x27;production&#x27;</span></span><br><span class="line">          ? <span class="string">`//<span class="subst">$&#123;hostname&#125;</span>:30068/app1/`</span></span><br><span class="line">          : <span class="string">&#x27;//localhost:30068/&#x27;</span>,</span><br><span class="line">      <span class="attr">props</span>: &#123;&#125;,</span><br><span class="line">      <span class="attr">singular</span>: <span class="literal">false</span>,</span><br><span class="line">      <span class="attr">credentials</span>: <span class="literal">true</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">name</span>: <span class="string">&#x27;app2&#x27;</span>,</span><br><span class="line">      <span class="attr">entry</span>:</span><br><span class="line">        <span class="variable constant_">APP_ENV</span> === <span class="string">&#x27;production&#x27;</span></span><br><span class="line">          ? <span class="string">`//<span class="subst">$&#123;hostname&#125;</span>:30088/app2/`</span></span><br><span class="line">          : <span class="string">&#x27;//localhost:30088/&#x27;</span>,</span><br><span class="line">      <span class="attr">singular</span>: <span class="literal">false</span>,</span><br><span class="line">      <span class="attr">credentials</span>: <span class="literal">true</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">name</span>: <span class="string">&#x27;app3&#x27;</span>,</span><br><span class="line">      <span class="attr">entry</span>:</span><br><span class="line">        <span class="variable constant_">APP_ENV</span> === <span class="string">&#x27;production&#x27;</span></span><br><span class="line">          ? <span class="string">`//<span class="subst">$&#123;hostname&#125;</span>:30078/app3/`</span></span><br><span class="line">          : <span class="string">&#x27;//localhost:30078/&#x27;</span>,</span><br><span class="line">      <span class="attr">singular</span>: <span class="literal">false</span>,</span><br><span class="line">      <span class="attr">credentials</span>: <span class="literal">true</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">name</span>: <span class="string">&#x27;app4&#x27;</span>,</span><br><span class="line">      <span class="attr">entry</span>:</span><br><span class="line">        <span class="variable constant_">APP_ENV</span> === <span class="string">&#x27;production&#x27;</span></span><br><span class="line">          ? <span class="string">`//<span class="subst">$&#123;hostname&#125;</span>:30098/app4/`</span></span><br><span class="line">          : <span class="string">&#x27;//localhost:30098/&#x27;</span>,</span><br><span class="line">      <span class="attr">singular</span>: <span class="literal">false</span>,</span><br><span class="line">      <span class="attr">credentials</span>: <span class="literal">true</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">  ],</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>要注意这里的两个属性：</p><ol><li>singular：子应用是否预加载，最好设置为 false，防止其它子应用卸载的时候，控制台会报错。</li><li>credentials：这个设置了的话，请求的子应用就会默认带上 cookie 校验，这样 nginx 配置会略微有些麻烦，不过不打紧。</li></ol><h4 id="第二步：在主应用中的-umirc-ts-中注册-4-个子应用"><a href="#第二步：在主应用中的-umirc-ts-中注册-4-个子应用" class="headerlink" title="第二步：在主应用中的 umirc.ts 中注册 4 个子应用"></a>第二步：在主应用中的 umirc.ts 中注册 4 个子应用</h4><p>这个没啥好说的，就是重置了子应用的路由，映射到所有的微应用。microApp 不要错了，对应注册的子应用名称。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="attr">routes</span>: [</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="attr">name</span>: <span class="string">&#x27;应用1&#x27;</span>,</span><br><span class="line">        <span class="attr">path</span>: <span class="string">&#x27;/app1/*&#x27;</span>,</span><br><span class="line">        <span class="attr">microApp</span>: <span class="string">&#x27;app1&#x27;</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="attr">name</span>: <span class="string">&#x27;应用2&#x27;</span>,</span><br><span class="line">        <span class="attr">path</span>: <span class="string">&#x27;/app2/*&#x27;</span>,</span><br><span class="line">        <span class="attr">microApp</span>: <span class="string">&#x27;app2&#x27;</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="attr">name</span>: <span class="string">&#x27;应用3&#x27;</span>,</span><br><span class="line">        <span class="attr">path</span>: <span class="string">&#x27;/app3/*&#x27;</span>,</span><br><span class="line">        <span class="attr">microApp</span>: <span class="string">&#x27;app3&#x27;</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="attr">name</span>: <span class="string">&#x27;应用4&#x27;</span>,</span><br><span class="line">        <span class="attr">path</span>: <span class="string">&#x27;/app4/*&#x27;</span>,</span><br><span class="line">        <span class="attr">microApp</span>: <span class="string">&#x27;app4&#x27;</span></span><br><span class="line">    &#125;</span><br><span class="line">  ]</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="4-2-子应用"><a href="#4-2-子应用" class="headerlink" title="4.2 子应用"></a>4.2 子应用</h3><p>子应用相对配置简单一点，只需要修改 umijs.ts 文件的一个属性就行：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="attr">qiankun</span>: &#123;</span><br><span class="line">    <span class="attr">slave</span>: &#123;&#125;</span><br><span class="line">  &#125;</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="项目-nginx-配置"><a href="#项目-nginx-配置" class="headerlink" title="项目 nginx 配置"></a>项目 nginx 配置</h2><h3 id="主应用"><a href="#主应用" class="headerlink" title="主应用"></a>主应用</h3><p>这里我只贴出重要的部分，具体负载均衡和接口映射啥的，需要和后端协调进行修改：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  ...</span><br><span class="line">      server &#123;</span><br><span class="line">          listen       <span class="number">30058</span>;</span><br><span class="line"></span><br><span class="line">          location / &#123;</span><br><span class="line">              <span class="keyword">if</span> ($request_method = <span class="string">&#x27;OPTIONS&#x27;</span>) &#123;</span><br><span class="line">                  add_header <span class="string">&#x27;Access-Control-Allow-Origin&#x27;</span> <span class="string">&#x27;$http_origin&#x27;</span> always;</span><br><span class="line">                  add_header <span class="string">&#x27;Access-Control-Allow-Methods&#x27;</span> <span class="string">&#x27;GET, POST, OPTIONS&#x27;</span>;</span><br><span class="line">                  add_header <span class="string">&#x27;Access-Control-Allow-Credentials&#x27;</span> <span class="string">&#x27;true&#x27;</span>;</span><br><span class="line">                  add_header <span class="string">&#x27;Access-Control-Allow-Headers&#x27;</span> <span class="string">&#x27;DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorizationept&#x27;</span>;</span><br><span class="line">                  add_header <span class="string">&#x27;Access-Control-Max-Age&#x27;</span> <span class="number">1728000</span>;</span><br><span class="line">                  <span class="keyword">return</span> <span class="number">204</span>;</span><br><span class="line">              &#125;</span><br><span class="line">              add_header <span class="string">&#x27;Access-Control-Allow-Origin&#x27;</span> <span class="string">&#x27;$http_origin&#x27;</span> always;</span><br><span class="line">              add_header <span class="string">&#x27;Access-Control-Allow-Credentials&#x27;</span> <span class="string">&#x27;true&#x27;</span>;</span><br><span class="line"></span><br><span class="line">              root   /web/main;</span><br><span class="line">                  try_files $uri $uri/ /index.<span class="property">html</span>;</span><br><span class="line">              index  index.<span class="property">html</span> index.<span class="property">htm</span>;</span><br><span class="line">          &#125;</span><br><span class="line"></span><br><span class="line">          error_page   <span class="number">500</span> <span class="number">502</span> <span class="number">503</span> <span class="number">504</span>  /50x.<span class="property">html</span>;</span><br><span class="line">          location = /50x.<span class="property">html</span> &#123;</span><br><span class="line">              root   html;</span><br><span class="line">          &#125;</span><br><span class="line">      &#125;</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="子应用"><a href="#子应用" class="headerlink" title="子应用"></a>子应用</h3><p>子应用就是比主应用多了个路由的映射，和 proxy 的设置，其它都差不多。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  ...</span><br><span class="line">  server &#123;</span><br><span class="line">      listen       <span class="number">30078</span>;</span><br><span class="line"></span><br><span class="line">      location /app1 &#123;</span><br><span class="line">          <span class="comment">// proxy_set_header Host $host;</span></span><br><span class="line">          <span class="comment">// proxy_set_header X-Real-IP $remote_addr;</span></span><br><span class="line">          <span class="comment">// proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span></span><br><span class="line"></span><br><span class="line">          <span class="keyword">if</span> ($request_method = <span class="string">&#x27;OPTIONS&#x27;</span>) &#123;</span><br><span class="line">              add_header <span class="string">&#x27;Access-Control-Allow-Origin&#x27;</span> <span class="string">&#x27;$http_origin&#x27;</span> always;</span><br><span class="line">              add_header <span class="string">&#x27;Access-Control-Allow-Methods&#x27;</span> <span class="string">&#x27;GET, POST, OPTIONS&#x27;</span>;</span><br><span class="line">              add_header <span class="string">&#x27;Access-Control-Allow-Credentials&#x27;</span> <span class="string">&#x27;true&#x27;</span>;</span><br><span class="line">              add_header <span class="string">&#x27;Access-Control-Allow-Headers&#x27;</span> <span class="string">&#x27;DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorizationept&#x27;</span>;</span><br><span class="line">              add_header <span class="string">&#x27;Access-Control-Max-Age&#x27;</span> <span class="number">1728000</span>;</span><br><span class="line">              <span class="keyword">return</span> <span class="number">204</span>;</span><br><span class="line">          &#125;</span><br><span class="line">          add_header <span class="string">&#x27;Access-Control-Allow-Origin&#x27;</span> <span class="string">&#x27;$http_origin&#x27;</span> always;</span><br><span class="line">          add_header <span class="string">&#x27;Access-Control-Allow-Credentials&#x27;</span> <span class="string">&#x27;true&#x27;</span>;</span><br><span class="line"></span><br><span class="line">          try_files $uri $uri/ <span class="regexp">/app1/i</span>ndex.<span class="property">html</span>;</span><br><span class="line">          alias  /web/app1;</span><br><span class="line">          index  index.<span class="property">html</span> index.<span class="property">htm</span>;</span><br><span class="line">      &#125;</span><br><span class="line"></span><br><span class="line">      error_page   <span class="number">500</span> <span class="number">502</span> <span class="number">503</span> <span class="number">504</span>  /50x.<span class="property">html</span>;</span><br><span class="line">      location = /50x.<span class="property">html</span> &#123;</span><br><span class="line">          root   html;</span><br><span class="line">      &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>整个架构从开始环境搭建，开发到部署上线。历时大概 3 个月左右，中间碰到了挺多问题，其中关于 nginx 配置的问题是最多的，基本上就是在恶补还不知道的 nginx 知识。</p><p>其次再是相关的公司服务端 CI 部署相关的内容，因为运维方面涉及到 ducker 和 k8s，因为项目的特殊性，也不是用传统的 Jenkins 或者其它 ci 方案，并且是由同一套配置组件化来管理 nginx 配置和部署方案，所以很多时候的项目推进比较麻烦。</p><blockquote><p>简单点说就是，我不是很懂运维那套架构体系，运维说做不了或者没时间…</p></blockquote>]]></content>
    
    
    <summary type="html">接上文，因为公司新项目涉及到多个系统，且系统之间有相互共用的模块与页面，为了降低开发成本，就搭建了这套系统。</summary>
    
    
    
    <category term="前端" scheme="https://blog.jzxer.cn/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="微前端" scheme="https://blog.jzxer.cn/tags/%E5%BE%AE%E5%89%8D%E7%AB%AF/"/>
    
    <category term="microApp" scheme="https://blog.jzxer.cn/tags/microApp/"/>
    
    <category term="qiankun" scheme="https://blog.jzxer.cn/tags/qiankun/"/>
    
  </entry>
  
  <entry>
    <title>通过 gitHub Action 自动发布博客</title>
    <link href="https://blog.jzxer.cn/20240321/20240321_githubAction/"/>
    <id>https://blog.jzxer.cn/20240321/20240321_githubAction/</id>
    <published>2024-03-21T13:32:41.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>因为之前的博客升级了，并且 gh-pages deploy 的命令好像也失效了，不知道是不是这个包已经被废弃了，折腾了一段时间发现，没什么卵用，导致每次博客推送都得自己手动打包发布。</p><p>我是个极其嫌麻烦的人，这样下去，会给我高效的生活带来苦恼，所以就只好另寻方案。</p><p>之前一直了解有 github action 是个好东西，有点像我之前用的 travis-ci，所以正巧有时间，就试试看学习了解一下这玩意儿。</p><h2 id="实操过程"><a href="#实操过程" class="headerlink" title="实操过程"></a>实操过程</h2><h3 id="第一步：在项目中新增配置文件"><a href="#第一步：在项目中新增配置文件" class="headerlink" title="第一步：在项目中新增配置文件"></a>第一步：在项目中新增配置文件</h3><p>在 git 仓库的根目录下，创建一个文件夹 .github, 在该文件夹下再创建一个文件夹 workflows, 在这个文件夹下创建一个文件，以 .yml 结尾，名字可以自己自定义，比如我的比较简单，就叫 <strong>static.yml</strong></p><h3 id="第二步：配置-yml-文件"><a href="#第二步：配置-yml-文件" class="headerlink" title="第二步：配置 .yml 文件"></a>第二步：配置 .yml 文件</h3><p>我们先进到 <a href="https://github.com/actions">actions 模板页面</a>，里面有很多的模板供你选择，你可以选一个适合自己的，当然你也完全靠自己写 <a href="https://docs.github.com/en/actions/learn-github-actions">actions 学习教程</a></p><p><img src="/./imgs/githubAct_20240321-2.png" alt="image.png"></p><p>我懒人一个，所以就直接找现成的模板去使用了，我参考了两个模板，一个是 webpack 模板，一个是 html 静态页面推送模板。总结两个模板的内容后，合并的相关配置如下（其实并无大关联）：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name</span>: deploy to github-pages</span><br><span class="line"></span><br><span class="line"><span class="attr">on</span>:</span><br><span class="line">  <span class="attr">push</span>:</span><br><span class="line">    <span class="attr">branches</span>: [<span class="string">&#x27;main&#x27;</span>]</span><br><span class="line">  <span class="attr">pull_request</span>:</span><br><span class="line">    <span class="attr">branches</span>: [<span class="string">&#x27;main&#x27;</span>]</span><br><span class="line"></span><br><span class="line"><span class="attr">jobs</span>:</span><br><span class="line">  <span class="attr">deploy</span>:</span><br><span class="line">    runs-<span class="attr">on</span>: ubuntu-latest</span><br><span class="line">    <span class="attr">steps</span>:</span><br><span class="line">      - <span class="attr">uses</span>: actions/checkout@v3</span><br><span class="line">      - <span class="attr">uses</span>: actions/setup-node@v3</span><br><span class="line">        <span class="attr">with</span>:</span><br><span class="line">          node-<span class="attr">version</span>: <span class="number">20</span></span><br><span class="line">      - <span class="attr">run</span>: yarn install</span><br><span class="line">      - <span class="attr">name</span>: <span class="title class_">Build</span></span><br><span class="line">        <span class="attr">run</span>: yarn build</span><br><span class="line"></span><br><span class="line">      - <span class="attr">name</span>: <span class="title class_">Deploy</span></span><br><span class="line">        <span class="attr">uses</span>: peaceiris/actions-gh-pages@v3</span><br><span class="line">        <span class="attr">with</span>:</span><br><span class="line">          <span class="attr">github_token</span>: $&#123;&#123; secrets.<span class="property">ACTION_SECRET</span> &#125;&#125;</span><br><span class="line">          <span class="attr">publish_dir</span>: ./docs-dist</span><br></pre></td></tr></table></figure><p>解释一下这几个参数：</p><h4 id="1-name"><a href="#1-name" class="headerlink" title="1. name"></a>1. name</h4><p>就是这个模板的名称，会在 github 的 action 面板显示</p><h4 id="2-on"><a href="#2-on" class="headerlink" title="2. on"></a>2. on</h4><ul><li>push.branches: 监听的触发分支，可以设置一个，也可以设置多个分支（传数组就行）</li><li>pull_request: 拉取的时候触发</li></ul><h4 id="3-jobs"><a href="#3-jobs" class="headerlink" title="3. jobs"></a>3. jobs</h4><p>和名字的意思一样，工作流水线，我们可以拼接很多的配置来控制这条链路,我们拿上文的案例来说明：</p><ul><li><p><strong>deploy：</strong> 工作的单个 job 名称，我们可以配置很多个，简单理解就是多个 job 对应这个整体的 jobs</p></li><li><p><strong>runs-on：</strong> 当前 actions 运行的工作环境，这里设置的是 ubuntu</p></li><li><p><strong>steps：</strong> 当前 job 的运行步骤，依次执行</p></li><li></li><li><p><strong>steps.name：</strong> 下一步骤的名称，可以随意命名</p></li><li><p><strong>steps.uses:</strong> 声明使用到的镜像文件，比如本文用到了几个镜像文件：actions&#x2F;checkout@v3、 actions&#x2F;setup-node@v3、peaceiris&#x2F;actions-gh-pages@v3</p></li></ul><p>其中 actions&#x2F;setup-node@v3 用来安装 node 环境，peaceiris&#x2F;actions-gh-pages@v3 用来部署 gh-pages.</p><ul><li><p><strong>steps.with：</strong> 需要用到镜像里的什么东西，或者传递的参数,这里针对不同的镜像，传递的参数也不同，比如：peaceiris&#x2F;actions-gh-pages@v3，这个镜像，里面需要的是两个参数，一个是 github_token，一个是需要上传的文件或者文件夹 publish_dir</p></li><li><p><strong>steps.run：</strong> 执行的脚本命令</p></li></ul><p>最终到 github 的界面会以这样的刑事展示出来，如下图：</p><p><img src="/./imgs/githubAction_20240321.png" alt="image.png"></p><blockquote><p>更多参数介绍可以去看<a href="https://docs.github.com/en/actions/learn-github-actions">官方文档</a>，我这里因为就用了这么几个，就不一一展开了</p></blockquote><h2 id="链接"><a href="#链接" class="headerlink" title="链接"></a>链接</h2><p><a href="https://j710328466.github.io/">个人博客</a></p><p><a href="https://nicecoders.github.io/">nicecode</a></p>]]></content>
    
    
    <summary type="html">因为之前的博客升级了，并且 gh-pages deploy 的命令好像也失效了，不知道是不是这个包已经被废弃了，折腾了一段时间发现，没什么卵用，导致每次博客推送都得自己手动打包发布。</summary>
    
    
    
    <category term="前端" scheme="https://blog.jzxer.cn/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="github" scheme="https://blog.jzxer.cn/tags/github/"/>
    
    <category term="blog" scheme="https://blog.jzxer.cn/tags/blog/"/>
    
    <category term="ci" scheme="https://blog.jzxer.cn/tags/ci/"/>
    
  </entry>
  
  <entry>
    <title>关于外包的 SOP</title>
    <link href="https://blog.jzxer.cn/20240320/20240320_bikeProject/"/>
    <id>https://blog.jzxer.cn/20240320/20240320_bikeProject/</id>
    <published>2024-03-20T13:32:41.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>最近又来了个外包项目的咨询，正好结合这些年做外包的经验，我就开始想着是不是可以开始着手去建立一个 SOP 来方便以后接项目，一方面提升沟通效率，另外一方面也是为了让自己能完全cover住项目，不至于搞得焦头烂额。</p><p>首先项目开始，一定要和甲方明确了解以下几个点：</p><ol><li><strong>是否有 ui 稿？</strong></li><li><strong>是纯前端需求，还是要带后端？</strong></li><li><strong>需要服务器？域名？</strong></li><li><strong>工作周期？</strong></li><li><strong>预算？</strong></li></ol><p>我们就围绕这几个方面去展开。</p><h2 id="1-是否有UI稿"><a href="#1-是否有UI稿" class="headerlink" title="1. 是否有UI稿"></a>1. 是否有UI稿</h2><p>这个是很大头的一件事儿，大部分的甲方都是想找个便宜的服务商来做一个东西，关键这个东西只是一个臆想，他们可能自己都对这个东西真正是什么样子没有把握，所以他们会大概给你一个概念，然后自己想象。</p><p>这个时候，可以给对方两个方案。</p><ol><li>套模板：也就是找市面上现成的模板使用，速成，又省事儿。</li><li>外包UI：另外加钱，重新找个UI让它起草设计，这个费用大概也不低。</li></ol><h2 id="2-纯前端项目？"><a href="#2-纯前端项目？" class="headerlink" title="2. 纯前端项目？"></a>2. 纯前端项目？</h2><p>问对方是否需要后端配合，如果不需要最好，如果需要后端，问对方对后端有没有性能方面其他的要求，如果可以的话，用nodejs来写后端，这个时候就是一个人收两份钱。美滋滋。</p><p>但是如果对方对时间压的很紧，一个人短时间是搞不定，那就可以考虑外包出去。找身边的人做是最合适的。</p><h2 id="3-域名？服务器？"><a href="#3-域名？服务器？" class="headerlink" title="3. 域名？服务器？"></a>3. 域名？服务器？</h2><p>有的时候最极端的甲方是，啥都没有，就带了一张嘴来，这个时候基本就涵盖了从起草原型到项目上线整条链路的工作。这个时候就看对方能不能钱给够，如果钱不能给够，直接pass。</p><p>如果钱给够，ok。只要对方配合，国内域名备案，服务器aliyun搞定。</p><h2 id="4-工作周期"><a href="#4-工作周期" class="headerlink" title="4. 工作周期"></a>4. 工作周期</h2><p>时间压的很紧的不接，除非钱给够。</p><h2 id="5-预算"><a href="#5-预算" class="headerlink" title="5. 预算"></a>5. 预算</h2><p><strong>抠门的pass。</strong></p><p>不要廉价出卖自己的劳动力，因为廉价，你势必不会全力以赴，最后交付的结果也好不到哪里去。</p><p>对对方不负责任，对自己也不负责任。</p>]]></content>
    
    
    <summary type="html">最近又来了个外包项目的咨询，我就开始想着是不是可以开始着手去建立一个 SOP 来方便以后接项目，提升沟通效率</summary>
    
    
    
    <category term="前端" scheme="https://blog.jzxer.cn/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="外包" scheme="https://blog.jzxer.cn/tags/%E5%A4%96%E5%8C%85/"/>
    
    <category term="SOP" scheme="https://blog.jzxer.cn/tags/SOP/"/>
    
    <category term="兼职" scheme="https://blog.jzxer.cn/tags/%E5%85%BC%E8%81%8C/"/>
    
  </entry>
  
  <entry>
    <title>观影笔记之《罪恶之城》</title>
    <link href="https://blog.jzxer.cn/20240315/20240315_guiltyCity/"/>
    <id>https://blog.jzxer.cn/20240315/20240315_guiltyCity/</id>
    <published>2024-03-15T07:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>一共是有两部，影片都是由几个有些关联的小故事构成，黑白画风。</p><p>整部影片都透漏着一种另类的暴力美学，我还挺喜欢的。</p><p>尤其是 marv 这个角色，由米基洛克饰演，满满的男性荷尔蒙和雄性内核，我喜欢他的那种态度，不要怂就是干。</p><h2 id="第一部"><a href="#第一部" class="headerlink" title="第一部"></a>第一部</h2><h3 id="第一个故事-警长加里根"><a href="#第一个故事-警长加里根" class="headerlink" title="第一个故事: 警长加里根"></a>第一个故事: 警长加里根</h3><p>讲述了警长加里根，从议员儿子手上，拯救了 11 岁少女南希，并且用枪打爆了他的 dick 和右耳<br>导致这个变态不得不去整容。最后找他复仇。</p><p>然后南希爱上了这个警长，好家伙都能当人家小女孩的爸爸了。这个老牛吃嫩草真绝了，让我不由心生羡慕。</p><p>警长被关系弄坐了牢，出狱的时候被议员儿子找上门，最后反杀成功，警长为了保护南希自杀了。</p><p>总结：这个故事总体表达的是一个英雄救美人，最后为了心爱的人，愿意付出一切，乃至生命的故事。故事里面稍微穿插了一些 SM 相关的亚文化内容。</p><h3 id="第二个故事：marv复仇日"><a href="#第二个故事：marv复仇日" class="headerlink" title="第二个故事：marv复仇日"></a>第二个故事：marv复仇日</h3><p>marv 作为了个奇丑无比的男人，被 wendy 看中并且发生了一夜情，但是第二天早上，死在了床边，警察也上门找上了他。marv 一脸懵逼，就开始踏上了找凶手的路程。一路上磕磕绊绊，杀了凶手，凶手是一个狼男，冷血无情，并且吃人，marv 最后把他做成人茈，割下了他的头。</p><p>marv 最后也因为被警察误判，被绳之以法。死之前 marv 都挺淡定的，这个态度太绝了，也可能和他容易激动有关，他在电影里一直在吃精神类药物，感觉是有精神病，但是看不出来是啥病</p><p>期间有个小插曲就是，wendy 有个 双胞胎妹妹叫 cindy，一直以为是 marv 杀了她姐姐，追杀她，但是后面发现是误会，就开始全力协助 marv 复仇。</p><p>总结：marv 真的是个真男人，是那种很有原则的人，对我好的人，我肝脑涂地也要报答。路见不平拔刀相助，很纯粹的灵魂。虽然人确实是暴力了点。</p><h3 id="第三个故事：警长大战妓女"><a href="#第三个故事：警长大战妓女" class="headerlink" title="第三个故事：警长大战妓女"></a>第三个故事：警长大战妓女</h3><p>德怀特在和自己的情妇偷情，突然情妇的前男友 jack 带着一群兄弟来了，来找她麻烦，德怀特躲在厕所，中途 jack 来上厕所，德怀特给他头按在马桶里冲洗了一下，让她以后不要找他情妇的麻烦，jack 晕了过去。醒来后 jack 带着兄弟们来到了老城区，这里全是妓女的地盘，他调戏了一个路边下班的妓女，掏出枪的时候，一车的人包括 jack 都被一个女忍者杀了，清理现场的时候，发现 jack 是个警察。</p><p>因为之前警察和古城的妓女有协议，互相不侵犯，这下和平协议被打破了，就开始了妓女大军和警察火拼的故事。</p><h2 id="第二部"><a href="#第二部" class="headerlink" title="第二部"></a>第二部</h2><p>待续</p>]]></content>
    
    
    <summary type="html">这是一部透漏着另类暴力美学的电影，全剧暴力血腥，拳拳到肉，剧情环环相扣，值得一看。...</summary>
    
    
    
    <category term="观影笔记" scheme="https://blog.jzxer.cn/categories/%E8%A7%82%E5%BD%B1%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="电影" scheme="https://blog.jzxer.cn/tags/%E7%94%B5%E5%BD%B1/"/>
    
    <category term="暴力美学" scheme="https://blog.jzxer.cn/tags/%E6%9A%B4%E5%8A%9B%E7%BE%8E%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>a pretty girl from Morocco</title>
    <link href="https://blog.jzxer.cn/20240309/20240309_datingwithMorocco/"/>
    <id>https://blog.jzxer.cn/20240309/20240309_datingwithMorocco/</id>
    <published>2024-03-09T14:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="c592f0e358f4d8ce76e673cd5ff61be7c0ffd8d593e75ae668fdedae3c294321">82d95eb22e1adcf86d50eedc0d0b54818fb5520c2220a484a9511e1fe5283b06d5de1f9e4b608d49a7d07a49ec9bf6d3f5f4bb5d981a6deab8754beeb98eebe795b5734b9ac6907146de3ceb8eb279adedc5ebc5ad7f01ad275985bd936ebba7f5eb7f355f904851d88517a70841e7002d1ac1723d431f5bbcb90d3d62d6c4ae47e19eb157e9536b68cc3b80e0d52786b57ed4d5de7dd1643cefae5decc8b8740403be1906dffe0c301a5a7d5babaf9f2b1c4f8cc63fc4cfab76ce42a28ba6b47c989f174879d8769b966d0434ed31b768c6ffd1dcf458150117ab0f1d4b735913420a391cd2cf413ed0dc58dc78f52edf3d3b8ac769d5a6c79c4221c4f1dc1cf6b981c67b2f765bfb4b120318299c482830d5ab5b3297cff3c4cf2992574cc4c1974574ef18b81a7dfcf2c3764b60d881c16124980a3d9d7c15b90e40812e1199795123ff3683481cbd97ac8eb40acfee563b736a472a4048503b4c33c28f4058ee8fddb1a1bc76beba3af78202f51b9a3a4176f530079d22fb38ee73bc15874e0643c655a7f00ffadaac695f22b9a8da57518a6119e6f95653eef96d9072683a3258191949aa7eccee48e5b6de2d0d06fefdb122ea67de04799bd9d7c348826ad0abc68fc62f4cc4de10ed19dc597a758f2cae82818f8f99049013824ea8a01fede38a13043ab80a24125905084d732f6f329eaeb4040ff7e3b52a746d8191013a01af5581be1689af695982f85b52a7549108a1beee51d61c708f1beaf3a911979a44629f5996054ea073a6db363df9601d817d398d58e434a35850d5d669ffe10f5485081b9cfa5993fa6e46cbde1d394d1c584efcac3a662ed0fe2ba5a42cb7ef16d826d78baf827e08c5181312933b87579775e8a8ed3b7245ecb2923401d1d87f16a8f44989b36db1739747271e3b8c66352d46598430ef877254b794f73393353ada08ef51e76d64e93f2cd452f78b8af1d51bbd88b5f3b917ad67e8ca7db2ca39006fcb0bd01b27ee7a95282a7a9c48846ad7169843f8fa9ad98c6b637fa29c5a4eed278d53ac160336f3442d81afbe5014dfc631575db9abee2e2f8bc11fc98441d1a83d774655b9c77f90971596e67d3bc1ff5d5c65e538f21b23414e4d4cde9ea9b6bad47d7634445c99e59b21b1be899621f452cb5a2345812cc0390ee903009821d83113814eecaf016c164741a2d99a2a198659a2f9b657a8e5c1a7a4d42bc2b9e38cee555df72630d192291ac4f902697bac4f6930c8b95c3e25d7f681f6b9ba154cf029a1117f5eaccf48e0579697a80904db9bd5d08da58a9ea7186354d42dcfa3c948a2d32b714628d5a47ae62d30b9e5f5389154c36aa72372753168e961a318cce59ec6d22536fbfbca35a28320a9705590b43e51b58f1c11bb26a9f70f1eed3fc68e5a7ac15aa790306f1d2a61c2743e32435c3f6786a23f61cde8737b2a791726acbce0838353282b3df992f56c9bc5b35a1aa1f0ebfa3f709562ff644747aecacecdf211505afc7094bd0e3311a4a1d4ef42ef8a7e5ee08f4717f70c5e7ad7b955fab66e6eb5e40ab5460c83f0641f985111dae23be89b66885b5e014f320cb5c77d47a1f4f933c574f2c92e04d30afc1dabd6b2be485b8f77eaf3ecd417b24b1b10ae6d1bf9f7fe34beb77562ee541eacaf8e1618b73c36add9fb30d9f6cac3789b8fafe11240f5b3df1b6b44e1167aa9644646d7014af008a1a8376e14a632dc0bc67c1dd414c4556e2cf2170b582b18eb3bf4d453d88256fb3372561b5adfb6c98939e37e85d87b8d47d42a84a3134aaf71fdaa2fc7067064cdf540bf08637ab24243278d159c04d3b4289ae37ba97164abed8985d68b8d6101da130bdac390a7e9c8adf0ff7468c3976ab15135c44d2fd9d22886e3b4b6a011ad2a280acae70b640251e3541cad89052e9b3a62dcc213326db38910b6d6fe5217c36b3566513ecc1c88d0e0fa10dcf5f9be2faccd57074ddd72801bcda3fafaf91865802da9dd203d817ab9d3bf7a915fda421d3ca80be46a955f434477023073d960affb902786a6591526bd73bd5e62542a4e355e1d3d566e076500a1dc7f385984c5964c42ed575ec6704f580194fadb830dfe0cd3147dec5fa8503c3d9b27d77e8bc398ee3b6899ca9531fe53d3238067f9e3de08831ad7fef036c3c932025e999dff4c7f4a62d6bb3bf6d7c71a72700ac2d1fc108da8ee4f48195d6b5b040bd28203cd62d894266ec75d1884a378fd4a5c51ade9c5e2fd1f0f69629d5441bdcb4ce3d1ebaeb349bb5577cb0a90432aea1edd6b573c30314cbaaf2d4912fed39ae8c55f420b402672f2b8c6d782a194c6d23b686f51c15e7ad84a40e7b38b9f6d11c3fe7f6a3f9393423ece551dde1d8f83a490911d6003fb578d4a09f0fcbd04b78665c197b0ae31ecde57ba43a9d16458acd48cf2409f8f91f6b22e898ac864578abf9c53b6dbff3a1a6a9ca65b1c30bef6b7aa686c6fada88671c029e7b6092b1cadb23c2a3706a382c47968038ed5309fb8d6bcf6917e7142c9290b37ced759f96e735357855267b764763e3702458f8aa8375f9e1be05e979048d5db35cf7ee53a40e749b902b4c6e38f04e8acd17e331bbf18464afb6c7fb111eb9c4cdbe642bc8ba088611e8c097dd3fed1bed11a1e46093332577813ce9a2ee5d3faecb7034e4741f12118e15057da4eec061c1541bcb9e7da879e5f37a7c04afa40648f06d5df7ee289c631637f0db29a88772d13b4ef7bf694937440659beeec387c46c298cd5fd9e5e3bb6e90d90c42afe76f15f677be66fb73bfa3d4383f827620598a0df156b756506c45b97440d1eabbd371c67b72c08cb51c311cc4281a6f7d2180b4400840ed104d24ccd31d0305921d398d6113ba3261ee9cdf1630ae2e4edc690f9c3ca66eb5586b41be5fe617fc07ebd5436226a1b278c4df650fec1d03574c59efceb1d5886fe034b9a502f896fcdd09a73310cc17507e1c70963e80d13ba6d37322eb1b02cbaa1f5e73d8c3dba68ceb362f6a826ba3fdf5e201ee4747f0e9c31a4dfdd8f94a6d4e42149bf2d1e647e29397a9b0a6b5060ebe457a8f1dc4cb5d102063e3e4bada591ebaa95de939c2ea876f7a76460c60af31ddcc752277471110b107664b7bae7afe8f943bb339fffb87386867adeeca4c35b83fcb6ae23be74fe275967ea4c19f4ad8f97b1cbab5fdbb675ccb6e4eb684723f7e42afc519d28289172c5a71796280d8b84815d20f6cb567e9724e9acde7a680bbb1df0b35450b74989cb8044b2b8c744587f1888d845cb73b8bad0613b2027eee90766c1177d49b69bbc5134b26a1da67c2857f0a4d1f92ea9c3034893c98c2190808a7ffd0f24dffe5a78ba0d24ff2607c4cb27bddea321f77f86131a1b627cd90601f878afe95152cecfc96553d5af08d8e4782ce3bd3d62731a58dbdce7bf61c17b29727137fdac118480b5532e0ce0c97623b7dae08f3f0440c98b0a457965c57179ebffa47ee8fb9a67af203a56e299ceb7ea2807a421cb8c1008f258742c5d51c216436b4337eec3a0746ad4d294ef111a0d43735d4be0be7818eb27f467a75ffafdaeb5b175b24192363d8be9749270ec513bf49e5ffc76164ef069dfce928f034d662c4d627fd3abd65a29e8a8223f434e66dc143281676249af96758130f53c59203491d4a86e4bce385e9268230c65a548512100ea9b82b00c5998f5a497ffe4c068e638e266b575e529e8b7659238459009ab852cec31232c68ca1505b7a0d2f20ebc7e9fe737b143167d2141dfa07c61601ef93e0e355635087977c3e8547c437ef9acd54558fb5678153d5f34138bd498e782b1852a112c8105fd195ca521e95683f2773d58c792294d80e73531d0125be10200bae54ec5945cb7387a6616acd977967d241a8b0be32d8ce3fa7d947e82847c832d01cdebe111bac5a99bac71df00feebff417cf0c299c72366a869cf1b3d4d73dca6113f3049dcc5ce795a5ad9cdb367f66c59c29dd30f859d64223aabcc291c0e9a4e06154693f1a3d48d2830e4a5e177b13c092812471700fa99ccae77cfb6485268c384785aa790b583a494bfbecb338a45b216775c74ff254cd991acd82e5de41a322e2e012cf237a23d2dc789920084eb699c495f9d8938d0ea20573227a111659d6c0b2ad923ed1f40644852c4a9c90b4eb79cbeea97ee6867ec1d997d09b305f751770c6f8bb9b0075f7ad341d89ed97a645a39eb80faa8997961b051f8026ad73e6b95b84bd2d5c5e7a4cc8ebe3e2e96514f6a40729170eef24d1d45f03c1fb0c8c587412a80c553ed44b57d93d9398a4a3a72df91cb23a1bac88d36f3898c25c2cfada1756535c346cd40a8f2e5378497b397f3456ff6f99d1341ed1a6462b4cea30001b874354da704605f0739e977bf9a3bf914e03bd4c5d329c784bf79ad2740a468fb9178a4381da16c02508efb583296d55ced9b82d693e0ad940108441c1ef3400b98d72a8018c617e7047fc4b8a3fb7603ff3074df95a8dd2c13b9ee787a9a701958565c3747cb11571036ebabc52f2e17eecfb441b37ea9e3e3bacae105bb2bcbdad07fdc6dbfb14ad7d0e8be3ac6913cf99f4f94c767a92d342769fef403d992b8231dc11b74115e89fb0d468f4dc35532d97406b8c12ebccdb228665e2d3f90f993f361115c9144cd27db3bc837b5907fa3b46db0357b93ce98c452545f7e0c2fe99a4b268a8e131b0c6d8538dd4055e4b712fe70f6b628ea26e12c36f38a05a961e3aff60a2de34bd67bf06d2ecd32da480ee8077d18b833f7e35308bcfde4edf52420ef3fe41a0e61de5902124d0938a8792715a340a5ef70dfd003d927d1820ee08f226d50eea3b09cc6fdffd99f1c24beab8b943b3ff95bbf6434d2393b035bb079b26451b22c5005f31839f1606aefb5820ef20db7da56c47ffab0011fcd1e7e720a297b1e085c7efa170004e261ef9b8c02de03860bd9a5114062148dddd9c71c8100404bb4580438fc2689f82b7bc5bb6e5e18a1497f5d6aa210a0111f03e9068ff1401f96754651e2610dbb3e557d6efd57ee4d5a57d54a95c7e9cf470ef03f8558cb63cb13a6da58412b173155b917aeb1bc1d2480cd34acbd1484302d824bb33b1eea89b254fe8031d973548ab1d511b92288a660f93e3329640ebdd5183b3ec4fe068c27fa003c3a58c4bfaa1a98dd2b020b85ea68ced0e26c5ef8219f4de5b96623bb4400e3cd81fddb014ad709a421c1a7d212174a9e95beca234d95b33a8e22b88afa35a0a9fc0ddf47563201295a52adb08793954a04580916d3f95fff6f4d0f7db9ba5f0e1738ae07ec13e62a47fb974785cba2f655f606dbfd38bb9cf45a123751f7b1631416d7154af616fb1ad887aae6821e824aa71084c984ae4488ef39bc46204441b71df2ebf395a34a8c7f5f143df445838652546ec22c8931150816c7becfaab28456745889036b904962b6c3b5b9728b61bca283b182b5bcf72a26804837586126766dc41c5214703619e0cde2063410c02c63e4523de55a8786f60b238340ac4990d684e38339e30bc0e696b0afd30f6cf3a6acd3c5de39a6baa7b1459d1ab7c15fe787d82f68dc3c08adbe93ce20a99a92dc83a27f952a03e64abb70157f9ecf83c6dd47b27224fa371260a7911629b07b6bce0cae123b6962dab7e8e4a08fa6b8c64e5de8cb4124507494a909532da7b531bada9ed7c69c6a6ec5e714d9014cfd1263fddabd4c46edf1420a3dd97dad1d5ebf5ce99062d0b49ca4df893464ec9ea7e0c18c04aba587e419ad48311a273d7729cdc739087da3686259f2a788305e9bc140a2df1a984666d625d81aac1a5d3cb8f0e4ade154963eca526f2fdff62387303a19d5fc610d3c1ea17dba143981c20dfba1828b9beb4dd658e2caa2e2f1f07f9e88ddade78c9b7ab4e4a3873a32acfd7d53adc39ca3101bd6a5358fb57bb0385ce4710e1d59e42c4f2d76b8c23aa2b5d8cf34d333ce25fbd8811ff6643bf0069f8be0ac12352533a3cbac9504a6be20b44970b7336b43782306c70a083902f662e0b1e625626b87f04016ac31d879c303a6e7203e837e26355468f74c0b806bd4101f18ce5f069b42fb0afe89ac1b2a07c70d431decbc7d0e4bfe1e3bf005280ccdd371bc3c07f405f2efe940036e1367a01d7a9d9650279e4bcee1afdd8a14f0c9d28db66a8416680476dfec45f24dda6dba0667dd78702c1a21892c26c0d01d17de3a661950367deadd89ef554c7a1feaf5ce0286bb0ec3cfd47ba86204f39ee4c905fde7c4dd0a885f6dbb9c626780fd10c6b0f55603969a29932362c3425fa3abdcc2ac793fd24f06607ca60bf8e671ed935cc1bf0b142ae4dc26725e48a79214d7f1e32ae1d289dd0afda3698f108435bcaa7152042eae8e8d8c5050d514d661af9e2bace4b84194f4a83b9f035342c0f89ae4f213b24ab179b7afaee57ad5a0a2bd0d7f06ee18e1c96f0cb362f772151b2a62fb4bc91014539214294b433f344e7a14bde51a7f2c442d0046dcc701f49b782c45082480adb5ae0a8903635bec3790197179d5ed8d8a8553d60989630397c1eb288d6a3b6a6c704edaf554c339b758c2df224c915cbbe8efa051cf01be931bc30495db530b66ec34f86ae5fd7ff7c11013ee8aa1ddc70049c8bfc7a610f350124a7ac2872a68ebe595aa83fe19f587643223c655351228b9223146299c1fcab862eba3cf35f14fa87fe842a426af96dd9d1ea4656b61740f7dd7ad8f71041e13b6458ad377388b975d9a40862900d5c9c105c2cedfae45cf4b0fb8fe8b239fe060c8a2753aa49deabd5babf7f2220ea22c6d32869bae9aca48f56e1824f43e607415e6a106f2af7ea1a37e013e8cb9f71c062c6165e9167d0a4b52fe8e63ac1ef153ce9c7bad40418646b3ebe448aabb7a6277d6e09ac221ef40dcacdcc6ddc49b32146d4f846cf272c15327fba867111dd29c39ef264f16d7016ed0c7994093e05dfc8ca3ba9ca356d5ade734ee8b689aee0e8899a03b7b291e21347cf255e91b8571e1b7fc3c20910e1f7498477dc6d946854965b1254d6bc4ad92842d2a66886167db7720f23348ce42ef49ac01f507c3734f75814e347ae6f04852e1a819c1001cdc63b57726b46a528d7b14d8f891116ce11eed9bf6add4090bea36ad836923d1d69dca9fa742c7baa698b772820b2d830fb37b8e56a862432d2b8d6f6856263fdc949a68e85419e310a74f8deb6e168755f41f7b73e82db3a1c5f7172605cea087a2e44b5c5292de3a1d443acd91e3ab46fb353a065bfc5285c510d586330f857f8151d3d57af30dd69714687d16da9fe95e6fa50713102aa0e5f89</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>新的开始，新的开悟</title>
    <link href="https://blog.jzxer.cn/20240217/20240217_new_begin/"/>
    <id>https://blog.jzxer.cn/20240217/20240217_new_begin/</id>
    <published>2024-02-17T13:44:34.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<h2 id="启蒙"><a href="#启蒙" class="headerlink" title="启蒙"></a>启蒙</h2><p>随着年纪的增长，慢慢的，我开始变的稳重，欲望也变的低了很多</p><p>虽然不愿意，但是也开始能接受自己是个平凡且普通的人，看了《当下的力量》之后，我也开始能更多的时间去聚焦当下</p><p>把时间这个东西抛弃在我的认知之外，它只是一个度量工具，一个衡量单位</p><p>但是我们有的时候给了太多约束，去定义它，去规范它。几点应该做什么，什么时候应该做什么，多久应该到达一个什么样的目标</p><p>但是往往在这个时间节点，我们都不能达到自己想要的，有的人运气好可能如愿了，但是大多数和我一样的普通人，最后都会被一次次被现实所打击</p><p>渐渐的失去了对生活的激情，因为认清了现实的残酷与无情。</p><h2 id="开悟"><a href="#开悟" class="headerlink" title="开悟"></a>开悟</h2><p>这一年，我要开始脚踏实地，开始做自己该做的事情，聚焦到自己的专业范围之内，把自己的优势全部发挥出来。</p><p>不要沉浸在舒适区中，去试错，去学习，我们的一生都在挣扎，想找到生活的意义，而每个人对这个的解读都有自己的看法</p><p>有的人说人生没有意义，有的人说人生的意义在于实现自我的价值</p><p>但是谁又在意这些呢？最后大家终究会化为尘土，几百年之后，仿佛就像没有来过</p><p>我想要的人生的意义，不需要有多么的伟大，也不需要多么牛逼</p><p>我只希望能做自己，做真正的自己，而不是被社会给蹂躏打磨后的那个带着面具的人</p><p>我知道这要很多的努力和一定的运气</p><p>每个人只会尊重抬头看的那个人，这不怪个人，只怪社会风气</p><h2 id="定夺"><a href="#定夺" class="headerlink" title="定夺"></a>定夺</h2><p>今年的新愿望：做自己、做自己、做自己</p><p>我无所谓好与坏，我只想暴露出真实的样子给你看，你喜不喜欢，我就是这样</p><p>我不会因为谁而改变，也不会为了迎合谁去妥协</p><p>我就是我，无论贫穷与富贵，这一生能让我最真实的样子活在世界上，足矣！</p>]]></content>
    
    
    <summary type="html">虽然不愿意，但是也开始能接受自己是个平凡且普通的人，看了《当下的力量》之后，我也开始能更多的时间去聚焦当下...</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="思考" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E8%80%83/"/>
    
  </entry>
  
  <entry>
    <title>痛苦与磨难才是人生常态</title>
    <link href="https://blog.jzxer.cn/20240212/20240212_painIsNormal/"/>
    <id>https://blog.jzxer.cn/20240212/20240212_painIsNormal/</id>
    <published>2024-02-12T14:03:44.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<h2 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h2><p>痛苦与磨难才是人生常态</p><p>不然怎么让快乐显得弥足珍贵</p><p>用平常心去对待一切</p><p>允许任何可能性的发生，不去做任何的评判</p><p>就任由那种感觉在内心里沉淀</p><p>如果一成不变</p><p>人生会显得缺少意义和激情</p><p>找到自己，满足自己，爱自己</p><p>把自己放在最重要的位置</p><p>这是善待他人的第一步</p><p>也是走向美好生活的第一步</p><p>– dev</p>]]></content>
    
    
    <summary type="html">痛苦与磨难才是人生常态...</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="思考" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E8%80%83/"/>
    
    <category term="哲学" scheme="https://blog.jzxer.cn/tags/%E5%93%B2%E5%AD%A6/"/>
    
    <category term="人生" scheme="https://blog.jzxer.cn/tags/%E4%BA%BA%E7%94%9F/"/>
    
  </entry>
  
  <entry>
    <title>一次有趣的来自火种的约会</title>
    <link href="https://blog.jzxer.cn/20240205/20140205_datingwithY/"/>
    <id>https://blog.jzxer.cn/20240205/20140205_datingwithY/</id>
    <published>2024-02-05T08:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="1bb0ba89a3a521d3a3912e05777c7d798bbe6912b9dcb199910513a7315d394f">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c87520d46ed61558a72458e309d80b12a82908dcab719caa70ce76cc939df9fad3f2cec8339cee75b5c935bbd4714f24ad7f341076f196e762acdd40f14148d08df01cf8b8d1c2d448a2fcf0f2f13cc08eba47cac91012364e4bc54aa6fe23bb9540f3e1406ef5c02052663e311e7b847e37eb2d68f2b1ed430959ec6d80cf8a2f5216ec13d4b1c680ad88f5be987d1f86d252dbc253ed48695f64bad0a2989a3951367d6b7795e2d067642cd152c1d841a58888b201e518816204bf6eb54efd69f4220963165edc2b3c4cd133cee28929fc8ab433fb02c55fd19276b0b9802909a3ba6a70148cf16e10e90ae2f6522fa8b0d6cb5a8082c2f011b01caec5ed9fdb371666235dd88bb847ae313f1ee41e5b8ce8891704730e51ba63cae4316cc42d6718e1e3cb5aa9680af4a941a8236b5f35f5ed49c030a88846b7ead6e438638daf964e00871b37e8fe0c64e97f051c1f3662c7fe13211ef9c902b6dfa81c2a5c9267c1346f927faf22351ea04394a10b19ae41c650d0a3fec901eadc056fc5f47e9b1c3ea967bde463af305dc3e636243b9a8e5247dd83ee9cdbce9f99231956dba32ecaf582b7361bc9514afbae4b734043874be5c8765eed96f41776ec52b6b4b2856f37e64c87dab26474b4719c3d2c35e10bc57e33588a7d0de898afe2fc181933976121417e58e52573f6e6bebe41b38fc3f8519353da0d20d1b81c50cf894915402257c49873dbf27383efebf4263ce44f44922b97a81be53a8672e54d04e591082f58fadc41fd20a21555be45b206465e4a59d764036e31f2b2e001bab2787dfc6aad26d8a44a3fa932bf9dcd5b16a278c0e8fc35bad0b67c9aa3f5eb067a3f0dfd6db35b55b2ea74bb6b3f4d7479a02dc70c3e48d18138b4d1eed1f525e40d98dec99e0ac88e7f1c2f6084fabb66a23b9926678f8dfe664635d66481f1863d339b10054ddbb9a00d848d7fbbc4f997e08eea1ce44a409312904c8184de9995e398ef83c8a7a3373626f4a997c59469f9122e363badebfef7ff621ea4d04d4d802adb267c4fe9808d319402c8da183425672125a0dce8a275fb45e896ee1fcb463bb5f1023a7c89ee58819d6ff8226f2c050ec4591ae5a5d2b48def1616d4a2f846b876359dbee1be49500a9ed03a82fdfa60d46f1796e77343e34753db33304354f9040847d2431ddcc0b12796c1754b4a9219058de8fa5a5bf7ae0545ba3ddef9a97e93caf8240266e7ec6e2fed82306e2c91c17b13a78c71a6ba66e1962227dd8749eaef157748b7a43ee418400a0c544e8aa8aa11eb4f10dc26dd4ffc24f2cf9b99bd541a7a9b2787fe11829cf723c08b32679787ace6884a295f8eb429a46d60e8b96442ac35d4ff7ae6182f99911e26a46d7d961bbfc3c6d0d570a929837518ee05489c2e134b4aeb04b1270c1f0b52b2260a60ba09e92f42f7ff1f</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>关于自媒体提升曝光量的一些想法</title>
    <link href="https://blog.jzxer.cn/20240202/20240202_multDeployBlog/"/>
    <id>https://blog.jzxer.cn/20240202/20240202_multDeployBlog/</id>
    <published>2024-02-02T14:32:41.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p><img src="/" alt="image-20241108122837062"></p><p>作为一个自媒体人，时常碰到的困扰就是，如果我新开通一个账号，去发布一些作品，很大程度上前期很长一段时间可能播放量一直都不容乐观，可能几十、几百维持半年一年的样子。</p><p>我们知道积累粉丝是一个过程，它需要可能很长的时间，但是时间不等人，我们需要生活，需要得到更多的曝光。就像一家商店一样，想办法让更多人看到，那么有没有一个更有效的办法短期内得到更多的曝光吗？</p><p>答案是有的，根据我的想法。假设我们发布了一个视频，在一个平台只有 100 的曝光，那么 50 个平台就有 5000 的曝光，1% 的转化就有 50，我们就只需要去争取留下这 1% 的用户去做更深入的内容即可。</p><p>所以最好的办法就是 <strong>多平台发布内容！</strong></p><p>当然不是说多平台发布就行了，不管内容好坏，因为我们需要打的是持久战，所以内容的质量也很重要，不光要做内容，更要做优质的内容，这样才能做出差异化，其它人都为了钱去做流量的时候。我们专心做好自己的东西。如果真的肚子里有东西，时间会证明一切的。用薛之谦的一句话来说：“这个世界没有怀才不遇，只有不孕不育”。</p><p>只是这个时间不知道什么时候会来到，但是坚持自己分内的事情，总是没错的。</p><h2 id="构思方案"><a href="#构思方案" class="headerlink" title="构思方案"></a>构思方案</h2><p>既然找到了突破方式，那么就是开始收集信息了，我把市面上所有的热门平台都用一个地址记录了下来</p><p><img src="https://oss.jzxer.cn/blog/image-20241108102110708.png" alt="部分平台"></p><p>更多的平台还在探索中，其实小众点的平台也可以加进去，多一份曝光，多一份成交的可能性嘛。</p><h2 id="执行方案"><a href="#执行方案" class="headerlink" title="执行方案"></a>执行方案</h2><p>起初是希望自己能一天两发，和之前做情感账号一样。但是那个时候和现在不一样，那个时候很多时候都是在参考别人的文章，很少有真正属于自己的东西，也不需要什么灵感，都是速成的复制粘贴。</p><p>我想既然想把这件事做成终身的事业，起码它真的是我的想法，独一无二的，具有开拓性的一些东西才好。所以我会花很久去做一个视频也说不定，但是文章我希望是每天发表至少一篇，如果灵感来了，一天多发也不是不可以。</p><p>按照这个想法，我把我的账号大概分成了 3 个组别(<strong>粗体字为主力账号</strong>)：</p><ol><li><p><strong>图文组：</strong>主要是输出原创文章</p><ol><li><strong>小红书</strong> ✅</li><li>掘金 ✅</li><li><strong>哔哩哔哩</strong> ✅</li><li>爱奇艺</li><li>头条号</li><li><strong>百家号</strong> ✅</li><li>搜狐号 </li><li>网易号</li><li>企鹅号</li><li><strong>知乎</strong> ✅</li><li>一点号</li><li>大鱼号</li><li><strong>微信公众号</strong> ✅</li><li>快传号</li><li>雪球号</li><li>豆瓣 ✅</li><li>简书 ✅</li><li>Segmentfault ✅</li><li>东方号</li><li>大风号</li><li>美柚</li><li>wifi 万能钥匙</li><li>易车号</li><li>车家号</li><li>CSDN ✅</li><li>微博头条号</li></ol></li><li><p><strong>短视频组：</strong>主要分享一些成果，和经验，一般在 1-3 分钟以内</p><ol><li><strong>小红书</strong> ✅</li><li><strong>哔哩哔哩</strong> ✅</li><li>acFun</li><li>youtube-short（需要魔法）</li><li>Instagram（需要魔法）</li><li>facebook（需要魔法）</li><li>X（需要魔法）</li><li>tiktok（需要魔法 plus）</li><li>爱奇艺</li><li>头条号</li><li>腾讯微视</li><li>腾讯视频</li><li>西瓜视频</li><li>皮皮虾</li><li>多多视频</li><li>秒拍</li><li>美拍</li><li><strong>百家号</strong> ✅</li><li>网易号</li><li>企鹅号</li><li><strong>知乎</strong> ✅</li><li>一点号</li><li>大鱼号</li><li><strong>微信视频号</strong> ✅</li><li>大风号</li><li>易车号</li><li>车家号</li><li>峰网</li></ol></li><li><p><strong>长视频组：</strong>主要分享某个 idea 的形成过程，尽量能在 3 分钟以上，和短视频平台几乎一致</p></li><li><p><strong>动态：</strong>可能就是几句灵感性的内容，或者是一张图片</p><ol><li>Instagram</li><li>微信朋友圈</li><li>facebook</li><li>x</li><li>qq 空间</li><li>头条号</li><li>百家号</li><li>知乎</li><li>juejin 沸点</li><li>一点号</li><li>新浪微博</li></ol><p>就比如说常见的矩阵号就是这么一个模式，很多的账号，都围绕着一个主账号做切片，做话题，最后起量。但是这种号大多是娱乐向。</p></li></ol><p>所以按照以上的思路，基本可以做到 50 个账号的量（<strong>尽量先专攻一个主题的号，后续有起色了再把流量分出去，不然精力不够</strong>），吃透了这 50 个号，每天的数据量都不会差，然后通过流量引到自己的私域去消费，目前我想到的私域交易形式有三种：</p><ol><li>一种脱离ZF 机制的自建交易形式：ESTD、BTC（但是需要一定技术门槛）</li><li>依赖大公司的交易：微店、淘宝、多多、（天猫、京东）</li><li>自己对接支付的微信端小程序、自己对接支付的支付宝小程序</li></ol><p>目前我能想到最简单且最节约成本的就是第三种，但是这个麻烦的点就是平台审核，其次就是第二种，但是可能前期主推就是第二种，慢慢来吧。</p><h2 id="关于商业闭环的思考"><a href="#关于商业闭环的思考" class="headerlink" title="关于商业闭环的思考"></a>关于商业闭环的思考</h2><p>现在整个大的方向有了，那么就是怎么让一件事情持续下去，做事情纯靠热情和喜欢不现实，因为还要考虑现实的问题，那就是找到资金来源去维持这个东西。</p><p>所以商业闭环就很重要，目前我能想到的就是通过视频植入概念产品的形式去卖这个产品。</p><p>后续粉丝起量了，再去出课程。提供咨询服务。如果知名度起来了，可能会承接一些项目来做。这些都是一个需要积累的过程。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>虽然我对赚钱这件事兴趣不大，但是也没办法。为了更好的生活。</p><p>生活嘛，钱总是很重要，虽然他不是我做一件事的本意。真不希望这辈子钱就是我生命中的一切，身边太多守财奴的案例，仿佛都失去了最初的样子，希望自己勿忘初心吧。</p><p>虽然不知道明天怎么样，但是我还是期待着明天的到来。</p><p>首发：<a href="http://blog.jzxer.cn/">dev 的艺术空间</a></p>]]></content>
    
    
    <summary type="html">在发布文章的时候, 如果我们想要更多的流量,就需要有更多的曝光, 就能更好的提升自己 IP 的知名度.</summary>
    
    
    
    <category term="自媒体" scheme="https://blog.jzxer.cn/categories/%E8%87%AA%E5%AA%92%E4%BD%93/"/>
    
    
    <category term="思考" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E8%80%83/"/>
    
    <category term="曝光" scheme="https://blog.jzxer.cn/tags/%E6%9B%9D%E5%85%89/"/>
    
  </entry>
  
  <entry>
    <title>所有硬件软件皆是工具</title>
    <link href="https://blog.jzxer.cn/20240125/20140125_everythingistools/"/>
    <id>https://blog.jzxer.cn/20240125/20140125_everythingistools/</id>
    <published>2024-01-25T07:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<h2 id="所有硬件软件皆是工具"><a href="#所有硬件软件皆是工具" class="headerlink" title="所有硬件软件皆是工具"></a>所有硬件软件皆是工具</h2><p>最近领悟出来的一句话，我们有很多的想法在脑海里，知识点的系统化从而学会了一个技能，不管是做人很圆滑，会修水管汽车。它都是很多知识点的系统结合。<br>同理可得，如果通过身边现成的硬件或者软件。能够构建一套规范的体系，并且这个产品能够被他人认可，并且产生利它属性，就是一款成功的产品，也就有了商业价值</p>]]></content>
    
    
    <summary type="html">商业属性的成立...</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="思考" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E8%80%83/"/>
    
    <category term="哲学" scheme="https://blog.jzxer.cn/tags/%E5%93%B2%E5%AD%A6/"/>
    
    <category term="人生" scheme="https://blog.jzxer.cn/tags/%E4%BA%BA%E7%94%9F/"/>
    
  </entry>
  
  <entry>
    <title>微前端架构的试探</title>
    <link href="https://blog.jzxer.cn/20240119/20240119_microApp/"/>
    <id>https://blog.jzxer.cn/20240119/20240119_microApp/</id>
    <published>2024-01-19T13:32:41.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<h2 id="项目背景"><a href="#项目背景" class="headerlink" title="项目背景"></a>项目背景</h2><h2 id="技术选型"><a href="#技术选型" class="headerlink" title="技术选型"></a>技术选型</h2><p>目前使用的是支付宝开源的框架 qiankun, 主要原因是因为我们内部大部分的项目都用到了 umi, 然后 umi 有个集成框架叫 @umi&#x2F;max,正好集成了 qiankun.</p><p>一键上手搭建的感觉还是很爽的</p><h2 id="多种配置方案"><a href="#多种配置方案" class="headerlink" title="多种配置方案"></a>多种配置方案</h2><h3 id="主应用"><a href="#主应用" class="headerlink" title="主应用"></a>主应用</h3><p>顾名思义，就是应用的外框，所有的子应用都是嵌入在主应用中的存在，它可以给子应用赋能一些通用的功能，比如说：</p><ol><li>聚合登录</li><li>权限验证</li><li>共有的功能性 sdk<br>…</li></ol><p>主应用没有一个固定的形式，它可以是内容为空，也可以提供相应的布局。这个比较灵活，可以自由定制。</p><h4 id="app-ts-配置"><a href="#app-ts-配置" class="headerlink" title="app.ts 配置"></a>app.ts 配置</h4><p>如果是在 umi 应用下，可以在 app.ts 中向外暴露一个 qiankun 的对象，内容主要是一些集成的配置。参考如下：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> qiankun = &#123;</span><br><span class="line">  <span class="attr">apps</span>: [</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">name</span>: <span class="string">&#x27;app1&#x27;</span>, <span class="comment">// 子应用</span></span><br><span class="line">      <span class="attr">entry</span>: <span class="string">&#x27;//localhost:30068/app1/&#x27;</span>,</span><br><span class="line">      <span class="comment">// entry: `//$&#123;location.hostname&#125;:30068/app1/`,  建议写成这样</span></span><br><span class="line">      <span class="attr">props</span>: &#123;</span><br><span class="line">        <span class="attr">accountInfo</span>: &#123;</span><br><span class="line">          <span class="attr">username</span>: <span class="string">&#x27;admin&#x27;</span>,</span><br><span class="line">          <span class="attr">password</span>: <span class="string">&#x27;test123&#x27;</span>,</span><br><span class="line">        &#125;,</span><br><span class="line">      &#125;,</span><br><span class="line">    &#125;,</span><br><span class="line">  ],</span><br><span class="line">  <span class="attr">lifeCycles</span>: &#123;</span><br><span class="line">    <span class="comment">// 所有子应用在挂载完成时，打印 props 信息</span></span><br><span class="line">    <span class="keyword">async</span> <span class="title function_">afterMount</span>(<span class="params">props: any</span>) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;主应用:&#x27;</span>, props);</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><blockquote><p>注意事项 ⚠️：如果是发布到服务器上去，entry 必须写成 对应的服务器 ip 地址，localhost.hostname 的形式，不然会获取地址失败！可以通过环境变量来区分 生产环境和本地开发环境</p></blockquote><h4 id="umirc-ts-配置"><a href="#umirc-ts-配置" class="headerlink" title=".umirc.ts 配置"></a>.umirc.ts 配置</h4><p>这个文件中需要对三个模块进行配置，一个是打开 qiankun 插件这个功能，一个是应用绑定的路由 用 microApp 来作为映射，最后就是在发布 nginx 的时候的访问路径配置，如下作为参考：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">qiankun</span>: &#123;</span><br><span class="line">    <span class="attr">master</span>: &#123;</span><br><span class="line">      <span class="attr">prefetch</span>: <span class="literal">false</span>,    <span class="comment">// 关闭子应用预加载，不然控制台会报错</span></span><br><span class="line">      <span class="attr">singular</span>: <span class="literal">true</span>,     <span class="comment">// 打开单实例场景，单实例指的是同一时间只会渲染一个微应用</span></span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="attr">routes</span>: [              <span class="comment">// 子应用路由配置</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">name</span>: <span class="string">&#x27;app1&#x27;</span>,</span><br><span class="line">      <span class="attr">path</span>: <span class="string">&#x27;/app1/*&#x27;</span>,</span><br><span class="line">      <span class="attr">microApp</span>: <span class="string">&#x27;app1&#x27;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">  ],</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="子应用"><a href="#子应用" class="headerlink" title="子应用"></a>子应用</h3><p>相对的子应用需要修改的地方不多，它存在的意义主要是，当项目变得非常巨大，很笨重的时候，我们希望能够将它拆分模块化，分散到各个小的仓库中去，让每个人各司其职，负责独立的模块，这样的好处是：</p><ol><li>项目更加垂直，一个模块，负责一个模块的业务。</li><li>拆分的更小也就以为着能够按模块打包，一定程度上能提升效率。</li></ol><h4 id="app-ts"><a href="#app-ts" class="headerlink" title="app.ts"></a>app.ts</h4><p>导出微应用的三个生命周期函数</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> qiankun = &#123;</span><br><span class="line">  <span class="keyword">async</span> <span class="title function_">bootstrap</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;app1 bootstraped&#x27;</span>);</span><br><span class="line">  &#125;,</span><br><span class="line"></span><br><span class="line">  <span class="comment">/**</span></span><br><span class="line"><span class="comment">   * 应用每次进入都会调用 mount 方法，通常我们在这里触发应用的渲染方法</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  <span class="keyword">async</span> <span class="title function_">mount</span>(<span class="params">props: any</span>) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;app1 mount&#x27;</span>, props);</span><br><span class="line">  &#125;,</span><br><span class="line"></span><br><span class="line">  <span class="comment">/**</span></span><br><span class="line"><span class="comment">   * 应用每次 切出/卸载 会调用的方法，通常在这里我们会卸载微应用的应用实例</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  <span class="keyword">async</span> <span class="title function_">unmount</span>(<span class="params">props: any</span>) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;app1 unmount&#x27;</span>, props);</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h4 id="umirc-ts"><a href="#umirc-ts" class="headerlink" title=".umirc.ts"></a>.umirc.ts</h4><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="attr">qiankun</span>: &#123;</span><br><span class="line">    <span class="attr">slave</span>: &#123;</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="attr">publicPath</span>: <span class="string">`/<span class="subst">$&#123;pkg.name&#125;</span>/`</span></span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="nginx-配置"><a href="#nginx-配置" class="headerlink" title="nginx 配置"></a>nginx 配置</h3><p>具体配置参考（这个配置是在 windows 环境下，如果是 linux 环境需要适当的变更配置的 root 文件路径）</p><p>需要注意的几个点：</p><ol><li>关于跨域的配置，主子应用都需要配置跨域</li><li>不建议用 root 去映射路径，用 alias（这个我之前踩过坑，详情可以去搜索 alias 和 root 的区别）</li><li>另外一定要注意后缀加不加 &#x2F; 的区别，他们命中的规则是不一样的，切记！</li></ol><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line">worker_processes  <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">events <span class="punctuation">&#123;</span></span><br><span class="line">    worker_connections  <span class="number">1024</span>;</span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line">http <span class="punctuation">&#123;</span></span><br><span class="line">    include       mime.types;</span><br><span class="line">    default_type  application/octet-stream;</span><br><span class="line"></span><br><span class="line">    sendfile        on;</span><br><span class="line"></span><br><span class="line">    keepalive_timeout  <span class="number">65</span>;</span><br><span class="line"></span><br><span class="line">    gzip  on;</span><br><span class="line"></span><br><span class="line">    server <span class="punctuation">&#123;</span></span><br><span class="line">        listen         <span class="number">30058</span>;</span><br><span class="line">        server_name   localhost;</span><br><span class="line">        root      E<span class="punctuation">:</span>\work\main\dist;</span><br><span class="line">        index   index.html;</span><br><span class="line"></span><br><span class="line">        location / <span class="punctuation">&#123;</span></span><br><span class="line">            add_header Access-Control-Allow-Origin *;</span><br><span class="line">            add_header Access-Control-Allow-Methods &#x27;GET<span class="punctuation">,</span> POST<span class="punctuation">,</span> OPTIONS&#x27;;</span><br><span class="line">            add_header Access-Control-Allow-Headers &#x27;DNT<span class="punctuation">,</span>X-Mx-ReqToken<span class="punctuation">,</span>Keep-Alive<span class="punctuation">,</span>User-Agent<span class="punctuation">,</span>X-Requested-With<span class="punctuation">,</span>If-Modified-Since<span class="punctuation">,</span>Cache-Control<span class="punctuation">,</span>Content-Type<span class="punctuation">,</span>Authorization&#x27;;</span><br><span class="line"></span><br><span class="line">            try_files   $uri $uri/ /index.html;</span><br><span class="line">            index    index.html index.htm;</span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line">        error_page   <span class="number">500</span> <span class="number">502</span> <span class="number">503</span> <span class="number">504</span>  /<span class="number">50</span>x.html;</span><br><span class="line">        location = /<span class="number">50</span>x.html <span class="punctuation">&#123;</span></span><br><span class="line">            root   html;</span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line">    server <span class="punctuation">&#123;</span></span><br><span class="line">        listen       <span class="number">30078</span>;</span><br><span class="line"></span><br><span class="line">        location /app1 <span class="punctuation">&#123;</span></span><br><span class="line">            add_header Access-Control-Allow-Origin *;</span><br><span class="line">            add_header Access-Control-Allow-Methods &#x27;GET<span class="punctuation">,</span> POST<span class="punctuation">,</span> OPTIONS&#x27;;</span><br><span class="line">            add_header Access-Control-Allow-Headers &#x27;DNT<span class="punctuation">,</span>X-Mx-ReqToken<span class="punctuation">,</span>Keep-Alive<span class="punctuation">,</span>User-Agent<span class="punctuation">,</span>X-Requested-With<span class="punctuation">,</span>If-Modified-Since<span class="punctuation">,</span>Cache-Control<span class="punctuation">,</span>Content-Type<span class="punctuation">,</span>Authorization&#x27;;</span><br><span class="line"></span><br><span class="line">            try_files   $uri $uri/ /app1/index.html;</span><br><span class="line">            alias    E<span class="punctuation">:</span>\work\app1\dist;</span><br><span class="line">            index    index.html index.htm;</span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line">        error_page   <span class="number">500</span> <span class="number">502</span> <span class="number">503</span> <span class="number">504</span>  /<span class="number">50</span>x.html;</span><br><span class="line">        location = /<span class="number">50</span>x.html <span class="punctuation">&#123;</span></span><br><span class="line">            root   html;</span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h2><p><a href="https://juejin.cn/post/7113871265848360997?searchId=20240308152253A3CC20142A59F31D97E3#heading-8">https://juejin.cn/post/7113871265848360997?searchId=20240308152253A3CC20142A59F31D97E3#heading-8</a></p><h2 id="Q-A"><a href="#Q-A" class="headerlink" title="Q&amp;A"></a>Q&amp;A</h2><h3 id="localhost-XXXX-err-connection-refused"><a href="#localhost-XXXX-err-connection-refused" class="headerlink" title="localhost:XXXX err_connection_refused"></a>localhost:XXXX err_connection_refused</h3><p>我这里主要的原因是使用了 node 环境的环境变量去判断正式还是生产环境, like this：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> pro = process.<span class="property">env</span> - <span class="variable constant_">NODE_ENV</span>;</span><br></pre></td></tr></table></figure><p>千万不要用这个！打包虽然成功，但是里面逻辑判断是有问题的，绝了，卡了我一上午…</p><h3 id="控制台报错提示，找不到其他应用-not-fetch"><a href="#控制台报错提示，找不到其他应用-not-fetch" class="headerlink" title="控制台报错提示，找不到其他应用 not fetch"></a>控制台报错提示，找不到其他应用 not fetch</h3><p>这个是因为，qiankun 默认开启了预加载功能，在主应用中把这个功能关掉就好了。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">master</span>: &#123;</span><br><span class="line">    <span class="attr">prefetch</span>: <span class="literal">false</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="主应用中使用了-antd，页面报错"><a href="#主应用中使用了-antd，页面报错" class="headerlink" title="主应用中使用了 antd，页面报错"></a>主应用中使用了 antd，页面报错</h3><p>尝试在 .umirc.ts 配置中关闭 mfsu，再重启一下试试</p><p>另外一种可能性是不是配置一下 import 就可以了，没试过，可以试试看</p>]]></content>
    
    
    <summary type="html">目前使用的是支付宝开源的框架 qiankun, 主要原因是因为我们内部大部分的项目都用到了 umi, 然后 umi 有个集成框架叫 @umi/max,正好集成了 qiankun</summary>
    
    
    
    <category term="前端" scheme="https://blog.jzxer.cn/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="微前端" scheme="https://blog.jzxer.cn/tags/%E5%BE%AE%E5%89%8D%E7%AB%AF/"/>
    
    <category term="microApp" scheme="https://blog.jzxer.cn/tags/microApp/"/>
    
    <category term="qiankun" scheme="https://blog.jzxer.cn/tags/qiankun/"/>
    
  </entry>
  
  <entry>
    <title>问了问年纪，她说刚满18岁</title>
    <link href="https://blog.jzxer.cn/20240115/20240115_she_say_she_is_18/"/>
    <id>https://blog.jzxer.cn/20240115/20240115_she_say_she_is_18/</id>
    <published>2024-01-15T06:14:00.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="5310ea67427278427b2783688847e989c58d7317be5096074808657717d790d7">9f569a554bb0ffc9fa3fcbf6978f7899988c8e057500fc70ab52bd32e00a7a9545077b47911f2962a89cbd6233006b17c66fc531dcc3474e24010f034b3d06b395da9c9e6e509bcf12a318de0184e7eaa6c93547dbf54e070ec1212e3018aa7af445df46373257b92bf2fb6973d03ed8ba6126a873085a1addfca57385d2ddec74be10aa1b273ebd08128d7e2dcc31f5f8c18e2f3e043a01af6ce9a590259800e98dc7a4f4510266236953d123b8e6cd131fa15dec3b487496e24d10b5f6e51e253cba8934454d8618ea8229bc5b8aba048a2dd45950253fb5336e74a050894e3f5ae4112f73da226427013aab55fe950dbe1ec4506f9785342eb7953bf2199563b4bb571d2b4d1af5e3851986bfa5ed2bb434941195c2467e092e5ae7ebcaf78e91e2b3d3b038f38c21a725194ad73530fcd77ddffadbbc48fa4bc2ae36fd293ebf0ab695c2aaf72a89ac3818e8a4e3e510ffc1a06634f91f87d2f82bf72894</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
    <category term="把妹艺术" scheme="https://blog.jzxer.cn/tags/%E6%8A%8A%E5%A6%B9%E8%89%BA%E6%9C%AF/"/>
    
  </entry>
  
  <entry>
    <title>周末滑雪场跑空了</title>
    <link href="https://blog.jzxer.cn/20240114/20240114_datingwithcc/"/>
    <id>https://blog.jzxer.cn/20240114/20240114_datingwithcc/</id>
    <published>2024-01-14T06:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="1a78af1f5c275ded00773e7ceb1dc72fa84952494e70deb4234221151ed7987e">9f569a554bb0ffc9fa3fcbf6978f7899ef94aa0ac331c4083367ea4198accb6077a7b8d9028d15fde4a5ebb5deb11afda825fe8eeaee8814aa856ac688d1dfb801687423416b7a414e9df82a77dbc3139005a5960fe6cdb64df04866292a9dbde7eb6ea746fcf846b2cee435e317c2ac38a7d0b05270110287c93b11133052ba489431dcf16cdfee353015e8230fe6f140f6c22a176e5e882a4a8383d0b95f180db0d628785f2495492fd282319c97af089af82428299edc4fe0eaaa62a49cb9eacf0a788d2771ccceb11e47052deb2baf4ceb49cc74835e3369a387a0b24aad0636ac1cc1f46a865afce5817992c4f199f0274d46e1293d8a3622f6bde1ce20c3c2a39bc4ba968030f2cb52251e8bb4d53cceac36f7b45c63f6b74cb78d51abc1f917edf3c97f5671175b5dd3da4ab8527d5e5a40bfdd8743d6645609b6ff2e</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>关注自我，认清现实</title>
    <link href="https://blog.jzxer.cn/20240111/careMyself/"/>
    <id>https://blog.jzxer.cn/20240111/careMyself/</id>
    <published>2024-01-11T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<h2 id="注意到自我，关注自我"><a href="#注意到自我，关注自我" class="headerlink" title="注意到自我，关注自我"></a>注意到自我，关注自我</h2><p>很奇怪的点是，自己的节奏会因为看了一些文章和观点而被别人牵着鼻子走<br>构建自己的一个世界非常重要，它不需要有多宏大<br>重要的是那是你的一种对世界认知的态度，一种理念，一种生活</p><h2 id="构建自我的专注力"><a href="#构建自我的专注力" class="headerlink" title="构建自我的专注力"></a>构建自我的专注力</h2><p>不管任何处境中，你都要保持好自己的心态<br>那是一种不骄不躁，不去担忧未来没发生的事情<br>只活在当下，只关心眼下的事儿<br>把欲望收缩到那几个点<br>3个是我们最大的极限<br>1个是最佳<br>专注力，执行力，耐心<br>既然都文到身上了，希望能够实践自己对自己的承诺<br>不然所有的一切都毫无意义</p><h2 id="落地"><a href="#落地" class="headerlink" title="落地"></a>落地</h2><p>构建自己的价值体系，要坚信自己做的就是对的，这是一切的根本。</p><p>这里我记录两个关键点，一个是认清自己的现状，充分了解自己的不足，去知道当下自己需要改变的是什么，查漏补缺。</p><p>另外一点就是：完成 &gt; 完美。任何事情都是先做，在做的过程中去贴近完美。</p>]]></content>
    
    
    <summary type="html">注意到自我，关注自我...</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="思考" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E8%80%83/"/>
    
    <category term="哲学" scheme="https://blog.jzxer.cn/tags/%E5%93%B2%E5%AD%A6/"/>
    
    <category term="人生" scheme="https://blog.jzxer.cn/tags/%E4%BA%BA%E7%94%9F/"/>
    
  </entry>
  
  <entry>
    <title>如何diy一个观赏性十足的迷你机器人</title>
    <link href="https://blog.jzxer.cn/20240110/20250131-how-to-create-smile-robot-face/"/>
    <id>https://blog.jzxer.cn/20240110/20250131-how-to-create-smile-robot-face/</id>
    <published>2024-01-10T06:55:57.000Z</published>
    <updated>2026-04-04T16:00:58.308Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="89f091330180f066436c54cb9952991635ca81657f8c135b18e823a098041244">b82fdcf0c4b3de573f17d7cee9035529435bf37c6fa85f03f7753fdd6e631770a2ed85099ff18e5a5e83e8b50b25b0c5f62b79342933ca0ebb63f45b642d314a9b243167caa1cdf75609156fe07b68dcbdd7d2a0ed0878e12334eb32d13a7a5f021e1ef1594e02428d8661fc03f8de2834b3697f210eb489e49fd141e2f9259a929e0ebb53c34ca77b9979c85f5368bab442d84f2bfe048d9bff1afe3622b386c4b2b29c7f2c4afb06c95ba0348307670c4146a3b5fa23ce54852f41621de395adb28600c61dde79d725caf1df1a7675923e3fede181296d1a9c1c40ef746df4ebcbb5bc784777673c19b7d3094d36c93bded08753f013fdf39ccdacc6f99b2c9739b2cee913e33d728547f59f2708a3db9c7fffa22f4c6ecbbfe70e193737c43db8bc9b660e7388a98cb82d817dec86d6f3c7e61cdfb1950a27e23c3bc565ccfc8c472f4e4f25019b415f4f14d5dc120f08c8d9297d28efdc97188b2097215ed24b2fd8600e0c934cd8a6162e264d8f0477cee84c98ea532c866ac0d92dc377eaff3e08c0146a9804df0c0f1b42387a84bec1d977fa15b67230a0789ec7a38c663e937e8124dd151a9743f0a00aed0e79736837297ae3fe753f3b2ea1a24da3474e72c7d2c8231a1209bec470b3486bd36d3a53518928894a51a8ccdbc5e89a08827c2274bd7dfc094a3e90a91494bacbbabde929e03c8fe795c5b629e06cb999f2d9701034288fd620aa2b9f12f5fec0db0adf723192d54e0f8a91e16fcf057502560efe726d1cfdfaf0e4af7e0fbb368a62545fe076312c962047838877a0ac05260c631ab02e72d7d66a393b9de914025d6bddf8652e14d1eca4f4a231587cdb03b65bb5627cceb4bd931a0fe5de664b851e3504b7d6568e15d1b81958ada743d01f40d176d0c406c50985ed1e6be9fd2990ac92a5b611c146dc9766f9a0adb23a4cbcb09eaf2c025badeee6da908f67ab6eef23dc586e514741fec8ed7e1d8a1f1609223aece09e23331c8bb72df28efca1d85092c8c00b560532f45b7056bbc988a252b3c394e800b3a5aaa031efdbee9ed24990d41d8a5663885ec09bc0ab7eb5158f07cbbe4dd840736f187f9de6d8c4e95e23f54586c8605a920c984f96bb6ba952177eebe1483c73ffb0eb0999c7857dc454228ac32acb8c3082496dac1fca89ede78b56aed769c86793e86ae049c85b55cb05a9c649726ba816362facf4f0246f486ab2f5cfdd18c0267e00aaffbaeb90137d52429a18f6a0e7820cc5020a3680fd1aa8b51dbbdc45ba4c7eaf45ef1d2e7e19d2f49b95dd6f012f04f0ce091611aebe0649883c12016c3bc918b3365ec0321022192cb98c7ac4e5063a9b553f9a33a37dc0883dc9b3994eec0960d76a431b37b96fb286902d3ea8d4ec7cde31505dfe81516d950366b9fb27131c25a1ea4699921c64cdf13d35c0cae9afb22f97e84e175e31f7cc1eff82f9a69012b61e1ac7ef5ba8a9a9e5b3ce1b29db8f482e26975480c90527fcfd283f21ebdc763e3b2ddf9a821cd5563703176456f0f18fcbf9ef3226ae3338e66acffe81ecbf9ad56901745ca05c322dc82413aea56094f17f56f390ebb3cb7dbde25d0d6637d58b9e34fddc67c01b7ab7aa2baf0921b06fa0dbe4820196221a67b391bad536cd4d1957d1b48f937fd6eadfdf6b64fc5a5260e6faa8da40e8502488f425b09ca567916f6a9d947beef0e3fecbff9ab86b43ad6e5300159b1bbc6aeeedeac1fe8bde704ad05c07da48a2be7fe2f224423e4d4c96e83cec25ac7fd00dbe744e8c970bd05b373d8dc1ad6858c7d5da1ab3ecfec6f6348d68f323cb62c34ae9bcab40dc6a9311e290d65588129c794bcad3ea6f6646f696f9e381fcfab2f27dd78cc22616dc65eefea27f8215ea97ba0e98e126e97d1a91cdedfe21ae005c7e0fe40a816563592597fdc934824ae575bb87717bb36af1e1e76c7d51f70522e63616b43ed3369bcfb3dfca04d5ba758bc365484e323af6ae6029f96aed6ebed2260c33ff9b81c4f194a2febfc03849c8e610ebc8ebcee24ee38e162394051d076c0353df6b6b5e6a6273569f3bfd06631752de83250d867d09e891f87e6950dcd46ae26793aa515fefbec96ba7e2b73aa30342ba9e07dcba6610431136daa4bed35756c531186d584f4daa5428f04832357032b388747deeb1b37a0a8a5c34ccc984c852e24d08fadd289f06a1e0e3be1d81a350b8cc9cc70c3c0bfc0b914be7745beeae90b1ff9f1115aa9d2fb77a9ed624236e50d43705a6f1a681687bc5b6207411f7776e5d148ee87c8f0400df182a66d1ccc126619801f0ff9c79ca4f8c90a509034366c27be74cf543423beccd5050fc002b5b3fddd003778673f3b5343bc6b77f53cecf0b645a8f49a360036d6c5a59cfa5750c75c9390d6a49275284f6ce0c534cde8695d17d2b91fb5c2a75cbdd4d16ed9e4ebff53570bd494c7122c091ce009b903094c523b9c49fc78dd17b4288594890ba4b3b84b0095e7744988494c3d1f50ec0e2e6af6d2df63704f1c6abf603f1e806556d31461fa42cc2825d025eaf7de487f75f032233f43e7b7a99982fc63895cd4e97153b6a79582b141adcce01786d52c206fba71bb65ab085a8557a7ac3daddc7f7f0794f30160d3fe237795b87ddaf2597ec08496d0d1658b724b2e65bcef1d65e9ceed00dd93664d42fcc63f3af0a303581e5b20e9a33dc6b57f13604b0f4be7b05de4a36c733b17258bacaa4c779605d92199d89fe2697bf641f665e5193ec5db0a1fe049e9cb8f1a78ff867b7c35d9d24f07a7a3b8599fb322d9a377f7fd8abd7e362cbcde641b99e1f322321f16b263d60327e4b35b12e196c4c15159539c74c5d1d233e0100c16c01fcb5b5a9f18eadaa15cf0c94ec817fd2a6ae9ae9b014c497478dd32ccdb8a57af254210da5d20e635508b10b82d049a62070df214aaf42a300f21ec6e7ed56f4af647c1bbbc0e65cb6ef636945b42b07b739093425357fc1e5e38222f259ea6aec6e3cc2e70ef6687d4ab3bc2054eb439d5e6c291a627004382c35e02b8fdacb16d814259a318aaea319b31bf4d16055f8d8fcddba6cbde2b35dd714a96411cdd42d1bd933c1b342269bbab23ff1ec444c6ec102c1e1d7259df8318b165e3ba9cc9d8b019accff2d4b031d97aa1e3144ddfb948374798bad27bcefc45cb2ca6e330fa19811e401af087625c90ee4bfb8370d8efa1dd9a748b5ea6d2c5c688a62d20cdb8c69d7ae7cb19edfebae0503fb2acab1f93c6b2d20271e03cf8c8656b2765fa2e9d2532c2ac0eb6d176ab36dbac2a4b08dbabb39ff65b2c8dd89b44b099e9eb0c2f3f91a9b28a477bc76a3d8c6b3f8e1337eb95aaf392abc9490cde77e08fde6922b2deac2256774362963b1212c8bf81bcdb1333e6810eb118a58e2763c89793caa0b0aad18d7c1df6cc0a06bc4423c1c995ffd8b3ea03388c0d32c872e31c06862a642296b4c2426ca9b6be8e6310f09960058c96a8b8245cd2810149b142896a183bbb2425c61470114b73b6f3f9de238b5c8be1072922122b29118855a0eb2ce728dff21ac</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="AloT" scheme="https://blog.jzxer.cn/categories/AloT/"/>
    
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
    <category term="脚本" scheme="https://blog.jzxer.cn/tags/%E8%84%9A%E6%9C%AC/"/>
    
    <category term="esp8266" scheme="https://blog.jzxer.cn/tags/esp8266/"/>
    
  </entry>
  
  <entry>
    <title>一次不一样的跨年</title>
    <link href="https://blog.jzxer.cn/20240101/20140101_datingwithzq/"/>
    <id>https://blog.jzxer.cn/20240101/20140101_datingwithzq/</id>
    <published>2024-01-01T06:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="97bf986af41b558b749527a063d8d68e305feb2fe24d0b493450e45d117f938e">9f569a554bb0ffc9fa3fcbf6978f7899ef94aa0ac331c4083367ea4198accb6077a7b8d9028d15fde4a5ebb5deb11afd2b1e90c54adf9677375f042b6dc7f8e078ec39aa8c40b1e47fa7b1db18e7f395fb886ec9d07a9121abd18720091eae4d90b41c0a0bdae48da902b30e9cace7639ad45d9d2fa0b49dc0b6508d15c69536addae8f684c0209be040e15e9c062f3d3b2da7a8b48a6fd879ab3aa911ec02c344a39acb1bf6fd684ec4d23d89ab9ad7785763f5688901ab0906ab4f7dfd4695c1019f7b548ef0335b60f37368ac1d69178f52f44fbc5da2cda04a904937830520ddc6663d0bc1e3f0e1dc3e81426dc547161112a2c98d6c389f0ffb0d950b61</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>参加杭州本地活动意外的邂逅</title>
    <link href="https://blog.jzxer.cn/20231203/datingwithsummer/"/>
    <id>https://blog.jzxer.cn/20231203/datingwithsummer/</id>
    <published>2023-12-03T13:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="777ef88529ed713a8504d52e3899dc897709d9167c7eeb3da2bc690f4f5e64e9">9f569a554bb0ffc9fa3fcbf6978f7899ef94aa0ac331c4083367ea4198accb6077a7b8d9028d15fde4a5ebb5deb11afd744195e6c0ced5280c051e9d1bc4b88b06bf5ffaed796658d78b208c8c77bab8dd4b0d49ad57df2f6ea67a29d841b5738114b19a46c78ca41072d09f10db5c10468f1b5aa51fd107bcf6fcfd6b0958f5</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>酒球会遇见的暗黑系摄影师</title>
    <link href="https://blog.jzxer.cn/20230915/datingzaj/"/>
    <id>https://blog.jzxer.cn/20230915/datingzaj/</id>
    <published>2023-09-15T13:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="3e83cda2b62aab3f765c7f279f37646ad84ac787f575dc8eff97e91ca7069889">9f569a554bb0ffc9fa3fcbf6978f7899ef94aa0ac331c4083367ea4198accb6077a7b8d9028d15fde4a5ebb5deb11afdcbb3c56aa5beb68b984aa5c449069e81b86466aa63c837ec1c300fc3a69111efb6df0cc80e152ae02e0ba1665320f5ee3f45767b0d418ead9282b6ccb6aad91bcdbcd4744164793a3aa3b17e919371a89a76305b0cde1ade209d2e636ae274d64d6bebe8dbbe42e3c82050f3504b703521ac8b5ee3357dc5edde367808a8a82d3037a18499c6e96c88248992e702b1426e742fa4d994e4b4fe121aa0bb25d81e</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>天空泳池派对遇见的她</title>
    <link href="https://blog.jzxer.cn/20230825/datingwithff/"/>
    <id>https://blog.jzxer.cn/20230825/datingwithff/</id>
    <published>2023-08-25T13:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="304c02ac11a3d9d1cc331317d4536e12184d1a3d38cf5d746cd9ccd9e9d79d64">9f569a554bb0ffc9fa3fcbf6978f7899662edffd3abcef5f6f8b61c57485306a9df4b7fccb1b4bf2521caf893485482edb4b71207d7c0c5f8dff95e46825ed68def053076f2037e117a8754c435e82d85ac34f741597b8a6640c6955a52fdac15fc18f7d7ea51fdefbcdee493127efb06dfa2b06f268ecd492b2090af089932cd322487c73a382eb56e7e30124cf55a22a0c67ab7557246beb92d2e13ef225061e48ea684e130d3b345c3b7c80c72d6556bb240a54a9480c7c20d2bf9baff2b837f10cbd67d617e3398d55029ded9f600c399d3786f3f003121a08d273e6f1970a544f4ebcd80cfeed0502ca6b32be091a63c5295196385be6c76c549faab10275435673be47e3dede057ac387638a0ad9309fc3a2961acd9a2239a5b91788b3b26936b96750510ae14b859e29853f6d209e237ed3f15d356dd409a91c8dd4baf779743a306afe4390ff15d7c0eafdfd284a6d2023f2373b2fb116393ad29047356a890fd7da36c3a49492cfcd36044654901e123a82a60d0715a56921957670c12369ebad029e429b4ba03559e537f96f7cb602e0a392acb74c28570c78a06cbffaa1cd33af60cb94a336d607a43debde56ca2f34b373db35545744f0cc4c85a9106cc4b28f3bd92e99bf0d604af097acf443ed898d59a2588bbad0d03d9bf3fb9b0ce044a19f575b9682c5389f2a75b2785de07c6fb8d61c8cf07021f26c2c985dbc3e6ad6eb457da53ec5f61a4ef6d7f5c8b95534ddfe7f294895f84a0bdf3b913b5db312e8464956a38890576f25347f388539daed5f2252e8094c41b948367ddc3892ca4f7ab4fa21e43ae5a74d1c552f23514fa1c6fb9ffe55fa135ff619584725d806d7190b62dc5ce85d3021658d3d89c4938ba322630f5787bc673616cd8595e03ba6b6d2168dbb644ff837d6ff69858cf63eccaf1d8bf41c3a146653714966d1bd86ea925968412fa5a9c93b13887bfba270d176ac3b1f8a0eec0a7d4a3d9d388213b3f2de5a64248d854bf81a0174845ff6f17e71d795a333520062cc19dce45a8df75d73fb181b02cb585b114f224d6426dcd2f520d6462eb3aa79db4b8c32339832eb41313911ddce628a1c3b6d8dcddbc2f8dd5c6d68ceb6294513dbc77492c65f598a41130d84d88b7badd788ecc38e6e97bbbfb12d20c10fba9dd36f8c008725a9967e1203cc168e42b73cd06774ecb8e24099ee3876d5f6f829882f180f41d4316beeb0b207a22193a0ac431014fe0bb2f8673529d556a8bcccb072a7851bf40aa94962493c7253e15676f51cbd7e349d14f5a8ac299afcd48510433ce7cfe0f1ac2f780863b0946ed0690f91cf2a019e279471466f87af7dfe108c10122431f1a7e66835a95bb2ef702922255a08c3b223a23d63c52627c0139cdc2c017b49a04ddc0fa6423c84665908a025f27a304b9eb55b505d0ff5e9171e81ebf8c2829723950c67fcfd97ad024be8fe1fbb02f3f22e63c71b36442c70666b9d415fa4e8d8d42320a580ca45c069b2a7b8339a1062d2b438a5cd4d06f708721d0af30a4de29ae49edf792c3e90604a5bba1de21edc129b8b8334be597e7631e8feb6a54230a72ffdfb8f5b841cb7447a1f937ccba264904e8462a07f701a7c6f7f501579ca66845d3d618258cce44c3e56610007895faeb7d58044aa9264492f23d830fd9c6c129d7803c7353c2fbfe8a836eb60e415dd38eba75f841ebd69d6202863d336efba049659714fee966385eb11687677238347a5ae9a6a44ec2e8e8d79b62c7758cac5f563adf41411e416649e76dcee034075db9dc0b9e902229ef83534da79b4c4f1626377a10be712ea416f984c0b67b7b26a98dd78cde8612add2e70cf4042386ecbbeef20fa8aa4f5d6e0d6e7b4823f5e8422bddd8e0dec7b8e3dd4716e6a57db9e42b9da1ead289eabc13cbc789e4a99e4c26428b7159486f62c614f7e7118963f2529</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>一段刻骨铭心的恋情</title>
    <link href="https://blog.jzxer.cn/20230813/datingwithykx/"/>
    <id>https://blog.jzxer.cn/20230813/datingwithykx/</id>
    <published>2023-08-13T02:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="db7e465e6af7e7caf689c96272b480bdf20a5f57d6d8ed6b60adb5388cf30f8b">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf705181ab16943786c1b91b9a8559b08af15a2b55659cd5ad37c4f0d5999c03775d9f796990fda556de729e32f997ac9a5ab3567b58d62a8bf8a372818d7fa7a8605ab0bed4dd9a2c9b2d3ccfa7639fde2aa904a16001085f4b8ed97fe934182636fd79b1cd17a514e659ae69e9b6ebf91c5a4c47d99d6493d8b8a972da4a2e4bde2e46bf1a59b38c5ea75d70691ef7eb39e4f6fb37e292d4bca7fc14ce0fa82bdedc624a305f050018eae6d20848b7c2876242eae5b8682beb15e55a971c5a983eae735b2b4598dbc1164f2dd659a1a17bed1449c75da373adc346e5148c258d5b5f0f7f94c773416ba7aa0dfd8e0630c88f235647264ba9b2f1f0919a6493407c0b308791a50db1b958aa1668645b044916af27b5a690cb1ffddc8bf92805e895b27701c74d977386212d63649fa58bdd2c19fdf0f081d01b63540b4df421e7b8fa3a1fc7582b116e71cbdee5480bfc3faca4b09c06eb52f89fd95e920d61d84e6af1c3bcbbe38e52976bf4d12a5350ed61c6443e099caa26e5d2aec8acc2dd410929ef213cc09d82ad89d1add13ead1f46d451e5962f560c1f67bf0b599fb0c86767973bf6bc65f97dcb9d035e545022b94b0870f54129cd2cd3c96a93565776a0d9407edc0e5b246a6437c38894352e92f22ab1f743c54ce601d8e8e3b6e1fc5463b9b518a9980da9176ddb04499eb931e0c76464a991750c727754dd2f0cb5a56d8613dba16be2beda43c922873191836866b0f692587a6ebb2f310276889fe9fcf6c5f3205722ef56ebb04631f486a6442c411ac086e25bfc26ada02631bfbe9acb082de126efc3dd8882d7fd002657b5cab993eb346e7714429f9d66b22524d231038e710611c75ad200c949bbef9b17dda15db0b9d89681577df7bdef312d2914b4cbe273d204e1336e80eec527441a95bbb692cf58f4813e941beaa139943bade4157a57490516258829a615d5f04066c95869ee91579d5e11d46435cc49c307b086ec3335f404cb1db7d03b017991dadfc80d6d17398985d9b7cb7f457985a603a7e3b97cb00f69ae4c62fae9be60edaa984c1f6170219f984422b4f300ebca4cdcfa8a2b90a18470d172fe28ecd5647e7df69d464283c0818285dbc9a9d57c1d0e2da2402d37cabc62a59006d8319e255b3523846d9838406dc3fc316424aaaf4d48285334c7bf93cb8ed18a6fc833defe1644f5e8c324f26d8fa8666dbbff524ff6eaef41e75fe16528186ad76578f970a282f787fed5cd658bc687721018556fc32ea24789100d272b8a75a5dd53597844436359016760f04fab05b2f7ad4e8c069ddcedb0ced38288fa25ae509834edf56396d775bfe6b00b93046fac904b963a788fa61fb0dffc54e95589f95044cc90b00df20bad9e3222ca398040667606f82f6ac3d32e07cb9c03d803787163af9c25cc29a3ac27c0354a5233fbbbf803ff33a37234c07e7f1ca218b50f4bab8f0217699caea109d4554177586f107c535c2649999628fe436c1e31c80b935afb521ed6a929b992e62d0ba7606006cd2e7d13a46566ce1a83ab750ee4a42143ccff2aee1dad2455268eb715b896f7129241c9ff6426ec5ed25327a9c35c30038b6964186637de7a5ffa32fb68ddf3f6191ffb834bf6fc95f6551b71122bd8d65ef2a81f2e2d7a286e7fe0491149b0c1ca19ba42b7ea75285154475e007bf4f7f60e90ac4a97e75071f306d9791870790d5365e48995abcc0af4d084c7730bdd29a5126ca67973a18bd5823b2f6454488de55b444d31376261a5ef8e4a225db00d02ecaa14309e55df7aba8051ea7bad6667a8f4983db159e3ed5c6c52546cdb400e6812dd8c856178afb8cfbc753edea524f672bc89204190903da2dacb407c5f7927806d4decb402ba0f834d7a523bf752df0718b459c2c8a9188e1c9361c35a11ccc56c20dce7cf3134bb85a9f4f11edbe59f56e45573c9ad7ce41f3e76cf5b18a4dcc2e4e2e308aad3e2921ede9f95ecd263882d91d0f4cf9ce77117320125665d7ff74b06481a2e93bf9771702ad13a79b1a7d586eeb15f61d604e49a948fbd0fee72955e52388bc4a3318f16021e3ea81b96a6fc6fea453205035fdef29b384875aa6c46ada125092604c3a681ef7022543eb9d817d8250bc6b7639051cfeb48987c772952e6cf88bf81cf525e53ee4399c5007bcd881f5c87d40a03c1ba289605895c5e7c7e4f3fc8fc69b8ffe16cc84f19b54e01c945db7bcbea87fdd3bc26d8bc942d67088dea4a1c4238bc58ed90ce5f0f2362a5772b4a65d0def6a9ba4e155781198186125a38278f997a3726639a70b9162465fc7cf7a71a3d788d262fc18d0ed48e3f5e44821c0943fa8613b7b4cc59140566c171d31675f957f993de250adc9ec3b73c938cc207ee1e66e3440273fe7e40d0d91b0d9c52c57d6b3c78f60795b3c7eb1616a45a11bce34c32c62d7b6ada79540a75255af1bc01a442af535d7804f19ca8f384feb72afe2b9c79f7877f3df3ef06bba3a73bdc88437891cb39f241d85e0a5be4cb9b70893a5823aa3db2f498c2cc703a292a4ddef6b4e47467764033305d76abe960a18aa6fafb308518e892da6a1cfed3f7ea27de1a5c1e80d2a6a854f089162b095194f96e70540cf8261ba70e37068e538590a9fba60c5ee0d3ef38b26d3c986bd7e4a71f69ddbea1eb127e0b63107ad04266fb69dd677c1a0d6cb7f541481ae29dd74e27005909e478d3828f9d9f9c7538f122b081a936c91c70bb15360bce9db88e585853c603188d5144293dfe5a7237891de19745caf2f61a221590a3fbc8163e18384e4e5e7b0d511bdb11e5aa34d4177d49530d19b81f9fcb2ad9f927e7daadec8621e045534e7827275afdd7e134ef3b888abbfe29dfb59739d79291c827698d2c97a0772c8d17c8704fdc64ca7eaf905e1453c0ad7cd2899d57cae12e033b4666f8932cd54884068310c0d1711dfaffd27ad29ba387daba61c87dba806ee7c8e3ef48160da5f6e95214ae505fda002e765b74154c8d021a3ccdeb6a168f9b34b4174646de083ac1897b7ca6c22fb72cef2c4f7bdc112d64891cb5299e3636636ad71ad9514ad4b7d76ca3f5509f47cbe5073cb7fccb87eb8711236e617121cf6d19b8c59cf2d65ea037c48d88307fc6f34f458e22b5be4654f8471226ef12784cffe7147ac1038fd02effafe33978b5880e8375590ce66ac4d81b1a156c4d9d2e38b5337a85d93dfc8a198e108f5051ebdc42fcb31bb81f59c10ac3d15353afdc31f467476b0e44c747382a0694bb57aac33f58450a8a697f9c4c19439fd3a62d5d93db16dd66c347caadeab22d801c3b2f70645120185c2f6964c6465e7a21973d8602121ec8f8d182c7f3b026e2e18c7502a6568b6725d89f6fa47c99c5c0cc24541856c4a014a3252a78091010969504e66a5d432634ab503021ab16e0c8963dce5d930619ea99d58b892daff9d18f66207c8487d32e7f13150afe59c3dc40288929fa179eac90c9104adfc118112c31b8bca1b4a8f11249525e217d0fbe6ad5b81ada5289070126db4443d5a49492f9326e04ea885665729c419563a1d83a1c41dd96f6b83f40eeae7f6d9d0ba17d7bb55a766ba6de22e29e402ccd46e0854893240657a999fab834ae501095a58e83dc26df3417b135001b9859c1ffaebb9fe56d14176e91add7ea70156d8ab48121099848303ec004998aaef2c03f13793fc5593c4bf0d267a1133790f14b05c8a271497eff4cb699af1ff0acc2cc8c8a2432a3415317ec6cf7d73a0e1067140bea51595d8cd6d0f09785054932f8c2d4b46daee33e2864bfbd40a6eee618bb0a136eb35f81ef1a5ea49ad9259c24568872f8f5c75d0d9b523bce864b66837910ce2202ae9d3a315709380b43a143b65f42a8fde855ae92ca17df57afdfffc75a4a9d1f676da855a137b86855b053d1cd7e4892d95152db9daa103414d7a54ca7ec4d2f9b8c42714681655cc8dc7fcc37d8de9226942a8d8c5184c347cf87e21ff476a28ba02d03a70d3818e7a693b5af87076f9a54e96c1a3533eeb850222e4231c4ca471acacb1619d1dae4884a68401b8d18cd862286363686b61955f7de1078a876cd85e004226982f0dc01d987550207b9595feb1ef0329412f999a8eccb79b4bd0b2c62d8d77b52e8a28e57cd1008ef986c121cf1adb206796ce87266bf0a03d3b25c9e6703dce3c051fc0ed3f281d128e56cf7d6407e6b32d629a2472220d0b0820d02526d8fb2213c67517beed4ad9099029213606f9c400f5fb42615a589e6dfa97e292171f5ca9d928fce29d105363d099869b404d2bd76b7a86db85cd7a80e8030da8b6671b739b92e6200d31aa235b064901a0e5b135e3abe003c2d0322756d3d9cc45d3bc1ae707f366800f437be23f40a1c81eb47d4b10fffbcc6c00d3405143c38485dbd32ea4c98d5394c3808272714d8a5db65bd59371c47693af8ca9205668868876bc814f7acdda137738f1ae183988cd5fb2c7c8952d83679c3e74fc1a103c4c518222df1946b682e9ab1952901f774aa83320f19ac8ff8f4e5b9f3bdf7ce7030e90b2736f94f9d95f4d09142b4a520f0b2725552b4658a2a92e72541194fc348db7915217c6b1d3811471f548d6db9a383363dac7750792b22d015c07acbb3f6c80d1582113c4742101178c26adf70a6bf6ca5544a4fa516f5bc6d739d35037e647a53fda4cbcefdf7042df57a9ada9c2f91f646c38063a2662f4092d1f37a8c6f1fad61d2b5b168748575069f4339a28b3c49d09d06b4e378a85a5f66fbe680a1cf2c0dd3fd52f94c90bad82aeeec47ad4c78bced9b450d602a68b8555f0af602189a52b242f9cc7f495fb5d7c0cbc94906e24a0aabdd6cdf9d3c0d33a800807a13324a20e63ac804555839d8e8878f130a4645ab21856ce5e012d88777d52380ae26a0b36d041cbd18e9b72f3e77b6349e17df0076b981ed6ae44c7954195076c90baa8d29fce5c5720da3c0a805be7c55141baebe28027cab8749de6e68179b13a4d77a3f3ec3d7c5b1342d6b6c7e0247e8385d81a193c480955f08b5a2e2adbedd95cbc33fc4491a60cc2f31f38003224218ffcee6c05f1cffb0402e4556819a8b3a58975831a8f828eccac790854a81ccf481db29ebee4a0eaa36212e2194dd7fd9310c863202d61c0bdc8b2b49e8e23f66713925875a0c005d8d655abcaa63e127ba904162a635f8f4c51337bdde87bd0b85465c3a847e366814645357e4ea95eb2d6b9e9e14a7175d46c699ab9284eb53a1b98f5ee0e0e976297efe430fa79ba5deff1873a373c226cb327ad037f8c9a8288bd3ebe043754f8c66ac50d2e14fbaa252325a072b1544ebc36428624ac16d332f93befd7dfb47f532bcdb7a9769f97d178c181d3e89862623d700d19fbc83784ba7f5aefb76ff85251c6ca8aa6701ffa20daf42d849462d424fea7c8a28fd8bf176542cc3838b1412b62fea34b7f6056701dfdbe3863e9a707ab1da70ee7f3ba8a7b9919f84421a07911e6b4f51031356ab71fc790957212c798d8a7ff90c43f6082650eff6314013e41c56c932b95c60aa16428fde50d453f028962a17b35d9653526ba3c3816a48ab813f31b5f4791fb4a6dc4c75c92a2832557336d216c96278047e00338d2144b82fb88f1909f12239d817bbfb21d32674e5da6c7a82ca936c36623453b12b8ae102985c3435145049bdf7ad31ea84d942cc9ccbcecb988cc244b34aea4a701ea8a92a7eea61a85582bb89fd58a0a8dc83aa90013812bc7931685173ddf8e484c6bf50363a2e0ec2b7a737e5a724fb706f14f1c302887a3f6db4652492bd8fc884438ee8407e5277ccd55a23a6cf6d783b113c6c65a1a3ead2cb48c415166e2e1db6de622b65b791c76613a2d1b621f78ba4a337a8cdc196feda45789bfea25963b0556d707d876100675d022829db1d6f21a2001b35a3b1cf2294cbb86038b27ed1782af942e62b8e771544967a5d308ee</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>在上海的第一次邂逅</title>
    <link href="https://blog.jzxer.cn/20221210/shanghaifirstdate/"/>
    <id>https://blog.jzxer.cn/20221210/shanghaifirstdate/</id>
    <published>2022-12-10T10:00:00.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="b1c1ce9527665ba5fea824386e05deb8e239f28df0661b2fe9f5b38045b20908">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c875209ffb8cc4d239c51d3396073681a8198ca7743daea8a5667b0e0e30547d5083c1f27f8c19e93c327388fcf52c0606de1ef0e8aa9b36ce9a835c33b153bcc5a5bbc8b8c727ecf2e428fb637dacd68671301b7cca4d4e9b815bc67a639b66085b006b50cbc80b10f55307ce171faa579f5dff03ad8e54220f1714bdee529242e41406ddefbff93f102ec35c00f0df70ffd01b33d5c32be92563d043a59cd589a3715f7a250f6e30a5b109b65b72cc7ab32dfb1c80311f26184cd448589734b2b168134fe63464e0015c392a5399bd78dc9de1705b9cb3961ae714427455ec105080694254bd75a2b508f3414b885867f95cc3995a719ece3136b8a159de1ce24cc8b83f1d6b76562ce0261c6b9b809e570b774a227be7d0b4b16251dbc2f29b92374f10e0a3e21bf6b3372a457b05cc90e1325b1d4d7250468cfd758291fa1e745a76514482ac091829146f1658b7a6388d2b846919911e73d90eff1f0f897ccd193e0a90ecfd3719dfe1dd37aeb49d3b9f24401f22b63f132f12388af22f5fdca018c583a3373c3ea17b914a2610c35fc91c55aa038c05f9440b386c0d80daf2fc67046f874f51545a7e76412f5f8bcd5d84966d8fff5ebe92276ce7e196bf77eb2fef3eeb62eef1415ef98733fd0e286238dc40426177373c1908dd359a83d1edb6f4239ad51cde139e188a14058df6257f77b88aeaa19d7ea4c4330d27819ee0623ac79422d8c1221eaeced2b8a3daa61944d0c6286a034c7f5abd7e1504ec9ef435e7ac67f31226d89284d477b7e6057025f162c06eb2eb746c9ea1aaa846986951bba89b570cfe97ce88c75cdeb0f59afa0c32af8d4da5a8a28388cd8df59ec89331506790f92b45f59e840380d4385aed37ab7b8def177a115859116f8597f9d4d0dac0ae7faac635741ece12f5f502a501bb80a617a51d047883935e7440942129406432f911008110057f45afba3a51bfe73d4ad3abe93ee927c4af10b1f319cd31e90841721271222a660851135d49950688f770a90168f1f9861754424b487f6bf98cb2d56b1bb79d69e46ebfbbebfb953a005c2926dfc62866ec4856b1fb0a0b277c258da842c525ffcf1e3cd606ce43c573227d5c7c648f5aa4a2f74632ca543e9905615152f205bb340708e020be616cc37fbefbf406f4204a29a4bde3db945df39a04ec54b608d06032aed144b1468446f479526fa581f77976069f20eea952d3f6a13d969df641783ad7ac0244fa15d1fc20ff49549d97a9a0ee2aa1a3206e89cf896a41b7036146b5dab6d8207534e1038d192cbeb14b5935dbdd71fba854336854e6448ba9defba3c53c69e8252692d403dc7ca9f3f1832f5c77b94c7680602fb933506f45bfdf65a9ea1c28781847f0c19e126bf0f13c5838b9abbed107261e72766d892a7599fc785c074ec2c0ae1a51984506fdd648a0fbc88a767c7114b229cff61f73ee9c2f974bcb4cfe4aeebc942fd2dff7eed9afa0076545fd3db27d8f6429a2602ec983fd6254b09b99faba307b4bf291b223567d425cbcd58e048a63a9e0efed4809d8c24187ce60c824eccaced5fdb1006c7b80d1ac62e58d0d358b73d650adc7702701740009421c56a98e44ec4e2da0d4badd5aa919a69e9f52db02c21a10005ff34b722601e818642aa2051d07857aab2f8cc8169277f6510be74e7b4c265648ed358a34eb0f5f0f66d01c3b186efc4a33d9e001f003964cbcee8ebb90fe44b506ccc58a958c71cf5cfcedba31cbc3177d622af10418dbe4f04969c264425f5d64e470e4b8180b4c451b879e563e5fc7ce20150e7ed86dc73f932f17b7563bd08d62d913e00d56e2af70a28bc11afa34ca4731de2b022e9533ef98112e51c47b786a8dae77d450918e59053452d8d651b1b4030c89676742066c02f41c53f944e748297d1b3b167c0293e51c4a91e6f8e72c1478905c6d2479461abc482335433707b084aa1beaab27231981cbd69bcb1c992d8057309f1c6f0fe7bf764ffe9192117a3571c3e169fb7b9fde37f1fa14244e094ca9ea905c5c7e319ca2c15a4e3e2a158b4b619302c321937fdf5e871f5356f02337193dd1668a40b34bfdb86f17dd05edd2536052305e933041adfb413ec62b2def4b39e9363a355faef25e988c7c8b2e9c7338ec4d7e9d08b2a0297351396ae8f20569709c1c55667938312b5d62892c481baf882ceeeb8710501103cbd0c2ea3c5494224aa69fe040158cad51ea9f1975722e6290c8779c2ef0e5a8872aab902fe4105d8d5563596bb5af347fc01b163bc2ae74e3be725392cabf91f0e942fff020e488e0840dfcbeaae2fc0567aa2842417e2ebb97e86a8a53f2e135f053920ae81cd66ee418e8a89b286f3d08103d07d77745d08082a7af09ed4dce3d67ba06d84d0e991662c69b324d85bd22324d79c2d849c13f451856d5c2b8c4f4d20094682b45d7039107a481cf4c9224a953d188348a6cfe2188b530b4b93a83e7c90c78dcc4a1e397569616fdca9df10d9bdc3f354ca96b63d6b0745ce795cd2e3ce4c162e03c3d72a5b7ca6fe4a73d39dac58b5fbcb2a3a304ee98dcd983e3002dc6eff903c451a12fd4b26a7e2bf39d015ad1e70f629409b27ab83ae3e2b608ea6349b89249b281ae05a59168cf95d33360a2e21e86b5724df59e703146b629ddbafdf9f65ccd349e5ebfac6acbbc07aa9daa5cc4263668bf22d8bc1a71603db5a86d97d2f88dbb6cd7d6e1f0c8059958dabf7f9bc10fa4d271b77191c778518e9b0f3aef6371f19b770f574d0b8c7cbefcefd01bdcbf432bc8e1f636eef98be7a8807a2f1755c65a4c6d7be9c6a4788eb36665c5c03eee1f6c7730d40b1cf7a6dcdc9ed67226b064ae0179fdd7787fea20bb86bdbf420f465b506e20f98da564950cbcd9c4a24af403381c5a49e1939485bc5bc38673c1f30301904dcaa8bf05c84c5cb0754140203edcc06609a5ee95f95a291d6bb81a3a5f641877e51e</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="即时约会" scheme="https://blog.jzxer.cn/tags/%E5%8D%B3%E6%97%B6%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>心流理论</title>
    <link href="https://blog.jzxer.cn/20221129/heartflow/"/>
    <id>https://blog.jzxer.cn/20221129/heartflow/</id>
    <published>2022-11-29T13:16:45.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<h2 id="什么是心流理论"><a href="#什么是心流理论" class="headerlink" title="什么是心流理论"></a>什么是心流理论</h2><p>是指一种将个人精神力 <strong>完全投入</strong>在某种活动上的感觉，心流产生时同时会有 <strong>高度的兴奋及充实感</strong>。</p><h2 id="特征"><a href="#特征" class="headerlink" title="特征"></a>特征</h2><p>1.我们倾向去从事的活动。<br>2.我们会专注一致的活动。<br>3.有清楚目标的活动。<br>4.有立即回馈的活动。<br>5.我们对这项活动有主控感。<br>6.在从事活动时我们的忧虑感消失。<br>7.主观的时间感改变–例如可以从事很长的时间而不感觉时间的消逝。</p><p>以上项目不必同时全部存在才能使心流产生。但齐克森米哈里也提出一些方式使得一群人可以在一起工作使得每个个体都能达到心流的状态。这种工作群体的特征包括了：<br>1.创意的空间排列。<br>2.游戏场的设计。<br>3.平行而有组织的聚焦。<br>4.目标群组聚焦。<br>5.现存某项工作的改善(原型化)。<br>6.以视觉化增进效能。<br>7.参与者的差别是随机的。<br>米哈里·齐克森米哈里可能是第一个将心流的概念提出并以科学方法加以探讨的西方科学家，不过他并非第一个注意到<strong>心流现象</strong>或发展出<strong>心流技法</strong>的人。</p><h2 id="通过心流得到的灵感"><a href="#通过心流得到的灵感" class="headerlink" title="通过心流得到的灵感"></a>通过心流得到的灵感</h2><p>各种不同的<strong>挑战感</strong>和<strong>技能水平</strong>高低分出了八个区，分别是：心流、控制、放松、无聊、冷漠、忧虑、焦虑和激励。如下图为心流通道模型：<br><img src="/img/gallery/2022/20221129.png" alt="心流通道模型"></p><h3 id="心流（高挑战-高技能）"><a href="#心流（高挑战-高技能）" class="headerlink" title="心流（高挑战+高技能）"></a>心流（高挑战+高技能）</h3><p>当用户在完成交互行为时需要高技能水平，并且通过感知到高挑战，且两者达到某种平衡时就会有心流的体验产生。最生动的例子莫过于玩游戏。任何游戏一定会提供一定的难度给玩家，并常常伴有过关打boss等设计来让玩家感知挑战。</p><h3 id="控制（高技能-低挑战）"><a href="#控制（高技能-低挑战）" class="headerlink" title="控制（高技能+低挑战）"></a>控制（高技能+低挑战）</h3><p>在驾车的时候，是需要高的技能——驾驶的，但是挑战感并不强，这时，能够感觉的就是<strong>控制感</strong>。当然，提高挑战感，例如赛车，能让某些人着迷，从图上可以看出原因，因为他们进入了心流状态。</p><h3 id="放松（高技能-低挑战）"><a href="#放松（高技能-低挑战）" class="headerlink" title="放松（高技能+低挑战）"></a>放松（高技能+低挑战）</h3><p>放松性的阅读和品美食就属于高技能和低挑战。</p><h3 id="无聊（低技能-低挑战）"><a href="#无聊（低技能-低挑战）" class="headerlink" title="无聊（低技能+低挑战）"></a>无聊（低技能+低挑战）</h3><p>做家务，需要有一定的技能水平，但是却不能让人感觉到挑战，所以做家务是一件很无聊的事情。</p><h3 id="冷漠（低技能-低挑战）"><a href="#冷漠（低技能-低挑战）" class="headerlink" title="冷漠（低技能+低挑战）"></a>冷漠（低技能+低挑战）</h3><p>当交互行为的<strong>技巧低</strong>而面对的<strong>挑战也低</strong>的时候，但是这样就无法产生<strong>持续上升的心流</strong>，也会出现心流体验。这种情况下是一种冷漠。例如看电视，我们沉浸于其中，但事实上整个身体、心理并没有很激动地参与，而表现出了冷漠、无感情。</p><h3 id="忧虑（高挑战-低技能）"><a href="#忧虑（高挑战-低技能）" class="headerlink" title="忧虑（高挑战+低技能）"></a>忧虑（高挑战+低技能）</h3><p>在不参加太多逻辑的争论的过程中(当然不是参加辩论赛)，有一定的挑战却没有要求很高的技能。表现出的就是忧虑的情感。</p><h3 id="焦虑（低技能-高挑战）"><a href="#焦虑（低技能-高挑战）" class="headerlink" title="焦虑（低技能+高挑战）"></a>焦虑（低技能+高挑战）</h3><p>在做一些例如重复性的工作，死记硬背文章的时候，由于<strong>技能水平低却完成高挑战的任务</strong>，就会出现焦虑。</p><h3 id="激励"><a href="#激励" class="headerlink" title="激励"></a>激励</h3><p>当工作技能提升或者学习水平提高等，有一定的<strong>驾轻就熟之感</strong>，这时，工作和学习就有一种激励的感觉。</p>]]></content>
    
    
    <summary type="html">心流是指一种将个人精神力完全投入在某种活动上的感觉，心流产生时同时会有高度的兴奋及充实感</summary>
    
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/categories/%E9%98%85%E8%AF%BB/"/>
    
    
    <category term="思维" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E7%BB%B4/"/>
    
    <category term="理论" scheme="https://blog.jzxer.cn/tags/%E7%90%86%E8%AE%BA/"/>
    
    <category term="心流" scheme="https://blog.jzxer.cn/tags/%E5%BF%83%E6%B5%81/"/>
    
  </entry>
  
  <entry>
    <title>学会停止胡思乱想</title>
    <link href="https://blog.jzxer.cn/20221129/stopthinkingtomuch/"/>
    <id>https://blog.jzxer.cn/20221129/stopthinkingtomuch/</id>
    <published>2022-11-29T13:16:45.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/img/gallery/2022/20221129.png" alt="胡思乱想的原因"></p><p>通过阅读《哈佛大学公开课：幸福课》，了解里面的思维陷阱：3M法则。</p><h3 id="第一个M：放大化"><a href="#第一个M：放大化" class="headerlink" title="第一个M：放大化"></a>第一个M：放大化</h3><p>我创业失败了，是因为自己真的不适合创业，自己根本没有创业的头脑。<br>渐渐产生对自己的怀疑，慢慢的对自己不自信，其实你很棒</p><h3 id="第二个M：极小化"><a href="#第二个M：极小化" class="headerlink" title="第二个M：极小化"></a>第二个M：极小化</h3><p>例子里说的是当你在给620个人上课，有618个人在认真听课，有一个人在玩手机，有一个人在打瞌睡，你非得纠结说自己上课内容不好，自己很菜…</p><p>把眼界放长远一点，就比如说，我现在是在一家外包公司工作，确实是在拧螺丝，没有什么归属感，工作的流程很杂糅，感受不到大公司的氛围。但是换个角度思考：我在这里得到的确实很多，薪资相对于外包是专家级别的，目前的空闲时间很多，了解了阿里的工作流程。</p><h3 id="第三个M：虚构化"><a href="#第三个M：虚构化" class="headerlink" title="第三个M：虚构化"></a>第三个M：虚构化</h3><p>无中生有，自己吓自己</p><h2 id="学会遗忘"><a href="#学会遗忘" class="headerlink" title="学会遗忘"></a>学会遗忘</h2><p>将生活中不那么重要的事情，记在笔记本上，告诉自己，这些不重要的事情，我已经将它转移到笔记本上了。</p><p>未完待续…</p>]]></content>
    
    
    <summary type="html">你就是想太多了，才造成了很多的精神内耗，90%对未来的担忧都不会发生</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="思维" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E7%BB%B4/"/>
    
    <category term="理论" scheme="https://blog.jzxer.cn/tags/%E7%90%86%E8%AE%BA/"/>
    
    <category term="心态" scheme="https://blog.jzxer.cn/tags/%E5%BF%83%E6%80%81/"/>
    
  </entry>
  
  <entry>
    <title>如何缓解焦虑</title>
    <link href="https://blog.jzxer.cn/20221124/slowdown/"/>
    <id>https://blog.jzxer.cn/20221124/slowdown/</id>
    <published>2022-11-24T12:11:45.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<h2 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h2><p>如果说恐惧是一个人面对危险的正常反应，焦虑就是面对潜在的，甚至是想象中的过渡反应</p><h3 id="理解焦虑的基础"><a href="#理解焦虑的基础" class="headerlink" title="理解焦虑的基础"></a>理解焦虑的基础</h3><ol><li>焦虑背后一定是恐惧</li><li>焦虑是我们对还没有发生的事情的负面想象<ul><li>时间是很重要的东西，要拿去做重要的事，或者送给那些重要的人！</li><li>想清楚的事情就去做，去做了就不要想！</li><li>正真愿赌服输的人是不焦虑，不纠结的，因为他们的想法很确定，很多人的成功也不是因为他们的想法比别人高明，更对，而是他把自己的想法坚持了下来！</li><li>通过给自己设定固定时间和固定活动，可以增强对生活的掌控感！</li><li>祈求上天给我平静的心，接受不可改变的事，给我勇气，改变可以改变的事，并赠予我分辨两者的智慧。</li></ul></li></ol><h3 id="公式"><a href="#公式" class="headerlink" title="公式"></a>公式</h3><p>递增的焦虑 &#x3D; 递增的环境刺激 + 递增的免疫力</p><h3 id="缓解焦虑的三个心态"><a href="#缓解焦虑的三个心态" class="headerlink" title="缓解焦虑的三个心态"></a>缓解焦虑的三个心态</h3><p>① 你没有你想象中的难么重要<br>② 事情没有你想象的那么糟糕<br>③ 感觉你的焦虑来自于亲人、朋友、同事的不配合，请问：他为什么要如你所愿？没有理由，所以不要太焦虑，take it easy！</p><h3 id="合理情绪疗法（abc疗法）：A-B-导致-C-的发生"><a href="#合理情绪疗法（abc疗法）：A-B-导致-C-的发生" class="headerlink" title="合理情绪疗法（abc疗法）：A + B 导致 C 的发生"></a>合理情绪疗法（abc疗法）：A + B 导致 C 的发生</h3><ul><li>A: 正在经历和发生</li><li>B: 观念和看法（可改变）</li><li>C: 感受和行为</li></ul><h3 id="缓解焦虑的方法"><a href="#缓解焦虑的方法" class="headerlink" title="缓解焦虑的方法"></a>缓解焦虑的方法</h3><p>三分钟注意力练习<br>    - 第一分钟：自我采访<br>      - 我脑子里在想什么，我心里的感受是怎么样的？我的身体感觉是什么？<br>    - 第二分钟：把思维的角度收窄<br>      - 把所有的注意力用来数呼吸，有意识地轻轻地数呼吸用来保持专注<br>    - 第三分钟：把注意力放在身体的感觉，周围的环境、声音、气味</p><ul><li>用以前不常使用的运动方式运动：跳舞、室内攀岩</li><li>有技巧的说出来<ul><li>’有人在‘ 和 ’我是孤独的‘ 这两种心理感觉对焦虑的时候差别很大。</li><li>当你感到焦虑向别人寻求陪伴的时候，请明确高度对方你希望他怎么帮助你，你希望他做什么说什么。</li></ul></li><li>故事思维<ul><li>通过心理暗示，塑造自己的内在领导力，积极的面对自己的焦虑和恐惧。</li></ul></li><li>处理焦虑的方法<ul><li>为自己的故事换一个主角：如果他是我，他会怎么做？<ul><li>这个人是你很崇拜、敬重、并且认可的人</li><li>足够勇敢、坚强和乐观</li></ul></li><li>改变心态<ul><li>演员心态：目前做不了什么的时候<ul><li>让你焦虑的东西目前只是一个台词本的一部分而已，喜欢还是不喜欢都要把角色演好，毕竟故事情节会一直往前推进，你不会一直呆在焦虑里，接纳这个焦虑，把台词念好，并告诉自己：就像以前的很多次一样，这一次也会过去。</li></ul></li><li>导演心态：看到自己有选择，能够有所行动的时候<ul><li>激发你内向的领导力开始对所有状况负责，主人公的命运在你的手里是可以安排和设计的</li></ul></li></ul></li><li>积累有效的故事资源，去看名人传记，去观察不同的人的人生故事，会发现自己并不是唯一遇到挑战的人，不是唯一感到焦虑的人。</li></ul></li></ul>]]></content>
    
    
    <summary type="html">如果说恐惧是一个人面对危险的正常反应，焦虑就是面对潜在的，甚至是想象中的过渡反应</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="焦虑" scheme="https://blog.jzxer.cn/tags/%E7%84%A6%E8%99%91/"/>
    
    <category term="心态" scheme="https://blog.jzxer.cn/tags/%E5%BF%83%E6%80%81/"/>
    
  </entry>
  
  <entry>
    <title>《肖申克的救赎》对我的救赎</title>
    <link href="https://blog.jzxer.cn/20221123/20241122_watch_%20Shawshank/"/>
    <id>https://blog.jzxer.cn/20221123/20241122_watch_%20Shawshank/</id>
    <published>2022-11-23T02:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.305Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h2><p>这是一部 1994 年拍的电影，影片的主要演员为 <strong>瑞德（摩根·弗里曼）</strong> 和 <strong>安迪（蒂姆•罗宾斯）</strong>。 改编自史蒂夫·金的小说《四季奇谭》里的春天的希望。主要讲的故事是关于安迪因为被陷害入狱然后又越狱成功的故事。</p><p>我其实很久之前就看过这个电影，当时一直被称为神剧，所以出于好奇就想看看它到底神在哪儿。我记得那会儿还在读大学。看完之后我确实是脑子一愣一愣的（没看懂…)，就觉得挺普通的。</p><p>正好晚上吃饭的时候想刷刷视频，正好 youku 打开首页就是这个电影，我就抱着重温一下的态度，重新点开看了看，不知道是不是因为出社会后见识增长的原因，我竟然看懂了这个影片背后表达的深刻含义…</p><h2 id="剧情概述"><a href="#剧情概述" class="headerlink" title="剧情概述"></a>剧情概述</h2><blockquote><p>我大概描述一下这个影片的框架，可能会有些剧透，酌情观看。</p></blockquote><p>影片开始就是安迪被陷害杀了出轨的妻子和情夫，被判终身入狱。这发生在普通人身上人其实就已经奔溃，结局就已经定下来了。但很不巧，安迪不是个普通人，并且很聪明。他在监狱也认识了瑞德和布鲁克斯，瑞德是监狱的走私商，布鲁克斯则在 20世纪初就在监狱，算是呆了一辈子监狱的人了，还有一些其它的朋友。并且通过自己的头脑在监狱得到了一席之地，为典狱长洗钱。本来生活相安无事倒也自在，转折点就在有一天来了个新人汤姆，他从其它的监狱听来了安迪谋杀的主谋另有其人，安迪把这个真相报告给典狱长。典狱长保持怀疑的态度糊弄了过去，其实就是不希望安迪出狱，留下来继续给自己洗钱。并且借越狱的理由杀了汤姆。又因为布鲁克斯被释放之后因为适应不了变化太大的世界而上吊自杀（50 多年的监狱生活）。自此，安迪就实施了自己的越狱大计…最后的结果是安迪用一把手掌大小的小锄头，花了十几年时间挖穿了监狱的墙。并且把监狱长的钱都洗到了自己的名下。监狱长最后饮弹自杀。</p><h2 id="角色分析"><a href="#角色分析" class="headerlink" title="角色分析"></a>角色分析</h2><p>这里给我印象比较深刻的是三个人：走私人瑞德、商人安迪、老人布鲁克斯。</p><h3 id="1-商人安迪"><a href="#1-商人安迪" class="headerlink" title="1. 商人安迪"></a>1. 商人安迪</h3><p>本片的主角，很有经商头脑，并且遇事非常冷静。但是可能因为太理性了，在婚姻关系一地鸡毛，老婆和别人睡了。他也因为这事儿被陷害锒铛入狱。</p><p>但是因为起初他真的认为这事儿是他做的，所以是怀着愧疚入狱。所以也没有什么情绪上的不满。直到汤姆的出现，狱长的无情，知道真相之后更加坚信了自己的信念。</p><p>他在本片中表现出来的对希望的坚持是我所欣赏的，任何逆境中都怀有希望，在监狱的播报室放音乐，为监狱的图书馆扩建坚持每周写信，写了 6 年信才得到回复。这就是人性的魅力所在，通过某种特质吸引那些有共鸣的人，这也是我想写这篇观后感的原因之一。坚持信念不动摇一直是现在大多数人包括我所缺乏的。</p><h3 id="2-瑞德"><a href="#2-瑞德" class="headerlink" title="2. 瑞德"></a>2. 瑞德</h3><p>在本剧中算是起主要作用的角色之一，我对他的印象比较像是映射了身边的一些人，在你提出一些美好愿景的时候，他们会因为你的想法太过于不切实际而泼冷水，但是大多数人可能是无心的，只是一种对现实的妥协。比如在本片的最后他对假释申请的自暴自弃和差点走向布鲁克斯老路的描写。</p><p>不就是映射大多数人在生活中面对失败之后的态度，接受不了命运的安排组后选择自我了结？</p><p>这不就是大多数社会上的职场人？有多少人其实就是监狱中的瑞德。</p><h3 id="3-布鲁克斯"><a href="#3-布鲁克斯" class="headerlink" title="3. 布鲁克斯"></a>3. 布鲁克斯</h3><p>这个老人是我在影片中映像最深刻的配角。因为在他的身上我看到了我如果不做当下的选择未来的样子。</p><p>20 世纪初进入监狱，在监狱生活了 50 多年，最后在出狱这个本该开心的时候，却因为社会的变化太大，适应不了这个社会而选择自杀。虽然中途有过再犯罪重新入狱的念头。但是年纪到了，干不动了。</p><p>这里的犯罪就想是面试，监狱就像是工作单位，这不就是老了之后工作没有人要吗 😂</p><p>说实话他的自杀真的震撼了我，瞬间想到我如果找个单位工作几十年之后，结局是不是也像他一样，虽然不会走极端。但是也不是一个好的结果。</p><h2 id="个人感受"><a href="#个人感受" class="headerlink" title="个人感受"></a>个人感受</h2><p>大多数的影评人都讲过了这部片所讲的监狱环境，正邪较量。</p><p>但我更偏向的是影片对社会结构的映射，瑞德、布鲁克斯、其实都能在现实生活中找到原型。从最初的样子到结束的样子。</p><p>毕竟安迪这种人真的是少数，要成为安迪这样的人，这种信念和坚持，包括头脑都是难能可贵的。</p><p>是部很好的片子，值得回味。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://zh.wikipedia.org/wiki/%E8%82%96%E7%94%B3%E5%85%8B%E7%9A%84%E6%95%91%E8%B5%8E">肖申克的救赎</a></p>]]></content>
    
    
    <summary type="html">正好晚上吃饭的时候想刷刷视频，正好 youku 打开首页就是这个电影，我就抱着重温一下的态度，重新点开看了看，不知道是不是因为出社会后见识增长的原因，我竟然看懂了这个影片背后表达的深刻含义...</summary>
    
    
    
    <category term="观影笔记" scheme="https://blog.jzxer.cn/categories/%E8%A7%82%E5%BD%B1%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="人生" scheme="https://blog.jzxer.cn/tags/%E4%BA%BA%E7%94%9F/"/>
    
    <category term="认知" scheme="https://blog.jzxer.cn/tags/%E8%AE%A4%E7%9F%A5/"/>
    
  </entry>
  
  <entry>
    <title>原则</title>
    <link href="https://blog.jzxer.cn/20221109/principle/"/>
    <id>https://blog.jzxer.cn/20221109/principle/</id>
    <published>2022-11-09T15:26:45.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<p>瑞·达里奥对待生活的态度，很多东西值得参考，并且可以带你远离精神内耗。</p><h2 id="生活原则"><a href="#生活原则" class="headerlink" title="生活原则"></a>生活原则</h2><ol><li>接受现实，理解现实，处理现实问题，不管是美好的还是严酷的现实。抛弃不现实的理想主义</li><li>当真相与愿望不符，大部分人抗拒真相（但是它确实在那里，无论你是否接受）</li><li>头脑极度开放、极度透明<ul><li>头脑越开放，相对来说更接受真实，更能得到他人真实的答案</li><li><strong>不要担心其他人的看法，这是一个很大的障碍，你必须找到并相信属于自己的行为方式</strong></li><li>拥抱极度求真和极度透明将带来更有意义的工作和更有意义的人际关系</li></ul></li><li>观察自然，学习现实规律<ul><li><p>自上而下观察事物：努力找到东西背后的唯一驱动法则和规律</p></li><li><p>自下而上观察自然：研究每种具体情况极其背后的法则和规律</p></li><li><p>不要固化对事物的看法，这使你无法了解真实的情况。（如果只是从个体的角度去区分好与坏，善与恶，会显得太片面化，偶尔跳脱自我评判的主观思想会更好）<br><strong>什么是好什么是坏？</strong>: 这个世界上没有绝对的对与错，他存在就说明它有一定的意义，只是受众群体的大小不一样。<br><strong>我的人生目标？</strong>: 自我提升，不断经历，充实内核，让我能在任何情况下坦然自若，笑对人生百态。因为我知道没有一个人是在一帆风顺下达到这个境界。我也知道这条路它注定会非常坎坷崎岖。<br><strong>面对最重要的抉择时我该怎么做？</strong>: 关于道德约束下产生的选择，我更偏向于做正确的事，相对我来说，跳出舒适圈，去挑战新的可能本身就是一种可以自我提升的事情，所以我辞去无聊的高薪工作，投身于未知且热爱的情感行业。</p></li><li><p>一个东西的”好“，需要符合现实的规律，并促进整体的进化，这能带来最大的回报。</p></li><li><p>进化是宇宙最强大的力量，是唯一永恒的东西，是一切的驱动力（经历这个世界，让自己不断破立新，也就是进化）</p></li><li><p>不进化就死亡（没有完美的存在，我们都在不断朝适应的方向前进，又或者凋亡）</p></li></ul></li></ol><p>5.进化是生命最大的成就和最大的回报<br>      - 促使个体追求自身利益、最终使整体进步的激励和互动机制<br>      - 自然选择过程<br>      - 快速的试验和适应<br>      - 我们即是一切，又什么都不是：前者从死亡的那一瞬间来看，后者从宇宙的规模来看</p><p>6.理解现实提供的自然教训</p><ol><li>把你的进化最大化</li><li>没有痛苦就没有收货</li><li>自然的法则就是，为了赢得力量，人必须努力突破极限，而这个过程是痛苦的</li></ol><p>7.痛苦+反思&#x3D;进步</p><ol><li>迎接而非躲避痛苦<ol><li>找到，接受并学会如何应对你的弱点</li><li>更喜欢周围的人对你坦诚，而不是隐瞒对你的负面看法</li><li>展现真实的自我，而不是强行吧弱点伪装成优势</li></ol></li><li>接受严厉的爱（不要有侥幸心理，认为有后盾，这会降低潜能的释放）</li></ol><p>8.考虑后续与再后续的结果</p><ol><li>直接结果经常是诱惑，导致我们真正想要的东西<br>a. 比如爱情与性的区别，长期与短期的区别，你真正想要的是什么</li></ol><p>9.接受结果</p><ol><li>内控点：负起责任，进行良好的决策，而不是抱怨生活中无法控制的东西，你将更有可能成功并找到幸福</li></ol><p>10.从更高的层次俯视机器</p><ol><li>把自己想象成一部在大机器里运转的小机器，并明白你有能力改变机器从而获取更好的结果</li></ol><h2 id="自我思考"><a href="#自我思考" class="headerlink" title="自我思考"></a>自我思考</h2><p><strong>第一条原则：</strong></p><ol><li>你想要什么？</li><li>事实是什么？</li><li>面对事实，你如何实现自己的愿望？</li></ol><p><img src="/img/gallery/2022/20221109.png" alt="学习原则"></p><p>好的事情比糟糕的事情好，糟糕的事情比平庸的事情好</p><p>把赚钱作为目标是没有意义的，因为经前没有固有的价值，金钱的价值在于它能买到的东西，而金钱并不能买到一切。<br>更聪明的做法是：<strong>确定你真正想要什么？真正的目标是什么？为了达到这个目标你需要做什么？</strong></p><p>在你能有勇气放弃一切的同时，你还需要具有<strong>：赌博者的镇定，洞察者的第六感和狮子的勇气，你才有可能抓住一丝机会</strong></p><p>保持足够的好奇心，始终愿意去理解那些看问题和你不一样的人事怎么形成这种看问题的方式的。</p><blockquote><p>自我思考：优秀的人在成为优秀的过程中，一定会经过很多的磨难，严重的可能会有精神类的障碍，但是一旦能够读过这个时期，他一定能涅槃重生。从各个方面<br>曾经的我会更多认为，我的生活处处是快乐，我不会有很多烦恼，如果我不去接触那些东西。但是最终的现实和我想象中的不一样，我们需要这些东西，我们需要苦难，需要一些痛苦才能蜕变成长</p></blockquote><p><img src="/img/gallery/2022/20221109-2.png" alt="英雄的历程"></p>]]></content>
    
    
    <summary type="html">瑞·达里奥对待生活的态度，很多东西值得参考，并且可以带你远离精神内耗。</summary>
    
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/categories/%E9%98%85%E8%AF%BB/"/>
    
    
    <category term="框架" scheme="https://blog.jzxer.cn/tags/%E6%A1%86%E6%9E%B6/"/>
    
    <category term="core" scheme="https://blog.jzxer.cn/tags/core/"/>
    
    <category term="态度" scheme="https://blog.jzxer.cn/tags/%E6%80%81%E5%BA%A6/"/>
    
  </entry>
  
  <entry>
    <title>好的好人3-冷血救世</title>
    <link href="https://blog.jzxer.cn/20221020/goodgoodpeople3/"/>
    <id>https://blog.jzxer.cn/20221020/goodgoodpeople3/</id>
    <published>2022-10-20T13:16:45.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<h3 id="内容简介"><a href="#内容简介" class="headerlink" title="内容简介"></a>内容简介</h3><p>教授为人处世之道，更清晰的去认清这个世界，并且自由自在的活在这个世界上</p><h3 id="书摘"><a href="#书摘" class="headerlink" title="书摘"></a>书摘</h3><ol><li>面子只是工具，萬勿錯把工具當成是自己。</li><li>現在認錯得越厲害，將來必定不知錯得更厲害。</li><li>如果你想要活得自在，如果你想要為自己而活，如果你是具有成熟思想的人，如果你肯面對現實，如果你想要用智慧看得更遠的話， 相信我們，<strong>寧願被人妒嫉，都不要被人同情</strong>。每個人都會有敵人的， 越是成功的人，就有越多的敵人。</li><li>照顧好自己，再照顧別人</li><li>不管侵犯著你的人是誰: 伴侶、家人或朋友，他們依然是「侵犯者 」。</li><li>人会在<strong>趋利避害</strong>的情况下会做坏事 。</li><li>開心時，講交情。衝突時，要無情。</li><li>利小，人性本善；利大，人性本恶。</li><li>见利忘义与记仇忘恩为人之本性</li><li>拒绝法则：1. 拒人不超两句话、2. 语气坚定、3. 真要帮，提出要求</li><li>消極會快樂，積極會痛苦之道</li><li>沟通的意义在于你想要达到的效果；人生的意义就是没有意义</li><li>讚美的成功在於對方所感受到其價值。</li><li>糖衣效应：人類的記憶往往記住最新鮮、最近的事情和感受，因此<strong>好的東西都要留在最後時才拿出來</strong>。  要別人接受你的批評時，結尾時用好話來作糖衣。<ol><li>老婆，我很生氣你昨天這麼晚才回家，你又沒打電話回來， 但是我還是很愛你</li></ol></li></ol><p>未完待续…</p>]]></content>
    
    
    <summary type="html">教授为人处世之道，更清晰的去认清这个世界，并且自由自在的活在这个世界上</summary>
    
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/categories/%E9%98%85%E8%AF%BB/"/>
    
    
    <category term="思维" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E7%BB%B4/"/>
    
    <category term="认知" scheme="https://blog.jzxer.cn/tags/%E8%AE%A4%E7%9F%A5/"/>
    
    <category term="框架" scheme="https://blog.jzxer.cn/tags/%E6%A1%86%E6%9E%B6/"/>
    
  </entry>
  
  <entry>
    <title>一次轰趴活动上的邂逅（下）</title>
    <link href="https://blog.jzxer.cn/20221020/offlinegame2/"/>
    <id>https://blog.jzxer.cn/20221020/offlinegame2/</id>
    <published>2022-10-20T09:14:35.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="f1b72be01cedb10a2f6391e8bf32a8e725721662b16451e59188685db1dba652">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c87520e51ba28cb1c5d90f031b9169e4dc6ff5f86fa9f859033c880a1aed6211e52f7f92285599d0baf8a24f774d06655687f48f33dd010c5c0b8b6564d3065474ccf7b19dcf828d59900188006d78a9840af7ee113cb355528412fe4745390b8e919c3c47533f0d5b66518a41b009cd35c6a3be1b918612d5dedece2fa5fe85f22e0a1097bf28613fcfffea56dd625e05f1174b3cc452d4479bbd3774e74750e27b5afcce2cc74060e9608da21aa998dd6d923c78f2c7cbd8bd6d35fb71befffdb5fb2c304fde9de6e82bd03b4e5c86b8b82545e1eb84baccdc4566e75ba48ca197dd0618b7288c31e7d97062075ed6621854a0fdce0a1f6a47ed031a0fe4c62411f2e596934b40427541c7ac84d3d109271ea27f84e93a5d00a8afb4bea93fd88b810fad604e99e316ce37fc3768b57a70192843cbb7c284794ba24e16e7a057879a7332affd9b767cad31b0663c6fd8dfc4c127d3e18e566923b1b2dd784a2e5e51b06a850ca3b104f7d2f5977cc200cd9f71007c9a4deb8187beb35cb9bc87d26dac3d066a8105773a5fbf52162a066f691c52b50a8866903968a033fd7f56e77703be7a4467c651075d0f88b08d4f5e7c24b6dabcef5e5fcadd6e2c106661a32376e80df41b14057d715ee10d4c1b59008f452fbf57783c7040deeb8e12e53714890153935a6aaeed6303b1eddca5ab1aa00d1e5239fb12607f093a419a1048bcc2d66d739da5ab38b79a72e47ebeeac86590b857a251d98fba47652ab457b1cee646051e48881c76ca73ec55f662e02c7bd3732f9512a0b2a9f3e7ff6b4f4c8612d8a6c52a80eac2f6054e09ae3eadc84f9b9665997ef474e97629e70899d3153918a6ab37e9ea4aea3fdbfc2de5b446231aeb9074a34aa5478203de2aeb1c7d2c1a3088351ae1a549a1a591bec98c0a41ac43ac67704ab03df9974738b40439723929960e6421c14a4d7191ce2826f060924d86d795f19b3f921015861e73995633b8e3b8039c3a5b8dc07acdaecb8eb9a5a2a1ccf08c8155ebe656791bedfbefea6b0ac65e510d1a8404f92687cafdb502871745553309b4809168b7eaa45eba4ec5ce3b5c85dffc24dfbccaf3c4bb1a62074d530223d0be04e468441a9e9649619e0fc879ba284ef94c9ca35389ef17e18512cb2346badbc8e043434483faba1ebf56a61fa4797b1cfd633134343fe9d15a2763b6d2934c2786f477530feebccfe736fbc84cee5ec652ce77cd82f5d7a997cf2f000fa431c06a0f1f9ffbe4b0f16f6384294ee8e76b1096228a5fae6d90ae1311459aa39ed60cba31108534f4457c33e3faf638052b81dff8d1c2b6eaae6b56c013fb16976178168467b14f46cbc96b3749327e16119916a61c2aaf0723198888255a55f40b08eb6438650034ae51c4dbd389241e91e9ec9e38a65445a0a625a5185e43d00d9caf6385d62de2fe17cb5cf960fd4cf62d9cc1436a5e7259e0742df99c48fd1481c65d465a6f3aeaaf16d2631fd0ee215367f8b734e124e6a602eb6d4070aca0f0a284c349cdf003e8c209ec2964174ce43548a599c06b7b58224ec745911c52ec3ff5d655f8e78024701f26bdc1a0984e65e01e42c2ec0764dd69d148713250a48814e6f40e312517688309ed833366463d19d12ff2064cd6a52fd2053656be3bb8a1252173547cd98e9029e0b7b92f4fb3bf8dd8ea705d5f1b5b7f0e39de5c52a5bea088b7ee4c89478adacff756dcd0dd013d960a3e4ccf54dcaeef6d64cd4288110d3844f373d127ee911b103f4385a898edd55bee81099703be525b87451aba0159aa082bf5e5a9f01c2608fdc82b7f9636ce5083c3249f7002cdc9f681471491ff559d26dd3d0aacb65281d6e51368bcde0e2ef94f976436ab129619fa3be4eaad3b1a5a2d15afc402588318d8a5c1b6556ea472cbcba2b11208cd7d627ceac6c221a6c540f608ab87d25b7365e679d6a8da0350610b88437167ea8421127f9e0c24c50d4c2738661ad665bdb00c4f81cf904c1aa5ee8b272b3eb8e52e169a89670966da18ffb19d16d46e439b44463cf12026f95053a7c3bebb0915d92d830f312234dac7b3b852d282ebaddb152e5110924183a24abe9af0c06e26d33a44a73405663c69e95c38d997b46a51d4097838b0be313403bc332caed7a7d896b000cd685a6390a54bc78e89e0c07b97541389c5703273e8e8f4cbabba155b510c6bca86a70924de6e4af67482c0bd30f23fdae391204dde21f731dbf2bc03ba552bad900a7e190cec9211d6c7218d60a0e82b8e9f7deccb0fe90fadc17cf33168bb18c3453be27aa88679a53c2c67188f3980f39c0fc956d98d04455c81f7b14aa6fce5d23ffc243f6e94a0c50c9c9f64e148cd06aed1f694841c931ebbd7b88e80e0b272e2c4b87fab9ebcf50c11d1579411b831d2045b361ec5033a93c0ef5e4fae7740e67cc87d7062b16e5426377da6fd9b90982bf188f263418af34b858ab40d4f1272752a42fd33833d6574251284be9b5f652080866bff968474cd9ce48f5d20f9527a89a032b795a6bca350e75d17cc88fb9bf3b9167c39f00e99ad557fa682d106d824367e228234fbd6a82b972a7f7e5535927ff0f23888783a953e212f8838e18d73baf8d63158849ce2b3cdf5bad25f8f8da2003d4bfc24e87cace4918a59834267bce4f338e70ba918c0a383aa582757d34b17af572c3c4883c7daa851dd86cbd1299e885c1c522dcbb149052327eb0d2448252c70ee56a2bd7af6e22d3928f80eb851b176213b0e5cee604a81be1e91bd896c203266aea620f21fbaad1a314394a8b2ad64e307ed0b7d7f511e8e73c995003f95cdf3c43320ae10e2ca50eefa10568de45d4245663fbd009f588081b8dffb0e1b69ace83ef108ad5c5b5957a625b137fc00e76ec4d6d6024841f8bd27490cd7c401e00e2fe1a6620180081309c17996f7f8ffc9b692825ef5bb550b64ffff314a3cb3f9fefb8de068d48ff72e957279a4446b55b0ba2b064e7269219d3982973b0addb1bc87a59259a1974011e641c9a351e19fac68f5ba835cf25623ee51e60efe941576e1c874fe029b9b07d687b07592a07311def7b7d2b1d78a184cdb28a724453d466ce1d2ceeb30bfb27f4ebee7d84881bd47cc77290c4129db0f9cd8916dbaacc9f46b8a25ae8c20a41c8155480d1cab12acb349904152170550b41a72fc8998cccd3e41f1e3e5549bdb518e58b496a5e5e899dea31c1da731a2b5a035e6e8c16e6e6f42f7afe612eb843a92f12ec7a3a9eee57b9a14f94dff77a1d5775bf729211dbd9f18d0363c87f7fffb4d8a9e85ac22f257d5c0790c7188d9ef97850ee9028d919035c906eb355d9cb42caf0bab41fb7f62c7f11093d97db93882bacb1e8b08ab75d705467c4c203b5af961b97f3daa7f4fe989fc9670ac3c3fe457ab6c02294f8e9a6730bd0ba21bbc25a1d1c48f4dc8596edc78611084c17fa53b53c07e32de885bd4ff1a0792e5cba3ab74192de913caabcc2b7cd24cea9a565aae960db136a43541433501193565bdef7a32478202f48f70c3193f8dd1860f62f696a9a3d9a5282bf36d9079a0295ad78843468eb31e4e7dbaaa808c57dc91418cf50e0550f1b8482505a7e090944c3d4025e692566733ec4d312df282ec67645079800e2faa0c64b27cacf78ca555342fffcc2464408c0addd7faa523c6d9ed5a569821f5ebc042ef2986d74ed905bc931d1bb30fd976e2e9492826014dfe3cb7dd26dd64c8ce9281d4f4e86682677094bc42dd475edd2370ab94e9c26c811e9a1f331b7a7bd3d8968a66e114577a89dd4cbe5c8e451f4b266d3a6d7b60c33882c3884c179cf52cacbc76e454347e1ef83f9750e840d57941bff5eeca676b8da59ff3eda867652b8578dbc510d77860840360798668da995c105947d31d1680080c58199445630e8b84ac37ccc732a61046c48e9a6af4f1c275185d0b47e11876f4e46a46203d10fb55a3d55850c4c7e7c2d807c2b323e09e1cc4bcb841d0908d4cba46b081e7d6e4a4862b00686d0fd292a71a7f05534755a92949cde925ebbe8e645f5064c41e42a39c0b88658bcbe9ea5f013731669184b40cf87032b03abd72982329147bda38d9b13daf8f1df7f67285a874fd0efbf722572b249b41bff5d96704b445228646c62308d6dc534e669b974fcbe3a7c61d1fd613ece54695c92e206331eae76c1d54531cd1bda4ebaa7b3a35830215cd3536ba18d76544422229addc03ab9ab425c69f2c83393e4cecc7f5b52bdd1fcdc14261158a2cb357ad8660731c9dabd6e127a3d0df8cb05c726f0e9631d555edb70c38d8205f5ecae1134f4300e2ebdf1abc56dfed7d6199fd7f3a2bc4766c335860a85a443894c9b752607088a74f89d764b7191f670409fc0fe8abf04f1bff8a07f288fa6725d75409c704923f4af93c20c6ad50b5b3ddb47a9c70ba368377979cf16961ef62a24e67f260d698b8d728bb18427fa93dc3ad3769c5d632aaaabf91bd5f585bce69a03797aa4927bb377a6d895718d023b11cd4190517c2aef9d950baea196b9901a270e8f969c548ef50c9c4b01ff2a7bc7f8863b051ca8fad6c2730d361d97b58808cb31c7018f4e97246a3afe34d85c940a7dde138ba14efa0691a09b5f3be673f57adfd3a62cd46478cbe319bc488ffef8450f676b235eb164db055b23b5e0d035844f3510114ffd48cd9f580159c8b2bd17925b4f0be1bc7491283d97c8d953df4bffe3a4ea190f611620c8f9f228f54eee1e52ac274cd052474a613fd2b1c6a38d87185edc5868a6cba41d9828fb84c139156380653f855ea32b38d56e496293cc53980ab696b7823cf40f59f2a81aacfc98e6d17c8c1f10fc82233cc730a493952038334d69174ea4d4e73160a4abde1c1bba5ab126f7401641c10bc8b8ffb498924b99ecfa7802a8167e8f9bbac45d6a8103b5add929d3c34baa239a2ad4617cb25bab57d1a776e9b29a25df309270f90ad8ed3429516cb67fc040dc7356eb8161383e39efd9b96740f1c4f080b5a05d974a59b5b5e45bcf0bd38e9b6ebddc6d54fe63731c6876eaa1a74c16e68e81f66f494b2b9e16afdfd79f069157282a2a622d6e4b46a7400826b26706b10ea113cc54008ebc86164a28864a6b7a84da05a60a143a7bb58b73a4049b9af7543a8b360697dddb315e1ca97d9fbcd3d41e6012e614ab4c99bee3cd0c69c835d482ebcbd8fc82569094dfb39db2cd372e8eb2fd951b428e23923c6c44db0a02c0ba5628e1bcb9e937368706216d175538ab7cb573cf3c3371666d1bf9caed01971c28162fa77e34bcf180931e1d0a039f0f4ed75595a9ddef68e934e74615ee03116a89476c80b8351eaa8c29a8b0c8e5998778552718c1deb884a8f1c3e801d3c431c05b4d4f02e5e8aab5747c230119a3aa212667b0c84445ba4befff8a1aa401270163f1bc31e8a372e6582f3c113b22ffb1241d2cd05e5fb4daf501e978330dcf4a4227146c66e1a771c01b18a92bdac683a61c00cd4c8cb2e13d50e02bdfd19c9d0630731d2c8354055fa81522176aef5da1d1850eee43b0f1a4098d580b8cd48914cb79d31d6b7e06f603bfa8c1e61c21834bf6eccd76bfdef1de57bd703ae0aa662a2aad47f</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
  </entry>
  
  <entry>
    <title>一次轰趴活动上的邂逅（一）</title>
    <link href="https://blog.jzxer.cn/20221017/offlinegame/"/>
    <id>https://blog.jzxer.cn/20221017/offlinegame/</id>
    <published>2022-10-17T07:45:03.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="cee1573701bc60e04b7ed6b33013dbfa9d4ae3eaaf8fb60c407beb38f1107730">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c87520043a9aa01d64aaa1f16ae78d3cfd71ce780f88cc43ada3a00b67ee147fc7b86312c5d6c7ab0abd22842a222c49696cc9ea2965d6b88df2970830ecec55f94619db68fc04b4f9c71a16fc678a9707e6b834e0da25720f07ff7b5d22d3782e7768132f5563b9be6662904c194b25ad5054912ad55dfc00ec00005379b2bacd6a263116184e7673795c62aaf9b2e2a95c30b8c6bb695c1ccd2a0752d338aaa3c0c559f48a85c8f8479b069a6c7bd6f27adfe2765da9863fa5bdfbf8db759764b34ac2a4a0d75219490b43d7de79b38d744e9eaab3ee5d18efe481841927583e8008fbf7ae8ee08fb2d83698cb4d1767038f9720beea587b542a0f0b584fc0317bd9d36686a53e8ac666ed6f0045c9e1f66c09474194f9bf1f0a9ca9bcec2f4c7ded6e10f2bfe3f9d356cb7c210600d125cc390c94773c8fffcb707064f957be1d8046c5681bdf44db0d221c1ba99e3eb730c1a48dcd3d6f07a173ed8640d8979c421d22079b81112d5c0922c02181babd495d0979dbd2ec2bde390d9b67e5989b22066b41b49d39d39ff54c499362acdb0e17b90779a5be8213056bd5a3588d0a692a660f35831d42ad759a5c22deecbc058346249b54e8357603a4e64dc65c6cf3718595b85829211dc5a34e0e63df465b77d5b174224b6d8d6f51e4a1e215fc139502935c446e3816eca33d13a4c67372bb4b2482b327f2d3c59d3d6c14a339f09132a70f9266e0d706fe8c5e14b2db6d1b1f96a2c7feb20d6fd5ffc7d7194ebe2b1b0d6c853b0641176cdb192ea4b21f2a2670adde68b0c7a12a98ea4912189a9de5fcfe7419b26317f72f86c87801ccff3dc7772ad6238167cd05792f044d57a92d01b36e1632048d151b201b4d12ea653f1a332a3cfac9029718e45652086f91b28a94407b0c96c0580aa6d431eb57ea0b298e48c7dc906c416668ae002c3b630f7376b708fcad7f680a443a3292d43a40429659cd9d956b1e55fe0249dd8aa5e84f6071e8fc5ba24c0cb948d71cbd58b005ce8e38d964575fda3bb5fddb074865bf9a1821905ea1173afb08e0348d837286e50abffcb6033fa88e2c7b768183228765e59afca753dc06bba27445793795c11393948df806b7c0e440d1d17e98911b2b933ea5707eea06b459aa6f90f108e5b319818a8a76c41e1fc925deaf2d8284589cbb41c151ec554562eaf897d8c06ce392b2e11a1083fb0243bed177cc6d00232763e5c1aade2c55a8d30b51dc41eb395b2affd532ea44dfd4e99976ddadadf7d657e8ece734e4033fb016e0349cc0c66eb14bbb808fe6a90076544efc070c4ed113fb25fa4b7f7955282dd9553c58a4c98967edde13db8f1ac1526f4ad374c1df9b14b125b67690c13dfb75faae80399289e1a3a20867084a8d4980012a2e6fecc88775b5f0faf2b9f4afd31460d851e1252fd560667f3efa17803deed9ab902cd3c515fa77d2d4f03260dc00d8f2c03ed2f85cb9047e4b72082b5fcdd8910ef3401755d475238c5783ddd2cdc3985abd41570e6fe811d1f93e4e45223194246c0efc530b654a37121523aa671d9324ea14045bfacb6effc728594825e1ffc1d30e0121d1b1eb9a4e6cf2a0720cacaaa5d72633274945115229335d453da5154238aebd969d9d66bd019d18ab8ad751da9377ac77ba50e2205252b612907f7cb4fb9fbf44e3ac84ca06fa3fa162e0f2a340cb0e55900f5e86ada7ddfeddef86705d698df847bd8f9d2ddb8948e3701e34e7fb38e5315b17c217643d19ae646b78fe883c505378f1e0e816a49014b1074b79ec9291fafc1e7eb041df44fc814f72f53e5d5e294e6387b3089949375e8a430d66140a5f93ae5b03509e330108e00161b7329faffa2101ba1f8496c786fb55e5203f3b6bd8540d953b972efee316c97332e22616ab43a01e26047e824520b7d39591bbc6b16320c9ef2455d0d150cae9d03c4d1faf04b54f4f83bdc2472e5e112adb9d29102f75849d6c6ed0922cdf3be836062834ffc76c0bb496fe1dad02e0ec5ae07d1d7980583daa3798894b23e1a9940cdc97ef3d87bfc43f1f045af90562c4bbbe2f9532bb09c577acf1300503a4e0a7ddc161356cd63fa1a1747b8e2aeac66cf2e0437732ab117557f7b5a55dc0c94894a568bd2bf733e7cc7afd12b19187179a21efada207ea139cbd32cdd0ace806b728f3541b0f6500e7246fac8d0c18fc791fd7c6cfdbed16433eda7409fb34d8bfd005b3f40be08a2ac070e2194152b380a330a4f77ed5d19f82e225357e39cab5e034e22ecd9d69dbe54cef0c9a32c0f80ec3e00a23f86384ef270f4a9c2cc399921beb1665d42e6bd67398c1c853939bf00fc3afbfa1167bbe09b540b502b21e436bba7d14f81dcaf5c4b61597f1f4f4891a2efed544533ee68f0da9ffeab9e5e991d2b1ca879ef900d8b1fd8a09c58f4d14f079eeea01730fbefe6256f1ae22a84a28279fe9848b589d733cb069514eae28ab873ca04e09c9951697ede60465a630e787b77a78b7e7c8029bae850d12cd1e77fa2a616349c9550d8ba20981eb09b0c0e2a8b10394486be8ea3fdc13284629d42d0fbf6b1402551d0d45f8629740ad7f8d3c313001216d2eb41a7388b5a92531e7909ac510c075c463e3f83c4b5eb8fd8ae529d96382d9a08662e8bd40ea27b0b47b10d89700886694a657a5d7f9183553c863c86505d18ea1fc89cd1567a4100f44e834b14458f1b8adeedf1cf055440d17b2d1c687cb677c26aea0776011fbc2dc1d7f6416ab6885a8d1208715b5077e0afd2a4ffa7094afbade321aa958de72c1831d1615c527838b44a60be55707c37fb96979b63d7fdbadb16ec6fc2c5fc004c59a2ff5b2357bac28761d250c00a7c3521c149a1085cfa3ec38d0e299912a67560555d1bd43ef87354e1d38ea7c961d5f2bea939b7528f9906eb43618ffd8d807d054f6f990c29ba33b196e2e8f3f91f77dc401ffdd8ceaf11c518dcc4b207b0c3fb75f1be9e0969058f3269f98f9139cd407f9de4ae04e657c346f8d4038cbf1f73694e3d7138e97ac1f8e799f39a085b24255062891ef0c8adada9fbc0fd2cb8ef2135210574c47fd7f8b899f30840962878d318cdd78613b6fbce7dbbc56c7c7fed9eed971d6930af00801e7876ebb3c7ac76023b86a8c4d6bb2a770dd2c2f33ae07d09b88534a947b93555b5e1e94ce4008e07b5f2e93737017740481d85695f56895929ee7c564729efab59ec7563e843be977f8aacf762e7e45d948d6bcd42cce7f3fc322310ba5f19f202506a8b1c8ea9f77c04dd351d131a3af3489aa6b604b2d94e9d54d40822e5bf0298054502edbada61baeeb7ff8696b47eafdc071fd7b77a83d53d3308f18788b0440e0e97541cfe548924794d265c6d9e24e6c86287102ffbf09569e6233b82ac5f1566b141f2ff654d628871ddeb652cc738acd1f59d1584f15b08c8707f4d5579db8dacd1c8f3421ed2d41c6f27f6fe20e392e798d01799aef01cb3d68fc05d935692065c817c65473522fbd948620d7f387a373dbb7071ccb1ab9ffc015a0740769b86570f51c0d6e1ca1d0cfacc810fff8887bfbe64048abe73a721e607a7724b415f4adba1cc0391cdc9a817eac43d5fa9e6357e0eef8e142a3ceca80933cd39a367903a97a8f6faf4e1ce7d4bc1bf055cf38d35ffada62a8c6386f33c744ac9c1f403fe4c6d4a1981ea89f130459948ed87086f4038f8bc7d897dccb43e58b8805032c60f8c91e9433cf5bc9fa094afffee457275a0b9978c4115479c56414973f58038b08d27afb01f10a5fe2c78e70818c05bff8425acae969ee66e7ca1138c8ff0d22140bfd3422943328a4480c3dc37c8a25435f97b29c5b24bec7a86272075b1b556aef362c60b223048d6e085e0d53ac38d09364ad33ebd3f1fe1606ead5ac8d030d635d8aec0084054990831d</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
  </entry>
  
  <entry>
    <title>领导力21法则</title>
    <link href="https://blog.jzxer.cn/20221010/leaderRule/"/>
    <id>https://blog.jzxer.cn/20221010/leaderRule/</id>
    <published>2022-10-10T14:56:45.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>想要学习作为一个雄性领袖所需要遵循的法则，如何能够带领别人。目前我总结的几个点为：</p><ol><li>语气坚定，沉稳</li><li>在某个领域有一定的造诣</li><li>能输出情绪价值，自己舒适的同时，让对方舒适尊重</li><li>边界感强</li></ol><h2 id="书摘"><a href="#书摘" class="headerlink" title="书摘"></a>书摘</h2><h3 id="1-盖子法则：领导能力-思维模式-决定一个人办事的成效水平"><a href="#1-盖子法则：领导能力-思维模式-决定一个人办事的成效水平" class="headerlink" title="1. 盖子法则：领导能力(思维模式)决定一个人办事的成效水平"></a>1. 盖子法则：领导能力(思维模式)决定一个人办事的成效水平</h3><p>领导力8，成效7；领导力5，成效4…</p><h3 id="2-影响力法则：衡量一个人的领导力，全看他所发出的影响力"><a href="#2-影响力法则：衡量一个人的领导力，全看他所发出的影响力" class="headerlink" title="2. 影响力法则：衡量一个人的领导力，全看他所发出的影响力"></a>2. 影响力法则：衡量一个人的领导力，全看他所发出的影响力</h3><ol><li>当人们愿意跟随你，哪怕只是出于好奇，都足以表示出你已经是一个优秀的领导者，散发出领导的魅力</li><li>职位不能叫一个人发挥领导力，反而一个领导人能使职位发挥作用</li><li>头衔唯一能买到的是一点点时间使你有机会增加自己的影响力，或是毁掉它</li></ol><h3 id="3-过程法则：领导力来自日积月累，而非一日之功"><a href="#3-过程法则：领导力来自日积月累，而非一日之功" class="headerlink" title="3. 过程法则：领导力来自日积月累，而非一日之功"></a>3. 过程法则：领导力来自日积月累，而非一日之功</h3><p>罗斯福的一生，完美阐述了一个人，从一个身体羸弱可能都活不到成年的人，不断经历，不断学习，成长为一个极具影响力总统的过程<br>身体力行，告诉自己，我不一定是要为这个世界做什么，而是我想要做什么，在这个过程中，无意中分支出了其它的影响力。</p><h3 id="4-导航法则：谁都可以掌舵，唯有领袖才会设定航线"><a href="#4-导航法则：谁都可以掌舵，唯有领袖才会设定航线" class="headerlink" title="4. 导航法则：谁都可以掌舵，唯有领袖才会设定航线"></a>4. 导航法则：谁都可以掌舵，唯有领袖才会设定航线</h3><p>为了达到一个可完成的目标前，需要制订一套可行的执行计划，也就是所谓的如下：</p><p><strong>预先计划（plan ahead）</strong><br><strong>P</strong>: predetermine a course of action.（决定行动纲领）<br><strong>L</strong>: lay out your goals.（列出分层目标）<br><strong>A</strong>: adjust your priorities.（调整优先级）<br><strong>N</strong>: notify key personnel.（分发给关键人员）<br><strong>A</strong>: allow time for acceptance.（预留他人同意时间）<br><strong>H</strong>: hand in to action.（开始行动）<br><strong>E</strong>: expect problems.（预测问题）<br><strong>A:</strong> always point to successes.（凸显每项成功之处）<br><strong>D</strong>: daily review your plan.（每日复盘）</p><blockquote><p>一个计划是否被接纳，得到支持并成功，主要因素不是计划有多大，而是领袖有多好。（你是否做好的充足的准备，是否让对方信任）</p></blockquote><h3 id="5-哈顿法则：真正的领袖一开口，人们就洗耳恭听"><a href="#5-哈顿法则：真正的领袖一开口，人们就洗耳恭听" class="headerlink" title="5. 哈顿法则：真正的领袖一开口，人们就洗耳恭听"></a>5. 哈顿法则：真正的领袖一开口，人们就洗耳恭听</h3><p>真领袖的必备条件：</p><ol><li><strong>品格</strong>–本质</li><li><strong>关系</strong>–人脉资源</li><li><strong>知识</strong>–个人见地</li><li><strong>直觉</strong>–感受</li><li><strong>经验</strong>–曾经走过的路</li><li><strong>过去的成就</strong>–曾经实现的目标<ol><li>通过之前沉淀的成功案例，让他人相信我的领导力</li></ol></li><li><strong>能力</strong>–他能做什么？</li></ol><p>验证自己是否真的具有领导力，问一下自己这几个问题：</p><ol><li>你对人说话时，对方有什么反应？</li><li>他们在倾听你说话吗？是真的在认真听吗？</li></ol><h3 id="6-根基法则：信任乃是领导的根基，一个人办事的成效水平"><a href="#6-根基法则：信任乃是领导的根基，一个人办事的成效水平" class="headerlink" title="6. 根基法则：信任乃是领导的根基，一个人办事的成效水平"></a>6. 根基法则：信任乃是领导的根基，一个人办事的成效水平</h3><p>论及领导，不管带的人有多久，绝对不能取巧走捷径。<br><strong>品格造就信任，信任是领导的根基，而它的建立不光是口头讲讲，必须拿出实际成果</strong></p><h3 id="7-敬佩法则：人们只想跟随比自己强的领袖"><a href="#7-敬佩法则：人们只想跟随比自己强的领袖" class="headerlink" title="7. 敬佩法则：人们只想跟随比自己强的领袖"></a>7. 敬佩法则：人们只想跟随比自己强的领袖</h3><blockquote><p>当人们把某人视为个人尊敬时，他们仰慕他；把她视为朋友尊敬时，他们真心爱她；把她视为领袖尊敬时，他们心甘情愿追随他。   – 杜曼女士</p></blockquote><p>领导力 7 的人不可能领导 8-9 的人</p><p>通常一个人领导力越高，越能觉察出别人身上领导能力的强弱</p><p>领袖一定要知道他所知道的，他所坚持的价值观，并且能把这个价值观清楚地表达给别人。</p><p>衡量一位追随者对领袖的尊重程度：在发生重大变革的时候，有多少人会跟随你？</p><blockquote><p>自我理解：通过自我付出，时间和心血，让对方感受到类似生命的意义，活着认可我给对方带来的价值和价值观（尊敬）</p></blockquote><h4 id="领袖敬佩法则带领示例图"><a href="#领袖敬佩法则带领示例图" class="headerlink" title="领袖敬佩法则带领示例图"></a>领袖敬佩法则带领示例图</h4><p><img src="/img/gallery/2022/20221010.png" alt="领袖敬佩法则带领示例图"><br><img src="/img/gallery/2022/20221010-2.png" alt="领袖敬佩法则带领示例图2"><br><img src="/img/gallery/2022/20221010-3.png" alt="领袖敬佩法则带领示例图3"></p><h3 id="8-直觉法则：领袖善用领导的直觉来评估每一件事"><a href="#8-直觉法则：领袖善用领导的直觉来评估每一件事" class="headerlink" title="8. 直觉法则：领袖善用领导的直觉来评估每一件事"></a>8. 直觉法则：领袖善用领导的直觉来评估每一件事</h3><p>领袖必须洞察情境，并直觉的知道该以什么战术来应对</p><blockquote><p>自我思考：将领导的直觉，通过不断的训练，内化为自身的一种条件反射（匮乏思维转富裕思维）</p></blockquote><p>先天的能力与后天习得的技巧，会在领袖身上创造出一种先知先觉的本能反应</p><blockquote><p>结合实际情况，通过直觉来觉察到事情的发展趋势，还有对方当下的状态</p></blockquote><p>成功的领袖会使他手中的资产与资源发挥最大的用途，使他的组织获益</p><p><strong>一个人如果不肯彻底又真诚地面对及克服自己的缺点，他绝对成不了大事儿。你是怎样的人，就有怎样的眼界。</strong></p><h4 id="领导直觉的三个层次"><a href="#领导直觉的三个层次" class="headerlink" title="领导直觉的三个层次"></a>领导直觉的三个层次</h4><ol><li>天生能看透的人</li><li>经过培训也能看透的人</li><li>永远看不透的人</li></ol><p>领导是艺术成分多过科学成分的职业</p><h3 id="9-磁力法则：物以类聚，你是什么样的人，就会吸引什么样的人"><a href="#9-磁力法则：物以类聚，你是什么样的人，就会吸引什么样的人" class="headerlink" title="9. 磁力法则：物以类聚，你是什么样的人，就会吸引什么样的人"></a>9. 磁力法则：物以类聚，你是什么样的人，就会吸引什么样的人</h3><p>我想要的人的特质：</p><ol><li>执行力强</li><li>对生活抱有热情</li><li>认可PUA的价值观</li><li>有自我独立意识,个性强</li><li>品味高</li></ol><blockquote><p>你想要吸引什么样的人，首先你必须在相同专注的领域，拥有比他更高的造数，底层逻辑就是人的慕强本性</p></blockquote><p>强者只会被比他更强的人所吸引。</p><h3 id="10-亲和力法则：领袖知道，得人之前必先得其心"><a href="#10-亲和力法则：领袖知道，得人之前必先得其心" class="headerlink" title="10. 亲和力法则：领袖知道，得人之前必先得其心"></a>10. 亲和力法则：领袖知道，得人之前必先得其心</h3><p>除非人们先知道你关心他们，不然他们根本不在意你，哪怕你有再多的学识都一样</p><p>带领自己用头脑就行了，带领他人要用心。</p><h3 id="11-核心圈法则：核心圈的水平足以决定你的成败"><a href="#11-核心圈法则：核心圈的水平足以决定你的成败" class="headerlink" title="11. 核心圈法则：核心圈的水平足以决定你的成败"></a>11. 核心圈法则：核心圈的水平足以决定你的成败</h3><p>你是个什么样的人，取决于你身边5个人的平均水平</p><h3 id="12-授权法则：有安全感的领袖才肯授权与人"><a href="#12-授权法则：有安全感的领袖才肯授权与人" class="headerlink" title="12. 授权法则：有安全感的领袖才肯授权与人"></a>12. 授权法则：有安全感的领袖才肯授权与人</h3><h4 id="违反授权法则的原因"><a href="#违反授权法则的原因" class="headerlink" title="违反授权法则的原因"></a>违反授权法则的原因</h4><ol><li>渴望工作上的安全感</li><li>抗拒改变</li><li>缺乏自我肯定</li></ol><h3 id="13-增殖法则：名师出高徒，只有领袖才能带出领袖"><a href="#13-增殖法则：名师出高徒，只有领袖才能带出领袖" class="headerlink" title="13. 增殖法则：名师出高徒，只有领袖才能带出领袖"></a>13. 增殖法则：名师出高徒，只有领袖才能带出领袖</h3><p><strong>将心力花在主要的追随者或者干部身上，去培养他，可以达到事半功倍的效果。</strong></p><blockquote><p><strong>去找到愿意追随你的人，并且打心里尊敬你的人，去培养他。</strong></p></blockquote><p><strong>想压低别人，同时自己也要低下去。</strong></p><p><strong>能栽培领袖的领袖素质：</strong></p><ol><li><strong>顾全大局</strong></li><li><strong>吸引潜在的领袖</strong></li><li><strong>创造适合于领袖成长的环境</strong></li></ol><h3 id="14-接纳法则：要人们认同你的想法，必须先让他们接受你这个人"><a href="#14-接纳法则：要人们认同你的想法，必须先让他们接受你这个人" class="headerlink" title="14. 接纳法则：要人们认同你的想法，必须先让他们接受你这个人"></a>14. 接纳法则：要人们认同你的想法，必须先让他们接受你这个人</h3><p>通常，投资者根本没有兴趣查问这位创业家的目标是什么，如果他们认定了某人可信，自然就会接纳这个人的想法。</p><p><strong>人们一旦拥护某人，就乐意跟随他的目标，人们乐意追随那些他们能够认同的人。</strong><br><img src="/img/gallery/2022/20221010-4.png" alt="接纳法则"></p><p><strong>提出自己的愿景目标前，先让对方相信你，并愿意追随你这个人。</strong></p><h3 id="15-致胜法则：领袖必须为他的团队，找出一条致胜之路"><a href="#15-致胜法则：领袖必须为他的团队，找出一条致胜之路" class="headerlink" title="15. 致胜法则：领袖必须为他的团队，找出一条致胜之路"></a>15. 致胜法则：领袖必须为他的团队，找出一条致胜之路</h3><p><strong>不要去纠结自己的失误，永远向前看的人才能带领团队致胜。</strong></p><p><strong>得胜三要素：</strong></p><ol><li>统一的目标</li><li>多样化的技能（只有好球员和只有好教练都不能带领队伍赢得胜利）</li><li>一位愿意为获胜而献身、致力于发挥队员潜能的领导者</li></ol><h3 id="16-动能法则：动能是领袖最好的朋友"><a href="#16-动能法则：动能是领袖最好的朋友" class="headerlink" title="16. 动能法则：动能是领袖最好的朋友"></a>16. 动能法则：动能是领袖最好的朋友</h3><p><strong>只有那些能引发他人动力的领袖才能激发动能</strong></p><blockquote><p><strong>瞄准了目标，务必义无反顾</strong></p></blockquote><h3 id="17-优先次序法则：领袖们必须明白，忙碌不见得就会有成就"><a href="#17-优先次序法则：领袖们必须明白，忙碌不见得就会有成就" class="headerlink" title="17. 优先次序法则：领袖们必须明白，忙碌不见得就会有成就"></a>17. 优先次序法则：领袖们必须明白，忙碌不见得就会有成就</h3><p>领袖就是攀上最高树梢仔细勘察全景，然后敢大声宣布“走错树林”的人</p><p>二八法则：集中注意力于最重要的20%，就能得到想要的80%</p><p>优先原则遵循三个R:</p><ol><li><strong>必要的分内事（requirement）</strong><ol><li>专注于那些必须非自己不可的事情，其它必须但不需要自己出面的事情授权给其它人。</li></ol></li><li><strong>回收效益高的事（return）</strong><ol><li>把时间花在你的最强领域（如果一件事别人能做到你的80%，把这件事放出去，专注更重要的事儿）</li></ol></li><li><strong>奖赏大的事（reward）</strong><ol><li>有许多事情会吸引我们的眼睛，但是只有少数几件能吸引我们的内心</li></ol></li></ol><p><img src="/img/gallery/2022/20221010-5.png" alt="优先次序法则"></p><p>专注于真正重要的事情，花出去的时间才有价值，并且更容易成功。</p><h3 id="18-“舍”“得”法则：领袖必须懂得舍，才能有得"><a href="#18-“舍”“得”法则：领袖必须懂得舍，才能有得" class="headerlink" title="18. “舍”“得”法则：领袖必须懂得舍，才能有得"></a>18. “舍”“得”法则：领袖必须懂得舍，才能有得</h3><p>当你成为一位领袖时，就失去了为自己打算的权利。【领导力越强，责任越大】</p><p>你失去的一切，会从其他方面补偿。而得到的一切，也必须付出一些代价来换取。</p><h3 id="19-时机法则：掌握时机与善用策略同样重要"><a href="#19-时机法则：掌握时机与善用策略同样重要" class="headerlink" title="19. 时机法则：掌握时机与善用策略同样重要"></a>19. 时机法则：掌握时机与善用策略同样重要</h3><p><strong>正确的时机 + 正确的行动 &#x3D; 成功</strong></p><h3 id="20-爆炸性倍增法则：培养追随者得到相加的效果，培养领导者得到相乘的效果"><a href="#20-爆炸性倍增法则：培养追随者得到相加的效果，培养领导者得到相乘的效果" class="headerlink" title="20. 爆炸性倍增法则：培养追随者得到相加的效果，培养领导者得到相乘的效果"></a>20. 爆炸性倍增法则：培养追随者得到相加的效果，培养领导者得到相乘的效果</h3><p><img src="/img/gallery/2022/20221010-6.png" alt="栽培能带领追随者的领袖和栽培能栽培领袖的领袖"><br><img src="/img/gallery/2022/20221010-7.png" alt="栽培能带领追随者的领袖和栽培能栽培领袖的领袖"></p><ul><li>只影响到身边常接触的人</li><li>影响力扩及甚远</li></ul><h3 id="21-传承法则：以为领袖的历史地位有赖于顺利传承"><a href="#21-传承法则：以为领袖的历史地位有赖于顺利传承" class="headerlink" title="21. 传承法则：以为领袖的历史地位有赖于顺利传承"></a>21. 传承法则：以为领袖的历史地位有赖于顺利传承</h3><p>领导力是无法委托别人来发挥的，你如果不能运用它，就得放弃他。</p><ol><li>用长远的眼光来领导</li><li>创造一种领导文化</li><li>今天先付代价以确保明天的成功</li><li>重视团队领导超过重视个人领导</li><li>不管一个领袖多么能干，他绝对无法孤军奋战</li><li>带着真诚离去</li></ol><h2 id="读后感"><a href="#读后感" class="headerlink" title="读后感"></a>读后感</h2><p>沟通能力的高低是任何能力的基础，也是能决定你上限的基础</p><p>每个领导级别的人都很优秀，有他们独特的观点和看法，这也许是它们拥有领导力的原因，有的时候可能自己不认可，但是保持透明和开放的态度去分析或许有更好的效果。</p>]]></content>
    
    
    <summary type="html">想要学习作为一个雄性领袖所需要遵循的法则，如何能够带领别人。目前我总结的几个点为</summary>
    
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/categories/%E9%98%85%E8%AF%BB/"/>
    
    
    <category term="雄性内核" scheme="https://blog.jzxer.cn/tags/%E9%9B%84%E6%80%A7%E5%86%85%E6%A0%B8/"/>
    
    <category term="core" scheme="https://blog.jzxer.cn/tags/core/"/>
    
  </entry>
  
  <entry>
    <title>好的好人2-财色战场</title>
    <link href="https://blog.jzxer.cn/20220928/goodgoodpeople2/"/>
    <id>https://blog.jzxer.cn/20220928/goodgoodpeople2/</id>
    <published>2022-09-28T12:26:45.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<h3 id="内容简介"><a href="#内容简介" class="headerlink" title="内容简介"></a>内容简介</h3><h3 id="书摘"><a href="#书摘" class="headerlink" title="书摘"></a>书摘</h3><ol><li>要做一個不平凡的人，就一定要學會看穿深層次的境界，這樣你 才能想出非一般的方法，得到你最想要的不凡效果。</li><li><strong>马斯洛需求金字塔</strong></li></ol><p><img src="/img/gallery/2022/20220928.png" alt="马斯洛需求金字塔"><br>3. 推動社會進步的最重要元素就是<strong>自私動機和競爭</strong>。<br>4. 一些追求異性的「高手中的高手」，是絕對不用甜言蜜語 的，也不獻殷勤，他們反其道而行，喜歡在言談中<strong>取笑、戲弄甚至貶低</strong>他們想追求的對象。<br>5. 你越喜歡她，她就越不喜歡你。想要提升自己的价值，让对方错以为他需要获得你的接受：<br>    1. <strong>让对方感觉你并不需要她</strong><br>    2. 美女心裡會浮現這個疑問:「為什麼每個人都被他接 受了，就只有我還未被接受?」<br>    3. 将自己丢入女生恨的区域，若即若离（<strong>转恨成爱</strong>）<br>6. 愛情的火花，取決於你在對方的頭腦裡，同時製造兩種反方 向的情緒。<br>7. <strong>夸人、拍马的技巧是</strong>：对方觉得是她赢得了你的认同<br>8. <strong>遇到挫折時，尋求解決為上策，宣洩情緒為下策：</strong>碰到问题或者挫折，找到解决问题的方式去执行比花时间激励自己更靠谱。（需要激励的人往往都不太成熟）<br>9. 和对手接触，相处时，要时刻关注自己的情绪变化，当出现情绪变化的时候，观察对方说了什么，做了什么？<br>10. 不管你是要備戰進入市場或情場，你都要探討人類的本性，并進一步從人類自私本性中去了解每個人行為背後的來龍去脈。 最重要的是你能夠更了解自己，你要達到光明正大的財色兼收也就指 日可待了。<br>11. <strong>大丈夫就是把「愛心」和「嚴厲」修煉到收放自如的人</strong><br>12. 《孫子兵法》的詭道法則: 你越是強的， 就越要示弱。(能而示之不能，用而示之不用的虛實互用，相反之道。)<br>13. <strong>伏 筆</strong>，會使人產生好奇心，進而等待適當的時候反問回你有關事項，而當別人主動問你時，你的價值相對就提高了<br>14. 社交场合主动的男生一般是收到女生有意无意的【放电】，而搭讪对方<br>15. 要嘛，就做我女朋友，否則，我也沒興趣跟你做朋友。<br>16. <img src="/img/gallery/2022/20220928-2.png" alt="幼稚的无私会让你财色皆失"><br>17. <strong>愛情不是偉大的，對人有情慾也沒有罪，不要怕表达自己的想法，直接点</strong><br>18. 如果你做了一个所谓看起来伟大的男人，你就会变成<br>    1. You are a girlfriend with penis（有屌的女朋友）<br>    2. You are her emotional tampon（情绪卫生巾）<br>19. <strong>自保咒语：有了一次，就會有第二次，有了兩次 就會有第三次。</strong><br>20. <strong>生活中多一点陈述句，少一点疑问句（锻炼雄性极性之领袖气质）</strong><br>    1. 領袖者先假設每個人都接授他的指揮; 不被接受才征求允許。<br>    2. 邀约来自于希望对方进入我们的世界，每个人的世界都很重要，只不过要<strong>把自己的世界看的最重要。</strong><br>21. 任何時候，你都要想著把自己變成主角、領導者、明星並指揮別 人。身為領導者的明星，就能夠輕易的財色兼收。<br>22. You want to be right? Or you want to be rich?<br>23. 「飽暖思淫慾」就是人性!不思淫慾的人有 兩個可能性:第一、他還沒飽，也還不夠暖。他因為「革命」尚未成 功，還需要努力奮鬥，所以沒時間和精力在外面胡搞。<br>24. 排卵期時，女人希望被其他男人征服(喜歡陽剛味)，排血期(經期)時，女人希望被「正版」情人照顧。  </p><h3 id="读后感"><a href="#读后感" class="headerlink" title="读后感"></a>读后感</h3><h4 id="推动社会进步的【无形之手】：自私的动机和竞争"><a href="#推动社会进步的【无形之手】：自私的动机和竞争" class="headerlink" title="推动社会进步的【无形之手】：自私的动机和竞争"></a>推动社会进步的【无形之手】：自私的动机和竞争</h4><p>该是他人做的事，就让他人去做，即使时间再不充裕，也不要插手（<strong>人性</strong>）<br><img src="/img/gallery/2022/20220928-3.png" alt="幼稚的无私"></p><h4 id="有时候善恶是相对的，没有人能决定因果，也没有人是真正的对与错"><a href="#有时候善恶是相对的，没有人能决定因果，也没有人是真正的对与错" class="headerlink" title="有时候善恶是相对的，没有人能决定因果，也没有人是真正的对与错"></a>有时候善恶是相对的，没有人能决定因果，也没有人是真正的对与错</h4><p><img src="/img/gallery/2022/20220928-4.png" alt="善恶相对"></p><h4 id="在这个社会生存，包装比内容更重要（所有的價值都是假的-）"><a href="#在这个社会生存，包装比内容更重要（所有的價值都是假的-）" class="headerlink" title="在这个社会生存，包装比内容更重要（所有的價值都是假的 ）"></a>在这个社会生存，包装比内容更重要（<strong>所有的價值都是假的 ）</strong></h4><p><img src="/img/gallery/2022/20220928-5.png" alt="包装自己"><br><img src="/img/gallery/2022/20220928-6.png" alt="女人的法则"><br><img src="/img/gallery/2022/20220928-7.png" alt="示弱法则"></p><h4 id="认清自己的价值，并且将自己推销出去"><a href="#认清自己的价值，并且将自己推销出去" class="headerlink" title="认清自己的价值，并且将自己推销出去"></a>认清自己的价值，并且将自己推销出去</h4><p><img src="/img/gallery/2022/20220928-9.png" alt="推销自己"></p><h4 id="男女之间的博弈，看谁牺牲的更多，对方就更有价值"><a href="#男女之间的博弈，看谁牺牲的更多，对方就更有价值" class="headerlink" title="男女之间的博弈，看谁牺牲的更多，对方就更有价值"></a>男女之间的博弈，看谁牺牲的更多，对方就更有价值</h4><p><img src="/img/gallery/2022/20220928-10.png" alt="男女博弈"></p><h4 id="顺我者昌，逆我者亡"><a href="#顺我者昌，逆我者亡" class="headerlink" title="顺我者昌，逆我者亡"></a>顺我者昌，逆我者亡</h4><p><img src="/img/gallery/2022/20220928-11.png" alt="顺我者昌，逆我者亡"><br><img src="/img/gallery/2022/20220928-12.png" alt="权谋法则"><br><img src="/img/gallery/2022/20220928-13.png" alt="权谋法则"></p>]]></content>
    
    
    <summary type="html">要做一個不平凡的人，就一定要學會看穿深層次的境界，這樣你 才能想出非一般的方法，得到你最想要的不凡效果</summary>
    
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/categories/%E9%98%85%E8%AF%BB/"/>
    
    
    <category term="思维" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E7%BB%B4/"/>
    
    <category term="认知" scheme="https://blog.jzxer.cn/tags/%E8%AE%A4%E7%9F%A5/"/>
    
    <category term="框架" scheme="https://blog.jzxer.cn/tags/%E6%A1%86%E6%9E%B6/"/>
    
  </entry>
  
  <entry>
    <title>上课路上带来的意外邂逅</title>
    <link href="https://blog.jzxer.cn/20220910/datingwithlx/"/>
    <id>https://blog.jzxer.cn/20220910/datingwithlx/</id>
    <published>2022-09-10T02:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="aa01bdae50a178b391e4583c875d9da988e6f2c2845b71f70418d1c7a55f0652">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c875205a444ffb20b3947fab3d1b3c9aeee93f870d8433b7d717892456f448e05a00268758393b09b5929ba898d467e55307baeec1d3a163d92ca15f58597a72aae39970a81aec3ca5f0282ee8c5cd4622aea20721fa046485b895b14fd6fecb65f14486384f6eeaebc99cec44371ccc2aa6b9f822993526e7f90fffa3699228554b36ec704dc97613be2a8a1752e9fb40db04c869a48e172c2faf2ab1092d74d55731b7c24431e788c1e1868484f55b94b229757eb5b8b3c7206b3c65b257ac61b8916e7b812b79f1770cc6dbef4420261d70e3f00b13dda80955eadc44481867ae134bd01e208a11b5ecc5fa2c72a68788da3838c053ee928e1b87d4cf61d173a73d285bfc41c5a8b4bc0102e79950bad6d1f516930d2331161fb8965576d1bec08bcff5bcf13396cafcccd979267e8e3e21dc5bdc64ceeccd871e85e0a1022e313837decb210a9dd2516932cbc1ed3aeeda1aa08dc554cc2ba91cd129e9caa20e42009eba9ce5f13815b266d870ddf5eebd225dd4980b7c248a798be5a0b39d799e6e0076ea2de9321df82b485b163324ce9cfaad000b316de92fd81c769ebbed3201e33456f85e8425dd0372d807f7dd70b8e820bab033ef135173d892bcfa92808849c49f72b360735b4a142b2f49e5b8642712741f7e6412c2ff0467ecd8e026ea7c6899272847c338f1e4d2cb524994a3f7f2387584805578207a605319298a5819e98c32f293afdcb10f55356d2bb19ed952fc1784b3575ab9d144d6d6d1b9093e0f31d20426a4bae014a21b6aa204b06d4495155a1d4eb28272d3ca702a7f8de024c2adaf6fb3fcd3b6f7bc3d0df1628426ab7ba864d9a8e665927554200a82cf441b82f08a337bffc70f879800f01cb80325f3c0651512c2a18f4cb92b52a075fc7efa3dc4531ae31b567233e737ec7cce238d5c4a3074546c2f828a8486013543edf7ea5d2bfbf6d63a492b173f10bbe660b1201420860bb7a8c515bcdaea4bd3e3f80d177d0bd5147f4126a3afe711f8ad015fccd625577dcf40a9ee1e0a272c76d57d4e147f1599ee9a23e529b0054168c178fb21aed2f2eae3219717fdb520ad8d3f4998e1f92b835789ff6f56542d6c9e56b75d38539359447c4feb20c01edf7c0f6f156d5315927e65842604fc2458d8dae9202edb1d355009c9c00b046c6b553accd22ee18cac07084d125a536103ccb00af487989aad0f338f1e364eb140b2de4d186cacfd8246caebb7b0838cab008fd57202b05a96a51455db26cf7a532d1fa3179153c22597a2edae58b34417779744e5ef44e878151ee80a09674889dafce7c37a210636c3c5ec864b22660de123a395b94b68db5ffd83f9e7e88168fb2aecff2d573db477aab196f191de51f2fcb74e0d6c7577275f196476ae6ea8754da8fe21f068021f4853f66c163a7ebfe82c150adb8dbc6c97ee172e489b69f57120c8259ffc1677457de4406c7d0ac012a55cd9b3c77323ed8fea769365a9ce1310cce1b6678eb379760771f575965d32df9b695c5bdec57fe89a0f682d2ecd29bd421e0c7cef90d265bcd7b74915a93d6383db3600664d3ce2416d8bcedc9b1da5d099c5228a83c3784db6baf3acb018f012dde615bcd98de755140054eed37b7bb7e947a3d0ddd9a52f937c8a0725266779d04be678152b703fef54834177e003592fa9015086a8079822538de06a91478a8abebe3df05f6ce9e86860458e1ecbd76d684daad6abb1433d3c9164a828e9b9fb3cd23aa00394700ac53303f331c84a8b3b2882cc7403746cea3f15277c2583e08afa487668645e6cb8c01200ad1e5d5d1f9faf8a6fea7e078d1698b7b68bb03c70b6391bdc39c3ff23a087b589e0b575dadf1d774eba6c7bb4b633ad783b06eea29fb7fdcd8c39df8067b166f3e8a7a31cc2704f93d9f025d370be8d846e5247703782b7b2b2a1d0a9294f755f09caf4368a13d11543a7e6a0da765c47ba53e1b935d477c70b3329f1ee5345a998aa01498699d33d20daeb6e788af7c3959abb183900fa7e10d1dc2869eb058789b5a3b5862e685344af589680dfe71734ed11d7e3401d389be8a18550ea3c13fe705d86ba51d950a228c50a38c2acd6efa78cc2c6ae87d02667ff19648621db80642ee85f1c65056706e7562599c8ad64b56226864114c8ed0eeabbd81538c198eaffb12aa5293ae7a8b99e1ed1468ec53c33429fd2ffd5ef5590e2cc81cbf227a703ddc6d44162d61afe2ddb982a34b6ddec6e8e80092cf15f9c92eebe92a95cedd993ee8967f463ae5c4422fc6977c21b134f290546220cc9f49f1941d1a449f17920833a495ce56407e5113503e4b0da90587f78ca231b3c19aa033021a839f424eef3f8254cb73069ddf4b8543bddd6fc9263f3c50dc0b980567bd5941e2b85b750698a0dd3dce33204efaa8fef5d5e9721d281da9de2a1352037cff85ec54f156652e26257cc001ee6ecf41ecce04c8e82a54d11a52ea928e62ecee9dabfcb5f3bb3e19a2389451610f9b977e380eac2017afb778241da18a6dca5c9aab27345ddb78d019a3fddbbdf50e62ef227cac9707293f8d0e2e708077e8b947a5a0fb506dfaa135004e97d43f5185ead08ece142f521576849dec16d49a7d83ee6200d1d4739792b67b2907008817f2c6f56d2155b1e0c7e3bca36d3f733b30b41dd358d968b8713f9c04a2c3e9525487a2234073cb8f144d91a</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>好的好人1-洗脑</title>
    <link href="https://blog.jzxer.cn/20220901/goodgoodpeople1/"/>
    <id>https://blog.jzxer.cn/20220901/goodgoodpeople1/</id>
    <published>2022-09-01T12:26:45.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<h4 id="内容简介"><a href="#内容简介" class="headerlink" title="内容简介"></a>内容简介</h4><h4 id="书摘"><a href="#书摘" class="headerlink" title="书摘"></a>书摘</h4><ol><li>2%的人会自我思考，3%的人觉得自己在自我思考，95%的人希望他人帮自己思考</li><li>成功的五大要素：见地、手段、性格、资源、机遇（普通人应该着手提升手段和性格，但是不应该盲目只提升这两块内容）</li><li>打破人的机械式反应，到达一定程度的时候，人会进入<strong>能量最低点</strong>（俗称大脑空白），这个时候的人比较容易被催眠，被引导。魅力高手会先想办法把你引入能量最低点，然后再灌输自己的想法。<ol><li>案例：当在飞机上搭讪女生说：要个号码，下次可以聊聊。女生说：可以给我你的号码，我有空给你打。男生这个时候就要打破女生的机械式反应：NO，让她来不及思考，从而引导对方回复：假如有诚意的话，我们就交换电话，假如没有诚意的话，就不需要。</li></ol></li><li>当面对错误，诚心认错不一定会解决问题，可以考虑通过淡化情绪的方式处理对方的愤怒：<strong>用食指指向对方欲言又止（引起悬念）、幽默化解的方式将对方情绪转移</strong></li><li>通过用<strong>电眼</strong>去勾住女生，判断女生是不是被勾住，就看对方是否用余光观察你，假设女生身体面向12点正前方，你在他的左侧，她向左侧偏移到了11点半的方向，说明你的电眼生效了（在碰到高分女生时，试着用食指指他，看他的反应）</li><li><strong>思考不同</strong>：反向卖玉的故事告诉我们：只有吸引住对方的兴趣和注意力，价值才能发挥作用</li><li><strong>神棍法则（</strong>千·隆·问·屈<strong>）：</strong>让人觉得说的很准的方式，首先提出一个大概率事件，再通过对方的神情举止决定接下来的行动</li></ol><p><img src="/img/gallery/2022/20220901.png" alt="神棍法则：千隆文屈"></p><ol start="8"><li><strong>言 What 而不告知 How</strong>：告诉对方问题所在，而不告诉对方问题怎么解决，如果想解决需要对方付出相对应的代价【核心思想：<strong>给样本，不给产品</strong>】</li><li><strong>重复三次原理：1. 这是紧急的事、2. 指令明确、3. 确保对方不想其他事</strong></li><li>模仿对方的肢体动作、语气、语言模式，可以很快拉近两人的关系（共情）</li><li><strong>隐晦命令催眠技巧：</strong>在陈述的句子中，加入希望对方做的事，</li><li>其实有很多人…兄弟（重音），他们都知道怎么样去…找出时间（重音）</li><li>不断重复一件事A、或者是一个单词</li><li><strong>心锚理论：</strong>用比较的手法，或者是排比的手法，将自己的观念植入到一段对话中，让对方做出符合你预期的反应（比如喜欢上你，喜欢上你的产品）：</li><li>马丁路德金为国家献出生命、肯尼迪为国家献出生命、投票给克林顿（将真实想法与爱国情怀绑定）</li><li>穷爸爸多么不得好死，富爸爸多么春光明媚（双重性格心锚，所有痛苦都在穷爸爸上）</li><li><strong>言谈改框法：</strong>将对方的负面思想重新定义，让他【开窍】，开窍的那一刻进入能量最低点。</li></ol><h4 id="读后感"><a href="#读后感" class="headerlink" title="读后感"></a>读后感</h4><p><img src="/img/gallery/2022/20220901-2.png" alt="权谋法则1"><br><img src="/img/gallery/2022/20220901-3.png" alt="权谋法则2"><br><img src="/img/gallery/2022/20220901-4.png" alt="权谋法则3"><br><img src="/img/gallery/2022/20220901-5.png" alt="权谋法则4"><br><img src="/img/gallery/2022/20220901-6.png" alt="权谋法则5"><br><img src="/img/gallery/2022/20220901-7.png" alt="权谋法则6"><br><img src="/img/gallery/2022/20220901-8.png" alt="权谋法则7"><br><img src="/img/gallery/2022/20220901-9.png" alt="权谋法则8"><br><img src="/img/gallery/2022/20220901-10.png" alt="权谋法则9"><br><img src="/img/gallery/2022/20220901-11.png" alt="权谋法则10"></p>]]></content>
    
    
    <summary type="html">成功的五大要素：见地、手段、性格、资源、机遇（普通人应该着手提升手段和性格，但是不应该盲目只提升这两块内容）</summary>
    
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/categories/%E9%98%85%E8%AF%BB/"/>
    
    
    <category term="思维" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E7%BB%B4/"/>
    
    <category term="创造性" scheme="https://blog.jzxer.cn/tags/%E5%88%9B%E9%80%A0%E6%80%A7/"/>
    
  </entry>
  
  <entry>
    <title>自律神经失调</title>
    <link href="https://blog.jzxer.cn/20220827/shenjinshitiao/"/>
    <id>https://blog.jzxer.cn/20220827/shenjinshitiao/</id>
    <published>2022-08-27T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.303Z</updated>
    
    <content type="html"><![CDATA[<p>台湾一直有不少民众会有「逛医院症候群」，重复做许多检查，医师也依照个案所主诉的症状开立药物，但是民众拿了一堆药物后，自己又当「半个医生」，自行调整药物的种类和剂量；另外也有很多有身体不适的民众，认为找了很多医院，医师安排许多检查后都找不到病因，不如买些地下电台所贩卖「成药」服用因而导致肾衰竭，创造台湾地区民众中「洗肾患者」所占比例名列世界前茅，形成另一个不太光荣、而且令医疗专业人员担忧大众身心健康的「台湾奇迹」，其实主要的元凶便是此篇要与大家分享的「自律神经失调」。</p><h2 id="什么是「自律神经」？"><a href="#什么是「自律神经」？" class="headerlink" title="什么是「自律神经」？"></a>什么是「自律神经」？</h2><p>我们身体的内脏器官，如心脏、气管、肺脏、胃、肠系统，甚至生殖功能，都是受自律神经系统（ANS）所调控。自律神经系统（ANS）是周边神经系统的一部份，它控制体腔内许多的器官和肌肉。在大部分的情况下，我们是无法察觉自律神经系统的运作，因其作用是透过非潜意识主控的反射动作进行之。</p><p>自律神经又分两种，一是交感神经，另一种则是副交感神经。前者使心跳加速、血压上升、皮肤发汗增加、瞳孔放大、胃肠蠕动减缓，常被称为人体的「加油器」。后者则相反，它使心跳变慢、血压下降、瞳孔缩小、胃肠蠕动加快，常被称为人体的「煞车器」。</p><p>让交感神经发挥作用的神经传递物质称为「正肾上腺素」，如果分泌过多，会提高血中的胆固醇和血压，但却降低消化功能。反之，副交感神经发挥作用的神经传递物质称为「乙醯胆碱」，能够降低胆固醇和血压，但可提升消化功能。当自律神经功能产生失调时，只有调整恢复「神经传导物质活性」相关的作用，才能恢复自律神经功能。因为各种神经都具有良好的可塑性，长时间让他维持在良好状况下运作，自然会有适应学习的反应，最后即可恢复自行稳定运作的能力。</p><h2 id="自律神经的功能"><a href="#自律神经的功能" class="headerlink" title="自律神经的功能"></a>自律神经的功能</h2><p>正常运作的自律神经系统，交感与副交感神经系统之间会保持平衡，并对我们体内的内脏器官进行调控，而且有一定的节奏韵律。以一天为单位来看，白天主要是由交感神经执行作用为主，呼吸和心脏机能都非常活跃，体温和血压较高，完全是为了白天的活动做好必要的准备动作。到了晚上，则由副交感神经发挥作用，心脏的跳动和呼吸频率都减少了，体温和血压也稍下降，以便休息或睡眠做好准备。</p><p>另外生活中如果有压力的紧急的状况下，自律神经还有协助我们完成「迎战」或「溃退」(逃跑)(英文:Flight or Flight)的功能。举个例子：一个阳光普照，舒爽的日子，你悠哉地在公园散步。突然，一只发怒的熊出现在前面。你会蓄势放手一搏，还是转身逃走？这就是「搏斗」或是「逃跑」的反应。在这种情况下，你的交感神经活化－血压上升，心跳加快，消化作用减慢，因而得以应付能量之消耗。不但如此，自律神经系统还会和躯体的运动神经系统交互作用，身体的生理机能得以正常运作。自律神经系统还有影响胃神经系统的第三种分支，会支配胃肠道、胰脏和胆囊等内脏网状神经网路。</p><h2 id="为什么会「自律神经失调」？"><a href="#为什么会「自律神经失调」？" class="headerlink" title="为什么会「自律神经失调」？"></a>为什么会「自律神经失调」？</h2><p>正常情况下，交感神经与副交感神经互相拮抗并同步协调，使人体各种生理功能顺利进行。但在长期处于慢性或过度压力、焦虑、忧郁的影响下，便会让自律神经失去平衡，古人所说的「一股作气、再而衰、三而竭」便是指此状况。自律神经失调时，因为它会「全身性」干扰，便会让个案感受到比较敏感的部位有「不舒服」的症状，但是进行器官的检查却没有异常，例如：抱怨「头痛、头重感」，安排了脑波、电脑断层、核磁共振等检查，都被告知「正常」的「怪现象」！事实上，自律神经失调的病患相当普遍，只是过去医院很少提供这方面的检查，也缺乏具体的治疗方法。</p><h2 id="自律神经失调的症状"><a href="#自律神经失调的症状" class="headerlink" title="自律神经失调的症状"></a>自律神经失调的症状</h2><p>自律神经失调的症状可以用「五花八门」来形容，罹病个案的不适症状甚至可以由头到脚、在不同部位来回转移。以下是常见的症状：</p><ol><li>头：头晕、头重、头痛、头部发麻、发烫感。</li><li>眼：眼睛疲劳、眼痛、泪眼、眼睛张不开、视线模糊、眼睛干涩。</li><li>耳：耳鸣、耳阻塞感。</li><li>口：口干、口渴、口内疼痛、口舌异常感、味觉异常。</li><li>喉咙：阻塞感、异物感、压迫感、发痒、异常咳嗽。</li><li>手：发麻、发抖、疼痛、感觉异常、发冷、发烫。</li><li>脚：下肢麻木、发冷、发烫、疼痛、脚跟贴地疼痛、肌肉跳动。</li><li>肌肉、关节：颈部紧绷酸痛、肩膀紧绷酸痛; 全身肌肉疼痛、多处神经痛、 背部及腰部紧绷疼痛、关节倦怠或无力。</li><li>呼吸器官：呼吸困难、肋间神经痛、呼吸肌肉紧绷酸痛、呼吸道阻塞感、类似鼻塞而无法呼吸、不自主深呼吸或叹气。</li><li>心脏：心悸(感觉到心跳)、心跳加速、心跳强劲、心脏无力感、胸闷、胸部压迫感。</li><li>血官循环：血压起伏变动（会出现假性高血压）、头昏眼花、手脚冰冷、脸部潮红燥热、起立性晕眩、血气上冲、偏头痛。</li><li>消化器官：食道阻塞感、恶心、呕吐、胃部发热、胃部痉挛、腹胀、腹部疼痛、便秘或腹泻、肠胃蠕动异常、肛门口不快感、便意感频繁。</li><li>膀胱：膀胱神经敏感、尿意感频繁、频尿、排连不易、排尿后不适感、残尿感、尿床。</li><li>生殖器：性功能障碍。</li><li>皮肤：多汗、不出汗、异常发汗、皮肤干燥、全身发痒、发烫、发冷。</li><li>精神症状：焦躁易怒、莫名奇妙的恐慌不安感、寂寞孤独感、悲伤感、没有欲望、注意力不集中、记忆力减退。</li><li>全身症状：全身倦怠、异常疲劳、全身无力、提不起劲、轻度发烧发烫、缺乏食欲、睡不着、浅眠或多梦、白天赖床困倦。</li></ol><h2 id="自律神经失调的治疗"><a href="#自律神经失调的治疗" class="headerlink" title="自律神经失调的治疗"></a>自律神经失调的治疗</h2><p>治疗自律神经失调，首要之道在个案的症状以及生活压力中找出病因，才能让自律神经功能恢复正常或预防自律神经失调的慢性化。医师给予抗焦虑、抗忧郁、安眠或安神镇静药物，并非治疗自律神经失调，而是协助改善造成自律神经失调的潜在原因，提供缓冲期，让身心平稳。不讳言，「个性体质」因素常是最核心的原因。</p><p>例如有些人具有明显的 A(Aggression)型性格：生活中大大小小的事都追求胜利与成就感，便有极大机率将自己处于过度紧绷以及高压感的状态，自律神经因而失调。对于此种个案，我们会指导建议将「大 A」调整成「小 a」，免得在追求事业成功的同时，却要付出身心障碍的代价！</p><h2 id="如何预防「自律神经失调」？"><a href="#如何预防「自律神经失调」？" class="headerlink" title="如何预防「自律神经失调」？"></a>如何预防「自律神经失调」？</h2><p>从专业角度来看，预防「自律神经失调」可以从生活型态、运动、饮食、情绪多元方式切入，养成正确的观念与技巧。</p><h3 id="甲、从「生活型态调适」稳定自律神经"><a href="#甲、从「生活型态调适」稳定自律神经" class="headerlink" title="甲、从「生活型态调适」稳定自律神经"></a>甲、从「生活型态调适」稳定自律神经</h3><ol><li>不熬夜，调整生活作息「日出而作、日落而息」，白天的交感神经活络，晚上则交由副交感神经，若日夜颠倒，容易造成自律神经失调。</li><li>不做工作狂工作时交感神经活络，休息时副交感神经活络，若常加班、不停工作，交感神经就会过旺。所以上下班或工作、休闲需要分清楚。</li><li>增加活动场所不要老窝在职场，只知道埋头工作；或待在家里、当宅神；平日要有不同的活动空间可去，例如公园散步、健身房运动、图书馆看书等。</li><li>接近大自然大自然中的芬多精可提高人体的新陈代谢，稳定自律神经。</li><li>让身体自然调节体温夏天为了应付体温高，让身体多休息，人体的副交感神经较活络。冬天为了不让体温流失，换成交感神经系统活络。然而现代人长期依赖空调，身体调节体温的功能逐渐减弱，自律神经就容易失调，所以尽量不要依赖冷暖气，才能让交感神经正常运作。</li></ol><h3 id="乙、从「运动调适」稳定自律神经"><a href="#乙、从「运动调适」稳定自律神经" class="headerlink" title="乙、从「运动调适」稳定自律神经"></a>乙、从「运动调适」稳定自律神经</h3><ol><li>养成规律的运动运动会让脑部分泌一种让人情绪愉悦的物质（Endorphin，脑内吗啡），是调节自律神经的好方法。适合项目包括游泳、瑜珈、打太极拳、气功、静坐、外丹功、快走等；尽量不做剧烈运动。</li><li>常做腹式呼吸呼吸是少数能被人所控制的自律神经节律，吸气时能刺激交感神经的活络，吐气时则刺激副交感神经的活络。腹式呼吸能帮助自律神经维持在平衡状态。</li></ol><h3 id="丙、从「饮食调适」稳定自律神经"><a href="#丙、从「饮食调适」稳定自律神经" class="headerlink" title="丙、从「饮食调适」稳定自律神经"></a>丙、从「饮食调适」稳定自律神经</h3><ol><li>均衡饮食均衡摄取六大类食物。</li><li>摄取解除压力的食物在平日饮食中，可以多摄取富含维生素 B 群、卵磷脂、Omega3、糖类、色胺酸、酪胺酸、钙、镁、锌等食物。另外视个人体质，少吃容易诱发压力的食物，例如刺激性食物(黑咖啡、浓茶、酒等)、油炸食品、高钠食品(罐头食品、腌制品、泡面等)及含糖过高的食物。</li><li>摄取提升免疫力食物摄取富含蛋白质、维生素 A、维生素 B 群、维生素 C、维生素 E、类胡萝卜素、多糖体、生物类黄酮、乳酸菌等。推荐食物：大蒜、洋葱、蕈菇类、优酪乳等。</li><li>补充抗氧化剂多摄取抗氧化营养素，防止自由基破坏身体。</li></ol><h3 id="丁、从「情绪调适」稳定自律神经"><a href="#丁、从「情绪调适」稳定自律神经" class="headerlink" title="丁、从「情绪调适」稳定自律神经"></a>丁、从「情绪调适」稳定自律神经</h3><ol><li>学习不紧张、不安、兴奋过度的紧张、不安、兴奋，会让交感神经与副交感神经不规则地亢奋，引发自律神经失调。</li><li>学习不悲伤、沮丧、失望、郁卒悲伤、沮丧、失望、郁卒，会阻碍交感神经与副交感神经的正常运作，引发自律神经失调。</li><li>不要太ㄍㄧㄥ过度压抑情绪，反而让下视丘与自律神经之间失序，引发自律神经失调。</li><li>保持平稳的情绪当人在平静、放松状态中，交感神经与副交感神经会处于平衡状态中。</li><li>不再事事求完美尤其是 A 型性格的人，求好心切，最容易患有自律神经失调。</li><li>纾解压力不要万事皆吞忍，不论是找人聊天、哭泣、逛街购物，给情绪一个宣泄的出口。</li><li>少动怒以及歇斯底里大哭大叫或大发雷霆会增加交感神经亢奋。</li></ol>]]></content>
    
    
    <summary type="html">自律神经失调</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="健康" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7/"/>
    
    <category term="神经失调" scheme="https://blog.jzxer.cn/tags/%E7%A5%9E%E7%BB%8F%E5%A4%B1%E8%B0%83/"/>
    
    <category term="精神病" scheme="https://blog.jzxer.cn/tags/%E7%B2%BE%E7%A5%9E%E7%97%85/"/>
    
  </entry>
  
  <entry>
    <title>青藤上的一个约会经历</title>
    <link href="https://blog.jzxer.cn/20220814/datingwithsqd/"/>
    <id>https://blog.jzxer.cn/20220814/datingwithsqd/</id>
    <published>2022-08-14T02:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="240b8e4203bc481bbeb19faac872fcc5ffcd73f99f0d45ad5ffc73ac545d974d">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c87520d2130a9fd980248c07e3d11351d5941d0614a3c7b31d7707fca0320e97546794471d66ffad1958877e66e82b0b59b64eff90658dc582a13f529cec12488e3772e5ef9fffd287f2387003b4a042e2615f2c2ddc541ee118d86df1aafecdc2ec58b50f3c3b1717d58e417ac82d910f951c2ab281978473b0fe0e00d2a947bbfe6cc1ce5dcffc3ba011dd56b96e4d6aa346b5f740c9a87e684ffcac8a83144b2cfacf4996ad7fec13a6d8db0cd9d7080eeac2b52aba39364c6228c077a08d0d866ac2fcff167e24255f2bb77869f2eaeacb41440a99f4860c6c7eb8cb364b4756daea4a69dc517be6cd8f19d65557ee219de0e6fa3699243183812ba7cc32c1ee4cb1a79fb784ff7e095da95e7eaa308dcc4cae31c7193b85daae5f7f0049c338b64ee501a24c9e585431e90adf3dd2bf6654594f9b99df77eb9ada5872a6f1b8c6d603736770481725de10b6eaaa6e7fabed1006d85c641db100c1d131b2fa47c11eae2c95a2b56c5fd20cf642cb367dd70c634afb0072aaee72a07cee014e94ce0aedf1584da66c46cf5b555c923255839fdaa06cc1a1369f839bf21295f7fe8c01ed4b2735f7c70600a2192ec09bf5d3bb4d2ca3d44799beb4403b8c64f925bcef1cca43851305b3a90b7f4baa1db0be10f2874eae87c95cd08e3bcfa0aa35c03b31297949dc4e033c7a9fa1b2058722f12ebe3305fcbd49941a736549dc0e6269a46176b327404bc6551b088511936b4f693a647952b4507291d86cdd4d5a9867d33d2f48e473794eb13558cfb66e7f6c0ed6f0ca2291d055fc779ff57ad1261a290ff6283e51ca0a13825e7c6bdba8719f312ead036c9822a9ecd92e8252be3ded7173da02af3337ee2eb1570c56cf3c49e7ea6db7a966e1843992292f99cf71d8e4e888e4c6b7236cadd129fbe30e1c27c47c2126ae545186d1ac83be09777a3bf8d195ad7e7b10dc755c0f79241a3234946a90c60ceddc78b37ffacd2ed50082d8204c204462a28921ff348d709c55dd0d2f9dbe2102622b188987e22cef07b3bc17aa90ff0f90779634da69633a3e287422af860806903c21f660a4927cba3ab5c53a291d1c2cea74fa0cfd530a747a62d9ce940f94bcf89c02c156c09d93252c96a766e4243d79cb8a886e118541bfc003aa47c4637068da1957b9a46ce0700b2e1f01952862376ba01dc80ef4daa1932aa1e1790ddd9c3ce189956e9c5fc110209e02a5be0a625b5136997b6ce8aa3b9d0cdf71936a0ef62f1800a0a469498c52aed87ebd7f24d6d69540b5e2469a1533c1bafe2066c19eac3b20780fca4917116e9e27a0971a42daa54d58b126b522b2026a8eec4a21a71a46f67b4d7aedd041203a2fbe7662d80af4b06a511303870d8bf3d01e65c07daf943c506da0629c208b246eb2df56642c925c3b85bbcd8ae056fd95f26b5c1827fab25e75f426b293cf6211c66905e193543719d6bea385bac6feb0c3c3f4e3bdc3e742a072b09474984a9968097b1b069062b5246fcd62b7a2dd91de7a0df1a26d575d1c8fb2c4fe272e1c67eb1af8beecf745b398b21ac50b8d02978f942142c783409852e09e9e6f0ddf16217067e339f9772ef7642cd35913560a2d674111b8e55f31b4586aad6ee8ef1baee9559b8433202d4ff21fefa92fb36aa67e058040c786f8b2d3db08679875bc1b527ac93e6c5db39b5e2f7bb11d1b25db0e1481565f2ca26206111ec5ceb5f65c133e108b4525cb7782c40691490e55891519b50fc3303324b28da13468b942722022858c481d4c08a16d16a224e89235cb19ed6ed578970e01455934353d2d09ee57aabb418c87e5e10872793191cc72c9485be2da2aff16126a567be8d6db7f8cb3cdd9dd66511b0189413d4a74a7b96e5b4c0a5f532ddfa57bb1ead6b9a39890639d777446bc33ec7e854098d02497ec5a87de794da40847332f16f2aa3e36a0dd68e34e6e62bbc0b1ab378ecf8ee486d0fe9935735ae4fef6a9207169376c227016a130929bed6986b290dbd201db594dd7a2ffb651ba8e4ee045d0f6d9f63cfcafc01ed43f22656c004893c7d41131b03f78cbf0ff28013dd9c5065c3bf16e459ce291377ce22946bcf4fe3be0f029fe8678669e215d7a96d3065adb3ca61d3ac130d0adcc104e3ee0463f5b83f0bc6dc207e0a41e6b96ac5ced7cec4abbce86b5128256884633fc22ae941f0d74fdfc2f909b76547178f19bb1973cae297d1096e61b579d1c981742aead7b6341c60380c25d2b7eb2a3c25cbab74e85ae4749858731ae6c64a866f3a7c1488a89506517c7f0cc98a68bbc4e2b2defbe0809bebd6c2d326a9ea858606e88eacfbd00d89e531271e3e7d7507c4726e36c383886a12d4b83fd2338f7ba54e6da785099dd0995b4d88ec059993a2c0d286ae50495fbf22fed5701e0db1036c8990427ee7428fd8092ff6a740a734e3ed290bc7181963e7051581bf4d2b493340a638fdbc2e4390b3b277629e07a12d76949cd552f8de44f619462466ec79e1cfdbcaffbdfe25405d18d10367458f32f48b0d393ceebab1b5c010a7a57ed065a73aa565f7d58a91b5560cdff81263e97789a1d3da0d39aa4fa79addc13eb7e850c716d92971952e7065b93269b60fc45e5917a0bddb4117f5a78678c21ac456f103083ee5d5761fc4641d4202c552a79cd15e1e97ed61b6b9d26d018b2cdf15e3bd71c3115d5eda981b3febde401a3ebbe0822151fe9b95a6b97e61e31366b001652930f88cabe2cfab5e842a0e3e0944f5eef68e1f26339ebe135d94c4dd3a8b9508733b58dbcca1100e0d29bbf6a773bcc737015cdc15c2c6223eae4d6eec65500ca10848aae50177e142577a4c17207dd80d1a82432787fc2f203a54dff5ff356b440b942e303ac90e30d9d164de4be527889d07751eab45c3e9631e520b0c26282b0af54626f4be4ef8d376802242e3ffab7b9041b6ed7ebb4ea3a2f509988b04126cdf8c7ad3a4bdd68b1fe12c456b633cd5a40b1623524bd5fea36d6f25036fd78bd1efefc6a17ddef95f6963cc8810b2d84c814119108aea03133a51941713e88a1e57784d7c9c01ebff7523decb30c91af04e09b391f1db8ea3fc3f678a100dae4a46fb2401f32724e721530eed194c7161344fbcebdf997316c478900d9b1731ebe3a63f3eca74f8dfb7dfe6f03592d7451c6e193c9dde0eba154a847495eadc73765308e42245229bfb5c485ac3f3f8e18d853708932d9945cf5d26862d0a34fd380f7d933e34ca957eb52ae9b07893688227ccb79f1d0dfcb1ce74b7aaac382b5eadba11127a5f13d4daf3c213123404d984cd3e9426f97aeca494654e00069c07b28fabe456d0440081433da95ef057b4ae55b2745eae203f0dceff5e6dc2f60ab82dfb82cfa8171a2dad3c032c53aafd3c82b12152eb0a691373a4b5191fa541c334e3c0ab43aa916f55f6d114c329409fd76bf9df0836d38357bfdf85ce8b00352a936444ef64546643934cf5c4c0f0d61fbf4b7c82081c42aaff5be47772042bc6d7380aaba953a66b3f743136f0bc2f7a87c7753dbcaac4fa8a74d89c4039cf5476ca7ba21056d0c661ec8927e298ace7698fb939b52f33b201f19c793112ee10960397d3ad29df071de83c8ba6c6fb94e9c4b396fcdd255e77e2909b1b3f30bb1b795b2962b78d5741ad10bc85a0bb5dbeba6df3a8b871bd96e67c8c1d476e2046440ed82c1beadb05c50f2015ddcb0678f7071810b96ac0d5ed830877ea1e84a441cbf01a9eda2ee2b243631a3f17087cdb91699e88ab13c5f923642b7304d1f17381ac8e94745a3f71369af4328d8512624ac713216210d192793d0f477c011fe7707bdec61fe37048610f2b21ee94dc70fa5e7e3bd1ac460d513ac66db26fec108cd9b4ebf6ce8b289205b851a354e8daea8f0c61e35e51239b8d19023d3f3850c6f06cd4723a9299f13f6f75036b2519e1736c047aed9a0b054bef8fc8f3ae31275234f02e2007cb6145cd9700189bb39c56840409f5fbbd258d0d1e2f24b5835745283564b0cc6d426ba66c1aa04faa86e636d66dfde50c3b76bbfa8c6e750677d8853918486c5fcf39a455404507b1db59928e2e173edc75c4a571563ef1c0ed7240c31fa638da00b6d098f57d72f391a266762a1804524dfaa1818ef441f585960c8934ea145ffbf826f19f56d48925e4dcc0b152bda91f50835a7707eef59f064e11ea2a8dd97797caef612c01ce58630e9b6467daee055d84cf4eb2a37a5655897ed17826f0013172184b7c11cf3948fcd7a9ed541c44651e67eb1d75e978b4ffaef5e39a07116d8437791a78d1b7db3cfb6580a0cf34b98e193238a22c8e380e9f1f0938153cc384fc44f5b666580aa82739668cf6bd03a145f298c0e67f6cf61d2480acc4bdf083bdf694810e996c0b66ac5f431b072d83cbbf50f77fd93657bc29a76f245d8e8748bbf0cd9fd4e6d0ee88a4b8a84b8157d73e93e11a1bafe7a0f0877de928ffbbe8fae28df5f842b92ddf57fa2d415aef81512c74333f682b5e5bee2836065f71790a93a3b554d1665a5c33356a3650928322533d45c24dd78bc6967dd963b0c80565b6feb911cd1ffbaedf7b404e251fbfde9588cab4f0732ea0acccbe7a9a144f1fe7fd42ce2cf437559f6bebdf8b3f5577372a1854b0a3ad63d06d2c431eaaa633cda484d1d06b4dd6a1d9f2e6b9ecbb408caaf19290a605c38395a2953acc1c01e38750b30afbd3baff8136233add78109b36905ef6fcc00f4050627d29b060f5e63accef5d4077adf0948e4ee77a4f9efcaf87e333324990c60cb12920cb516dc78bff61a3d2fda077976ff1e0745fe85b2fd973f64a84976cb1a2224173aaeadc0e5e6354880ded8bc838deee971c2c341c6be51d40c0233bc514b764017f1901e8e650c6d60aa29bb1b7ef37008fd4ca7831e742f7e6d62ab9788806d69cf958653b3f6f17b76c60b2adc202939b8f4cfbaa21d11743245cbb3db77089d87bd3e5b46cd1421469f2aa4eca4b675a98f2b0702e6233ce914207752f2fd01cbb93d921f313714829b8161aeb6004f489fdb0bdf4910c3392198122b65ef108a6a5a45d8c6766807ff6efc1525ab3a0e0592f8aebfe1823690c6a72dcae2476a190d3bd9781fc81e251a49d19065a1fd4a27aa85dd54f913fe1da65f4a3f49bee4c93665e1257ad5a57afbbdc1592836ca507f8014241e76ff0841647932c22ad6a5c3bd58d6220dffea920e1e0a371f01a4a661d1bbed06760187946a4fb7cd512f509d1146b768216c5f837074dbad1dd4e573147fd6d5612fd4865e7aea03f561fc5f456073eb92f67dfd06ddd47bb2dd6ad79bb87b221688622208e60a4b81ed5ef08b9bc7d4cc0e95606a7f486aa459f3fcc39dcbb702c63588d2bea908583fd628925eb7f1937c05f26a4b79d6787299ed1d854ceabefbfa8404bbf72e97b6db0770763f83889d2a43b8a6d0557b948f5e8438a6a0a7d3229101bf364fdcb0d2074953412072d178e0516a58c5d20ea42c9f7ea0f7fb33efc9b2789fdc1a537c8ad91a8a94c86e8a23360ce91d18e2bd7df4ede8e51a13897c81e940391bfd100742496abe059e8b8e1b24ed8b0bfe492d2a6da249b6dfeb35f8b016709ad87948584c0276b1b53c0ce4bb2e6136d913db76867c6e6918fd574a41755e24b86be9a2f2e4a66c58d0bdd28f3533a87978fad71eb0dbc268ee86d486a0ed009ac775d3b92c625686c28091b547f40040b378cc6850c2f0805193898fb20fa5c3adf8f71c039fce8c20e8646c8cba85ad9e332794171486b7e99608ba87f40471e366a212123539b20febdfd93ea4f8ddcfdf2c9ee881906705f1b8beb30a5ec43a33e0caf65b8b142cf21be534cc8b78d23a0ae5e7e03b90d24b066c8391626ebec55883bbc5852a5489022dc95faa36a6a4a70a2a554358e87b33a217adec983bffe7ebe5f5acaf2469f8343e4415504f413b1784db890303c29c52b155b7c525c50cfa428b7af7f77fdb95e53307f2945bbf6f93c869bfc97aec22b26e7c0137ba1816a484516c807fa7bbaee09a0090feec143d7838993004b9742e1e060fbfc853ef41a9a40a1919e7c19c55722d336c73e904b823b65726928fca23e51c13abaed82e17343b33c90a9b4e34955947b9cec48c7452580edf32d3c5b6b8b67f92cd05cd39e9f40a5e293ffbd746649d4167fffda88b95aa2319ef3147e38586ae5a07e6371d85ca9342e7446913728a756e880430b250c089630f9bcec376777f918bf69bad248657a2c17e3a0683bea5c0aa521781a41cbf22660b2ad314c7b5f02ef126740ec26e0a731db325d6c4754ff62662e69e635c01393e45ed1622</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>30天沟通训练</title>
    <link href="https://blog.jzxer.cn/20220727/30dayTraning/"/>
    <id>https://blog.jzxer.cn/20220727/30dayTraning/</id>
    <published>2022-07-27T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<h2 id="3-个沟通理念"><a href="#3-个沟通理念" class="headerlink" title="3 个沟通理念"></a>3 个沟通理念</h2><ol><li>好的沟通是可以降低别人对我们的心里合作门槛</li><li>沟通是一个无限持续的游戏</li><li>每个人终其一生的追求都是“被看见”</li></ol><h2 id="沟通的基础"><a href="#沟通的基础" class="headerlink" title="沟通的基础"></a>沟通的基础</h2><p>沟通的前提会倾听-结构化倾听</p><ol><li><p>结构化倾听铁三角：事情、情绪和对方的期待（练习的时候可以按照这三类记录对方的话语）</p></li><li><p>当对方话语比较少的时候，要学会反向叙述：响应情绪（共情）、确认事实、明确下一步动作。不仅要听懂，还要对方知道我们听懂了</p><ul><li>情绪路标词：总是、老是、每次、经常、永远等</li><li>倾听背后要识人辨音-不同的人不同的应对方式</li></ul></li></ol><h2 id="四类型人"><a href="#四类型人" class="headerlink" title="四类型人"></a>四类型人</h2><ol><li>控制型：老虎，强势、控制</li><li>表现型：孔雀，爱表现、取悦</li><li>谨慎型：猫头鹰，慢热、谨慎、严谨</li><li>温和型：考拉，温和</li></ol><h2 id="倾听后要积极回应"><a href="#倾听后要积极回应" class="headerlink" title="倾听后要积极回应"></a>倾听后要积极回应</h2><ol><li>心态：角色信念感，把自己当作沟通的主持人。也可采用上身法，想象一下如果是脱不花会怎么处理这个场景</li><li>回应态度：先传递肯定，可以是建议的肯定，也可以是对多方态度的肯定，为沟通留下余地<ul><li>您的建议对我们很有帮助</li><li>您这个观点很有用</li><li>没想到您对这件事了解这么深入</li></ul></li><li>应对艰难沟通场景积极沟通方法： - 换口径 - 换时间 - 换角色 - 换场合<br>是不是所有的情况我们都要积极回应？坚定的说是，因为我们对自己有更高的期待。</li></ol><h2 id="沟通的三大通用能力"><a href="#沟通的三大通用能力" class="headerlink" title="沟通的三大通用能力"></a>沟通的三大通用能力</h2><h3 id="开放性"><a href="#开放性" class="headerlink" title="开放性"></a>开放性</h3><ol><li>什么是开放性：扩大共识 ➕ 消除盲区；沟通中是否通过对方获得有效信息</li><li>如何做？-应用乔哈利窗<ul><li>穷尽自己知道的</li><li>盘点自己不知道</li><li>探寻对方知道的</li><li>探寻双方未知的</li></ul></li><li>几个小技巧<ul><li>多说我们少说你</li><li>责任主体落在自己身上</li><li>激发对方开放性：过程中就开始提问，敢于点名、问具体问题</li><li>没说一段话，都问一下对方的意见</li></ul></li><li>万能结尾：有启发、是个思路</li></ol><h3 id="目标感"><a href="#目标感" class="headerlink" title="目标感"></a>目标感</h3><p>对沟通有目标，且对目标有行动方案</p><h3 id="建设性"><a href="#建设性" class="headerlink" title="建设性"></a>建设性</h3><p>把沟通最终落实到行动，而且是最小化可执行的行动</p><p>建设性 &#x3D; 最小化行动 + 可持续行动阶梯 + 每一个节点的即时反馈</p><ol><li>找到最小化行动，就是把沟通导向行动的起点</li><li>把方案拆解成可持续的行动阶梯，并且设定节点，不断反馈和调整</li><li>行动语言：“来，我们抓抓落实”、“请您给我们提个需求”</li></ol><blockquote><p>不要有负面词汇：烦死了、没意思、没劲、讨厌、要不起、过</p></blockquote><h2 id="给人正面力量的沟通"><a href="#给人正面力量的沟通" class="headerlink" title="给人正面力量的沟通"></a>给人正面力量的沟通</h2><h3 id="如何破冰？"><a href="#如何破冰？" class="headerlink" title="如何破冰？"></a>如何破冰？</h3><p>破冰的本质：赢得对方的信任，让对方记住自己</p><h3 id="破冰小技巧"><a href="#破冰小技巧" class="headerlink" title="破冰小技巧"></a>破冰小技巧</h3><p>1、求同：同乡、同校、同好、同伴<br>2、展示对他的关切，就是充分看见对方，企业家的加微信时和对方自拍留照，加邀请对方参加自己举办的画展，都是在充分看见对方</p><h3 id="如何赞美？"><a href="#如何赞美？" class="headerlink" title="如何赞美？"></a>如何赞美？</h3><ol><li>更多用行动，而不是语言<br>嗯度、摸机率（举机率：看场合使用）、记笔记</li><li>赞美公式&#x3D;追光灯 ➕ 轻轻的 ➕ 深深的 ➕ 常常的<br>追光灯：追对方与同级别人的差异点，追对方的行为<br>赞美是展示你的人际包容度，追光灯看见别人的优点<br>赞美安全方向：负责，工匠精神；合作，协同能力</li><li>训练计划<br>对每个服务过你的人表达你的赞美<br>选一天作为赞美日，对遇见的每个人进行赞美<br>好的赞美缘于我们的观察</li><li>如何回应赞美<br>感谢 ➕ 开放性，例如领导赞美，回应谢谢领导，我后续想继续提升这块能力，您要是有时间的话，你可以再给我指导指导</li></ol><h3 id="如何激励？"><a href="#如何激励？" class="headerlink" title="如何激励？"></a>如何激励？</h3><p>激励公式&#x3D;及时赞美 ➕ 行为建模 ➕ 反馈闭环</p><ol><li>及时赞美：你做的真好</li><li>行为建模：请问你是怎么做到的呢</li><li>反馈闭环：你总结的真好，我跟你说说对我的启发</li></ol><h3 id="如何说服？"><a href="#如何说服？" class="headerlink" title="如何说服？"></a>如何说服？</h3><p>1、强准备：围绕说服主题，可以研究别人怎么做、用户的声音（一线的炮火）、最小行动原则等<br>2、说服是一个过程，讲究吹风、慢熬，不能指望一次性说服<br>3、遇到强烈反对的人，要找到他捍卫的旧世界的价值是什么，找到他并把那个价值融入到我们的新方案里，才有机会说服对方</p><h3 id="如何辅导？"><a href="#如何辅导？" class="headerlink" title="如何辅导？"></a>如何辅导？</h3><ol><li>辅导给的是行动方案不要给价值观</li><li>辅导&#x3D;植入目标 ➕ 发现盲区 ➕ 实战演练<ul><li>植入目标：植入对方的目标，例如未来职业发展、岗位能力职级等</li><li>发现盲区：同样的结果，不同人做不好的原因不同，通过交流去发现。当对方做的不好地方，以对方不会为出发点猜测，再之以愚蠢猜测，尽量不要恶意猜测</li><li>实战演练：讲究我做你看，你做我看，你说我听</li></ul></li></ol><h3 id="如何安慰？"><a href="#如何安慰？" class="headerlink" title="如何安慰？"></a>如何安慰？</h3><ol><li>安慰需要同理心</li><li>安慰&#x3D;接纳对方的情绪 ➕ 提供社会性支持</li></ol><h2 id="给人鞭策的沟通"><a href="#给人鞭策的沟通" class="headerlink" title="给人鞭策的沟通"></a>给人鞭策的沟通</h2><h3 id="如何批评？"><a href="#如何批评？" class="headerlink" title="如何批评？"></a>如何批评？</h3><ol><li>批评是针对行为而不是人，不是让对方认识错误，而是让他做出正确的行为</li><li>批评要控制场景：尽量 1V1、小场合，不要大场合</li><li>批评&#x3D;定义问题 ➕ 刷新动作 ➕ 设置反馈 ➕ 完成重启<ul><li>定义问题：问对方发生了什么、他做了什么、需要我做什么等</li><li>刷新动作：把批评化为解决问题的动作</li><li>设置反馈：让对方设置一个反馈时间点</li><li>完成重启：批评是一件让对方难受的事，所以最后一句话让对方来说，让他有掌控感，可以问对方的想法或者接下来的目标</li></ul></li></ol><h3 id="如何提意见？"><a href="#如何提意见？" class="headerlink" title="如何提意见？"></a>如何提意见？</h3><ol><li>提意见不要随便用，每一次提意见都是希望和双方建立更深的关系</li><li>提意见&#x3D;事先征求同意 ➕ 定义双方关系 ➕ 给出具体意见<ul><li>事先征求同意：事实是什么？提意见要充分了解这些事情再给出意见；情绪是什么？想清楚提意见时情绪是愤怒还是合作；对方的态度？是想听、推诿还是什么</li><li>定义双方关系：提意见时要把双方定位到盟友关系再提</li><li>给出具体意见：意见要可落地，越具体越好</li></ul></li></ol><h3 id="如何做绩效面谈？"><a href="#如何做绩效面谈？" class="headerlink" title="如何做绩效面谈？"></a>如何做绩效面谈？</h3><ol><li>绩效面谈不仅是总结过去，更是开启未来；绩效面谈重要的是透明化。</li><li>绩效面谈&#x3D;绩效打分 ➕ 公司框架大图 ➕ 个人提升空间</li></ol><h3 id="怎么做好会议主持人？"><a href="#怎么做好会议主持人？" class="headerlink" title="怎么做好会议主持人？"></a>怎么做好会议主持人？</h3><ol><li>会议主持人：会议的控场人，围绕会议目标进行控场，不是自我表现场合</li><li>会议设计：建议看《行为设计学》，场地、时间、布置、规则都可以传递会议相关信号</li><li>会议控场：自我赋能、敢于干预、结束要收尾确定结论或 todo</li></ol><h3 id="怎么进行道歉？"><a href="#怎么进行道歉？" class="headerlink" title="怎么进行道歉？"></a>怎么进行道歉？</h3><ol><li>道歉不是承认我错了，而是承认你是对的</li><li>道歉&#x3D;关闭过去+开启未来。先接受、肯定对方的情绪，再说打算怎么办，把目光放在未来上。最后再上请教、上小礼物，把双方关系再往前推一步</li><li>对解决不了的事情，大事向上请求支援，小事可以打个时间隔断，对方情绪平复后，再走一遍道歉流程</li></ol><h3 id="如何调节矛盾？"><a href="#如何调节矛盾？" class="headerlink" title="如何调节矛盾？"></a>如何调节矛盾？</h3><ol><li>调节矛盾能不掺和就不掺和</li><li>想清楚这个矛盾是你的人际网里的事情还是别人人际网里的事，要确定事情的边界</li><li>调节矛盾&#x3D;看见对方的情绪 ➕ 打破对方矛盾里的认知平衡 ➕ 回到正轨的行动</li></ol><h3 id="怎么求助？"><a href="#怎么求助？" class="headerlink" title="怎么求助？"></a>怎么求助？</h3><ol><li>这是非常重要的技能，富兰克林效应：人往往更愿意帮助自己曾经帮助过的人</li><li>求助&#x3D;别人帮得了 ➕ 自己值得帮</li><li>人生中的救生员：自己的前领导、自己的长辈，不能有直接利益关系的人<br>这一节给我感触最深的不是如何去求助而是如何感恩帮助过你的人！<br>人生遇贵人，更要学会感恩贵人，梳理一份自己的关系网中重要的人，保持联系和时常感恩对方。</li></ol><h3 id="如何拒绝？"><a href="#如何拒绝？" class="headerlink" title="如何拒绝？"></a>如何拒绝？</h3><ol><li>拒绝不要拖，要及时反馈，且给个理由</li><li>拒绝&#x3D;开门见山+移花接木<ul><li>开门见山&#x3D;第一时间+第一人称+一个真实的理由</li><li>移花接木&#x3D;给出替代方案</li></ul></li><li>拒绝的场景也可以用于交换条件</li><li>如果被拒绝，要学会准备次优方案、次次优方案</li></ol><h3 id="如何即兴发言？"><a href="#如何即兴发言？" class="headerlink" title="如何即兴发言？"></a>如何即兴发言？</h3><ol><li>摆正心态：即兴发言我们是捧场的角色，同时要有意识的准备</li><li>即兴发言&#x3D;万能开头 ➕ 谈感受&#x2F;谈行动</li></ol><p>小技巧：</p><ul><li>自我介绍根据不同场合多准备几套</li><li>会议即兴发言一定要讲会上的内容，多关注特殊的细节</li></ul><h3 id="如何闲谈"><a href="#如何闲谈" class="headerlink" title="如何闲谈?"></a>如何闲谈?</h3><ol><li>闲谈不是没目标的瞎扯，他的目标主要在于关系的建立、维护和深化</li><li>闲谈最好用的方式是请教法，保持开放性的交互</li><li>闲谈切不可谈三观，闲谈也要管理好自己的人设，工作中人设是职场女性，雷厉风行，少聊家庭、娱乐类话题，多聊近期见闻、个人规划和改变，如果不能聊那就不参与</li><li>闲谈讲究日常的准备：例如人文科学、新闻、热点话题、书电影音乐等</li></ol><h3 id="如何汇报？"><a href="#如何汇报？" class="headerlink" title="如何汇报？"></a>如何汇报？</h3><ol><li>汇报&#x3D;融目标 ➕ 抢进度 ➕ 提诉求<ul><li>如何融目标：想一下老板的年度汇报如何说这件事、甲方的发布会等，汇报过程目标是听觉锤</li><li>抢进度：准备工作提前做，展示决心</li><li>提诉求：最小化诉求</li></ul></li><li>积极反馈：回应情绪、确认事实、部署老板期许</li><li>刻意练习：用一个本子写上情绪、事实、期许，听懂老板的话，做好回馈</li></ol><h3 id="如何晋升答辩？"><a href="#如何晋升答辩？" class="headerlink" title="如何晋升答辩？"></a>如何晋升答辩？</h3><ol><li>晋升答辩是面向未来，不是竞争，要让领导相信你未来的胜任力</li><li>晋升：肯定现有战场、我的独特打法、我的充足准备</li><li>准备败选方案：是下次还能竞聘的前提</li></ol><h2 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h2><p>拜佛之人，与其拜菩萨，不如观想自己就是菩萨，想一下如果是菩萨在这个环境下会怎么做。所以每当沟通的时候、尤其是沟通遇到不顺利的时候，就想一下那些沟通高手是怎么沟通的，想一下如果是脱不花她会怎么做，并想象我们是她。这会是一个很奇妙的体验，沟通是一个无限游戏，沟通不止步，所以永远不要担心沟通会失败！</p>]]></content>
    
    
    <summary type="html">30天沟通训练营学习笔记</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="沟通技巧" scheme="https://blog.jzxer.cn/tags/%E6%B2%9F%E9%80%9A%E6%8A%80%E5%B7%A7/"/>
    
    <category term="倾听" scheme="https://blog.jzxer.cn/tags/%E5%80%BE%E5%90%AC/"/>
    
    <category term="行为设计学" scheme="https://blog.jzxer.cn/tags/%E8%A1%8C%E4%B8%BA%E8%AE%BE%E8%AE%A1%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>7天口才训练笔记</title>
    <link href="https://blog.jzxer.cn/20220727/7Day/"/>
    <id>https://blog.jzxer.cn/20220727/7Day/</id>
    <published>2022-07-27T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-一个核心主题，让别人知道你的想法"><a href="#1-一个核心主题，让别人知道你的想法" class="headerlink" title="1. 一个核心主题，让别人知道你的想法"></a>1. 一个核心主题，让别人知道你的想法</h2><ol><li>表达必须要有主题，和你说了多少没有关系，需要在一开始就说明这个主题</li><li>一针见血，开门见山</li><li>表达低效是因为信息的无序堆叠</li></ol><h2 id="2-三种框架，快速整理表达思路"><a href="#2-三种框架，快速整理表达思路" class="headerlink" title="2. 三种框架，快速整理表达思路"></a>2. 三种框架，快速整理表达思路</h2><ol><li>时间轴结构式<ul><li>试用场景：适用于你处于一个压力的环境，思路没有打开</li><li>说明：以时间顺序来讲述内容，也可以通过映射事情的发展顺序来讲述：首先<del>然后</del>最后</li><li>举例<ul><li>案例 1：当客户向你咨询公司情况？你可以通过公司时间线上的大事记来描述，这样会显得结构比较清晰</li></ul></li></ul></li><li>解决问题结构<ul><li>说明：问题 - 原因 - 解决方案（what-why-how）</li><li>案例<ul><li>当领导问你，这个月的绩效为什么比上个月降低了 5%？我通过分析问题，找出几个问题的原因，并列举出来，1 因为竞争对手新产品的推出，2 因为部门新提出战略的失误，最后我给出的解决方案是，督促创新部门给出新的产品营销方案，并调整新的战略去处理</li></ul></li></ul></li><li>FAB 结构<ul><li>说明：属性 - 优势 - 利益</li><li>举例<ul><li>牙刷它的卖点属性是它独特的三刷头设计，优势在它能在刷牙的时候同时护理牙齿的三个面，利益是它能够更全面的呵护牙齿的健康</li><li>自我介绍：你的基本情况是属性，你的特长是你的优势，你能提供的帮助对于对方来说是利益</li></ul></li></ul></li><li>两种表达素材，让语言更有说服力<br>素材一：数据<ul><li>说明：比起抽象的形容词，具体的数字更有说服力 - 描述两大原则 - 数据要筛选：留下最有力和有用的关键数据 - 过去一年里，耗用了 200 个小时，10 天加班到 11 点，终于让用户量增长到 1000 万 - 数据要解释：数据的意义是人赋予的，可以通过数据对比类比和换算等方式使数据给人带来的冲击力更大 - 案例对比 - 案例一 - 这款产品的用户量很多 - 这款产品现有用户量 300 万，并且每年以 5-8%的速度递增 - 案例二 - 乔布斯说：苹果手机今年的年销量是 400 万部，换个方式说就是，在今年里苹果手机平均每天卖出了一万多部<br>素材二：故事</li><li>说明：故事的三个基本要素，冲突，行动，结局<ul><li>案例 - 产业目前已经产能过剩，就导致了大量资源的堆积，如果这样下去，势必浪费大量维护成本，一个企业的长期稳定发展，与企业的创新能力息息相关，所以我建议开发全新高端产品，以优惠的附赠方式绑定出售。结果势必会引起市场的波澜，并且为企业的高端市场打开门路</li></ul></li></ul></li><li>如何在短时间内，表达自己想表达的内容<ul><li>说明：汇报进度-汇报成果-汇报困难</li><li>汇报进度：在对方知道整体工作量的情况下，说明当前处于多少完成任务的状态下</li><li>汇报成果：告诉对方攻克的内容已经达到什么样的结果</li><li>汇报困难：汇报自己碰到的问题，并请求对方目前自己所需要的帮助，可以使用解决问题结构（WWH）去处理。（公式：问题 - 原因 - 解决问题的方案 - 目前方案的利弊关系）</li></ul></li><li>遭遇突然的提问，如何回答才能滴水不漏<br>技巧：5s 停顿后再回答，并在这 5s 内为以下两件事整理思绪<ul><li>认可对方的提问</li><li>认可提问者：称赞或者感谢对方 - 例子 1：谢谢你提出这个问题，我想其他许多人也有相同的疑问… - 例子 2：正如你提到的… - 例子 3：看的出 XX 问题让你不太满意（在明确感受到对方的情绪波动时提出） - 认可事实：澄清，进一步挖掘确认对方的问题，然后通过高效表达公式来回答（定主题—搭架子—填素材） - 例子 1：我不确定是不是明白了你的问题，你是说… - 例子 2：你能不能举个例子，具体说一下问题呢？ - 认可感受：让对方感觉自己对当前问题的很认可，共情感表达 - 澄清对方的问题 - 可以用 FAB 销售结构或其他结构去表达自己的观点<br>好处 - 对方感受到尊重，便于把氛围营造成对话而不是对抗 - 搞清楚提问的人想知道什么，确保双方在讨论同一件事情 - 为自己赢得整理思路的时间，提升回答的质量</li></ul></li></ol>]]></content>
    
    
    <summary type="html">7天沟通训练营学习笔记</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="沟通技巧" scheme="https://blog.jzxer.cn/tags/%E6%B2%9F%E9%80%9A%E6%8A%80%E5%B7%A7/"/>
    
    <category term="FAB结构" scheme="https://blog.jzxer.cn/tags/FAB%E7%BB%93%E6%9E%84/"/>
    
    <category term="WWH结构" scheme="https://blog.jzxer.cn/tags/WWH%E7%BB%93%E6%9E%84/"/>
    
  </entry>
  
  <entry>
    <title>什么是恐慌症?</title>
    <link href="https://blog.jzxer.cn/20220727/konghuanzheng/"/>
    <id>https://blog.jzxer.cn/20220727/konghuanzheng/</id>
    <published>2022-07-27T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<p>人们把他们的恐慌症描述为</p><ul><li>身体上的恶心，昏厥，麻木或刺痛，昏厥，心跳，颤抖，突然出汗，胸痛。</li><li>感觉自己好像要疯了，或者死于心脏病发作、中风或窒息。</li><li>感觉脱离现实。</li><li>感觉自己的身体和情绪都失去了控制。</li></ul><p>恐慌发作是很严重的，然而，一次单独的恐慌发作并不会杀死你，尽管你感觉会。</p><h2 id="调整呼吸法"><a href="#调整呼吸法" class="headerlink" title="调整呼吸法"></a>调整呼吸法</h2><ol><li>用你的鼻子，慢慢地深呼吸。</li><li>然后用嘴呼气。它需要几轮呼吸来减缓你的吸气和呼气循环-这是完全正常的。</li><li>如果这样做是安全的，在下一次吸气时闭上眼睛。</li><li>重复这 5 次(在整个练习过程中闭上眼睛-如果合适的话)。</li><li>再一次，用鼻子缓慢地深吸一口气，但这次要持续 7 秒。</li><li>然后屏住呼吸 3 秒钟。</li><li>和之前一样，用嘴呼气，但这次呼气要持续 7 秒。</li><li>重复这个缓慢的吸气，屏气，呼气的过程进行 10 个循环，或者直到你开始感觉好一些。</li></ol>]]></content>
    
    
    <summary type="html">关于恐慌症的一些观点</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="恐慌症" scheme="https://blog.jzxer.cn/tags/%E6%81%90%E6%85%8C%E7%97%87/"/>
    
  </entry>
  
  <entry>
    <title>一个呆呆的女孩</title>
    <link href="https://blog.jzxer.cn/20220726/datingwithnn/"/>
    <id>https://blog.jzxer.cn/20220726/datingwithnn/</id>
    <published>2022-07-26T02:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="943c20520df3953be6a750d11a8fc61ff582452f27841e8fbd8bb46097557325">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c8752048c47b3f5a4ff215fdda0c7d476fb78fe1253cc2c8223690f4d8293fbcb8c3ddf659fcfcc7000ddc436d85fcee03225da0e175cf5bb7014e75de68845f0e08525b128b19d35a85ce30e39f7df93f214ed46c40de7fcb8a883ae700cfa6b0a4705cb2863074cbf2ad5f2c01cc7ac7c9b6d789c0325aa5f1fddd50e5d86d6fb29ecb2ab693415291d318e1a985abd9b1463625fcebc179d3a4b4aa5b65196d60f3bba12b678ffaa5a08744fbf0c473518d444a94fdf22cc12478f65ce2feb1560c29b5ea6035aed6ebe2d81f5c8d4df82ad6f166bbdf7dd07f3d3f996f5d1811337bf1ec4dd83a99871336d636c652aebae998fe4755a9b1c5d2da38f08d74d8e2ea1c42a4e9ee0ceb703f921c8d2dc390837d1ee01dced6d3fb2304408431b067f1f50c14e9e8451f99f50b4f237efdd87570206259ee8a8ba8301de6af723f98b98c868e1c7400a10a8bd3dad4de7b690db1d51c352fd87e2c3a0d960b286cf85f84477e135dfd61b1bfb9c43f24f91f0d172da9fe393cf51e76d0952690ae7f72ea378bf921c12590d5dcbba1169cd4c7495c5b9e6725ada04a266095958df74ebf857c03db7c473010c254b0b766a95df4d66bf9ba7b66a8d7f023feb8c50c6117f8694315dd5928a1601db75a4a840d8fd9324ca65967c7f43ae546fd9a595d1d43bdb2bb96d5b3e40a1f3fc3e8b68f75e757f564ec60c1c3898ac02f60608b5217a9ae3b6a1f59d1bc683359cb0705fc1e876e06e78a7d92d0af2f04278592cbd9d9d4b4f85e0c5fe92fba359299c6c9687ac101951bb00429daf6d5b08d526050991baca83af042261d7a94f148e4e272458df64988def8eda87ff6c9ed89b713a2d30e84c8494baac34b2d8ff189016c50875628ef6de9ecc4d622504e89bede7c5f6f4757a1cd62cf9782f62e2c397dd84ce681d634f901848dd2ccab8e345bf12dc92cec30786ec52896fd7c6ccb60f50b7d67c12e24111516a261cae0eb1ee4b40874d419ffa356ce90543ff0240c471b9a1b12249cdb4231f733ba36900c7949fbfd53c248b4f08acaf6fd8017b9a769b169a7871f1a0b893fb7fc2216c4dfcc30219e209b1f405923c3dfccce18c93c4a04e1eefeed66767d294c78cfa37f487cf3cd6d0fa64507be6a477509a00d7deb2f9afb5ddc9d92046050a09848f4bbb1b0b511504f890dbd8d1a3ae0fb686ebed4fa302220a421aecfb4082c64d8d80e8394232f90dc36808d1275dad5848c9ebf32509676008932ea66bccd784f8ef1be43d9f79f46a464f7bc44da7222d7ba6d88a7e2f676945276f0bcf63dc1b3c644daaa048e4d5d368760ef0684bd236815d47d30a573c5093a736705827b9ddfcb72e8e74b8f7b2bc4e288edf45c3202d19bbe85496c861e2d77923874cb46525590db1dbc1335c063b7d3bb61dcfa456b62247f4612ade521b6e49a416afef96b113158d5084ae48d09b4547cd890c5809a0de5db23dc2ba03a4e5df88f5a9a497185c2bea4064a59bca192bfdf0c5780aa798a55abe76eca56765ad1d847c15d1fdb98bfc09f592d9163096a7f6c9f9b158dd05217c80448c53f448909c84ada680e6a13e6019dd2a867d3e32f85ad724e1a5fc3a752bf0038ad9bcebcf36e7a666a609a4b3f9326957a00d79627344c320df8900aa67c399c82c80c437e9d0db3ef9422320439a17cdbaf6308e928359d4b3284f10f008c4d391d50188d12ac40bdfc6d43d4df647b19a9362e443a6f61cccfc6fef563f18debab0cec36378767b98bd9cbfa2cc36209527262732203a285008311392002b45fcd6b438f004aa76a8f72179e30a580bf16cf5d69369a06be3ebd644764601899584a367ed157fa45154f2a48b184a3c4546192a89d22373432ea2efdbc1ff10c4b6e19651a05937f48c1de1b414587164c175f3321c2f88b8be51da53d9bdeee81d537a27c604a14466b7a523a71351a91c65494b7b5e3d993117ef9e59fa230acef163c158fec1d6ae8df97774a74033a0566bc8109bb97894f3c571c5462ae5682cfd43c6ad4ecd65d2144a61d89caad1088f09790e3978c4a32bf8cc5e6504bdc6eb1dd6be5cdf2a651d0f41aa6e041a7ac28e660874be843d106752acd188a166ab3371687f4085057c73815adeffd316322333c43f92b335de3b3d5d9a33099c63cd2168559e2d7dce68cdbaa90f439c193dced6f9233bc391849c91e0b23096c4ea8286b4c6d4d3011cf75dc8b545b25727137a2c55e53ca7f27ef89c759d3d0a3286c4904f93bb1f1f8602b2a710b36636215921db2724a9f1e8b657e0834f53b3e720fa05e330f6ec618a05b617940de60ff70d0d54c87450e1a67491464dc2b5611cd3e2a734bcf86ea0e26b3132e8a1be813e1c97527b2e0381bbe1009a847ba95b013b75085f6483bae6d72bff0a5e627ab77c0051181bc89e5495f0d36fa35d5fcc722624a768614343e326fb91a593cde2e8ba7e477f19a76a9b33a67a5ea20b6a514fbf46845fb3a046f836e83a98bc94f66322cdce76987</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>蜗牛图书馆活动的意外邂逅</title>
    <link href="https://blog.jzxer.cn/20220726/datingwithxu/"/>
    <id>https://blog.jzxer.cn/20220726/datingwithxu/</id>
    <published>2022-07-26T02:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="a6da70fbcd926a7fbb004e6dd74a5588ee5d5ae0b563ce18808fea9604e355bf">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c875200b1c7628fc9b12cf3f72d505e802493436b9edb1cfe05fc92fe68d8f32d58cba051d03de2b5d754d40c9f73234a6c36ef4287e03ea502402023d41b925f0a7bb5dff1484f31e73a0d354538245ba4cee2a06b3f161799a46d8f0d6926e434d052dbc364199b1a652231f04712b0b16a594b0587f14e7ec9a70ff6c735cf7ab8cb8e287b11c10bcbe8b0fb061a096e6d2dcc067612a42256a57f4ce3e0543efab7195c5753e8e5f7216a8beb86c2f8789f389fcc465ca287128c5ef44f25e731c77e85f56eeb76358e7e9f4c5f2efd203d412a7b82aca0478f35e24e06fc3931c66ff4b25c93243d657bea028d3e4fd0fb373e10ac876514c730b7c47d23cda78f52b20c30e29d5a71e7b467960118e8f9107ec98d2ef81e126bc04e904fc0385de1a550f4e8c216e185432bb2661136b16db68d556ecb374d41aed33bc0db352379306e1e6768fb7bb84a748028fe00d66f30f9a7d711ed9244658fb0168fc981513cda2c7cc0dd4d48d1e26df54e092f347ed5a501e08e72c637b1f85cea9895dd816a8b6e9461bdca304eb205e668f1799cc05e8eb81d48d176b0258978f9799e4ed12d9d970806a107159eb2e5b6a8b9e12826f466036d96272935d6a76ff699e98a6dec506af726a126bd141fac492840142452dcced5a0a4f66cf3c28f61e88c1a0891f3b080bbe00cdce548e53b2b0aeca4a14bfe9653af12b97ec451a510b08d4a3a50f563d599cd0752afbd01527b9da161acb00248a4d687a999f43d1981427502af1f2a88dbe6bb3b45d8c</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>意料之外的游轮邂逅</title>
    <link href="https://blog.jzxer.cn/20220624/badmoment/"/>
    <id>https://blog.jzxer.cn/20220624/badmoment/</id>
    <published>2022-06-24T07:44:19.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="ad452bc906ff39b34dcf973302c86db3690585236fb05e9415d6feb9d04e1e42">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c87520655c3154edb8c4289372543b1e6af697515f6959f83a82d38a173cbf338dd47b6fa2beb65e4de9eda99a58c87c9aabe8eee7dcc967f68ef2d36bcdcd66c9cbd3ad879fb49761f091a3b604ae47b33408a64c9a5f5d280370b5dda1629cf68c69d840462c6b7025c7dc729213d858f995eea969fc42c9823ee7d23d9b8671ac5adb80bb3859cf53af5ac38ff883e37f9d319c7596ec76ff54afc7ec6202f65341e17b8b57c5de5eb535b43f209a5714be43398fdeb481c3c9b9d1d78613d553ffa33585a1178157da7ba23b9ff91f32da9e753f27f409d305a99ba39c4544692ed8ebb55cc25dc904055f10796193d46bc1d0feed43ff4a5edceaccacc259198708159d26ba18685fa6a843799ee537a3bffd348e08087001934aa0b08578179fc39a9841165e455b6bc63be98dcbdd8187a6e5f8e12f71cbd763000374b043b0a586ddd2e0e715dce6f8ee41b36f1776f00dcc0f05140126c88537eb3b6d58fa12f271df8d1cc8b507ccbccee90cdc8c2f83a2a631cb1eb1f372b8eadab9800f17ab0d434d7ae91f6eec5eea19135faea9a2541bdcb432c179b06ccf40f7407926ac9fc4c9cb77df376f21398c88279bc16fc3a89a76161d37a64e674a2b1b97413e324ec294f32c02ada2daed70ecea3459bf86c9ae3a7257c322504886297cb6df18ffdb061ba8eae0af89b196c217f1dae7f709d52076ab021262a97b47e79db235dfc4d0577fb054a959cac1b0cd6329d55c5827ec00dea4b03a86b55e2be188ee12f8b53fe03a05e3bb31514dc7cc55afd98415bffb147c9e7c8e5e3ee67644e9bf01187a2bf3f03527527fdfdaa22d26fb077401121b68a08277da5b15987457017de1ab1ac308c5a864159a3a871c78609b1a2b8855dd673ca3c22bca447635f0eccad290e500d387d12c07da57038e2ae0648544b2519ba19ed59edf1b210242629a42e7f2be286573725e9d4e60a16c9daf66374063741f5a7cc1833d67e2ba367c8c7468c812a738b47b7d5db431f8d7f9ea068c0fe9e506163a4b07d47ac82e821c3d069ae1fb3e3fb00d1c5e71b43594d028af567cc96cb363cb0d7cba2491ce52e0692dc938939579d56040361d87f6c6880fb7db85a1f71b1f83121b5e50e440f57d790b4a41c3990f2e17d12522988d10b40703e51b109eee95cce6052f705a28c46c45597f6d7b03440679ac64277f597301b992fc7b4f7e1761b8c4943da9b1a1c6ffa634f18ac963fe4c5fcb6625b95a12de6eb0b8f7ba406343c4ba9390f378d89655b01315275f957a240d3d642b06432fbf6472b6ac5f97e171571756d57a47439b87c313c6c2ab616b4594fa2e24b9a67b9b2ae41a6dbcda8f551d89c14d6eea210a16a6affabfc3d113a04aaecede2456eb33e64957713f98d10d079a4f5a9a9f530933479f3d57bc0322358846f581f6225121687b60b1984be1d1402c76bff4e3badad5396ece5a35afa19e429a1cb0179c36a5febddf2a4933247f501ea86fbdcd8c342668e594dd0f4710aa00e8ef047dfce90774f8119efe269cb91824c990779b1ea6e6cd364321b3a5a29a94d47d7006291412c7a5aaed81587036ca2969e4c1b05525e01a0cbb4f3d66d04c4270d081b2f7db8e439571748df2a4a9373245b1d5b6660aaf017a4853af2afcb748369b34c97cc48c816a65a6f849b324e70612f69b97bd76833eac66dd7ea7451569699f8214e38b92da128d80ccc66c5276148ba720a9f21832a48d0f2fafbcfb9e92964b5030186a08360942a2cfa5c1b9af70bbe88a60b0307830038d4134a8d61235ce1a5384ad55014930a5fb1e4ad60c497a4e472f03c7e3ef8c8f372e35ce874630dcf8df337fee82123c8cfc5d921ed2876556225f4084ebe5627d938cf348583c119553e44ca7bc56fe4b51918210464665d59f6223b26cbf0cefa0894d6d24dd7fcd6e3d66e7663b13619aeb896478886145b7c6755591bf28a6cc75f70268e89c2f4c792dba4cd98c4ce2547369c71e98da2c11f3a7f871cf0a8a013d6c7972d9fc8b667fb25e01bb8004865a2f6460f0ad1f084ffe8b9e51dbdac9c11c315711b3036d55a767673433fe6676431ea6af2085eb04d02a13b093badf1bc8241d6782f502e70151a79aba370ef0c54f4490c1b1c129f9bfb338a5f5af54633ea65008231c679d18f25b74c6064de1be4c5b50d021e10b2ad2d45695f76e3991d99cf1641c7e83a6a9564df678a356882919ddd03e6c405ffc2976b07fdaa0eb906350395abf2008099d33fc62a6b9854cd043573093a3cd7935c111d2c60cbe4abe843ac07811c13620638eda9fa6cbc3182b9e837ec275dcce33771238632b6a7bf37be3b1d1dc7a0a17c619ec377a5b14876b0f9f3e8d3bc37d16201a02620c038ba71333312e1ca7746cbba8e761e435c3bba4e0f69617b4c003bc1a2a87c4357c8f2ad8ca2c57c144fc5344788a19e6a3b905ee059c1e23e2a7e278cafebf1200ad0206ba77f40d49b966f8943c4b0cb0e739f88ff57f23927591d7135f9de297627ca1ce4b780acacd27c1130dc3f144e8022fa784f8cf24401c4fd435d4b6470cf6119d00d4fd3ab8e4311cf409952d5f68a1429435d4289ded66201102d8a8fb002c77bcf74994bd072c906d66447ef3810223eec969c01dbb7f95c8e054e1985abccc2f5edf9ff18b51a4e55a037050a1b6daee87bb8284684903784535fb1b268d4dc2e77b6815129e0f83617c85646dc15dff9c780e7cf7bd3c58294c0326c1b40a26fd9b0bb4df40735b1b1be241637597133d5936a29282f54a23fee76f9ba6ad603c86597f3a8dbb82998abf0ba8c7c549172a1d55104ce646fd4b439a595a6448f48b9be40a9cfec8581c6da7bd12a528d9a80ceff14b9ad175e62167f07bbaebcd5d5fbd2b014c64d56dd994e9c1ac6f32be915008c4e12df8c47e5ac41c4fe7e4d7cd8803dc14c7330c5287ecd42f13cfae1983ab9697d834246e77fb7757ac12275b31c2125480727cfb7c1a43ab34a019b28736f4adf67e2bc48771ad8f7b3311fe6247fff295dbefde63d383074173e5f2dd4855c492f90189629d43cd66df9334c83a8bd0844a247cbf4f8e1e98e2c61f5a395ad763e37867ccf5791731bef00a8d69923a3cd1ff671961227a433cbf2fc22b9bec8b31e4f6ccf8443e9220b5c5218e8730e5bc8093aeb7eca70c6a545a719ad03029059bb877803740f0ab726c462c2794e642e7a7dae846922c52228dd4d54405d76b9db26f3d49589b26ada6c774ece3657c649678bed0965ba57103ac411aafb791d546c67f944062f86cf5cc1d34f4be616396fd1c4af637827f123c4106df426100f1c686f3fe908b239daecc01c940edc9fa2510db05d380afad6bba047c0ba7ddd4dd09b681f00b91d3896d6cffad6834d0aec143a95f0d599ba348d9b3a78956cf2a81f3f0415e70e9c412daa0e00227dc032d98221492247b9a3b0ca5a0aaf72dff3595d91ff24d47313ea5039e6504c28d38a3f9c6351ff5b65c7d4e90031327577701893b0314c8d59a950e54066f43e84c51f43eb8c5c311fa17b3db242db8a246d1a831f4098a31a9d936d18adf3494e6228618aefdcbbf82da14f0d4a76f388d2e4be0b9b6cde6d172ff6a66b74df9a67a14e48ecf22942595d42ee09d1340bf8063584618d507fbe3102f4c48802fb4dd1078b9f081e382a13888053b9adc259726193cfc45fb17f198d27ba5c6c5533bc9e64be525cd1689269d223fd380d7a922619985dce9b1416d773f237767a81f2114f0aa0d63c82d606f6c496d5d8b12ae9b9c6a5a18b6f6042b8a2508806b2b6c2c4e67712c5b42024eff37f563225c48da0b654b27cba79307c74bbc008183cf84a7e2232f33621b6db710c1452622546b53d871face0e3feb725bcaf3f122020246c477e910ad1265f1a420e12698468b41b11fa4ef9cd0d4f495dddba4ba856f3df368abfa5e16048cd09708c336f44279af5241456bdfa5b20e3b372a0f1351284d2bb0e5d8f87774003e999f820033e3dbaa1bc514d77df602bcf0b840454788ce546118eef39ef1c18f8c5834fa9171a7d18ebf743f16861aaabfb7c2731f4881ac682b9c76dc37e3fff174aa6267b8310df8f22de31463d847593d151712463a08f0183bb791d6aa4b805c48d4574fe51737298f722afea1e007b4d098916178f0b832ab5c7b66d06492a8176623d8959daa448ffef97489b439f3ffd6c8f92777e1a84d4b60b36f9f85e6976742d4da5ae68f306c6995251337283402b5b45b80339aca8034a2aed68c10feceda29db152885c2328e40c592103b94966a450158dc10e3da8b9602473d8ff051f2d5533276e977770e21468ed91b4201bfd730f5b9040d176a3c1a6010c8d62abf8089b7c070b0f27044723cde0471b0771c85c2ab1b4ffb429acbf41ae0fbd5c180fcee170a191aa7b62b6fe21504fc321d76798474c6b39bbca41e9199708b6cea4fd0d6ad5f95ba40910dcdc3365f6228c6561aba368c3610fa59e05348f03c03345f0739899923100e27c8644faf715ecebd30e465fb6abfc120a5823204109470bc3c97f6112bf8e6596e5a53357b558f076bb120ea4b8080e51708205f6f1b7feb791213c835d535200bf6b620fd4c80caa24759874def88319d17a9427478e4dbab098345ac8471caafa4c61932e51af5d73eeb27ec55870c18282fdd4c88b7a5da58b2d23ac6886dc7496ccdd794a693c4852f7e31536e13db562fadef3021697da39f662a252e237b7ca4ae144b39fdaa0841c09fa28c7ef27b475698af6beeb0e25ba633d03576aeecaa1794ce12283b27426a4474b839c40b42d4657c3ee23d27eb47aecf7e8bdac6a88d7674945dffb6610f8c3532ad3aba7c45214d9be49fde5dc33ea495da8d99ee32b69cd66ed92adee973d892df5e80698bdc90e8c0b4dd225b5d0170cd75fed0b268ebc3087d09a048e86fb2400d4c5b403a180629d587ca6b550b7a62e5d367e61826ba06a55ba973b71e1f43c329abb21720954fa85dcce05f91b9fd9a492d4ed4e4aa9431652f33ea8305f2b442b47b10e3b21bc134a340a544a63e1d442cc395a8e5c7a0fbb5139eadd11fd3eaaf7df21aea77f7092e7144e86ec3bfbc8754c4917c499d383bb34bbd19971a9331aa16b00f1b8705008d0aab43075043bcc223d18d01b5d8f1f2a0e1190c0434db0a0d6605fd0b01d6d963b864e8afa9a6ae5f7cfdaa3a6320c2e3a1c0ff5d2e70a9a9eae885e968fa2e9506f36ce7a89dbd8cbe9506be16ff29a317562e1a1164b7d222a6b6fcca63f755be13225211d4acea539e4154338f2f570272d0181e3ff2da38f8d9faa1898189fb96710ce3742d7f480d178d51c096f12433ad86738730bbc41a9ea7738b39c8db803c99035f5d16a4b58e5a71979ef715a6b64739d1c041286eb471484df03c75940f340514aae7492653c012467ec8c9ed107abde64997c6eef41dbabfeb25ba66af8493d9aa1c30800cd61af3e04579969ad5d2ffed791b8684c4da7f2344daf4f32ebda28e74f17b7d38cdd884953642e2c47949bd864e274c5cd0a991958e5b4d53728ed129466cc97142f50f6a0ce4b6d6ba3855c95b64d1abb4d947e42d4664045553ec7c7dfcb9f307fd29871a2fd5e7201a7be71931fdbfe23f2127a48b0fdf01d5fb0ef9a3d4659f8c1782da8706f23a1850469736ccdd084d891c268e504d81075ed3bd74eb90edf82f555f58662f1c067c9f9a7a6558933bd8ad2b1d8a4915a16cfb05e30eeab888d007545caf8c64db4f40aa27903636e1f244c214f7082c2d1adec55938b6b89e99343dcc215103db6d90df9e429b04ad4a65579f2dd950f110f4d860d99cbad2cf168eb5ec3a605a9c151f98651f48e44a82e481b13165c84f9a550caa2cde9543b1c166ea3642ad37aa5976783b9b42186f737c4266214d17a5cdc30b64c22a83749790427b88d30c39a8a8dc59f3a43e2a1ae544ec525c971f993d48261ac7335dddee7bf9277b7d6eb6d2e8ca6da12cc84bbce0422146fa27286bf8a57251b7b93a48ce7a7d1701e4298e11e3c150a17c69a9d4a4161ea77fdf308800fd1deb95458dcea3ce95c40199f6b20bf7f9aa2092f708fb410071f21c91a1b2e318d71a1c986b15ad72105c8870dd0d25172d3dfcf8d1657ee9058a1c3f6b60b507bca7d3a9380152eaadcf4ba8dd3016cb9b8116c4e91a237c590020ff2a803bb6663c694049a6bb73823fee775f709017dcacfe2a96534268b13642e1a98d62128e77db9891e4a1595673681821a7f2d6fe90f309f230557c45d5496c8000c226a3ace54af266012f22facbeda2939c4d2d5aeafb63e972378d52a3f2203364ca25a2fb11c319ccf90dd7edb3ed8a0926a33ca7d75ba2bae012cb4e529259c112c95d33c96a3930b8d0e6f45f1264774a3de98a1a59cfea53bab51e0a9b56878259c811da95e88360e482595c85263f9e294b7d6d92514c84d4032645fb7baaa80a5aaa1b3359296b25babee44a62f895f6964e87fa7e6db386e4ed8ca5cd4db7d999f1cd29d71363229c47672b5c6bc29434c2a0bdaf059786c21dc0a8e4c6b6c852d55c0b88537e453638c32b84939404b3cfaf738c235d1b9a1d566662bdfb8cef464969389989b19373c6249a43dfbd9cc7407b422d96a875c1fbade5053a48d52eb39f9d0374ff394e9f48b91804a73b955a560f91c88665a483fbee8641b51343d61b446b4716d9cbf59a6df3daa31ad9681fc61168b1f1f9cc3a8ecb1e4fc787050fa717c6035b695cc6fcf46ce1b9e3819cc87098fa850c19f0452afd154e3cfb43db98c7880ad5fe046720a79d6accd0752a16705bbbf23914d81425950e02324896f5d8d319f9f138a8a5fae06c59b769c7d213c43eadfcf489cb1aa905bd91a6224805f5ba0ff460297dddd5e9c1d8b0d518014309b2d2421ab2f006da2a2dafa32fd08c3e17a96e8ce149ec68b998c05542093d80b5114b6ce2918d3676bfb49576a7fa3a0cfaef2838c7483f83f612a59fa74f8b60e036cb52f1ad899b5899d6f18a20d142a019c22b47ab2fa7c255b1823e8634a73ae3e146e70530006fc4166eb0897bfc4c313dc32fec9fba19f815a8776c5d6455475cd8bc50b1e37a35290c2f2440294d9d20997feef4513deefdc7db21e078fbb8c6cfeebc926218b9d6cdddc2214a69d375d5cbc726c8485feda7094ecf1f96faefc7a6e1e5a1446e1f62885834269c1f89188e8de5a99e5ae43e4f375f3fd7eb2b4582a3e66c70dfea30be5d81ff7a6320edc9590bad438698bec6c8b2f0d2a0edfceab4dc29c780a401b8108eab01b7ee7dede6ee10abe70ab0231684691213cd79b873b26240bb14606df9d67cbb4819265cbb7902201dbe632702cc5d49d5dfb5d9da718858177f264b5fa322234bad1f5dc3e4c5d8f1f9943b1c8172c77dfed0a519677cf93e1e5ed981c4c042e2d0aeb9356bd29f9c9bdb156571f01f8b002ee5c700fa7f18ca38b99251373f7f54fe6f24107ab1ba3ec4f2de73f9a0d6714034fdb2dae21b0418ee9bf09c1c78feb5dafbf0bb03e81708980bd58819838afc41445e96c0e38a469841d044ce7c9b8c495bcf69433266874d8ea6557c5808f8da6932ba25e69a2caea8da0839837c6d65500bd078fab24d21bd58953ae6b42d7a71be2e0596ff633f6cb075564ab7cf369967224474fff60c9043dfb15d1513f11f691255c16774853317f8d9f3cad7237ecee5834896b38fe4656f2bddd71cca06dda607061d2a153e89d18d7f8b713d8bc034e91896b8ad5975e3909b753edc71f5d7d103974def95d2b160827ef287136592af48f92676a910f710b33c426fe15a3569744f5cbc1f2582edc3c2e8db6714ec20dc2bf9400a8655cb57eb42cf2e4e19f2fb3f02fba0c074e6b5d4cdb35a699e5b69ef424f560b44c3e7e1e75ac791129afc40446d43536fa515fcd330b1f93bca1b9b8c76faa88169971b7b030aa3f5e3e8cfbd6c41f798d5d9a8fb02165aa45d082099f4c452d07f2a521202f82ec466da13981f72c02c7ec2cf1970d76eecebd2623bdf7bb9ad4c57c6764fb617abbfd2239803bf6a4966abe5be3a6c0d0d0ebb007569ad4789af8d34be383b1d13359a23f66c463204e472c2e58b4f2ff0b36585c045bf358871fb0d8cff9065058e2e407bf754b78cc584c9b988e39b9b5b2f532b862d0824217fa671307d45a226920b67ecc69a5447541ff14d92e89828ba7e53262c67bdb0b825eefe55fd09e7bdd0501d0861383e01cea4f66d1376d2d04b4b2812ce6abc312b6a4f831e5f39c7524a1b977add877160b8f9b594c97eb11091c928a8d80fbe4aaca64d6173b15e0128db388eac6738f4584289b2af39884fceed7ca32cccbffeb60958d4bfbfd05b141beb2b376210cc5e7f096154748b3d605abc3cf1e697bd677f8489f409f6b2b23722e8c8e55ddb1b7574498a5a4a4baaf1e24bb87dc22bddb117ff9d2f3fa74296d5d3ae18f99426bb826d0a71a04f094b979ab85fe7218a9521a6b91d27cf222fca806fc34df7d6845f11d0e0e906a56f23bf40b44141cce856ef382e18c49dd3402bd91948d5c5d9ba2ee5e5ce9eeb7c9b0d6e380d32e884a009b51c47609c62db7108cb03ff4bcd272d5ae1806bc67944e1845d9cb634dbd3d9bb3e45b24ae5419b33e18b588b79d6406a8ba5982e3eacf1d87bd86a306f094e7e29bb94f2735fc175da326f0062ead067156145184ac4d386dab46736bd388f0065058e8a1956ded610c6214ed336b26b1a2538edc660b1fe9bc54baf0b33621123bb58e0931c54e31fac0d563ec134f9ed8267bf94333d69c4f65cbac74b7456a3cdb7bec091551ba57efdb280be9242aa29012d28ae2daf0892c8994799a1ac7939386ac54b8c95a2dfd78b6488c7dd206bb56e789df9012c4d42648be9db47ce175eebe4f5496750fc787194d34548709fe7e1efc856f644bbd95a8614a13f037e89e907718a3c13593f555aefbedcdd973302c3fe902c1a25345b42214181032e4390d30cd8ac76c370d2410d84bd80de7fc29da7309b2024c8f414d31650bb0f61a741b61b95eccd831353516c3a37377d44d9d305df50c07990d38f861ac7875bb8727a040d938e24880bffa938872697fc5d160d257b80a814a41a20cd830fde74a254675af24e1b82db771d4f4e68862ea36c69018ac95629a2b1c13d07d4f2b1eab4c4e3071c30d9dc96e5b8d7074d7847ed6f4362784d73c07759de81067ac83c69d9a33e1fb83a6acb8cc46db6220e5e7f44db47b641058bce5d2ffc084c7e3061876f8ced2e9e7f7b44dfa3ff3e7aa753c0e61ad47d8608e835c12ede3f20b8c6bf74cf85650848c15c608602bfda2572b205f513f7b4883eb33f13f1f5961988ed17c01591bc2e61af82e5faec13c774120bf6a6b3eb1e162e69b807dcbbcfec4c082be5e1cbfc0b203826d314f6de3321d3fa6cc89996a2ed75b86f27b8959e925a5c483d33affaf0b4b54ea3eb266a687bcf5693fe4978afb719663b1d79f8deeaa0e209ab02aaab47d0b8fc2535af872ebc39e172e7c572c98c23f2c5f0941235f8e49f414d1502416845c7c49af47d973cb888e9193cf80344b525e91054e7104c7433521fc37355c361e23c3d15a346560d0ce32972f54316073d2277e8487720384f8341ac23c400cba455b7b65cd18723c8d67cf788e081197fdf1dd2270ebde05dc8c375e133ede9fe420f7a5f5a7d74b8a650d3364745bdb3444dfa2bf2acd5a2eb7f68b0</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="即时约会" scheme="https://blog.jzxer.cn/tags/%E5%8D%B3%E6%97%B6%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>创造性：发明和发现</title>
    <link href="https://blog.jzxer.cn/20220609/creative/"/>
    <id>https://blog.jzxer.cn/20220609/creative/</id>
    <published>2022-06-09T12:26:45.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<h2 id="第一部分：创造的过程"><a href="#第一部分：创造的过程" class="headerlink" title="第一部分：创造的过程"></a>第一部分：创造的过程</h2><p>所谓的创造性是从内心断定自己的所思所为是新的，有价值的。</p><h2 id="第二部分：创造性在哪里？"><a href="#第二部分：创造性在哪里？" class="headerlink" title="第二部分：创造性在哪里？"></a>第二部分：创造性在哪里？</h2><p><strong>所谓创造性，就是对过往事件的重新评价和定义</strong>。另外必要的一点是，这个过程必须是你是第一发起人。</p><p>例如：巴赫在两百年之后才被发现。梵高的才华在他死去之后才被世人判定为艺术。</p><blockquote><p>但是在中国，大环境的影响会促使人们变得越来越没有创造性</p></blockquote><p>一方面可以指：那些不同寻常思想的、有趣的、有激励作用的人<br>另一方面指：以奇妙的、独特的方式体验这个世界的人</p><h2 id="第三部分：创造性的三要素"><a href="#第三部分：创造性的三要素" class="headerlink" title="第三部分：创造性的三要素"></a>第三部分：创造性的三要素</h2><ul><li>专业</li><li>业内人士</li><li>个人</li></ul><h3 id="专业"><a href="#专业" class="headerlink" title="专业"></a>专业</h3><p>人不可能在一个自己不了解的专业中具有创造性。<br>想在一个领域有突破，首先得了解这个领域的基本规律。</p><blockquote><p>定义:改变现存的专业，转变成一个新专业的心动、观点或产品。</p></blockquote><h3 id="业内人士"><a href="#业内人士" class="headerlink" title="业内人士"></a>业内人士</h3><p>要展示创造性，需要一个能承认并批准这种新颖贡献的业内人士圈</p><h3 id="个人：成为一个独创思想家的要素"><a href="#个人：成为一个独创思想家的要素" class="headerlink" title="个人：成为一个独创思想家的要素"></a>个人：成为一个独创思想家的要素</h3><p><strong>在创造性的发现中，幸运很重要，宣传很重要，也就是所谓的营销。</strong></p><ol><li><strong>极其大量的信息-庞大数据库</strong><ol><li><strong>具备做这件事的记忆力</strong></li><li><strong>刻意的练习，熟悉才能生巧</strong></li></ol></li><li><strong>你必须有能力丢弃你想出的主意中的糟粕</strong><ol><li><strong>你不可能只有好主意，好创意</strong></li><li><strong>要有自己的意识，去判断这个主意合不合格</strong><ol><li><strong>它复杂</strong></li><li><strong>以前有人试过</strong></li><li><strong>它本可以用三种更加简单的方法来做</strong></li></ol></li></ol></li></ol><h2 id="创造的个性"><a href="#创造的个性" class="headerlink" title="创造的个性"></a>创造的个性</h2><blockquote><p>有创造性的人与众不同之处在于，他们有能力适应几乎所有环境。<br>不首先去学习消化某个领域就不可能有创造性</p></blockquote><ol><li>先天容易接受某个专业</li><li>有创造性的人精力充沛，但是又通常很安静，经常休息。<ol><li>生活不被人推着走，而是靠自己的意愿去自然流动。</li></ol></li><li>没有时间观念，时间无足轻重，只为完成目的。<ol><li><strong>现在社会会有很多干扰，如果想有突破需要一个高度集中的专注力，忘我的</strong></li></ol></li><li>一方面充满想象和幻想，一方面又脚踏实地。<ol><li>当前的现实会迅速过时，因此我们需要注意将要出现的事物的形状。</li></ol></li><li>会把对立的倾向置于外向和内向的共同体。<ol><li>外向体现在乐于社交</li><li>内向体现在，当专心在自己的事情时，仿佛周围空无一物</li></ol></li><li>表现的即非常谦虚又非常骄傲<ol><li>他们对于自己从事的专业意识到前前人做出的贡献，所以能正确的看待自己的贡献。</li><li>他们意识到幸运在它们取得成就的过程中的重要性</li><li>全身心关心未来的挑战，因此，对于过去的成就不感兴趣</li></ol></li><li>叛逆性和独立性<ol><li>在学习专业知识领域的过程中，会成为一个传统主义者。在这个过程中不但要有传统性和保守性，也要迸发出叛逆性和反偶像性。</li></ol></li><li>对自己的工作充满热情，但是又非常客观</li><li>比较开放，比较敏感。这就使他们常常承受痛苦又感到极大的愉悦。</li></ol><h2 id="创造性的工作"><a href="#创造性的工作" class="headerlink" title="创造性的工作"></a>创造性的工作</h2><h3 id="传统创造的过程"><a href="#传统创造的过程" class="headerlink" title="传统创造的过程"></a>传统创造的过程</h3><ol><li>准备阶段：有意无意沉浸一系列有趣、引起好奇的问题之中。</li><li>酝酿成熟阶段：主意在潜意识中翻滚。和其它的内容产生结合碰撞（最重要）</li><li>洞见：”啊“时刻，难解的谜各部分拼在一起后解开的时刻</li><li>评价：决定这种顿悟是否有价值，是否值得花时间去探索</li><li>加工：像爱迪生所说：1%灵感+99%汗水，不断吸取营养，填充血肉</li></ol><h3 id="问题的出现"><a href="#问题的出现" class="headerlink" title="问题的出现"></a>问题的出现</h3><blockquote><p>来源：个人的经验、专业的要求、社会压力</p></blockquote><p>不学习别人知道的东西，就不可能具有创造性，但不能对那种知识不满意并以一种跟更好的办法来排斥它，这也不可能具有创造性。用牛顿的话说，这叫踩在巨人的肩膀上。</p><p>现存问题的准备和问题的解决总是比问题的发现用的时间少：</p><ol><li>一方面，具有看出自己如何能对未来做出贡献的眼光，从而从中受益。</li><li>另一方面，要相信自己的直觉，努力工作把它实现</li></ol><p>物理学家弗里曼·戴森说：我认为无所事事非常重要。他们总说莎士比亚在写两个剧本之间的时间无所事事。那些一年到头忙忙碌碌的人没有创造性。因此我对自己的无所事事并不感到羞愧。</p><p>我要告诉你一件事，当你有一个问题，不要坐下来试着去解决。问题的答案很可能出现在你洗澡的时候，你吃饭的时候，你第二天早上醒来的时候。（这点我很坚信，因为我经历过）</p><h3 id="创造性的涌流"><a href="#创造性的涌流" class="headerlink" title="创造性的涌流"></a>创造性的涌流</h3><p>具有创造性的人各不相同，但有一点完全一样：他们都爱自己做的事儿。</p><blockquote><p><strong>如果我必须在什么开心和什么赚钱之间挑选，我会选择开心。</strong></p></blockquote><p>不断推倒他们的动力来自于投身到这项活动的体验。</p><h4 id="什么是愉悦？"><a href="#什么是愉悦？" class="headerlink" title="什么是愉悦？"></a>什么是愉悦？</h4><ol><li>每一步都有明确的目标：我们总是知道下一步要干什么。<ol><li>活动的目标对于艺术家来说不太容易发现，事实上问题越有创造性，究竟要干什么就越不清楚。</li><li>【发现的问题】会在专业中产生最大的改变，但他们同样最难使人在工作时感到无趣，因为他们难以捉摸。</li><li>有时候，有创造性的人必须养成一种无意识机制来告诉他怎么做。</li></ol></li><li>对行动有迅速的反馈：我们知道自己干的有多好。<ol><li>艺术家放弃自己的生涯大多由于让批评家们承认自己作品的艺术性太累人。</li><li>需要有能力把好主意和坏主意区分开。（专业知识的深入）</li></ol></li><li>在挑战（焦虑）和技巧（焦虑）之间有一种平衡：恰如其分的在乏味和焦虑之间。<ol><li>进入一个未知领域并有新的突破，从来都不可能很容易。一旦开始着手，可能就会被压倒。</li><li>它就像一场战争，你必须在首先流血流汗。万事开头难。你必须先经历这个才能真正的轻松涌流</li><li>斗争并克服熵的障碍。</li></ol></li><li>行动和意识相融合：注意力集中在我们的行动上。<ol><li>意识要和你当下的行为统一，就像绘画的时候，你头脑里首先得有这幅画面，下笔才能够把这副画绘制出来。（涌流的画笔+涌流的思想）</li><li>我需要做的就是，涌流的四肢+涌流的思想。</li></ol></li><li>摒除杂念：我们只意识到与眼下有关的事情，并且【高度集中】。<ol><li>思想开小差会打断涌流的状态，重新回到该状态，可能需要花好几个小时。</li><li>更严重的，诸如健康、家庭、财务问题可能完全夺走一个人的注意力。</li><li>部分研究指出：大概率如果有一个伴侣，可以解决这个问题。</li></ol></li><li>根本不担心失败：集中心思工种，根本想不到失败。</li><li>自我意识消失：对自我的意识往往是一种负担，我们会下意识的去注意自己在别人眼里显得怎么样</li><li>时间感被歪曲：太过于专注，以至于忘了时间</li><li>行动具有自身的目的：autotelic（本身具有目的的），当以上大部分出现时，我们就开始享受由此产生的体验。<ol><li>从事活动的唯一理由就在于能感受由这些活动提供的体验，生活中大多数事物都是外在的。大多人做这件事是为了得到由此得出的某些结果。</li><li>关键在于追求的过程，而不是最终得到什么。被称为从【对真理和美的追求中获得振奋】。</li><li>物理学奖获得者苏·昌：成功不是我的一种动机。因为相对而言是失败。什么是成功？你有一个问题，你要想办法解决它。你解决了，在某种意义上算是成功。但是它可能只是一个微不足道的问题。因此，关于成功的定义并不是我认真对待过的问题。</li></ol></li></ol><p><strong>涌流和幸福：涌流的状态和幸福之间的联系要看产生涌流的行动是否复杂，是否会导向新的挑战，从而导致个人和文化的成长。</strong></p><h4 id="涌流和意识的演化"><a href="#涌流和意识的演化" class="headerlink" title="涌流和意识的演化"></a>涌流和意识的演化</h4><p>柏拉图说：社会最重要的任务是教育年轻人在正确的对象中找到愉悦。</p><p>在诸如做爱和暴力等早已植入到我们基因的活动中发现快乐要比接受我们结合经验给到的价值观中获取要容易的多。</p><p>打猎，钓鱼，吃饭，约会，赚钱比那些在我们进化中发现的新事物更容易让人接受。</p><h2 id="创造的环境"><a href="#创造的环境" class="headerlink" title="创造的环境"></a>创造的环境</h2><p>居住的地方非常重要，理由如下：</p><ol><li>人必须处在能进入自己想要工作的领域的位置上。</li><li>创新的刺激不会平均分配，有些地方的相互影响更加强烈，因此就能为思想者提供更多的刺激和更大的激励。</li><li>每个地方能进入业内人士圈子的机会并不相等。容易接受新思想的中心并非一定是信息的储存地，或激励最强的地方。</li></ol><p>越是接近主要的研究实验室、杂志、部门、机关和会议中心，新的声音就越容易被人听到，被人接受。</p><p>年轻学者太快卷入到一种充满竞争的、压力很大的环境中具有危险性。</p><p>何处才是合适的地方？取决于人的特性和他所从事事业的总体情况。不管怎样，错误的环境会影响创造性的发展。</p><h3 id="赋予人灵感的环境"><a href="#赋予人灵感的环境" class="headerlink" title="赋予人灵感的环境"></a>赋予人灵感的环境</h3><p>塞拜罗尼别墅所在的贝拉乔村在过去一直有很多访者，比如，达芬奇、列奥纳多、诗人朱塞佩·派利尼—-他曾在诗里写道：它会很高兴用在巴勒莫的一个月来换取贝拉乔的一天</p><p>当一个带着所有准备的脑袋的人发现者自己处在风景优美的地方，他们更可能发现思想之间新的联系，以及他们正在处理问题的新角度。</p><p>花旗银行的john·里德曾经因为工作强度太大，去意大利度假一周，在海滩边上的长椅上给自己写了一篇文章对于后面思考问题的深度相关性达到了80-90%</p><p>当我们有目的性的思考，我们的思想被强迫遵循一种直线式、逻辑的—-因此是可预见的方向</p><h3 id="创造有利于创造的环境"><a href="#创造有利于创造的环境" class="headerlink" title="创造有利于创造的环境"></a>创造有利于创造的环境</h3><p>一个好的环境，必定在顿悟的闪光出现之前，时间更长的酝酿阶段，还有同样长时间的评估和加工阶段。</p><p>状况：在文艺复兴时期的佛罗伦萨、15世纪的威尼斯、19世纪的巴黎无一例外是富裕的大都市。这往往处于文化的交汇处，来自不同文化传统的信息就在这里交流融合。</p><blockquote><p>该观点可以带入一些稀缺性思维和富裕性思维的观点，宏观环境我们大多无能为力，但我们可以掌控我们的具体环境，对它进行改造，从而使之强化个人的创造性。</p></blockquote><p>制度也会一定程度影响创造性的发展。</p><p>社会学家艾丽斯·博尔丁养成了一种几乎是修道士的生活习惯以适应自己创造性思维的节奏，他每天很早起床散步，然后沉思。很长时间安静地，就是静静的看着窗外的山，静静的沉思。</p><h3 id="特有的活动"><a href="#特有的活动" class="headerlink" title="特有的活动"></a>特有的活动</h3><p>并非只有物质环境具有个性才能是我们强化创造性思想。安排我们从事活动的方式同样也可以。</p><p>曼弗雷德·艾根是诺贝尔化学奖的获得者，为了使自己的思路摆脱直线式的思维，他几乎每天都在钢琴上演奏莫扎特的曲子。</p>]]></content>
    
    
    <summary type="html">瑞·达里奥对待生活的态度，很多东西值得参考，并且可以带你远离精神内耗。</summary>
    
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/categories/%E9%98%85%E8%AF%BB/"/>
    
    
    <category term="思维" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E7%BB%B4/"/>
    
    <category term="创造性" scheme="https://blog.jzxer.cn/tags/%E5%88%9B%E9%80%A0%E6%80%A7/"/>
    
  </entry>
  
  <entry>
    <title>和一个东北妹子的有趣约会</title>
    <link href="https://blog.jzxer.cn/20220504/datingwithdmd/"/>
    <id>https://blog.jzxer.cn/20220504/datingwithdmd/</id>
    <published>2022-05-04T02:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="93d8fe9d343fbb5f410ed4a15a07c35238c62e6354a54f334809b00331bc6af8">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c8752035b57963ae3de22df2cf8d6ebe0d4f7660891a744cd739517bc71de2ea80fd79a3e6290987ae1adb375f7b873335edc6531ce8f341d3f7e4f5c66f42cb33c8f7fa791e5acca8e4510e89a9c373e973c08e66b16d94e0b2bb7310fdb936eb150a3ca777051771696e170c5498aef94fb02eb3240760ee0a3fc1d9c3657efc8bc4c3bc478a1cb4166bc65a03b35cec472105468a0aba420631dbe750e3c5f862d5be9235c64422fe0bb91e42aad3b0d6bd74f9449ff5d5d2c1852fb3f622e3bd1c9b68c11721690ae6674e90ff4dffde18f6a16b8da510f18818d8a8bc5ff7737c228372fdf12a5e84a39a3ba089070d9b188f9c93d9e94abb8416169b5b4e0dca95e935ed294ceefe9f7091de4ba00a97fcd1059a88f81d3532eac8e97d682ee019010e156ff5cb4ec9ec86162804fd54cb0553c6df2c802a8aefb5e64a8126478a0be011d1ae81ebc637e1e3e801893a9a41ad6cf6a34db7b3fc9e179d6ac7a8adf63d6f90ebda0277b3d59753d44bb66348ef52f177e2ffb22896d4c4ac1dca28881f10194212567b253a4d9914679bd27417a6924243290251a6d1f7543cf6d41564bd6960b3a239c22b938682afe6ea2214ccc2da94375b5f91f6da546811baa6e18246e4ad6301c90abe763318fe749812747472d3f3e247f1aa387564fff040229ec971f397f7e5e8873ff11eedc1afce369129aa99afca1042de6ade66e4a68fb1b58274c8aa099f2473657c98725338f3a50351ec2b5dd2581250479c07097e73fddbb67abcca40c184106452</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>催眠治疗师学习导图</title>
    <link href="https://blog.jzxer.cn/20220427/hypnotist/"/>
    <id>https://blog.jzxer.cn/20220427/hypnotist/</id>
    <published>2022-04-27T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<h1 id="課程內容"><a href="#課程內容" class="headerlink" title="課程內容"></a>課程內容</h1><h2 id="單元-1：催眠簡介"><a href="#單元-1：催眠簡介" class="headerlink" title="單元 1：催眠簡介"></a>單元 1：催眠簡介</h2><ul><li>催眠的定義</li><li>催眠的基礎理論及歷史</li><li>對催眠的一些常見誤解</li><li>催眠的正確認識</li><li>成功催眠的要素</li><li>不同程度的催眠狀態及其特徵</li><li>催眠時所出現的情緒處理方法</li><li>催眠的原則</li><li>催眠的效用</li><li>專業催眠治療師操守守則</li></ul><h2 id="單元-2：與潛意識的有效溝通及提議的運用"><a href="#單元-2：與潛意識的有效溝通及提議的運用" class="headerlink" title="單元 2：與潛意識的有效溝通及提議的運用"></a>單元 2：與潛意識的有效溝通及提議的運用</h2><ul><li>意識 (Consciousness) 與潛意識 (Sub-Consciousness) 的分別及其運作原則</li><li>思想模式 (Mind Model)</li><li>與潛意識的有效溝通</li><li>潛意識首要的指令</li><li>潛意識的運作原則</li><li>催眠提議的原則</li><li>直接提議和情緒提議型</li><li>有效催眠提議的種類</li><li>催眠提議的有效運用秘訣</li><li>有效催眠提議的例子</li><li>運用催眠建立自信提議例子</li><li>運用催眠消除疲勞提議例子</li><li>運用催眠減輕焦慮提議例子</li></ul><h2 id="單元-3：催眠技巧"><a href="#單元-3：催眠技巧" class="headerlink" title="單元 3：催眠技巧"></a>單元 3：催眠技巧</h2><ul><li>催眠能力測試及其作用</li><li>催眠導出及導入法則, 技巧及例子</li><li>自我催眠的步驟</li><li>催眠前的要訣及提議</li><li>不同深度的催眠狀態測試</li><li>各種有效的催眠語法及用詞</li><li>各種有效的催眠語法及用詞</li><li>-艾克森 Ericksonian Hypnotic Induction，</li><li>-視線固定導入法 Eye-Fixation Induction，</li><li>-Dr. Flowers 催眠導入法 等等…</li><li>加深催眠狀態的技巧</li></ul><h2 id="單元-4：催眠治療程序"><a href="#單元-4：催眠治療程序" class="headerlink" title="單元 4：催眠治療程序"></a>單元 4：催眠治療程序</h2><ul><li>催眠治療的要點</li><li>如何對當事人提問有用的資料？</li><li>催眠治療的前言</li><li>四種催眠治療回應態度</li><li>如何讓催眠治療當事人相信自己已經進入催眠狀態？</li><li>如何加強催眠治療的效果？</li><li>催眠治療程序</li><li>一般精神科藥物的認識</li></ul><h2 id="單元-5-：實用催眠治療技巧及方案"><a href="#單元-5-：實用催眠治療技巧及方案" class="headerlink" title="單元 5 ：實用催眠治療技巧及方案"></a>單元 5 ：實用催眠治療技巧及方案</h2><ul><li>各種有效的催眠減壓法</li><li>指導當事人進行自我催眠</li><li>自我催眠程序</li><li>自我催眠提議例句</li><li>各種有效的痛楚舒緩催眠技巧，例如，減輕頭痛痛楚</li><li>各種有效的快速恐懼症治療技巧</li><li>催眠治療-年齡倒退法 (Age Regression)</li><li>年齡倒退法目的</li><li>年齡倒退法實例</li><li>身心症 (Somatization Disorder) 的病因及形成</li><li>催眠治療-身心症 (Somatization Disorder) 的治療方法及個案分析</li><li>加速身體的自癒能力</li><li>用鐘擺治療疾病</li><li>催眠戒煙的有效技巧</li><li>催眠纖體的有效技巧</li><li>催眠表演技巧及例子 (Stage hypnosis techniques and Script)</li></ul>]]></content>
    
    
    <summary type="html">健康管理师课程笔记</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="健康" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7/"/>
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    <category term="催眠" scheme="https://blog.jzxer.cn/tags/%E5%82%AC%E7%9C%A0/"/>
    
  </entry>
  
  <entry>
    <title>男性荷尔蒙张力带来的意外收获</title>
    <link href="https://blog.jzxer.cn/20220426/apricedating/"/>
    <id>https://blog.jzxer.cn/20220426/apricedating/</id>
    <published>2022-04-26T02:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="37007094200eddd9e0827997304424846bfeb52142ed7df92ed1739721da79fe">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c87520396a5d5e7f9b2e379eeb782e5af56b2e52fdfc798cbcb2442ebed650abbe9d7c5e440d0ebe1b9d0ff4477818186a7dbfaf0516da63dbf8f8025a92ef984f5590ca08d60261d191f70ba5f7f3963310d3052285f0969c50a0da8981097af9910454a1debc15b5ea0db32728f32083216ef3d5c6fc30701f1ce4c5731289bff532a075a6709d74beefdfe96944563b4e0d7855cc8aa809cbfbee1220583b8f804422b78b00b3c031f0a1bb350381d43590c1fd1a127d6a10068d9ea726d38bd12fbee9abdc0e41bea412dc6342edf63d9e70912a66a56cf94f54e89d0d4c871a046e0bba4bfaf6563b4140bd8a7ce95d8c13fb4c331fa85024a27b11e63c410992dd4e6dc2501c1370a9e76b7bb012c3b00947cf259bf5cabe325277a0a3fffa6469424b02d3acf6888a4fb34159e2c8267f11d8656de9adde32d8fa74193aa89fce3ad9da29a4d00f2805f077a2f1e406b2ed498d1b3620dc83b1dda924c397f500325ade6c230d25c5a464df997ef7837215db7aa445faf7bb8cb8fb5c784515e67cae06ddc5581339be8be17835901ea479b0e37e03826dfb6898fb9f4dcffc4ce71877b3d2e3d8196f79c5f0a9200cff331512515e196140cfad9ce2a491e4d039a1414db9b594fcd2f9cc1448c6345d082dcbf8a057167c899e9ed77be6c7e87158312ac4adc4db05f6f01ca3d75597dc4d9b4c58267c16a71e46bb86cfd9e274c5241f2f3080c0a922073520668b4927b5008975ac00c6b276a1e0687849b84b71aa8b7f3a41fc3c3f0c5a0f2adb22ff563a3c483c10eb5b75607664344c5b8fd9305d27789fe1321172c8c95c491c2b6c581cc228938fdc651f4cf4ca8cc8aec406091eb6eeae5797a68f4ab398a3d518dc5de1e0f41ba430db0638a822daad5ef6719290dbdcd31c8c09506c83273cd3b8943b5a7e33bb9e911fa0aa359a4afbbdf0d8f70ca4b18333b630c7a1c9f133ecead3eb2c62ba9fe750a9dd2cb7566ad6074cb76eaaaa9b84586bd7710a247b00c18f771d412bcb6eb534704d78ead4607bc108eb99e1c81a20d0e38a59ac77c67150acb4f562216b17c67ac81e1123373d932a5663460e675344f7b815add6d5798361e8ac5eda4f8804cd19229d4fded667f01303b0cdb7a2380cdbabd000385b899c2c3a83bb0ea8e2877ccea06a892cf9aae244055828eb009b13124429393f4e1197dc2c3e1519c7e80887b0f5defc519944f2e19dd2cf0dd211c4493cdd08e893c38583c71e466812a9c1f473c5e2f18aba5fbe2f968470a9abc7f5d31099d7d258e98b50d8d662f70d0bff77d404195d9c3d2b06e87394cde64394ef83f764d90fdbdbf0de483fe9b2508a3cad98ae1b70ee40651b39bbb1c3471733418c1b123ade3635ad7317533f743c4fdf0650595ebf2a333271e952c66d3be39dfcad18f6a69cfc007dfc938c63963c200de07972310830514c272ce926c0cfe876a6e67d4831cbbc8b630351ce5a2de93d8ed20c7111244f4a79f2f4a92c19c7f5f04d99bd1ac1628080e908c5173a0e260f0a83509c01dcec4ae2c8448f31928b69800d87c4287b5f538629bf5001fd1dc6ea990e8c53a6c041053e0c469d1bc3b17a6a2f82fe7450e3c23515d9f89108dd634c6653e0d05c29a71e917f63e3e08ddc9b9b46f97756e84b36895488b84fde7a0cda3d329822e356160278419b1f505e4fa606956408dda91aa64b02129e9d6f311c369d34564f4b055bfc2be149030bdeb25bd4468702ba23189c0003a7732f197b7ffc9f94cd343f3c9761f51761b0087e97791acb51c9eeb440b1f51e8a0265b3eb21b663612a6b269cbb3068a5e46afe57ca4b09db849a06d1285a128de532cbc2f080fc862104</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
  </entry>
  
  <entry>
    <title>牵手上的第一次约会经历</title>
    <link href="https://blog.jzxer.cn/20220426/datingwithcyw/"/>
    <id>https://blog.jzxer.cn/20220426/datingwithcyw/</id>
    <published>2022-04-26T02:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="e04eb384bc80253c62cb328e23d5fccfe456aa09485711d5e2560ac52353273d">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c87520a51df1a439631b1e9c7fae501419aa7c88b8ea86757164d669e85027244dc51e9dd43bcca7962af3eda2f33bfcac200a6fb964879f7a40c1e919d8d853d0e2c55f8548a2734bbc65e4852c1edebb0b8719334e951ebb3499d934bd09b12a1368aea0469f42934752b022c4ca72c47e9a1ab8bc67f3833cd94e90596d99d43671b32b662c9dfe04ffc8b68feaa9976bd93c796c3335c388c4b43d94c7b99ab235903e3d6d16fd779bd04fb6dea585b1e4038f408a955c96690c011af609beb3eb7356234d3fb64e7b7cfbc3a9051df22e8ae8ec429a51d9819c2190feb3da48e08a96ac8958d0b05e9cb6baf098bd5985d432742eed8fab7fd3a6036a2eeabed0e24591b0a409526f7d6fbab9aaf4a65a8002fd7707d83ae955fe21982f7db6ec3d3bc2efa7b034b4f2e7a71b7e80650dd003529b4174a479b9cee6edb1015cf3a947c8088efc61d2109cb1fca642247cb6b259201e2ce0e1b33a120641d54b8462931158607c82cdccdc47e5036f3e2b156607cd4ea2274bb62f2544ac6f3b165c1fb427914477c9f791629870315fb7f2cae2ea78ef426f23ad2cecd76460dafe3ad775dcb5272c56fa8df195a57d5895627545256a62069dd57d3cc11c17e619876d9bb1f90903f7bf187632723c30ab4e156d9cf4bfedc10fb428c1c0125a5a2e826b9b811adb42941c9cadcbca46eb84b1dd4d497ab9c8a7aec0a91e6630660989ab8977749ecba1d613a7d89bb3c03deeec87937411cf6ea163b37f5e6a017c9e042606d5f00f689c79b748c1a9</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
  <entry>
    <title>10 - 中医养生</title>
    <link href="https://blog.jzxer.cn/20220327/healthyManager-10/"/>
    <id>https://blog.jzxer.cn/20220327/healthyManager-10/</id>
    <published>2022-03-27T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<h2 id="什么是中医"><a href="#什么是中医" class="headerlink" title="什么是中医"></a>什么是中医</h2><p>道为规律，术为方法，道术即为中医的起源。</p><h2 id="医学四大名著"><a href="#医学四大名著" class="headerlink" title="医学四大名著"></a>医学四大名著</h2><ol><li>黄帝内经</li><li>黄帝八十一难经</li><li>伤寒杂病论</li><li>神农百草经</li></ol><h2 id="中医基础理论"><a href="#中医基础理论" class="headerlink" title="中医基础理论"></a>中医基础理论</h2><h3 id="一、阴阳学说"><a href="#一、阴阳学说" class="headerlink" title="一、阴阳学说"></a>一、阴阳学说</h3><p>阴阳的概念：宇宙中相互关联的事物或相互对立属性的概念</p><h3 id="二、五行学说"><a href="#二、五行学说" class="headerlink" title="二、五行学说"></a>二、五行学说</h3><ol><li>事物五行归属（自然）</li></ol><p><img src="/img/gallery/2024/healthy-10-1.png" alt="截屏2022-08-30 20.13.27.png"></p><ol start="2"><li>事物五行归属（人体）</li></ol><p><img src="/img/gallery/2024/healthy-10-2.png" alt="截屏2022-08-30 20.19.38.png"></p><h3 id="五、气血精津"><a href="#五、气血精津" class="headerlink" title="五、气血精津"></a>五、气血精津</h3><h4 id="4-精的分类和作用"><a href="#4-精的分类和作用" class="headerlink" title="4. 精的分类和作用"></a>4. 精的分类和作用</h4><ul><li>先天之精：维持人体生长发育和生殖作用</li><li>后天之精：维持脏腑正常生理功能</li></ul><h4 id="5-津液的作用"><a href="#5-津液的作用" class="headerlink" title="5. 津液的作用"></a>5. 津液的作用</h4><h3 id="六、发病与病因"><a href="#六、发病与病因" class="headerlink" title="六、发病与病因"></a>六、发病与病因</h3><p>发病是指导致疾病发生的原因，又称致病因素</p><h4 id="病因分类"><a href="#病因分类" class="headerlink" title="病因分类"></a>病因分类</h4><p>外因：六淫（风、寒、暑、湿、燥、火，即六大外感病邪）</p><h3 id="七、辨证论治"><a href="#七、辨证论治" class="headerlink" title="七、辨证论治"></a>七、辨证论治</h3><h4 id="1-辩证（治疗的前提和基础）"><a href="#1-辩证（治疗的前提和基础）" class="headerlink" title="1. 辩证（治疗的前提和基础）"></a>1. 辩证（治疗的前提和基础）</h4><p>根据四诊收集资料，通过分析、综合、辩清疾病病因、以及邪正之间的关系，概括、判断为某种性质的证。</p><blockquote><p>四诊：望、闻、问、切</p></blockquote><h5 id="①-望诊"><a href="#①-望诊" class="headerlink" title="① 望诊"></a>① 望诊</h5><p>正常人的面色： 红黄隐隐，明润含蓄</p><ol><li>面<ul><li>面赤：虚热、实热、血瘀</li><li>面青：寒、痛、淤血、惊风。</li><li>面黄：主湿、脾虚</li><li>面黑：主寒、痛、淤血、水饮，肾虚。</li></ul></li><li>舌头</li></ol><p>正常舌头：淡红舌、薄白苔</p><ul><li><img src="/img/gallery/2024/healthy-10-3.png" alt="截屏2022-09-13 22.50.20.png"></li></ul><h5 id="②-闻诊"><a href="#②-闻诊" class="headerlink" title="② 闻诊"></a>② 闻诊</h5><p>听声音、嗅气味</p><h5 id="③-问诊"><a href="#③-问诊" class="headerlink" title="③ 问诊"></a>③ 问诊</h5><p><img src="/img/gallery/2024/healthy-10-4.png" alt="截屏2022-09-13 22.55.01.png"></p><h5 id="④-切诊（脉诊、按诊）"><a href="#④-切诊（脉诊、按诊）" class="headerlink" title="④ 切诊（脉诊、按诊）"></a>④ 切诊（脉诊、按诊）</h5><p>脉诊部位：寸口处（原理：肺朝百脉）<br>脉象分类：平脉、28 种病脉<br>切脉方法：举、按、寻</p><h4 id="2-论治"><a href="#2-论治" class="headerlink" title="2. 论治"></a>2. 论治</h4><p>治则：扶正驱邪、调整阴阳、治病求本<br>治疗手段：针灸、推拿、气功、食疗、导引、精神调摄等</p>]]></content>
    
    
    <summary type="html">健康管理师课程笔记</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="健康管理师" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86%E5%B8%88/"/>
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>4. 常见慢性病</title>
    <link href="https://blog.jzxer.cn/20220327/healthyManager-4/"/>
    <id>https://blog.jzxer.cn/20220327/healthyManager-4/</id>
    <published>2022-03-27T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、慢性非传染性疾病概念"><a href="#一、慢性非传染性疾病概念" class="headerlink" title="一、慢性非传染性疾病概念"></a>一、慢性非传染性疾病概念</h2><h3 id="慢性非传染性疾病的主要特点（重点）"><a href="#慢性非传染性疾病的主要特点（重点）" class="headerlink" title="慢性非传染性疾病的主要特点（重点）"></a>慢性非传染性疾病的主要特点（重点）</h3><ol><li>病因复杂，其不良行为和生活方式密切相关</li><li>潜伏期较长，没有明确的起病时间</li><li>病程较长，随着疾病的发展，表现为功能进行性受损或失能</li><li>很难彻底治愈，看表现为不可逆性</li><li>预后较差，致残率和致死率较高</li></ol><h3 id="常见的慢性非传染性疾病"><a href="#常见的慢性非传染性疾病" class="headerlink" title="常见的慢性非传染性疾病"></a>常见的慢性非传染性疾病</h3><ol><li>心脑血管疾病：高血压、血脂异常、冠心病、脑卒中</li><li>营养代谢性疾病：超重、肥胖、2 型糖尿病，通风</li><li>恶心肿瘤</li><li>慢性呼吸系统疾病：慢性阻塞性肺病</li><li>精神心理性疾病</li></ol><h3 id="重点"><a href="#重点" class="headerlink" title="重点"></a>重点</h3><p>我国“健康管理”的核心内容：<br>是对慢性病相关危险因素的检测、评估和干预</p><h3 id="我国慢性病增加的原因"><a href="#我国慢性病增加的原因" class="headerlink" title="我国慢性病增加的原因"></a>我国慢性病增加的原因</h3><p>慢性病负担的增加，除与生活水平不断提高，人均寿命的增长，以及人口老龄化有关外，还与医学预防和治疗的进步，慢性病患者的生产期不断延长</p><ul><li>当一个国家或地区 60 岁以上老年人口占总人口数的 10%，或 65 以上老年人占人口总数的 7%</li></ul><h2 id="二、慢性病主要危险因素"><a href="#二、慢性病主要危险因素" class="headerlink" title="二、慢性病主要危险因素"></a>二、慢性病主要危险因素</h2><p><img src="/img/gallery/2024/healthy-4-1.png" alt="慢性病主要危险因素"></p><p>一因多果，一果多因，多因多果，互为因果</p><h3 id="常见慢性病与危险因素的内在关系"><a href="#常见慢性病与危险因素的内在关系" class="headerlink" title="常见慢性病与危险因素的内在关系"></a>常见慢性病与危险因素的内在关系</h3><p>正常人-高危人群-疾病-并发症</p><p><img src="/img/gallery/2024/healthy-4-2.png" alt="常见慢性病与危险因素的内在关系"></p><ul><li>慢性病致病的八大主要危险因素：<ul><li>吸烟</li><li>过量饮酒</li><li>不合理膳食</li><li>过度肥胖</li><li>缺乏身体活动</li><li>病原体感染<ul><li>幽门螺旋杆菌</li><li>乙肝</li><li>人乳头瘤状病毒</li></ul></li><li>不良的心理社会因素</li><li>遗传与基因因素</li></ul></li></ul><h2 id="三、慢性病主要社会危害"><a href="#三、慢性病主要社会危害" class="headerlink" title="三、慢性病主要社会危害"></a>三、慢性病主要社会危害</h2><ul><li>慢性病严重危害居民健康</li><li>慢性病提高经济负担</li><li>慢病形势<ul><li>承认非传染性疾病给全球带来的负担和威胁是二十一世纪发展的主要挑战之一，有损世界各地的社会和经济发展，并威胁到国际商定发展目标的实现</li><li>认识到非传染性疾病对许多会员国的经济是一个威胁，可能导致国家之间及人口之间的不平等加剧</li></ul></li></ul><p><img src="/img/gallery/2024/healthy-4-4.png" alt="慢性病"></p>]]></content>
    
    
    <summary type="html">健康管理师课程笔记</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="健康管理师" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86%E5%B8%88/"/>
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>9. 心理健康</title>
    <link href="https://blog.jzxer.cn/20220327/healthyManager-9/"/>
    <id>https://blog.jzxer.cn/20220327/healthyManager-9/</id>
    <published>2022-03-27T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<h3 id=""><a href="#" class="headerlink" title=""></a></h3><h3 id="1-一般-严重心理问题"><a href="#1-一般-严重心理问题" class="headerlink" title="1. 一般&#x2F;严重心理问题"></a>1. 一般&#x2F;严重心理问题</h3><p><img src="/img/gallery/2024/healty-9-1.png" alt="一般/严重心理问题"></p><h3 id="2-不良行为"><a href="#2-不良行为" class="headerlink" title="2. 不良行为"></a>2. 不良行为</h3><p>表现形式：</p><ol><li>不良生活方式</li><li>致病性行为模式<ol><li>A 型：外攻击型，容易较真，急性子，完美主义者，容易得和心脏相关的疾病。</li><li>C 型：内攻击型，容易消沉，容易抑郁，从而引发自杀等。</li></ol></li><li>不良疾病行为：生病不看医生，迷信、占卜…等</li><li>违规行为：违法行为</li></ol><h4 id="网络成瘾主要特征"><a href="#网络成瘾主要特征" class="headerlink" title="网络成瘾主要特征"></a>网络成瘾主要特征</h4><p>值慢性或者周期性对网络的生理和心理依恋的现象 ，包括：</p><ol><li>上网的欣快</li><li>下网后的戒断反应</li><li>难以抑制的上网行为</li></ol><blockquote><p>原理：让人快速达到快乐的状态，同时会存在进行中的欣快感和结束后的虚空感</p></blockquote><h2 id="第四节-常见心理障碍"><a href="#第四节-常见心理障碍" class="headerlink" title="第四节 常见心理障碍"></a>第四节 常见心理障碍</h2><h3 id="1-心理障碍的概念和类型"><a href="#1-心理障碍的概念和类型" class="headerlink" title="1. 心理障碍的概念和类型"></a>1. 心理障碍的概念和类型</h3><ol><li>每四个人中有一个人在生命中的某个时刻患有精神疾病</li><li>精神疾病每年耗费美国和全世界数万亿美元</li><li>但是很多人从未被诊断或治疗</li><li>但是，精神疾病不是品格问题；它们是可以被治疗的</li><li>然而，在它们的最早期，最可治疗的阶段，我们经常忽视或错过了这些疾病–直到它演变成为严重的、造成潜在生命威胁的状况。</li></ol><h4 id="可导致精神疾病的主要生活应激"><a href="#可导致精神疾病的主要生活应激" class="headerlink" title="可导致精神疾病的主要生活应激"></a>可导致精神疾病的主要生活应激</h4><ol><li>亲密关系：失恋、分手、外遇、离婚、死亡</li><li>主要生活变化：衰老、退休、毕业</li><li>生活变化事件：婚姻、孩子诞生、孩子离家</li><li>工作问题：新工作、失业、工作压力</li><li>健康问题：慢性病、家属疾病</li></ol><h4 id="常见心理障碍"><a href="#常见心理障碍" class="headerlink" title="常见心理障碍"></a>常见心理障碍</h4><p><img src="/img/gallery/2024/healty-9-2.png" alt="截屏2022-08-01 22.50.58.png"></p><h4 id="人格障碍分类和关键特征"><a href="#人格障碍分类和关键特征" class="headerlink" title="人格障碍分类和关键特征"></a>人格障碍分类和关键特征</h4><p><img src="/img/gallery/2024/healty-9-3.png" alt="截屏2022-08-01 22.51.32.png"></p><h3 id="2-心理障碍的评估方法"><a href="#2-心理障碍的评估方法" class="headerlink" title="2. 心理障碍的评估方法"></a>2. 心理障碍的评估方法</h3><p>注意：如若评估发现有发病迹象，应尽早劝病人就医，而不要给建议。<br><img src="/img/gallery/2024/healty-9-4.png" alt="截屏2022-08-01 22.55.08.png"></p><h4 id="焦虑状态的“90-秒-4-问题询问法”快速筛查-2-个"><a href="#焦虑状态的“90-秒-4-问题询问法”快速筛查-2-个" class="headerlink" title="焦虑状态的“90 秒 4 问题询问法”快速筛查(2 个)"></a>焦虑状态的“90 秒 4 问题询问法”快速筛查(2 个)</h4><p><img src="/img/gallery/2024/healty-9-5.png" alt="截屏2022-08-01 22.56.14.png"></p><h4 id="抑郁状态的“90-秒-4-问题询问法”快速筛查（四个都是）"><a href="#抑郁状态的“90-秒-4-问题询问法”快速筛查（四个都是）" class="headerlink" title="抑郁状态的“90 秒 4 问题询问法”快速筛查（四个都是）"></a>抑郁状态的“90 秒 4 问题询问法”快速筛查（四个都是）</h4><p><img src="/img/gallery/2024/healty-9-6.png" alt="截屏2022-08-01 22.58.37.png"></p><h4 id="广泛性焦虑（7-项）自评筛查量表"><a href="#广泛性焦虑（7-项）自评筛查量表" class="headerlink" title="广泛性焦虑（7 项）自评筛查量表"></a>广泛性焦虑（7 项）自评筛查量表</h4><p><img src="/img/gallery/2024/healty-9-7.png" alt="截屏2022-08-01 22.59.46.png"></p><h4 id="抑郁自评量表"><a href="#抑郁自评量表" class="headerlink" title="抑郁自评量表"></a>抑郁自评量表</h4><p><img src="/img/gallery/2024/healty-9-8.png" alt="截屏2022-08-01 23.00.55.png"></p><h2 id="第五节：心理健康的维护与促进"><a href="#第五节：心理健康的维护与促进" class="headerlink" title="第五节：心理健康的维护与促进"></a>第五节：心理健康的维护与促进</h2><h3 id="1-心理健康的维护与促进"><a href="#1-心理健康的维护与促进" class="headerlink" title="1. 心理健康的维护与促进"></a>1. 心理健康的维护与促进</h3><p>实施措施：</p><ol><li>树立社会主义的人生观与价值观</li><li>保持与社会发展同步的生活节奏</li><li>培养良好的心理素质于建全的人格</li><li>规律生活，有效应对</li><li>积极锻炼，合理兴趣</li><li>自我觉察，善交朋友</li><li>释放压力，定期放松</li></ol><h4 id="健康的生活方式"><a href="#健康的生活方式" class="headerlink" title="健康的生活方式"></a>健康的生活方式</h4><ol><li>充分锻炼</li><li>足够的睡眠</li><li>健康饮食</li><li>信赖朋友和相信家庭成员</li><li>如何更好的应对生活压力</li></ol><h3 id="2-特定人群心理健康的维护"><a href="#2-特定人群心理健康的维护" class="headerlink" title="2. 特定人群心理健康的维护"></a>2. 特定人群心理健康的维护</h3><h4 id="1-儿童期心理健康维护的要点"><a href="#1-儿童期心理健康维护的要点" class="headerlink" title="1. 儿童期心理健康维护的要点"></a>1. 儿童期心理健康维护的要点</h4><ol><li>良好的家庭环境，温馨的亲子关系</li><li>满足孩子独立的需要</li><li>尊重孩子的自尊心</li><li>为孩子树立良好的榜样</li><li>正面教育为主，合理引导为辅</li><li>学会交友，平等相处</li></ol><h4 id="2-青春期心理健康的维护要点"><a href="#2-青春期心理健康的维护要点" class="headerlink" title="2. 青春期心理健康的维护要点"></a>2. 青春期心理健康的维护要点</h4><ol><li>培养兴趣，拓展潜力</li><li>认识青春期，了解性知识</li><li>学会控制情绪与行为</li><li>培养独立意识，学会和睦相处</li><li>尊重他人，增强自信</li><li>提供青春期心理健康教育资源</li></ol><blockquote><p>注意：边缘系统还没发育好，容易冲动</p></blockquote><h4 id="3-壬辰期心理健康维护的要点"><a href="#3-壬辰期心理健康维护的要点" class="headerlink" title="3. 壬辰期心理健康维护的要点"></a>3. 壬辰期心理健康维护的要点</h4><ol><li>认识妊娠期，了解胎儿保健知识</li><li>学会控制情绪与行为</li><li>培养兴趣，提高抵抗能力</li><li>与他人交流，分享自身感受</li><li>暗示作息，合理营养</li><li>提供妊娠期心理健康教育资源</li></ol><h4 id="4-更年期心理健康维护的要点"><a href="#4-更年期心理健康维护的要点" class="headerlink" title="4. 更年期心理健康维护的要点"></a>4. 更年期心理健康维护的要点</h4><ol><li>认识更年期，了解更年期保健知识</li><li>学会控制情绪与行为</li><li>培养兴趣，提高抵抗力</li><li>鼓励交流，参与社交活动</li><li>积极锻炼</li><li>提供更年期心理健康教育资源</li></ol><h4 id="5-老年期心理健康维护的要点"><a href="#5-老年期心理健康维护的要点" class="headerlink" title="5. 老年期心理健康维护的要点"></a>5. 老年期心理健康维护的要点</h4><ol><li>认识老年期，了解老年期保健知识</li><li>培养兴趣，老有所成</li><li>勤于锻炼，防治慢病</li><li>积极劳作，科学健脑</li><li>鼓励交流，参与社会活动</li><li>提供老年期心理健康教育资源</li></ol><blockquote><p>注意：一定要和人交流，多劳作</p></blockquote>]]></content>
    
    
    <summary type="html">健康管理师课程笔记</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="健康管理师" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86%E5%B8%88/"/>
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>3. 预防医学基础知识</title>
    <link href="https://blog.jzxer.cn/20220322/healthyManager-3/"/>
    <id>https://blog.jzxer.cn/20220322/healthyManager-3/</id>
    <published>2022-03-22T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<h2 id="第一节：概述"><a href="#第一节：概述" class="headerlink" title="第一节：概述"></a>第一节：概述</h2><h3 id="什么是预防医学？"><a href="#什么是预防医学？" class="headerlink" title="什么是预防医学？"></a>什么是预防医学？</h3><p>传统分类：</p><ol><li>基础医学</li><li>临床医学</li><li>预防医学（公共卫生）</li></ol><p>是医学的一门应用学科，以个体和确定的群体为对象，目的是保护，促进和维护健康，预防疾病、失能与早逝，特点是兼顾个体和群体，微观和宏观，自然与社会科学，有对个体的预防干预，更重视促进人群健康的社会措施</p><h4 id="预防医学的学科体系-欧美（国标）"><a href="#预防医学的学科体系-欧美（国标）" class="headerlink" title="预防医学的学科体系-欧美（国标）"></a>预防医学的学科体系-欧美（国标）</h4><ol><li>流行病学【重要】</li><li>生物统计学【重要】</li><li>环境卫生、职业卫生【重要】</li><li>社会与行为科学（健康教育、促进）</li><li>卫生政策与管理</li></ol><h4 id="预防医学的学科体系-中国"><a href="#预防医学的学科体系-中国" class="headerlink" title="预防医学的学科体系-中国"></a>预防医学的学科体系-中国</h4><ol><li>流行病学、生物统计学【重要】</li><li>社会医学与卫生事业管理【重要】</li><li>环境卫生、职业卫生【重要】</li><li>营养学与食品卫生学</li><li>少儿卫生</li><li>卫生毒理学</li></ol><h3 id="什么是公共卫生？"><a href="#什么是公共卫生？" class="headerlink" title="什么是公共卫生？"></a>什么是公共卫生？</h3><ul><li>国家，社会事业</li><li>疾病预防控制行为</li></ul><blockquote><p>吴仪定义（2003）：公共卫生就是组织社会共同努力，改善环境卫生条件，预防控制传染病和其它流行疾病</p></blockquote><h3 id="它们之间的联系与区别？"><a href="#它们之间的联系与区别？" class="headerlink" title="它们之间的联系与区别？"></a>它们之间的联系与区别？</h3><ul><li>预防医学是一门专门的学科</li></ul><h3 id="健康决定因素以及健康生态学模型"><a href="#健康决定因素以及健康生态学模型" class="headerlink" title="健康决定因素以及健康生态学模型"></a>健康决定因素以及健康生态学模型</h3><ul><li>健康行为、生活方式、习惯等</li><li>遗传因素</li><li>社会经济环境</li><li>医疗、卫生服务水平：公共卫生以及医疗卫生服务</li><li>自然环境››</li></ul><h3 id="三级预防策略"><a href="#三级预防策略" class="headerlink" title="三级预防策略"></a>三级预防策略</h3><h4 id="第一级预防"><a href="#第一级预防" class="headerlink" title="第一级预防"></a>第一级预防</h4><p>针对病因所采取的预防措施：</p><ul><li>个体的措施<ul><li>增进健康，提高抗病能力；开展健康教育，注意合理营养和提个锻炼，培养良好的行为和方式</li><li>有组织的进行预防接种，提高人群的免疫水平</li><li>预防出生缺陷，做好婚前、孕前教育和禁止近亲结婚等</li><li>做好妊娠和儿童期的卫生保健工作</li><li>某些疾病的高危个体服用药物来预防疾病的发生，即化学预防</li></ul></li><li>环境的措施<ul><li>环境卫生：大气、水和土壤</li><li>职业卫生：…</li></ul></li></ul><h4 id="第二级预防"><a href="#第二级预防" class="headerlink" title="第二级预防"></a>第二级预防</h4><p>在疾病的临床前期做好早期发现、早期诊断、早期治疗（三早），以控制疾病的发展和恶化，繁殖疾病的复发或转化为慢性</p><h4 id="第三级预防"><a href="#第三级预防" class="headerlink" title="第三级预防"></a>第三级预防</h4><p>对已患某些病者，采取及时的，有效的治疗措施，防止病情恶化，预防并发症和伤残，如糖尿病；<br>对已丧失劳动能力或残废者，主要促使功能恢复、心理康复，进行家庭护理指导，使病人尽量恢复生活和劳动能力，并能参加社会活动及延长寿命：如脑卒中。</p><h2 id="第二节：临床预防服务"><a href="#第二节：临床预防服务" class="headerlink" title="第二节：临床预防服务"></a>第二节：临床预防服务</h2><p>是指由医务人员在临床场所对健康者和无症状“患者”的健康危险因素进行评估，实施个性化的预防干预措施来预防疾病和促进健康。（无症状“患者”：高危人群）</p><h3 id="临床预防服务内容"><a href="#临床预防服务内容" class="headerlink" title="临床预防服务内容"></a>临床预防服务内容</h3><ol><li>健康咨询</li><li>健康筛检</li><li>药物预防</li><li>预防接种</li></ol><h2 id="第三节：社区公共卫生服务"><a href="#第三节：社区公共卫生服务" class="headerlink" title="第三节：社区公共卫生服务"></a>第三节：社区公共卫生服务</h2><h3 id="社区的概念"><a href="#社区的概念" class="headerlink" title="社区的概念"></a>社区的概念</h3><p>生活社区，功能社区</p><h3 id="社区公共卫生实施原则"><a href="#社区公共卫生实施原则" class="headerlink" title="社区公共卫生实施原则"></a>社区公共卫生实施原则</h3><ol><li>以健康为中心</li><li>以人群为对象</li><li>以需求为导向</li><li>多部门合作</li><li>人人参与</li></ol><h3 id="国家基本公共卫生服务规范-12-项"><a href="#国家基本公共卫生服务规范-12-项" class="headerlink" title="国家基本公共卫生服务规范 12 项"></a>国家基本公共卫生服务规范 12 项</h3><ul><li>严重精神障碍患者管理</li><li>肺结核患者健康管理</li><li>中医药健康管理</li><li>传染病及突发公共卫生事件报告和处理</li><li>卫生计生监督协管</li></ul><h3 id="职业病管理"><a href="#职业病管理" class="headerlink" title="职业病管理"></a>职业病管理</h3><h4 id="职业病"><a href="#职业病" class="headerlink" title="职业病"></a>职业病</h4><p>在工作环境中接触职业有害因素导致的疾病</p><h4 id="法定职业病"><a href="#法定职业病" class="headerlink" title="法定职业病"></a>法定职业病</h4><p>总共有 10 大类，132 个病种，尘肺，中毒，物理因素，放射等</p><h4 id="职业关联疾病"><a href="#职业关联疾病" class="headerlink" title="职业关联疾病"></a>职业关联疾病</h4><p>职业因素不是发病的唯一因素，而是诸多因素之一</p><h3 id="职业病的五个特点"><a href="#职业病的五个特点" class="headerlink" title="职业病的五个特点"></a>职业病的五个特点</h3><ul><li>病因明确</li><li>病因与疾病之间有剂量-反应关系</li><li>群体发病</li><li>早期治疗诊断效果好</li><li>除职业性传染病，治疗个体无助于控制群体发病</li></ul><p><img src="/img/gallery/2024/healthy-3-1.png" alt="healthy-3-1"><br><img src="/img/gallery/2024/healthy-3-2.png" alt="healthy-3-2"></p>]]></content>
    
    
    <summary type="html">健康管理师课程笔记</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="健康管理师" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86%E5%B8%88/"/>
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>1. 健康管理概论</title>
    <link href="https://blog.jzxer.cn/20220318/healthyManager-1/"/>
    <id>https://blog.jzxer.cn/20220318/healthyManager-1/</id>
    <published>2022-03-18T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<h2 id="第一节-概述"><a href="#第一节-概述" class="headerlink" title="第一节 概述"></a>第一节 概述</h2><h3 id="1、健康管理的定义和特点"><a href="#1、健康管理的定义和特点" class="headerlink" title="1、健康管理的定义和特点"></a>1、健康管理的定义和特点</h3><p>定义：健康管理是在控制健康风险这个需求的基础上对健康资源进行计划、组织、指挥、协调和控制的过程，也就是对个体和群体健康进行全面监测、分析、评估、提供健康咨询和指导对健康危险行为精心干预的过程</p><p><strong>健康管理服务特点：标准化、量化、个体化和系统化</strong></p><p>传统诊治模式：生物 - 医学模式<br>社会支持的健康为中心的管理模式：生物 - 心理 - 社会模式</p><p>健康管理中 <strong>管理的概念</strong>：</p><blockquote><p>包括制订战略计划和目标、管理资源、使用完成任务所需要的人力和财务资本以及衡量结果的组织过程。其目的是节约资源，节省时间，充分利用、发挥现有设备技术的作用和人的积极性，<strong>帮助用户以最小的投入获取最大的收益</strong></p></blockquote><h4 id="健康管理的目标"><a href="#健康管理的目标" class="headerlink" title="健康管理的目标"></a>健康管理的目标</h4><ol><li>完善健康和福利</li><li>减少健康危险因素</li><li>预防疾病高危人群患病</li><li>易化疾病早期诊断</li><li>增加临床效用效率</li><li>避免可预防的疾病相关并发症的发病</li><li>消除或减少无效或不必要的医疗服务</li><li>对疾病结局做出度量并提供持续的评估和改进</li></ol><h4 id="大事记"><a href="#大事记" class="headerlink" title="大事记"></a>大事记</h4><ol><li><p>1948 年：世界卫生组织宪章中首次提出三维健康概念：</p><ul><li>‘健康不仅仅是没有疾病和虚弱，而是一种身体，心理和社会的完好状态’</li></ul></li><li><p>1978 年：WHO 通过《阿拉图木宣言》重申健康概念的内涵：</p><ul><li>健康不仅仅是没有疾病和痛苦，而是包括身体，心理和社会功能各方面完好的状态</li></ul></li><li><p>《渥太华宪章》健康概念表述为：</p><ul><li>良好的健康是社会、经济和个人发展的重要资源</li></ul></li><li><p>1984 年：《保健大宪章》中将健康概念表述为：</p><ul><li>健康不仅仅是没有疾病和虚弱，而是包括身体、心理和社会适应能力的完好状态</li></ul></li><li><p>1989 年：WHO 指出健康应该是：</p><ul><li>生理、心理、社会适应和道德方面的良好状态</li></ul></li></ol><h3 id="2、健康管理的理论与时间溯源"><a href="#2、健康管理的理论与时间溯源" class="headerlink" title="2、健康管理的理论与时间溯源"></a>2、健康管理的理论与时间溯源</h3><p>健康管理的<strong>指导思想</strong>：治未病</p><blockquote><p>出自《黄帝内经》：圣人不治已病治未病，不治已乱治未乱，此之谓也。<br>魏文王问扁鹊，他如是说：上工治未病、中工治欲病、下工治已病</p></blockquote><h4 id="保健体系的发展阶段"><a href="#保健体系的发展阶段" class="headerlink" title="保健体系的发展阶段"></a>保健体系的发展阶段</h4><p><img src="/img/gallery/2024/healthy-1-7.png" alt="保健体系的发展阶段"></p><h3 id="3、健康管理在美国的应用"><a href="#3、健康管理在美国的应用" class="headerlink" title="3、健康管理在美国的应用"></a>3、健康管理在美国的应用</h3><p><img src="/img/gallery/2024/healthy-1-8.png" alt="健康管理在美国的应用"></p><h3 id="4、健康管理的科学基础"><a href="#4、健康管理的科学基础" class="headerlink" title="4、健康管理的科学基础"></a>4、健康管理的科学基础</h3><h4 id="疾病的发生、发展过程及干预策略"><a href="#疾病的发生、发展过程及干预策略" class="headerlink" title="疾病的发生、发展过程及干预策略"></a>疾病的发生、发展过程及干预策略</h4><p>其中处于【进入疾病危险状态】、【发生早期改变】、【出现临床症状】 阶段都能够进行预防干预<br>【出现临床症状】、【疾病】阶段能进行临床干预</p><p><img src="/img/gallery/2024/healthy-1-1.png" alt="发展过程及干预策略"></p><h4 id="慢性病的相关危险因素"><a href="#慢性病的相关危险因素" class="headerlink" title="慢性病的相关危险因素"></a>慢性病的相关危险因素</h4><p>通过下图，可以看到，慢性病的发病因素，60-70%的概率来自于【膳食与生活方式】<br><img src="/img/gallery/2024/healthy-1-2.png" alt="慢性病的相关危险因素"></p><h3 id="5、健康管理的基本步骤"><a href="#5、健康管理的基本步骤" class="headerlink" title="5、健康管理的基本步骤"></a>5、健康管理的基本步骤</h3><p><img src="/img/gallery/2024/healthy-1-5.png" alt="健康管理的基本步骤"></p><h3 id="6、健康管理的服务流程"><a href="#6、健康管理的服务流程" class="headerlink" title="6、健康管理的服务流程"></a>6、健康管理的服务流程</h3><p><img src="/img/gallery/2024/healthy-1-6.png" alt="健康管理的服务流程"></p><h3 id="7、提供健康管理服务的机构"><a href="#7、提供健康管理服务的机构" class="headerlink" title="7、提供健康管理服务的机构"></a>7、提供健康管理服务的机构</h3><h2 id="第三节-健康管理的基本策略"><a href="#第三节-健康管理的基本策略" class="headerlink" title="第三节 健康管理的基本策略"></a>第三节 健康管理的基本策略</h2><p>通过健康评估和控制健康风险，达到维护健康的目的。<br><img src="/img/gallery/2024/healthy-1-3.png" alt="健康管理的基本策略"></p><h3 id="健康管理步骤"><a href="#健康管理步骤" class="headerlink" title="健康管理步骤"></a>健康管理步骤</h3><h4 id="第一步：信息采集"><a href="#第一步：信息采集" class="headerlink" title="第一步：信息采集"></a>第一步：信息采集</h4><h4 id="第二步：健康风险评估"><a href="#第二步：健康风险评估" class="headerlink" title="第二步：健康风险评估"></a>第二步：健康风险评估</h4><p>主要作用：</p><ol><li>帮助个体综合认识健康因素</li><li>鼓励和帮助人们修正不健康的行为</li><li>制定个体化健康干预措施</li><li>评价干预措施的有效性</li><li>对人群进行分层管理，筛选高危人群，进行分层管理</li><li>其它，如在健康保险行业的核保等</li></ol><p>健康危险因素（使人群发病和死亡风险升高），常见慢性病及其共同危险因素之间的内在关系见下图：<br><img src="/img/gallery/2024/healthy-1-4.png" alt="常见慢性病及其共同危险因素之间的内在关系"></p><h4 id="第三步：健康干预"><a href="#第三步：健康干预" class="headerlink" title="第三步：健康干预"></a>第三步：健康干预</h4><p>主要干预方式：膳食指导、运动干预、心理疏导、戒烟限酒</p><h4 id="第四步：干预效果评估"><a href="#第四步：干预效果评估" class="headerlink" title="第四步：干预效果评估"></a>第四步：干预效果评估</h4><p>评估层面：</p><ol><li>健康知识信念</li><li>生活习惯、行为</li><li>生理指标</li><li>未来患病、死亡危险性</li></ol><h3 id="健康管理与相关学科关系"><a href="#健康管理与相关学科关系" class="headerlink" title="健康管理与相关学科关系"></a>健康管理与相关学科关系</h3><p>大预防医学概念：三级预防<br>健康教育<br>流行病学</p><h3 id="健康管理服务流程"><a href="#健康管理服务流程" class="headerlink" title="健康管理服务流程"></a>健康管理服务流程</h3><ol><li>问卷调查&amp;健康体检</li><li>健康评估</li><li>个人健康管理咨询</li><li>个人健康管理后续服务</li><li>专项的健康及疾病管理服务</li></ol><h3 id="提供健康管理服务的机构"><a href="#提供健康管理服务的机构" class="headerlink" title="提供健康管理服务的机构"></a>提供健康管理服务的机构</h3><ol><li>健康保险公司、健康管理公司</li><li>医院保健和健康管理部门</li><li>医院和民营健康体检机构</li><li>社区医疗卫生服务机构</li><li>机关单位、企业、部队、学校医务室</li></ol><h3 id="健康管理行业面临的问题"><a href="#健康管理行业面临的问题" class="headerlink" title="健康管理行业面临的问题"></a>健康管理行业面临的问题</h3><ol><li>可持续的商业模式</li><li>有效的健康干预管理方法、工具、技术<ul><li>目的是治未病，不要等到后面问题出现了，才去注意到这些问题</li></ul></li><li>科学研究、学科建设</li><li>政策研究：健康产业</li></ol>]]></content>
    
    
    <summary type="html">定义：健康管理是在控制健康风险这个需求的基础上对健康资源进行计划、组织、指挥、协调和控制的过程，也就是对个体和群体健康进行全面监测、分析、评估、提供健康咨询和指导对健康危险行为精心干预的过程...</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="健康管理师" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86%E5%B8%88/"/>
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>2. 临床医学</title>
    <link href="https://blog.jzxer.cn/20220318/healthyManager-2/"/>
    <id>https://blog.jzxer.cn/20220318/healthyManager-2/</id>
    <published>2022-03-18T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.302Z</updated>
    
    <content type="html"><![CDATA[<h2 id="第一节：概述"><a href="#第一节：概述" class="headerlink" title="第一节：概述"></a>第一节：概述</h2><h3 id="1-临床医学学科分类（重点）"><a href="#1-临床医学学科分类（重点）" class="headerlink" title="1. 临床医学学科分类（重点）"></a>1. 临床医学学科分类（重点）</h3><p>由于人类的<strong>疾病繁多，</strong>依据术业有专攻，所以将各个医学板块按以下方案分类</p><p><strong>① 按治疗手段建立的学科</strong><br>内科学、外科学、理疗学、放射治疗学、核医学</p><p><strong>② 按治疗对象建立的学科</strong><br>老年医学、围生医学、职业病学</p><p><strong>③ 按人体系统或解剖</strong><br>口腔医学、皮肤性病学、眼科学、心血管内科、<strong>呼吸内科</strong>、泌尿外科、胸外科</p><p><strong>④ 按病种建立</strong><br>结核病学、肿瘤学、<strong>精神病学</strong></p><p><strong>⑤ 按诊断手段</strong><br><strong>临床病理学</strong>、医学检验学</p><p><strong>Q：临床医学专科化带来的问题</strong></p><ol><li>重治疗，轻预防</li><li>关注疾病而忽视患者</li><li>关注本专科的问题而忽视其它专科问题</li><li>难以提供连续性的照顾</li><li>医疗费用急剧升高</li></ol><blockquote><p>20 世纪中后期，由于<strong>疾病谱的改变和人口老龄化</strong>这些问题的出现，从而导致<strong>全科医学</strong> 或 <strong>家庭医学</strong> 的诞生。</p></blockquote><h3 id="2-临床医学的主要特征（重点）"><a href="#2-临床医学的主要特征（重点）" class="headerlink" title="2. 临床医学的主要特征（重点）"></a>2. 临床医学的主要特征（重点）</h3><ol><li>临床医学研究和服务对象是人</li><li>临床工作具有探索性：显著区别</li><li>临床医学 <strong>启动</strong>医学研究</li><li>临床医学 <strong>检验</strong> 医学成功</li></ol><h3 id="3-临床医学的发展趋势"><a href="#3-临床医学的发展趋势" class="headerlink" title="3. 临床医学的发展趋势"></a>3. 临床医学的发展趋势</h3><ol><li>微观深入与宏观拓展（生物-心理-社会医学模式）</li><li>学科体系分化与综合（围生医学）</li><li>医学与高科技的结合日趋密切<ol><li>诊断方面：计算机处理技术</li><li>治疗方面：基因工程技术、内镜操作手术、基因治疗</li></ol></li></ol><h3 id="4-循证医学"><a href="#4-循证医学" class="headerlink" title="4. 循证医学"></a>4. 循证医学</h3><ul><li>目前公认最可靠的依据是来自 <strong>随机对照实验</strong> 的证据</li><li>目前，循证医学的代表性成果，是大量 <strong>临床指南</strong> 的制订和实施</li><li>传统医学较少考虑卫生经济学，循证医学将 <strong>成本效果分析</strong> 作为一个重要的内容列入</li></ul><h2 id="第二节：现代医学主要诊断方法和技术"><a href="#第二节：现代医学主要诊断方法和技术" class="headerlink" title="第二节：现代医学主要诊断方法和技术"></a>第二节：现代医学主要诊断方法和技术</h2><h3 id="1-问诊和病史采集（重点）"><a href="#1-问诊和病史采集（重点）" class="headerlink" title="1. 问诊和病史采集（重点）"></a>1. 问诊和病史采集（重点）</h3><p>问诊内容主要包括：</p><ol><li>患者一般情况</li><li>主诉</li><li>现病史</li><li>既往史：换病史、外伤手术、过敏、预防注射</li><li>个人史和家族史，女性还应该包括月经史和生育史</li></ol><h3 id="2-体格检查"><a href="#2-体格检查" class="headerlink" title="2. 体格检查"></a>2. 体格检查</h3><ul><li>通过体格检查发现的客观改变即 <strong>体征</strong></li><li><strong>体格检查的基本方法包括（望闻问切）：</strong><ul><li><strong>视诊</strong></li><li><strong>触诊</strong></li><li><strong>叩诊</strong></li><li><strong>听诊</strong></li></ul></li></ul><h3 id="3-实验诊断"><a href="#3-实验诊断" class="headerlink" title="3. 实验诊断"></a>3. 实验诊断</h3><p>临床实验室检查主要内容：</p><h4 id="①-血液学检验"><a href="#①-血液学检验" class="headerlink" title="① 血液学检验"></a>① 血液学检验</h4><p>血常规，网织红细胞检测、红细胞沉淀率检测等（<strong>不包括微量元素</strong>）</p><h4 id="②-体液与排泄物检验"><a href="#②-体液与排泄物检验" class="headerlink" title="② 体液与排泄物检验"></a>② 体液与排泄物检验</h4><p>对尿、粪便各种体液以及胃液、脑脊液、胆汁等排泄物、分泌液的常规检验（<strong>不包括微量元素</strong>），尿液一般检测包括：</p><ol><li>一般性状检测：尿量、气味、外观、比重、酸碱度等</li><li>化学检测：尿蛋白、尿糖、尿酮体、尿胆原、尿胆红素等</li><li>尿沉渣（显微镜）检测：细胞、管型、结晶体等</li></ol><h4 id="③-生化学检验"><a href="#③-生化学检验" class="headerlink" title="③ 生化学检验"></a>③ 生化学检验</h4><p><strong>肝功能检测</strong> 实验<br>通常包括血清总蛋白和白蛋白&#x2F;球蛋白比值测定、血清蛋白电泳、血清总胆红素测定、血清结合胆红素和非结合胆红素测定、血清丙氨酸氨基转移酶（ALT）和天门冬氨酸氨基转移酶（AST）、碱性磷酸酶（ALP）、γ-故氨酰转移酶等</p><p><strong>肾功能检测</strong> 包括：</p><ol><li>肾小球过滤功能，常用的指标有血清肌酐测定、血尿素氮测定</li><li>肾小球重吸收、酸化等功能</li></ol><h4 id="④-免疫学检验"><a href="#④-免疫学检验" class="headerlink" title="④ 免疫学检验"></a>④ 免疫学检验</h4><ul><li>主要包括免疫功能检查、临床血清学检查，肿瘤标志物（肿瘤发生时会升高，但正常组织，良性肿瘤也存在；肝癌甲胎蛋白），前列腺癌特异性抗原等的临床免疫学检测检验</li><li>绝大多数肿瘤标志物肌醇在与恶性肿瘤，也存在于良性肿瘤和正常组织</li></ul><h4 id="⑤-病原学检验：细菌"><a href="#⑤-病原学检验：细菌" class="headerlink" title="⑤ 病原学检验：细菌"></a>⑤ 病原学检验：细菌</h4><p><strong>实验诊断的临床应用和评价</strong></p><ul><li>正确选择实验室检测项目</li><li>有的检测可直接得到确定的诊断</li><li>有些检测可有辅助诊断价值，如：肝病或肾病进行肝、肾功能的检查</li><li>有些具有鉴别诊断意义：比如发热患者白细胞和中性粒细胞比值增高，考虑化脓性感染</li></ul><p><strong>实验诊断的参考范围确定</strong><br>参考值是指对抽样的个体进行某项目检测所得的值</p><h3 id="4-医学影像检查"><a href="#4-医学影像检查" class="headerlink" title="4. 医学影像检查"></a>4. 医学影像检查</h3><h4 id="①-X-线成像（重点）"><a href="#①-X-线成像（重点）" class="headerlink" title="① X 线成像（重点）"></a>① X 线成像（重点）</h4><blockquote><p>呼吸系统、循环系统、消化系统、骨关节系统</p></blockquote><p>疾病 X 线图像变化：</p><ol><li>大小改变（心影增大）</li><li>位置改变（关节脱位）</li><li>形态改变（炎症、肿瘤）</li><li>轮廓改变（心包病）</li><li>密度改变（肺内渗出、肿瘤）</li><li>功能改变（心脏搏动减弱）</li></ol><h4 id="②-CT-检查（重点）"><a href="#②-CT-检查（重点）" class="headerlink" title="② CT 检查（重点）"></a>② CT 检查（重点）</h4><p>CT 检查优缺点：</p><ul><li>优点：CT 图像为人体组织端面像，其密度分辨率明显优于 X 线检查图像，能良好地显示人体内各部委的额器官结构，除发现形态改变外，还能检查组织的<strong>密度变化</strong>，扩大了影像学的检查范围</li><li>缺点：CT 检查是有射线的检查方法，较难发现器官组织结构的功能变化，个别部位如颅底部<strong>骨伪影</strong>可影响后颅凹脑组织检查，因成像野的限制，<strong>不宜检查四肢小关节</strong>，难以显示空腔器官的黏膜变化；做强化扫描时有造影剂的<strong>不良反应</strong>存在</li></ul><h4 id="③-超声成像（重点）"><a href="#③-超声成像（重点）" class="headerlink" title="③ 超声成像（重点）"></a>③ 超声成像（重点）</h4><p>种类：A 超、B 超、多普勒超声，超声光点扫描法</p><p>主要用途：</p><ol><li>检测实质性<strong>脏器</strong>的大小，形态及物理特性</li><li>检测某些囊性器官（如胆囊、胆道、膀胱和胃等）的形态，走向及功能状态</li><li>检测<strong>心脏</strong>，大血管和外周血管的结构，功能及血流动力学状态</li><li>检测脏器内各种<strong>占位性病变</strong>的物理特性</li><li>检测<strong>积液</strong>（如胸腔积液、心包积液、肾孟积液及脓肿等）的存在与</li><li>产科上可确定妊娠；确定胎龄</li><li>在超声引导下进行穿刺做针吸细胞学或组织<strong>活检</strong></li></ol><h4 id="④-磁共振成像（重点）"><a href="#④-磁共振成像（重点）" class="headerlink" title="④ 磁共振成像（重点）"></a>④ 磁共振成像（重点）</h4><p>方法：平扫、强化扫描、MRI 特殊成像技术</p><ul><li>优点：MRI 图像<strong>无射线</strong>损害；通过梯度场合</li><li>缺点：</li></ul><h3 id="5-其它临床辅助检查"><a href="#5-其它临床辅助检查" class="headerlink" title="5. 其它临床辅助检查"></a>5. 其它临床辅助检查</h3><h4 id="①-心电图检查（非影像学检查）"><a href="#①-心电图检查（非影像学检查）" class="headerlink" title="① 心电图检查（非影像学检查）"></a>① 心电图检查（非影像学检查）</h4><ul><li>由于心电图主要反应心脏激动的电学活动，因此对各种心律失常和传导障碍的诊断分析具有肯定价值</li><li>特征性的心电图改变和演变是诊断心肌梗死可靠而实用的方法</li></ul><h4 id="②-核医学检查"><a href="#②-核医学检查" class="headerlink" title="② 核医学检查"></a>② 核医学检查</h4><h4 id="③-内镜检查"><a href="#③-内镜检查" class="headerlink" title="③ 内镜检查"></a>③ 内镜检查</h4><p>内镜应用最广者是消化道和支气管的检查</p><h2 id="第三节：现代医学主要治疗方法"><a href="#第三节：现代医学主要治疗方法" class="headerlink" title="第三节：现代医学主要治疗方法"></a>第三节：现代医学主要治疗方法</h2><h3 id="①-药物治疗"><a href="#①-药物治疗" class="headerlink" title="① 药物治疗"></a>① 药物治疗</h3><p>是最常用和最主要的治疗方法</p><p>药品的定义为：用于预防、治疗、诊断人的疾病，有目的地调节人的生理功能并规定有适应症或者功能主治、用法和用量的物质…</p><h4 id="药物选择原则"><a href="#药物选择原则" class="headerlink" title="药物选择原则"></a>药物选择原则</h4><ol><li>根据疾病的<strong>严重程度</strong>选择用药</li><li>根据药物<strong>药动学和药效学</strong>的特点选择药物：药物吸收分布代谢差异导致治疗作用差异，利用药动学和药效学的重要参数进行定性和定量的结合，可帮助选择有效、合理的药物</li><li>根据患者的<strong>个体差异</strong>来选择用药</li><li>根据药物的价格和效应来选择用药：即<strong>比较药物治疗的成本、效果</strong></li></ol><h4 id="合理用药（重点）"><a href="#合理用药（重点）" class="headerlink" title="合理用药（重点）"></a>合理用药（重点）</h4><p>药源性疾病：医源性疾病的一种，多由药物滥用和选药不当引起。氛围一下几类：</p><ul><li><strong>甲型</strong>：量效关系密切，与药物本身有关，多可预测，发生率搞，但死亡率低</li><li><strong>乙型</strong>：量效关系不密切，与人体特异体质有关，难以预测，发生率低，死亡率高，如变态反应；</li><li>长期用药致病型：如催眠药、解压药</li><li>药后效应型：致畸，致癌的性激素类药物</li></ul><h4 id="抗生素的合理用药：合理选药和合理给药"><a href="#抗生素的合理用药：合理选药和合理给药" class="headerlink" title="抗生素的合理用药：合理选药和合理给药"></a>抗生素的合理用药：合理选药和合理给药</h4><p>当病情重危时则应根据患者的感染部位，可能感染的菌群来选用<strong>抗菌谱较广</strong>的药物<br>对于病毒性感冒，无论严重程度如何都不能用抗生素<br>可适用于细菌性感冒</p><h3 id="②-手术治疗"><a href="#②-手术治疗" class="headerlink" title="② 手术治疗"></a>② 手术治疗</h3><h4 id="不利影响（重点）"><a href="#不利影响（重点）" class="headerlink" title="不利影响（重点）"></a>不利影响（重点）</h4><ol><li>局部损伤如疤痕</li><li>全身系统影响如能量代谢增强</li><li>并发症如术后出血</li></ol><h3 id="③-介入治疗（重点）"><a href="#③-介入治疗（重点）" class="headerlink" title="③ 介入治疗（重点）"></a>③ 介入治疗（重点）</h3><p>在医学影像或内镜导向下，利用经皮穿刺和导管技术，通过药物、物理、化学等手段直接消除或减轻局部病变，从而达到治疗目的。具有微创、可重复性强、定位准确等特点</p><p>包括血管性、非血管性和内镜下的介入技术</p><p><strong>对有些疾病，疗效由于传统治疗</strong></p><h3 id="④-放射治疗（伽马刀疗法）"><a href="#④-放射治疗（伽马刀疗法）" class="headerlink" title="④ 放射治疗（伽马刀疗法）"></a>④ 放射治疗（伽马刀疗法）</h3><h4 id="生物效应"><a href="#生物效应" class="headerlink" title="生物效应"></a>生物效应</h4><ol><li>直接损伤（作用于 DNA）</li><li>间接损伤（作用于水分子，产生自由基，进而形成过氧化氢，导致细胞氧中毒）</li></ol><h4 id="细胞死亡形式"><a href="#细胞死亡形式" class="headerlink" title="细胞死亡形式"></a>细胞死亡形式</h4><ol><li>分裂间期死亡，很少见</li><li>分裂时死亡，最多见</li></ol><p>**增殖速度不同的细胞对放射线敏感性不同，处于增殖期的细胞受射线影响，不进行分裂的细胞敏感性差</p><p>副作用：取决于不同细胞对射线的敏感性，全身反应：血液系统（白细胞降低）、胃肠系统（恶心呕吐），神经系统（乏力、瞌睡、失眠）</p><h3 id="⑤-物理疗法"><a href="#⑤-物理疗法" class="headerlink" title="⑤ 物理疗法"></a>⑤ 物理疗法</h3><blockquote><p>需要与康复治疗的物理疗法区分开</p></blockquote><ol><li>电疗</li><li>超声疗法</li><li>磁疗</li><li>生物反馈</li><li>音乐反馈</li><li>光疗</li><li>冷热治疗</li><li>水疗</li><li>高压氧疗法</li></ol><h2 id="第四节：临床医学在健康管理中的应用"><a href="#第四节：临床医学在健康管理中的应用" class="headerlink" title="第四节：临床医学在健康管理中的应用"></a>第四节：临床医学在健康管理中的应用</h2><h3 id="①-健康管理与临床医学的相互关系"><a href="#①-健康管理与临床医学的相互关系" class="headerlink" title="① 健康管理与临床医学的相互关系"></a>① 健康管理与临床医学的相互关系</h3><ol><li>临床医学是健康管理的学科基础：全面检测、健康体检</li><li>健康管理师临床医学的学科延伸<ol><li>临床医学以病人为中心，以疾病检查，诊断，治疗和康复为服务内容，以药物，诊疗设备和康复器械为服务手段，重点关注疾病的诊断和治疗</li><li>健康管理以健康为中心，以健康检测，健康评估，健康干预和健康跟踪为服务内容，以健康信息系统、生物医学技术、健康评估模型、健康干预技术，健康监测与移动可穿戴技术等为服务手段，更关注<strong>临床前期和后期</strong>的健康问题</li></ol></li><li>健康管理与临床医学的融合并存<ol><li>健康管理依靠临床医学的人才和技术开展工作，临床医学需要以健康管理来弥补自身服务方面的缺陷</li></ol></li></ol><h3 id="②-健康管理与临床医学的主要区别（重点）"><a href="#②-健康管理与临床医学的主要区别（重点）" class="headerlink" title="② 健康管理与临床医学的主要区别（重点）"></a>② 健康管理与临床医学的主要区别（重点）</h3><h4 id="1-服务目的不同"><a href="#1-服务目的不同" class="headerlink" title="1. 服务目的不同"></a>1. 服务目的不同</h4><p>健康管理以人的健康为中心，以健康风险因素检测预防或零级预防为重点，将预防作为主要目的。。。。</p><h3 id="2-服务对象不同"><a href="#2-服务对象不同" class="headerlink" title="2. 服务对象不同"></a>2. 服务对象不同</h3><p>服务对象是健康人群，亚健康人群，慢性病风险人群和慢性病早期康复人群<br>临床医学服务的对象为患有各种疾病的人群</p><h3 id="3-服务模式不同"><a href="#3-服务模式不同" class="headerlink" title="3. 服务模式不同"></a>3. 服务模式不同</h3><p>主要模式是全面检测，风险评估有效干预和连续跟踪<br>临床医学服务的主要模式是通过病史采集，体格检查和辅助检查确定诊断后，采用药物，手术，介入，放射和物理疗法等手段实施治疗</p><h3 id="③-临床医学在健康管理中的实际应用"><a href="#③-临床医学在健康管理中的实际应用" class="headerlink" title="③ 临床医学在健康管理中的实际应用"></a>③ 临床医学在健康管理中的实际应用</h3><h4 id="一、临床医学诊断方法在健康管理中的应用"><a href="#一、临床医学诊断方法在健康管理中的应用" class="headerlink" title="一、临床医学诊断方法在健康管理中的应用"></a>一、临床医学诊断方法在健康管理中的应用</h4><p>临床医学用于诊断的问诊、体格检查，实验室检查和辅助检查为健康管理信息采集提供了基本方法</p><h4 id="二、临床医学非药物疗法在健康管理中的应用"><a href="#二、临床医学非药物疗法在健康管理中的应用" class="headerlink" title="二、临床医学非药物疗法在健康管理中的应用"></a>二、临床医学非药物疗法在健康管理中的应用</h4><p>如针灸、推拿、康复理疗以及营养治疗、运动疗法和心理干预等</p><h4 id="三、临床医学指南和共识的应用"><a href="#三、临床医学指南和共识的应用" class="headerlink" title="三、临床医学指南和共识的应用"></a>三、临床医学指南和共识的应用</h4><h4 id="四、临床医学思维方法在健康管理中的应用"><a href="#四、临床医学思维方法在健康管理中的应用" class="headerlink" title="四、临床医学思维方法在健康管理中的应用"></a>四、临床医学思维方法在健康管理中的应用</h4><p>临床思维是临床医生根据患者病情，理论联系实践进行分析，综合，类比判断和鉴别诊断，并最终给出正确的决策的问题处理方法</p>]]></content>
    
    
    <summary type="html">临床医学</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="健康管理师" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86%E5%B8%88/"/>
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>人体补充营养表</title>
    <link href="https://blog.jzxer.cn/20220315/bodyNeed/"/>
    <id>https://blog.jzxer.cn/20220315/bodyNeed/</id>
    <published>2022-03-15T09:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<h2 id="人体补充营养表"><a href="#人体补充营养表" class="headerlink" title="人体补充营养表"></a>人体补充营养表</h2><p><img src="/img/gallery/2024/bodyNeed-1.jpg" alt="人体补充营养表"></p><h2 id="饮食中的维生素"><a href="#饮食中的维生素" class="headerlink" title="饮食中的维生素"></a>饮食中的维生素</h2><p><img src="/img/gallery/2024/bodyNeed-2.jpg" alt="人体补充营养表2"><br><img src="/img/gallery/2024/bodyNeed-3.jpg" alt="人体补充营养表3"></p><h2 id="饮食中的矿物质"><a href="#饮食中的矿物质" class="headerlink" title="饮食中的矿物质"></a>饮食中的矿物质</h2><p><img src="/img/gallery/2024/bodyNeed-4.jpg" alt="人体补充营养表4"><br><img src="/img/gallery/2024/bodyNeed-5.jpg" alt="人体补充营养表5"></p><h2 id="常见食物综合营养评分"><a href="#常见食物综合营养评分" class="headerlink" title="常见食物综合营养评分"></a>常见食物综合营养评分</h2><p><img src="/img/gallery/2024/bodyNeed-6.png" alt="人体补充营养表6"></p>]]></content>
    
    
    <summary type="html">人体补充营养表...</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="营养" scheme="https://blog.jzxer.cn/tags/%E8%90%A5%E5%85%BB/"/>
    
    <category term="健康" scheme="https://blog.jzxer.cn/tags/%E5%81%A5%E5%BA%B7/"/>
    
  </entry>
  
  <entry>
    <title>关于打飞机的一些观点</title>
    <link href="https://blog.jzxer.cn/20220311/aboutSy/"/>
    <id>https://blog.jzxer.cn/20220311/aboutSy/</id>
    <published>2022-03-11T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<h2 id="找到原因"><a href="#找到原因" class="headerlink" title="找到原因"></a>找到原因</h2><p>世上总有一些性欲比较强大的人，而性欲一定是通过一些点来触发的，我翻阅了一些资料，按照危害度的排名，总结有以下几个原因：</p><ol><li>喜欢看色情小说、电影等</li><li>吃蛋、韭菜、肉类</li><li>和异性的肢体接触</li><li>和别人讨论色情话题</li><li>在马路上看衣着暴露的异性</li></ol><h2 id="邪淫的症状"><a href="#邪淫的症状" class="headerlink" title="邪淫的症状"></a>邪淫的症状</h2><ol><li><p>陰陽俱虛、身體早衰。男子前列腺炎，尿細、尿白、尿不盡,會陰部疼痛，陰囊潮濕、肛門墜脹、便秘或便溏。陰莖疼痛、短小、陽痿早洩、遺精，性功能減退。女子腰酸背痛、性慾冷淡、陰蒂萎縮並伴有慢性附件炎、宮頸炎等多種婦科疾病。</p></li><li><p>神經衰弱、孤僻自卑、膽小懦弱、多疑多幻、多思多語、喜新厭舊、見異思遷、焦慮煩悶、抑鬱強迫，甚至產生自殺念頭。很多人最終被送進精神病醫院，卻不知這是手淫的結果。<br>手淫後遺症患者往往存有一定程度的心理障礙，其突出的臨床表現是焦慮、多疑、恐懼和抑鬱等症狀。由於患者焦慮不安，疑心重，聽不進別人勸告，對治療悲觀失望，身心疲憊，機體的抗病能力自然就會下降，病情就易於反复，還可以引起一系列並發症。</p></li><li><p>骨髓空洞、腦髓不滿、腦血管痙攣、氣血不足。智力、記憶力迅速減退，視力下降，眼神渾濁，視物模糊，見風流淚。頭髮慢慢脫落，牙齒腐蝕鬆動，提前掉牙。</p></li><li><p>形象猥瑣醜陋，氣質猥褻下流，臉色灰暗，痤瘡，色斑，皮膚乾燥，黑眼圈伴眼袋，形體消瘦或虛腫，雞胸駝背，口臭難聞，令人厭惡反感。</p></li><li><p>頸椎病、胸椎病、椎間盤突出、韌帶鈣化、骨質增生、肩周炎、關節疼痛、心肌缺血、胸悶氣短、頭暈目眩、失眠多夢、腰酸背痛、四肢無力、口乾舌燥、虛火上炎、冬天怕冷、夏天怕熱。</p></li></ol><h3 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h3><p>既然找到了原因，那么相对的我们就可以给与相对应的解决方案：</p><ol><li>素食主义</li><li>觀音聖號、六字大明咒、楞嚴咒</li><li>不净观：在看女生的时候，适当将她看成一个污秽腥臭的物体</li><li>增强自己的决心、毅力、控制力：不要被邪淫操纵自己的思想</li></ol><h2 id="药理学家的戒淫技巧"><a href="#药理学家的戒淫技巧" class="headerlink" title="药理学家的戒淫技巧"></a>药理学家的戒淫技巧</h2><ol><li>卧室里多放些英雄豪杰的画像，常读修身养性的书籍</li><li>睡觉的时候，必须养成上床就睡，醒来就起的习惯。切忌不能在被窝中不愿出来，容易引起淫欲。</li><li>夜间醒来，不能入睡的时候，就穿衣静坐，切忌胡思乱想，引起性欲</li><li>睡觉的时候，以侧卧为宜，仰卧和平卧都会刺激 jb 引发性欲。无论同性或者异性，在结婚前尽量不要同床</li><li>早起把自己放到新鲜空气的环境下，做适当运动，并用冷水洗脸或者其它地方，则精神清明。</li><li>jb 必须保持清洁，防止受到刺激。</li><li>内裤经历用柔软单薄的织物</li><li>不要忍耐大便和小便，都可能引起 jb 充血，引发淫欲</li><li>将心思放在正当的学业与课外活动中，不要让自己无所事事，所谓蓋逸則思淫，勞則忘欲</li><li>戒除一切刺激性食物：酒类、香料、浓茶、浓咖啡、一些甲壳类动物、兴奋性药物。</li><li>戒除黄色小说、影片、音频</li><li>睡觉的时候产生性欲了，无法抑制，可以把 jb 泡在冷水里面，或者起床盘膝而坐，冥想 5-10 分钟，待脑中性欲消除再入睡。</li></ol><p>待补充…</p>]]></content>
    
    
    <summary type="html">世上总有一些性欲比较强大的人，而性欲一定是通过一些点来触发的，我翻阅了一些资料，按照危害度的排名，总结有以下几个原因...</summary>
    
    
    
    <category term="健康管理" scheme="https://blog.jzxer.cn/categories/%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="手淫" scheme="https://blog.jzxer.cn/tags/%E6%89%8B%E6%B7%AB/"/>
    
    <category term="打飞机" scheme="https://blog.jzxer.cn/tags/%E6%89%93%E9%A3%9E%E6%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>关于大脑进入心流状态</title>
    <link href="https://blog.jzxer.cn/20220111/aboutMind/"/>
    <id>https://blog.jzxer.cn/20220111/aboutMind/</id>
    <published>2022-01-11T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<h2 id="问题背景"><a href="#问题背景" class="headerlink" title="问题背景"></a>问题背景</h2><p>![心流是什麼？心理學家發現：想快樂、提升幸福感，這個狀態是關鍵,人的大脑无时不刻都在思考，放在曾经，总会出现一些创造性的 idea。</p><p>但是为什么现代人，总是会失去创造性呢？</p><p>我提出一个假设，信息量杂糅，外界的干扰容易使人无法进入 deep 的心流状态</p><p>比如：你在认真看着一本书，或者在学习着什么内容。正准备进入心流状态，但是突然边上有人叫了我一下，或者是手机消息来了震动了一下。<br>心流的状态就断了。重新开始，又需要重新去酝酿心流的状态，但是这是一个非常耗费能量的事情。</p><p>一心不可二用是有道理的，大脑在处理一类信息的时候，就像给水杯倒龙井茶，突然外界的因素干扰，掺入了一点白酒，这就会导致这杯茶不纯正。</p><h2 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h2><p>尽量让自己做事情专注，最好能创建一个完全的自我世界，它包括：视觉、听觉、嗅觉。让感官都处于一件事情上，能加深当前这件事的印象，并对这件事的思考深度有大帮助。</p>]]></content>
    
    
    <summary type="html">人的大脑无时不刻都在思考，放在曾经，总会出现一些创造性的idea...</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="思考" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E8%80%83/"/>
    
    <category term="大脑" scheme="https://blog.jzxer.cn/tags/%E5%A4%A7%E8%84%91/"/>
    
  </entry>
  
  <entry>
    <title>20240410开始了自媒体的征途</title>
    <link href="https://blog.jzxer.cn/20220111/20240408_firstPostIn2024/"/>
    <id>https://blog.jzxer.cn/20220111/20240408_firstPostIn2024/</id>
    <published>2022-01-11T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.304Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>2024年4月9日，我发布了第一篇关于前端的一个文章，也从今天开始正式开启了关于技术科学类是媒体的征途，目标很明确，做一个咨询顾问前端领域的达人，我知道这条路需要很久，但是我会一直坚持下去，直到看到收益的那一天</p><p>在这个过程中，我会碰到很多的问题，很多的阻碍我也会因为很多的问题和阻碍可能会停下脚步，但是坚信自己一定能够坚持下去，每天都要有一些反思和总结，每天都要比昨天更进步一点，比如今天我就比昨天进步了很多，我迈出了很久我想迈出的那一步</p><h2 id="坎坷"><a href="#坎坷" class="headerlink" title="坎坷"></a>坎坷</h2><p>在录制的过程中，其实还挺坎坷的，比如说第一次录制的时候关机了，第二次录制的时候没有开声音，我知道在这个过程中会有各种各样的类似这一类的阻碍，但是千万不要灰心，不要放弃，不要认为这是一种预告，说你不能够成功。</p><p>你要把它作为一种考验，上天给你考验你就要去度过这个考验，你只有度过了才能得到认可，就像昨天看的视频里说的内容一样： 你只有不断地经历痛苦，不断地经历磨难，你才能够成长。人的一生就是在经历痛苦和磨难才能够将你这个雕塑打磨成一个更加精致更加完美的一个意识形态。</p><h2 id="2024年11月13日：自省"><a href="#2024年11月13日：自省" class="headerlink" title="2024年11月13日：自省"></a>2024年11月13日：自省</h2><p>没想到时间过得这么快，半年过去了，一直说是要做自媒体这件事情，但是最后还是拖延着，前段时间刚看完《拖延心里学》和《财富自由之路》。</p><p>再加上十月份离职了，心里还是挺感慨的，那个时候定下了一个目标，也希望自己向这个目标前进，但是为什么一直没有达到这个目标，或者说是一直在拖延？</p><p>我其实也总结了几条，比如对成功的恐惧和对时间的一种错误认知。</p><p>对成功的恐惧来源于如果我全力以赴做了一件事情，是不是说我以后会很忙，会没有时间玩儿，没有时间干自己喜欢的事儿，没有时间睡觉，成天就在工作。这种状态让我无法去把这件事情做到 100% 的付出努力。</p><p>对于时间的错误观念是，主观时间和客观时间的一种识别，比如客观时间是世界统一的，而主观时间每个人都不一样，我糟糕的点就在于主观时间意识太强，在某个时间节点就应该做那个时间节点应该做的事情，比如 8 点就要吃饭，1 点就要午休，12 点之前就要睡觉。这个行为在传统价值观来说，是 ok 的，但是如果对一个想要追求成功和成就的人来说是致命的。因为大多数成功的人，他们可以说没有主观时间，他们沉浸在自己做的事情里。把事情做好才是他们第一看中的事情，所以他们在做事情的时候就很容易进入心流状态，从而 100% 的投入。</p><p>认识到这些问题，就应该去改变了，它是个问题，但是是不是值得，其实直到今天，我也还在探索，不能说我完全不去执行，但是我在尝试。尝试能忘记时间的状态下做事情，专注事情。看看它对生活是否有很大的改变。时间会告诉我答案。</p><p>我知道自媒体这条路还有很长要走，但是无论如何，先做吧。万一呢？半途而废才是最可怕的。</p>]]></content>
    
    
    <summary type="html">20240410开始了自媒体的征途，目标是咨询顾问，领域达人</summary>
    
    
    
    <category term="自媒体" scheme="https://blog.jzxer.cn/categories/%E8%87%AA%E5%AA%92%E4%BD%93/"/>
    
    
    <category term="自媒体" scheme="https://blog.jzxer.cn/tags/%E8%87%AA%E5%AA%92%E4%BD%93/"/>
    
    <category term="里程碑" scheme="https://blog.jzxer.cn/tags/%E9%87%8C%E7%A8%8B%E7%A2%91/"/>
    
    <category term="咨询顾问" scheme="https://blog.jzxer.cn/tags/%E5%92%A8%E8%AF%A2%E9%A1%BE%E9%97%AE/"/>
    
  </entry>
  
  <entry>
    <title>迷你开发板-nano Xiao</title>
    <link href="https://blog.jzxer.cn/20220111/20250102_atm_xiao/"/>
    <id>https://blog.jzxer.cn/20220111/20250102_atm_xiao/</id>
    <published>2022-01-11T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.306Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>之前一直在玩 esp32-c3，对这种超级迷你的开发板真的情有独钟，可爱中透漏着一种高级感。再加上它简约又不失霸气的名字 – 晓（xiao）。让我无法自拔的爱上这个板子。</p><p>由于本人不是很喜欢arduino-ide，所以这篇文章主要用来记录我接触 xiao 在 platformIO 上拿它做的一些基本功能,和在开发过程中的一些注意事项。</p><h2 id="引脚介绍"><a href="#引脚介绍" class="headerlink" title="引脚介绍"></a>引脚介绍</h2><p>其中3、5、6、9、11 支持 pwm</p><img src="https://oss.jzxer.cn/blog/O1CN01OPcXLF1glrgwxVS2W_!!2207299744183.png" alt="引脚介绍" style="zoom:50%;" /><blockquote><p>这块开发板由于只是引出了一些重要的引脚，所以在背后还有8个拓展引脚提供使用，但是需要自己焊接引线</p></blockquote><h2 id="环境配置"><a href="#环境配置" class="headerlink" title="环境配置"></a>环境配置</h2><p>由于这个开发板和 arduino nano 是同一个atmega328芯片，所以这里需要选择 nano 作为开发板环境，platformio.ini基本参数如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[env:nanoatmega328]</span><br><span class="line">platform = atmelavr</span><br><span class="line">board = nanoatmega328</span><br><span class="line">framework = arduino</span><br></pre></td></tr></table></figure><blockquote><p>注意：不要选新版本，新版本后面会显示：new bootloader</p></blockquote><h2 id="代码参考"><a href="#代码参考" class="headerlink" title="代码参考"></a>代码参考</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Arduino.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Adafruit_NeoPixel.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PIN A2</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> NUMPIXELS 4</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> DELAYVAL 500</span></span><br><span class="line"></span><br><span class="line"><span class="function">Adafruit_NeoPixel <span class="title">pixels</span><span class="params">(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="meta">#<span class="keyword">if</span> defined(__AVR_ATtiny85__) &amp;&amp; (F_CPU == 16000000)</span></span><br><span class="line">  <span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line">  pixels.<span class="built_in">begin</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  pixels.<span class="built_in">clear</span>();</span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; NUMPIXELS; i++)</span><br><span class="line">  &#123;</span><br><span class="line">    pixels.<span class="built_in">setPixelColor</span>(i, pixels.<span class="built_in">Color</span>(<span class="number">0</span>, <span class="number">150</span>, <span class="number">0</span>));</span><br><span class="line">    pixels.<span class="built_in">show</span>();</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>由于这块开发板是超级迷你的，所以引脚数量有限，所以很多外设需要自己焊接引线，但是它的优势就是超级迷你，适合做很多小项目。</p>]]></content>
    
    
    <summary type="html">https://oss.jzxer.cn/blog/O1CN01WLVf6M1glrgopbMxX_!!2207299744183.png</summary>
    
    
    
    <category term="自媒体" scheme="https://blog.jzxer.cn/categories/%E8%87%AA%E5%AA%92%E4%BD%93/"/>
    
    
    <category term="arduino" scheme="https://blog.jzxer.cn/tags/arduino/"/>
    
    <category term="platformIO" scheme="https://blog.jzxer.cn/tags/platformIO/"/>
    
  </entry>
  
  <entry>
    <title>关于失眠</title>
    <link href="https://blog.jzxer.cn/20210829/aboutInsomnia/"/>
    <id>https://blog.jzxer.cn/20210829/aboutInsomnia/</id>
    <published>2021-08-29T14:36:40.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<h2 id="什么是失眠？它的定义是什么？"><a href="#什么是失眠？它的定义是什么？" class="headerlink" title="什么是失眠？它的定义是什么？"></a>什么是失眠？它的定义是什么？</h2><p>根据百度百科的回答：失眠是指无法入睡或无法保持睡眠状态，导致睡眠不足。又称入睡和维持睡眠障碍，为各种原因引起入睡困难、睡眠深度或频度过短、早醒及睡眠时间不足或质量差等，是一种常见病。</p><h2 id="人为什么会失眠？"><a href="#人为什么会失眠？" class="headerlink" title="人为什么会失眠？"></a>人为什么会失眠？</h2><blockquote><p>我这只分析，从我的角度出发，出现失眠症状的根本原因。不代表官方权威。</p></blockquote><p>从抽象层面分析，我们可以把人的大脑分为【意识】和【潜意识】两部分，并且我们知道，人即使是在睡眠的时候大脑也是不会停止工作的（大脑停止工作，等于真正意义上的死亡）。所以即使在睡觉的时候，大脑的潜意识也在不停的处理事务。有两个方面可以很好的描述这个过程，一个是做梦，也就是人们常说的日有所思，夜有所梦。另一个是很多人可能碰到过的场景：当时有一个问题困扰着我，但是我睡一晚，第二天醒来这个事情就想通了。《阿基米德称金子》就是一个典型的梦里解决问题的案例。</p><p>那么人为什么会失眠呢？我们从【意识】和【潜意识】来分析，所谓【意识】，是你大脑当下思考的东西；而【潜意识】，则是曾经的经历产生的经验，它在你的脑海里，但是你此刻没有去想这个东西。</p><p>那么综上我就可以认为，失眠，是因为你在睡觉的时候自认为放空了自己的大脑，当下没有想任何事情，但是还是睡不着，原因是你只处理了【意识】层面的这个部分，你的【潜意识】层还在不停的工作。【潜意识】其是在不断循环那些【好的回忆】，【不好的回忆】，并且循环这件事是会加深印象的。所以长时间【潜意识】的超载思考就会让你失眠。</p><p>另外，如果长时间的失眠，证明当下你的【潜意识】层有很多东西放不下，大多数这些是不好的回忆。那就会引发另外一个症状——【抑郁症】，关于这个我这里不做过多的描述。要写可能还要很长一段才能写完。</p><blockquote><p>有很多人把【抑郁症】形容为心灵上的感冒，他们认为是可能是因为人体的内分泌紊乱导致的。这里我从另外一个角度去分析这件事。</p></blockquote><h2 id="题外话"><a href="#题外话" class="headerlink" title="题外话"></a>题外话</h2><p>很多人都认为【意识】不断重复，对一件事情记忆就会不断深刻。事实上是，如果这件事没有下沉到潜意识层，即为无效记忆。</p><p>举个例子：背课文。很多人认为我多读几遍，多看几遍，就能记住他。然而，你在没有【催化剂】的作用下，你可能根本记不住它。</p><p>有那么一部分人，它的无意识记忆可能天生开发的比较深，可能看了一遍之后就能记住了，可能是因为他在【兴趣催化剂】的作用下，把这段记忆沉入了潜意识层，潜意识再不断对这段记忆重复。加固了记忆。</p>]]></content>
    
    
    <summary type="html">前段时间读了弗洛伊德的精神分析学引论，了解了关于自我本我和潜意识的一些概念，突然有了一个自己关于失眠的分析...</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="失眠" scheme="https://blog.jzxer.cn/tags/%E5%A4%B1%E7%9C%A0/"/>
    
    <category term="潜意识" scheme="https://blog.jzxer.cn/tags/%E6%BD%9C%E6%84%8F%E8%AF%86/"/>
    
    <category term="抑郁症" scheme="https://blog.jzxer.cn/tags/%E6%8A%91%E9%83%81%E7%97%87/"/>
    
  </entry>
  
  <entry>
    <title>聊天过程中的一致性</title>
    <link href="https://blog.jzxer.cn/20210815/talkToGirl/"/>
    <id>https://blog.jzxer.cn/20210815/talkToGirl/</id>
    <published>2021-08-15T06:33:28.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="6155f5fbb77aeb75844708228d45bca68152d3d114976bdee437f96f4e373723">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf70a7cef839d628f3a92f9da565bf02139572d6c60646d525ab57912184515483e42997baf05de833274a2fbfa0a0aa431c75e471227a81015f801d38f48d6206851e4cc2ee314d54a09d69aa6e6d0cb2fd8afda3ed6e4ec8dd7ae946b5614d0d3d3d770946ae901a87a45ce909b62a9c6e3ad0067cf8212ca2aab79df03c4b20db232e963825aa88d16633efe0b625db2a295fa194f3355d3227a5211601c3a2abea50a57f67e9dd07bccaa8763daab34ba1c5cedfa2557c8814ccc8cde8e6098aa960f3798bd7d798581bb9fc6ce89160fd0a976d67fb3abea1d931ccb7ed67eb81e7f4a7139ad78a58dbf8cc1e469902cdf01d0aed6aef25d813848bc8fcac9b3fb12995867eb9e22168fe17597002cf658d3ba5e42ee5b02892e9554e672c210ee6fa14325c85a88d30113919e6b524fb53899f1d793ca16c2be3398f8ff07607c36790f09a015db8f2cebe627b207841f132c5ab483c2aa2123bc334f522f71450b767896f9eda0dfe601e81e06bb9220aa7e3cdba83ba6d116d3c655de4c3ccdcdfe03cfcc6dc7eecbeab06ab4cac1d931ee8af7358ec2e2391df5d1607f73dcbb42c84eee141ae3251a1d231b0cfb97361afa89ef9f91b5120b58b62a148ea11c245ced419686c70fcd9a55b2f7aaa16b6ac424e22b5cc54814e5fa1be3d06fd52643096ff446bd99b372c2caaf1bb0d7ffc3c85bfd8700c8310a3431d0b253c88243989dd467fc3b432f00df8338b9b36f2601c78965101eaf6299c329e8defd55790adb35f43ee14863a6eca89d092e3e1cdb58b371fe35b1aeba3be30596dac07b29b2e2e29bcb4a89456b5723e82439e6bfe6eae8c0fb9cdec6f171494161ee34d93599aa30333ddc590460e20dd888352df97f5ee6f146e99d9e82d9c0bef06857d299ef9c7231f56195f2de88dbf20b5295a0eaebcc2fd8b2c899012eb64ae3a88df490faffaa261ff4f9dd9dcb3d8354d709384ffa7c47c72bede7b9c618d2be1d309868f02d0e91d3a6ccbb4f14e9d708d17026c08f8f75c4f16fbce758cbbb027062876833a0d0cdf5690b16033a297fd8dcfad0ee4336ff6bf7b1b346787d62cf6ae4b3b53fa8a025dbb8cf1434306ae56379261cf550408dab86e474a3c4d957d13b9c5a663f7f95e3b462f97b0f50774b0c1f1a1cce7cc53977bdf141627a00226df2a5fdfe5d28b7a61f2e0643d86872f34a6538d179a643f3995a19c8f0b044057e854cbacc1fc796f5257057afe21ece09d1e678e18103b0bb62cdd21266ef6517eea8b51ffa7d53b14f69fe5e424e7fe64a4f6226191873ffbb00ec80948ed7fdc1fe06e92b954669a14269ac48c7ae76d5d77d5fde708a25e7d099211830e95cebbe8f4a3e81558d652a4c0d07512e2d2a9558be6834bb39c419f9f627e14d16e6c1e6c83c8562b47e5e94ee79adb10a9c337d899056b62fd737f3ccf5b980b9c337291eb4ae9b78495e99a611b871f1113c2c1169c92f8668403b33f8af10e1c819ecf7160c3b9e4c0fcbc3848cf3afb67d501672055fe70b27456fd5bb3b15acde5dc6fb2d1702bd41cdaac7b9ff249c6717c0e78ec21943f90173cfc89ef49577623b67190daaea51bd966a6abe606751197c2a182a3631ed535c3a851a92046d0537931ab2f1d1f124f0f17a5b2378c3851b1e1205bf29b196322c91bbc241753054fae719e4bfb9053efc99e4774a9aea1850a914da9b3e8254e6debe8e7a00a83ea0bd0b1bf8a3896863b574f5e39100804cad02bf6c672a87b21115e194944cab2c0c609bfde134fc620eed114e1d512e39836d3e6b75358703b9b1b1a8d2dceef12ef672d286663b76f93e5341957c1a7ad586d79f92bf242fa5ca481755e5d28f5431aac922a334e42808031740e6f11f011f9fc9f2a36ba419e09663a4038c347d84bc665fe3a01e624a35761ab4d65a43302687dcffc076fa3a42b49d5ddf4f85798975bd4906b51efaa6b975e8e1f88748b007bca682a7b586d2a035171e7dd099f3c5d1b7fae692cd6b714632acaaeca3740993d8ad2939751ba582a7c498e3e7389b0dcbb74fd529fadd57494a8d8ed574bcfc9570a10e483e70ba2850f4220a96fa594323696573d9feab39c3181a516bef258a2448c292420bef2dd96bfb178ca7a8b24a062af23d61a2e31098d1906bbf836c4132e7212b7af86852417b0617c92281d16f15c9fc8f190897fa6c01406458294980482e84db51fac8e5254a4108b27cb0b1854435ea99ee68c51cb51cfed2a19539d776e3704a116ad65b9182f1d7864c6c5e8d82dda3a9b2fe780653d655edbbcf1c5bd6ca378ffe1a224e8eb0f0ccf3ac4eb477bc277d5f28cb311a456a8fc57865f5553f9895312e501be5bbed8e4d4fe1a92ad5b39527975601a70acc2a497329e34d7a7fc2a4cf44e1322ef0e6903d86be3a3ae1384c0983c088b12975bdc20e40e95a51c84199a2c22cdf3f12f2b3d8109b5e678205db8ed46c941552ec8accfe15d25d173a918d62335d4415525664bc18c455a6446bba6aff9375e86de5ec5e9d270913c79437729a6ea77ebad030323d063b0c354e3b2201fd9b851b34dbfd8d36db85b7af7096300214cb588b14298d27df86329c09e452c2e0a58eee28eef2e27bd3200bafadb26903e9f225846843087bcdf1699a70504be2acb707b590e4ebc513bf96fc54e65f929be673db9ebba1ef8b7cbfc1d06a13237fb811fbbdbef39cdffe3eff4f0bd515e2bd5889bff0016cdc435741d81fedcabf49df0081d0d7d6d8d5c1638193f79834124aa85395b470b4e3d7dd3870581bd2009d2ab6f150532b07821a78a5e435f12f715e081d37c51b493b4b79177538eeb1d1e0972a305ab4b0b8d6a25be22e303c985b0d24014fec07e0ee1f19bf00388e1b72787f401ec82858064e16cf985df9fe836d45dd3c5556959ca2f881244c76cde688cbf0a16e83e5774845fc1c915e7f7a0671219b074946f1dc26d7efc6a6ddb5db891d2300ce96e4e39fdc3763ab8c5b8131cd3690f5bf0154d5e5ae449d18bb29e37b671c963f6330eb810425c421556d762b1edc5cff8d3237bf027d73bea10580da1d7ca2dea89da83bf76d957167441fb6b6c91f500d52ef29564b6d1ecff8a36e908d527d273462c70137856306038f5eb1f9873fdd5aec7a034a11494b44c949928f333e8e3964fb26ef1c9944b216aeaa017cd04aa7042a5c4086cf6833f0322bd78ade2b3ab92eb50622552d90d2ccd41cc9dfd5a4d9bb91dc5c572529ad0cbda0c0535ff38a78e17dbc4b62c881772f4d752634936455986178ec83df214a2c81202157e649db363eea449915cc0bd8ed1574d5a634d1b89fbb63ac75c28a8fc691381edde23c21f90b30c497064b11a6e7837e05857d9328374e2f130c1a940d611987b597654e1522c43bb54e269a9d6dd88c044a137b9e79f777075318a3834086c1262f5b961a50edfe131a8488979f87340a99dd25c2aae5290db9058401a740005ebb72b30f78a5583da97a2acef25edc6d90b711da550a84256fa86155d4d56c45d263860e923d171a8551cc3c80e9f9eae22e45326f90d7288223f08acbb689d21a59fb53d1a9448b769cff2f0fa3b362f2f2c5fd983578cf5bc91c36afd4cc21fe9538c9aa6b1b97e9093337f2c384c6cc1e5ae1f517cbda92f4d9a6009d366b8f7cae0a11fa1f68a83f7f43af15d44ac77caf654764c4717ab69b3935d507496437514c60459d4621983be76aee836dd09a6a6dae952ea2927559d124cf0c2ff4fd53abdc89f702bf9052132b85623f4b52591cc7d8d336a839dbf821cd055a24ec009e530a67d55c70cf6922f0e568369385ca4c8da0fdf25a738695dcf5a349f355dc95e583ba727211b26c7d0ccb8d39d18575c7a87c9f5544b14eaed08a22e71ad16dfc0bdd5aa0a1680b159a45b275b6e012d4ad70596e93993a5021c06a3a23d074bcfc8365955fdfbe789be4a67b6a540912a1ca66995a56e725bf58d564528d8e2a807cc65475687fafee77fe964bd8834cb5426f8d4d1a853afac2ddbf51bca001bc492a17e86da98470a7d796c6a3bcd75bb86b72de4ebb33c1fdb8c4ec9be588a082628ac6b9466644acacd4527330ededaa1d95c95f92c35c02926eaca8642f724ee922952a6bc77a1becd7d5acc5ca267febfb119975afb0454f01c7be68941b05312bee5a8a9f69ae99ee4bf2ef1dd54a02296131674ef02dfab9295049d5ebdadf7feaa171637fd55aa6018b7a3bbd511423b4f7e90ddaed4fa94bb7cb1b74560c23860341f771dd242fb4707e907490c8da138a510e6e5a1f07031d6e8073f9341a7474c26fcd6f9f36aa541015106950151e260fc3b366a734e3a956a6a28b2a9f42be25c1eafc85cbd43d69495e5bf19b5741deb77026f511e60687ea8033b348d182e92addcb697552ab26d39fea4bdd8d02af9392644fd2f60a0b1ce389a5fdb5c31e3f50ab2b9b382dfc6c2a58c7a825128485f45db97c1c486041095c6b347bad4e0dcf7ac42613eb4b54b4b9d543c3062f70c8cf9251112c2cdfbd7a1db3ce1c5f3ce975f21cf23628f5abd228f2f156b7b3f347207e0e3f315379eededfaab3a5108fb676d1d9540499afa8315deb973089a9cfcea739a9a5993a189734733b15f96097a8ea7461074f18724db306c980211e522e4e9f76668e83f4df8d57f60d56f71f2163536b2e2f257f3a659fe28538b80c04fe53f040dc5c2ef9ce014e0ce7e2bb77d09a0c417f03bf2f02dd51cef58f46d3a0f09d43a04c809feecc42137ec5e2153c6fea8ec49ecbaf776e89b7dc0eca03cb333ce84ae3132a8f4e0ce22166b7214a2a86b2ab8426b5c0e66c7e9d063819e8a528065f8647868a68d3cdae690af889e65573d643f04bd932f38378dd7d19da703a61ba818fad9d1ce02ee8b20f5f7b370dc6db47c99087c38a3003cd62eaa8cd683ddcf4d34256b7c18a1d625cfc29f68121806e8d274882ce4c385742212b0de9caa79bf6e12498e08bef9e6984a9e87fce25783dd9693ead6da5abe8d7fdd51fadf701dcf636bd19354ade24591eaeef5d6fe5ac6d877330e56126b6a5199b14be061eba3ed8b5239e4fb04cb8c7ddcea8d6c03eea6c2ab14b0cade3b41f60b295e902c98fa7afe0d05740c9112be241ef927e7bc1f278bbac85ca4cee6201065903d368b4f4764f00df9ee6b07ba9aa232cda7d89a124c4ad611d1caf9557751c938c9e0ab1d9f174ed6d59d01ed0fa46dcdd144ba0ff38fb489b32e28db660712e3dfa3163547376abd02710b2e87991e0cc7f9b4ff0250774e465303798daa75f1e4c56da1cad2d9098f50cfe3fafff018a9e172a50e21c8207694cc03f0f5b6d0b25750247f716b6fc29cdbda51093691d194c64ae6af8a884fca875e8e9753069a3e546ac0e1aced6c1dbca004849d22d716c4454f5fdff4974c3b043125f2e57e9c18c7a6316073791b18d8d8ecd60072b9f7688f8f734f8a4133e90ec3196fa4ef87cbf02cbcf182087d9172599127d9821c8f9ca72554dcf9324e5626289757a7cc8cf48dcc1bf816e520c4a63ec3de2d9cf567603f42f7b83a3604cad5b14d63cca98467191215bbc560d71a45eb02e19a8766f9e6e34ade7555c79731d7902576b6267bc827b4176e8eb9fa41bfceb0e1a6019f906d9b2945d5432f1ab2d2fbf65def4c2ed18bd8b007800f6a3b7f15bcbee7e682b77fea37a689200dc7fcdb2d5b01343d2086b7a9ba839a9eb73f2709f59467fdbe5f33c6a1596b1f234d3bdd3e321391d47632421d768dca9576bb4e095114238c5caa97630e6e61b66c22f2d47b6e90be4fe282c18a5406432c1f06823185a17e107e90037d6c3cb0bbb6e3655552aa8b6d9cc6cc8b4dc039a09530a52bf0eb0c2451c5714e3b8a49fada6bc4e3b9910f817c38643c7254ec837c0fe0169a254b8c235d7a2df213cfbabdd3713715ec092d60ec75e48029d3c88d95de3171f4f087e2e9d2cc1d7d23bebc3a15eb176b8b916cbbeba35535418eede6f6eb407df6ba894623fd2ba8939429e7439e497a4c145df763a6f661767f7f571cc54c03e9e75729ac1fcb2e85b0b42c64801574a9d7e6f6cf25f3071b5f95b3c5e2bfa944cadf9d5a3492ae79e7f753f7d5d90b23fff81946e50ae490cffca7a9937d819a0424a1d042b0553ef86c7a060ad87777606ba23903747ce3fc458d4c5a1d9ed7a196363fd6201d71ba77abeb95df17c9c3e89bdf37acabbff3e7b74f13b48891fb12b8940cb4d245faa6dcc237985c844fffbf7498bb13b2eaf603706352a423292d8b8d37b960fb86c5233eb5258cb0cfc59de088c547d928cd6a6e4a69637125ec43eb13d8822112aae6fbd837e531cfa0772d6ba2f716bd922d65199132a839106896ef367f624b0db699f689af38a39bf3623c21f1a90caf9b88e0c18804b68027529c3111210dbef1f637ad901bd130e0ac90239041c7b14b670acdbed3557fbe43ea53e259b714f69b0ba6bc2b0e6f26698d8db91c12d14e520be73eaa567f8d93fa35a1153ebdb353d008fc402069e5c2bea1ed8b2c7ddcd211115058834b1151fccd76aeb806bcaf7f56aa08aed5bb7bb9666f4c547dae87274adc9f58a1ed12f7ab51a873a108fba2f35648291a305946c7cca71a61d9ed0cea0aabbb1ef9a301ea2cb8e3a45527422ffb69a2e69d6341870d007c32efcc56a43b97fff767cd67b9c7b32600c02be40b093241220620b26f93d7f8ec8ad99e63f83efb055d72e12155083bf34b2d85253c336a51da3e80c3b1877b35beb3a27d69e008323a8f1c66522429cd71bd74aee48b180417781706aa4bc03ac8dbbe229d179b73f8d040952379f43ccfba1450806ea5a3cc96c771f29a11a6b52392390a84dfa7c1370797de945f84ff0562bb2d2e7a85a96d5481934ef3eb65c175a3505e00906d625e5726554e33e53da701f308d0b05e801b6dec3e3bb7c27108bffa7853c1645038ba65808b46590c4d0f944b2ea1ce10c07af5b70a53c0aa2916e94eb71de7378306cd60a5d9558d12c2a0518decfb87e3b1193307972e52ce95005664a4243f371ba0c82276fd5ad61c23d82d1e7b2b0651f3f1642138ed3a5a6911e7652f4a5728e4fe4f02fb76d92ed7aa7bb232be1da8ade2231be8b08c2843806140a81b03f2dca8f347e4181c73189578aa33f7f88531ef3767fbc23807ffbe50ab816ea122afbe6236025a4996c788a8e76afe779257f9536608bb8a0aaef56b74c667cb0093ac73066ada0481b33c1eb077441a76607321381f191c302b6ce192cd9a4700fd6f87566a055515547dd0d1e02f35c995c9bc3dcd4d7c9d049ca85c26556dfeee5ea0a3c17c97eb5eb7344a065eaeb3ca6068bb63931d1e9775f535247f8f09d04122f7c608c642c91c8668f724f07a3e139fc0c819ec63ca7f96bce00d157bf4f438a90856747dda79503466e34766bfc78e5d7ba113c8df292b83c953199ddf74d5c1b918236f88bb2d969b862af41a4272cfaaf10b819eb790f127689db4ccf454cabd601e0c3ba15943da7240a7c5399e4342fe6a0d151b6e34cdd1acf226487bf5169460d974013a5cd1af362d041c5681392556ade49fef385c601e66bf7e96bb525558f414febf7527ac23252ed784e812055b0016e38e0e4dbfc798db6d36ca7744d7ce4812b84bb0299d4d13d5c188bc0ccec352799d55b6ca038b52843ccd480f1dab65c147be9c625928ce34d0d3025f2436e4800165c260a2c513ed0f7719c3d6b9c53b121dd61267d30661f84bb266196ba525fa4194e75ef3460fec48c125c64e0152607dcc4ee454712b3c5ebdaa62e174517a2e527c2e174953cfa49ab6ada45c94afcc24b2cacc6ce41fba351b326992ea8e0bd82b3ea906ddb6bf1f78b297effa5f3540f3d42c543d2dda00bb80ee53f561f1d1ea5b0d86b6f931d72ed944fce23d7d3b4dacbe1f27909b4eb68cf50d0189e9d2f7335c9d53ab1c41b97f9c1725b765e3663744b5f4693f43979e1a7c6c9611b9f44edc496cfe557a04db3a20122e5c1cdcfe797570f572b38595afa9f9ea974b73c0af8554ee106f7a76ed02d66a1bb0876ca1f302f3a97577a05592453992932591042274bee1e90c1fec4a274545ff529da96532e9dcd5c8c19e163ea32bb0116bd052bfa7cba9a1ee37740a3a9f39a5b7f573f5f371137d870134c5e3d519dd005041f67483f241d008aa0</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="雄性内核" scheme="https://blog.jzxer.cn/tags/%E9%9B%84%E6%80%A7%E5%86%85%E6%A0%B8/"/>
    
    <category term="把妹艺术" scheme="https://blog.jzxer.cn/tags/%E6%8A%8A%E5%A6%B9%E8%89%BA%E6%9C%AF/"/>
    
    <category term="一致性" scheme="https://blog.jzxer.cn/tags/%E4%B8%80%E8%87%B4%E6%80%A7/"/>
    
  </entry>
  
  <entry>
    <title>一些张力十足的聊天</title>
    <link href="https://blog.jzxer.cn/20210804/aChallengeChat/"/>
    <id>https://blog.jzxer.cn/20210804/aChallengeChat/</id>
    <published>2021-08-04T15:57:51.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="e7f7034db91b87121aa0a88a49a49e49d73bcec09f7a3f8613114d27c0fd10a3">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf70a7cef839d628f3a92f9da565bf02139572d6c60646d525ab57912184515483e42997baf05de833274a2fbfa0a0aa431c75e471227a81015f801d38f48d620686859654722c2c8e62942c1327dafbfa0913b84b9c12ca9f8c0d7ff1f00404e15c07d1c4270b666fa2539a8dff941a45d1a6632fba8c64c77f20354f1adb6ca1050106e7fa4ec99eb1d680cf82e23a0c41bbe4dd02ced0155102430dfb090774ca7905a34280b225771a34a32e902da572e2387d900ffdc565dbc20ed1f6993e919c0b28b9ac8807bb2dd8d883fc2b558978024e1fc45566ade333b134725b1e241b782130a60dbec1a751a513580fa280e3188c59ed4c05ffa9dbf0c4c922309c3fd7792bfeeb9e70a7bac2b0dbe6521f687d36189a1de76028b2188d267a4e26a812563514aeb48e38fb88e1e1fb62fad9047ab5b61324a3bb1287c0172dd27b2696a1d7af6c275150aa17ed4392afe82f29112d496ca38d915b9316006114df3627c8dcd10cd1d6c87e2bcb8b6249e309189e39bb08ba0b71a4ebf446aa19512ebe200fef5f8e0113507b0668c59a92d1c958da60cfc37d79d561ec02cdd49d1d5a47fc21a489e3bfe023c37d6d14f852812db5594a435a7f27ed451b5596fea87c5059acb67fcbf3823c350f3855f92cec005146ebe27599f8dcca44d2e66793a501739965c0f56b115d5f73cd82dee405a0206d17ca7f4547ad50a059d8ff317da54649e1dd6c067d4a669db93bd407cf1318fd67afc136d3d1f21b8aba4ce2fb1f31e10c42f3b5906ef9f9f3bb5d2f4f4527032454a89ad11223e5ba3d242c353bbd9ec7ffba76658ecb2e2f61f7addac4144593abef817ef26a5cf77b2f8a81456b3a37841a476cc130f17c21ffdfa0eec1aa8a503d819f237ff9fd0422969b1ffb847a753a06a0dd9f73d56f8339ef64fcd81e9cc91e6b023a86e03ca60775fc7fbff7a46cee25ba6860e581de9729b70b9546e390a98ab1f9795073fbc3284f44cf7863dd623c444870180e35e3b3f939bfdb4085f620a27a19aeee41528efa9c4dc0c308266a33f89bb80d5b321a1452e344661535dc10faaeca6f8926722b9d7f87d287f51a65ed6f979218f18a06f019f20658c164126518ba7a44a0577b42d2b23171bba62171d253627bd8d3db86466d0fe0c8dcc74a24dd2cb5a44bff7d9b58a936472190e168d4d7446d62393108f161599304b4b2d3e19d9cf715edf296333b711968bc3d1ca0a631a887f83ea4233ba1a1ab315691beba8128aa9e9043200dce7c14330639940ecea9c66663a4771ecd14ac7baf436368655115ef9ea14c05d5df08d210bd2ce91cd3dc48a383f7d10ca38ac7546f2708cbbf00a3608c5eb2b26ebfbc12a198ca4af7204b4aa010d4f4b1fe33c62ea8fa331066f2c5273f3237877a447564c8c89507f29a6b110ebb8e8cd401ca997d90aa44f61f4093e3e87dbfcb877ffaa2fc80d2f00c1db2899b83fb02021bee053bc749f2b4569272c6a6daf400948d985f588adb9ce97ad8a76fdc19ff5d5a4b9d1886c91c4affc12d645d2d935be45528dff550564baaef2e321c6ad35a12f168ade1c7e3ca352b08f1d1331d5e27b9f844103e3061887aff58318f5d231603352e4d67a98681fc7ed1c999d843ff26e351a321f23eb0c1d38749002e12af5ed5fc3fd3dc314f8af4d733f2b2e449e136c868386d33d0343fc22a9539cd6be786a8ab9f999a54f787399060ce59bfab5600f55fd8dc884bb901b2f93848321af3c701d053582ee758d7ad67227fd0cd0a6b69b2c6157e442af20e8142538c769549e4a97ac444dcefa62193fb0cbfdf893fdea1b2bdb1e0aecec4b03a7bd2c7c241a1fdbf990b9ca0efc0c7df769aa38ef3a07fbae433336fc6f60ea99f1cdbab9ae205f3b895f4a6f0f3b8da2ece82074cdaf44308ed80ddf224fff055886098d6f712df816767a2821a2525256b619a6edffb27602977c493c851f0851e914468bde75dcfc31e366db07c5bc1a3f5f33ec5eddc987e9082996863fd6dcab7574b95cb181a9007fbdfde97276161423c1fb00579746ce94a7afd693e16c7f516d935dce17d0fa6121686839b91ea771ffa9ae35ea493f5780ec289f26942994893bd1587eb0a2b2e2c49a1bd3041756071a440103fd38dc1cae96feb2f23531861d42156d42df444d7f68a16ea2c65bcfcadc3f900e0e0aaf4fb4151aef83755dff166d221c5ddc074aafde43018a932a6ac8bb35c89a40514be938213c3504486631bab9734cf6d652f932196e6a29a7976bdebfca720aa711dbba7395b38ab019b8dec81f037a1c34920460b87c0472bab36e318b3ab55102e61b6314c79280762e00c7a1b9df470129f1b0134a75b8facab504bbce41a83d28598f7bec7aa32edda6eb226699544314d8ccb845cf5013de466944955c2e595e1cf389de2a8992f0fcdedae96eef135405d31fb24bae4effb3a266f573252a188d62f66f3f63fa2500f595afb6394d0cd0ee823334b212fa8860fc4b6d1f709473d00a12c02c34008e357c167a584a38bbbd358c957235edd995d7f3d50573ca1cde5c9731c5ba254bad803f3e7bdd4afc7d9acd92ca889e56f4b7323d83e244fefe4cf9f8d52c6f35d25941e144fc39761c83935eb5ee7d1f4e693fcdf8cf7fa5c1724de9de277b3756b07168202cfc6efbc471ebf81c38bdf640f16178e823d1bae61aef5e4445f11e1faf5ffa631ce23acc39a55e327f97df07fe2760b2be3855bf9cf96100040cb487a19726817386880fc7da14738f7cf8323c5d9a8e66db345c6ed3b431beec0db02dca835a43c17f3f6e67d81b16b64cdd10fc0f539d93abec5f184d2974517a60885532436a53c1522e43e9c34f2bf1a173c61dbc9090fc0c51c0802046251a414092d39bd779b617692a3e5066c612b2ac3585d9267931e1dd09b750b59a282dc5765bceaa155b072aa9fcd7d1114a32cc33c8652eff884208c96117b8e06db999df35a3db09d303fa9049a8d1e2712327b0baf5c95d0f411e781c21ffcea161ccf19e3dd247ae395a804b7147165d823102b986c5d96a762a1ff73c42eb8f00ca34f4ff44beba50fd4d1c2d03f0717db25643cfb56edbadfb7b41cba13fe68d2f87c2d824f752280a169c89b3bd24177b9dd36b332d1db809c2f297a440b0ed28f593f0e2304f6d14482188324641571c561ee97652467f9671d03b92077655bcef85dc92dc34da77424eb3bb35a82606529f61fd397568582a6cabad8a43001675e6d8787c0e5ae78368bb8fb1ff75413cd349cfb069426be23d3c742da3b27803959fbe145fabd51d725202e9380630035e55b99e280af3874f6176a3528ea8bb3f6f862526c79744d0f425c66131afe999edc2cde881f92b7e3eee1178ba15450d51adede848d3006644ef3e63ed65f9865260f19123638e484a06763938250847dadf1abef29ed9894ed80e898b697d4d72df1330b7adf0c5434cd4c992cb6dd216a00b4ec77ff45251bdbcf7984688faa4ccf134210fdcc7b9c426b40df76d6e598de777f559c91ee5d0724a994798442fb19cdb184af1b390e39bd87d939332dbb8a24c3581e2cbef522afbd134098d9779ae3b46396dbfbc63120a393e9805f5136b1e6b44db40112a85f77dbe87b409c67126ba84ca2b1617b53cc3e3abebd9125b85cf973700d426d0040dd1f60d7fe738fd13b00951dc4f24f6c2c77194a06010fb1fde921fee93881a673e008cefdfb000c2e74e898c076ff992d74ef375691dff72dd6c181bc68989945eda70029480eec4f81db1e7fec9a1084a9138b73717e70ec74404e343a79e83b0f8ec2d9c9829134b55b9c8feca24bc43d0b6c85e6ff57f3cfd6831d4b67558fa0799adf5da8e3cc2c04f9a84d6b1c9e6c9626e689ce83f57b05f6e9d24cb0a0d65aeed0670ecb0e57707b1c159a0215ef9b17216b669dda8c8cae39510009ebc69fc55b40c0aae60654407491fe3efc5d19ff7514c3339c48bdf605618a1a546022604c10171eb2c9b8698d4cd652b3e217a6bcf8a74c6fbca7600ec38ec044b4c4fc1a2069684da4280538940a8ccaaafb6d9c2f6b1eba40051faa49d72a383d74c452bb9bf11c4ca1f2455ecbafb133608d47718fcb939a6b7c6c30e1d65395a3fde6b7c1e7a08596b354c103ba111eef881ef434ca85c71ccd81de8387da452ecc926e638b7defcf08d59c89cdee9089b39947ed717b775784abfa520f1b177ea24cc81eaba820e71215fb53cb1fe3232a7319da0fb74392c955302762cfa8517c370d09ec010164fce4fa7db95b76c0eb3f61c6e771328d28e00038fff03a030907acab938e8e27c97dea527b9f55209c38edc725f58a4ffaf457ffc52486714713e006828d538c3b73394aa48fcb56ced7c3c70ea61b3693e17ad811940a359093a63a1d079bbc3e23f72521507ca54f3dab17fbe3cd136c7f2560fa0a527b670370cfd1cd3ec1d9246bc1a9a7dcfbb62984ded10f9f5a7a69057c33cf27c57e1c0e0479576cad34925e2d3ff34ca49b844321567c27835ec01ae110f8f515245119461d92c51dd4644ca1872275e5a0ca5dee47687be99242062388cff76fdb5ecbee84c89f6922708de4e9d06a23e80efe240aa4fbb718652d43f81b751300544f7bb658b861df1a929963b9be5e90e0ad54cd54e416083cbd0b96d9597370192b0c6e9e8384a55542323db1859ab9c8590d57e7cf102eef51658a7992038b8f68f3aa65d707cadb2c8a0e7646586df7e90a06fe68035cd11a9761bd6df89681cbd74a982277580eb1ed70236f2075faddab7a24276b1b904a530ffa35de58d221423e7196148d619d771fc9e7f8ef467866bf20cd4f665e8491c0911aefd62aeb9332cae955ec977d72261068922cc209585778d62b8f620793b1d5613181d3f997d7d03a9df5a7b25be8fcb9d1c5c0cb25aa97a0a51ad4b48d1d5fc4e28a35663f9b22a8f7dbcc3e560c1f71362dafcf0325a493975677890b08ad9f3f6b4c05831df7cd01d82487ed8c4dd98e2de39b239ee648e066e7bf3b826d43fa50c1c2153092ce55f949321095161032456dcef355afeceafc2d6532ad5a1ca4d5f4a0bd7e867e8ca4ba745123abd238672315cd02f8a197d1fdbaa91cc5eaf168e8567115b0aa822f165e57fbc2e8ed3510d05c70592b52da80158afbc724a484447307ce65c01c58da8aae44e9121bc899faf4383a14bd6714062c1feff6e747befada8cfea1a1c95f819437293544bf0abb892a407de987175086f5b7e3bdc65731cd598943dcafa366356bbef150ccb3cd4dea5751a4500659fdc9671bcf692c2e212eb909ca916558f1a906265d26a67aec5cfc46313fdcd3b58f30bb146e70ee5dc078c519add51c41e1c90d361d421f802b0b2ab09e5db6c6fad771afccbe400f7f3ca30943ebd942a628ddc1af9eec6aca44d4cfeca0983357f18a7c2c6dc668ab7431aa495749c9e6b28e0424dd41de377b6de601fea8c0917f38b8362a0a0750f456927444be8bf1062c09c643d61070b6a70c015ec16c75cba0840f4c4cb58f82f0ad486458fec613fad3450e963188dc427b44a28d2f5a2c87e8b0305352db962d6719bf59f15c6e02eeeabbef938215d29863e1a164d1fda577fc195c72cca52d6255f10b8e9ec2a2007d5950e1dd0220aecd1df3bbde2afa17de35a3f17be3faf171368cf09a1250494548b54db5b37c3991d7e4d84910bf39b601e75ed9a1f9433195f189a540e9eab7463c03b020bad115d7aae341cd68a3adf24ce1e5431a744660c663aecfa44fe3fb89459f89288234193ae1e94be510067c15b9632837547d613f2baeabb519f67713378c70ab0e09630b9ca4434480364a302584e4519f7c786c21bea4b7c24ca4e25ae92b4ce12360378be60efab96775c6fbdc12743232952909d1f85da0a6ccd6e22f958463facba5ef6d35e111a93210fb78e779bb3ba3de877d8b072bbda02741a9c2b3a0e9d530bdcfd119591f36e3a77b2d0542b30150d5631e00f57b9f8ecaede73169c471bf786e611f82590560234f207a3313414bb1a9db33033cb140899e9a2b3995d610a90ab50a0f99a091d851afca6b16837606330c9a27649112c87108732a066b27e69fdd88011d51934df21cbcfcae9717546358d850ac8f66221362260cfa4188337de94766c4773fd2e2e42f5cd10f9ca565bbdbdf0b1c2fb7ff1fc980e76c4a13955e9873815c585fa698c19cb118be398872d5454cfc140bb06f047ad9d9475a12280d523326e14ba8a841772aa89e05077c0df7f71d66656be69b004303e5cd000b5dc138180967a702610f9aa8e3ac8623821ee441e4e3aa90d6eb078b6aec94741d96648c38d6f4b33a44ec30ec08b7cc0fe9e455060ff42af4b2a4adf7ada826e129d2030b4439fa1441c7cee075b019c7e791206164ab4f91cd14086ed1e4f09cda3ba4f6c9f495be22562c00328517d76a3b97107d5aa15c21db31b161bf49544438651a0759fd473164421c8246b8c72163c0098e040de6f47cc38113cd1625e3a55d032536a8af6f603df43b81112f327ddb6d775ffbd342ae6dc09aa02bbb860661aee828f4bd05ee086c55bdeb85dff1fd8b446d5a2780781986a41301bea1bceb20e352d0daa949cbbc3533dfdb86bdcd7355f825baf9196eadb401be6382629714e711cddbd80ae1a527d56fcbc865976594eca0800380250247ba69a560c8c26955094ff8d5e887bbec009e0f4996f539598895cc1cf5611db25e7c8abf0bf56e15dc857df00e5437e207561f3caccd3265d082ed3dadd2780ff526e1af119d686c89f2c1d5ef9384e3b46c5d4d37dc7840ac479b268601de06f66217253c4aee9e135c8d6d69163a741104fe2d5129e8e5af08748e3ca80c4ac2e25b95652cbce6fd0184e77069fda4aabb13a134a8cd016cf39dae963bc2c0320f494e14d2666729f72f969</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="雄性极性" scheme="https://blog.jzxer.cn/tags/%E9%9B%84%E6%80%A7%E6%9E%81%E6%80%A7/"/>
    
    <category term="把妹艺术" scheme="https://blog.jzxer.cn/tags/%E6%8A%8A%E5%A6%B9%E8%89%BA%E6%9C%AF/"/>
    
  </entry>
  
  <entry>
    <title>雄性内核的思考</title>
    <link href="https://blog.jzxer.cn/20210715/rethinkingUrMasculinity/"/>
    <id>https://blog.jzxer.cn/20210715/rethinkingUrMasculinity/</id>
    <published>2021-07-14T16:06:08.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<h2 id="起因"><a href="#起因" class="headerlink" title="起因"></a>起因</h2><p>事情的发生，今天上班时间和一个我认为<strong>雄性极性</strong>挺强的一个同事下五子棋。无意间的一个举动，只是想试试，本来没有什么想法..</p><p>但是在我下棋的时候，我发现在与一个雄性魅力比较高的人近距离接触的时候，事情远没有我们想的那么简单…</p><h2 id="经过"><a href="#经过" class="headerlink" title="经过"></a>经过</h2><p>开局分配黑白棋，当机立断我要白棋（雄性特质：果断），我认为这是胜利的信号</p><blockquote><p>很多人的刻板观念又会认为，白色不就是举白旗投降吗？你仔细思考一下，这个观念是谁提出来的？他的观念支持了他如果带这个红旗他做什么事情就会一帆风顺,直接胜利吗？如果没有，请抛弃你那无聊的被社会洗脑后的刻板观念。</p></blockquote><p>在下棋的过程中，我的动作和思维都非常稳，内心非常的平静祥和，但是两分钟不到，他就输了。这让我很吃惊。他毕竟是一个玩异形魔方都很溜的男人，思维逻辑都很强。</p><p>我当时在对弈的过程中，我感受到一种被我压住气场的感觉（不要问怎么感觉的，全是第六感），就是一种，我很放松，我做这件事就是为了娱乐我自己的感觉。但是我感觉他有点小心翼翼并且有点紧张的状态。</p><p>我开始思考是什么导致了我和他接触的过程中他有一点被我气场盖住的感觉？一个东北的很有男性极性的男生，不应该被我一个南方瘦弱汉子压住才对</p><h2 id="反思与总结"><a href="#反思与总结" class="headerlink" title="反思与总结"></a>反思与总结</h2><p>我从记忆的深处去挖掘和他想处的场景，我发现有几个小点很有意思，大概分析一下，有以下几种：</p><ol><li><p>我的朋友圈生活相对比较丰富。（生存价值较高）</p></li><li><p>X 女同事曾经和他一起出去吃饭，他想点我喜欢吃的一道菜，但是女同事补了一句：dev又没来，你吃啥？（间接暴露我对女生的吸引力高，社交价值高）</p></li><li><p>我敢于否定他，拒绝他，调侃他。经常在当众的场合拿他开玩笑（当然是适度的那种，但是会激起他的一些情绪波动，相比较之下，会突出我的社交价值比他高）</p></li><li><p>我对同事之间的态度不温不火，保持距离不刻意。他们的各种举动都不会激起我的任何情绪波动。而且不会把自己的私生活暴露太多给同事（情绪控制能力强，男性成熟的表现，神秘感，奖品性）</p></li></ol><p>总归的原理就是：修炼气场大于对方，通过从提升自己的雄性内核开始。气场即是框架，维护好自己的框架，保持神秘感。</p>]]></content>
    
    
    <summary type="html">在上班和同事下五子棋，两个男人之间的博弈，出现的心态上的升华...</summary>
    
    
    
    <category term="自我提升" scheme="https://blog.jzxer.cn/categories/%E8%87%AA%E6%88%91%E6%8F%90%E5%8D%87/"/>
    
    
    <category term="雄性内核" scheme="https://blog.jzxer.cn/tags/%E9%9B%84%E6%80%A7%E5%86%85%E6%A0%B8/"/>
    
    <category term="雄性极性" scheme="https://blog.jzxer.cn/tags/%E9%9B%84%E6%80%A7%E6%9E%81%E6%80%A7/"/>
    
  </entry>
  
  <entry>
    <title>对迷男的一些思考</title>
    <link href="https://blog.jzxer.cn/20210624/afterReadTheGame/"/>
    <id>https://blog.jzxer.cn/20210624/afterReadTheGame/</id>
    <published>2021-06-23T16:02:45.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="7fdfb35fba29eee1a0e311b1e8682aafec3edf9752ff5d901c1d72f4be0209e3">e3376183dc245a8fbdc5332f537c92c81b08a9daedaa7eef444e96354aebca1c923367bb841ec302af0ad888effade517b9fccd641de98b451999d76d91bf6dac58b0d9a0f579217393bdb9019d66dee861f2d8949f5ab08251425e139e8c6150a52f85f7d4cb3fd16aca19131203c6ea25b47aa19a340d2e3b62a1dbb7c68606624d9033fd04c8c500cf06edbc75bb3860417129416ba1890040511de2da57a4d631de0570178e4b7075aec9c90a50134f7ba9f106c9d9b42cb7abfdd493fe9e06b954f864f4ea9cf48cfc1fe644a28cd31d1951da9e13b1da629bd4d41665b4987ee680b72efe671dd6f4413770c0c35c84bfe78f916a0bc1c30c49fe9644698c46e5395f8c752ee70ab5267183ae0919c97c3107064066ec8546554bd783b4769c590bf4f6f1aeffa6b6df40e4ead3450b6b0b582fa4713557aa18a8826a0f1d895b023412ab99a21d0e02c0de8419e723f2952dfd3df423d9ec8ef3af8beef36a77047cd1a47da77e6887d79c732bdc625c630d872731605c1c2907fdc93fec59ac427d9ef838affd825b7f84c5e000a9f27dc7b1005ae52923dacafc299e5f0ae015a853d7067de3b1e2e2181fa79823bbf6c360fbc5d49d7e656de899d92e882bce98ccd49d155c2bfa6a2042abc363c3a3180cb62cea3657d8edc20cf6d24ea0b31cd07e4a6aaf1f1ce77841333262d61ff1966bd5815aa659777899f9d745c819007c12ad94f9c0b1722f02849694e1f48eed0240fc2df310df7e7e5e902193c8542ec15a7f584df8075bdda2429caf91428c8da51aea1d62aef84e630444016a02598fbc31fcbf60cc583ad504cd2ff169efc4d490d46708ae951b9966d9f2acf34e40ceb98d4292b4585637a927a46f7dc81afb6107ddfa9373d91b3372967b1726782657cc5f01b4739789bc531a7de32b34cf5bccfd207d46244a9d1b7545a2b5a0750593c7938b33fea744c036063a04159bc0b174ee5753675e1c90a1119a6bec4e2c8d3a48856f20e07c536afc8763ea21118471bd197f9e1208c83710fc181ca74abb376746d186eacdf75cb531ba28950da1be634339b46c45307d8c6920d8f0436d039c05b7636cf1cf0bfa1983ab67256627ac257a433ee0c679426e5cfe9284bde72111e394cf0a114ef3f689a64e74fd9722936d4d7fca198f72c6cf2f8b0063ef98ea6a57fafc23554e7242dc99e344b392d4ee8795f1c6c889d614f6ec0a5f8914190afb5d89148fce3cdc9abdfd42e6e8620a0da1f63c8c776543eba0f72bd69e8cf6328a4030085c89c3337a2db8c4f12882f1ddbc1f08d666da721880c9b793de30d06ad5982193eac702c1d02aeef4aeeef353074eea82b809b8cd99f71bfd752759eb4ca5ecb6d0285fe49980a5770cc2daa1754d3040e8911021899a71933686a7bc5ce0065bb99c23c78707f3fd20e8b7c67e480594a06e27cf65079a3a607edebd2c205392e61ea56d03698b8a996a4f2d6a966cb7af4e279baf241371b8c4e234f447dfe32fb1d0d0e9c61ac64e7bf49ccb1a80e0d3ed948dffe06dd72c4695c2787acdd308ec53827a2c5df9b7824393c7f7c9c1c9dbd47dbf5cbffb0adf428a1b66dd77a8640c313192b901a81d0d66a3c88ac32e54cdf73d6809c87d5b8bdb2106a7c32acacedf0ee436e508c3e798117a14eebe1f4fa8d6309f44ba28c7e470fe3f0d2c6e360fbc95d75a45bc7d6445b992322b75faecd2efed0aaad4af0efdfb4dbd28c713d0ad6bd423ad5e93d18b891435ca214e196f81db442242ad60845c9947c1fa9227a76fa0657722b502cfff5b61ed400c4708b47184535c1240749c1fcea3cefafd21d16dcc4d45b531d1419117cea34f807a777dc6ad63ca920a90ebf21d7847254ffaa09211a59b68cd46375c5e504f78484f56f8ae79ccaf2cf0b46561235f13cccccf52c747e603cceb8346e9fb6110f3fc1866c5203c8a4c823c38d8254af1de0abd159ea6347398324c3bd53bea4ba45b234459e0632c9669002d293f935eb7e771b1fda692e2b0f3e71b4cf748573dbc6c98885fe57ae1c5aea2f4104ef89b723b1c102ab293595b66db45e0d150797d7f1968550ff8bc85ea41ff5310eb2667f12a4369aab32a4db6b30bc4b90eb76bb2ee082af432f2831363e4d0d2ac345f2674f9e8b750f571829a88c619139fc578855acdaa100c9ba2d15d29647ec1874016bb687a9154dcd151d62645f5d9d8aa4893356f5754f6972210f52fa83c860cc99f903840d130cc3fc01521799ecc677a3751bd7e402c8b1db10d6e5921d270130c7c986ce8e3e616092f1916e9deb4c98501c46c3e6cf0a88cfbc2061d438f03d5038fde35b16040c1b546992f2f9859006f43339d87e3b8a783301717013c1b4d4e3e15be1cf9021569d4621763d682907ec068e77f2bb6d0b0996759c533de503d916b9921e00107da26bd8ec07e428c65e33ccec0ee9d2f5c689f5ae7fe48604d2d9f0cf05289784e3aeed3794d01f41a052875d7d75fd52528610e9bf8427618b43a1fd8ef23a2d4abfaa7b67394f47df184cdbb57efed1b53b4e67af5115fd80d49363c1495810aa8a7a1e9ff8bc7f7e39ce81cdefb65051439ae052117cf109568a06f8a3b262ba2343c4e3302ab52c440718b1b6ff5af1b12bec06d2eb77a4c6d262613108fe4cc642181ef60995dfcf64ef0b599b66562475bb9b28dd81228924bf64895d19cb3137601c597627f9250bfbcaec60d49ed884cf36e5fea45f279212b1da4f219c21db70d3b5ab7b21f86e9a952e33227bcb5e69fc84b0f8ecabe1b429e77b7c84cc063856b2975baca2d7013d1c335cc957f07cb03030f14222c06280ac40bbe630b176337bd0bb879f97c5cd1a6ae29a6001dd27520d5e502141ddef5510076cdb34191a4581fabea2954004960b15cb30be5e067a9186e459f1f196c2b16bf708640a8bff31a659adc48a200b73ea6365912f60a42a2db27dfe9169753536d522c3729709d2f6d724475da66d3d9007de4b7dcfb2967bfb354f43cad7a87a3403b204041fa188f5f576373d2397fc904e9775e3d965693a34b252ae5a4342c6b86802fe76f2aaf70daec0d5654fc46bccbf229c0b761ea2e9cd5c78c7b78bd1fa6e08223108a5d3d44d12d74d0e46d422e21546cce5abce6845ccb7599dd9e7c1faa3085c04dced83566d4b27bff8c891cbdaeeb16aeb928ac7fcc7efde731f44e47c3551b5f86e76adee174961c9f6fd207925496204668dbe083994a5c860235ce22233c489427815b41b3d2435cbd2a1247e48c421042cc7de5eb62023560db8f17cd91e06e8949779aaf10c312a16a5b9be99cd481a1ed3f301ec1115cfeaae7936ec3c7a1a9c3f997116fde742aa976ce43843e8ad747441817b2303b0624827af900c17ed580e0c50ec824c8969e8ca1235ba8474969c63f40122b2d35c5aad95a9c1e8d3cc65e980c1345746b24ff103318b87814664848770265c49d8a1dbc65f0f20eb3f1a3107abd3227aaafcdaced96dd8f6291d3321b05a5603bfc1572ee25222f46a77e668b218198d4e5d1bb2944b34f9f300f022fc79dfab6febda3c42989328e4ab6ade3a72e9882cfddce74b0fff021c6b0e55c1ef44fdbb2e75e10178c98eaa0fe4c30397b5d27347d4c7af154400b6ef57d308ef0ed1a7bd7ca1ab0bb8d947a2da361cbfaaa52fb50d1d80d4f8d195d2df52ec3cd8cfefb5e6cedddc7f5d4d60f742a212f084edba2a5e4c7b05cb09f19b7265f967eec60719a261d51c06e7a20d57cd4a65928247e94f5a59654a978edc217886b64c335026fac3b0496f6bb47d5a35fb1e84291fb70237410e9b25ac656540c6994102f428b0ac720d30cfbc5baf0ccb923aa01945ca5a61928793192f4c4d85cb33d3e46cc3f49a25140a13155487cf3ef4a1a65cc43f1c1860bcfc08f929d814e1898b4e4bb051a8932ba615dd96e8ab09e05f4a6e94e8de555f327dbd825f0cc6884bbb5b3b1742833ead20faed185c9ca78fa53d55c98aec62ed408d0b2952aedea1b55328d1a1b59d6e5bd5a714359f902bf89a62251f1ce467d424b978bdc9c62bddb18591cce5ce6917e47236fe6fc343129b5ccd0421503b62212ef8ff845485efba3ddeaebfdeff12294bf3db783ddb4d2de4141a9f914a3661f0de393fff1171dad2949c75c94c472b4066a004e573083d8d1b6fdb71d3117e7eecf05e2ee992c07f00d65577de79968f260d2d3c84519914c562a3540cfec67f4863568c596b1bb26a70dc877598821cfe5bc1d32c6463319b05095628c6b95136faf995fed8c83e74493367a2bc3813c11abd92a3a124c514973baac0d819011245a552bd07ab5d645458e7a4b230e493ce0789d757c5624bbdb4e728c74a89d47aa078b7164758c255f069f5ecf79a27b0f66d46f826a2d732a077e85040b967387c540763f3fe4ca981dd17767b94c7375783543cb67b537323acfda19d061b5e885ffb07f26fb17e61e578496a966c985fc0b7ffdbfae09619e27a6d931fdd54927cb42c37c6f582dabc2b0acee1311df3fae6c2cbf354bc78f2ba2c266acac1d96ef84b8c3980ee204148a777bd12f393775e6586c49e6978ade0c5979db40e28b9765af68452f11a0d24e37c3ff83e4dbaa0102fe6b88140e0e9b2c888673ce2b22e7c6738befd17b99ea754a3d4fa74640c04e9faa592e82253b577de8062e7b9b2b49b1c936d71d7a06302e9caf04a5be7daff7799e86efc3382025a5b7528e53ed96c37c2fa94fed44daa7a0c1dcf6364aeb63e8f1613440e468f45d18d7aa61c2b8a766423b98dfd0073a057d8d34df05030ea76a5b9398682aef6250e443a7c888a38ac1b5f7ea9e37901d79395a59fe3beca9f2102806574a65cbfeb4d73c69f67013a37771ebcdd77e032f1a25ea687d656e507525ca88b08d7629a67e2e1171d92d575c67286a77e4c18a2aa6f0e58f068c08cdf0f36edfccd7c304c68b996ace79a2a19430bcd0e5a727da14c46256102e0dba2c8e86189305fd67383c62d6bc954d014135c20c82e2c9cc1ca89718d7f4ae5b1f89d4fa49397d97212f2f1bab98c13e2bd9509a63ee223944c64348fe84137728b03bd3179ecb3a4288e1f7f93974bc90f7314ccbd6e1b2bf9ee37f18aa4c1566a7b3ad6d48ccec1b51a39ee5d0f5a3845ae0b202347d74e027cd7c6fedb90ffa0b24330bb8a8644ba48a8c33ddd88b7b837820af5d43ee9e88e5800b1dcaf08aac2599382fcd7b033160fc505f836e2919115c5039c76eef74c2e2ef6e01517e28819a1f396b5bf052643e4524786c9f505e54032b732157229ec11267f84da590dfe5506e9aedd78985d55f00359f0df6c9fc5cb3bd938c49033ff3b35199f88add982d785c55b195f710beb4c411903d157e1089e233f4a909d51d11762bf22584cf3f348e21820c92d023ab94e6af88a5dccfa4fa348510b0fe483562b2569362e846b10821a3f000552289803c0973ca59773c2a40824a6811b643775228a7af32447261f059235749027cb56725e23e8ca12fa8e528be2925b112840efac0b6dc626bd476763ce31bbe045747aa83954e68671ed126169473efc56b1eaaa8ea7c37513f2521317edab68b1625b88a606ad5b05a2f05c5c009c29ef3574e77a3de4e9c8d9fdaaa931293e1026a96ef576a361cf3b99128b11688667630b2b2574e2a9e096a6680ad568a33ef71c8fa1e31e9c10542ae6d8ca468d0ad6193ab79f548cc331338eed0369ed1981d02c88ce70e72d0817adc26f6bf92c5c0f66cb521eb2fc2296b39222583f3a7a289deda85723f34a1d8c43b599e7dd5517f6ca6fea2d7cac85107a1e070aeab2531800d5a27736f75711b5ff56e792c1f79bd5fdaebc89a105a7bbd0edd88558f43a09d82fb000bac46771cff3b088aaaf4fa2468b351cd8137e3274d1bb8690a5078a0c4312a34ffcec6cd404d163f13ab31225275bdf79409603785ad4982accbd108da6e2969cf9d6c9f7035f2f1c29729ef4a081e23a5f39c82a849182fa0d6c97f267dd94f541d6fcbb8d31e779f6bbdd80014f0b536c5f05f41113c5963d09e94caf35890648a71a01f086355ca59567289ce4a870344f2602e175a9793c5d5546c8e783bf7918cc81b1eb073b41b9f0f9af7dd7fd975451eb316014a15be34710d15dfbe3ce9376ab90e9066ebe29d1613ef0f6d85e92a76e36fc50f0988b10989b147a96ad5c854b91771aa561739d2b99cfcdcc52c9a8a8a8bfb56bb414f70e5cf91c6f0c7b4dbe12a4e238151a98223f7d6a444de7b7398b690163805bd533eeab8326bb3c6faea3c1790f53dcd4ac220cc3cc3a7416a9484ca76ccb34d53632fe666c0b69dbf7e149388ad13e324cac583475151c0a8755b9abd038d3c80c93f589b664469d79d87e297fdbdec82d9826d63cb844b3a990831cfdbec769bb7b91dbbf60e0e5e3665a61123dda7cac9fc1d90a3163d573e6c86f45b85cfc1307fb58fba53b04bbe159614e37d41c4b053a9a8abc9dd0e2cd2d5d6326b5f669e19a33b9d0c53233afdb2171ed92893866eafd8a2ecb32b3e64a464972042359a2df2727dde2f6baade3e768b1a50b91318d9aee428fd0f5e725c16dcbe77e0fe12341cee0ecc9cd7582ae2df9b3ce3c776367b7cae1a4b13ee50dff7baa7b412fe5ec0954a37f4b0d115aa06fa2fa296566e3cd572b80f7153d41a7c96b460ca6c1c6d32187ac875907b5be49256e6241d269a98748c84fc4c42cbe30d25ac5c5b3de222283e29cc48278b85807f46260c9fd50936e952a85a1e5b901ff64e47602382f96a5b476f8c96058cf2f583e367d10a718b885a7850d871e09dc4cfe177ba393a46e1764c9b67393c1badb9c35bb87d3ca747ebec6456ab79abcc68be31d05e1511372e4b6038bdb882aef7972bec4039108742679055ae86b40fcf0a92a0f0771461cfb227151d4e9414c09f3d0e60ed57ccf09f9199eb0dfff093b36654df3d4674c0292a73aea03a4540cfade0c35a5d9606b084dd8008574d7cae5ca97b7f04a7582ded10d5c6aa71f79dcc6bcc18dc1f4f0abc13f5d5a0ec6e2a97d0015d0e81dd5f46d0a8b4ecd8fd676a6909808d656a25adad7bca2d345b4b91b33dace1cdd4de9cbc2afcb11ca07b774a755514ffafc67c28dec6d733dd9ffc1edd8a1d06385e8d7f7a42db05f1a5e1261431013375ed8fe7d67682ff3b7d0f52d9906b46bbf256379040c37f70f6e0c4164401dc5839b2fecd33757590a3b7f89db6ca0d2f40b2dac623e973a95fdd95961323346f4dc991bd1229a447ae66da1fa950d6e6c9405b81cc427d19d7f40523b96d31666f919be83a15b88c5bd0bd3ac4e37c926b785b0f0acd0f9e0d3666563dae6327f0df7dfc059dd0ff0a2a3fde8495cf50da4cf66be482f</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="自我提升" scheme="https://blog.jzxer.cn/categories/%E8%87%AA%E6%88%91%E6%8F%90%E5%8D%87/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
  </entry>
  
  <entry>
    <title>一次地铁路上的邂逅</title>
    <link href="https://blog.jzxer.cn/20210619/zdtlsxhdns/"/>
    <id>https://blog.jzxer.cn/20210619/zdtlsxhdns/</id>
    <published>2021-06-19T13:25:42.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="adb785c6d4c4a2e970ed4ad95a72d0983be489bf48ffb2c6af6edfef6889ccb4">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d3e7b08d68e26a5de61c7fc0e34c3ac89ec9a2bb31cece571824ee42be182c1a0ac43d496642d501e6fa7ade39729dc47042f825593d6ebdf9fb6876c131657862e1ee0e93ffcded053d3ef49d6f73e3c06272bd46fd7966d5979856725d7bd622344dbb5cb6b535fdb5b778a96bb70494c0f37c75f7b40b4f1ac2f647c9d8c0193ba691d660a68c49d6a5d80045027f0ad5291bc9fa7a46ff2c08ae19dfc435e5c71937720eabd799f8d51735ece9ddc46cac3f3fefe6d2723bfa7fdbb00b8f5bc61ee333799480209928862a10ecc1d71066ea6d8d7f1ab2f92d0099bbefa5e4213eaae4bd1f9c6a9300c86fb93e1bc8ad95cee636436289ad49d107a724d00ea194b7dfa1f21f39ea89ea298cc4d4e970a706e4b654934e3eec360d12d31af96e41de203292bc6d9f7752954812a33cee2296a8651b4120e269ec70f8923bce32e1eae133f9953433ff59072d19e871f3ee9443339fe8a0ef242d99565124ccbcb36a8c31e2ab6a18b2fc7c088b60ce82a2320711c3d24093bee61db59d1da0f3dc6e0ea446020ee4029562cb62d5f7db77eb563dcede6fed9233958d2c86d6baa8f6b163c79ceb4fc2494aaa5f48cafaab7fb61ba5f5a4afe9a85de8e8696a4c0b1eb8c11ec94c35cab37dbd5a062cb135e7205f25dd9fd3a8f786f6cc1d1e1698d17d85e0a2117b306bec2c7d7bc3eb39112ef2f296b2de45daa89574047988b83dd6ab43bd3647863f27260febaac1d5a878494ffdb9eddb8c81f809f1382987d444d318ebc124e81734692a90657b30daf5f1bdacd1de07468210e880e011acd51ffa4b621a24acdce10127c9516896d86307166c945739ab30e1fb67c1b9761afc116b71cc8c190bca5499ae6ccb716201f9176606f3a4dd22a14c53b500a84fe28558c413500b554b3ae87c0b23e5497e062413d87334cc30f9c0aaf5d048f9c7f2d3ba4c7ca37b427723b29503113047ac2b4a9fbf56a1f35983f3c91298795e75df191791ce4a64cd676baef88e4871ea43682497f1a2e61392c1b1bfc092297c9b29ecfa247c19b30010bb1e341d095f28af8292f3c60cac1c4871d877db4cb4093694ee73c779a73dccb8f2fa1c98c6cc036d70174b5474f5c1c8882b495da2595712d9c316a0ec30de8b519a10551232cba360af97b79e1ee61b5f57a97544d91ccc129ffa788e75d57b906793e0b60b51662ed5284906572db009059c6216fd16c3181656f9052250bcceeed5b168be3c41766975fb134cae68bc8ad132246aa0b3a406e4c5acfa1c0c7f1e74d94e9321adc7799e753b733906b14802cd47d69c5f4d18e627cb5fa25e6aff70af5c0c1d99ccea29a1667ae0ee55d98b7324e06e091aa831553ae4a463b7b6ec0ae4c0d067e73ee7701796e130ba121bd5158cc292ce184154e07699744c98ff00699d4648133ffee46f25f4f93b87e15e91fa44a1cf4c9b378e206988fa8572f4607eb5c6c59dbb001fb4d122174e989733a3abca81c113027a9a69f2b6619604a0cdfc979188335011d0ba2f4807d8c3e1313da7cf82ab47c5fff611f9cc5cfdc1813bfc48c7e8cd6ca833634b46c235d30d2cd6fb4bd184c460fe17fdd747a110a6aa2c3d7a8d5899fd37731138a0c36d3d2daebf1a23c5104a123d3b243582e562e9c709282adffe6c8585287945b8548d234460e892e03b116b43fc720686929995ff987a35a9e595f9b0a65b3574e42c10d3feb50bccf4ee3f02095981f8ecf3daced78769e6e6bebe62f42f979bf5e6fe0e35ba582cf5101c62709c905e4093606b397b66588bb3b8a91931f1c5a1477f2ab33184f432794a3b1a91e488da8ed652c04ade9dc0c35d1379ab254ba76dfb925361f03e329584f54dcfc16635f33bd407e0cc54edc8abad6ee525ee75461d4fba7d59686ec2328f16c5d224d5e108435d08b7e6f5bf93fceb7f7d07fbee5185f79b3443b969a11734287299f986e71f9b1b16a5fa517cf0c75de381888557ea41f359a97db83d1364e6546c909ff81420cdd032ad80f5bccd8fd96d2ec0f2d14f112f7f2bb99a011e6cac112405febee2d36acdb79c857f7c3ab69b1b970d7900ff0fd21b1da943d1100c648ceb94e35db8192b93413a1465a622f01b4e09414f139fd7544268e1a41a0e26a1c976ccbe27bf55cd6d8177173009dd0dfe3d014d7c760cce86488aa2293464e2a05eab83e2eaea27cea8874382be449994243a673d129e034df045e6b674daaa21750442c7a8db62d47b15bbb34d57c560fe0bc0469162bcb5dd6f98d921bee814e3fe63c7b2e4a16217471b4a53d29d5605d318d6b8865d2badbb011cee8f1fdbbd9c0450995c594c16107689067e0d88d49fb17980169673ee6c88840897292a14b96b991d3dbc679400c32b811bfbfe00e776bf6b5c69ee97a42473e33fc0eb09fc942ea3a3ed9e95be110f6caaea437077da898b51ecc1bdaf24b7254ee7046d716279d2ae34823f493005606bf8f310880d6c448bb4ff61537ed414d6a63f90e4d9c36de6878c244fa22df95571e358aca7a34d12cce0e9626a0cc6933b5cb3ff7afa622c37f278a07e33ffceb8530087819da430c44abbd54cbe3f5104d6df8ac2cd20923be597ddab141baaf707c0a05153062e678005eaf2650b736955a19f859425d76ec53ddfb4961185c6c24101fb21dd7bdf1f89a484a7ebd9697bfd608e6776aeee695add22bbb4f4e016fb6c3dc9d10b844afde2113f16a1700a98d532e22a05f35614d3ed63a8cab3bc2e7bc764e03848ea72932bfc2122e94a9688ec7f60c084d533f04ae0ceea227e58a4e74f7714bd4c697b771d50507773e4a8ce432b9c9960897eee8b4e5c91e77b677408cbe40250ac0dd2488e5780b4749dfaca62577dab86c1d544af0ac13c57b4b7ce8d680fc86a1ac95c1e04cef7b5c99faf4f69f23d16f8949f98f3541c9258b294c4cb7f742e312b8dd2721ba225ca077b8eb021e1503d9aa07069b5076852028fe21cb72ebf4d6b7ac584c12c04332846fedb284743a232a18ff9e8aa3a9a4a211c43e78458b4f61d72814a9136cbd7b7c2e3a412278b87c261918dc70ec2548bdfdd24a81290e1750bb5cf853147097d8e7d6a4d933d545ef39a87664b69089f9cb2c5e702d1f43225722767192358a63fee828b144c67fc1f730cb293c5a8495ca4db1672916adcf4a4fd5bf2375eb6ce9bf4454f7c3919766961821c12c0f474d2faff9ebc3a697061d3900a9c24081bd4cae8920b095cc84a17c9ccdfa954b26c58cd2b7a915ed55b9bcf81a02bf1dbb4986756ae6895c6b2958848e9407f752b38601725a36e13e1896b0b265223042ed4f8d2954e7465a3b94c7c086fcfc9d1640be4d333f5d2c4436767948c3601cc6efbd1193d2601752f70cebca950f3f4f0b417ea6da22747d8a05bef69ed9c030e76321949023b875ca99c629e004a644d1cabb1dac4b270a1eb67104acd47b1e9c5847dd139b25d508649f0fdac24aec71c6122257e9ab2bc14e5003d1139163e578e723ca7ceb677dc03a5db7278b10af062e52b0c73288e6fece61354e9dc801b0c435d3d18a1312a6dbe20d7d2630d6006dc9ca987f7aed17400a970366ec2f01341bc6329316444c1446a33538893855ec1a68e2be7260e60ec7a92a35bfc90de0b3aabf233768ea0bcdde2c9b08873154596619bec682d953bbb9ca01a201a1cf1c2891ccf61831b1eb3cf15c8c0aa513b6680949f1bf5bd1c0226c5a7a862456750bb45e594e936d0de4b0be63e47b60f85c52c4d56068f544cefc9f4c0666bd60950d092ee0f3e6af37f90497c73f76ec91d660d576ffe7e458eef0bac9b63ec93ca0dda9f876d6950127260f50931119cdb58e756f48be4f68eb7b2a409fa9d883818ee3d3c40d71f871e36da581333a2b2fbdca6d0641b0f82f984901fd18a4a9ec7067166582d096b8d5ad91f5059911337ac994d445bd4ce0d2a7f2f90d8dbb58941dc0f323456569017068f5143bc2437821a752685667ade50f8ba20084138b3f25e5415c849b0b1308ed7de6e248d8ec9bb3c30b70542586f35b369a64a9b7e2bc76ca90e6b8bda2101b8060e47def1dbdcd34f53844f51beea8e00999473d2f8d59f8523bd883cb2fa98385c0245fd763363abfcf4965b448dfee04c3a351639f752a78b0ced859b4d62d08ad9eecf7fa3c4d63e87a30d2353bc4b26bb642ead7fe91eaa209770a1bea239948d6e92b91de6cd891bacb7d6fd6959ef03864c0aaabcc623be3688efa70217a0d91ac8e8793e31ea12c5a867466a867c3389beae01cbbf970a8792878b9b7e45192a96c949453bf7f79d70a2e144bd7f255f11deaf6ec78b87a7ef882b3419e3cb68e4ed178d646f43ec2bdfa8c531bc52a7eddfed88e0c610377a1869b6088ccab1f0758e567002248eeab955f23436e6843665fe08f81a78dc275211ff635a82e86c6722696b26f11049a77531f9aafa692fa94e3848900fcfbd7f043d89518c6ab1203fec4c5a7acc5c19ad8493d4ae3f5fc7e82808ca43e6e18fca50feb4042b7302b00c39f1682c54f026c18ac60f2120ebcac626c0595d3756a3d4feaf6a43c52a2bcc920c23059d1415adfee7140f7b52a09a7601916516d51db30aea0ccdaa69533d7cd9de080807fedd2c90d179954169bb9878e1da8f5ba6cea590f12348793c994da419a334f5ed2d84769e295f130aa328a836bef653d6f64188b60fdbe7ddaeee57b307b1f7bf8878bd225be91e9c8862a36fbb0e42d5570e53fb46bafe48c47fd687a308ca263334dc745210eef8593936e5c97e9b2dc674d30b113c1c8a78019e17efdcf8c4b4143b609c569092d69cf6553df33151aa720a62841e8547bdeb35b7294b3b13862564c5eeeae1f16c3725b95bfd86f38b4ff6fdae0003c57e7c86040d1f758585346fc01d79d432b288a9989d347e87000ff84d002179ed029a071a8b0337748da55fe570b4216bc25e17252e92e455314837213da022f9c4e2f34d7e045587a7e1a7ae579a5e609723e30bc7635a3ab660b220c806ced27381056387f566bea8de978a79801a28a92231da43672bffdb2ea7d42d049608de1e2e7b9436c373c191e6c104d31b325330808d0dfd368a37dbb569147e65280f37a61d9107bfa56699a845d5eefe0a0796e6276296aeef7074511d7cd08a1fb9dfe978bd949b99ba02d87163e40016387e16256e1bf7117e81678d85a3b68293d0dab90558a7fec7a637a9649af06a8ad1d3f7065d3351f5b382b7c47ea620e0765c0cb7fe9169dff15dbd25cd3663e59eea6633231fdeacf19b533c0241bbf9b27cd656f85f03a474975765747e1f37c15b9a8f677fdcd019269f989da2fb41b2e6bcdb825baebcae71208c839f5305da4c04c2768c8426a43808c7df2a427764ac975dba23be226095345f75acb8f20b0ade9e5054b5fefd49f4ed8b87f598dcace78074fec2ad60c1936bae2854cc873988330ce8395bb206880d68033bdb69cf40e9b71bf1dc58e76e7d17b5753236b8ee23c22665268b041e7bf8ecd106ebc3c16c6fb72eba2b9a1b8a5a1b4bb213680a6263bca9d7469f331aff4f63694335430beb2faa0e382b326dd33b8ee56feb7d89f5cd27a85b1a3bda7d8f82e294c9f9b7e22823265042ee42779db7cd97b946e116c5d7547cdc0c353a084c76acbe218575616cbc529d6d5329a9c141ae7ec726e381559f63bbf535f992c86707aab3da4cff50b6f6397c4b9c62c8913758cd20539e4b5e09da4f0fc4bfc57322acf0a64d9d986ee49bfcf53599ad124241e51ce84936cc94981c1da97b64d63730bd146e61a20881d2b32b8ef2edde4d5b692a93869743d1166f19dbe10c8ad7e8e8bd9bf1442bf6eb83707774589959c6ab354feebbbb6a</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="搭讪艺术" scheme="https://blog.jzxer.cn/tags/%E6%90%AD%E8%AE%AA%E8%89%BA%E6%9C%AF/"/>
    
    <category term="把妹艺术" scheme="https://blog.jzxer.cn/tags/%E6%8A%8A%E5%A6%B9%E8%89%BA%E6%9C%AF/"/>
    
  </entry>
  
  <entry>
    <title>nlp的两个关键知识点</title>
    <link href="https://blog.jzxer.cn/20210617/pullAndPush/"/>
    <id>https://blog.jzxer.cn/20210617/pullAndPush/</id>
    <published>2021-06-17T09:24:01.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<h2 id="抽离"><a href="#抽离" class="headerlink" title="抽离"></a>抽离</h2><p>我们假设有一个场景：今天上班我在修复测试提出来的问题，大脑的主观意识在说：好烦啊，怎么这么多问题要处理，测试那些智障在找我麻烦把，我写的功能肯定没有问题！！要有那也是意外。</p><p>在上面那个场景下，我的心情是焦虑且烦躁的，这个时候的自己就像一个火药桶，随时都可能被触发导火索而爆炸，在职场中发生这样的事是非常危险且忌讳的。</p><p>我们继续按照上面的场景开始，思考另外一个欢乐的场景，一个惬意的午后，我在和三五好友玩大富翁，很开心我赢了，最后配上斗地主的背景音乐。把这两个场景联系起来，合并成一个自己创建的加工后的场景。</p><p>这个时候，很奇妙，原来的情绪减少了很多，这就是 nlp 里所说的 <strong>抽离</strong>，具体的应用场景有：</p><ol><li>当你正在经历或回想一些 <strong>A 感受</strong>，可以通过抽离去改变当下的感受为 <strong>B 感受</strong></li></ol><blockquote><p>抽离的另外一种理解可以认为是：我们的肉体是由一个为上帝视角的第三方视角控制的，所以我们拥有两个意识，我时常会用上帝视角去看我在做的事情和想的事情，以上帝视角来认为我只是以上帝在经历和指导这个肉体的人生，这样一切就会变得不那么在乎情绪上的变化了。</p></blockquote><h2 id="结合"><a href="#结合" class="headerlink" title="结合"></a>结合</h2><p>假设有一个场景，是你在电视机前看一个人在坐过山车，你可能觉得对自己的冲击和刺激并没有那么大。<br>但是想象一下，你就是那个坐着过山车的人，仿佛和对方一样在经历着死亡，这个时候你的情绪波动是巨大的，心跳速度也是直线上升的。</p><p>这个以第三人称视角变为第一人称视角的过程，我们叫 <strong>结合</strong>，具体的应用场景就是：</p><ol><li>当你想象某个人一样拥有相似的人生，可以去学习 copy 一些他的行为习惯，从他的视角去考虑一些问题。</li></ol><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>从 20 年开始突破自己固有的思维，从 0 开始塑造一个崭新的自我，这个 A 型自我会彻底替换掉原来的 B 型自我，是一次否定自己，并重新认识自己的过程。</p><p>我也很希望有越来越多的人能够突破本来固有的想法，遵从自己内心的声音去做事，不管这件事的结局是好坏。至少是自己发自内心想做的事情。是完全不受外界干扰的一种思考。</p><p>虽然某种场景下我也不希望这样的思想被太多的人了解，毕竟这个世界的运作，还是需要大量金字塔底端的人作为基石。</p>]]></content>
    
    
    <summary type="html">nlp的两个非常重要的知识点...</summary>
    
    
    
    <category term="自我提升" scheme="https://blog.jzxer.cn/categories/%E8%87%AA%E6%88%91%E6%8F%90%E5%8D%87/"/>
    
    
    <category term="nlp" scheme="https://blog.jzxer.cn/tags/nlp/"/>
    
    <category term="神经语言程序" scheme="https://blog.jzxer.cn/tags/%E7%A5%9E%E7%BB%8F%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F/"/>
    
  </entry>
  
  <entry>
    <title>洛阳游玩记</title>
    <link href="https://blog.jzxer.cn/20210510/labourDayWithGirl/"/>
    <id>https://blog.jzxer.cn/20210510/labourDayWithGirl/</id>
    <published>2021-05-10T06:30:26.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="b516fc7799bebdbc3cadc0ba239bbd38d28c670f15c5a85b112d2069ddb2bb08">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf70a7cef839d628f3a92f9da565bf02139572d6c60646d525ab57912184515483e42997baf05de833274a2fbfa0a0aa431c75e471227a81015f801d38f48d6206851e4cc2ee314d54a09d69aa6e6d0cb2f50e2778e98eafcac1c5ec04359b4a3c9893ba7aa97b94ee2114241e82b7df046e248a7f4943d0275c60490bc79159aa897f025189b7b41b0c6d2151af28cdcb7c50bc9f09918981083a1a803c615327d5f200820e4a9728b0b1a7ca4ff370441fcc261bd7c576e68652e384b5d3860dde9cbbf3d005224e481391adfbcb4692691692dce431b3d363f7c035e8beb9937543c2d6b6565ac717108af5945c1a37fb4df972f4e36a37e0e8726fd66e11be9f57f4f77954305f60f7b9b27ddb7591bd04435ea6ed1a7d96e4e2f426d2fd8a07d81a2c0d0ab8cb065a11d3d82df767e0a821a4d35a5a74eec0045af430c2c8649afeb109eb1177e885701468456b6736a982f131da5cfdc95aca0ca1229788738f69be6cf911d96de0587b949ae27a7e7e84695e2093c6a5d3bed096cd4936cb456cc3b85f01bb35337afc470129a10feb0a159b09c6200053126b65afd6bce096d9a89df82604b587f744dc673cd4578b942fb266e1475a8dfd7b1e53474c299b26c4c8f14ffc9356470f9474ae6430f0828d2913b6e10efb247f99e30a5c9f4906ef1904f65fbb63ad5471a6dc8e5d27855755c89b23f99412689e7548db62b6db13c660b193392df397a1c23e8b821c07d6dbbd21b40c337706524734c26d14148d5c1cf3bef51449c370b162ca587926e2c1901b5dd68115c9482fb0985b6aa92e63ea55e8172ba6cc58a02237ab6d3c4896a85f380aff46c50bc2c42553304a01c60e00263b27002beba306139e2a49c0f595bbe5f960ce9b1400074b813c3ec655fbf968f5033f3d835e56258e60ec459ce37a56cf301deaee3d2bf68c0e515ff9a9e28718ad10a1a6371689d4e539ce81ef6520334db6511eabf6ae2b8205f4b4ba6a53144d406fbbbe21a28eb2d6f39716d7049126de91ffc525edef63a5fd397092f6e9de072286718130b68b71d70901a159f1bb4ba78bcb7d5762d18554b8b3d3db5a43b81c9fb9941d7956f43d4fad24b67ce630e80c525cabe67ab26a9580fb14276349a895f08a9f13a517b965d592cfd13c9512f254fac141ba821010eb47b97d8ff50b584774818147e5bfa4bf11d1f1fa87d083736a0a09750eeea121e40813822160ecff8e4a17bf94a44ccb0f4859819a9f2155980fcf3de27f7bd7d8af30d193392ee889f6b203dd189057cb91dc1c2b25478b2cb6d9e2f18705b4cb9548734a95cc4302c7e7b4fff9fc661ca8d755a554b3101891b83dbd010b1bfb4acd346b4b0fe3cc4f560de56215201e601ab56e30aa8595a2b32009341ca5753c33411320a0845cb599f46c5cf1b314d76c123c598949d4e32eda14768c1f4ad54695b85e83d49cb871e767680aeb909b8e320e6f4f685a52e1ddc69624063d5b243d3ff5a813d767e6b47f28b3403b641a92138414da844e85d913df5b7130eef368d53cf334690d2059b74798f4927fb6921b3c8942c47e818f30afd76b39c343676c7b919003bc5776c78068878f3558df8f76ec11642ff58a205a05712542c17279adcb206c2c25d929bc721720ac1f452ec3cd11b0a1b10d111dacd023c8af92276488f217aa4186fb915c8fbfb84e1cb9e3624afb60f51b05cbacbe4c6457a1600a81f80404795374c52922b78f1675244aa0977848b0d7221dfe92661a899c64f7c8d3d2fe3443071cffb107de741206441bc9ca3d20ad407daaebf3237602c6c17d0539525186c3187719ea90b00de3e999358b1d9d534bb7757b7979bdcdc957c0f214c01c142be22a5fb074379f64bff7de206e1d2f255f5153bd2db31c4fd7074b8c9ec978c62d3d9f41dc1a18a1a01bc7b363b8d0853b7916377c6540ccb80768044b30956ef79595896f8ab7206d807383ae216f44317f290054667d3fd1d37e72baf157fa58bbdff599a32109579a59158333cf4f97e337bb5a167a902c5c8acf20f38513ee123bb792e53e03fb1ca0644e76c1f4b75463cfd180d1d2e148fae1d88fa43d8284fd18f2717209fc7f07c6cf590b49e3a174e74d232a841fd4f84e90f4a36aced0f34421560ab331bdd90d5eff500084873d2126e309aa29ee0ae7f7be21789174a1f73aeefa0a4c1a1ab870effbf107835984339afe38d6a3074a25a9bed1ff9e97cf3b49413682fdf4ff4a7409b1326408cdbb48d5c8790dc607a69fc590dc7ec3e1c81f2c152b805cde0fca7c198f9dab2c24bbf9437e224345ff9658393c6e1579ca6282761413aab7f1bced9e84056776b6955360f876272e81e0f6e5ae99d37fecd49606515db92077c436f853361e9b171a7768977f088ddde8f104dca85e27262f3442ee4183e22cf59a61cd013d81f39dd518ea9ce3da86485362ecb25c62bf8e0ee8b88922c1045b9a8e5a230e90d6bdbf18dc84bf2f7a41250447513730239152f36e53063449e7b31c7dc1798d8d120f09e3888a3910b276fa6a24c5478bf71bad791fe5ae60201889b6d90fb6fe976f790900a3bf25c16aafd669425f7699e1d5c16394df54877faa1269f2470941273577d6c0e36bcf5bdf75634e5538ca6290500c68401cf58a28a611fde56fa0cc233c79ad40f589ec649d377bd7ae53f4f73d26649136fade0cbaaf4afbe65e6b6d1117e13bf537419e13f1bdaee17a83b923dd998e49400253715ff373ac11fe30fcedac87be9bc429ad326e7dc492e429cda49559755b374b48b6138c693cf3fbf58a5459cac</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
  </entry>
  
  <entry>
    <title>一次酒后的经历</title>
    <link href="https://blog.jzxer.cn/20210131/yicikeigedejiuhouluanxing/"/>
    <id>https://blog.jzxer.cn/20210131/yicikeigedejiuhouluanxing/</id>
    <published>2021-01-31T15:04:10.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="3a122d9422aa7ddc082e1ce7f3ae3311358d178703d6ac52b35685a8d404a9ff">9f569a554bb0ffc9fa3fcbf6978f7899dafa94e063d5ed661ecc18d144e8dc94c3631e6ffa00aaf948803c9b4f83ef10d69b30f4814e82dac763f9e9cbbeb44ae85fb68dafa027b4de4d47ebfea16def9447c00a79f73635b8f6da8489f347fad34009ff01342b54a63605a5bb63162e1e9e160457be0f14886aaab5dd76e5827d8d0ee33391ed4e9d21e06058d848c109b663953786691c41ed6e7831fb5abc09033035703ba8d7a3a707c9701bab26c5a0bfd30460825f49bb5aaf5aeee686ec5972d04fb0bfbdfe5fd9f67cb27344ee28f41f27fee529c91c601d5e4dadbf4a2145234684dbf9fa47b6ed9704103d2e3024e263b7cf3425a3798d9362100edd5ecb9ea71161f12a0482f01b1b4e9dfe13c5d816d2a5409003170b077cebcb0737a0929f0e83f834b0a8a8f8a3e2718729ae227bd27f254df7c6149818f7832f50d3cce65c3f4bf5918ddfa2a011e04edd2a0e2b97782ad0a30e53d1f5eeb88cc6855514e09011d2cdfd141428bdc2757eae0100c4f21afd840fc5e885ebe12a43a8e701079aca028b9486f5837365a127e1f3a903eb7e6e5e282d55ede3abd0d3f22cecd8b0505745a50b08f77868c4a0bb2f5eb5048c25ce620377e7b4623f3fcaaa2d7a8e3e1d1a2b6efc804e8dd024945d01ad19a09eb63cad7c1a6f85bd638dd4f1a64784c350dd65568c138cd8efe784c5867d3c4d90f0d65f6346afa06df3742979ebf1536b93d73a4817badc41147696496f0314f7fad81df401d70f30405ad28e8c10c9a2296a634b61bb35800428ca8f4240921b9ad98dc9ad9218b9c1a902e23c2a929b7145239e4293d6db1f0621a7d4e911195a4ccbc9e55ef229fbd5bd6cb78177fb907daaafedfcf83b4db41a4c651cef64fbf72689a1a54e32d634ae281358f661275a67a4cd44a1a51ade32443380956d5e1f8259d973f6ccd09572393688d797ac39372328b1a5c52522d08801021c0b3c6d0b2ddde815210625848b121ac40b1705f7c3538a3dfb3522dd3332fc72d3c844a474a68d4f228b1cc3eefdd967f989d97dce26ba5087cf3c251df5f16bc8c281eb27cbbcdcac6deedfef5062dda5dcbb8f01df8f9b03a02bfa81ae367c0c1939bc2d964a0e6cd2b24f04eebd8abd3a68c6cd105beb0bb06b94fee2a7ff2f90336651dd497e9c482e28bc0c05d3c54c072c9dfe1e23b3cc71b9fd31bfdb36a7cc6a11b22f0de4eb38c9ae02e31a03d9735c475bc67fb404de52c23d5811482a11da01cb63ea95db4b004d76f71019e376faccede3bb2536f82cc79e0ae29f35657c8c543ac6bde9a8d3c644b08f21860382d33568587422c13684dc58dd8b3503ffa048519b01f145814f16b644e18af9c9a4cc956341801f2e81df536cdec865d91270908fb21302a5c67f97801d6f44500ca69fd7ad698cb0e8704bd1b6227b1cb75de1a0d8d0ca78c36d26f44c147438d1eb406f647fa07b196cde63afaeac3dc72e844be674b1553f6fc37a073ac31ca5cdb9546ae6c3edfb67c7e2ade34e09abc94abdde44b569b560fbb2944179226135516104964ca9f4531f06809cf603baf37c4ed06579663b075ae7d39a80029facbde40298bc1e697fc08d13ca7a0abeb6e5491c596eaa0a7c98a5d5b9b20ff2f72755241efb5b89fc60648b0d6f6faf46aae75426f084c89e8867b9d55fdd43dd921050c9a3eadca59e12578af8267a28e7203bf8a650156220636d5e92a8a36b71030945f3c98fbfe121d06fd0873c0731e9dca9d85cb780137815d5e277756ac1a89ca410d285824057b42b4739c612a504744cf0bf2a081e8b9712aa5afe7de78e0b3bcba586706cb13598ddc812530b6de7eadcd161655282bb1b1d1545d6d8954fa316e56cbdd788c69f07cc4c7f275eb2c926a98a9496b8aee188827f7c3810dbab0e9fc4fff64f1cfaf38b79cfc555bea6677be726d8b548cded52982d6fbf6d10676a00a723f8750fba34f70e6dbec8e957180ea7b7669a1ca680b7749a094950b545f1a2c495f0af6223828d0979f578110de2b915741bba71c9db197f7eea54cf3af2fa40015fc0560aca00bb0bffe7fa3f1257feb34ffede0facb9037f205140e4c6203671b9cdf640520afb0d63aba315a7117eca9beb8c07b99ca9d7bc0783c2d2ee8807b87f8be784f02a04d8fd3a00f7fbb96816cf59d07ed9d64f3b3b99ac7be93a6fb3931f06e205bd680e6cd8479e15e44acba7bb54433d23324c2f472378b755269ea920c4530356cf5c3389b92365e99b6cad332c3fbc1284a2b2cd7e4eaf9d5ea7c72590cc77e28b10eba220bf61ee4996ae45b4f208dd2450acd4cfbe8d0789732e9cb4420c180c6559a69f7dc2682c5cf5e9a0d03ea1f281ca442dcaaea75c1b2777d371df7d46d6915acc261513ff83c4757778363563eb8cea065fdaf689e646b2c8620dc21419322450c0ac9a9e9db1e0043ea6762de3e66b0ed492f106706f0f1de95042c4b782a0f3d5fbbe9dc2be897620ba3a4bce5a4b2041b3ad5b47d4a16b4990f4d43103175ab678c005e9d6a103b3fb8f53c48d2e71c816559cac688071cfe9416cf7ce82447f27693d8cefd7d344f0918c6e7a04fe9b65291e4942f4aa738da08dd499b53b3678f9eae58b23f46ff0d392f8561c0e0613f5241c8eae06e9593e9d458cd02136b564bea35256da47baa7d041ec32f90ebf5a1dc89816c14d266a64975406b4982eeaa6454df33d448a0acbdfb7eb5ef5d9a2ef3d776df110e18024e6fbe269cd30a0adb01ec7acdd33abb90c8192ee88ecb15332c68fad78c6036ddffaa16d37c1adc72a32f5ccc177c42893798035a65281d85e28b5c75057945d80ab9d8356827d0f9944af268b5d0c6fb9f63da60faf4ff1af9b93e107fe7812d82888d6d150f3f7551f6daba60c753a6cc3e1a64519a3a58e340723b7bacdb4efcfa0d2a79022287352b356e026eea1799670518f5ba7e503a82418402e738a0122d388c568ef35930eb5256b351dbb8c5387000b72afda1f6254c1cd75c8434db6367d5c3fa3d1e946ed5f0c4fae68ccb896564031dbb1b2271d5b3fe197b17508781fda3647f2779ec6e1b6c5eab892ff764d8f79674de349d659edecba178949697536c0a1d264c6381a8d5c5bb5ed291ab30fcf31dd8962bb986e89b301234bda62459909315f62d0f32aee0a4878e656bf98dca499bd4e352292a1015e75e558f8986cee81d4230a29373a3e092db16ae222c398cecedcb712587d8ee375e7e5abe1cf3b11ed832719e703c42fe109fd5485536286f6e259ac0d50bcd9c045a944e7668f0b6182ebdf92a4abe16072455b014c338e17b5fb600a6a693ab246a199c4a8e785807269d3a0c4892e3dc394254e08534c9d8da1f6854598966c015f3184ba473b6d3340b3c5af996d827fa2ccabd77d7d42fd34046bfaa1195b2217a9ff217acd3fbf2cfa55149bcba118e6c76185b48fe112791a024c9d899a7de08f65d848b6860fc188b3b159b49bbf17e249ac2cffe25ed71ec448d81463841185219db3afddd77efdc111c73fd161da03f36925fa8bf6c40eb450c74ccccb35474bb7c37d0dea4e43a66e65ef28539cf5f6c7408d9df357df1dea8976faec0359882cafbec018f40800f760bda5d4bc32eaf1f437f4cb9337690d8b9182f1b4d7f92bfdb0eae835502496ffdd4656b82dc14bacad19b3d6c14a62f0e0995d5cf68b4ed88d1ab01fab9158a42f455220484e216ef281b930470476099942e050d023aa04a0fcf1f750e9e84c0f20ff0de23628b80ab9bb769137e429e7b7d7b880caee24cb5acd7240de04880ae9128324a7730273a6c5a54e13cb027216aa800cf1dfbfdce85cfaf0e14c113f66f1348587e7cdc2beea4a3646737d28a7b1fd2206704dc389524d9514a7cb72ffd01e3b23eefafb61896d7237acca6a7bc9d8c00385383c9a858733382140faf9b7380e010c2a386b72bcca980679b563cc7d9c41de422125abce16d5a23e751893e069e009651b3a24df7c845a486e3646764eab92e111d37db8f42895eaa512fe4da6a87bc37b98ec07848d25f1a62ba9edcbec9a348a1cb0c0f7f685ba874df3394e0282c9802c9c437478d7a2d9c25fba94e9fb013e53a977e8683ccf5bc6642a4ec5342ee26da1bf72cf436128af01498ceacb15897e13fdbcc4ff54c7fd3106bd227304e4b59fae5449bcc0750498c8cf370afccf114d08f65fa37de8422fef26a927eebdfffa7be4e234c3cae059c0e9bbd86ae986c00c4ddcb4a7a5bd387585dd9d053d73cc3e516c4bd21c7563df7126f14576422a30a3ae7996f8dbb0021194f422b1c9841b1af383d4a0dba898766b37618146b910357ee5dd4a7b42246e53407eecec1a4ac05419ea44a728c9a62750649c65451d22409846f2ad787724ffcbf75a08dd6f68e933b19bdd73ef4568f3cafdf2cb18f432736796dbbf3becc4a1f5cb7fd5211835a3323362b1ac682e0df5c4aeb0c89a1b9cec3da779c7dfd07b361c7e26572a59f9e8ea7fe07bdd89b1479e647f402919b1f2ebd4b6331ce83aecb6d72f790684073a8ef9395237e5d46271e6639c33d2b141e1fc16119acc92174be3542e47237c2572068913306da048bbfbbf86666d13bf2d71b40b1f3c0e81f42391810ae0d20e87b251da6772b269710c0df0429a4d370a8df7dfcc2d0a549b037ff7ed8d12e269b5c3b388e76c1757354d1c210e16d9efa45eef7f2aa22be537d872bf364ce0ec62b19e9d29c17e65d73b619fc253ef0b089abab670bf9badafbf450db187246f2a3970cc3d2861a26b3b2b3ecd50c64e00eea5649df322cf3fd71b5461aa1ba8d8b6850e37379d4d4eea394c1871b4a474aa8a9b6c635b37333545bcf9fcc9f97b03c4084ec34c10c51d85fccdbb60c3745de5719fd10e33ed37d97fd9f2286e0eba017f7b79ae5be4e65ed585283c189995ef8c0baa6a9def70dd006a2eafba2063524b3ccf3c483c6ae0c752117b1170f5ac050cb4363ed28ed4d6c918f2a247cfe7649b644459046a6a35fbad978abb90b31b893701a3d4d81b61fce21b7485722724fdcb3c3916d0cdf20f6e6ec46740833aa85d4fc150b03bf9c2c244738d96e93e79b8ef636b2e27d10ce1fc63b240952168d176c3b953ce76b87a01b7c826022ba2d04ac7802426850db9703c4aab141038ddfc5efe533345e7ab70b8521eac02ca397851472b164105af43b69aac03b37ab3c3d4f6c2ceb4f8b2cd1b397d4f44375d9ac1905cad957b9e924a41f875e4a61dee539a934c3dc5e7b0b0dbecd71686f149120815f716890c63d0f54a157ac8cc0cc8f2f2b7e5294aad6380da6b0e9acba1df181abf2358b8b67fcce659fc935537d67e28e7dabf050eb9336c224e097aec85e332a41840f11bd26e1c5bb2629deb031d491cc99801ec699725d8bb2550a93fe3318bdb36888aa2eccf4325be103ce47de698f647f579e7eea95e877cc92bbe091607471987b596d1ac940acc385c20d3baf0b690fde258041c064111fcf195c16d96c0092934ce6cec583e1149ba809374405d970c340f6e47ce67a2f77e7d0609e6819d750c92b7407f4b23c04551d6ce9c1b259bb5453356ccf7afdc6b9756d71eef2f4b8816775949ff6f8e53721b98c89e573bb8a8d6e5d0fbf049a4617006697810ca413f7d7ee8069b0a38020b4a7d0623fe2a20b07a4c6f089b53266b6886a2eecb75e9ec3f5dfdb075ea512476e7c7a9c7d051e307e119604d2ce4c49b5109f2e1b23a7374b6efd4e576ef8768e8405b96e938b58e7ac9338b7bea4cd488cadc89d72185d7c77e9d8759958bf2b166cd0e0e953d6e69197f3b15f120f69b8d50faa023c1c1dff2f242422c22bae64790d9b3842d69d99271bb5bbb0054dc66adebf3d89290a144843352fa0f5902a67d9d5dc185f0aaad89d0d46416afe08d9337bbb0f14b26153b1a1903dfe6d7ee58da33dee247f9a32558667268e1b568a8b34bafbd6635cda928500fa1391722b67007b279311548d5a4f34afbd48b06385a3a372c56d696c7500a8d0e8356023e2175c881e856ec5d064148578fda711a08762063adf554e249ea6dce7b3908966f365c85d800bd9ed5cc163dd38af07f574dbc0c8b6e858297d7889dd44a49ebc80da17f0fbdbf8c587ffb06e31be2da0d0077c064bc5040ebc9ca4e771ad0697f9631b2c47838af648ffab1f624e570ff25085ec1f66d0b8c2972368c30e16e487df7d37cde5da9fb73cd79d557f0a1c6392a7f8231b04dd34d6b26ec49c991251ecf76037d540d67f430bf1824ebb75159c924e463d41a2914d0f66fad5bc2f9ace0d7f1f81c0326d36d3267d30b6103b36836683b8667e988734066e5f8efac4a8589bf54c86abbb0aa171e6125d28407aeaf03fe5e8561d28e120ebcf5bf89d423602770d2cdc0c75242a02c7db1ad5ccbc512c40f086d52b5740f1ed8d6de68ba37631dbb4e796a6f67c81a4256ac341eddd8793b991af4173bbd9667fd3572cb89a3ee01faae5e22c1bbc2ea8feefd43e1462e4fe9f223ba3e8a548a52a6125f4dbd6e0490178b3d337a6bac06121039d2f4fe7447ffca5e9249a068666076</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="雄性极性" scheme="https://blog.jzxer.cn/tags/%E9%9B%84%E6%80%A7%E6%9E%81%E6%80%A7/"/>
    
    <category term="把妹艺术" scheme="https://blog.jzxer.cn/tags/%E6%8A%8A%E5%A6%B9%E8%89%BA%E6%9C%AF/"/>
    
  </entry>
  
  <entry>
    <title>雷军创业心法</title>
    <link href="https://blog.jzxer.cn/20201009/leijunxinfa/"/>
    <id>https://blog.jzxer.cn/20201009/leijunxinfa/</id>
    <published>2020-10-09T13:16:45.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<h3 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h3><p>源自于你自己那股莫名其妙的自信，认为自己一定会成功。</p><blockquote><p>自信是成功的基础</p></blockquote><h3 id="企业最致命的难题"><a href="#企业最致命的难题" class="headerlink" title="企业最致命的难题"></a>企业最致命的难题</h3><ol><li>找合适的人，三顾茅庐</li><li>现金流</li><li>在没有收入的情况下，公司能活多久</li></ol><h3 id="如何打动投资人"><a href="#如何打动投资人" class="headerlink" title="如何打动投资人"></a>如何打动投资人</h3><p>资本市场时时刻刻都在寻找好的投资项目，你的项目只要能给资本带来成倍的收益，不怕没有投资。</p><p>在这一块我个人观点，在现在的信息化时代，我们有必要做好营销，好的营销手段能够让更多人知道你的产品，你的idea</p><ol><li>团队介绍</li><li>深入浅出的说明是什么</li><li>说出未来3-5年、5-10年的规模</li><li>两三百页的商业说明书是次要的</li></ol><h3 id="危机感"><a href="#危机感" class="headerlink" title="危机感"></a>危机感</h3><ol><li>给自己一个截止时间</li><li>不要骄傲自大，一旦你做一件事感觉自己很了不起了，你就离死不远了</li></ol><h3 id="股权分配"><a href="#股权分配" class="headerlink" title="股权分配"></a>股权分配</h3><p>首先相信自己的公司能成功，其次股权分配要合理</p><ol><li>不看投资多少算股权占比</li><li>股份分3-4年给完</li></ol><h3 id="如何搞定合伙人"><a href="#如何搞定合伙人" class="headerlink" title="如何搞定合伙人"></a>如何搞定合伙人</h3><ol><li>是否认可这件事？</li><li>诚意</li><li>是否</li></ol><h3 id="什么时候找投资合适"><a href="#什么时候找投资合适" class="headerlink" title="什么时候找投资合适"></a>什么时候找投资合适</h3><p>在资金充裕时找钱（50%以上）</p><h3 id="七字诀"><a href="#七字诀" class="headerlink" title="七字诀"></a>七字诀</h3><p>专注、口碑、快</p>]]></content>
    
    
    <summary type="html">雷军建议创业人的几个心法，让你少走几年弯路</summary>
    
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/categories/%E9%98%85%E8%AF%BB/"/>
    
    
    <category term="思维" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E7%BB%B4/"/>
    
    <category term="创业" scheme="https://blog.jzxer.cn/tags/%E5%88%9B%E4%B8%9A/"/>
    
  </entry>
  
  <entry>
    <title>国庆的一次西安之旅</title>
    <link href="https://blog.jzxer.cn/20201003/aMidNightPickUp/"/>
    <id>https://blog.jzxer.cn/20201003/aMidNightPickUp/</id>
    <published>2020-10-03T14:18:18.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="366552011ba39df31bceb6bc95e4f0c83380e62a6c74022d8a8108e8d8698d4b">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf70a7cef839d628f3a92f9da565bf02139572d6c60646d525ab57912184515483e42997baf05de833274a2fbfa0a0aa431c75e471227a81015f801d38f48d620686859654722c2c8e62942c1327dafbfa05f1438c7e9fc57ba45b3ae4e14a25831fda6a462fd78f538f404752a14a015d6440ab3012f7ed18258e29e467f5216c7172f27bb6eeafb2f59e44a5ac347d326fe4e4eddbb1636a08966f7630edd751bc01742c6ca69582747fbc56816afb2c9226ea99fb973a3f4e44621319c3ca5c34e671b0eb9e9d9c414ccdf390ab111debf345785d3b8933c5b9273e82e7dfe6c16418a6f10229b77ddf45cca3d7ecce2ce2c99f6cc306159db0443bffa22c0f9a9a98f181275bb17734109f006f44b4e134027192b35a7442d5700f24ef54a1d86ab834e3c6afee0e3ced35153ca4c7d885b0e858a0ca5dc74b2a95925b3383300e75ea52d2a715823063412d73dd4a05119684c93da26b8dac3de5795d2c8da4572b4d6b3a44c4384744f1fbfa6873a90b23e8e48223f139b830aff8343dd5d310c4e55de7bb73521aa2eba64612194f33080091b37a528097a6d57da8f80b55742f842af0d7e5e3b0d7a7e157851f56cd34948ae3c2463d845edd88f1d519aabf480fa8a51e9c9c99bdb60a1f877f3892071b7bc0ac383bf3f0dd39c2982b65456809378ff9ef863d8db72442a81a728c5daf289416cac20918cb0001cad8773e0f612aa0d9accfda72207c796033442c30b6eb5c026c04ef10a7310fc80fd28d9da1fe3227aa1530d52ea1ad8ce5cdf6b286ca6eaa875bb26c0317be67bc9484e6afb796ebe60aacd31f6dad7152b1299c8b8f71f1f9511d161be197b9d1278e69b8f2b4813e967132261f70036c42bacdfc9ef32ce430d8f1716ff41c86629995c859c05d9040f29dcdfee4423e4bb5614934be65b8eb7506bd7c8308055d69fe6413407a46d0784c8b9b1b22b6f7b4da821e5a54345bcc9c7c026c4b36b70aac9b75ed53c16807a205438437ad1f3416a34c5ee321aaa43bbcb42049e2ad5db126e57746c5b313184109791a4500cf71f14c060b3ef52e3d519c59798a13d04b704ee6ece5baa5f4ddaaa93538e17294c312ca4538cc9225e0ae510ef56ab232afce0024801a34d2226df03d90d585ac776f179e6779e80b9951bc96079ff04ef8fcbf7d71a4a8f8928641aa868dbc9ba201117e98dffe7a486b6744abbc1124cd9ab89e19986db6adead60f271f103691cd098970a0666e785f27de7dd6886836e88ca188d134bfea8f935e3ba161277bc92f78536504588b694117ff764f339d4e769bf823f63f796aee6cdb709c0baeea7d9aed68696b92c444d2afcbfc7d833a7de8e654a57afd0063f6a8af0aa2ecfa493d1f6fa567a268688d55249c64632bad4841969e3e98cf537b2844b73df13d545974079529463af4ca9e6d172bf72d5057b7cca796049d9d3445e146b020241bf93766bca06cf76318c90a87e68d96fe655dab15ef65afd63ff5f45bcc44d65c0c92fdc488e2367757e055eb06b63f634c3740f7f690d789fd3e767bc44a74ed05a7b78354785f668db951dbcfd93cb41bd83b5c8888bbe1d24ce1b31212d651198b1d2c904fcd767bfc6e97d4f9dc8f95aaefb5532751c1a5f91263baae76abc2be53716ecf5f156b030758624ac995c20acf12657796afe11d82dae3703428c43c476b16855c9f07be84a11a9a95dff388d667e4dd7025215d2b217c9e32d47d796831530c23ae76eadd2ea4a3ccd4e3ea09b3706ffaf47c47c992408c01947e224f663fa313a2b3840797e9efd62201a186c1535aeae9dc906984379599cde63fdcfa045c6604f8d3edd48ee4499b9d37635d4761b49c037b64be82c2b713dec01114bd1d01fe2118e6a7ec9ebe1918aacba8d9d05c86851d560de9f88e1ed190d08df8e1c33506777562ddbe52c09950265f908d2c5d76ee626f751d30abc1b8b5197a19a1812d10f1dddb39b01b8748f16aae1dc2deb5deb418613f0b931d9e5d63c46882fd1769e9ee11c711444cf329f63e3d1019bc99b1c34213a277efe7ff8e773188d444c74ef603a6740b6f4ce39c6c4258c7bacb26f247455a716d55e86f0611899b3a595d4497616c5698df339187324eb06dedee9dc68e08819af5085fee208c2c0e39902a54600ff40b927e8aacf11ff77ceafdd0a487b64d7df226f46ece5c566f280354bdf75da9161fe964b3aa97473f07103d97681d5b3085b0d141dd002423e8b514ecaea4d3872c536ca571a36d2fe5369adcb5b7d03501516090cd6622e9fa48aaac49c0f15239472d17ef025148052fedcce4e9fff6c78eacc10240f3e8264613cb5e1d9471c4c954d13224c04f28e5164931ef39480892b1a22b48c717fa0093fd8f525e540e2f2dfdea88599b36af7844ffd9e25926aa6fc893668a7d53545438978dc653afb92bbaad6d6667398164fbbdb445716367441f3b1e765c963b4f8c88da5587e0b94ca1c956de6ecb18805eb9ad962d20ef0eb9a5d02d5e4b0a2b6fad72dcaef57c7e475683ce938b023ad870fa29e3ed8c1822ff5bee824f505596fa63175d622a60fc958a999cd304b2e120dfb965b8be469e6e5bb9ebb0e428daa2b703349be2cc4c69dbfa2ce7cb44cb7afc8d8244d02afae05c847014b90ce3180b7697856505ba2f009128e89c1b87fe172bdf3157a632c37def3723cd0356321d5ffd74711632272c62efbf98265a7bc813d9e138caaec3713b226de11cce9141956844fb7aae5a9235dc7b0a7c5b31e2714ac2c6189f8dff74d3b6519f65f28c4ee8b20d59ae97c8c1a406ef0fc03e5f52e7811cc9fe974b01252e4d72f84f6f4b79b9a716ff6cf37f307509cd8506d81f40899cc871192a65e81aa446057a6ead9b57a205efac178dc23364fe7e99b8e5d1d4906584ee2f4785428cba22bc3d2ee52075e7b9f37afdebeab4cade28051b3ff3389cf8a659ceb4c7d7c9950af95011fb8cc4e75a7d30532ea5415f1990f5b741bf27c68e9bfe9ea0dd5c2fe492fa572f091ad18ae2bef17c3d35332c5eab6baf95efffbb5845f815516772d2b1cc2ce20341056230a0c8d0c01ce3ce1f8a5648bf58d1275b32488bd092c5904d935b8127054827d67c73583902f174577105f5d26e2093ec7b9a65b2c735f1973b8b6e2b838adb53a520f0a9e11906ee1bdc40f436c0e61c45910610f67b9bb7ae325dc3cdce97b39eaf8ee09a3c8df9c344edf775dff75c37a90a7ccc33043fee701f9c65a5c6c85878410ddf8fdc404341d3d80efc05b0326814ed2af796a22704b8075eac3fd8c99017bf76a396e2e34f5e6a845b405d087ffd6918dff4096b5afc596a4c3a2cb9e8473b3cb366febf0453008732e1d3f5dcd06261371b2c9b0d8e6197412a852b9eac5df3e0d0128f4e62c7eb39489bc01805a9b397e96cbc4d4d6f20858033b325a3a61bfa52dbedd6667bd78779fa63c8fae85e8a720b3476ad4fb7c7a41a04f9757276774e6111f069d26a8797d3d5c10b8f3d0aab9e155f9d34291f77d27964d9ad70362f23c2c5d2c5252efd167754903aca365e075b2e276be4c656849b451d4dabbcd71eaa56fad21a64d514eeb28c1f25391850d3749e675ee77986601caa5d8e84ec94347bc912f4a9459d0fa576dd85e79db6cab5408c890dfa9d45e919cb2a61bb72c39a3938f4eb1dd67de92434ecd37b49a3a5758a7d3fec2c06848259bd27298106179d41e24af0c225e0afa627ebc241f2208a1e06c9cb71f0e6ee2ab6b5a7eecdab0d72c41ba0cef12bcac0cdd0b4ea2fb39745152be09365bc1777ca6910fa07bfd60e25ac2be722997822e28070457c0331fc6abc7a63227070a842737b307c80aa27858a22cd0503161b1bb372a4c7250de8f1848f19967fe522b894aecf61c30e66e7cd7df5741fc34bbb4bcfdfd4fa89c67cc307568a0d7482616bff1b26f759e6652687d8ea46352af8697b58c24c0b5f0d551e1d9496402e0ac5d2d89f3b80203df8c6d114ae24c708d0568774e210705abe5ef82146956dd9d4acb109442508cfd41c753ed3e58ffa5ad9405f8b8724a883768e7e6a40fa7d537d2bdcfc7f8d3328e3af44fe011b03c02bd46941920c009a9d1c3bb2d6283f70ac6011a7bd0f491cf97ad0205cc8db61506ecc473a762478d4c298e79530c96646b4771093f550239ffd5ba5db34c5f7b38c98a6f0abf38292498d064b5d4eedf09ef26b1336adbd5e784c3b9eb02a553f4dd0afb4025c16e9c83d0fb2919d56ce069f9b94c8ca66e28f37bec020299330f84606a744b8558392c18d42d4b213d437904684544e955b2c1d067972126a12a1380505b7deb7eced55ede28ed6887591e78b770f9d7f66111737a40792a5db49d6a8b8a8af942936e89e0a03afc28a52afb845411ab96a2523b9669ab55c1eab2e9e1b067cb5a1292ef0c90548227c3b430d4cea898bec38d27cb42b94a9390e64dc7062b4ddd5ef00e45aa8598009f851bb3867bbc5df2c456bcda8b539703950ddbda7bfcf1f0613592172b34528565cd126b78b4a5628b3a08990ccb56d46529fef9a8578efd60500aeb2a646820b8dd36e1f96bed9644cf30f60f7761b3e7ee102c1dbb8b1cddb245e828b85ee9f8c9c8699d834639a62c4b6c69efcbf5bdf8f78468e4843e48ad43e473cc2cf944742fad85d8b702f209ee04bf20878af3a94d58cfd633831a1c57e58a29558d44c3f28f40d30b21311ab5369650b5146df01269836848f2332bb6400df85940c79359832f4510f191e8d43d1d9e92b1b482221cb856f802de22bbbb</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
  </entry>
  
  <entry>
    <title>和陌生人成为朋友的技巧</title>
    <link href="https://blog.jzxer.cn/20200827/chatWithStranger/"/>
    <id>https://blog.jzxer.cn/20200827/chatWithStranger/</id>
    <published>2020-08-27T04:14:57.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<h2 id="TACTFUL-策略"><a href="#TACTFUL-策略" class="headerlink" title="TACTFUL 策略"></a>TACTFUL 策略</h2><p>要和不要：</p><ol><li>不要<br>a. 不要向对方过于主动提供你的建议<br>b. 不要使自己显得谄媚，高人一等或尖酸刻薄<br>c. 不要人身攻击<br>d. 不要建议人们进行很难的改变</li><li>要<br>a. 要明白对你有用的，对别人不一定有用<br>b. 要先说主要观点，必要时才说细节<br>c. 要善于倾听弦外之音</li></ol><h3 id="T：开口前三思"><a href="#T：开口前三思" class="headerlink" title="T：开口前三思"></a>T：开口前三思</h3><ul><li>避免不明智的言辞，先考虑一下说的内容，并且怎么说</li><li>以身试法，对换彼此的位置，可以了解到这话是不是很愚蠢</li><li>如果已经伤害到对方，停止说话，直到能重新组织语言，并以更周全的方法表达自己的观点</li></ul><h3 id="A-犯错后道歉"><a href="#A-犯错后道歉" class="headerlink" title="A: 犯错后道歉"></a>A: 犯错后道歉</h3><p>关注对方语言和肢体方面的反应，你就知道是否需要道歉，如果你真的说错：</p><ul><li>立即道歉</li><li>承认自己的错误</li><li>不要找借口，因为你可能为自己挖一个更大的坑</li><li>带一点幽默感地重复一下自己的歉意</li><li>转换到一个积极的话题</li></ul><h3 id="C：交谈而不是争论"><a href="#C：交谈而不是争论" class="headerlink" title="C：交谈而不是争论"></a>C：交谈而不是争论</h3><ul><li>争论性的表达会给对方留下印象，但是是负面的印象</li><li>好的交谈一定是轻松愉快的</li><li>这样的交谈，人们会更愿意去倾听</li></ul><h3 id="T：抓住最好的交谈时间"><a href="#T：抓住最好的交谈时间" class="headerlink" title="T：抓住最好的交谈时间"></a>T：抓住最好的交谈时间</h3><p>以下场合避免谈论敏感话题：</p><ul><li>在公共场合，和朋友们或同事们在一起</li><li>对方刚下班回家的时候</li><li>早上的第一件事</li><li>当你或对方情绪低落的时候</li><li>当外界的干扰如电视、孩子、电话铃声不断出现</li></ul><p>以下几点，能提升交谈能力：</p><ul><li>选好交谈时间</li><li>选择合适的切入点</li><li>不要强求对方立刻回应或认同</li><li>表现出倾听的意愿</li></ul><h3 id="F：关注行为，而不是性格"><a href="#F：关注行为，而不是性格" class="headerlink" title="F：关注行为，而不是性格"></a>F：关注行为，而不是性格</h3><ul><li>当朋友的行为危害到彼此的关系时，我们有权提出来</li><li>明智的办法是改变他的行为而不是他的性格</li><li>因为一个人的性格是很难改变的，并且你提出改变对方的性格人家会表现的抵触</li></ul><h3 id="U：发现隐藏的情感"><a href="#U：发现隐藏的情感" class="headerlink" title="U：发现隐藏的情感"></a>U：发现隐藏的情感</h3><p>尝试发现并理解对方的感受，那么对方将困难的事情说出来会变得比较容易</p><h3 id="L：倾听反馈"><a href="#L：倾听反馈" class="headerlink" title="L：倾听反馈"></a>L：倾听反馈</h3><p>仔细倾听了对方的意见和反馈，可以了解到对方是否理解我的观点和感受，并且抓住关键词，也能了解到它感兴趣的话题，进而将谈话引向更深得层次</p><h2 id="10-种倾听技巧"><a href="#10-种倾听技巧" class="headerlink" title="10 种倾听技巧"></a>10 种倾听技巧</h2><ol><li><p>将注意力全部集中到对方身上</p></li><li><p>鼓励对方先开口</p><ul><li>倾听显示了良好的礼仪和充分考虑对方观点的意愿</li><li>降低彼此的对立意味</li><li>在表明自己的观点之前了解能取得共识的地方</li></ul></li><li><p>关注并善用肢体语言</p></li><li><p>避免不必要的打断</p></li><li><p>抓住关键词</p></li><li><p>有反馈地倾听</p></li><li><p>澄清隐藏的观点</p></li><li><p>辨别并关注于主要观点</p></li><li><p>回顾并罗列要点，然后得出自己的结论</p></li><li><p>认可对方的观点</p></li></ol><h2 id="如何面对有压力的交谈"><a href="#如何面对有压力的交谈" class="headerlink" title="如何面对有压力的交谈"></a>如何面对有压力的交谈</h2><ol><li>放松</li><li>想象</li><li>确认</li><li>描述</li><li>练习</li></ol><h3 id="1-放松"><a href="#1-放松" class="headerlink" title="1. 放松"></a>1. 放松</h3><p>身体越放松，注意力越集中</p><h4 id="练习方式-1：对自己说放松"><a href="#练习方式-1：对自己说放松" class="headerlink" title="练习方式 1：对自己说放松"></a>练习方式 1：对自己说放松</h4><p>无论何时，无论何地，都可以提醒自己：</p><ul><li>放松自己的后背</li><li>不要总握紧拳头</li><li>不要总咬紧牙关</li><li>我的肩膀放松了</li><li>我的脖子放松了</li><li>我的后背放松了</li><li>我的下巴放松了</li></ul><h4 id="练习方式-2：深呼吸"><a href="#练习方式-2：深呼吸" class="headerlink" title="练习方式 2：深呼吸"></a>练习方式 2：深呼吸</h4><ul><li>坐在椅子上，双脚平放在地上</li><li>双手合十，用适当的力量将手并在一起，就像进行等压练习</li><li>举起手指，肘部要略微远离身体</li><li>深吸气，而后收腹将空气通过鼻孔排出</li><li>用嘴慢慢呼气</li><li>放松双手、双肘、双臂的肌肉，还有脖子、面部和背部的肌肉</li></ul><h4 id="练习方式-3：倒数"><a href="#练习方式-3：倒数" class="headerlink" title="练习方式 3：倒数"></a>练习方式 3：倒数</h4><ul><li>面朝上平躺在地板上，双腿分开，双手放在略低于肚脐的位置</li><li>从 10 数到 1 时，轻柔缓慢的吸气呼气</li><li>在说每一个数字时，放松头顶、肩部、嘴部、脖子、双肩、胸部和后背的肌肉。感受肌肉中的紧张感从指尖流出自己的身体</li><li>重复数数的过程，这次要伴随着脚趾、脚、膝盖、大腿和臀部肌肉的放松</li></ul><h3 id="2-想象"><a href="#2-想象" class="headerlink" title="2. 想象"></a>2. 想象</h3><p>想象交谈成功以增强自信，想象的威力在于激起与特定目标相关的积极想法和感觉，就好像结果已经发生了一样。</p><p>练习 1：想象交谈目标已经实现<br>练习 2：将所有疑虑和恐惧从头脑中清除出去</p>]]></content>
    
    
    <summary type="html">30天沟通训练营学习笔记</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="TACTFUL" scheme="https://blog.jzxer.cn/tags/TACTFUL/"/>
    
  </entry>
  
  <entry>
    <title>如何说清你的需求</title>
    <link href="https://blog.jzxer.cn/20200821/howToExplainUrNeed/"/>
    <id>https://blog.jzxer.cn/20200821/howToExplainUrNeed/</id>
    <published>2020-08-21T09:24:01.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1·-需求失真"><a href="#1·-需求失真" class="headerlink" title="1· 需求失真"></a>1· 需求失真</h2><ul><li>表达不完整，认知不到位</li></ul><h2 id="2·-需求信息传递依赖"><a href="#2·-需求信息传递依赖" class="headerlink" title="2· 需求信息传递依赖"></a>2· 需求信息传递依赖</h2><ul><li>阅读能力<br>获得信息量关键。</li><li>理解能力<br>分析所获取的信息。</li><li>表达能力<br>要求最高，综合能力的结合体现。</li></ul><h2 id="3·-需求沟通常见问题"><a href="#3·-需求沟通常见问题" class="headerlink" title="3· 需求沟通常见问题"></a>3· 需求沟通常见问题</h2><ul><li>角度自我，词不达意<br>按经验处理事情。</li><li>词不达意，方法有误<br>对具体事务缺乏认知。</li><li>认知偏差，定义歧义<br>专业词在不同人传达下会有差别。</li><li>现实制约，情感影响</li></ul><p>在环境或条件的约束下，并不能明确的表达。</p><h2 id="4·-如何避免问题"><a href="#4·-如何避免问题" class="headerlink" title="4· 如何避免问题"></a>4· 如何避免问题</h2><ul><li>了解对方的知识体系，在目的明确的情况下适量代入对方思维。</li><li>提升对需求的理解和分析，和语言能力。</li><li>多用一些约定俗成的词语和句子。</li><li>发现情绪，及时遏制，个性化表达。</li></ul><h2 id="5·-常见的六种需求分析方法"><a href="#5·-常见的六种需求分析方法" class="headerlink" title="5· 常见的六种需求分析方法"></a>5· 常见的六种需求分析方法</h2><ul><li><p>5W2H<br>what<br>when<br>why<br>who<br>where<br>how<br>how much</p></li><li><p>SWOT<br>strength：优势<br>weaknesses：劣势<br>opportunity：机会<br>threats：威胁</p></li><li><p>PEST分析法</p></li><li><p>马斯洛需求理论<br>金字塔等级划分<br>由下往上重要度依次递减<br>拓展：<br>ERG理论<br>七宗罪</p></li><li><p>How Meight We ?<br>明确场景：参照5W2H<br>问题拆分：消极、积极、迁移、脑暴方向<br>头脑风暴<br>解决问题</p></li><li><p>四象限法<br>按紧急和重要划分为四个象限</p></li></ul><p>卡诺模型<br>必备元素<br>魅力元素<br>期望元素<br>反向元素<br>无差异因素<br>基于主谓宾定状补提问延伸。<br>有因必有果。</p>]]></content>
    
    
    <summary type="html">作为一个产品，如何表达你的需求，让大家都能清楚的知道你要什么</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="思维" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E7%BB%B4/"/>
    
    <category term="产品" scheme="https://blog.jzxer.cn/tags/%E4%BA%A7%E5%93%81/"/>
    
  </entry>
  
  <entry>
    <title>锻炼思维力</title>
    <link href="https://blog.jzxer.cn/20200220/exerciseMind/"/>
    <id>https://blog.jzxer.cn/20200220/exerciseMind/</id>
    <published>2020-02-20T09:24:01.000Z</published>
    <updated>2026-04-04T16:00:58.301Z</updated>
    
    <content type="html"><![CDATA[<p>感觉工作久了，找不到大脑自主思考的感觉，所以为此想学习一下锻炼思维能力的几种方式。</p><h3 id="模糊思考法"><a href="#模糊思考法" class="headerlink" title="模糊思考法"></a>模糊思考法</h3><p>包含两种思考法，一种是语意曲解，一种是谐音曲解</p><p>语意曲解是把这句话用另外一层意思去理解，比如说：‘我有钱’，可以理解为家里富有，也可以理解为口袋确实有几块钱</p><p>谐音曲解可以举例苏东坡的典故，一日与和尚好友来到河边，看河边一条狗在啃骨头，便说：狗啃河上（和尚）肉，和尚听完便答：水流东坡诗（尸），妙~</p><h3 id="立体思维法"><a href="#立体思维法" class="headerlink" title="立体思维法"></a>立体思维法</h3><p>典故1：一个心理学家说：在一片土地上种四棵树，让它们之间的距离相等，如何实现？答案可以去百度。</p><p>典故2：印度国王想打赏发明象棋的丞相西萨，便问他要什么，他说只需要给公民们分发按照象棋盘第一个格子1粒，下一个格子是前一个格子的1倍依次排列，排满64格。</p><p>以上两个典故即可说明立体思维的重要性，它能让你从二维向三维方向思考</p><h3 id="链式思维法"><a href="#链式思维法" class="headerlink" title="链式思维法"></a>链式思维法</h3><p>典故1：为了保护鹿群而猎杀狼群，导致鹿失去了天敌，危害草原和农田。</p><p>典故2：有几个单词，用一个场景将这些单词连起来：月亮、嘴巴、机、飞机、树林、水桶、唱歌、篮球、日记、床。（联想，然后勾勒出画面）</p><p>有助于创造性思维的养成，可以给自己写一些词语来编故事</p>]]></content>
    
    
    <summary type="html">感觉工作久了，找不到大脑自主思考的感觉，所以为此想学习一下锻炼思维能力的几种方式...</summary>
    
    
    
    <category term="自我提升" scheme="https://blog.jzxer.cn/categories/%E8%87%AA%E6%88%91%E6%8F%90%E5%8D%87/"/>
    
    
    <category term="思考" scheme="https://blog.jzxer.cn/tags/%E6%80%9D%E8%80%83/"/>
    
    <category term="模糊思考法" scheme="https://blog.jzxer.cn/tags/%E6%A8%A1%E7%B3%8A%E6%80%9D%E8%80%83%E6%B3%95/"/>
    
    <category term="锻炼思维力" scheme="https://blog.jzxer.cn/tags/%E9%94%BB%E7%82%BC%E6%80%9D%E7%BB%B4%E5%8A%9B/"/>
    
  </entry>
  
  <entry>
    <title>如何配置 https？</title>
    <link href="https://blog.jzxer.cn/20190802/howToConfighttps/"/>
    <id>https://blog.jzxer.cn/20190802/howToConfighttps/</id>
    <published>2019-08-02T13:32:41.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<h2 id="配置流程"><a href="#配置流程" class="headerlink" title="配置流程"></a>配置流程</h2><p>本方法配置 https 用的是 Let’s Encrypt ，系统为 centOS</p><h3 id="1-防火墙打开-80-和-443-端口"><a href="#1-防火墙打开-80-和-443-端口" class="headerlink" title="1. 防火墙打开 80 和 443 端口"></a>1. 防火墙打开 80 和 443 端口</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">firewall-cmd --permanent --add-port=<span class="number">80</span>/tcp</span><br><span class="line">firewall-cmd --permanent --add-port=<span class="number">443</span>/tcp</span><br><span class="line">firewall-cmd --reload</span><br></pre></td></tr></table></figure><h3 id="2-安装-certbot-工具"><a href="#2-安装-certbot-工具" class="headerlink" title="2. 安装 certbot 工具"></a>2. 安装 certbot 工具</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum install -y epel-release</span><br><span class="line">yum install -y certbot</span><br></pre></td></tr></table></figure><h3 id="3-申请证书"><a href="#3-申请证书" class="headerlink" title="3. 申请证书"></a>3. 申请证书</h3><p>申请成功后，证书会保存在 &#x2F;etc&#x2F;letsencrypt&#x2F;live&#x2F;j710328466.github.io&#x2F; 下面：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">certbot certonly --webroot -w [<span class="title class_">Web</span>站点目录] -d [站点域名] -m [联系人email地址] --agree-tos</span><br></pre></td></tr></table></figure><blockquote><p>e.g: certbot certonly –webroot -w &#x2F;usr&#x2F;local&#x2F;nginx&#x2F;html -d j710328466.github.io -m <a href="mailto:&#x6a;&#122;&#120;&#x37;&#49;&#48;&#51;&#x32;&#56;&#52;&#54;&#x36;&#64;&#x67;&#x6d;&#x61;&#105;&#108;&#46;&#x63;&#111;&#109;">&#x6a;&#122;&#120;&#x37;&#49;&#48;&#51;&#x32;&#56;&#52;&#54;&#x36;&#64;&#x67;&#x6d;&#x61;&#105;&#108;&#46;&#x63;&#111;&#109;</a> –agree-tos</p></blockquote><h3 id="4-创建自动更新证书脚本"><a href="#4-创建自动更新证书脚本" class="headerlink" title="4. 创建自动更新证书脚本"></a>4. 创建自动更新证书脚本</h3><p>因为 Let’s Encrypt 的证书有效时长是 90 天，如果想要省去手动去更新脚本的操作，那这个时候就需要给个脚本来实现自动化</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//更新证书</span></span><br><span class="line">certbot renew --dry-run</span><br><span class="line"> </span><br><span class="line"><span class="comment">//如果不需要返回的信息，可以用静默方式</span></span><br><span class="line">certbot renew --quiet</span><br><span class="line"></span><br><span class="line"><span class="comment">// 编辑开始写入自动化脚本</span></span><br><span class="line">crontab -e</span><br><span class="line"></span><br><span class="line"><span class="comment">// 把这段写入脚本的最后一行，意思是每月的一号 5点会自动更新签名并且重新启动nginx</span></span><br><span class="line"><span class="number">00</span> <span class="number">05</span> <span class="number">01</span> * * <span class="regexp">/usr/</span>bin/certbot renew --quiet &amp;&amp; <span class="regexp">/bin/</span>systemctl restart nginx</span><br></pre></td></tr></table></figure><h3 id="5-配置-nginx"><a href="#5-配置-nginx" class="headerlink" title="5. 配置 nginx"></a>5. 配置 nginx</h3><ol><li>修改默认的 server</li></ol><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">  listen       <span class="number">80</span>;</span><br><span class="line">  server_name  j710328466.<span class="property">github</span>.<span class="property">io</span>;</span><br><span class="line">  rewrite ^ <span class="attr">https</span>:<span class="comment">//$server_name$request_uri? permanent;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="2"><li>修改 https 的 server</li></ol><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"># <span class="variable constant_">HTTPS</span> server</span><br><span class="line">#</span><br><span class="line">server &#123;</span><br><span class="line">    listen       <span class="number">443</span> ssl;</span><br><span class="line">    server_name  j710328466.<span class="property">github</span>.<span class="property">io</span>;</span><br><span class="line"></span><br><span class="line">    ssl_certificate      /etc/letsencrypt/live/j710328466.<span class="property">github</span>.<span class="property">io</span>/fullchain.<span class="property">pem</span>;</span><br><span class="line">    ssl_certificate_key  /etc/letsencrypt/live/j710328466.<span class="property">github</span>.<span class="property">io</span>/privkey.<span class="property">pem</span>;</span><br><span class="line"></span><br><span class="line">    ssl_session_cache    <span class="attr">shared</span>:<span class="attr">SSL</span>:1m;</span><br><span class="line">    ssl_session_timeout  5m;</span><br><span class="line"></span><br><span class="line">    ssl_dhparam /etc/ssl/private/dhparam.<span class="property">pem</span>;</span><br><span class="line">    ssl_protocols <span class="title class_">TLSv1</span> <span class="title class_">TLSv1</span><span class="number">.1</span> <span class="title class_">TLSv1</span><span class="number">.2</span>;</span><br><span class="line"></span><br><span class="line">    ssl_ciphers  <span class="string">&#x27;ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK&#x27;</span>;</span><br><span class="line">    ssl_prefer_server_ciphers  on;</span><br><span class="line"></span><br><span class="line">    location / &#123;</span><br><span class="line">        root   html;</span><br><span class="line">        index  index.<span class="property">html</span> index.<span class="property">htm</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">本方法配置 https 用的是 Let’s Encrypt ，系统为 centOS</summary>
    
    
    
    <category term="开发工具" scheme="https://blog.jzxer.cn/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="https" scheme="https://blog.jzxer.cn/tags/https/"/>
    
    <category term="网站安全" scheme="https://blog.jzxer.cn/tags/%E7%BD%91%E7%AB%99%E5%AE%89%E5%85%A8/"/>
    
    <category term="域名" scheme="https://blog.jzxer.cn/tags/%E5%9F%9F%E5%90%8D/"/>
    
  </entry>
  
  <entry>
    <title>如何优化在微信搜一搜的 SEO</title>
    <link href="https://blog.jzxer.cn/20190612/aboutSEO/"/>
    <id>https://blog.jzxer.cn/20190612/aboutSEO/</id>
    <published>2019-06-12T12:32:41.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<h2 id="什么是-SEO"><a href="#什么是-SEO" class="headerlink" title="什么是 SEO"></a>什么是 SEO</h2><p>我们经常会用到一些搜索引擎，baidu、google、bing…</p><p>它们出来的搜索结果，会有一定的排列顺序。按照每个搜索引擎的算法标准都会有不同的收录排列标准。</p><p>SEO 就是优化这个权重，让网站排名尽量靠前的一种技术手段。</p><h2 id="什么又是微信-SEO？"><a href="#什么又是微信-SEO？" class="headerlink" title="什么又是微信 SEO？"></a>什么又是微信 SEO？</h2><p>随着时代的进步，很多人已经习惯不使用搜索引擎，转而使用一些其它的方式搜索想要的内容，比如微信的搜一搜，哪里有需求，哪里就有相关的服务与技术手段。</p><p>它也是从不同的收录权重去分析，微信是怎么展示这个搜索结果排名的。以下是微信搜一搜结果的参考来源：</p><p><img src="/./imgs/20240325-1.png" alt="image.png"></p><h2 id="SEO-排名参考的标准"><a href="#SEO-排名参考的标准" class="headerlink" title="SEO 排名参考的标准"></a>SEO 排名参考的标准</h2><p>提升网站的 SEO（搜索引擎优化）需要综合考虑多个方面，包括网站内容、技术优化、外部链接等。以下是几个重要的参考标准：</p><ol><li><p><strong>关键词研究与优化</strong>：</p><ul><li>使用专业的关键词研究工具（如 Google Keyword Planner、SEMrush、Ahrefs 等）找到与网站主题相关的高搜索量、低竞争度的关键词。</li><li>在网站的标题、meta 描述、URL、标题标签（H1、H2 等）、内容中自然地使用这些关键词。</li><li>避免过度使用关键词，以免被搜索引擎视为垃圾内容。</li></ul></li><li><p><strong>网站内容优化</strong>：</p><ul><li>创建高质量、原创性的内容，能够解决用户的问题或提供有价值的信息。</li><li>使用多媒体内容（如图片、视频）丰富网页内容，提升用户体验。</li><li>定期更新内容，保持网站活跃性，吸引搜索引擎爬虫频繁访问。</li></ul></li><li><p><strong>技术优化</strong>：</p><ul><li>确保网站页面加载速度快，优化图片大小、使用浏览器缓存、减少 HTTP 请求等。</li><li>使用响应式设计，确保网站在不同设备上都能良好显示，提高移动设备的用户体验。</li><li>确保网站结构清晰、代码规范，使用语义化 HTML，方便搜索引擎理解网页内容。</li></ul></li><li><p><strong>用户体验优化</strong>：</p><ul><li>提高网站易用性，简化导航结构，减少页面加载时间，提高用户停留时间和页面浏览量。</li><li>添加内部链接，帮助用户轻松找到相关内容，同时提升页面之间的关联性。</li><li>优化网站布局和设计，使其清晰易懂，提升用户满意度。</li></ul></li><li><p><strong>外部链接建设</strong>：</p><ul><li>积极寻找优质的外部链接资源，如行业相关网站、论坛、社交媒体等，提升网站的权威性和信任度。</li><li>参与行业内的活动、发布有价值的内容，吸引其他网站主动链接到你的网站。</li><li>注意避免过度依赖于购买链接或黑帽 SEO 手段，以免被搜索引擎惩罚。</li></ul></li><li><p><strong>监测与分析</strong>：</p><ul><li>使用 Google Analytics 等网站分析工具，定期监测网站的流量、转化率等关键指标。</li><li>根据分析结果调整优化策略，找出问题所在并及时改进。</li><li>持续关注搜索引擎算法的更新，及时调整优化策略以适应变化。</li></ul></li></ol>]]></content>
    
    
    <summary type="html">我们经常会用到一些搜索引擎，baidu、google、bing...</summary>
    
    
    
    <category term="开发工具" scheme="https://blog.jzxer.cn/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="seo优化" scheme="https://blog.jzxer.cn/tags/seo%E4%BC%98%E5%8C%96/"/>
    
    <category term="blog" scheme="https://blog.jzxer.cn/tags/blog/"/>
    
  </entry>
  
  <entry>
    <title>changelog 日志自动生成工具升级啦~</title>
    <link href="https://blog.jzxer.cn/20190417/20190417_changelogUpdate/"/>
    <id>https://blog.jzxer.cn/20190417/20190417_changelogUpdate/</id>
    <published>2019-04-17T12:32:41.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<p>19 年我发了一篇文章<a href="https://juejin.cn/post/6844903767876304904">changelog 日志自动生成插件</a>,里面介绍了我开源的一套【auto changelog、commit-lint】规范化代码提交的工具插件合集。</p><p>但是由于是第一次发布一些开源的项目，难免开发方案不是很丝滑，用起来也不是很柔顺。</p><p>所以基于这些问题，用 lerna 对这个工具进行了一次升级。大概内容如下：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">jimi-web-changelog/cz --&gt; @nicecode/commit   <span class="comment">// git 格式化 cli 提交插件</span></span><br><span class="line">jimi-web-changelog/lint  --&gt;  @nicecode/commit-lint    <span class="comment">// git 提交 lint 校验插件</span></span><br><span class="line">jimi-web-changelog --&gt; @nicecode/changelog   <span class="comment">// 日志自动生成插件</span></span><br></pre></td></tr></table></figure><h2 id="CZ-模块配置优化"><a href="#CZ-模块配置优化" class="headerlink" title="CZ 模块配置优化"></a>CZ 模块配置优化</h2><p><a href="https://nicecoders.github.io/#/changelog/commit">官方文档</a></p><h3 id="原配置"><a href="#原配置" class="headerlink" title="原配置"></a>原配置</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 1、安装依赖</span></span><br><span class="line">cnpm i commitizen jimi-web-changelog --save-dev</span><br><span class="line"></span><br><span class="line"><span class="comment">// 2、在 package.json 中添加</span></span><br><span class="line">&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="string">&quot;config&quot;</span>: &#123;</span><br><span class="line">    <span class="string">&quot;commitizen&quot;</span>: &#123;</span><br><span class="line">      <span class="string">&quot;path&quot;</span>: <span class="string">&quot;./node_modules/jimi-web-changelog/lib/cz&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="新配置"><a href="#新配置" class="headerlink" title="新配置"></a>新配置</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 1、安装依赖</span></span><br><span class="line">cnpm i commitizen @nicecode/commit --save-dev</span><br><span class="line"></span><br><span class="line"><span class="comment">// 2、在 package.json 中添加</span></span><br><span class="line">&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="string">&quot;config&quot;</span>: &#123;</span><br><span class="line">    <span class="string">&quot;commitizen&quot;</span>: &#123;</span><br><span class="line">      <span class="string">&quot;path&quot;</span>: <span class="string">&quot;@nicecode/commit&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="lint-模块配置优化"><a href="#lint-模块配置优化" class="headerlink" title="lint 模块配置优化"></a>lint 模块配置优化</h2><p><a href="https://nicecoders.github.io/#/changelog/commit-lint">官方文档</a></p><h3 id="原配置-1"><a href="#原配置-1" class="headerlink" title="原配置"></a>原配置</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1.</span> 安装依赖</span><br><span class="line">cnpm i husky commitlint jimi-web-changelog --save-dev</span><br><span class="line"></span><br><span class="line"><span class="number">2.</span> 在 package.<span class="property">json</span> 中引入以下配置</span><br><span class="line">&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="string">&quot;husky&quot;</span>: &#123;</span><br><span class="line">    <span class="string">&quot;hooks&quot;</span>: &#123;</span><br><span class="line">      <span class="string">&quot;commit-msg&quot;</span>: <span class="string">&quot;commitlint -E HUSKY_GIT_PARAMS&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">3</span>、根目录下 .<span class="property">commitlint</span>.<span class="property">js</span></span><br><span class="line">modules.<span class="property">exports</span> = <span class="title class_">Object</span>.<span class="title function_">assign</span>(&#123;&#125;, <span class="built_in">require</span>(<span class="string">&#x27;jimi-web-changelog/lib/lint&#x27;</span>), &#123;</span><br><span class="line">  <span class="attr">rules</span>: &#123;</span><br><span class="line">    <span class="string">&#x27;subject-empty&#x27;</span>: [<span class="number">2</span>, <span class="string">&#x27;never&#x27;</span>],</span><br><span class="line">    <span class="string">&#x27;type-empty&#x27;</span>: [<span class="number">2</span>, <span class="string">&#x27;never&#x27;</span>],</span><br><span class="line">    <span class="string">&#x27;type-enum&#x27;</span>: [<span class="number">2</span>, <span class="string">&#x27;always&#x27;</span>,</span><br><span class="line">      [</span><br><span class="line">        <span class="string">&#x27;新功能&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;修复&#x27;</span>,</span><br><span class="line">        ...</span><br><span class="line">      ]</span><br><span class="line">    ]</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="新配置-1"><a href="#新配置-1" class="headerlink" title="新配置"></a>新配置</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 1. 安装依赖</span></span><br><span class="line">cnpm i husky commitlint @nicecode/commit-lint --save-dev</span><br><span class="line"></span><br><span class="line"><span class="comment">// 2. 在 package.json 中引入以下配置</span></span><br><span class="line">&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="string">&quot;husky&quot;</span>: &#123;</span><br><span class="line">    <span class="string">&quot;hooks&quot;</span>: &#123;</span><br><span class="line">      <span class="string">&quot;commit-msg&quot;</span>: <span class="string">&quot;commitlint -E HUSKY_GIT_PARAMS&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 3、根目录下 .commitlint.js</span></span><br><span class="line">modules.<span class="property">exports</span> = &#123;</span><br><span class="line">  <span class="attr">extends</span>: [<span class="string">&quot;@nicecode/commit-lint&quot;</span>]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="changelog-模块配置优化"><a href="#changelog-模块配置优化" class="headerlink" title="changelog 模块配置优化"></a>changelog 模块配置优化</h2><p><a href="https://nicecoders.github.io/#/changelog">官方文档</a></p><h3 id="原配置-2"><a href="#原配置-2" class="headerlink" title="原配置"></a>原配置</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 1、安装依赖</span></span><br><span class="line">cnpm i conventional-changelog-cli jimi-web-changelog --save-dev</span><br><span class="line"></span><br><span class="line"><span class="comment">// 2、在package.json 中添加命令</span></span><br><span class="line">&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="string">&quot;script&quot;</span>: &#123;</span><br><span class="line">    <span class="string">&quot;log&quot;</span>: <span class="string">&quot;conventional-changelog --config node_modules/jimi-web-changelog/lib/log -i CHANGELOG.md -s -r 0&quot;</span>,</span><br><span class="line">  &#125;</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="新配置-2"><a href="#新配置-2" class="headerlink" title="新配置"></a>新配置</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 1、安装依赖</span></span><br><span class="line">cnpm i conventional-changelog-cli @nicecode/changelog --save-dev</span><br><span class="line"></span><br><span class="line"><span class="comment">// 2、在package.json 中添加命令</span></span><br><span class="line">&#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="string">&quot;script&quot;</span>: &#123;</span><br><span class="line">    <span class="string">&quot;log&quot;</span>: <span class="string">&quot;conventional-changelog --n node_modules/@nicecode/changelog -i CHANGELOG.md -s -r 0&quot;</span>,</span><br><span class="line">  &#125;</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h2><p><a href="https://github.com/nicecoders">nicecoder 团队</a> 目前 4 人，致力整合一套提高工作效率和代码规范的工具库，目前我们的计划的和已完成的有以下几个板块：</p><p><img src="https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/285c6e21eb954428bf0adf67e737ae96~tplv-k3u1fbpfcp-watermark.image" alt="image.png"></p><p>期待你的加入：<a href="https://github.com/nicecoders">nicecoder</a></p><h3 id="相关链接"><a href="#相关链接" class="headerlink" title="相关链接"></a>相关链接</h3><p><a href="https://nicecoders.github.io/#/tools">@nicecode&#x2F;tools 常用函数库</a></p><p><a href="https://nicecoders.github.io/#/">nicecode 官网</a></p><p><a href="https://github.com/nicecoders">nicecode github 地址</a></p>]]></content>
    
    
    <summary type="html">19 年我发了一篇文章[changelog 日志自动生成插件],里面介绍了我开源的一套【auto changelog、commit-lint】规范化代码提交的工具插件合集。</summary>
    
    
    
    <category term="开发工具" scheme="https://blog.jzxer.cn/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="changelog" scheme="https://blog.jzxer.cn/tags/changelog/"/>
    
    <category term="nicecode" scheme="https://blog.jzxer.cn/tags/nicecode/"/>
    
    <category term="github" scheme="https://blog.jzxer.cn/tags/github/"/>
    
  </entry>
  
  <entry>
    <title>travisCI 持续集成 gh-page 并部署</title>
    <link href="https://blog.jzxer.cn/20181011/20181011_trivisCIIntro/"/>
    <id>https://blog.jzxer.cn/20181011/20181011_trivisCIIntro/</id>
    <published>2018-10-11T13:02:41.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<h2 id="travisCI-持续集成-gh-page-并部署"><a href="#travisCI-持续集成-gh-page-并部署" class="headerlink" title="travisCI 持续集成 gh-page 并部署"></a>travisCI 持续集成 gh-page 并部署</h2><p>我们大多数公司在做项目时，应该都碰到过，当代码被 push 上 git 或者是 svn 时，过几分钟就可以在线上实时看到我们的项目，就像看到亲生儿子一样，但是肯定很多人不知道这是怎么实现的（如果你知道，那可以不用往下看了，点个赞就去吃饭吧…），所以今天我就来给大家介绍一下其中的一款 travis-CI，请记住它的 face：<br><img src="https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/6/13/163f71251406fc86~tplv-t2oaga2asx-image.image"></p><p>持续集成（Continuous integration）的核心思想，代码先自动化测试用例，通过后集成到主干。它细分的话有两个概念：</p><ul><li>持续交付</li><li>持续部署</li></ul><blockquote><p>简单来说持续部署是持续交付的下一步，持续交付是测试阶段，部署就是测试通过阶段。,这个就有很多东西展开了，求我我就告诉你…</p></blockquote><h2 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h2><ul><li>GitHub 账号（作为一个合格的程序员，你没有真的好吗？）</li><li>travis-CI 平台接入</li><li>GITHUB_TOKEN</li><li>给我点赞…</li></ul><h2 id="第一步"><a href="#第一步" class="headerlink" title="第一步"></a>第一步</h2><p>登录 CI 官网，然后连接自己的 gitHub，这个时候 Legacy Services Integration 应该默认显示了几个自己 gitHub 的项目<br><img src="https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/6/13/163f6c4922b8c7a6~tplv-t2oaga2asx-image.image"><br>如果显示不全，可以按左边的 sync 同步一下<br><img src="https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/6/13/163f6c6433ce6888~tplv-t2oaga2asx-image.image"><br>然后第一张图每个项目的边上有一个 switch 开关，你想要让哪个集成就打开哪个吧（不截图了，我懒…）</p><h2 id="第二步"><a href="#第二步" class="headerlink" title="第二步"></a>第二步</h2><p>进入自己的 gh 主页，依次：GitHub settings -&gt; developer settings -&gt; Personal access tokens，勾选权限，自由发挥，你要全勾也行…</p><p><img src="https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/6/13/163f6d80fb076590~tplv-t2oaga2asx-image.image"><br>将生成的 token 复制备用</p><h2 id="第三步"><a href="#第三步" class="headerlink" title="第三步"></a>第三步</h2><p>回到 CI，打开你打开开关的那个项目的 settings（看到你很绕我就放心了…），进入配置页面，在 Environment Variables 里填入以下内容：<br><img src="https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/6/13/163f6f783dbe0143~tplv-t2oaga2asx-image.image"></p><blockquote><p>分别对应：git 项目、项目分支（我这里的分支是 gh-pages）、token、Git-email、Git-username</p></blockquote><h2 id="第四步"><a href="#第四步" class="headerlink" title="第四步"></a>第四步</h2><p>在项目根目录配置个文件叫 .travis.yml,打包项目以 vue-cli 为例，内容如下：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">language</span>: node_js</span><br><span class="line"># nodejs版本</span><br><span class="line"><span class="attr">node_js</span>:</span><br><span class="line">    - <span class="string">&#x27;8.9.1&#x27;</span></span><br><span class="line"></span><br><span class="line"># <span class="attr">S</span>: <span class="title class_">Build</span> <span class="title class_">Lifecycle</span></span><br><span class="line"><span class="attr">install</span>:</span><br><span class="line">  - npm install</span><br><span class="line"><span class="attr">script</span>:</span><br><span class="line">  - npm run build</span><br><span class="line"></span><br><span class="line"># 这个是不是看着很熟悉？</span><br><span class="line"><span class="attr">after_script</span>:</span><br><span class="line">  - cd ./dist</span><br><span class="line">  - git init</span><br><span class="line">  - git config user.<span class="property">name</span> <span class="string">&quot;$&#123;USER_NAME&#125;&quot;</span></span><br><span class="line">  - git config user.<span class="property">email</span> <span class="string">&quot;$&#123;USER_EMAIL&#125;&quot;</span></span><br><span class="line">  - git add .</span><br><span class="line">  - git commit -m <span class="string">&quot;nicecoders.github.io&quot;</span></span><br><span class="line">  - git push --force --quiet <span class="string">&quot;https://$&#123;test_token&#125;@$&#123;GH_REF&#125;&quot;</span> <span class="attr">master</span>:$&#123;<span class="variable constant_">P_BRANCH</span>&#125;</span><br><span class="line"># <span class="attr">E</span>: <span class="title class_">Build</span> <span class="title class_">LifeCycle</span></span><br><span class="line"></span><br><span class="line"># 只对某个分支行为生效</span><br><span class="line"><span class="attr">branches</span>:</span><br><span class="line">  <span class="attr">only</span>:</span><br><span class="line">    - master</span><br></pre></td></tr></table></figure><h2 id="第四点五步"><a href="#第四点五步" class="headerlink" title="第四点五步"></a>第四点五步</h2><p>打开 CI，进入自己构建项目的那个页面，打开 job log，感受那生怕 error 的快感！（都是泪…）</p><p><img src="https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/6/13/163f702606d46967~tplv-t2oaga2asx-image.image"><br>当然如果你通过的话，就会有一个 passing 在你的项目标题旁边。</p><p><img src="https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/6/13/163f7035a73791e3~tplv-t2oaga2asx-image.image"><br>每次看到这个我都激动的热泪盈眶…</p><h2 id="第五步"><a href="#第五步" class="headerlink" title="第五步"></a>第五步</h2><p>看一下自己在 git 上的项目，是不是出现了这个分支，并且已经自动部署好了？成功的截图。<br><img src="https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/6/13/163f706697e8aeb8~tplv-t2oaga2asx-image.image"></p><h3 id="部署好的页面"><a href="#部署好的页面" class="headerlink" title="部署好的页面"></a>部署好的页面</h3><p><img src="https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/6/13/163f708677ae9c6d~tplv-t2oaga2asx-image.image"></p><h2 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h2><p>现在，你可以疯狂的 push 代码了，其他的事交给 CI 去做就行。</p><p>好了，码了这么久的字，你是不是应该：</p><p>点个赞？</p><p>个赞？</p><p>赞？</p><p>👍</p><p>原文链接：<a href="https://j710328466.github.io/">https://j710328466.github.io/</a></p>]]></content>
    
    
    <summary type="html">我们大多数公司在做项目时，应该都碰到过，当代码被 push 上 git 或者是 svn 时，过几分钟就可以在线上实时看到我们的项目，就像看到亲生儿子一样，但是肯定很多人不知道这是怎么实现的</summary>
    
    
    
    <category term="开发工具" scheme="https://blog.jzxer.cn/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="CI" scheme="https://blog.jzxer.cn/tags/CI/"/>
    
    <category term="前端开发" scheme="https://blog.jzxer.cn/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="github" scheme="https://blog.jzxer.cn/tags/github/"/>
    
  </entry>
  
  <entry>
    <title>如何学习电吉他</title>
    <link href="https://blog.jzxer.cn/20180829/electricGuitar/"/>
    <id>https://blog.jzxer.cn/20180829/electricGuitar/</id>
    <published>2018-08-29T14:36:40.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>电吉他相关的内容</p><h2 id="基础练习"><a href="#基础练习" class="headerlink" title="基础练习"></a>基础练习</h2><h3 id="爬格子"><a href="#爬格子" class="headerlink" title="爬格子"></a>爬格子</h3><p>这是最常见的暖指练习。主要目的就是要强化左手的灵活度，连贯性的训练。爬格子的排列组合很多，大致上分成：四连音排列组合，跳弦……等。</p><p>左手四连音 (爬格子)：</p><p>1234，1243，1342，1324，1423，1432</p><p>2341，2314，2413，2431，2143，2134</p><p>3412，3421，3124，3142，3241，3214</p><p>4123，4132，4312，4321，4213，4231</p><p>共有 24 种排列组合，可以在吉他指板上任意把位练习，这东西能够保持左手手指的灵活度。通常一段时间没弹琴，我会选择爬一下格子，作为暖身的预备。</p><p>另外一种螃蟹爬格子，是跨弦的练习，大概就是先弹第一弦，之后弹第三弦，以此类推。小林信一这几年很红的地狱练习教本里面，一开始就有类似的练习。</p><p>还有一种原本左手是 1234 都弹同一根弦，改成 12 弹第六弦，34 弹第五弦；或者 13 弹第六弦，24 弹第五弦……诸如此类的排列组合。</p><p>左手手指的强化训练：特别针对左手的手指独立的训练，这种训练刚开始要注意练习的方式，不要一下子就练太久，要适度的休息。</p><p>小指训练：1343，1242，1434，1424，2434，2343，……</p><p>无名指训练： 1232， 2323……</p><p>配合击勾练习：上述的左手各种排列组合，都可以配合击勾技巧练习，特别是 124，134 这样的组合，适当的配合击勾技巧，就够做出很漂亮的速弹。</p><p>斜形 (&#x2F; 形\形)：吉他大师 John Petrucci 介绍的一种手指独立训练练习方式，如下图。</p><h3 id="乐器技巧的练习时机"><a href="#乐器技巧的练习时机" class="headerlink" title="乐器技巧的练习时机"></a>乐器技巧的练习时机</h3><p>刚开始学习吉他的时候：要让初学者感觉，手是我的……但是完全没练过吉他的纯初学者不要急着练这些……</p><p>一段时间没练琴了：很久没碰琴了，要把手感找回来。</p><p>每天开始练琴时：增强手指头的灵活度，暖指。</p><p>大概是这些时间点，考虑自己的学习状况作选择性的练习。然后练习时，右手一律交替拨弦 (上下拨)，音色则分别先后用清音和失真练习，把每一个音交代清楚。</p><p>因为这个练习跟音乐没有直接的关系，而且吉他又是一种二维的棋盘格子乐器，所以发挥你的想象力，想一些属于自己的练习，来增加练习的乐趣。我小时候很喜欢玩五子棋，所以每次在画指版音阶图的时候，都会想象成五子棋的棋子。</p><p>提供一些想象力：把上述提到的练习方式混搭，例如爬格子 1234 +斜行\ 混合练习。吉他大师 Lee Ritenour 有类似的练习介绍。</p><p>音乐演奏基本功</p><p>第二类是以音阶，和弦，和节奏为元素的排列组合练习，大概范围有：音阶指型，基本和弦和进行，琶音，节奏……等。这些东西我习惯把它们统称基本功 (内功&#x2F;马步)。这些东西会反映在日后扒谱，练习即兴，创作，理解歌曲的速度，熟练度等。</p><p>练习的不够，跟谱就不容易快，准；弹奏时对音符的掌握会不够精准……等。所以这部分，我觉得是有必要花心思练习的。但是如何有效率的练习，就看每个人的方式了!这东西没有练多久的问题，只要还在弹琴，就要持续练习。即使是大师级的音乐家，每天也都会练这些基本功，所以每天一定要抽空练。</p><h3 id="音阶指型"><a href="#音阶指型" class="headerlink" title="音阶指型"></a>音阶指型</h3><p>有五个基本型 + 三种一弦三音。五个基本型又可以衍生出一些应用：</p><p>大调音阶：P1 ~ P5 (或者称 Mi， Sol， La， Ti， Re 型)</p><p>小调音阶：P1 ~ P5</p><p>大小调五声音阶：P1 ~ P5</p><p>蓝调音阶、和声、旋律小调……</p><p>把大小调分开来看是因为两者能够熟练其转换，对于日后练习蓝调会很有帮助。</p><p>音阶指型的训练还要注意的是，不管是上行还是下行，建议要从根音开始，根音结尾，同时要把音名唱出来，主要让耳朵能够辨识调性的概念，这也是未来扒谱的基础之一。</p><p>练习的调性可以按照五度圈来跑，例如：</p><p>奇数月份练顺时针 (五度)：</p><p>奇数周都练：C -&gt; G -&gt; D -&gt; A -&gt; E -&gt; B -&gt; F# -&gt; C#</p><p>偶数周练：C -&gt; F -&gt; Bb -&gt; Eb -&gt; Ab -&gt; Db -&gt; Gb</p><p>偶数月份练逆时针 (四度)：</p><p>奇数周：C# -&gt; F# &gt;B -&gt; E -&gt; A -&gt; D -&gt; G -&gt; C</p><p>偶数周：Gb -&gt; Db -&gt; Ab -&gt; Eb -&gt; Bb -&gt; F -&gt; C</p><p>这种练习就看自己的时间状况，自行安排适当的日称练习。目的就是要练到随便指定一个调性，要马上 (2 秒内) 找到是适当的把为位置，超过两秒都算不合格。</p><h3 id="模进"><a href="#模进" class="headerlink" title="模进"></a>模进</h3><p>简单说就是以音阶为基础，作一些排列组合的练习。常见的有：四个一组 (16beat)，三个一组 (三连音)，三度音 (8beat 或 16 beat)，五声音阶，一弦三音 (六连音)……等。以下的数字是音阶。</p><p>四个一组 (16 beat)：</p><p>上行：1234，2345，3456，4567，5671，……</p><p>下行：1765，7654，6543，5432，4321，……</p><p>三个一组 (三连音)：</p><p>上行：123，234，345，456，567，671 ……</p><p>下行：176，765，654，543，432，321 ……</p><p>三度音模进 (8 beat or 16 beat)：</p><p>上行：13，24，35，46，57，61，72，1 ……</p><p>下行：16，75，64，53，42，31，27，1 ……</p><p>五声音阶模进：</p><p>上行： 6123 1235 2356 3561 ……</p><p>下行：1653 6532 5321 3216 ……</p><p>模进的种类很多种，特别是喜欢玩 Riff，喜欢玩即兴乐手 (不只是吉他手)，类似的东西给一个和弦的范围，他可以以此为基础，想出数十种变化。所以上述前三种，是我个人认为最最最最最最基本的。想专心把 Solo，Riff 弹好，想 Jam 的内容有变化，这三种一定要花时间稳扎稳打的练。切忌一味求快!!!</p><p>同样的，这部分也可以想一些属于自己的排列组合来增加练习的乐趣。但是不同于爬格子，这部分会让你觉得弹出来的东西会具备“音乐性”，“可听性”。所以创作，可以从这里出发。随便举一个例子，以某一个音为基础来弹音阶，像是 | 12 13 15 16 | 34 35 36 31 |，这其中的规则应该不难发现，还有很多类似的想法，发挥想象力，让练习更有趣吧 ！</p><h3 id="顺阶和弦与和弦进行"><a href="#顺阶和弦与和弦进行" class="headerlink" title="顺阶和弦与和弦进行"></a>顺阶和弦与和弦进行</h3><p>针对不同调性的顺阶和弦，可以安排时间做练习。常见的基本和弦指型五种：CGDAE，利用这五种基本指型，配上和弦指型简化+调性+和弦进行，这样就有很多组合了。换句话说，每一个和弦，至少都要能够有五种以上的按法。组合说明如下：</p><p>CGDAE：五种吉他和弦指型，每一个都有基本形和变化型：</p><p>开放指型：所有和弦种类，最基本的和弦指型。</p><p>基本移动和弦：大三 (X)，小三 (Xm)，大七 (Xmaj7)，小七 (Xm7)，属七 (X7)，减七 (Xdim7)， Xm7-5 ……</p><p>应用和弦： Xsus4，Xadd9，X6，X69，Slash Chord。</p><p>进阶与延伸应用：Extended Chord ……</p><p>配合调性：练习方式可以参考练习音阶的方式，调性以五度圈方式跑，和弦进行也是。</p><p>配合和弦进行：像是卡农进行，6415，251，1625，1564 ……</p><p>CGDAE 的简化吉他指型：简化五种指型，所形成的另一种和弦按法，练习概念第一个基本型变化。</p><p>这部份如果以七和弦做基本的话，变化会很大，也可以加入很多创意。例如：Emaj7sus2 简化 (省略五六弦) 后会变成 B; Fmaj7 简化五六弦会得到 Am ……或者行成另外一种简化方式： Shell Chord。</p><p>或者改变简化的方式，例如 E 型的 A 和弦，保留第六弦 (用拇指按)，省略四五弦，这样就会找到很多卢广仲常用的那种按法。他那些按法只是以七和弦做基础而已，所以以七和弦为基础的移动和弦，套用这个简化概念，那么卢广仲的和弦按法就不难懂了。</p><p>有兴趣玩 Jazz&#x2F;Fusion&#x2F;Funk&#x2F;Blues 的朋友，可以多花时间研究这种用法。会发现很多好玩的东西。</p><p>和弦指型抽象化：这是在练习蓝调时我想出来的方式。主要就是从已知的吉他和弦指型中，做应用变化。 例如 E 型和弦，但是只弹其中两根弦，或者只弹 Guide Tone 等。但是基本概念还是在 CGDAE 指型。</p><p>这些东西很多，但是却是伴奏时很最常用的基本观念。提供一个我常用的练习方式：指定调性，指定吉他把位范围，给予歌曲的和弦进行。例如：</p><p>弹 Eb 大调，把位范围在 4 ~ 9 格，弹出卡农进行的伴奏，右手指法不限定。</p><p>弹 G 大调，把位范围在 1 ~ 5 格，弹 2514736 进行</p><p>当然，这例子都是不可以用变调夹的。这都是一些自我练习的方式。</p><h3 id="琶音"><a href="#琶音" class="headerlink" title="琶音"></a>琶音</h3><p>以练习和弦音阶为主，基本的范畴包含了，右手指法，三和弦琶音，七和弦琶音……等。</p><p>右手指法：T1213121，T123~21，T12TT12T ……诸如此类的练习，只是换成交替&#x2F;经济&#x2F;混合拨弦</p><p>把位互换练习：简单说，同样的 C 练习五个把位，还有其转位的弹法，例如：C (P1，P2)-&gt; C&#x2F;E (P3，P4)，C&#x2F;G (P5)</p><p>琶音练习：这里指的就是要把每一个和弦内音都弹到的琶音，主要包含三和弦和七和弦。每一个和弦的琶音也会有五个基本型，以七和弦来讲，就有大七 (Xmaj7)，小七 (Xm7)，属七 (X7)，减七 (Xdim7)，半减七 (Xm7-5)，所以共有 5x5&#x3D;25 个形要练。</p><p>这部分除了基本的和弦，还要搭配一些和弦进行来练，例如卡农进行， 6415，251，1625 ……然后再搭配不同的调性练习，算是为即兴作准备。这部分要花很多时间练习，但是很值得花心思练的。</p><p>上述的三个部份：音阶指型、模进、琶音都可以互相搭配练习，当然要这样作之前，先把马步打稳，至少上述三个部份都要练过，最后才是混合的练习。</p><h3 id="节奏训练"><a href="#节奏训练" class="headerlink" title="节奏训练"></a>节奏训练</h3><p>最后一个是节奏训练，着重在于练习节奏感的协调性。节奏的训练意思不是一直要挑战速度多快，而是练习知道现在在哪里，然后能够把音符放在想诠释的地方。这部分可以搭配琶音练习一起练习，也是为即兴作准备。</p><p>基本节奏点的排列组合：</p><p>基本的有：全音符，二分音符，四分音符，八分音符，十六分音符，三十二分音符</p><p>连音：三连音，六连音，和一些特殊的连音变化，像五连音，七连音，九连音……</p><p>然后就是延音，附点，休止符，切分，Swing&#x2F;Shuffle 等变化。</p><p>这些都是节奏训练的重点，难度 3 &gt; 2 &gt; 1。</p><p>吉他手很多时候很被诟病的就是拍子不稳，节奏不会算，而且常常本末倒置的练了一堆花俏的技巧 (扫弦，点弦，速弹，摇杆，效果器……等)，却连基本的拍子都不稳，歌曲段落都搞不清楚。特别是跟别人合作的时候，像是组队的时候，不管是一般的乐队，还是跟一些其他乐器组合，很容易一曝十寒，基本上就是这些基本功没练好，一定要正视正确性与速度这个问题，切记切记。</p><h3 id="吉他基本演奏技巧"><a href="#吉他基本演奏技巧" class="headerlink" title="吉他基本演奏技巧"></a>吉他基本演奏技巧</h3><p>还有另一部分属于吉他专属的技巧基本功- 基本演奏技巧，这些东西我没有把它们列出来，因为他们通常要搭配专属的乐句，和弦进行来练习，最好文图并茂比较好说明，本文只是’目录’，所以就大概提一下好。常见的大致上如下：</p><h3 id="基本的伴奏手法"><a href="#基本的伴奏手法" class="headerlink" title="基本的伴奏手法"></a>基本的伴奏手法</h3><p>包含各种基本的右手指法，Picking，Power Chord，Riff，Fill 等。很多吉他手常常花很多时间一堆花俏的技巧，却连基本的 power chord 都弹的不干净，该闷该放，该强该弱，该快该慢，都是基本的东西。</p><h3 id="各调的顺阶和弦应用"><a href="#各调的顺阶和弦应用" class="headerlink" title="各调的顺阶和弦应用"></a>各调的顺阶和弦应用</h3><p>也一样是基本功的范围。随时要有转调能够伴奏的基本能力，以及反应速度。特别是一些常用的和弦进行，或者常用的调性。举例说，打开电视的歌唱节目，不管他正在唱什么歌，有没听过，能否在很短的时间之内 (最好是一句歌词的时间) 找到调性，然后直接接上伴奏，或者即兴 Solo。</p><p>特别是乐队里的吉他手，一首歌里大部分的时间 (4&#x2F;5) 都在负责伴奏，Solo 实际上的时间可能很少 (1&#x2F;5)。即使 Solo 弹的 100% 完美，但是伴奏却弹的二二六六 (零零落落)，以比赛的角度来看，这个吉他手基本上是出局的。</p><h3 id="电吉他基本演奏技巧"><a href="#电吉他基本演奏技巧" class="headerlink" title="电吉他基本演奏技巧"></a>电吉他基本演奏技巧</h3><p>五字诀击，勾，推，滑，颤。这五个技巧不管是弹那一种 Style，基本上都是必备的。练习时通常搭配 lick，riff 练习。</p><p>至于其他点，摇，扫，舔，咬等花式技巧，算是比较炫技，创意 (疯狂&#x2F;花式&#x2F;创意&#x2F;舞台效果) 技巧，就不算在基本功里了。</p><p>花式技巧的意思是说吉他手不会这种技巧，一样可以把音乐诠释的很好。但是基本演奏技巧却是把音乐诠释好的必备条件。如果是比赛的话，评审可能不会在意你的点弦有多绚丽 (但是会在意使用的创意以及时机)，但是只要推弦音不准，或者颤音稳定度不够，基本上，在 “吉他演奏技巧” 的范围里，就算出局了。</p><h3 id="木吉他基本技巧"><a href="#木吉他基本技巧" class="headerlink" title="木吉他基本技巧"></a>木吉他基本技巧</h3><p>三指法，打板，切音，跑马，各式基本节奏……等。搭配和弦进行练习。同样的，这几年很流行的拍，打，点，咬，滚……也是疯狂&#x2F;花式的技巧，不算基本功。</p><h2 id="小技巧"><a href="#小技巧" class="headerlink" title="小技巧"></a>小技巧</h2><h3 id="基础练习-1"><a href="#基础练习-1" class="headerlink" title="基础练习"></a>基础练习</h3><h3 id="如何即兴演奏比较丝滑"><a href="#如何即兴演奏比较丝滑" class="headerlink" title="如何即兴演奏比较丝滑"></a>如何即兴演奏比较丝滑</h3><h4 id="第一阶段：先确定好和弦进行，比如《1－6－4－5》"><a href="#第一阶段：先确定好和弦进行，比如《1－6－4－5》" class="headerlink" title="第一阶段：先确定好和弦进行，比如《1－6－4－5》"></a>第一阶段：先确定好和弦进行，比如《1－6－4－5》</h4><ul><li>再找到该调中每个和弦的五级和弦，《5－3－1－2》</li><li>把两个和弦的音归拢《12357－56713－34561－45672》</li><li>这样每个和弦就可以用那 5 个音了。现在先练习一下，在 C 大调中的 C-Am-F-G 中用每个和弦对应的那 5 个音来进行第一步的练习。（对应的 5 个音可以按照默认的那个顺序也可以打乱练习，重点听这些音对和弦产生的效果）</li></ul><h4 id="第二阶段："><a href="#第二阶段：" class="headerlink" title="第二阶段："></a>第二阶段：</h4><ul><li>重点音与经过音。</li><li>在上个练习后大家应该找到每个和弦拥有的那 5 个音中哪些对该和弦的性质有比较明显的效果，哪些音对该和弦有特殊的效果，哪些音对该和弦没有多大用处比较平淡。（每个人的感觉不同，练习时候的心态和练习内容不同所以最终对音乐的感受也不一样，自然最后确定的音附也不一样，相信自己的感觉，这样坚持才能发展自己的特点）</li><li>将找到的对每个和弦有用的音作为该和弦的重点，没用的作为经过音，同时不包含在每个和弦的那 5 个音中剩余的那两个音（46－24－27－13）刚开始练习阶段不要弹，以后熟练了再作为经过音加入到练习中。</li><li>（这个练习中，速度一定要慢，60－100 左右的速度，每个和弦可以延长到 2 小结，重点音用 4 分或 2 分音符，经过音用 16 分或 8 分音符，每次弹奏的旋律多重复几次熟记于心）</li></ul><h4 id="第三阶段："><a href="#第三阶段：" class="headerlink" title="第三阶段："></a>第三阶段：</h4><ul><li>这次就是节奏的训练，同样的旋律试着把每个音的时值改变，加入附点音，先现音，休止符等。并随着水平的进步加快速度。</li><li>从第一阶段到这个阶段差不多要练 3－6 个月的时间，大家先好好练习吧，以后继续补充</li><li>建议大家先一个和弦一个和弦的练，把每个和弦和他对应的音练熟再换下一个和弦，然后再将两个和弦连起来练，然后再练下一个，再下一个，再连起来。</li><li>第一阶段的重点就是一定要在和弦中充分的把每一个应该弹的音在大脑里反映清楚并且弹好记熟。</li><li>第二阶段重点就要特别留意每个音符和对应的每个和弦和感觉（首先和弦的分解音肯定是比较稳定的感觉，剩下的两个音才是关键他们分别是和弦根音的 7 度和 9 度，这两个音和不同的和弦内音组成的旋律感觉最有特色）</li><li>另外刚开始一定注意，慢速弹，一定把要弹的音先在脑子过一遍在反映到琴上，熟练以后才能得心应手，还要注意，每个和弦有 5 个可以选择的音符，还剩下的两个音（相对于和弦的根音是 4 度和 6 度）不是不能用，大家可以试试，这两个音给人的感觉并不是很舒服，最好在完成这两个阶段以后在加入进来练习。</li><li>最后真心的希望大家多一点耐心好好练琴，少折腾设备，相信今天的内容练好了就基本上达到了真正能即兴的水平，当然学无止境，即兴方面的内容还有很多以后再补充</li></ul>]]></content>
    
    
    <summary type="html">电吉他相关的技巧，包括基础练习，乐理相关</summary>
    
    
    
    <category term="音乐" scheme="https://blog.jzxer.cn/categories/%E9%9F%B3%E4%B9%90/"/>
    
    
    <category term="电吉他" scheme="https://blog.jzxer.cn/tags/%E7%94%B5%E5%90%89%E4%BB%96/"/>
    
    <category term="乐器" scheme="https://blog.jzxer.cn/tags/%E4%B9%90%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>如何学习Logic Pro</title>
    <link href="https://blog.jzxer.cn/20180829/logicpro/"/>
    <id>https://blog.jzxer.cn/20180829/logicpro/</id>
    <published>2018-08-29T14:36:40.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>苹果电脑的一款综合类音频创作工作台，是库乐队的升级版</p><h2 id="小技巧"><a href="#小技巧" class="headerlink" title="小技巧"></a>小技巧</h2><h3 id="如何一边录视频一边用-logic-的音源"><a href="#如何一边录视频一边用-logic-的音源" class="headerlink" title="如何一边录视频一边用 logic 的音源"></a>如何一边录视频一边用 logic 的音源</h3><p>第一步，打开 logic 的高级功能，在设置里。</p><h3 id="声卡没有声音？"><a href="#声卡没有声音？" class="headerlink" title="声卡没有声音？"></a>声卡没有声音？</h3><p>可能是声道的问题，试着切换一下声道，必要的情况下去调节一下声卡的参数</p><p>比如声音的大小和增益的多少，都可能会影响声音的大小。</p><p>还有我是用的 midiplus 的这个按钮：direct monitor，它的调节会影响声音在耳机上传递的位置！</p><h3 id="怎么提取伴奏"><a href="#怎么提取伴奏" class="headerlink" title="怎么提取伴奏"></a>怎么提取伴奏</h3><p>检查器出现后，选中音轨 1， 点击检查器中的「音频效果」 并选择 utility -「Gain - 立体声」；</p><p>在弹出的增益调整工具中打开右侧 Mono 开关，它会将这条音轨调整为单声道输出， 接着在中间 Phase Invert 工具下方选中「L」来做左声道相位相消，最后适当抬高最左侧 Gain 旋钮来弥补相位相消后的音量锐减。这一步完成后你可以播放试听一下，不出意外的话你会发现人声已经基本消失了。</p><p>其实到这里就已经基本完成了，但是若你的音乐鼓点等打击乐器比较多的话，你可以酌情使用这一步，在这一步中我们需要适量还原中频内容。将原始音频拖入轨道 2 并从起点对齐音轨 1。 选中音轨 2 并点击检查器中的「均衡器」。这时候拖动均衡器中的控制按钮，边听边适当压低中低频，直到鼓点部分尽可能还原，且人声不大的程度为止；</p>]]></content>
    
    
    <summary type="html">苹果电脑的一款综合类音频创作工作台，是库乐队的升级版</summary>
    
    
    
    <category term="音乐" scheme="https://blog.jzxer.cn/categories/%E9%9F%B3%E4%B9%90/"/>
    
    
    <category term="logic pro" scheme="https://blog.jzxer.cn/tags/logic-pro/"/>
    
    <category term="logicPro" scheme="https://blog.jzxer.cn/tags/logicPro/"/>
    
    <category term="音乐软体" scheme="https://blog.jzxer.cn/tags/%E9%9F%B3%E4%B9%90%E8%BD%AF%E4%BD%93/"/>
    
    <category term="音乐创作" scheme="https://blog.jzxer.cn/tags/%E9%9F%B3%E4%B9%90%E5%88%9B%E4%BD%9C/"/>
    
  </entry>
  
  <entry>
    <title>如何学习使用吉他效果器？</title>
    <link href="https://blog.jzxer.cn/20180829/xiaoguoqi/"/>
    <id>https://blog.jzxer.cn/20180829/xiaoguoqi/</id>
    <published>2018-08-29T14:36:40.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>搭配电吉他使用，可以让电吉他产生不同的音色</p><h2 id="参数介绍"><a href="#参数介绍" class="headerlink" title="参数介绍"></a>参数介绍</h2><h3 id="失真器-Distortion"><a href="#失真器-Distortion" class="headerlink" title="失真器 Distortion"></a>失真器 Distortion</h3><p>有“电的萨克斯”之称，是摇滚乐用得最多的一种效果器，常在歌曲的前奏、问麦、结尾、华彩独奏中加入，也用于模仿初、响弦小鼓灯节奏，发“查，查”声，演奏手法多变。</p><h3 id="驱动器-Over-Drive"><a href="#驱动器-Over-Drive" class="headerlink" title="驱动器 Over Drive"></a>驱动器 Over Drive</h3><p>常用于电吉他主旋律领奏、前奏、问奏、结尾等中加入。可产生从柔和圆润到金属般的激昂的管或压缩器（Comvresso…、是一种能够压缩高电平、提升低电平，具有改变或放大波形作用的效果器。</p><h3 id="和声–Chorus"><a href="#和声–Chorus" class="headerlink" title="和声–Chorus"></a>和声–Chorus</h3><p>是利用 BBD 电路，使声波产生延迟后与正常声波混和，通主、有两个声道输出，从而使电吉他的声音左右游移回荡、柔美宽广像混声大合唱的效果。如果只用一个输出端则立体大合唱效果较差。合声效果器常用于弹奏分解和弦或和弦伴奏。</p><h3 id="移相器-Phaser"><a href="#移相器-Phaser" class="headerlink" title="移相器 Phaser"></a>移相器 Phaser</h3><p>是利用经过移相的声波与原声波之间互相干涉作用，使声音产生颇震、固族飘逸效果。它与合唱器不同的是声音具有颜震感。早期用得较多的效果器之一。</p><h3 id="弗兰格-Flanger"><a href="#弗兰格-Flanger" class="headerlink" title="弗兰格 Flanger"></a>弗兰格 Flanger</h3><p>是一种产生额震音响的效果器，它与合唱不同的是声音具有旋转、飘逸、晚代感觉，缓慢时如太空梦幻、悠悠钟声。快速时发水波声或发鸡哇音，也能产生强烈如喷气发动机声。音色 变化较多。常用于在乐曲（歌曲伴奏）中添加特效，以增强艺术感染力。</p><h3 id="延时器-Delay"><a href="#延时器-Delay" class="headerlink" title="延时器 Delay"></a>延时器 Delay</h3><p>是产生混响或回声的效果器。有模拟延时器，数字延时器、混响器等 c 它们的原理基本相同，广泛用于舞台音响，卡拉 OK。<br>延迟时间可以从 50 毫秒到 1 秒以上，电吉他用的延时器一般为 20 ～ 476 毫秒之间，时间短产生混响效果（大厅效应人时间长则产生回声（山谷效应人电吉他通过延时器之后声音丰富、饱满、有空间感。回声，则常用于电吉他演奏最高潮时最</p><h3 id="哇音器-WAH"><a href="#哇音器-WAH" class="headerlink" title="哇音器 WAH"></a>哇音器 WAH</h3><p>不同于弗兰格。它的发音好似张嘴与合嘴产生的鸡——哇或哇——鸣声。缓慢时像人们切切丝语，快速时像青蛙叫，用于电吉他演奏诙偕、活泼的乐曲。也可 U 调出像拉弦乐器的音调，例如：国际朝阳电子乐队演奏的。</p><h3 id="均衡器-Equalize"><a href="#均衡器-Equalize" class="headerlink" title="均衡器 Equalize"></a>均衡器 Equalize</h3><p>又称频率补偿器、参数均衡器、用于调整电吉他的频响曲线。由于电吉他的频带中心比一般扩音机低二个信频程，哪从业*E 下降到 250H 助，一般的扩音机音调控制器无法调整电吉他的中、高音区。只有专用的均衡器才能胜任。<br>同时，均衡器可以设定电吉他的音调状态，以便在乐曲中的某一段表现明亮欢快或深沉宽厚的色彩，需要加入时只要踩一下开关即可十分方便。</p><h3 id="音色提升-Tone-B00Ate"><a href="#音色提升-Tone-B00Ate" class="headerlink" title="音色提升 Tone B00Ate"></a>音色提升 Tone B00Ate</h3><p>它不同于均衡器可任意调整全频带而只提升高音。常用于领奏时突出表现电吉他明亮欢快的音色，强调金属音。在用失真器进行迎泰华彩乐段时，同时加入这一效果，更具强烈明亮的金属音色彩。</p><h3 id="音量踏板-Pedal-Volume"><a href="#音量踏板-Pedal-Volume" class="headerlink" title="音量踏板 Pedal Volume"></a>音量踏板 Pedal Volume</h3><p>虽然在电吉他面板上或音箱上都有音量控制器，但这里的音量踏板用途有别于一般的音量控制器，它是作为表情踏板使用的。乐谱中标有强弱音记号时如*《或 PPP 等。就要用音量踏板控制音量的起伏变化。<br>在摇滚电吉他奏法中在一种 volume 奏法（音量奏法），是利用音量踏板或用右手小指旋转电吉他上的音量电位器，弹出没有音头而音量渐增的声音，像拉小提琴，有若隐若现的感觉。只要会利用还可产生其他效果。</p><h3 id="限幅器-Limiter"><a href="#限幅器-Limiter" class="headerlink" title="限幅器 Limiter"></a>限幅器 Limiter</h3><p>用于排除电吉他信号在传输中出现的过载或不良瞬变发生，当电平仍然超值时，内设的压控放大器（VCA） bo 以压缩，使声音不产生严重失真。</p><h3 id="噪声门-NOISE-Gate"><a href="#噪声门-NOISE-Gate" class="headerlink" title="噪声门 NOISE-Gate"></a>噪声门 NOISE-Gate</h3><p>当电路接线过长，效果器串联过多，能消除不良哼声和噪声，使电吉他的声音保持纯净优美。</p><h2 id="RP155-介绍"><a href="#RP155-介绍" class="headerlink" title="RP155 介绍"></a>RP155 介绍</h2><ol><li><p>演奏模式：当您接通 RP150 的电源时，即进入演奏模式。</p></li><li><p>旁通模式：进入旁通状态需要同时踩两个脚踏开关，显示屏显示”BY”字样说明预置被旁通。踩任何一个脚踏开关都可退出旁通状态。</p></li><li><p>校音模式：同时按下两个踏板不放开，当显示屏显示 TU 时即进入调节模式。</p></li><li><p>4 个纽的作用（每个纽对应上面的一组参数）：</p></li></ol><p>音色库旋钮（TONE LIBRARY KNOB）：在演奏模式中，转动这个旋钮可以选择一种基于流派的电吉他音色。但并不会改变合唱、延迟及混响等效果。</p><p>效果库旋钮（EFFECTS LIBRARY KNOB）：在演奏模式中转动此旋钮，可以改变模拟音箱后级的合唱混响及延迟之间的组合。但不会改变当前音色的失真、 音箱模拟及均衡的参数。</p><p>效果值旋钮（Effects Level Knob）:在演奏模式下，这个旋钮可以改变周边效果的水平值，可以将这个旋钮看作具有混合调节的功能。</p><p>主音量旋钮（Master Level Knob）：这个旋钮用于总体控制效果器的输出音量。</p><ol start="5"><li>编辑音色。</li></ol><p>按下效果器面板上的 edit 按钮，进入编辑模式。用 edit 上下的两个键可以选择需要编辑的效果。</p><p>（1）pickup（拾音器模拟）：显示屏显示 OF 时，此模式被关闭，按下 TONE LIBRARY 显示 ON，即可开启拾音器模拟模式(其他效果开启和关闭同理)。转动 TONE 旋钮选择：SH 为模拟双线圈，HS 为单线圈，Preset Level 为调节每个预置的音量。</p><p>（2）Wah（哇音）：按下 tone 开启此模式后，扭动 tone 选择哇音模式：CB 为传统哇音模式，，MC 为 VOX 哇音，,FR 为 Digitech 哇音。Wah Minimum 这个旋钮用来选择哇音开始扫描的最小频率,Wah Maximum 这个旋钮用来选择哇音扫描的最大频率,Wah Level 用来调节哇音电平<br>（3）Compressor（压缩）：DC 模式为 Digitech 压缩模式，CS 为 Boss CS-2 效果器压缩模式。Sustain 调节延音，Tone 为音色，Compressor Level 调节压缩单块的电平。<br>（4）Distortion（失真）：共 10 中单块失真模拟，开启此模式后:</p><p>TS 为 IbanezTS-9 单块，</p><p>T8 为 IbanezTS-808，</p><p>OP 为 DOD 250 Overdrive&#x2F;Preamp 单块，</p><p>RT 为 Pro Co RAT 单块，</p><p>DS 为 BossDS-1 单块，</p><p>GR 为 Grunge 单块，</p><p>MZ 为 Boss T-2 单块，</p><p>RM 为 DOD Gonkulator Ring Mod 单块，</p><p>FF 为 Arbiter Fuzz Face 单块，</p><p>BM 为 Electro-Harmonix Big Muff Pi 单块。</p><p>（5）Amplifier（音箱模拟）：CH 为 57 Fender Tweed Champ</p><ul><li>TD 为 57 Fender Tweed Deluxe</li><li>TB 为 59 Fender Tweed Bassman</li><li>TR 为 65 Fender Blackface Twin Reverb</li><li>DR 为 65 Fender Blackface Deluxe Reverb</li><li>SL 为 68 Marshall 100 Watt Super Lead</li><li>MV 为 77 Marshall Master Volume</li><li>80 为 83 Marshall JCM800</li><li>90 为 93 Marshall JCM900</li><li>A5 为 62 Vox AC15</li><li>AC 为 63 VOX AC30</li><li>HW 为 69 Hiwatt Custom100</li><li>MB 为 81 Mesa Boogie Mark 2C</li><li>RC 为 Mesa Boogie Dual Rectifier</li><li>HC 为 96 Matchless HC30</li><li>DS 为 Digitech solo</li><li>DM 为 Digitech Metal</li><li>DG 为 Digitech high gain</li><li>DB 为 Digitech Bright clean</li><li>DC 为 Digitech CLEAN TUBE</li><li>DR 为 Dreadnaught acoustic</li><li>DI 为 Direct 就是直通的意思</li><li>Cabinet（箱体模式）：TD - 1x12 ‘57 Fender</li><li>TR - 2x12 ‘65 Fender Blackface Twin Reverb</li><li>AC - 2x12 ‘63 Vox</li><li>TB - 4x10 ‘59 Fender Tweed Bassman</li><li>CL - 4x12 Marshall</li><li>VT - 4x12 Johnson Straight w&#x2F;Celestion Vintage 30’s</li><li>DS - 4x12 DigiTech Solo</li><li>DB - 2x12 DigiTech Bright</li><li>DM - 4x12 DigiTech Metal</li><li>DR - 4x12 DigiTech Rock</li><li>DA - 4x12 DigiTech Alt Rock</li><li>DV - 4x12 DigiTech Vintage</li><li>DI - Direct 直通模式</li><li>Amp Gain 用于改变当前音箱的增益或者失真度。</li><li>Amp Level 改变音箱音量。</li></ul><p>（6）EQ（均衡）：分别为低中高三段均衡调节</p><p>（7）Noise Gate（噪音门）：2 种模式，GA 为 Noise Gate ，SW 为 Auto Swell 。</p><ul><li>Threshold 设定噪音门的新号强度及敏感度。</li><li>Attack 信号电平上升时间。</li><li>Release 设置释放参数。</li></ul><p>（8）Chorus&#x2F;FX（合唱，周边）：开启后共 3 种 Chorus 单块供选择，CE 为 Boss CE-2 ，DC 为 DigiTech’ Dual Chorus，MC 为 DigiTech’s famous Multi Chorus</p><ul><li>依次往后 2 种为 Flanger 单块，FL 为 DigiTech Flanger，MX 为 MXR Flange</li><li>再往后为各种周边：PH 为 Phaser 相位，VB 为 Vibrato 颤音,RO 为 Rotary Speaker 喇叭旋转，TR 为 Tremolo 音量调制，PA 为 Panner 声像，EF 为 Envelope Filter 包络曲线，AY 为 AutoYa 自动哇音，SF 为 Step Filter 步进滤波，WH 为 DigiTech Whammy 踏板升音，PS 为 Pitch Shift 变调，DT 为 Detune 离调，HA 为 Intelligent Pitch Shifting 智能移调。</li></ul><p>（9）Delay（延迟）：共 5 个延迟模块供选择，分别是</p><ul><li>AD:(DigiTechAnalog Delay),</li><li>DD: (DigiTech Digital Delay),</li><li>MD: (DigiTech Modulated Delay),</li><li>PD:(DigiTech Pong Delay),</li><li>TD: (DigiTech Tape Delay).</li></ul><p>（10）Reverb（混响）：共 6 种，分别是</p><ul><li>SP - Fender Twin Reverb</li><li>AM - LexiconAmbience</li><li>ST - Lexicon Studio</li><li>RO - Lexicon Room</li><li>HA - Lexicon Hall</li><li>PL - EMT240 Plate</li></ul><p>失真 Distortion</p><p>压缩 compressor</p><p>音箱模拟 amplifier</p><p>箱头模拟</p><p>箱体模拟</p><p>EQ</p><p>Drum</p><h2 id="技巧"><a href="#技巧" class="headerlink" title="技巧"></a>技巧</h2>]]></content>
    
    
    <summary type="html">效果器用来搭配电吉他使用，可以让电吉他产生不同的音色</summary>
    
    
    
    <category term="音乐" scheme="https://blog.jzxer.cn/categories/%E9%9F%B3%E4%B9%90/"/>
    
    
    <category term="电吉他" scheme="https://blog.jzxer.cn/tags/%E7%94%B5%E5%90%89%E4%BB%96/"/>
    
    <category term="效果器" scheme="https://blog.jzxer.cn/tags/%E6%95%88%E6%9E%9C%E5%99%A8/"/>
    
    <category term="音乐" scheme="https://blog.jzxer.cn/tags/%E9%9F%B3%E4%B9%90/"/>
    
    <category term="音效设备" scheme="https://blog.jzxer.cn/tags/%E9%9F%B3%E6%95%88%E8%AE%BE%E5%A4%87/"/>
    
  </entry>
  
  <entry>
    <title>如何终端 ssh 免密登录 ECS</title>
    <link href="https://blog.jzxer.cn/20180818/20180818_sshLoginECS/"/>
    <id>https://blog.jzxer.cn/20180818/20180818_sshLoginECS/</id>
    <published>2018-08-18T06:02:41.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<h2 id="如何终端-ssh-免密登录-ECS"><a href="#如何终端-ssh-免密登录-ECS" class="headerlink" title="如何终端 ssh 免密登录 ECS"></a>如何终端 ssh 免密登录 ECS</h2><p>你是不是登录自己的远端服务器还是在使用输入账号密码？那么问题来了：</p><ol><li>密码忘了咋办！</li><li>比较复杂的密码输入起来浪费时间！</li><li>ip 地址忘了咋整！</li><li>…</li></ol><h2 id="第一步：查看本机是否有-id-rsa-pub-文件"><a href="#第一步：查看本机是否有-id-rsa-pub-文件" class="headerlink" title="第一步：查看本机是否有 id_rsa.pub 文件"></a>第一步：查看本机是否有 id_rsa.pub 文件</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat ~<span class="regexp">/.ssh/i</span>d_rsa.<span class="property">pub</span></span><br></pre></td></tr></table></figure><p>如果输出为空，就在下一步创建一下</p><h2 id="第二步：创建-id-rsa-pub-文件"><a href="#第二步：创建-id-rsa-pub-文件" class="headerlink" title="第二步：创建 id_rsa.pub 文件"></a>第二步：创建 id_rsa.pub 文件</h2><p>如果本机已经存在该文件，就直接跳到第三步</p><h3 id=""><a href="#" class="headerlink" title=""></a></h3><h3 id="先登录-git-账号"><a href="#先登录-git-账号" class="headerlink" title="先登录 git 账号"></a>先登录 git 账号</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config --globaluser.<span class="property">name</span> <span class="string">&quot;XXX&quot;</span></span><br><span class="line">git config --<span class="variable language_">global</span> user.<span class="property">email</span> <span class="string">&quot;XXX@163.com&quot;</span></span><br></pre></td></tr></table></figure><h3 id="-1"><a href="#-1" class="headerlink" title=""></a></h3><h3 id="生成-ssh-相关文件"><a href="#生成-ssh-相关文件" class="headerlink" title="生成 ssh 相关文件"></a>生成 ssh 相关文件</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa -C <span class="string">&quot;XXX@163.com&quot;</span></span><br></pre></td></tr></table></figure><h2 id="-2"><a href="#-2" class="headerlink" title=""></a></h2><h2 id="第三步：授权到远端-Ecs"><a href="#第三步：授权到远端-Ecs" class="headerlink" title="第三步：授权到远端 Ecs"></a>第三步：授权到远端 Ecs</h2><h3 id="复制本地端的-id-rsa-pub"><a href="#复制本地端的-id-rsa-pub" class="headerlink" title="复制本地端的 id_rsa.pub"></a>复制本地端的 id_rsa.pub</h3><p>注意应该是以 ssh-rsa 开头到 XXXXX.XXXXX.XXXX 结束的一段，这个可能是个会导致错误的点，建议如果你登录失败的时候可以回来看看这边是不是错了</p><h3 id="-3"><a href="#-3" class="headerlink" title=""></a></h3><h3 id="登录远程-Ecs，创建-authorized-keys-文件"><a href="#登录远程-Ecs，创建-authorized-keys-文件" class="headerlink" title="登录远程 Ecs，创建 authorized_keys 文件"></a>登录远程 Ecs，创建 authorized_keys 文件</h3><p>在 .ssh 文件夹下创建 authorized_keys 文件，并将之前复制的 id_rsa.pub 内容粘贴进去</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"># 参考代码</span><br><span class="line">cd ~/.<span class="property">ssh</span></span><br><span class="line">touch authorized_keys</span><br><span class="line">vim authorized_keys</span><br></pre></td></tr></table></figure><h3 id="-4"><a href="#-4" class="headerlink" title=""></a></h3><h3 id="更改授权-（可选）"><a href="#更改授权-（可选）" class="headerlink" title="更改授权 （可选）"></a>更改授权 （可选）</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># 设置所有人可以读写及执行</span><br><span class="line">chmod <span class="number">777</span> ~/.<span class="property">ssh</span></span><br><span class="line"></span><br><span class="line"># 设置拥有者可读写</span><br><span class="line">chmod <span class="number">600</span> ~<span class="regexp">/.ssh/</span>authorized_keys</span><br></pre></td></tr></table></figure><blockquote><p>这一步可以按自己的需要来设置</p></blockquote><h2 id="最后：就可以免密登录啦"><a href="#最后：就可以免密登录啦" class="headerlink" title="最后：就可以免密登录啦~"></a>最后：就可以免密登录啦~</h2><p>现在打开本机的终端，terminal，zsh 输入下面的代码就可以实现免密登录啦</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh $&#123;用户名&#125;@$&#123;ip地址 或者 域名&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">你是不是登录自己的远端服务器还是在使用输入账号密码？那么问题来了</summary>
    
    
    
    <category term="云服务器" scheme="https://blog.jzxer.cn/categories/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    
    <category term="ECS" scheme="https://blog.jzxer.cn/tags/ECS/"/>
    
    <category term="ssh" scheme="https://blog.jzxer.cn/tags/ssh/"/>
    
    <category term="vps" scheme="https://blog.jzxer.cn/tags/vps/"/>
    
  </entry>
  
  <entry>
    <title>和女室友的故事</title>
    <link href="https://blog.jzxer.cn/20180712/roomMateSecret/"/>
    <id>https://blog.jzxer.cn/20180712/roomMateSecret/</id>
    <published>2018-07-12T06:04:00.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="2abe293c0fa766b98c893ebb9f5e53598b7a6fa82817ba909a1ff23f326536fd">eccab743e855b2aca36e98accd588267c98f2032c343e123a2af7f975514bbb3463916fcc65a7ce95dff71173fa60be4a48da19eeac474b1ae4974f891362e9ad7b304d85e551c7cdc3afb317df76e7f7e50eb418eb19b66df5331829959436cc0f666e840481c7eb7962fcefaf700277e8ed57421cd14f7bb3d9d34e4d31cb4bf736f833d291622ce019cce922a99f984e5f6c1f731b4ad4e1f11b9e3d79800752bda404cf6a6e7fcfe551602d3a34b7ef8a49d0ca2461c9436e0877373c46b6a809c92a26cfa3aa7ea206481a89fa8b4b21ebeca681712729bf89bfc7705adf47cbf70972ccccb2ac3db50f4c4e4802ff126da9320f2c3c8722655429f7a162acd7debf67856ac0b0643db3fd3084087702a91d971b602e20582a86b32ec5fb0fd8faa8e246a1f9dd11550f499192b4cb37e262aa46994fbda2356f59ccbb52b21a18673c6dadab6c197d50001ce527925838c544cd1ecef89bd0d65658e86bb074476b12d1666fa26c033520818bd0026ebc28284181feb85ddb3ccd4d0b7ea9afafcec6fcd1e0e5e8c290905bc43fd3d3e98b12608324b1da94bbfdf449ef7f13d8b39a8527ed747786b52853045e9c5e95c8b56a62f544c24ff2e56c387a966d813c31158e2f161e8e93ef5a6963423dec548e04b8a5a2e54164874c4bfe0d3864ef77ef7f83a989538906ee521d6d81463b124058cad7838a63ae7da4f25346965411fc27a7f89ab18402fe8050672a2462c27c7ad30e0dce176ff31d31180e5c117b081bde9e2a199cb32bc6e1afccfd5abba4ab5919a112b35056dbce869861f17b898a88da8c30b5e2cbba4818242e7c296d9cbc856e9cd8a1f695f0be32a54f1829b1b8bd77816cd0f3dd29c83c03bbd8192a647b7a38b7ff70b562b16b4de274284d4f02c4c01fce367f735d85e2c8f6b7c4dab8674a6f7310ad4ef9534b39198c2862802d38e3f460034207776095c1fcd86e6102ba6894ae0d6afb5408547bff197e53577ee694c61bfcac2810217cf13a151d8860f826b0d98a363fcd6cd89a23daad00080cdbd31132bc5aab2c568b52bcbb03462d962aa3e7e4467f4d56a5195d2705bca37f53b581abe88b44832553f5bcd39db9e63023883ad7eeb29962383d7badcbbbbcfa3428f0a73577cd7f0aa96ce505473e66257615aae6887e8428945e19880a1320d43c179e5df8a9d5a3442f704f20103f63fbfd08d3dd60ddde4c9e068a8457d4ac2a9a5c6d35d9e04f548f7a15d8b5c8a68d5c16e106c0ed8fb05f9d3d364d2af8c75611b495a6d44dbd76271cc0cbc9df9effa20ed282768d9e4e647ba692b31e04e6095b139293ce54688471c61281b1b71ce1f2f0b880cbc8ae9a34b2e80dd3c8893dbcc59350e23c2d15b21cfe2f9401c2b7b31f1c7201e7fa60bf91deb6073c18c6a249c7553200002255f3267813993c472bf07da119a1d0203922d3d8ae4517f26ed6b0ba4afba65f5e40435f91817773e5f1a07a8a41bf046c761cfd0d46d9f4d7ebabb7a41dc3f4990c54ce983c85b4c09087eb88c98b065a8d0867c886b6fe0e4f9ed5850d2e4a857b60f336bcc3b6bd521ab8e5c08999a51fd9fb2003bf127ba2433873d7889e3cae8a2a52d7f9ab6a59a5e2389ce78d3011d8d619da844ea0dac2bbe15506b95ce9117718aadfc1dd1f886afc82157ead89f79aea5e353c4b82c69555800d75eb8aecfe2f2489e34d05fcb96b0dc694187051087ff49f2deffd3ac33f92055420d55ebdeca53296d202088a7b3025aa141044adbb2ad61c117cd24b6cc30e302fd6b2083015c1e06b328a3cbd17ce7e980bbbdc2c0ef4846c3446648723de5343db1c89e99626de1ed34daf0d0c85a629f89a90d522835aafad84a3c677c3bf79055d55bd7b69f60f7878706fb917a87a453b824d75d72dbe5b31559fd0662a55b1bb50e19594a4fb1489b4c398238da3f3aa88918757619cc9312a30199b7f96a2da6fc60c2b84b995a66afe75e51924469fb3ccabe227769aa8b313267e345dbb50d65adcf459cba540299e5bc9f9d9aec528dd8d46d4e05a99fb799fb5cf368f6a5d3daeb27573ded1e09395dba91e9f47b93a4a6da85ded99924b1d3714d7c7878d0aaa933251e2edc41e62ad5c85af52695430f379631ac6bfa1b853c33de2530740bc8727b2cd5fb2d9143834874d24ecfbaae1ddcdb2d27c9803c68b9234b51af536365b55795458f2467e3b26fbc4c838ab0163abed5831d24cc166a59d91c3ee2ab0dcd8372ba1b7fa5310ca2584a44f3253738936340d1f821b7a817b76ef53960f3395369462707b4bce9bc91a916646938eea69457b052172d6d0f182f0b949d8790f8878f01746e090f7a662e9de7fb75dabfcb0ac6b274df6bb1742b468d719d54c10514c0dd1e29b933ea8725c2133796b41cb1c5bacfd4d47cba16fbd0453cf128a8d5d6a1f1248372cd718cdf8a5e80e3fcfcf14d4776851325711ee21df1f4bf1456bf40c4df6ea06277bec8ad2e21ff573ea6ca5f0f9f6dda069b122adb4eed568e26e9e9eeafb202616fc4d94a9972dbc3073e2daee0a93d3d540956f258b38ddee66f39773aa0492ff9270a4dbde6e703641481b366c7355873915b0f38c409f71b7cd3088a1ef0451ec1a9f57894757214e2511defd102ed735318901a9b33b5dd6dbe047ee9f7ec27ace25dafec5667c602453a5796c9f7ce007951501b1c2543f7f310ccc9f9f5ffb5bda83910cdf808673b1fe96f025d4636c2e1ef6de59ea60741bc054f7f562dd36751556cd69fda1b95547c2f224a450cbe828945a843cf9d7e345f8e2122e9cf30b2d6ccb7611810fe5f9cea1b04e06e72918aaa8d8fc96c3ac75c1a4eeac02a034f9ad47cb548e366904c65c4d188f0cc16387528237564f61f4c213a426e916c00f0cac3ae9d7919891f09627343e57fd938ffad3e64450fac835db7af1ecb4aae8bf6c09624f5dcd09beea83d27adb81666c195f3fc0c5d08415c2161495eb341dd1559e752f502be6bb7477f1d453d22319c0032f5a01cfaee6ab96fd320555471b21552be5ce46417373cbfcaff967ae70480ce6492ed8df5d9f131fb0427540b57cf1c55e232a082d2cb5f7bebb2857667344fe2eff1859db708b08b1ea9756560ccb0166c320380a245aa1b655f7c99d252ae74506ef153bf3172863968e1d5cf60c8c49df730b40745d9555e0ff06e868bdb09048dd9c953d2fc8eed26cab6d3fcdc0504d860e7e0dfa650ff27c464c6f410f4334e95f97f4222acce67f84e4fcebfcb65f3473a2f60aa04e9e50c9613675839c9beefd6dfa2bfe376fa65e424004b4decd0ce246bfd42be7305d2f2f6631b53a63c3a1c795e2930562ee87d67489894de23f1aae3d2821e661577a77a89bf73c6f862b88e38948191b6bca7d50816db1966614905fa58ba82f4858b3a5a22467322822fc6066051990f1a3bf8c685fd4a9447eee5b8962f4bb736b06fb5576e07a0e93d080eaee9c46320323284f6cca9ab09dbe583be75eee84fc35d330ce20b02dd00ae43cfac513d22f405c6e67d6a9686a89508c724ca99b1635c972b8086c0c417996f3a67de552e67d397f0d678cc82659ca2daa837ed3ac507670c5449031d225a81173047350cd7b159dd9de1ab7add756442828f0f8e0e324aca2212496a5c081ac03ea955edd930eae2a7828dbbbf9a0b4d3b78c650dbe90fd4fe96beb5818f3c8adfa2dc63e4f16eb6febf3448dd65f058c53ea2f9d32e1ddc56f1f5da3fc1de3fc537283d895916ed1ccaaae30e7c5a1d882647a93410824204caa68284115495c1c7</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>看精简写作有感</title>
    <link href="https://blog.jzxer.cn/20170818/simpleWritting/"/>
    <id>https://blog.jzxer.cn/20170818/simpleWritting/</id>
    <published>2017-08-18T10:02:41.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<table><thead><tr><th>来源</th><th>作者</th><th>评分</th><th>阅读日期</th><th>备注</th></tr></thead><tbody><tr><td>电子书</td><td>罗伊</td><td>4</td><td>2017&#x2F;7&#x2F;6</td><td>无</td></tr></tbody></table><h2 id="内容简介"><a href="#内容简介" class="headerlink" title="内容简介"></a>内容简介</h2><p>通过短文的输出，更加简明扼要的突出重点内容，删除亢余杂糅的内容。</p><h2 id="书摘"><a href="#书摘" class="headerlink" title="书摘"></a>书摘</h2><ul><li>多看短文、收集短文、从而得到灵感，写出自己的东西。</li><li>将你的短文限制在 300 个单词以内。这是对于现在快节奏生活的能接受的文字数目。</li></ul><p>当时，5 美分是全美之最，即使 10 美分都被叫成两个 5 美分。人们会说：”你不想被‘木头做的 5 美分’骗吧。“ 最没价值的东西就是 5 美分…..【短文通过重复 5 美分来强调 —全美之最】</p><ul><li>凡·德雷尔写作的核心问题：</li></ul><ol><li>为什么这个故事很重要</li><li>这个故事要点是什么</li><li>为什么这个故事被大家传颂</li><li>关于生命、世界和我们生活的时代，这个故事讨论了什么</li><li>我的这个故事真正想表达什么？</li></ol><ul><li>检验短文的方法：</li></ul><ol><li>文章写的绕吗？</li><li>我写了多余的东西吗？</li><li>我转变时态和语言风格了吗？</li></ol><ul><li>用简单的词语来构建戏剧性的思想，充分利用人物、冲突、事件、地点和旁白</li><li>用非正式文体写出优秀文章的练习方式：有意识地删除功能词，运用缩略词，使用俚语、方言和其它习语。</li></ul><h2 id="练习"><a href="#练习" class="headerlink" title="练习"></a>练习</h2><p>尝试用一个单词或者一句话，去拓展完成这整个故事</p><ol><li>世界上最伟大的爱人<br>像一片枫叶一样飘落，她步伐轻盈地向我走来。如泉水般清澈的双眼，让我沉醉。她就像个想要和她心爱的凡人在一起而流落凡间的天使。她是我在这个世界上最伟大的爱人 – dev</li><li>巧克力污渍<br>那天游荡在空无一人的大街，喝着酒。想起悲伤的故事，故事里有她，和她心爱的巧克力。如果我再坚持一下，是不是结局就不会这样。一股热流从眼角流了下来，我自言自语的说：今天风好大，眼睛又进沙子了。起身拍了拍身上的灰尘，和衣袖上的巧克力污渍</li><li>月球行走<br>我时常在想，月亮上有人吗？如果嫦娥和吴刚的传说是真的，他们现在在一起了吗？他们会在吃完晚饭后牵手在月球上散步吗？如果会，那么在月球上行走的时候，应该每走一步都会留下纯洁的光吧~</li></ol><h2 id="佳句赏析"><a href="#佳句赏析" class="headerlink" title="佳句赏析"></a>佳句赏析</h2><ul><li>一日如一生，一生在一日</li><li>因不同而相互吸引，因相同而持久</li><li>狭隘的灵魂极易误解对他的批评，而宽广的灵魂会慢慢得到对他的陈赞</li><li>睡美人从不在意纺锤，她憎恨的是那苏醒之吻 – 《失眠》</li><li>他过敏，但她假装不知 –《花生黄油》</li><li>她把手放在他的手上，提笔落字。字迹看上去微颤，但这应该就行了。 – 《会客时间》</li><li>当一切都失败，人们才变理智</li><li>如果你顾忌脸面，那么你将失去立场</li><li>如果有人在大街上乱吐口香糖，那么我们应该从中提取他的 DNA，并且克隆他们，让后把他们的克隆体打的屁股开花。</li><li>太阳落下地平线；一对海豚跳进海湾；汤姆和蜜儿超酒吧走去。</li><li>贫穷期盼富贵，富贵者期盼幸福。单身者期盼婚姻，已婚者期盼死亡</li><li>酗酒是理性的毁灭，是提前的衰老，是暂时的死亡</li><li>你止不住笑，是因为你变老了；你变老了，是因为你止住了笑</li><li>好奇害死猫，但我暂时还只是个嫌犯</li><li>如果刚开始你没有成功，那就找找失败者能得到什么</li><li>如果你想在你的生活中找回一点音乐，那我就是你要找的人。我并非专业的歌手或音乐家，但我喜欢在弹钢琴和弹吉他的时候唱歌，而情歌总是在有人聆听的时候更为动听。你最爱听的又是什么呢？（宣传）</li><li>我喜欢建立在诚实、友爱、忠诚和乐趣之上的关系。我花了些时间才意识到自己是个非常好的倾听者。如果我们坐在餐桌旁，我感觉到你今天过的很糟糕，我会停下用餐，直视着你，问你出了什么事，我是否能帮上忙。 如果我们确立了关系，我会送你鲜花，不仅仅是在情人节，而是在每个你意想不到的时候。（引诱）</li><li>我期望的那个人是这样的——当我们手牵手，看弗洛里德一个又一个日落、寻找彩虹和跳跃的海豚时，她不怕她的脚趾间沾着那一丁点儿的沙子。我在镇子上有和很多的朋友（包括一条叫瑞丽的金毛犬和一只叫 oz 的猫），但却没有那个对自己来说很特别的人。至少目前没有。也许那个人会是你。</li></ul><h2 id="读后感"><a href="#读后感" class="headerlink" title="读后感"></a>读后感</h2><ul><li>想要句子有趣，把关键的单词放在最后不失为一个好的方法。</li><li>【宣传、引诱、捕获】用第一段或者是第一句话就抓住用户心理。</li><li>用最少的单词表达主题，可以参考林肯的演说。提取那些精髓的单词拼接成一段能表达中心思想的句子。</li></ul>]]></content>
    
    
    <summary type="html">通过短文的输出，更加简明扼要的突出重点内容，删除亢余杂糅的内容。</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="读后感" scheme="https://blog.jzxer.cn/tags/%E8%AF%BB%E5%90%8E%E6%84%9F/"/>
    
  </entry>
  
  <entry>
    <title>健身房的一次邂逅</title>
    <link href="https://blog.jzxer.cn/20170718/bodybuildingMeetAgirl/"/>
    <id>https://blog.jzxer.cn/20170718/bodybuildingMeetAgirl/</id>
    <published>2017-07-18T10:02:41.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="68c41facf376943456838a3d51f9aee8783bb5f9aa4cd0396bf1acd5adfc5132">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf70a7cef839d628f3a92f9da565bf02139572d6c60646d525ab57912184515483e42997baf05de833274a2fbfa0a0aa431c75e471227a81015f801d38f48d620686859654722c2c8e62942c1327dafbfa07971e9370cfdeafae7a4a82463306356e738e514b0af062d1c81bed1c0d514c4a82a55fd1cdcf4b8ccc1cf6f9d1bcb9ddaf51e396067b84d585c34aa827bccd610e30dda5f1083e40078989da867690d6481991b92932cf0bfaf2bf5bd0ac023f4f02ea2e67942bfbc4655a654c4a8ae8409dbdf7149fcfa880c105afd52b0b239c72d9b0dcb04b7b36f023a068704fc3172d838042699fd1920e90101c9f310d4159fde253e878f63915e80400216a8b23949f7f6e696f6459d0d4f322570a7f9d47fa2e3f163590bfc462a6607c00cecc05249a9a9a18f8c1e29d29987ae0700f6c52944ad27ed24ce21e39db59a9f5e9734c70936ec49d0bf6e2a72c93c78fafbe377f66eb93c7d73e5a718268b25e6384cffb9c860d63fd78b0047d001ce25990dbef90dd1557282539e3bc2e5bf74c4aed9ca40a262a1f5cfc79972ba4d32e353a4739a47ed987b186807cc952265c41e912d61093305f54101b94650634f8f2d2efc607b496775e629ea3432ddad1e6eff99672d7ab6a3c1b6b61a316061df50d1b9d4949a92eee31fb42be5324e4af17b57461ded74e02df9f3417511fc12088e87bd0abb9ccab0e91526dd4d798eb5504c00827627460ff41d07f6f94c8d7e5d049e69fb8be30b7e43a2871f311aa705db12f7c0472f4b9fd789238da7c56ba6875e99592b32b4406f6897ebfbf5938850b99846f4e9c02c0dcba7e3daaa0d6c6bef2fd5177b8f740861539a5465cc62e9d8d8f15947b417dcd26a02833f80a02f6a018d9860f5d768e37a491859084ac5c0aee0799d73dcb9e5c0a129cce8ea92eb596f11e9cda84d1c124b943a968492a19902a10499d2d74efae4df5205ad586aba46d5c74df08cc84877e4b9fc78f9e9bd436600b65b6b90b6b6abc3b7f5c4a78d1aae26f3fb82fec886ffce0bbec5ad70bbc0055e99cf0a612d644eac0c6789c38fcbc89be16cd404d54ced0818703b56693aa5d48fa6daa2b394b96ae85662f429f19c2416c2a829eb24b73e058aa8ee9683d5a43557bfaa3659bf2f72fd5452386771b08a564420a080600d8c184f952064a65349f44d9ba72f70dd4c92db12f72b50ae0b7a01813871aa14698ce3534a900390ba1321de4e0bf0198eb0fece0938ac4a2faf12f71623c7ff293e4ae04e8f464a2c848f92941307bba310bd2b3bc3dbb119b8f0628fc6da6ca4ff878b752ca5b3a1f644db86dcc78b7017c05f9a4297853da5db89ec9f49b9c3b18e5421686fc1088279d2d14ad3ad3aa5c8dc68050e3cd6574260ed3fddfee7915ad60b1ccb51e3cd4e52650bdbfd1a92b603d0dd5eb549e7fb97097358a69932ac6b1391cfb31581f4cbc3c24e6aea80a0aa03dfa6fbb7e37fe5f6b8343483ed70167e7089aebd6615d1d70d892157215e4096eb7d0cfb7ddb136f9b9b75870dac2a0bbf85edcbc07d42e98bcb02c041f4aa17a9c65504a159d39f8a957f61750e95ec0e6b75ebb1b7f4a574b352dffe90738e68d4ccea464be66b0549b83b96abff24290b65c90cac2548b101b1294237a5e730e21126e1f1820c8afe29c64dae3d5dbeb616e75f6ac2b0e040343c97f7158adbde5290d222cbd424c7c10ce2ec117014af2b2ef13e52b5a384ed2253c3186a6c309301e029337788c97483239860e25b69ceb572826645f41df160a97d970196b1b1c714005c93f0959ffe7c516ca564d4c228ba3e322781f5a3a3590d31f672edbb08d330bd3e5674a1858ece28e89ed53688353c77fbead1f3c0c68d7e6b7df23c9b7c7b6ab91d805d75a366f2013bb2686eaca6240fce884643f909d26b37e487c5665461c7f18f5238bb2ee4e862129e46e73dc36080ebf6db8f7b1e3866f22f03967c3c7a8e21078f4b8767fae39e6b927574e909dc6fca053656b1d997d08bc0ffce891798e185bf913f80db1a358a716ab294f2a47afcf3edb0633d70a723401e37e7b83a34158de96e37d99621e951c62a43aa1988c8feb92af087eee42bc10cc225369d8e461176b432f9e420fe0d536437cac37b82a0c60c81398fdc7d16bcfcbc991e328e5d103858d7ab48eb6f4ac8ddd66350ffdba3fabd52d924c5d1d81749d95752f163ed63f73b7f1a73c8e7778b48300ea0fbbb15529f479c091605eb6a777223650a7304ef37008e7abac9cda246b8548599ba410b8a47eb296d734bb5f5ef861c52feb136292bed281642217f57be9e1913600309f088a5c37f719a7e3f</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">健身房搭讪176新疆姑娘</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="搭讪艺术" scheme="https://blog.jzxer.cn/tags/%E6%90%AD%E8%AE%AA%E8%89%BA%E6%9C%AF/"/>
    
  </entry>
  
  <entry>
    <title>用Vue高仿qq音乐官网-pc端</title>
    <link href="https://blog.jzxer.cn/20170702/20170501_firstPage/"/>
    <id>https://blog.jzxer.cn/20170702/20170501_firstPage/</id>
    <published>2017-07-02T06:02:41.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<h2 id="用-Vue-高仿-qq-音乐官网-pc-端"><a href="#用-Vue-高仿-qq-音乐官网-pc-端" class="headerlink" title="用 Vue 高仿 qq 音乐官网-pc 端"></a>用 Vue 高仿 qq 音乐官网-pc 端</h2><p>一直想做一个 vue 项目 然后呢 我就做了</p><h2 id="效果预览"><a href="#效果预览" class="headerlink" title="效果预览"></a>效果预览</h2><p>部分地方不全部根据原版，也有自由发挥的，目前功能模块比较简陋，如果加载太慢，可以下载下来再本地运行</p><blockquote><p><a href="https://github.com/Binaryify/NeteaseCloudMusicApi">网易云音乐 API</a></p></blockquote><blockquote><p>项目地址：<a href="https://github.com/j710328466/vue-qqmusic">github</a></p></blockquote><blockquote><p>预览地址：<a href="http://182.254.147.168:8564/#/">demo</a></p></blockquote><h2 id="Build-Setup"><a href="#Build-Setup" class="headerlink" title="Build Setup"></a>Build Setup</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"># install dependencies</span><br><span class="line">cnpm i</span><br><span class="line">(可以用cnpm或yarn，更方便快捷，你值得拥有)</span><br><span class="line"></span><br><span class="line"># serve with hot reload at localhost:8564</span><br><span class="line">npm run dev</span><br><span class="line"></span><br><span class="line"># build for production with minification</span><br><span class="line">npm run build</span><br><span class="line"></span><br><span class="line"># build for production and view the bundle analyzer report</span><br><span class="line">npm run build --report</span><br><span class="line"></span><br><span class="line"># 网易云API部署 listen localhost:3000</span><br><span class="line">npm run start</span><br></pre></td></tr></table></figure><h2 id="技术栈"><a href="#技术栈" class="headerlink" title="技术栈"></a>技术栈</h2><ul><li>vue(数据绑定)</li><li>vue-router</li><li>vuex(管理组件状态，实现组件通信）</li><li>webpack(打包工具)</li><li>scss（原来想用 stylus,回头看看我都快写完了…）</li><li>axios（我等下要重点讲这****）</li><li>组件库: element-UI(本来想用 muse-UI,感觉那个更 cool，下次吧..)</li><li>API: 网易云音乐 API(仿 qq 音乐我用网易云音乐的东西，你怕不怕…)</li></ul><h2 id="核心功能组件的实现"><a href="#核心功能组件的实现" class="headerlink" title="核心功能组件的实现"></a>核心功能组件的实现</h2><h3 id="搜索功能"><a href="#搜索功能" class="headerlink" title="搜索功能"></a>搜索功能</h3><p><img src="https://ooo.0o0.ooo/2017/06/14/594135198d975.gif"></p><h3 id="播放功能"><a href="#播放功能" class="headerlink" title="播放功能"></a>播放功能</h3><p><img src="https://ooo.0o0.ooo/2017/06/14/5941364de751e.gif"><br>   (播放页面正在完善中，样式只是大概，待细化…)</p><h3 id="跳转功能"><a href="#跳转功能" class="headerlink" title="跳转功能"></a>跳转功能</h3><p><img src="https://ooo.0o0.ooo/2017/06/14/59415a8cd0df7.gif"><br>(目前子目录只开通歌手列表)</p><h2 id="自己挖的坑，自己埋"><a href="#自己挖的坑，自己埋" class="headerlink" title="自己挖的坑，自己埋"></a>自己挖的坑，自己埋</h2><h3 id="vuex-的模块应用"><a href="#vuex-的模块应用" class="headerlink" title="vuex 的模块应用"></a>vuex 的模块应用</h3><ul><li>一开始我并没有使用 vuex，因为我觉得目前这个项目比较小，并不需要它来管理数据，毕竟 vuex 针对大项目来说确实很好用，但是后来考虑到如果后期该项目我还要 维护，数据量一大，还是要重新分类数据，所以中途某些地方插入了 vuex 的使用，这就很大一部分影响了项目进行的进度。（目前只用到 action 和 state）</li></ul><h3 id="qq-音乐的轮播图"><a href="#qq-音乐的轮播图" class="headerlink" title="qq 音乐的轮播图"></a>qq 音乐的轮播图</h3><ul><li>不用说，qq 音乐这个网站的页面我是真的挺喜欢，不光是他的设计，页面的布局也很美观，在控制台调试的时候可以看看它的结构，非常有层次而富有美感，即使加上 一层 margin,padding 也不会有违和感。这就造就了它的轮播图结构比较麻烦，不是说做不出来，因为这是第一次上传的项目，我想先将大概的结构完善一下，后期再 维护，所以我就选用了 element-UI 里面的跑马灯式轮播图组件，大体来说，除了部分瑕疵以外，还是高度还原了原版轮播图的。</li></ul><h3 id="axios-后端数据获取时产生的跨域问题"><a href="#axios-后端数据获取时产生的跨域问题" class="headerlink" title="axios 后端数据获取时产生的跨域问题"></a>axios 后端数据获取时产生的跨域问题</h3><ul><li><p>重点来了，这个是我在该项目中花了最多时间的地方，相信很多同学使用 axios 都碰到过我这个问题，目前我这里使用了三种方法处理该问题，请大家针对自己的项目问题对号入座</p></li><li><p>跨域访问，简单来说就是 A 网站的 javascript 代码试图访问 B 网站，包括提交内容和获取内容。由于安全原因，跨域访问是被各大浏览器所默认禁止的。</p></li></ul><p>①. 针对本地相同端口服务器之间的跨域</p><ul><li><p>这是我刚开始碰到问题时使用的第一种，这个时候你只需要找到 build 文件中的 dev-server，找到引用 express 的位置，给它加上一个头文件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">app.all(&#x27;*&#x27;, function (req, res, next) &#123;</span><br><span class="line">res.header(&quot;Access-Control-Allow-Credentials&quot;, true)</span><br><span class="line">res.header(&quot;Access-Control-Allow-Origin&quot;, &quot;*&quot;)</span><br><span class="line">res.header(&quot;Access-Control-Allow-Headers&quot;, &quot;X-Requested-With&quot;)</span><br><span class="line">res.header(&quot;Access-Control-Allow-Methods&quot;, &quot;PUT,POST,GET,DELETE,OPTIONS&quot;)</span><br><span class="line">res.header(&quot;X-Powered-By&quot;, &#x27; 3.2.1&#x27;)</span><br><span class="line">res.header(&quot;Content-Type&quot;, &quot;application/json;charset=utf-8&quot;)</span><br><span class="line">next()</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></li></ul><blockquote><p><img src="https://ooo.0o0.ooo/2017/06/14/594140894d162.jpg"></p></blockquote><ul><li>然后它就会报错~，具体原因是你同一个端口申请相同端口的东西,不好意思，那不叫跨域…<br></li></ul><p>②. 针对本地不同端口的服务器之间的跨域</p><ul><li>就是将上面的头文件放在当前项目申请的服务器的那个 api 中。<br></li></ul><p>③. 针对本地服务器对域名服务器访问的跨域问题</p><ul><li><p>找到当前项目 congfig 文件夹下 index.js 文件，然后在文件中将 proxyTable 内容改为：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">proxyTable: &#123;</span><br><span class="line">   &#x27;/api&#x27;: &#123;</span><br><span class="line">   target: &#x27;[1]&#x27;,</span><br><span class="line">   changeOrigin: true,</span><br><span class="line">   pathRewrite: &#123;</span><br><span class="line">   &#x27;^/api&#x27;: &#x27;/&#x27;</span><br><span class="line">   &#125;</span><br><span class="line">  &#125;</span><br><span class="line"> &#125;</span><br></pre></td></tr></table></figure></li></ul><blockquote><p>就是你当前想访问的 api 地址，项目中访问的时候就只要用&#x2F;api 做反向代理即可</p></blockquote><h2 id="终于"><a href="#终于" class="headerlink" title="终于"></a>终于</h2><ul><li><p>这是我第一个用 vue 撸的项目，可能功能有点简陋，很多地方有待提高，不过这次实践让我对组件化的理解有了一定的提升，后期会继续加入其它功能模块的，文中有用词不对的地方，欢迎大家指出，项目有什么 bug，也希望大家多多提 issue</p></li><li><p>如果对你有帮助，给个 star 吧</p></li></ul>]]></content>
    
    
    <summary type="html">部分地方不全部根据原版，也有自由发挥的，目前功能模块比较简陋，如果加载太慢，可以下载下来再本地运行</summary>
    
    
    
    <category term="前端" scheme="https://blog.jzxer.cn/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="vue" scheme="https://blog.jzxer.cn/tags/vue/"/>
    
    <category term="mongodb" scheme="https://blog.jzxer.cn/tags/mongodb/"/>
    
    <category term="koa" scheme="https://blog.jzxer.cn/tags/koa/"/>
    
  </entry>
  
  <entry>
    <title>changelog 日志自动生成插件</title>
    <link href="https://blog.jzxer.cn/20170702/20180606_changelogAutoPlay/"/>
    <id>https://blog.jzxer.cn/20170702/20180606_changelogAutoPlay/</id>
    <published>2017-07-02T06:02:41.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<h2 id="changelog-日志自动生成插件"><a href="#changelog-日志自动生成插件" class="headerlink" title="changelog 日志自动生成插件"></a>changelog 日志自动生成插件</h2><p>该工具针对一些需要手动输入更新日志的项目，实现自动化输出更新日志，并且对更新日志进行内容格式化，便于后期维护，目前主要有以下几个功能模块。</p><ol><li>cz – 定制化 git 提交</li><li>log – 自动生成 CHANGELOG.MD 日志文件</li><li>lint – 校验 commit 信息</li></ol><p>安装依赖包</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">npm install @nicecode/changelog --save</span><br><span class="line"><span class="comment">// or</span></span><br><span class="line">yarn add @nicecode/changelog --save-dev</span><br></pre></td></tr></table></figure><h2 id="一、cz-模块"><a href="#一、cz-模块" class="headerlink" title="一、cz 模块"></a>一、cz 模块</h2><h3 id="1-安装-commitizen-依赖包"><a href="#1-安装-commitizen-依赖包" class="headerlink" title="1. 安装 commitizen 依赖包"></a>1. 安装 commitizen 依赖包</h3><blockquote><p>cnpm i commitizen –save-dev</p></blockquote><h3 id="2-在-package-json-中加入以下内容"><a href="#2-在-package-json-中加入以下内容" class="headerlink" title="2. 在 package.json 中加入以下内容"></a>2. 在 package.json 中加入以下内容</h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  ...</span><br><span class="line">  <span class="attr">&quot;config&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;commitizen&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="string">&quot;@nicecode/commit&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="3-在-package-json-中创建以下-script-命令"><a href="#3-在-package-json-中创建以下-script-命令" class="headerlink" title="3. 在 package.json 中创建以下 script 命令"></a>3. 在 package.json 中创建以下 script 命令</h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;cz&quot;</span><span class="punctuation">:</span> <span class="string">&quot;git add . &amp;&amp; git cz&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>按照提示正确输出 commit 信息内容，如下示例：</p><p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/29fc6a92aa7b4af0b3dcb937670e4a28~tplv-k3u1fbpfcp-zoom-1.image"></p><h2 id="二、log-模块"><a href="#二、log-模块" class="headerlink" title="二、log 模块"></a>二、log 模块</h2><h3 id="1-安装-conventional-changelog-cli-依赖包"><a href="#1-安装-conventional-changelog-cli-依赖包" class="headerlink" title="1. 安装 conventional-changelog-cli 依赖包"></a>1. 安装 conventional-changelog-cli 依赖包</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cnpm i conventional-changelog-cli --save-dev</span><br></pre></td></tr></table></figure><h3 id="2-创建以下命令"><a href="#2-创建以下命令" class="headerlink" title="2. 创建以下命令"></a>2. 创建以下命令</h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  ...</span><br><span class="line">  <span class="attr">&quot;script&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;log&quot;</span><span class="punctuation">:</span> <span class="string">&quot;conventional-changelog --n node_modules/@nicecode/changelog -i CHANGELOG.md -s -r 0&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line">&gt; 结尾数字若为 <span class="number">1</span> ，生成当前版本的变化情况，若为 <span class="number">0</span>， 生成所有的日志文件。</span><br></pre></td></tr></table></figure><h3 id="3-示例"><a href="#3-示例" class="headerlink" title="3. 示例"></a>3. 示例</h3><p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/38cb1858823a43f098b087ccde98be99~tplv-k3u1fbpfcp-zoom-1.image"></p><h2 id="三、lint-模块"><a href="#三、lint-模块" class="headerlink" title="三、lint 模块"></a>三、lint 模块</h2><h3 id="1-安装-husky-commitlint-依赖"><a href="#1-安装-husky-commitlint-依赖" class="headerlink" title="1. 安装 husky commitlint 依赖"></a>1. 安装 husky commitlint 依赖</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cnpm i husky commitlint @nicecode/commit-lint --save-dev</span><br></pre></td></tr></table></figure><h3 id="2-在-package-json-中引入以下配置"><a href="#2-在-package-json-中引入以下配置" class="headerlink" title="2. 在 package.json 中引入以下配置"></a>2. 在 package.json 中引入以下配置</h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  ...</span><br><span class="line">  <span class="attr">&quot;husky&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;hooks&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;commit-msg&quot;</span><span class="punctuation">:</span> <span class="string">&quot;commitlint -E HUSKY_GIT_PARAMS&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="3-在项目根路径下创建-commitlint-js-或者-commitlint-config-js"><a href="#3-在项目根路径下创建-commitlint-js-或者-commitlint-config-js" class="headerlink" title="3. 在项目根路径下创建 .commitlint.js 或者 commitlint.config.js"></a>3. 在项目根路径下创建 .commitlint.js 或者 commitlint.config.js</h3><p>具体配置可以参考 commitlint 官方，例子：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">module</span>.<span class="property">exports</span> = &#123;</span><br><span class="line">  <span class="attr">extends</span>: [<span class="string">&#x27;@nicecode/commit-lint&#x27;</span>],</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h2 id="建议"><a href="#建议" class="headerlink" title="建议"></a>建议</h2><p>可以搭配 <strong>husky</strong> 和 <strong>lint-stage</strong> 效果更佳。它能在你每次提交代码前校验你的代码格式并修复错误的代码格式，具体配置可以参考当前根目录下的 package.json 和 .eslintrc.</p><h2 id="Q-A"><a href="#Q-A" class="headerlink" title="Q&amp;A"></a>Q&amp;A</h2><h3 id="1-No-files-added-to-staging-Did-you-forget-to-run-git-add？"><a href="#1-No-files-added-to-staging-Did-you-forget-to-run-git-add？" class="headerlink" title="1. No files added to staging! Did you forget to run git add？"></a>1. No files added to staging! Did you forget to run git add？</h3><p>应该没有文件内容变动还执行 git add . 提交导致的。试着对项目进行更改再保存试试。</p><h3 id="2-提交后，输入更新日志命令，CHANGELOG-MD-内容没有更新？"><a href="#2-提交后，输入更新日志命令，CHANGELOG-MD-内容没有更新？" class="headerlink" title="2. 提交后，输入更新日志命令，CHANGELOG.MD 内容没有更新？"></a>2. 提交后，输入更新日志命令，CHANGELOG.MD 内容没有更新？</h3><p>只有每次版本迭代的的时候才会更新这一次的日志信息。可以尝试打个标签最为封版。</p><h3 id="3-mac-无法运行-git-命令，报错？"><a href="#3-mac-无法运行-git-命令，报错？" class="headerlink" title="3. mac 无法运行 git 命令，报错？"></a>3. mac 无法运行 git 命令，报错？</h3><p>可以试试安装 xcode.</p><blockquote><p>xcode-select –install</p></blockquote><h3 id="4-打印日志没有版本号？"><a href="#4-打印日志没有版本号？" class="headerlink" title="4. 打印日志没有版本号？"></a>4. 打印日志没有版本号？</h3><p>版本号目前支持的格式为 vX.X.X，👀 格式对吗？</p><h3 id="5-js-如何读取-md-文件？"><a href="#5-js-如何读取-md-文件？" class="headerlink" title="5. js 如何读取 md 文件？"></a>5. js 如何读取 md 文件？</h3><p>如果该项目使用了 webpack，可以使用 markdown-loader.</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">第一次写工具库，难免有瑕疵，欢迎大家 pr，但是还请口下留情😄</span><br><span class="line">喜欢的话给个 star吧</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">该工具针对一些需要手动输入更新日志的项目，实现自动化输出更新日志，并且对更新日志进行内容格式化，便于后期维护，目前主要有以下几个功能模块</summary>
    
    
    
    <category term="前端" scheme="https://blog.jzxer.cn/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="changelog" scheme="https://blog.jzxer.cn/tags/changelog/"/>
    
    <category term="开发工具" scheme="https://blog.jzxer.cn/tags/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
    
    <category term="nicecode" scheme="https://blog.jzxer.cn/tags/nicecode/"/>
    
  </entry>
  
  <entry>
    <title>如何写一篇具有逻辑性、引人入胜的文章</title>
    <link href="https://blog.jzxer.cn/20170618/howToWriteGoodEssy/"/>
    <id>https://blog.jzxer.cn/20170618/howToWriteGoodEssy/</id>
    <published>2017-06-18T10:02:41.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<h2 id="如何写一篇具有逻辑性、引人入胜的文章"><a href="#如何写一篇具有逻辑性、引人入胜的文章" class="headerlink" title="如何写一篇具有逻辑性、引人入胜的文章"></a>如何写一篇具有逻辑性、引人入胜的文章</h2><p>以下是一些建议，帮助你让文章更具吸引力，让读者更愿意读下去：</p><ol><li>清晰的主题陈述： 在文章开头明确表达主题，使读者一目了然知道文章将讨论什么。这有助于建立读者的兴趣。</li><li>逻辑结构： 组织文章的结构，确保内容有序、有层次感。可以采用时间顺序、问题解决、因果关系等结构，使读者能够轻松跟随思路。</li><li>段落有序： 每个段落都应有一个清晰的主题，开头引出主题，中间展开，结尾进行过渡。段落之间的过渡也要流畅，避免突兀的跳跃。</li><li>有足够的细节： 通过提供足够的细节、例子和事实支持观点，使文章更具可信度。这有助于读者更好地理解和接受你的观点。</li><li>引人入胜的引言： 使用引人入胜的引言或故事，吸引读者的注意力。这可以是一个有趣的事实、一个问题，或者一个引人深思的引用。</li><li>连贯的过渡： 使用过渡句子或段落，将不同部分连接起来。这有助于阅读的流畅性，避免读者感到迷失在文章中。</li><li>互动性： 与读者建立互动，可以通过提问、鼓励思考，或者分享一些与读者相关的经验。这能够增加读者的参与感。</li><li>简洁明了的语言： 避免使用过于复杂的词汇和长句子。简洁明了的语言更容易被理解，也更容易引起读者的兴趣。</li><li>尊重读者的时间： 在文章中保持紧凑，避免冗长的废话。读者通常喜欢能够迅速获取信息的文章。</li><li>悬念和高潮： 在文章中设置一些悬念或高潮，使读者渴望了解下文。这样能够增加读者的阅读兴趣和动力。</li></ol><p>通过考虑这些因素，你可以使文章更富有逻辑性和吸引力，让观众更愿意一直读下去。</p>]]></content>
    
    
    <summary type="html">清晰的主题陈述： 在文章开头明确表达主题，使读者一目了然知道文章将讨论什么。这有助于建立读者的兴趣。</summary>
    
    
    
    <category term="随笔" scheme="https://blog.jzxer.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="写作技巧" scheme="https://blog.jzxer.cn/tags/%E5%86%99%E4%BD%9C%E6%8A%80%E5%B7%A7/"/>
    
  </entry>
  
  <entry>
    <title>第一次去看庐山的风景</title>
    <link href="https://blog.jzxer.cn/20161010/dateWithATallGirl/"/>
    <id>https://blog.jzxer.cn/20161010/dateWithATallGirl/</id>
    <published>2016-10-10T07:00:06.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="061fbdcfdc1244d876c51dc8e92844082bdbd479ed503b17521ec2f7aa7da065">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c87520a1f068fe7066a854f40d4b40c230850041c452f0305a2c5d4364e431781cb0a4e41cc6a922ea9d083b6b6a0604e119a5a2f49090bbbf562b6c51f4d63ac6e152a6125b1b90825794607cf76e77133f017e491d60dc7a494482235b31edda91a4a1d27488b0f8167eae2066e926dd291adf64a13fde95e83d97d643e60955262b450540dcc3febf2c2a842fba96d13df26c6330ee28a3077583264f6e9f1bc6067019f2789bda871929be08cf11f176a38d46ad7d2e64543a0d29290fbd4d71a04913bfce7153c2a4f20e515a3241ce4332980124bcc8f2ddd75575b7018bb0777ea3384ff2ac7bb61559a2b83a75cda15f96a80a73ff4b0ed9dc8c8f71f529f8a90dda6d9a62a1144a9db1018b482a0fe3a5ecd74cd9601030d2659eb2d8c10a92cab97f1e3fa17e3c3b103c36f533f801e1c8cc08bdcccd636692cca74e876113a1e0f1a98adc2dc43100d16c9e8a755508155cbe523cc5de452ae886a776fdf7ea19aa36fbccca1931695b90104d2fcfa76d29b13359b97ee6b5531737a8a690b4e4aa632e4ae7ee28adc7d7d33d9ca3ab3c19d955be47bb5a8f4e3e2dffed5ccaa680713a57848a19ead4ee641b8a76bbe60127a340316b4ec336f8cb82be5bf17cb853025fa6f0ae26ed6e644af4a25e05f1e759742467edbc67af7b52d322f2c2124c3d79dfc47e273765b2cea3b9d6891abf0296705b2652009f93380ecd3c24d4d18e3f253f2eacd5809bfd80f2a07b8c042c19136cac35761ae3fcf370efb6538e6e32af494b231e8af2ab203d59203f950e5abacf72aed06d634a9297e7ae46fee4ff9eca65f197012865894e0ae94b8581f67c2effc5344d590726b5dfa2c243484172dacaf87570fa52d9ecd99c5959e10bea5205a6d79699308d738f2af4e3cbc695adedac8a1756ae9ba475ff8e347191d27dfa2b7578a6e6391c0c43c4d246bd01dbb5fff3dc3eb47e1954b80c9f23fe36b7c450a332d1c43a8649d87811c373713df404cc69c49f3632b59be1efd44ee493bd9d053064976708df37b23b0f513e2b2ec3ec8cce62c4b6528955cf164292fdb6245d49df97beccc467bbc3357dccc494708ed95dc24a8679d71a47c7e249730ff32b62c0ce3836b04bf23249cc9461b7f4fc11f9d3f5140535626135ddab47e3ea43d7a3ac3393087d02ae7acf6e9541c95d2329b36af112014ef8498dc6982da6f3723946efd0db5597598a3d39224612399d3065b28d3c1afc9f696b8a0b1e681696ebcca203c7fdc7089a40f18e852cc1ecdc07c56b2055bbdac10f660c47f541b79261d5617a18ce17b5893cb55e700bc4656c82f23375e0b2245c55141cf3f88e9a5b1b1732a3a11b75b0cc2a31dfd0e1c6207c4ab6d4037490e052a447bb00694fe7d514c7455094f5db5f6d03c8e2a7d90c9a38325fcb638beb9d63b5fa8e878c698b54003978d66e92480053772480abd0189b112cbf5c9c754e9c327a89f4556d759d51355f17c681680b1df956e2f86c8d737d8f603f7526743107b60695bc7988d30edd9955556d720f76d9d90a607b01e1a6ccea2703cba5f4dc63184df519c8ac9928a7472aaed9329f526257e64a98bec7c59e8a3ac995824fd1c373c2f3418e2bb762792b7648c956e6c3c84fb21d6d5cf5fa6e9ffee28251b95ae3d908efe43ee6167772e77ccead55fe84cccfe76b84a0852ec3a669d16b5de1e07b5f128bf52d8a0072d4df5de78aa2651d6023e1d3ee90d968cdf35d84334e534206fed7fd6d0a13480d8d8ca79becc55f462c88ac83cb22648f7ce0f346ffa71b25507d3a60bbbc80a15463676ae13ac3dd1dc763c5f6314d41408d242ad252cc7cfb7b7b0e9c207f728b4ec641b06365319f260e297d106eecf7b76bb8ca7815bfedd40959a39205e7b167149844cfb55196426e40bfedfcc5fd78b84688367e35fdc3e09b85a517ed32b44b3054a2f855fcc8febf7e11003680da99998f287148d1e1a9111a16bc7bebb5853d12e7201dabf6bc81c75b5d5d6524cd191d40cb126c4c93d999073c692ca95a4a9db23d9f1bbacd08ec857de9cfb56d1965d7f1b4f660ab26bded1223bee4c579f5009e138cb4817029702a1f288b680f7e76e05b9bf447ddde0992aea9bc7a4ee08bdc3de630b52c976ec57e6db86947ad6f0ddab1a8ad4a19d0143605cab6079ba9bed2c8e136a01242b13a891b3c0c11dba2219c3c7ca4e208bdbaebc55ed2cf3076954dc84dd84469f0f8076f54e44425081d6a9f0f4657d8cf4e07aed9b8907a7bdaae6b3ca6fa88a1afbad074ea270c0e601f6a3a962c9b83350eb7340bfab6db396620fad344635e36b4341651c1aae7bac418f1f713a3088259ec1894096b58148c5f8960721af17a23c9b59d41fd3dc6076360cfe233ae3c76f8d22fc5cb1c1816afc43c3e21768988b1de0d84d044eeeb81dca53de9ee744ca4d0fea6d2bb098ac0ec50bb8f033d3718c3a24987ad3d80b9baae6fdee82b011dfaccbb0db03be8442e2033dfd5bfcd3804422df302de1c3f40770969be46410bbdf5c55080c2014ee3554dd7e55d4ecc9c9e16e48eed996eec1fdfb152bf072100f9dd6fff004e3bece7ac477171e5670eb58807392096756528abb6faf7231ef34fc37de95cf60d0a5bd7eca8741103f264082d7aab93f3a3faba74f8cd7791639ad73f2deec65b10b7d476b25e09b2dd50cf1bdcae2003fdbd1801ab2305ce4c7efffca48301eca7e0d54c9e9a1469bd2c6268e6f87f3bf52fb2e9326a0f8c0b045e5b2b3fcc50d21188545324a4611dfa23c13d8bf13ac0566f86f2be450b0114888d294582dd45fcc1d167db08e254de185a36964de159c4ca5d557dcdab7d1d20673958973f5baa3305e4b644d15cf08174b5c267274e4cdb073d1caa40cb1f7825ef1da393b0c0f0bde404225b1578661bc6789827d35b5796941a253d8bb61f21691c5d893cf79dc7127fa7014fc8998b67506585f865eac8be664404f4b97bc65bb3b7e2ad833fee3c2a05687efd433380029458366943b052348dae55d5105e204525984121807e300357fbf2b995f331e7b56d7f00eccfabe14c4535dcba942ff51935de9ac323d780fb5e3218879507c84178a557ec68d62471dbef918b414df72ff70eb66a7838f563cb9c57bd569d234ba3ad83d6ea2e55e84b9a4c06d8f18394ec6d9f2cf55a1f53942dd6146d4e52e60b96af269384558f37d9ab171a6b0d529b6764214b2af527514cc3b88cb9a3b403f0cce8caf2330c17b290926a036a6fd1028e50595f6c115f91797f1d7e55d1451575f8cb4ba633de7cd121ec887d400fbafddbcef5048ab7f383b9c6002fba4f0a2fb82643e71119bd1c41cec871042355cf4aee2bf8a170a0815448d7cb66ce79a7a2c219b78b518baf7e247d734579743e54a910dce859aab0cb5e30cdc249a1111dbc1ac48b048e3b3aa3b9c9b8d4fb3b198e99bad1ea108ce20c42548570cf05a8bb1cc31f4fcfba5a6bc4198ab6c69187e470ca76b60f33c4e146d6bfdb1458d15a1535cfbe9ae82c755fd596a0b270e69d6f350bcaf78719a4960eae31abd4db3a34c69b94305de0a9eefa17fdb4ea686be357b2c8fc1df94635a1ab9544c6d068fd0ac871cf0ddecefa90c52e1015e13925490ebb331e69d586e56313039419e1625c31ab7bd2e43da7c47fe9994bc5276dc6f2d228383e24c30a1c32fcefa907c58b368593568ee509bebe8b0713a0285d7adad2c4dd7004507c2db52f638871a1c6d9f39654cc05af2d3d24b74c6d29078bb61d616accc7892e4cea6d9671a75d7d3a24e1ea209db6238e4bf16fccedaab732755992a4e95baaf740f879cf069b17003c8e3dcbbdd9325c3b5f22d9a2e00bab8f6d6d5917851efb1d4bb500ebe4f9fc6569da2287ee1f80be6833200a2a0123614e0eb0460a90ac1102fb0f42b06a22782438285374263e9ba4ba48aa3febf9ca66c6430e629f813ddf2db0827f13e1c6119a8dcbaf89cc8b0e9d2d74c1fafed2378156e7db382a743c35a84ee83fecf4b5a5521da2662f55270cc6b691327b42b55224468daa3291ea968f7b90cf9735fd97d59fcaecbc6b18033e65b921b3ce249bd4fb7357d0013aedcf97b423f33839e0052905b1546ed8d7e6bce28a084133c692a4364f0d458402c632a52d064a39e4e91fd48dc272e30236c4d9d40315ac6ab467120ddd1780d57268c2805af73acff6e340f2a375d4587c77829442cac9f590248eefee0f4803e8ebdd6582df54e5cbc275ae23915d856d7c905474e9198d0a56b0069bfe088abde98c6c5b3b497d9d3d45057956e97ffebe0d9b0d536a15a5685e77787d8623eda281befd0aa1a269aa791d4739d883ca65c37627f3077d46a6da78c5470febb4d76fd9020a8f8ff21a088656627d31b338ce817fba42acdc1e6cc22219ae33dd585c9ee1e92301d0b70f831f391937737b45a585d1469a0caf07efaf501a3077cea980b300ac8e3be1048b67e219197e2848bbf326017b85c446682f888fa00b0b05b970595bd98fee2ea8144d5fcb4cb09da9ad7b6ba5759440a231238d6150291a9d7fbc45c015809c08a582c10a8a1d282e90cfc8b4746a9bd465093bb62335f930ff70526d233c2ef268cb069c5e0219192bb910df79fa670e448ae9b1fd3fbc7cd7e61690307a20d65dc28ddb48775ea34ef8248ace509a718037b91d8be2436839c69ebc5dc529cd3b8294a6bd4343effa16a996b7924a548e08a4123c52ebad61650dacb60961c7dae4eac7e37e102204de0952b8713825728ca2eeedb5996aa1bed1a3cde6a0887f8fb25c2f22b9535f35010e8a4df87ccd188c0dd0daca7b614e559af9849759ce4b6cd54933190ac831c5f3ebf075ce323988d543a292eaa7b6ace34ef2a658c041f92a451a17ca5f3720432b14549517f6c4f7687de2393fa97dc1bc1bb2f02f2dfc0a9ce27669fbeb60f19c3ae6309be76880ec3a4d21eb55e7d311eb750ef19e94f5e843dfe1c967dcd99ac4ca1528d807025e4379862afda7555b157f8b304a3fac221cfb59a4a13d4e50f8d69b7fbcff08cbe262556cc04d30ccbaa5b53e1ff15b9587330e7e677f243173ef5e82f979f846bec7250ac590130f89446ea3b92ed4cc40781894f0abec221aa457cf</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="社交" scheme="https://blog.jzxer.cn/tags/%E7%A4%BE%E4%BA%A4/"/>
    
  </entry>
  
  <entry>
    <title>三个方法让读书更好吸收</title>
    <link href="https://blog.jzxer.cn/20160510/howToGetBook/"/>
    <id>https://blog.jzxer.cn/20160510/howToGetBook/</id>
    <published>2016-05-10T07:00:06.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<p>怎么样能够更好的吸收一本书的知识为我所用，和更适合我的读书方式探索</p><h2 id="物理屏蔽法"><a href="#物理屏蔽法" class="headerlink" title="物理屏蔽法"></a>物理屏蔽法</h2><p>有些人，天生能做到两耳不闻窗外事，但是绝大多数人还是特别容易受周围声音的影响，那这个时候，你就可以戴个耳机或者耳塞，隔绝掉那些不重要的让你分心的声音。另外，还有一种这个物理的方法，就是不管在家还是在办公室，你都可以，设立一个独立的工作区，在这个区域内，尽量不出现与工作无关的物品，尽量保持简洁清爽，一目了然。还有一个方法，如果你有条件，你可以像程序员那样，用两台显示器来工作。</p><h2 id="deadline-倒逼法"><a href="#deadline-倒逼法" class="headerlink" title="deadline 倒逼法"></a>deadline 倒逼法</h2><p>很多在外企工作的朋友一听到 deadline 这个词就浑身哆嗦。这个词什么意思呢？就到了时间活没干完，你就可以去死了。这也是为什么职场上流一条真理叫做 deadline，是第一生产力。如果你做的是一个大工程，就是一个 deadline，你可以把这个工作分成很多细节，然后，你把它拿一张纸来画一个进度表。今天该做什么，明天该做什么，一直到 deadline 之前，每一天做什么，都在这个表里用线段表示出来。这个表格还有一个专门的名字叫甘特图，有了甘特图，你现在是领先进度，还是落后，你最后能不能来得及，有没有前后调整的余地，这些全都一目了然了。</p><h2 id="番茄读书法"><a href="#番茄读书法" class="headerlink" title="番茄读书法"></a>番茄读书法</h2><p>目前来说，最容易进入心流状态的方法，最有效的读书学习方法。可以通过阅读《棉花糖实验》得出该结论。人们都普遍高估了自己的自控力。</p><p>自我控制的失效 才是症结所在。这里的自控，不止指管住自己的注意力（对外界的诱惑），还有自己对自我能力的控制（自我认知），对心理状态的控制（自我调节）。</p><h3 id="故事介绍"><a href="#故事介绍" class="headerlink" title="故事介绍"></a>故事介绍</h3><p>有个意大利老头叫做弗朗西斯科·西里洛，这老头在 1992 年发明了番茄工作法，这个方法可以有效的抵抗干扰。具体来说，就是一个番茄时间，就等于 25 分钟的连续工作和五分钟的强制休息。这样的 30 分钟就构成了一个最小的时间单位，有人就给他起了个名叫做煮一个番茄，你看这样循环下来，等你连着煮了四个番茄，也就是工作了两个小时以后，你可以休息 15-30 分钟。如果你每天能煮十个番茄，也就是你有五个小时的大块时间来高质量的完成那些重要不紧急的工作。那么剩下的这 2-3 个小时你就可以做一些琐事、杂事，那这个即便是受到一些打扰也无所谓。</p><h3 id="番茄步骤"><a href="#番茄步骤" class="headerlink" title="番茄步骤"></a>番茄步骤</h3><ol><li>定制待办<br>列出当天需要完成的任务，按照优先级写入番茄待办<br>原则：量力而行。宁可提前完成所有待办，也不要写过量的任务</li><li>分配时间<br>每工作 25 分钟（即一个番茄时间），休息 5 分钟。每 4 个番茄时间后休息 15 分钟。<br>原则：一天不超过 10 个番茄</li><li>执行番茄<br>● 一旦在番茄时间内中断了手上的工作（例如刷了会朋友圈），这个番茄时间视为无效，需要重新开始计时<br>● 休息的铃声响起则停止手上的工作</li></ol>]]></content>
    
    
    <summary type="html">有些人，天生能做到两耳不闻窗外事，但是绝大多数人还是特别容易受周围声音的影响，那这个时候，你就可以戴个耳机或者耳塞，隔绝掉那些不重要的让你分心的声音</summary>
    
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/categories/%E9%98%85%E8%AF%BB/"/>
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/tags/%E9%98%85%E8%AF%BB/"/>
    
    <category term="番茄读书法" scheme="https://blog.jzxer.cn/tags/%E7%95%AA%E8%8C%84%E8%AF%BB%E4%B9%A6%E6%B3%95/"/>
    
    <category term="deadline" scheme="https://blog.jzxer.cn/tags/deadline/"/>
    
  </entry>
  
  <entry>
    <title>如何提升读书速度</title>
    <link href="https://blog.jzxer.cn/20160510/improveReadSpeed/"/>
    <id>https://blog.jzxer.cn/20160510/improveReadSpeed/</id>
    <published>2016-05-10T07:00:06.000Z</published>
    <updated>2026-04-04T16:00:58.300Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1、如何提升看书速度"><a href="#1、如何提升看书速度" class="headerlink" title="1、如何提升看书速度"></a>1、如何提升看书速度</h2><h3 id="障碍一：如何选书"><a href="#障碍一：如何选书" class="headerlink" title="障碍一：如何选书"></a>障碍一：如何选书</h3><ol><li>出版社：不同的出版社优势不同</li><li>作者：看领域内口碑比较好的作者的书</li><li>印次</li><li>版次</li><li>印数</li><li>编与著</li><li>原著：尽量看原著，失真度较低</li><li>读书评：豆瓣、小红书</li></ol><h3 id="障碍二：如何提升阅读速度"><a href="#障碍二：如何提升阅读速度" class="headerlink" title="障碍二：如何提升阅读速度"></a>障碍二：如何提升阅读速度</h3><ol><li>眼镜移动速度慢</li><li>阅读太过专注于单词</li><li>注视时，对焦广度不够</li><li>提高阅读速度关键：提升辨识广度</li></ol><p>方法：1、指字，2、节奏，3、增加阅读速度</p><blockquote><p>务必多练习！</p></blockquote><h3 id="障碍三：如何提升阅读效率"><a href="#障碍三：如何提升阅读效率" class="headerlink" title="障碍三：如何提升阅读效率"></a>障碍三：如何提升阅读效率</h3><ol><li>主题阅读：</li><li>分析阅读：精读，</li><li>检视阅读：看粗体字或者是每个章节的粗体字和中心思想</li><li>基础阅读</li></ol><h2 id="2、如何用-30-分钟快速读完一本书"><a href="#2、如何用-30-分钟快速读完一本书" class="headerlink" title="2、如何用 30 分钟快速读完一本书"></a>2、如何用 30 分钟快速读完一本书</h2><p>奴仆式阅读法 vs 王者阅读法</p><p>根据自己的需求找到自己需要从书里学到的东西去筛选内容</p><ol><li>帕累托法则</li><li>二八法则</li><li>80&#x2F;20 法则</li></ol>]]></content>
    
    
    <summary type="html">如何提升看书速度</summary>
    
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/categories/%E9%98%85%E8%AF%BB/"/>
    
    
    <category term="阅读" scheme="https://blog.jzxer.cn/tags/%E9%98%85%E8%AF%BB/"/>
    
    <category term="帕累托法则" scheme="https://blog.jzxer.cn/tags/%E5%B8%95%E7%B4%AF%E6%89%98%E6%B3%95%E5%88%99/"/>
    
    <category term="二八法则" scheme="https://blog.jzxer.cn/tags/%E4%BA%8C%E5%85%AB%E6%B3%95%E5%88%99/"/>
    
  </entry>
  
  <entry>
    <title>她是一个很可爱的女生</title>
    <link href="https://blog.jzxer.cn/20150712/holidayToMeetACuteGirl/"/>
    <id>https://blog.jzxer.cn/20150712/holidayToMeetACuteGirl/</id>
    <published>2015-07-12T06:54:14.000Z</published>
    <updated>2026-04-04T16:00:58.299Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="f727675b47c23a748ab6d39a02db501bd60c1b47de807c420b90c1d85dd95b7a">9f569a554bb0ffc9fa3fcbf6978f7899f912e3812f16efe77ecb077f1a91ddf7d1c054709a1f057a14002f6de7b19a656054cc3d2f94dfe68cfde6a88b8d2f4c11b19f4d257ea449bd059e486da298d0da8f6acd964e87430bee46c2b9434a3c056baf56652fb021d09e7c22b96848a643c0b623593e5fecefd416d832c87520dff0f1a38272b03c47c211a5a1e0f155fe6c9b09978ac2dfd5039e816af67c2952461a38623c4ead5ebf74892a19a5cc573e548bcf7d51b61f98b2c2af0460ef901c1098dfe34e5337b047df47e44dd85abdbe4317a03204b56b7e9cc376d338f10932a29b309eeeac36c704c790cad7306c48ef409a66181df3f2f57b127ab6d4860ecb3c000c7f2b100f1021f095bf2382177ca8d516cf9bc825cb0d9a4a33144b2906714b4f9f1787b5b7700804cab2cadec8db1548889d86cc627ef44799af5eb1d0379bcf34bcc2497c587bde9a48a56cbea6331137ec7d4dfabc924c151f04fbc72ea66f9517accac5c727e3f869cdd5c0a3c38ff8b8177e372536e6d9f34697788b4a6b50c4fa128c0c567d325557eaef442814aaa58ea3deb42d1efd88dfbc2426b7c2331f3545681d7931a59b2a82cc0da1d4f04248c1a7752977eb6ea601daef1010ecfdcbf3ab184e1f608a339f35f0b72c77fc1f8f558a543511edf3b5ee45281e1189c7264c44d42c8362de21ef44a89cd22fbfcba0bf83789b6c6914e4c129353ae5936b83b7eb98005d547aba2c0bb20cd3cbcead3fad46e6eb88326d7998ee902b9fe51d5e4cb15f12241414994f0b6a94f08cebefbdf3553f5f2d023d4609c6446ec285a8ef00710aab658b64d6f5951cc59952e0da5f8724a7e8a12227f4123596dbe615e301ce819eaf69d3b394f021dd3f241a6169359a3d4550c0e5d2f59a4cb39e75a9e1b48b92b1a5af6c86448a9873f01229e6e9861e21694bb64bd4a22f8938ffd3d6e6e76c47cdbb7aa0d72e897e2ec67046227b0b6711c2306be6059be94515e9cec8dd922d4725373fb46a60023f96ae42b7dfbb9947d5ff8cc72008bcf9feb1b571b0ca6a4cbc24835fb7e79b879b89d0366e67d6b3f5334a5ca6efb114b46f784b69de717c518f6c05ec9c9e44744a88c7c41842498b08f63f1ea3ab74c805d40d0a5f6a5a6d2683327128aee1d10d96334879581d78cbe9836d2c5e5e494cba218575167b884db5fd76c0e862b60edba5b5e276c038eb745944fab3b9d963fa9883ca80ba192bf79375f112f1baab32c6ba7ef2870e2b0b57966bd7e9c1daf3b9bf8773e2c41e052a2ae9402500bd264e8e60e340d17593878d7cfa03f889bcf173b6033596d669b71445a744d54029bd612d72d2eb18d7c88eff4813f3eafc2e8fd2ded4d534b87da403ac1cfeeb8228663dfe7f2ff79f2556ed8e087f44b794558e4b0ba0041b1a93b809b4db4797a34405d6f829e9fcdc4eaf83d53d8ac3501d6ddc36c33d57f7aa5231192fcb8bc6d83deeadd9266a1955354441171c0a3d3ff4c0ce601f2e786f7e1f28708716877bd9b6373da265db83a1bdb63f826fd21346b6a972489df02faf0eb2ca988a794e0cdcdca8f8426a1315330a7f58290721bf84808abb7de1ff9a4c8497af8b0ae6e1558eee2eca37d54609673c8a0dca705cf228380f396d57595531693e805dfc4a306abd13d1994ffaf16ddeb3ff78027b0db98b6618d08527e99654400886129bcbfd4d8bebd1f5425a34cc73084dee0a1585206c7b1eaba4facb830442f2be5f419a62ac21f4a8dcefd2cc618860bb167a32752a62651f1d13e90e5f39a840d7e8a87f331ab31233d2bf5bd09b36e9a7d8ba463f647a65e091463606451016cb353ccfc5c395ef93854e6e9383dba98447d3ee12dd9bb626ddb9ff33c30be3ed78c8c0d359495d81737f16a42c8454475d8cc012990d78506534746801544eb390581a45b11c7a4dcfd53ab3ad1441646f4e5613f6720c2667e8b4638213e4f2a3e08385146f1a160d128b3301b4c12c26401751501dc1e94002626f51e81f23ad26b958f31c53cd08231dc55d191fa32e57844586ac3af094af0af258e92ac545b200820d9af71e0923633b943d7b91ce468e95301483ad4a9213cb28103bbf0295148c40a34f746f6d365b5665e15eecf66aebb223552480ffd2f88d75769a3f4e7bec9db22b6833f4fbc4fb7c043108ab1ce2706d1888b92e078a9d38e8701499075b548fce79ae14306ffc2c7a85b4ab1a46144c6c42055fb1c7bd8494b1345dca0ac2671a7cec068f2453aa8ec95ac0609fc791547acb78a76c64d247a4bdc3d3ff2f3ff8f2668f4c511f96abc6c995440365a3bdfa0423a1000bf044920c38668e73d431ddca53dd3dae6abf46949487eb895eeac116556840160eb478c7577dfa7ababbdc981a655a0a20d649c1b5f2b81d6a9117b04b54019b593912d6ace457b6906e37e06322d5ecf0733fb598e4dd6c47b174bc6bb107a9d1388b60e940847d9c6872d56404ee1e1e7dc28cc008dafab7aff42638a8615b57300c804b69d1770008f4c76e21237d0127b311f00f08c831f80fe2c56dddda01f0f7d6564af5b1ebbe0dca32b81c69421a495d2f8bffc00f8a1b8d6fe94aa11f580efc9b347f06954b1f3d7a0007eba41a074291c501bd4d109f3cae29b46fc3738e38f2a9c809e6f984baa1d452ad2f5704edfdfa194b7d8834bfa0d2d2e29b77fd79f2599baad0fdd4f4cbedba8576ab17995004140678a05a8f05a351e7e0496e6cf7429dc5cc856a68a8d6906a288668d4ce752ed6ae9659e87bddf180943f5649804d6185a9bc8c62b1185b8a6162a812c29f64da5cf1b85725adc6a8cecc9d51dabc7704b188e15270e7299da9450be80cd856d65384995e5ffe5b7f81ce8d7607d0d987c31f96d2c2e66891b305a2e2434ef69d6eb3e47fbb2dcf1b855ef386534aff0eb18c7720e6d098b14a6b30b1c76c3f71031d359f039c9c35492600b298f0f7b09ec75db78e908725acbdedf15b117d4661220b6f5983f5eb2da0c70a5a6e7cd58db064dd2ac31e9d066cf0a45977c4feb7453ba48b851ca461c5e789a474f182590677307542873d12e51f4c42874d54d228274fffb8479cf780e8b4fde1c7534c13269a103a8d637e2946f2a1d5ffd40c4a8875f782f700cdeaa6ccd3f96ca4e0470d45372da68fc34e18d91dba263837a1a80ed98944fe13fefafd496dd1402a6391bc70daa7aa3ca5db9cc4f6622e68efd181aaf01f0fdf00a29251df204003ede0a2362d8d7d35fb429f56a73424c5c8463282ae7cd78a14b38ab48a671c188ce1e005e2ca6f4c88dae87a7c4c485c1f4d9bd5347f5e387d9987419cffe2b096007a8a4d885da713d65d4144cd81c67edc02ab38662f5254b01333b3791c9b860a66a03a813531d12195f6b9a3c58f0151ed7ff2b2facfa09175399a08195e890d689c445e2dc92a9381a68f2fa692485d902bdefd23c2841b473797175106aee48a467eba7992006063dff0ee5df5f6f5424cdec40946fe4296bd52238d3dc27f697fb0855e319819154f2664387d8adc039ebd4a0c844fe29cece97ee7f66e35ab12dbd65ae3c90d51faf8d2a91bc1bdaeabb9abe00d5f7986c202731006f2c415166e07b9ff7bcac2bd82b006572c721cb2f20cb90f7398ecbff973d94f649d1507eac664354bdb725971a677b1f6f873cef3366f6b8035978748ac3da6a9fdb5ec08c15c3840b282523c1f8720a1d1ef63cff70581b4da8665c82950068c8027b2d24630e9171a1bd9b89fccb48c1c3be1b03468ad329a7ebb7d68f420445c0f4c4b0573a54c34e947d0c35993e9e39a9831a27afbca2e8b5a72059716acb56c1166491cffec813aea7f2ed1361cc9a17a8692a320645bf078c0e23397c25681387768ba6438c451ba7263addf9569ae1f2593ebf7b85839da05819094804ad2227df055f0ead9c398dab1c071c9be451fc92f8949bcc56ffc685fae355ac1b5d80f451331bbd30b0c9e28eb8b64bad08ef33e607081476c16b02cbac2f330a3ed2ab0a4c19ae786bba1ba0b3a77561fc86adbbdcd57ada90590d7c7599f8f41ac911b8fc8aeb76130ac9a92536f1f8cfd2bc70eea927bf61db79359442eaae4536b03e294e5d4b70663c174338c6683dedd91ca209c81ec7bd6e225e60c9806293f224f2e0449b46a04ff77567c3c7f8f47250d1f8f6406b89a4223b523bbc58363359b3217da1022e4d30be23b2d0cefab08cd15e9525fbd09f9edf2d44207e56a366f930e2768d1f780e1706a1686133048d82b4848754c6ad4e932aadf4f7ad70586c3a68e6d40538fff3f67e318282e2686bbca20bf3894ef2e4564346a1a57228b3506554e8acb25bc3c43da7794b1802d97ae17f32bd439d4c0b74539b9a37f0bc9110ba50fb422cdf888fe55496996771f58f808b2d9797b2413ab41302ecc344f0049672fcaeaee8ff6968835593f821d7feb283c3bf65d7465d404d42cfa15eca3a867fbb25cc5e9c2accb166f411ef93785865b7627cf989b9898ea6803402ab1e31a126a8f90bfeec1baa445b2ca89394fd54de803312141fdd70613931bab5648005c4fd5756d78cb80eca778c4587e4237734a6f6a7bdfd63304b833fa57b143b89b65f050e72e259cf72da675344268f285651bf36f7474805ea376915e327d983a694f02c1bc9bd9bd84a1582726b5ef799ff863a1b3fb0dbe7edde4aa53ad9ff535fff2fac7f82ff3fd574ff0e068ddc912780b04daad988537c4fb5945ff9b1e2bdf5885c600b2a683cc7c684d27c24fed8db46c4f42d78c81a48c730693b7f231a2022caba7b1edde2aa1ef746dd52d0eee7b9599cf4394dcb15e9f50883db796fc74a4bbae8647f0e83e2d3ee137cac151fcc704e987ed6aa744440df17e96f538d008c734086529c48b1b679dc63dd187c6e310f8a22fee27b0c93ca3e4d745db620d0340966ecfcb5c237aa699eafecfd4d396f0e491b29a9460110e7931be326afd15f1030cfee5245149277dea7bb3ea672440b49ef00a1d4f0ace166dda63b2a5c12d59584aa8798346d27c1b0d73ce802bff1917c23f394c7f2eed1849b1da3420a1bd0407f632ccac4aee8f090ffd67e36998922d8ba46087ae40fca16df37d138b24186a30d3b15a1e7157c624b39a77b15de0f4f800975063ad2b2b7ece1c08b5ad608cd5f1c84ae20734201cae61039cbb1684fa785c56fdca3bb76915425fff9ba147d48bf628301d42738b41978bef74f07359848c4772d1a1c95076f69a3ffbfb6de36c954db9e67df29da6c192950286bfe1927477ec2239d5f2996b4d371297ba4cee5d1cbb6037a5f2242053a2f69b6adc24a1f5bca7380cb9cf0a6e1817a1105fdfa00240d33f8362d2e062fb49f8be03b050</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-blink">      <input class="hbe hbe-input-field hbe-input-field-blink" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-blink" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-blink" data-content="该文章被加密了, 请输入密码查看.">该文章被加密了, 请输入密码查看.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">该文章被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="pickup" scheme="https://blog.jzxer.cn/categories/pickup/"/>
    
    
    <category term="dating" scheme="https://blog.jzxer.cn/tags/dating/"/>
    
    <category term="约会" scheme="https://blog.jzxer.cn/tags/%E7%BA%A6%E4%BC%9A/"/>
    
  </entry>
  
</feed>
