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

news2024/11/18 9:06:43

简介

  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 RGB

CRGB 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 0x5D
  if (!cap.begin(0x5A)) {
    Serial.println("MPR121 not found, check wiring?");
    while (1);
  }
  Serial.println("MPR121 found!");
}

void loop() {
  // Get the currently touched pads
  currtouched = 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 state
  lasttouched = currtouched;

  // comment out this line for detailed data from the sensor!
  return;

  // debugging info, what
  Serial.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 overwhelming
  delay(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.coloradmin.cn/o/1610504.html

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

相关文章

Tcpdump -r 解析pcap文件

当我们使用命令抓包后&#xff0c;想在命令行直接读取筛选怎么办&#xff1f;-r参数就支持了这个 当你使用 tcpdump 的 -r 选项读取一个之前捕获的数据包文件&#xff0c;并想要筛选指定 IP 地址和端口的包时&#xff0c;你可以在命令中直接加入过滤表达式。这些过滤表达式可以…

SpringMVC(三)【REST 风格】

1、REST 风格 1.1、REST 简介 REST&#xff08;Representational State Transfer&#xff09;&#xff0c;表现形式状态转换 在开发中&#xff0c;它其实指的就是访问网络资源的格式 1.1.1、传统风格资源描述形式 http://localhost/user/getById?id1http://localhost/user…

吴恩达机器学习笔记 三十五 异常检测与监督学习

什么时候选择异常检测&#xff1f; 正样本 ( y 1 ) 的数量非常少 负样本 ( y 0 ) 的数量非常多 有很多不同的异常&#xff0c;现有的算法不能从正样本中得知什么是异常&#xff0c;或未来可能出现完全没见过的异常情况。 例如金融欺诈&#xff0c;隔几个月或几年就有新的…

智慧公厕是如何诞生的?

在城市化进程中&#xff0c;公共卫生设施的建设一直是重要议题之一。而随着科技的不断发展&#xff0c;智慧公厕作为一种创新的解决方案&#xff0c;逐渐成为了现代城市管理的亮点。那么&#xff0c;智慧公厕是如何产生的呢&#xff1f; 一、城市化进程的推动 城市人口的增加和…

vue elmentui 可编辑table 实现

废话不多说上图&#xff1a; 1.可编辑input 2.可编辑下来框 3.点击chechbox 4.可编辑radio 其实后面两种可以直接显示值 需要修改直接改就行 保持风格统一所以就做了点击之后出现修改功能 上代码&#xff0c;不要哔哔 哈哈 粗暴 真得是曲不离口 拳不离手&#xff0c; 几天…

java学习笔记5

9. 类和对象 9.1 类 9.1.1 类的定义 ​ 类是具有相同属性和方法的具体实例的集合,类是对象的抽象,对象是类的具体实例 9.1.2 类语法 public class 类名{// 1. 属性public 变量的类型 变量名称1;public 变量的类型 变量名称2;...// 2. 方法public void 方法1(){}public v…

pandas/python 一个实战小案例

上次写坦克游戏的时候&#xff0c;接触了一点pandas&#xff0c;当时只是简单了解了一下如何遍历行和列并获取值来替换图片&#xff0c;想更多了解pandas。正好有一些数据需要筛选&#xff0c;试试能不能用通过代码实现。虽然总的来说不复杂&#xff0c;但由于原始数据在命名、…

【重要】Perplexity订阅问题看这一篇就够了!Perplexity免费版和订阅版区别?免费使用G|P|T-4!

常见问题 Q&#xff1a;Perplexity是什么&#xff1f;Perplexity有什么用&#xff1f; A&#xff1a;Perplexity是一个AI搜索引擎&#xff0c;可以理解为可以检索网络结果的G|P|T&#xff0c;尤其是选中“Academic”后支持特定学术论文的检索。并且文献是真是可查到的而不是G|P…

启明智显应用分享|基于ESP32-S3方案的SC01PLUS彩屏与chatgpt融合应用DEMO

今天将带大家真实体验科技与智慧的完美融合——SC01PLUS与ChatGPT的深度融合DEMO效果呈现。 彩屏的清晰显示与ChatGPT的精准回答&#xff0c;将为我们带来前所未有的便捷与高效。 SC01PLUS是启明智显基于ESP32-S3打造的一款3.5寸480*320分辨率的彩屏产品&#xff0c;您可以看…

【算法刷题 | 回溯思想 06】4.17(子集、子集||)

文章目录 9.子集9.1题目9.2解法&#xff1a;回溯9.2.1回溯思路&#xff08;1&#xff09;函数返回值以及参数&#xff08;2&#xff09;终止条件&#xff08;3&#xff09;遍历过程 9.2.2代码实现 10.子集 ||10.1题目10.2解法&#xff1a;回溯10.2.1回溯思路10.2.2代码实现 9.子…

SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出

目录 介绍 快速开始 引入依赖 简单导出 定义实体类 自定义转换器 定义接口 测试接口 复杂导出 自定义注解 定义实体类 数据映射与平铺 自定义单元格合并策略 定义接口 测试接口 一对多导出 自定义单元格合并策略 测试数据 简单导入 定义接口 测试接口 参…

畅游网络:构建C++网络爬虫的指南

概述 随着信息时代的来临&#xff0c;网络爬虫技术成为数据采集和网络分析的重要工具。本文旨在探讨如何运用C语言及其强大的cpprestsdk库构建一个高效的网络爬虫&#xff0c;以便捕捉知乎等热点信息。为了应对IP限制的挑战&#xff0c;我们将引入亿牛云爬虫代理服务&#xff…

【网络设备巡检命令】--思科、华为、H3C、锐捷

【网络设备巡检命令】--思科、华为、H3C、锐捷 一、思科二、华为三、H3C四、锐捷 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 一、思科 1、查看系统信息&#xff1a; show version2、查看时间&#xff1a; show clock3、查看序列号&a…

友思特应用 | 红外视角的延伸:短波红外相机的机器视觉应用

导读 短波红外SWIR在不同波段针对不同材料的独特成像特征为各领域检测应用的拓宽提供了基础。本文将展现短波红外成像技术在水分检测、塑料检测、太阳能电池板检查和矿场开采等领域的丰富应用案例&#xff0c;讨论短波红外相机在未来的发展方向。 SWIR 背景简介 短波红外 &am…

【vue】el-tree的新增/编辑/删除节点

1、概述 关于树形结构的新增同级节点&#xff0c;新增子级节点&#xff0c;修改节点名称&#xff0c;删除节点等四种操作&#xff0c;各种参数配置完全继承el-tree&#xff0c;本篇使用vue2 element-ui 2、效果图展示 3、调用方式 <template><Tree:data"tree…

前后端跨域请求代码实战(vue3.4+springboot2.7.18)

前端代码 v3.4.21&#xff08;前端不是主业&#xff0c;所以就贴一贴代码&#xff0c;有疑问评论区见&#xff09;后端代码&#xff0c;springboot 2.7.18&#xff08;后端&#xff09; 文章内容&#xff1a; 一&#xff0c;后端代码 二&#xff0c;前端代码 三&#xff0c;后…

美创科技19周年数据安全案例展

2005-2024 践行“让数据更安全&#xff0c;更有价值”的使命 美创19年砌垒&#xff0c;与不同行业用户 一同筑牢数字之基 美创19周年案例展 走进这段时间长廊 探索美创与各行业伙伴的数据安全实践 #1 数据安全体系化建设 浙江省&#xff0c;数字化改革先行地。以数字化…

进程间通信(1)管道

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

抖音小店怎么做?新手起店只需三步,看这一篇就够了

大家好&#xff0c;我是电商笨笨熊 抖音小店现如今已经人尽皆知&#xff0c;只因为让不少的普通玩家有了做电商的机会。 但是对于新手小白来说&#xff0c;做抖店一定不要盲目&#xff0c;此项目固然能让众多人从个人走到团队化&#xff0c;但也要掌握方法。 所以今天我们就…

半导体存储电路知识点总结

目录 一、SR锁存器 1.SR锁存器的概念 2.作用 二、电平触发器&#xff08;Flip-Flop&#xff09; 1.时钟信号 2.电平触发的触发器电路结构 3.带异步置位复位的电平触发器 三、边沿触发器 1.特点 2.两个D触发器组成的边沿触发D触发器 3.CMOS边沿触发D触发器的典型电路 …