自制教学用ESP32开发板【ESP32_Py_Board】① 开发环境搭建

2023-11-16

摘要

由于教学需要,自己设计了一款ESP32开发板,用于《短距离无线通信》课堂教学使用。开发板整体效果如下图:

整体预览图
该开发板采用Type-C接口供电,板载CH340K串口芯片,支持自动下载。240*240全彩SPI接口显示屏,温度传感器DS18B20,温湿度传感器DHT11,RGB三色灯,WS2812灯珠,蜂鸣器,红外热释传感器,光敏电阻,红外发射/接收,微动按键,触摸按键,部分IO引出。

硬件原理图全开源:https://oshwhub.com/Dr.Zhang/esp32_py_board

USB转串口驱动安装

USB转串口使用的是CH340K芯片,需要安装新版本驱动才能使用,新版本驱动下载地址:

http://www.wch.cn/downloads/file/65.html

下载完成后双击安装程序,然后点击安装即可:

CH340驱动安装

固件烧录

固件烧录需要使用乐鑫原厂的烧录工具,工具下载地址:

https://www.espressif.com/zh-hans/support/download/other-tools

该工具无需安装,直接解压后即可使用:
烧录工具
除了烧录工具外,我们还需要最新版MicroPython的固件,下载地址为:

https://micropython.org/download/esp32/

固件列表
我们下载最新版本的固件即可!

然后回到刚才打开的烧录工具页面,ChipType选择ESP32,WorkMode选择develop,然后点击OK,在接下来的页面中选择刚刚下载的MicroPython固件,地址填写0x1000,勾选DoNotChgBin,BAUD设置为921600,COM口根据实际情况选择,最后点击START按钮即可开始烧录,等到进度条跑到最右边就烧录完成了。

烧录选项

MicroPython IDE

MicroPython多种可用的IDE(集成开发环境),建议使用uPyCraft,操作起来比较简单。

V1.1版本uPyCraft下载地址:https://shyboy.oss-cn-shenzhen.aliyuncs.com/readonly/uPyCraft_V1.1.exe

下载后无需安装,双击即可运行(首次运行将提示安装字体,点击OK即可),打开后依次点击Tools>> Serial >>COM* 连接设备,出现右下图所示的 >>> 说明连接设备成功:
在这里插入图片描述

示例代码

依次点击 File >> Examples >> Basic >> Blink.py ,打开示例代码,将引脚修改为14,点击后侧的 三角形 运行代码,若设备上红色LED闪烁,说明设备正常工作。
点灯程序

RGB LED灯示例程序

RGBLED

开发板上有一个三个LED灯,分别连接在14,27,26号引脚上,可使用如下代码控制LED灯:

import time
from machine import Pin

led_r = Pin(14,Pin.OUT)
led_g = Pin(27,Pin.OUT)
led_b = Pin(26,Pin.OUT)

while True:
  led_r.value(1)
  time.sleep(0.5)
  led_r.value(0)

  led_g.value(1)
  time.sleep(0.5)
  led_g.value(0)

  led_b.value(1)
  time.sleep(0.5)
  led_b.value(0) 

PWM 彩色LED渐变

使用三路PWM分别驱动RGB三个LED,可调制出很多种颜色:

from machine import Pin,PWM
import time

pwm_r =PWM(Pin(14))
pwm_g =PWM(Pin(27))
pwm_b =PWM(Pin(26))

pwm_r.freq(1000)
pwm_g.freq(1000)
pwm_b.freq(1000)

led_r = 1000
led_g = 0
led_b = 0

stage = 1

while True:
  if stage == 1:
    led_r -= 1
    led_g += 1
    if led_r == 0:
      stage = 2

  if stage == 2:
    led_g -= 1
    led_b += 1
    if led_g == 0:
      stage = 3

  if stage == 3:
    led_b -= 1
    led_r += 1
    if led_b == 0:
      stage = 1

  pwm_r.duty(led_r)
  pwm_g.duty(led_g)
  pwm_b.duty(led_b)
  time.sleep(0.02) 

在这里插入图片描述

PWM驱动蜂鸣器播放音乐

开发板上板载了一个蜂鸣器,连接在ESP32的16引脚。可以使用PWM驱动蜂鸣器播放音乐。

