风筝
发表于: 2024-10-30 18:04:15 | 显示全部楼层

电容式触摸是一种通过利用人体的电流感应来工作的新型非接触式触摸技术,广泛应用在人机交互界面,它带动了科技发展,改变着日常生活。电容式触摸的主要特点是操作灵敏,抗静电性强,手指触摸时不需要大的力量就可以完成触摸操作。


在本篇文章中,我们将主要介绍如何基于Arduino开发板使用CAP1188电容式触摸传感器模块,实现触摸按键输入操作。


所需的组件

●    Arduino Uno R3开发板

●    CAP1188八键电容式触摸传感器模块

●    跳线

●    I2C字符型LCD显示模块2004(绿色背光)

Required-Materials-4.jpg


CAP1188电容式触摸传感器模块

CAP1188八键电容式触摸传感器模块就像为您的项目增添了魔力!它使用起来非常简单,可以感应多达八个不同按钮的触摸,为您的创作提供大量选择。很酷的是,您不需要成为技术专家就可以进行设置 - 它易于使用,非常适合初学者。想象一下,只需轻轻触摸一个按钮,您的项目就会做出反应!这就像为DIY项目或交互式显示器增添了一丝魔力。此外,它可以与不同的微控制器很好地配合使用,使其成为各种酷炫创意的便捷工具。因此,如果您想为您的创作增添一丝魔力,CAP1188就是您的首选触摸传感器!

1-4.jpg


CAP1188电容式触摸传感器模块引脚排列

该传感器模块有26个引脚,包含SPI通讯接口,8个触摸按键以及LED灯显示:

pin-3.jpg

●    VDD:模块的电源输入。

●    GND:接地,确保稳定的电气连接。

●    MOSI:主输出从输入,用于与微控制器通信的串行数据线。

●    MISO (SDA):主输入从输出,用于双向通信的串行数据线。

●    CS:芯片选择,可与CAP1188模块通信。

●    SCK (SCL):用于同步数据传输的串行时钟线。

●    RST:复位引脚。

●    IRQ:用于向微控制器发送触摸事件信号的中断请求引脚。

●    C0-C7:用于检测触摸输入的单独触摸感应通道。

●    D0-D7:用于控制外部 LED 的通道。

●    ADR0:用于配置模块I2C地址的地址选择引脚。


CAP1188电容式触摸传感器模块与Arduino开发板的硬件连接

以下电路显示了如何将Arduino开发板连接到CAP1188电容式触摸传感器模块。使用I2C方式进行连接,按照下图进行连接。

fritzing_bb.jpg


代码

首先在Arduino IDE中安装Adafruit_CAP1188_Library库,该文件可以在Github下载:Adafruit_CAP1188_Library

显示屏使用的是LiquidCrystal_I2C库:LiquidCrystal_I2C

