<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Arduino on Rancho&#39;s Notes</title>
    <link>https://fan-pengfei.top/tags/arduino/</link>
    <description>Recent content in Arduino on Rancho&#39;s Notes</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Fri, 07 Apr 2023 05:47:41 +0000</lastBuildDate>
    <atom:link href="https://fan-pengfei.top/tags/arduino/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>基于Arduino的LVGL移植</title>
      <link>https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/</link>
      <pubDate>Fri, 07 Apr 2023 05:47:41 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;这是一篇如何将LVGL移植到Arduino的教程(基于芯片ESP32 Pico D4)；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;软件版本&#34;&gt;软件版本&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;这次实验使用的lvgl版本是8.1.1，要先配置好tft_espi，确保显示正常；如果要使用触摸屏设备，在移植之前要确保能获取到触摸数据；&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;工程配置&#34;&gt;工程配置&lt;/h2&gt;
&lt;h3 id=&#34;库安装&#34;&gt;库安装&lt;/h3&gt;
&lt;p&gt;添加lvgl库 ，最好也添加lv_examples库，自带的例子虽然内容完全一样，但是并不能直接使用；&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;库安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后复制为lv_conf_template.h为lv_conf.h：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lv_conf.h创建&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后复制为lv_demo_conf_template.h为lv_demo_conf.h：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lv_demo_conf.h创建&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;配置文件&#34;&gt;配置文件&lt;/h3&gt;
&lt;h4 id=&#34;lv_confh&#34;&gt;lv_conf.h&lt;/h4&gt;
&lt;p&gt;修改这几个地方；&lt;/p&gt;
&lt;p&gt;启动lv_conf.h：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-4.png&#34;&gt;
&lt;strong&gt;启动lv_conf&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;设置色深，一般都是16：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-5.png&#34;&gt;
&lt;strong&gt;设置色深&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;启动自定义时钟，不设置的话只会显示第一帧不动：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-6.png&#34;&gt;
&lt;strong&gt;启动自定义时钟&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;LV_DPI_DEF 注意这里，虽然LVGL的作者说这个没这么重要，但他会严重影响到LVGL的动画效果，你应该进行DPI的手动计算，例如240x280分辨率1.69英寸的屏幕，那么 DPI为：&lt;/p&gt;
&lt;p&gt;LV_DPI_DEF =\frac{\sqrt{240*280} }{1.69} ≈ 153
&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-7.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LV_DPI_DEF配置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;也可以使能日志打印：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-8.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使能日志打印&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;lv_demo_confh&#34;&gt;lv_demo_conf.h&lt;/h4&gt;
&lt;p&gt;修改这几个地方；&lt;/p&gt;
&lt;p&gt;启动lv_demo_conf.h：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-9.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;启动Demo&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;配置要运行的Demo：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-10.png&#34;&gt;
&lt;strong&gt;Demo选择&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;自定义显示接口和外部输入接口&#34;&gt;自定义显示接口和外部输入接口&lt;/h2&gt;
&lt;h3 id=&#34;文件添加&#34;&gt;文件添加&lt;/h3&gt;
&lt;p&gt;在src文件夹下添加以下两个文件：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-11.png&#34;&gt;
&lt;strong&gt;自定义接口&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;代码内容&#34;&gt;代码内容&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;my_lv_ports.cpp&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;my_lv_ports.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;CST816T.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TFT_eSPI tft &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TFT_eSPI&lt;/span&gt;();     &lt;span style=&#34;color:#75715e&#34;&gt;/* TFT instance */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CST816T &lt;span style=&#34;color:#a6e22e&#34;&gt;touch&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;19&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;21&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;22&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// sda, scl, rst, irq
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// /*Read the touchpad*/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;my_touchpad_read&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;lv_indev_drv_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;indev_driver, &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_indev_data_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; FingerNum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; gesture;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint16_t&lt;/span&gt; touchX, touchY;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    FingerNum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; touch.&lt;span style=&#34;color:#a6e22e&#34;&gt;getTouch&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;touchX, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;touchY, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;gesture);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (FingerNum)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;state &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LV_INDEV_STATE_REL;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;point.x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; touchX;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;point.y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; touchY;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#if LV_USE_LOG != 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Serial.&lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Touch: x=%d y=%d mode=%d&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, touchX, touchY, gesture);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        FingerNum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;state &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LV_INDEV_STATE_PR;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/* Display flushing */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;my_disp_flush&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;lv_disp_drv_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;disp, &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_area_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;area,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_color_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;color_p)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; w &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;x2 &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;x1 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; h &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;y2 &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;y1 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tft.&lt;span style=&#34;color:#a6e22e&#34;&gt;setSwapBytes&lt;/span&gt;(true);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// tft.pushImageDMA(area-&amp;gt;x1, area-&amp;gt;y1, w, h, (uint16_t *)&amp;amp;color_p-&amp;gt;full);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tft.&lt;span style=&#34;color:#a6e22e&#34;&gt;pushImage&lt;/span&gt;(area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;x1, area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;y1, w, h, (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint16_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;color_p&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;full);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// tft.startWrite();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// tft.setAddrWindow( area-&amp;gt;x1, area-&amp;gt;y1, w, h );
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// tft.pushColors( ( uint16_t * )&amp;amp;color_p-&amp;gt;full, w * h, true );
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// tft.endWrite();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_disp_flush_ready&lt;/span&gt;(disp);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#if LV_USE_LOG != 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;my_print&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;buf)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Serial.&lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, buf);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;my_disp_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 绘图缓冲初始化
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//   static lv_disp_draw_buf_t draw_buf;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//   static lv_color_t buf[screenWidth * 10];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//   lv_disp_draw_buf_init(&amp;amp;draw_buf, buf, NULL, screenWidth * 10);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_disp_draw_buf_t&lt;/span&gt; draw_buf;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_color_t&lt;/span&gt; buf_2_1[screenWidth &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;40&lt;/span&gt;]; &lt;span style=&#34;color:#75715e&#34;&gt;/*A buffer for 10 rows*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_color_t&lt;/span&gt; buf_2_2[screenWidth &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;40&lt;/span&gt;]; &lt;span style=&#34;color:#75715e&#34;&gt;/*An other buffer for 10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    rows*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_disp_draw_buf_init&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;draw_buf, buf_2_1, buf_2_2,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          screenWidth &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;/*Initialize
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                          the display buffer*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// TFT驱动初始化
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tft.&lt;span style=&#34;color:#a6e22e&#34;&gt;begin&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;/* TFT init */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// tft.initDMA();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tft.&lt;span style=&#34;color:#a6e22e&#34;&gt;setRotation&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;/* Landscape orientation, flipped */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 设置LVGL显示设备
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_disp_drv_t&lt;/span&gt; disp_drv;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_disp_drv_init&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;disp_drv);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/*Change the following line to your display resolution*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    disp_drv.hor_res &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; screenWidth;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    disp_drv.ver_res &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; screenHeight;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    disp_drv.flush_cb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; my_disp_flush;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    disp_drv.draw_buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;draw_buf;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_disp_drv_register&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;disp_drv);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    touch.&lt;span style=&#34;color:#a6e22e&#34;&gt;begin&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 设置LVGL输入设备（电阻屏）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_indev_drv_t&lt;/span&gt; indev_drv;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_indev_drv_init&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;indev_drv);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    indev_drv.type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LV_INDEV_TYPE_POINTER;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    indev_drv.read_cb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; my_touchpad_read;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_indev_drv_register&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;indev_drv);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 设置LVGL串口输出设备（调试用）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#if LV_USE_LOG != 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_log_register_print_cb&lt;/span&gt;(my_print);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;my_lv_ports.h&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Arduino</title>
      <link>https://fan-pengfei.top/posts/arduino/</link>
      <pubDate>Sat, 02 Oct 2021 08:16:16 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/arduino/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;最近做项目用到了Arduino的板子，在此记录一下开发过程中遇到的一些问题，其实我之前是很不情愿用Arduino，觉得底层都被封装起来了，而且那个IDE用起来真的是一言难尽。不过最近客户要求用Arduino进行开发，就硬着头皮上了，结果发现用VScode+Platformio开发Arduino还是顶好用的，而且有太多可以用的封装好的函数了，真香！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h3 id=&#34;一个io引脚驱动两个不同颜色的led&#34;&gt;一个IO引脚驱动两个不同颜色的LED&lt;/h3&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;用一个IO引脚驱动两个led灯&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/arduino/img-1.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这个电路可以实现，一个IO引脚驱动两个不同颜色的LED，不过自己只测试过红色和绿色的LED，其他颜色的并没有验证，因为似乎红色和绿色对电压的要求较低。&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
  </channel>
</rss>