音乐的本质是不同频率的声音随时间的流动,所以乐谱主要记录的是频率随时间的变化关系。以简谱为例,通过数字和上下面的点表示频率的高低,通过下划线表示该音符持续的时间。
在这里插入图片描述
如果全音符的持续时间为4S,则二分音符的持续时间为2S,四分音符的持续时间为1S,八分音符的持续时间为0.5S … …
在这里插入图片描述
在这里插入图片描述
比如在上述乐谱中,第一个音符的频率为784Hz,时值为0.5S,使用如下代码可播放上图简谱的前两句:

from machine import Pin,PWM
import time

pwm_beep =PWM(Pin(16))
pwm_beep.duty(500)
while True:
  pwm_beep.freq(784)
  time.sleep(0.5)
  pwm_beep.freq(880)
  time.sleep(0.5)
  pwm_beep.freq(784)
  time.sleep(0.5)
  pwm_beep.freq(698)
  time.sleep(0.5)
  pwm_beep.freq(659)
  time.sleep(0.5)
  pwm_beep.freq(587)
  time.sleep(0.5)
  pwm_beep.freq(523)
  time.sleep(1.5)


  pwm_beep.freq(523)
  time.sleep(0.5)
  pwm_beep.freq(659)
  time.sleep(0.5)
  pwm_beep.freq(1046)
  time.sleep(0.5)
  pwm_beep.freq(988)
  time.sleep(0.5)
  pwm_beep.freq(880)
  time.sleep(0.75)
  pwm_beep.freq(659)
  time.sleep(0.25)
  pwm_beep.freq(784)
  time.sleep(1.5) 

WS2812灯珠

开发板上板载了4颗WS2812灯珠,连接在ESP32的13引脚上,可使用如下代码点亮这些灯珠:

from machine import Pin
from neopixel import NeoPixel

np = NeoPixel(Pin(13, Pin.OUT) , 4)   # 使用13引脚创建一个拥有4颗灯珠的灯带

np[0] = (20, 60, 10) # 设置第一颗灯灯珠的颜色(RGB)
np[1] = (100, 0, 50) # 设置第二颗灯灯珠的颜色(RGB)
np[2] = (0, 230, 20) # 设置第三颗灯灯珠的颜色(RGB)
np[3] = (200, 160, 10) # 设置第四颗灯灯珠的颜色(RGB)

np.write()              # 将设置的颜色写入到灯组中

光敏电阻

在这里插入图片描述
光敏电阻通过如上图所示的方式连接在ESP32的39引脚上,可通过系列代码读取光敏电阻数据:

from machine import Pin,  ADC
import time

adc = ADC(Pin(39))    #使用39号引脚创建ADC
adc.atten(ADC.ATTN_11DB)  #设置ADC数据长度

while True:
  print(adc.read())   #读取ADC的值并输出
  time.sleep(0.5)     # 延时0.5S

热释红外传感器

在这里插入图片描述

热释红外传感器连接在ESP32的36引脚上,可使用如下代码读取该传感器的数据,有人员活动输出高电平,无人员活动输出低电平:

from machine import Pinimport time

sr = Pin(36, Pin.IN)  #将36引脚设为输入模式

while True:
  print(sr.value())   #读取36号引脚的值并输出
  time.sleep(0.5)     # 延时0.5S

温湿度传感器

在这里插入图片描述
DHT11连接在ESP32的32引脚上,可使用如下代码读取温湿度数据;

from machine import Pin
import time, dht    #导入相关功能模块

d = dht.DHT11(Pin(32))  # 使用32引脚读取DHT11数据

while True:
  d.measure()    #执行一次测量
   #输出测量结果
  print(  "温度: "  , d.temperature() ,  "湿度:"  ,  d.humidity())
  time.sleep(1)   #延时1S

红外发射与接收

开发板上板载了红外发射管和红外接收管,连接图如下: 作者:我是鹏老师 https://www.bilibili.com/read/cv13345911 出处:bilibili
红外发射管由IO25控制,红外接收管数据由IO34读取,暂时还没有应用代码,有兴趣可以自己写。

LCD显示屏

开发板上搭载了中景园SPI接口的LCD显示屏,分辨率240*240,驱动芯片为ST7789V,原厂驱动程序可参考:

https://pan.baidu.com/s/1nF34QoV9Dh_59AWkbowwGQ 提取码:8888

显示屏与ESP32的连接如下图:
BLK ----- 23
DC ----- 22
SCL ----- 21
SDA ----- 19
RST ---- 17

可使用如下Python程序代码驱动:

ST7789V.py 显示屏驱动程序

from machine import Pin, SPI
import time
import machine
import esp

