ESP32学习笔记:WS2812B驱动

       WS2812B是一款贴片RGB灯。由于采用了单总线通讯,所以需要特别关注下它的通讯时序。

     

调试细节:

       本来以为会是一个比较简单的调试,结果还是花了很长时间才调试完成。

       首先是关于ESP32的纳秒级延时确定,当时按照空指令始终调试不出来。之前在STM32平台上的nop()函数也不知道怎么用。

       后来发掘出了一个比较简单的办法。就是一个个试,然后在main函数中按照1S的频率打印调试信息来倒推ns级别的延时是否可靠。

       注意:在ESP32不能使用空语句加;来进行空指令延时,需要使用操作语句。

unsigned long ns_delay_value = 0;void delay_100_ns(int data)
{unsigned char i;ns_delay_value = 0;for(i = 0; i < data; i++){ns_delay_value++;}
}void delay_1_us()
{delay_100_ns(10);
}void delay_1_ms()
{long i;for(i = 0; i < 1000; i++){delay_1_us();}
}void delay_1_s()
{long i;for(i = 0; i < 1000; i++){delay_1_ms();}
}

        然后在main函数中按照1S的频率打印调试信息:

while(1){printf("ws2812B demo system run ...\n");
//        vTaskDelay(1000 / portTICK_PERIOD_MS);delay_1_s();}

       基本确定了ns级别延时后,就可以按照时序来写ws2812的驱动函数啦。

*WS2812B Drive*/
#define WS2812B_GPIO               8
#define WS2812B_GPIO_ACTIVE_LEVEL  1
#define ws2812b_pin_set()          gpio_set_level(WS2812B_GPIO, 1)
#define ws2812b_pin_rst()          gpio_set_level(WS2812B_GPIO, 0)void ws2812b_writebyte(unsigned char data)
{unsigned char i;for(i = 0; i < 8; i++){if(data & 0X80){ws2812b_pin_set();delay_100_ns(3);ws2812b_pin_rst();delay_100_ns(3);}else{ws2812b_pin_set();delay_100_ns(1);ws2812b_pin_rst();delay_100_ns(3);}data <<= 1;}
}void ws2812b_write_rgb(unsigned char red_value, unsigned char green_value, unsigned char blue_value)
{ws2812b_writebyte(red_value);ws2812b_writebyte(green_value);ws2812b_writebyte(blue_value);
}

       后来发现依然无法驱动,到了晚上才发现自己犯了一个低级错误。ESP32的IO口没有进行初始化配置!

void ws2812b_gpio_init(void)
{gpio_config_t gpio_conf;gpio_conf.intr_type = GPIO_INTR_DISABLE;gpio_conf.mode = GPIO_MODE_OUTPUT;gpio_conf.pin_bit_mask = (1ULL << WS2812B_GPIO);if (WS2812B_GPIO_ACTIVE_LEVEL) {gpio_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;gpio_conf.pull_up_en = GPIO_PULLUP_DISABLE;} else {gpio_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;gpio_conf.pull_up_en = GPIO_PULLUP_ENABLE;}gpio_config(&gpio_conf);
}

       配置完IO口就可以进行WS2812B驱动啦。不过还是出现了一些小bug,比如初始化第一次点灯,绿色灯珠总是会不受控制地自动点亮!后来发现在IO初始化函数前预先执行一次点亮指令就可以消除这个bug!Nice!

void app_main(void)
{ws2812b_write_rgb(0, 255, 0);ws2812b_gpio_init();delay_1_s();ws2812b_write_rgb(20, 20, 20);while(1){printf("ws2812B demo system run ...\n");
//        vTaskDelay(1000 / portTICK_PERIOD_MS);delay_1_s();}
}

       

       至此,ESP32对于WS2812B的驱动函数就调试完成啦。

       对于这个说起来简单但是异常曲折的小demo项目积累了如下经验:

      1.ESP32的IO也是需要进行初始化配置的。

      2.MCU的单指令确实能够进行粗略的ns级延时,为后续调试一些芯片时序提供了新的方法。

      3.ESP32的GPIO8需要使用一个10K电阻上拉3.3V,否则无法进行程序下载。

2023-05-04 细节补充

      1.在后续demo项目完善该驱动时,发现会出现初始化后,在别处点灯时,依然会出现亮出绿灯现象。

     后来增加了灯珠的复位函数:

void ws2812b_write_reset(void)
{unsigned int i = 0;ws2812b_pin_rst();for(i = 0; i < 300; i++){delay_1_us();}}

       然后初始化变更为:

ws2812b_write_rgb(0, 255, 0);
ws2812b_gpio_init();
ws2812b_write_reset();
ws2812b_write_rgb(20, 20, 20);

       如果需要在别的函数位置电灯,择执行以下函数即可,亲测有效。

ws2812b_write_rgb(0, 0, 0);
ws2812b_write_reset();
ws2812b_write_rgb(0, 0, 20);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/13777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中的计划任务(crontab)详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、什么是计划任务&#xf…

超详细的前后端实战项目(Spring系列加上vue3)(一步步实现+源码)前端篇(一)

最近想着一步步搭建一个前后端项目&#xff0c;将每一步详细的做出来。&#xff08;如果有不足或者建议&#xff0c;也希望大佬们指出哦&#xff09; 前端初始化 1.根据vue脚手架创建vue项目 这里可以用很多方法创建vue项目&#xff0c;大家看着创建吧&#xff0c;只要能创建…

机器学习面试问题总结 | 贝叶斯网络

本文给大家带来的百面算法工程师是机器学习中贝叶斯网路面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的面试问题&#xff0c;并提供参考的回答及其理论基础&#…

FreeRTOS_事件组_学习笔记

事件组 原文链接 事件组是一个整数&#xff0c;其中的高8位留给内核&#xff0c;只能用其他位来表示时间 每一位代表一个事件&#xff0c;且每个时间的含义由程序员决定 1为发生&#xff0c;0为未发生 一个/多个任务或ISR都能读写这些位 可以等待某一位&#xff0c;也可以等待…

如何理解合约中的引用类型(3)——Mapping

映射&#xff08;mapping&#xff09; 声明形式&#xff1a;mapping(key type > value type)keytype可以是除枚举外的几乎任何基本类型&#xff0c;包括bytes和string&#xff0c;不包括用户自定义的复杂类型-合约&#xff0c;枚举&#xff0c;结构&#xff0c;映射value t…

简单美观易上手的 Docker Compose 可视化管理器 Dockge

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 Dockge 是 Uptime Kuma 作者的新作品&#xff0c;因此 UI 风格与 Uptime Kuma 基本一致&#xff0c;如果你正在使用 Uptime Kuma 的话&#xff0c;那么 Dockge 的 UI 设计应该也不会让你失望。Dockge 主打…

智慧校园为高校带来哪些价值

在21世纪的教育图景中&#xff0c;"智慧"不再仅仅是一个科技名词&#xff0c;它已成为衡量教育现代化水平的重要标志。智慧校园&#xff0c;这一融合了物联网、大数据、云计算等先进技术的教育新形态&#xff0c;正逐步成为高校转型升级的关键驱动力。本文将从多个维…

BUUCTF靶场 [reverse]easyre、reverse1、reverse2

工具&#xff1a; DIE&#xff1a;下载&#xff1a;https://download.csdn.net/download/m0_73981089/89334360 IDA&#xff1a;下载&#xff1a;https://hex-rays.com/ida-free/ 新手小白勇闯逆向区&#xff01;&#xff01;&#xff01; [reverse]easyre 首先查壳&#xf…

【oracle003】图片转为字节、base64编码等形式批量插入oracle数据库并查询

1.熟悉、梳理、总结下Oracle相关知识体系 2.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 资源下载&#xff1a; oci.dll、oraocci11.dll、oraociei11.dll3个资源文件资源下载&#xff1a; Instant Client Setup.exe资源下载&#xff1a; oci.dll、oraocci11.dll、oraoc…

ubuntu手动替换源后,更新源时提示“仓库.... jammy Release“ 没有Release文件

问题如图所示&#xff0c;由于问题不好定位&#xff0c;我就从替换源&#xff0c;以及解决错误提示这两个步骤&#xff0c;来解决其中可能存在的问题。 1、替换源 这一步骤&#xff0c;网上的资料可以搜到很多&#xff0c;我跟着做了之后&#xff0c;总会冒出来各种各样的小问…

皮影戏艺术品3D沉浸式展馆提供非同一般的趣味体验

引领艺术展示的未来&#xff0c;深圳华锐视点融合多年的web3d项目制作经验&#xff0c;倾力打造3D虚拟艺术品展馆在线编辑平台&#xff0c;为您提供一个超越时空限制的线上艺术展示平台。 一、极致视觉盛宴 我们拥有领先的美术团队&#xff0c;运用先进的web3D开发技术&#xf…

可能是最适合PS的AI插件,设计师大救星!StartAI初体验!不是恰饭

这款软件虽然有一些功能需要完善&#xff0c;比如&#xff1a; 1&#xff1a;生成图片产品海报&#xff0c;会出现图随意出现&#xff0c;跟设计图起冲突&#xff0c;需要PS才可以正常使用它。 2&#xff1a;即使开会员也需要排队生成。 3: 还有&#xff0c;会员没有更加好用的…

vue3结合element-plus之如何优雅的使用表单组件

背景 在日常开发中,我们会经常使用 element-ui 或者是 antdesign 或者是 element-plus 等组件库实现搜索功能 这里就需要用到相关表单组件 下面就以 element-plus 为例,我们实现一个搜索功能的组件,并且随着屏幕尺寸的变化,其布局也会跟随变化 最终大致效果如下: 这里…

C++:set和map的底层封装模拟实现

目录 底层对比&#xff1a; 底层红黑树结构和set、map&#xff1a; 底层模拟&#xff1a; 传值调用&#xff1a; 迭代器&#xff1a; operator &#xff08;&#xff09; find函数 operator&#xff08;&#xff09; 、仿函数 set和map的仿函数 &#xff1a; 图解&a…

地平线-旭日X3派(RDK X3)上手基本操作

0. 环境 - win10笔记本 - RDK X3 1.0&#xff08;地平线旭日X3派&#xff0c;后来改名为代号RDK X3&#xff09; 1. 下载资料 https://developer.horizon.ai/resource 主要下载镜像 http://sunrise.horizon.cc/downloads/os_images/2.1.0/release/ 下载得到了 ubuntu-prei…

vs无法打开或包括文件”QTxxx“

vs创建项目时默认引入core、gui、和widgets等模块&#xff0c;在需要网络通讯或者图表等开发时需要添加相应模块。 点击扩展 -> QT VS Tools -> QT Project Setting->Qt Modules&#xff0c;添加相应模块即可

奇瑞控股携手契约锁推动客户、供应商及内部业务全程数字化

奇瑞控股集团是安徽省排名第一的制造业企业&#xff0c;同时入选中国企业家协会发布的中国500强、《财富》中国500强&#xff0c;连续21年位居中国品牌乘用车出口第一。 面对汽车行业“新四化”主题及“数字化”时代变革&#xff0c;奇瑞控股持续创新求变&#xff0c;率先引入电…

Java18的新特性介绍

一、概况 Java 18是Java编程语言的最新版本&#xff0c;它于2022年9月发布。Java 18引入了许多新特性和改进&#xff0c;以下是其中一些重要的新特性。 元编程功能&#xff1a;Java 18引入了元注释和元类型声明的功能&#xff0c;使开发人员能够在编译时对注解进行元处理。这为…

【C++】位图/布隆过滤器+海量数据处理

目录 一、位图 1.1 位图的概念 1.2 位图的实现 1.3 位图的应用&#xff08;面试题&#xff09; 二、布隆过滤器 2.1 布隆过滤器的引入 2.2 布隆过滤器概念 2.3 布隆过滤器的插入和查找 2.4 布隆过滤器的实现 2.5 布隆过滤器的优点和缺陷 2.6 布隆过滤器的应用&#…

Servlet 的 API

HttpServlet init&#xff1a;当 tomcat 收到了 /hello 这样的路径是请求后就会调用 HelloServlet&#xff0c;于是就需要对 HelloServlet 进行实例化&#xff08;只实例一次&#xff0c;后续再有请求也不实例了&#xff09;。 destory&#xff1a;如果是通过 smart tomcat 的停…