Arduino UNO驱动MPR121接近电容式触摸传感器控制WS2812彩灯

简介

  MPR121芯片功能强大可用作触摸,电容检测,驱动LED等等.在低速扫描下可以将功 耗降低到8μA,可以处理多达12个独立的触摸板。支持I2C,几乎可以用任何微控 制器连接。可以使用ADDR引脚选择4个地址中的一个,一个I2C2线总线上共有48 个电容触摸板。使用该芯片比使用模拟输入进行电容式感应要容易得多,并且可以 配置灵敏度。

参数特性

  1. 工作电压:2.5V-3.6VDC
  2. 采样频率:采样间隔时间为16ms时,电源电流为29μA,停止模式电流3μA
  3. 输出接口:12个电容传感输入
  4. 输入接口:8个输入为LED驱动器和GPIO多功能
  5. 完整的触摸检测:每个传感输入的自动配置自动校准
  6. 触摸/释放阈值和去抖动以进行触摸检测
  7. I2C接口,带中断输出
  8. 工作温度范围:-40℃至+85℃
  9. 尺寸:30.5*20.6mm

引脚定义

名称描述
IRQ开路集电极中断输出引脚,低电平激活
SCLI 2C时钟
SDAI2C数据
ADDRI 2C地址选择输入引脚。将ADDR引脚连接到VSS、VDD、SDA或SCL线,得到I2C地址分别为0x5A、0x5B、0x5C和0x5D
VREG内部调节器节点
VSS
REXT外部电阻器-将一个75 kΩ1%的电阻器连接到VSS,以设置内部参考电流
ELE0 - 11电极0 - 11
VDD电源输入

典型应用实例及电极图案

硬件准备

Arduino UNO板、MPR121电容触摸模块、WS2812模块。

引脚接线

MPR121 / WS2812Arduino UNO
MPR121-SCLA5
MPR121-SDAA4
WS2812-IOIO8
MPR121-3.3V3.3V
WS2812-5V5V
GNDGND

示例代码

#include <Wire.h>
#include "Adafruit_MPR121.h"
#include "FastLED.h"
#ifndef _BV
#define _BV(bit) (1 << (bit))
#endif#define NUM_LEDS 9 
#define LED_DT 8 
#define LED_TYPE WS2812 
#define COLOR_ORDER RGBCRGB leds[NUM_LEDS]; 
CHSV myHSVcolor(45, 255, 200);// You can have up to 4 on one i2c bus but one is enough for testing!
Adafruit_MPR121 cap = Adafruit_MPR121();// Keeps track of the last pins touched
// so we know when buttons are 'released'
uint8_t parseNum = 0;
uint8_t paletteNum = 0;
uint8_t startIndex = 0;
uint8_t chromatism = 50;
uint16_t lasttouched = 0;
uint16_t currtouched = 0;void setup() {LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);FastLED.setBrightness(128);Serial.begin(9600);while (!Serial) { // needed to keep leonardo/micro from starting too fast!delay(10);}Serial.println("Adafruit MPR121 Capacitive Touch sensor test");// Default address is 0x5A, if tied to 3.3V its 0x5B// If tied to SDA its 0x5C and if SCL then 0x5Dif (!cap.begin(0x5A)) {Serial.println("MPR121 not found, check wiring?");while (1);}Serial.println("MPR121 found!");
}void loop() {// Get the currently touched padscurrtouched = cap.touched();for (uint8_t i = 0; i < 12; i++) {// it if *is* touched and *wasnt* touched before, alert!if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) {switch (i) {case 0:stateLed_ON(parseNum++);if (parseNum > 10) {parseNum = 0;}break;case 1: stateLed_OFF(); break;case 2:dynamicLED(paletteNum, startIndex);paletteNum++;if (paletteNum > 1) {paletteNum = 0;}break;}}}// reset our statelasttouched = currtouched;// comment out this line for detailed data from the sensor!return;// debugging info, whatSerial.print("\t\t\t\t\t\t\t\t\t\t\t\t\t 0x"); Serial.println(cap.touched(), HEX);Serial.print("Filt: ");for (uint8_t i = 0; i < 12; i++) {Serial.print(cap.filteredData(i)); Serial.print("\t");}Serial.println();Serial.print("Base: ");for (uint8_t i = 0; i < 12; i++) {Serial.print(cap.baselineData(i)); Serial.print("\t");}Serial.println();// put a delay so it isn't overwhelmingdelay(100);
}void stateLed_ON(uint8_t parseNum) {   //点亮单色调颜色switch (parseNum) {case 0: fill_solid(leds, NUM_LEDS, CRGB::Crimson);              FastLED.show(); break;case 1: fill_solid(leds, NUM_LEDS, CRGB::Aqua);                 FastLED.show(); break;case 2: fill_solid(leds, NUM_LEDS, CRGB::Amethyst);             FastLED.show(); break;case 3: fill_solid(leds, NUM_LEDS, CRGB::Blue);                 FastLED.show(); break;case 4: fill_solid(leds, NUM_LEDS, CRGB::Chartreuse);           FastLED.show(); break;case 5: fill_solid(leds, NUM_LEDS, CRGB::DarkOrange);           FastLED.show(); break;case 6: fill_solid(leds, NUM_LEDS, CRGB::DeepPink);             FastLED.show(); break;case 7: fill_solid(leds, NUM_LEDS, CRGB::GhostWhite);           FastLED.show(); break;case 8: fill_solid(leds, NUM_LEDS, CRGB::Gold);                 FastLED.show(); break;case 9: fill_solid(leds, NUM_LEDS, CRGB::GreenYellow);          FastLED.show(); break;case 10: fill_solid(leds, NUM_LEDS, CRGB::MediumSpringGreen);   FastLED.show(); break;}FastLED.show();
}void stateLed_OFF() {fill_solid(leds, NUM_LEDS, CRGB::Black);FastLED.show();
}void dynamicLED(uint8_t paletteNum, uint8_t colorIndex) {switch (paletteNum) {case 0: gradientflowingLED(); break;case 1: FillLEDsFromPaletteColors(colorIndex); break;}
}void gradientflowingLED() {for (int i = 0; i < NUM_LEDS; i++) {fill_solid(leds + i, 1, myHSVcolor);FastLED.show();myHSVcolor.h += 10;delay(50);fill_solid(leds + i, 1, CRGB::Black);FastLED.show();delay(50);}for (int i = NUM_LEDS; i > 0; i--) {fill_solid(leds + i, 1, myHSVcolor);FastLED.show();myHSVcolor.h += 10;delay(50);fill_solid(leds + i, 1, CRGB::Black);FastLED.show();delay(50);}
}void FillLEDsFromPaletteColors(uint8_t colorIndex)
{for (int i = 0; i < chromatism; i++) {colorIndex++;for ( int j = 0; j < NUM_LEDS; ++j) {leds[j] = ColorFromPalette(RainbowColors_p, colorIndex, 255, LINEARBLEND);colorIndex += 3;FastLED.show();FastLED.delay(10);}}fill_solid(leds, NUM_LEDS, CRGB::Black);FastLED.show();
}