class LCD_240_240(object):

  def __init__(self):
    self.hspi = SPI(1, 10000000,  polarity=1, phase=0, sck=Pin(21), mosi=Pin(19))

    self.lcd_bk = Pin(23, Pin.OUT)
    self.lcd_dc = Pin(22, Pin.OUT)
    self.lcd_res= Pin(17, Pin.OUT)

    self.lcd_bk.value(1)

    self.lcd_res.value(0)
    time.sleep(0.1)
    self.lcd_res.value(1)
    time.sleep(0.05)

    self.lcd_dc.off()
    self.hspi.write(b'\x11')
    
    time.sleep(0.05)
    
    self.LCD_Cmd_Data(b'\x36',b'\x70')
    self.LCD_Cmd_Data(b'\x3A',b'\x05')
    self.LCD_Cmd_Data(b'\xB2',b'\x0C\x0C\x00\x33\x33')
    self.LCD_Cmd_Data(b'\xB7',b'\x35')
    self.LCD_Cmd_Data(b'\xBB',b'\x19')
    self.LCD_Cmd_Data(b'\xC0',b'\x2C')
    self.LCD_Cmd_Data(b'\xC2',b'\x01')
    self.LCD_Cmd_Data(b'\xC3',b'\x12')
    self.LCD_Cmd_Data(b'\xC4',b'\x20')
    self.LCD_Cmd_Data(b'\xC6',b'\x0F')
    self.LCD_Cmd_Data(b'\xD0',b'\xA4\xA1')
    self.LCD_Cmd_Data(b'\xE0',b'\xD0\x04\x0D\x11\x13\x2B\x3F\x54\x4C\x18\x0D\x0B\x1F\x23')
    self.LCD_Cmd_Data(b'\xE1',b'\xD0\x04\x0C\x11\x13\x2C\x3F\x44\x51\x2F\x1F\x1F\x20\x23')

    self.lcd_dc.off()
    self.hspi.write(b'\x21\x29')

  def LCD_Cmd_Data(self,cmd, data):
    self.lcd_dc.off()
    self.hspi.write(cmd)
    self.lcd_dc.on()
    self.hspi.write(data)

  def SetDisArea(self,xStart,yStart,xEnd,yEnd):
    
    buf = bytearray(4)
    buf[0] = 0
    buf[1] = xStart
    buf[2] = 0
    buf[3] = xEnd
    self.LCD_Cmd_Data(b'\x2A',buf)

    buf[1] = yStart
    buf[3] = yEnd
    self.LCD_Cmd_Data(b'\x2B',buf)
    
    self.lcd_dc.off()
    self.hspi.write(b'\x2C')
  
  def Disp_Color(self,Color):
    self.SetDisArea(0,0,239,239)
    self.lcd_dc.on()
    
    buf = bytearray(480)
    for j in range(240):
      buf[j*2] = Color >> 8
      buf[j*2+1] = Color & 0xFF
   
    for i in range(240):
      self.hspi.write(buf)
    
  def DrawPoint(self,x,y,color):
    buf = bytearray(2)
    buf[0] = 0
    buf[1] = x
    self.LCD_Cmd_Data(b'\x2A',buf)
    
    buf[1] = y
    self.LCD_Cmd_Data(b'\x2B',buf)

    buf[0] = color >> 8
    buf[1] = color &0xFF  
    self.LCD_Cmd_Data(b'\x2C',buf)
 

  def Disp_Str(self,x,y,str_datda):
    font_buf = bytearray(64)
    for c in str_datda:
      start_addr = 0x300000 + 64*(c - 0x20)
      esp.flash_read(start_addr, font_buf)
      self.SetDisArea(x,y,x+15,y+31)
      x+=16
      self.lcd_dc.on()
      
      for j in range(64):
        for k in range(8):
          if (font_buf[j] & (0x01<<k)) ==  (0x01 << k):
            self.hspi.write(b'\xf8\x00')
          else:
            self.hspi.write(b'\xff\xff')
            
  def Disp_Pic(self, star_addr):
    self.SetDisArea(0,0,239,239)
    self.lcd_dc.on()
    buf = bytearray(480)
    byte_offset = star_addr

    for i in range(240):
      esp.flash_read(byte_offset, buf)
      self.hspi.write(buf)
      byte_offset += 480

显示字体需要将字体文烧录到0x300000地址,显示图片需要使用Image2LCD软件将图片转换成RGB565格式的Bin文件后,烧录到Flash的空白地址,如: 0x3100000x330000

