小默叔叔 发表于 2022-4-27 22:49

【平头哥RVB2601创意应用开发】RVB2601之获取天气小工具

<p>项目往期连载文章传送门:<br />
<a href="https://bbs.eeworld.com.cn/thread-1197337-1-1.html" target="_blank">【平头哥RVB2601创意应用开发】 RVB2601之KV组件介绍和使用 </a><br />
<a href="https://bbs.eeworld.com.cn/thread-1201497-1-1.html" target="_blank">【平头哥RVB2601创意应用开发】 RVB2601之OLED-SSD1306移植介绍和使用</a><br />
<a href="https://bbs.eeworld.com.cn/thread-1201498-1-1.html" target="_blank">【平头哥RVB2601创意应用开发】 RVB2601之cJSON介绍和使用</a><br />
<a href="https://bbs.eeworld.com.cn/thread-1201499-1-1.html" target="_blank">【平头哥RVB2601创意应用开发】 RVB2601之WiFi联网获取天气信息方式介绍和使用</a></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>一、作品简介</p>

<ol>
        <li>用户可以通过按键出发获取天气的动作</li>
        <li>设备连接固定WiFi之后,接收到按键发出的条件,通过http去请求天气信息</li>
        <li>获取天气信息成功后,解析天气信息JSON数据,&middot;把结果发送给OLED显示线程</li>
        <li>oled屏同步显示获取天气信息和时间</li>
</ol>

<p>二、系统介绍</p>

<p>1.使用到的硬件:</p>

<ul>
        <li>
        <p>OLED(SPI接口)</p>

        <blockquote>
        <p>软件模拟SPI:CLK:PA.28 MOSI:PA.29 CS:PA.27 MISO:PA.30</p>
        </blockquote>
        </li>
        <li>
        <p>按键(GPIO)</p>

        <blockquote>
        <p>使用IO:GPIO:PA.11</p>
        </blockquote>
        </li>
        <li>
        <p>Wi-Fi(SPI)</p>

        <blockquote>
        <p>使用IO:MOSI:PA.17 CS:PA15 MISO:PA18 CLK:PA.16 REST:PA.21 WAKEUP:PA.25</p>
        </blockquote>
        </li>
</ul>

<p> &nbsp; &nbsp;</p>

<p>2.软件设计</p>

<p> &nbsp;</p>

<pre>
<code>   1.软件初始化会对网络、事件服务、日志和kv组件等进行初始化,并会创建线程"oled_task"、"button_task"、"get_weather_task"
   2.kv组件:负责存储获取天气信息的URL,以及WiFi需要连接的热点SSID和PASSWORD

   3.网络部分:主要负责WiFi驱动和联网等工作,并移植增加了例如http get等接口,并做了底层的实现 network 的移植

   4.按键线程"button_task":用于用户主动查询获取当前天气的方式

   5.获取天气信息线程"get_weather_task":用于查询天气信息的线程,并解析数据,发送给其他线程
   6.oled显示线程"oled_thread":屏幕用于显示同步用户操作获取到的当前天气信息

   7.使用了消息队列同于线程间通讯
</code></pre>

<p>三、各部分实现的功能说明和解析</p>

<p>1.网络部分</p>

<p>a.netmgr初始化和w800联网部分</p>

<p> &nbsp;</p>

<p>b.回调函数中w800联网成功后,开始启动获取天气信息的线程</p>

<p> &nbsp;</p>

<p>c.移植 http 接口和 http接口函数的实现 -network</p>

<p>&nbsp;</p>

<p>2.OLED部分</p>

<p>a.部分移植 RT-thread软件包 ssd1306,优化部分API,例如直接增加字符串写入,之前是单个字符传入</p>

<p> &nbsp;</p>

<p>b.接受weather_thread线程发送的天气信息,并显示<br />
&nbsp;</p>

<p>3.获取天气部分</p>

<p>a. 线程的创建</p>

<p> &nbsp;</p>

<p>b. http get请求天气</p>

<p> &nbsp;</p>

<p>c. cJSON解析天气信息,并发送给 oled_thread</p>

<p> &nbsp;</p>

<p>4.按键部分</p>

<p>这里没有使用事件触发,只是做了很普通的轮询,也没有做长按、短按等状态判断,只是确认按键按下后,就发出查询天气状态消息,发送给weather_thread线程,来获取状态</p>

<p> &nbsp;</p>

<p>四、视频演示</p>

<p>视频介绍:</p>

<ol>
        <li>给设备上电,OLED 会开机动画,闪烁几次,显示当前用户信息。</li>
        <li>设备也会连接默认的热点</li>
        <li>按键key1&nbsp;按下,设备会请求天气信息</li>
        <li>获取天气信息后,解析完成,发送到oled显示出来</li>
</ol>

<p>&nbsp;视频地址:</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;https://b23.tv/l64gVqB</p>

<p>五、源码</p>

<p>开源仓库:<a href="https://gitee.com/hanxiaomo9527/ch2601_http_weather_demo.git">https://gitee.com/hanxiaomo9527/ch2601_http_weather_demo.git</a></p>

<p>上传了pdf版本的项目介绍,希望代码大家可以借鉴使用或者多多交流。</p>

lugl4313820 发表于 2022-4-28 15:49

能使用http库的话,就方便一些,目前还没有找到mqtt的库,不知道官方有没有这方面的支持。

小默叔叔 发表于 2022-4-29 07:56

lugl4313820 发表于 2022-4-28 15:49
能使用http库的话,就方便一些,目前还没有找到mqtt的库,不知道官方有没有这方面的支持。

<p>你这个没必要使用 MQTT,获取天气就只是简单的 HTTP 请求,如果需要和云平台通讯,才会使用 MQTT,你可以看下,怎么接入阿里云,应该是有相关的demo的</p>
页: [1]
查看完整版本: 【平头哥RVB2601创意应用开发】RVB2601之获取天气小工具