示例演示

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

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

相关文章

哈夫曼编码的实现

哈夫曼编码 在说哈夫曼编码之前&#xff0c;先要讲清楚编码集是什么东西。相信写过代码的人&#xff0c;一定听说过ASCII、 UTF-8、GBK 这些编码集。这些编码集合&#xff0c;本质上都是一个二进制和字符之间映射关系&#xff0c;拿最简单的 ASCII 来说吧&#xff0c;使用 0x3…

刷题DAY56 | LeetCode 583-两个字符串的删除操作 72-编辑距离

583 两个字符串的删除操作&#xff08;medium&#xff09; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 代码实现1&#xff08;正向思考&#xff09;&#xff1a; class Solution {…

温度对射频电路性能的影响

对于射频电路,通常会有使用温度范围的要求,即在特定的温度范围内其性能变化不超出指标要求的值。对于工业级产品,一般要求使用温度范围为-40℃~+70℃,而军品要求使用温度范围为-55℃~+85℃。有一些其他特殊使用场景的产品会有不同的要求。 不同的温度对电路性能的影响,…

Shell学习 - 2.27 Linux bc命令:一款数学计算器

Bash Shell 内置了对整数运算的支持&#xff0c;但是并不支持浮点运算&#xff0c;而 Linux bc 命令可以很方便的进行浮点运算&#xff0c;当然整数运算也不再话下。 bc是"Basic Calculator"的缩写。 bc 甚至可以称得上是一种编程语言了&#xff0c;它支持变量、数组…

软件设计:UML 模型图总结

1. 相关链接 参考教程&#xff1a; https://sparxsystems.com/resources/tutorials/ https://sparxsystems.com/enterprise_architect_user_guide/15.2/model_domains/whatisuml.html Unified Modeling Language (UML) description, UML diagram examples, tutorials and r…

单片机学习笔记——LED点阵

代码如下&#xff0c;注意管脚和扫描所用的hc595_write_data函数 #include "reg51.h"typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8;//定义74HC595控制管脚 sbit SRCLKP3^6; //移位寄存器时钟输入 sbit RCLKP3^5; //存储寄存…

Element-UI 下拉框单选转多选回显不清空绑定的值

需求 根据radio切换来更改下拉框是否多选 原因 单选和多选这两个 input 看上去没差别&#xff08;自身和层级都一致&#xff09;&#xff0c;vue出于提高性能&#xff0c;所以 vue 给复用了 解决方案 <template><section><el-radio-group v-model"radi…