字体文件下载连接:https://shyboy.oss-cn-shenzhen.aliyuncs.com/readonly/font3216.bin

Image2LCD软件下载链接:https://shyboy.oss-cn-shenzhen.aliyuncs.com/readonly/Image2Lcd%202.9%28%E7%A0%B4%E8%A7%A3%E7%89%88%29.rar

显示屏驱动的使用代码如下:
from ST7789V import LCD_240_240 
lcd = LCD_240_240() 

lcd.Disp_Color(0x8563)   #整屏填充颜色 
lcd.Disp_Pic(0x320000)   #显示存储在0x320000的图片 
lcd.Disp_Str(30,50, b'abc123')   #在(30,50位置显示文字abc123)

后面还有WiFi和蓝牙方面的知识,有空再更新。

十一过后计划录制些视频上传到B站,详细讲解下这些知识,敬请期待。。。。

B站ID:我是鹏老师

另外,如果您觉得这篇文章对你有帮助,可通过如下方式支持一下鹏老师:下载华秋DFM,让鹏老师恰口饭!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自制教学用ESP32开发板【ESP32_Py_Board】① 开发环境搭建 的相关文章

  • 错误:找不到或无法加载主类

    可能存在的问题 类路径错误 请确保你的IDE或构建工具正确配置了项目的类路径 并且能够找到 com coll ApiApplication 类所在的位置 可以检查项目的配置文件 如pom xml 或类路径设置 确保类被正确地包含在项目中 编
  • 【转】Configuring VM Acceleration on Linux

    Configuring VM Acceleration on Linux Linux based systems support virtual machine acceleration through the KVM software p
  • texlive下载速度慢(完美解决)

    在使用latex之前 都需要下载texlive 这个过程十分煎熬 官网下载 Index of CTAN systems texlive Images bjtu edu cn 清华源 Index of CTAN systems texlive

