描述
<p>(啊啊啊!来不及啦,时间不够啦,赶紧做完温湿度交上)</p>
<h3 style="line-height:1.8">* 1、项目功能介绍</h3>
<hr>
<p style="line-height:1.8">实现SHT桌面温湿度计功能</p>
<p style="line-height:1.8">esp32无线发送/接收数据</p>
<p style="line-height:1.8">使用LCD作为显示屏</p>
<p style="line-height:1.8">mpu6050作为交互</p>
<p style="line-height:1.8">可选按键作为交互</p>
<p style="line-height:1.8">(后续我有时间的话会学一下LVGL、SD卡,将此项目开发成小电视)</p>
<p style="line-height:1.8">(远程传感器控制中心,有时间的话实现。暂时想的是esp32做远程传感器模块)</p>
<h3 style="line-height:1.8">*2、项目属性</h3>
<hr>
<p style="line-height:1.8">原创</p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">* 3、开源协议</h3>
<hr>
<p style="line-height:1.8">Public Domain</p>
<h3 style="line-height:1.8">*4、硬件部分</h3>
<hr>
<p style="line-height:1.8">主控板:</p>
<p style="line-height:1.8"><span style="color:#000000">主控部分:esp32模组</span></p>
<p style="line-height:1.8"><span style="color:#000000"> 主控部分使用esp32,这样我可以直接使用wifi功能无线发送/接收数据。虽然我之前并没有学习过如何使用esp32,但是咱就是不怕困难,这次就边学边做。</span></p>
<p style="line-height:1.8"><span style="color:#000000">显示部分:2.8寸LCD显示屏(插接)</span></p>
<p style="line-height:1.8"><span style="color:#000000"> </span></p>
<p style="line-height:1.8"><span style="color:#000000">交互:MPU6050、按键(可选)</span></p>
<p style="line-height:1.8"><span style="color:#000000"> 可以不焊接连接按键板的fpc座子,使用mpu6050作为交互。也可以使用fpc连线连接到其他设计好的板子拓展功能。</span></p>
<p style="line-height:1.8"><span style="color:#000000">电源:聚合物锂电池;tp4056充电。</span></p>
<p style="line-height:1.8"><span style="color:#000000"> 想着是想画一块和lcd差不多大小的板子,但画出来发现空了一块,干脆把供电换成锂电池,并且加上充放电模块。</span></p>
<p style="line-height:1.8"><span style="color:#000000">按键板:fpc接线,随手一画</span></p>
<p style="line-height:1.8"><span style="color:#000000"> 按照随手画的面板的鼓包按键的位置布局了一下按键,最后设计外壳的时候可能会做一个带按键的。</span></p>
<p style="line-height:1.8"><span style="color:#000000">面板:随手一画(可能有点丑)</span></p>
<p style="line-height:1.8"><span style="color:#000000">远程传感器板(没时间了,先不做了):</span></p>
<p style="line-height:1.8"><span style="color:#000000"> 使用esp32芯片+陶瓷天线+传感器制作远程传感器模块,这样就可以在家里各个角落捕获一些信息,然后在主控板的lcd上显示。当前想到的一些场景是温度传感器模块安装在易起火的地方作火灾报警;燃气传感器安装在燃气灶检测燃气泄漏。</span></p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">*5、软件部分</h3>
<hr>
<p style="line-height:1.8">由于sht40被我烧掉,淘宝商家发错货等各种原因,加上我开始工作时间不够,这次就只做了测温湿度和显示。(先交上作业,后面再慢慢完善功能吧)</p>
<p style="line-height:1.8">正文:首先,我第一次使用esp32,而且没有使用Arduino编程而是使用esp-idf库。程序写的不好,还请各位大佬多指教</p>
<p style="line-height:1.8">一、 i2c:这一部分网上基本没有最新版esp-idf库的资料,我是跟着官方文档写的程序</p>
<p style="line-height:1.8"><a href="https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/get-started/index.html" target="_blank">文档:快速入门 - ESP32 - — ESP-IDF 编程指南 v5.3 文档 (espressif.com)</a></p>
<p style="line-height:1.8">这里我不知道怎么弄代码好,就直接粘贴了,有时间研究一下markdown看看</p>
<p style="line-height:1.8">1. i2c初始化:因为我用到了mpu6050和sht40两种i2c设备,所以i2c总线初始化和设备初始化分开写了</p>
<div>
<div>
<div>
<div><span style="color:#2dc26b">i2c_master_bus_handle_t i2c_handle; //i2c总线的句柄后面可能会用到,所以我直接定义成了全局变量<br>i2c_master_dev_handle_t sht40_handle;//sht40句柄同理</span></div>
<div><span style="color:#2dc26b">void i2c_init()</span></div>
<div><span style="color:#2dc26b">{</span></div>
<div><span style="color:#2dc26b"> i2c_master_bus_config_ti2c_cfg=</span></div>
<div><span style="color:#2dc26b"> {</span></div>
<div><span style="color:#2dc26b"> .clk_source = I2C_CLK_SRC_DEFAULT,</span></div>
<div><span style="color:#2dc26b"> .i2c_port = I2C_NUM_0,</span></div>
<div><span style="color:#2dc26b"> .scl_io_num = GPIO_NUM_36,</span></div>
<div><span style="color:#2dc26b"> .sda_io_num = GPIO_NUM_37,</span></div>
<div><span style="color:#2dc26b"> .flags.enable_internal_pullup = true,</span></div>
<div><span style="color:#2dc26b"> .glitch_ignore_cnt = 7,</span></div>
<div><span style="color:#2dc26b"> };</span></div>
<div><span style="color:#2dc26b"> ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_cfg, &i2c_handle));</span></div>
<div><span style="color:#2dc26b">}</span></div>
</div>
</div>
</div>
<p style="line-height:1.8">2. i2c设备穷举:初始化以后可以穷举一下看看i2c设备(sht40)连接是否正常</p>
<div>
<div><span style="color:#2dc26b">void i2c_probe()</span></div>
<div><span style="color:#2dc26b">{</span></div>
<div><span style="color:#2dc26b"> printf("i2c device list:\r\n");</span></div>
<div><span style="color:#2dc26b"> for (uint16_t i = 0; i > 8;</span></div>
<div><span style="color:#2dc26b"> trans[3].tx_data[1] = startY & 0xff;</span></div>
<div><span style="color:#2dc26b"> trans[3].tx_data[2] = endY >> 8;</span></div>
<div><span style="color:#2dc26b"> trans[3].tx_data[3] = endY& 0xff;</span></div>
<div><span style="color:#2dc26b"> for (uint8_t i = 0; i </span></div>
<div><span style="color:#2dc26b"> {</span></div>
<div><span style="color:#2dc26b"> ESP_ERROR_CHECK(spi_device_queue_trans(lcd_handle, &trans[i], portMAX_DELAY));</span></div>
<div><span style="color:#2dc26b"> }</span></div>
<div><span style="color:#2dc26b">}</span></div>
<div><span style="color:#000000">5. 画点,没什么好说的:</span></div>
<div>
<div><span style="color:#2dc26b">void lcd_draw_point(uint16_t x, uint16_t y, uint16_t color)</span></div>
<div><span style="color:#2dc26b">{</span></div>
<div><span style="color:#2dc26b"> uint8_t buf[2];</span></div>
<div><span style="color:#2dc26b"> buf[0] = color >> 8;</span></div>
<div><span style="color:#2dc26b"> buf[1] = color;</span></div>
<div><span style="color:#2dc26b"> lcd_set_window(x, x, y, y);</span></div>
<div><span style="color:#2dc26b"> lcd_cmd(0x2c, false);</span></div>
<div><span style="color:#2dc26b"> lcd_data(buf, 2);</span></div>
<div><span style="color:#2dc26b">}</span></div>
<div><span style="color:#000000">6. 清屏:扫描线的方式填充,使用画点函数太慢</span></div>
<div>
<div><span style="color:#2dc26b">void lcd_clear(uint16_t color)</span></div>
<div><span style="color:#2dc26b">{</span></div>
<div><span style="color:#2dc26b"> uint8_t *buf;</span></div>
<div><span style="color:#2dc26b"> buf = heap_caps_malloc(320 * sizeof(uint16_t), MALLOC_CAP_DMA);</span></div>
<div><span style="color:#2dc26b"> memset(buf, color, 320 * sizeof(uint16_t));</span></div>
<br>
<div><span style="color:#2dc26b"> lcd_set_window(0, LCD_width-1, 0, LCD_height-1);</span></div>
<div><span style="color:#2dc26b"> lcd_cmd(0x2c, false);</span></div>
<div><span style="color:#2dc26b"> for (uint16_t i = 0; i </span></div>
<div><span style="color:#2dc26b"> {</span></div>
<div><span style="color:#2dc26b"> lcd_data(buf, 320 * 2);</span></div>
<div><span style="color:#2dc26b"> }</span></div>
<div><span style="color:#2dc26b"> heap_caps_free(buf);</span></div>
<div><span style="color:#2dc26b">}</span></div>
<div>7. 显示字符:<span style="color:#000000">ascii16是字模,这是从我很久以前用stm32写lcd的时候写的函数,字模忘记怎么取得了。。。。。这部分挺好改的。</span></div>
<div>
<div><span style="color:#2dc26b">void LCD_ShowChar(uint16_t x, uint16_t y, uint8_t ch, uint8_t size,</span></div>
<div><span style="color:#2dc26b"> uint16_t color, uint16_t bg_color, uint8_t mode)</span></div>
<div><span style="color:#2dc26b">{</span></div>
<div><span style="color:#2dc26b"> uint8_t temp;</span></div>
<div><span style="color:#2dc26b"> uint16_t y0 = y, x0 = x;</span></div>
<div><span style="color:#2dc26b"> uint8_t idx = 0;</span></div>
<div><span style="color:#2dc26b"> for (uint8_t i = 0; i </span></div>
<div><span style="color:#2dc26b"> {</span></div>
<div><span style="color:#2dc26b"> for (uint8_t t = 0; t </span></div>
<div><span style="color:#2dc26b"> {</span></div>
<div><span style="color:#2dc26b"> switch (size)</span></div>
<div><span style="color:#2dc26b"> {</span></div>
<div><span style="color:#2dc26b"> case 16:</span></div>
<div><span style="color:#2dc26b"> temp = ascii16[ch-32][idx];</span></div>
<div><span style="color:#2dc26b"> break;</span></div>
<div><span style="color:#2dc26b"> case 24:</span></div>
<div><span style="color:#2dc26b"> temp = ascii24[ch-32][idx];</span></div>
<div><span style="color:#2dc26b"> break;</span></div>
<div><span style="color:#2dc26b"> case 32:</span></div>
<div><span style="color:#2dc26b"> temp = ascii32[ch-32][idx];</span></div>
<div><span style="color:#2dc26b"> break;</span></div>
<div><span style="color:#2dc26b"> default:</span></div>
<div><span style="color:#2dc26b"> break;</span></div>
<div><span style="color:#2dc26b"> }</span></div>
<div><span style="color:#2dc26b"> idx++;</span></div>
<div><span style="color:#2dc26b"> for (uint8_t j = 0; j </span></div>
<div><span style="color:#2dc26b"> {</span></div>
<div><span style="color:#2dc26b"> if (temp & 0x80)</span></div>
<div><span style="color:#2dc26b"> lcd_draw_point(x0, y0, color);</span></div>
<div><span style="color:#2dc26b"> else</span></div>
<div><span style="color:#2dc26b"> if (mode == 1)</span></div>
<div><span style="color:#2dc26b"> {</span></div>
<div><span style="color:#2dc26b"> lcd_draw_point(x0, y0, bg_color);</span></div>
<div><span style="color:#2dc26b"> }</span></div>
<div><span style="color:#2dc26b"> </span></div>
<div><span style="color:#2dc26b"> y0++;</span></div>
<div><span style="color:#2dc26b"> temp </span></div></div></div></div></div>
评论(0)