蓝桥杯---数组分割

https://www.dotcpp.com/oj/problem3171.html 测试用例分析&#xff1a; 2 2 6 6 2 1 6 这代表有两个测试用例。 第一测试用例: 数组: [6, 6]长度: 2 分析 数组中的所有元素都是偶数&#xff0c;因此任意组合的和都将是偶数。可能的组合及其和&#xff1a; 空集: 和 0 …

Parallels Desktop 19 for Mac在 Mac 上运行 Windows有哪些便利性,

使用Parallels Desktop 19 for Mac在Mac上运行Windows可以带来一系列的优势和便利性。 无需重启即可运行Windows&#xff1a;Parallels Desktop 19允许Mac用户无需重启即可在Mac上运行Windows操作系统&#xff0c;这样可以同时使用Mac和Windows的功能&#xff0c;提高工作效率。…

【迅为iMX6Q】开发板 Linux version 6.6.3 SD卡 启动

开发环境 win10 64位 VMware Workstation Pro 16 ubuntu 20.04 【迅为imx6q】开发板&#xff0c; 2G DDR RAM linux-imx 下载 使用 NXP 官方提供的 linux-imx&#xff0c;代码地址为&#xff1a; https://github.com/nxp-imx/linux-imx 使用 git 下载 linux-imx&#xff…

Python 物联网入门指南(八)

原文&#xff1a;zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第三十章&#xff1a;制作机械臂 最后&#xff0c;我们终于到达了大多数人自本书开始以来就想要到达的地方。制作一个机械臂&#xff01;在…

中科国声携新品亮相北京InfoComm China 2024展

4月17日&#xff0c;北京InfoComm China 2024展&#xff08;北京专业视听技术和集成体验解决方案展览会&#xff09;在北京的国家会议中心盛大开幕。展会为期三天。作为备受瞩目的”会议系统国家队“&#xff0c;中科国声携众多优质会议音频产品及全新会议系统解决方案精彩亮相…

中缀表达式求值

题目 请写一个整数计算器&#xff0c;支持加减乘三种运算和括号。 示例1 输入&#xff1a;“12” 返回值&#xff1a;3示例2 输入&#xff1a;“(2*(3-4))*5” 返回值&#xff1a;-10示例3 输入&#xff1a;“32*3*4-1” 返回值&#xff1a;26 思路 经典的中缀表达式求值。…

flask 路由(route)

web 框架使用路由技术来帮助用户记住应用程序的 url。无需从主页导航即可直接访问所需页面。 route() 装饰器用于将 url 绑定到函数&#xff1a; app.route(/hello) def hello_world(): return hello world url /hello 规则绑定到 hello_world() 函数。如果用户访问 url :…

“面包板”是什么?有啥用?

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

1950F - 0, 1, 2, Tree!

题目链接&#xff1a;0, 1, 2, Tree! 本道题目其实就是一道贪心的题目&#xff0c;对于思维的考察较多。 思路&#xff1a; 1.首先我们想想什么情况下该树不存在&#xff1f; 由二叉树的性质可知每一个子节点个数为2的树都必须有两个&#xff0c;每一个子节点为1的树必须有…

Vue3从入门到实战:深度掌握组件通信(上部曲)

props的概念&#xff1a; 当你使用Vue 3的组合式API时&#xff0c;props就是一种让你可以从父组件向子组件传递数据的方式。你可以想象成你在给子组件写一封信&#xff0c;把需要传递的信息放在信封里。 在Vue 3中&#xff0c;你可以在子组件的代码中定义props&#xff0c;就…

Dryad Girl Fawnia

一个可爱的Dryad Girl Fawnia的三维模型。她有ARKit混合形状,人形装备,多种颜色可供选择。她将是一个完美的角色,幻想或装扮游戏。 🔥 Dryad Girl | Fawnia 一个可爱的Dryad Girl Fawnia的三维模型。她有ARKit混合形状,人形装备,多种颜色可供选择。她将是一个完美的角色…

Python中直接根据网页内容导出为PDF或XLSX格式抓取网页内容,然后将其解析成适合导出到PDF或XLSX的结构

在Python中&#xff0c;直接根据网页内容导出为PDF或XLSX格式通常涉及几个步骤。首先&#xff0c;你需要抓取网页内容&#xff0c;然后将其解析成适合导出到PDF或XLSX的结构。下面是一些示例代码&#xff0c;展示如何完成这些任务。 网页内容抓取 你可以使用requests库来抓取…

Web 题记

[极客大挑战 2019]LoveSQL 看到这种就肯定先想到万能密码&#xff0c;试试&#xff0c;得到了用户名和密码 总结了一些万能密码&#xff1a; or 11 oror admin admin-- admin or 44-- admin or 11-- admin888 "or "a""a admin or 22# a having 11# a havin…