随机推荐

  • nodejs koa

    第一步 如何写一个基于node的hello world 创建新的文件夹nodejsdemo 在cmd命令行中进入新建的文件夹nodejsdemo 运行 npm init y 生成package json文件 在cmd命令行中进入新建的文件夹
  • 验证性实验

    验证性实验 验证性实验 ipconfig 实作一 实作二 ping 实作一 实作二 tracert 实作一 ARP 实作一 实作二 实作三 DHCP 实作一 netstat 实作一 实作二 DNS 实作一 实作二 实作三 cache 实作一
  • 安装RapidDesign_v1.3.0.Cracked.DX10.3.Rio

    1 下载 https t00y com file tempdir A2NSZVRiXTRSZAZpVGBRLg4 V2IBNw47XTBQMFYzUGVXM1R BTZaNFZkUDRQaFczUmABMAIwDTg 2 解压 D rioc
  • Discuz!X模板代码解析--Header(头文件)

    Discuz X模板代码解析 Header 头文件 header html这个文件存储于common文件下 这个大家应该不陌生吧 我是每个DIV为小节来讲 头部的核心div我就不加if语句来讲解 因为代码太多了 我会在最下面给大家总结一下
  • 【数据分析入门】Seaborn[散点图、条形图、计数图、热力图、箱型图、小提琴图]

    这里写目录标题 一 数据 二 画布外观 2 1 Seaborn样式 2 2 上下文函数 2 3 调色板 三 使用 Seaborn 绘图 3 1 坐标轴栅格 3 2 各类图形 3 2 1 散点图 3 2 2 条形图 3 2 3 计数图 3 2
  • Java编写的公交查询系统 功能非常齐全 完整源码

    今天为大家分享一个java语言编写的教室管理系统 目前系统功能已经很全面 后续会进一步完善 整个系统界面漂亮 有完整得源码 希望大家可以喜欢 喜欢的帮忙点赞和关注 一起编程 一起进步 开发环境 开发语言为Java 开发环境Eclipse或者
  • Android机上跑linux(结果为Termux)

    文章目录 前言 Termux 前言 需求 我只想可以运行自己写的python程序 需要这个系统能有网络地址 能ssh 能连别人 也能别人连自己 能pip安装上合适的包 比如numpy 过程 ipad上搞ish 优点 垃圾IOS闭源生态 就它
  • 春秋云境:CVE-2022-22947

    春秋云境 CVE 2022 22947 文章合集 春秋云境系列靶场记录 合集 Spring Cloud Gateway spel 远程代码执行 CVE 2022 22947 漏洞介绍 Spring Cloud Gateway 远程代码执行漏
  • 永洪科技入选2023 商业智能应用案例TOP10

    8月13日 由DBC联合CIW CIS推出 经过两轮多维度评价 评议 评选 2023 商业智能应用案例TOP10 发布 永洪科技案例入选 电力行业数字化转型 数字化技术渗透至电力产业 发 输 变 配 用 各个环节 电力企业在复杂的产业环境中
  • 解决开发中Win Linux差别(持续更新)

    1 目录分隔符 Winxp Linux 解决办法 采用 File separator web目录 request getSession getServletContext getRealPath 数据库中图片目录用 serverInfo i
  • 【docker】将本地镜像push上传到dockerhub上,再从dockerhub上pull下来到本地,并运行的过程

    使用指示 完成本章操作 你需要有魔法 绿色 备注 红色或高亮 重点 要修改的地方 要注意的地方 注册dockerhub 登录官网 注册一个账号 需要用户名 邮箱 密码 前提是有魔法 不然邮箱会报错 然后在官网直接登录一下 在本地用命令行登录
  • ctfshow-菜狗杯-抽老婆

    任意文件读取 抽老婆 打开首先发现是一个图片下载 老婆们都很不错 感觉也没什么其他的东西 先F12看一下代码 发现有一处标注 感觉跟任意文件下载有关 一开始的错误思路 想着先扫一遍看看能不能发现啥 于是用dirsearch扫了一下 发现了
  • LAMP架构

    LAMP架构介绍 1 1LAMP平台概述 LAMP架构是目前成熟的企业网站应用模式之一 指的是协同工作的一整台系统和相关软件 能够提供动态web站点服务及其应用开发环境 LAMP是一个缩写词 具体包括Linux操作系统 Apache网站服务
  • 佳博 热敏打印机 ESCPOS 指令研究

    Test txt内容 参考打印到文档功能 初识打印机驱动 http www cnblogs com MrDing p 4078189 html 热敏打印头打印原理和C实现黑白位图的放大 https www jianshu com p c75
  • 一般报java.lang.NullPointerException的原因有以下几种

    一般报java lang NullPointerException的原因有以下几种 字符串变量未初始化 接口类型的对象没有用具体的类初始化 比如 List lt 会报错 List lt new ArrayList 则不会报错了 当一个对象的
  • 如何创建与框架无关的JavaScript插件

    本文旨在介绍个人在研读源码的时的一些浅薄理解 希望能对各位有一些帮助 本文将对所有可能遇到的知识点或细节进行注解或链接 跳转 以保证各位读者都能看懂 如果文中有说的不对的或者引导方向不正确的 欢迎各位批评指正 欢迎在评论区交流补充 感谢阅读
  • 【H.264/AVC视频编解码技术详解】八、 熵编码算法(2):H.264中的熵编码基本方法、指数哥伦布编码

    H 264 AVC视频编解码技术详解 视频教程已经在 CSDN学院 上线 视频中详述了H 264的背景 标准协议和实现 并通过一个实战工程的形式对H 264的标准进行解析和实现 欢迎观看 纸上得来终觉浅 绝知此事要躬行 只有自己按照标准文档
  • 关于T5/T5L屏幕触控异常的问题的一些见解

    近段时间在使用迪文屏过程中因为对于迪文产品知识不了解不熟悉 导致在开发或使用的过程中因为操作不当或其他种种原因而导致屏幕触控之后没有反应 触摸偏移或者说按下触控之后屏幕没有相应的动作 在此将近段时间的出现的情况及解决办法总结一下 供其他客户
  • 3.30黄金下跌原因解析;3.31原油及沪金银操作建议

    黄金行情解析 周二黄金价格萎靡不振 持续下行甚至探至1704 56美元 目前正处于1710美元附近苟延残喘 新冠疫苗接种计划复苏 提振投资者转向股票期货价格 避险黄金受到严重挑战 尽管中美地缘政治战从口水战转化成实质的制裁行动 但现时中美两
  • 自制教学用ESP32开发板【ESP32_Py_Board】① 开发环境搭建

    摘要 由于教学需要 自己设计了一款ESP32开发板 用于 短距离无线通信 课堂教学使用 开发板整体效果如下图 该开发板采用Type C接口供电 板载CH340K串口芯片 支持自动下载 240 240全彩SPI接口显示屏 温度传感器DS18B