然后复制以下代码,进行编译上传。

  1. /*
  2. Create on January 16, 2024
  3. */

  4. #include <Arduino.h>
  5. #include <Wire.h>
  6. #include <LiquidCrystal_I2C.h>
  7. #include <Adafruit_CAP1188.h>
  8. LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
  9. Adafruit_CAP1188 cap = Adafruit_CAP1188();

  10. void setup()
  11. {
  12.   lcd.init(); // initialize the lcd
  13.   lcd.init();
  14.   // Print a message to the LCD.
  15.   lcd.backlight();
  16.   Serial.begin(115200);
  17.   lcd.setCursor(4, 0);
  18.   lcd.print("YiBoard Studio");
  19.   lcd.setCursor(0, 1);
  20.   lcd.print("CAP1188 test!");
  21.   lcd.setCursor(0, 2);
  22.   // Initialize the sensor, if using i2c you can pass in the i2c address
  23.   // if (!cap.begin(0x28)) {
  24.   if (!cap.begin())
  25.   {
  26.     lcd.print("CAP1188 not found");
  27.     while (1)
  28.       ;
  29.   }
  30.   lcd.print("CAP1188 found!");
  31.   delay(3000);
  32.   lcd.clear();

  33.   lcd.setCursor(0, 0);
  34.   lcd.print("C1");
  35.   lcd.setCursor(10, 0);
  36.   lcd.print("C2");
  37.   lcd.setCursor(0, 1);
  38.   lcd.print("C3");
  39.   lcd.setCursor(10, 1);
  40.   lcd.print("C4");
  41.   lcd.setCursor(0, 2);
  42.   lcd.print("C5");
  43.   lcd.setCursor(10, 2);
  44.   lcd.print("C6");
  45.   lcd.setCursor(0, 3);
  46.   lcd.print("C7");
  47.   lcd.setCursor(10, 3);
  48.   lcd.print("C8");
  49. }

  50. void loop()
  51. {
  52.   uint8_t touched = cap.touched();

  53.   if (touched == 0)
  54.   {
  55.     // No touch detected
  56.     lcd.setCursor(5, 0);
  57.     lcd.print("R");
  58.     lcd.setCursor(15, 0);
  59.     lcd.print("R");
  60.     lcd.setCursor(5, 1);
  61.     lcd.print("R");
  62.     lcd.setCursor(15, 1);
  63.     lcd.print("R");
  64.     lcd.setCursor(5, 2);
  65.     lcd.print("R");
  66.     lcd.setCursor(15, 2);
  67.     lcd.print("R");
  68.     lcd.setCursor(5, 3);
  69.     lcd.print("R");
  70.     lcd.setCursor(15, 3);
  71.     lcd.print("R");
  72.     return;
  73.   }
  74.   else
  75.   {

  76.     for (uint8_t i = 0; i < 8; i++)
  77.     {
  78.       if (touched & (1 << i))
  79.       {
  80.         switch (i)
  81.         {
  82.         case 0:
  83.           lcd.setCursor(5, 0);
  84.           lcd.print("T");
  85.           break;
  86.         case 1:
  87.           lcd.setCursor(15, 0);
  88.           lcd.print("T");
  89.           break;
  90.         case 2:
  91.           lcd.setCursor(5, 1);
  92.           lcd.print("T");
  93.           break;
  94.         case 3:
  95.           lcd.setCursor(15, 1);
  96.           lcd.print("T");
  97.           break;
  98.         case 4:
  99.           lcd.setCursor(5, 2);
  100.           lcd.print("T");
  101.           break;
  102.         case 5:
  103.           lcd.setCursor(15, 2);
  104.           lcd.print("T");
  105.           break;
  106.         case 6:
  107.           lcd.setCursor(5, 3);
  108.           lcd.print("T");
  109.           break;
  110.         case 7:
  111.           lcd.setCursor(15, 3);
  112.           lcd.print("T");
  113.           break;

  114.         default:
  115.           break;
  116.         }
  117.       }
  118.       else
  119.       {
  120.         switch (i)
  121.         {
  122.         case 0:
  123.           lcd.setCursor(5, 0);
  124.           lcd.print("R");
  125.           break;
  126.         case 1:
  127.           lcd.setCursor(15, 0);
  128.           lcd.print("R");
  129.           break;
  130.         case 2:
  131.           lcd.setCursor(5, 1);
  132.           lcd.print("R");
  133.           break;
  134.         case 3:
  135.           lcd.setCursor(15, 1);
  136.           lcd.print("R");
  137.           break;
  138.         case 4:
  139.           lcd.setCursor(5, 2);
  140.           lcd.print("R");
  141.           break;
  142.         case 5:
  143.           lcd.setCursor(15, 2);
  144.           lcd.print("R");
  145.           break;
  146.         case 6:
  147.           lcd.setCursor(5, 3);
  148.           lcd.print("R");
  149.           break;
  150.         case 7:
  151.           lcd.setCursor(15, 3);
  152.           lcd.print("R");
  153.           break;

  154.         default:
  155.           break;
  156.         }
  157.       }
  158.     }
  159.   }

  160.   delay(50);
  161. }
复制代码

上传代码后,使用手指触摸传感器,观察输出结果,如下图所示:

output.jpg


跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-21 22:15 , Processed in 0.057303 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表