极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1361|回复: 4

8F328-U讀取 TM003容栅位移传感器模块

[复制链接]
发表于 2019-4-16 17:05:39 | 显示全部楼层 |阅读模式
8F328-U讀取 TM003容栅位移传感器模块
  1. /*
  2.    Capacitive Grid Sensor Module TM003 Readout Program
  3.    https://item.taobao.com/item.htm?id=17251121381&ns=1&abbucket=14#detail
  4.    Date: 20190416
  5.    Rev: 01
  6.    By: Eddie
  7. */

  8. #define SCLK 2    // Clock come from TM003 SCLK pin
  9. #define SDATA 3   // Data come from TM003 SDATA pin
  10. #define CLEAR 7   // Connect to TM003 CLEAR pin, Low 0.5sec to set Zero
  11. #define minStartTime 100000  //
  12. #define maxStartTime 500000  //

  13. unsigned long startDuration = 0;
  14. unsigned long rawData = 0;
  15. bool startFlag = false;
  16. bool negativeFlag = false;

  17. void setup() {
  18.   pinMode(SCLK, INPUT);
  19.   pinMode(SDATA, INPUT);
  20.   pinMode(CLEAR, INPUT);
  21.   Serial.begin(115200);
  22. }

  23. void loop() {
  24.   checkStart();
  25.   getData();
  26.   showResult();
  27. }

  28. void checkStart() {
  29.   startDuration = pulseIn(SCLK, HIGH);
  30.   while ((startDuration < minStartTime) or (startDuration > maxStartTime)) {
  31.     startDuration = pulseIn(SCLK, HIGH);
  32.   }
  33.   startFlag = true;
  34. }

  35. void getData() {
  36.   rawData = 0 ;
  37.   for (int i = 0; i < 24; i++) {
  38.       rawData = rawData >> 1;
  39.     bool tmpClk = digitalRead(SCLK);
  40.     while (tmpClk == false) {
  41.       tmpClk = digitalRead(SCLK);
  42.     }
  43.     bool tmpData = digitalRead(SDATA);
  44.     if (tmpData == true) {
  45.       rawData = rawData | 0x00800000;
  46.     }
  47.     else {
  48.       rawData = rawData & 0xFF7FFFFF;
  49.     }
  50.     while (tmpClk == true) {
  51.       tmpClk = digitalRead(SCLK);
  52.     }
  53.   }
  54. }

  55. void showResult(){
  56.   if (rawData & 0x00100000) {
  57.     negativeFlag = true;
  58.   }
  59.   else {
  60.     negativeFlag = false;
  61.   }
  62.   unsigned long result = rawData & 0x000FFFFF; // only use 5-byte data
  63.   Serial.print("Result: ");
  64.   if (negativeFlag) {
  65.     Serial.print(" -");
  66.   }
  67.   else {
  68.     Serial.print("  ");
  69.   }
  70.   Serial.println(result);  
  71. }
复制代码
回复

使用道具 举报

发表于 2019-4-16 17:07:14 | 显示全部楼层
问一下,容栅位移传感器,的寿命有长,长时间频繁使用是否会偏差。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-16 17:17:08 | 显示全部楼层
剛買回來的模塊,詳細的不清楚,你可問賣家。
回复 支持 反对

使用道具 举报

发表于 2019-4-16 17:31:04 | 显示全部楼层
居然开始玩容栅了。。。。感觉我已经跟不上时代发展。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-17 16:21:32 | 显示全部楼层
不使用 pulseIn(),用 pin2 interrupt 的範例:
  1. /*
  2.    Capacitive Grid Sensor Module TM003 Readout Program (Use Interrupt pin2)
  3.    https://item.taobao.com/item.htm?id=17251121381&ns=1&abbucket=14#detail
  4.    Date: 20190417
  5.    Rev: 01
  6.    By: Eddie
  7. */

  8. #define SCLK 2    // Clock come from TM003 SCLK pin
  9. #define SDATA 3   // Data come from TM003 SDATA pin
  10. #define CLEAR 7   // Connect to TM003 CLEAR pin, Low 0.5sec to set Zero
  11. #define STATUS_LED 13 // To output the waveform as pin2 SCLK input
  12. #define minStartTime 100000  //
  13. #define maxStartTime 500000  //

  14. unsigned long startDuration = 0;
  15. unsigned long rawData = 0;
  16. bool startFlag = false;
  17. bool negativeFlag = false;
  18. volatile bool inHighFlag = false;
  19. volatile bool inLowFlag = false;
  20. volatile unsigned long pulseWidthStart, pulseWidthEnd, pulseWidth;

  21. void setup() {
  22.   pinMode(SCLK, INPUT);
  23.   pinMode(SDATA, INPUT);
  24.   pinMode(CLEAR, INPUT);
  25.   pinMode(STATUS_LED, OUTPUT);
  26.   digitalWrite(STATUS_LED, LOW);
  27.   attachInterrupt(digitalPinToInterrupt(SCLK), ISRrisingEdge, RISING);
  28.   Serial.begin(115200);
  29. }

  30. void loop() {
  31.   checkStart();
  32.   getData();
  33.   showResult();
  34. }

  35. void ISRrisingEdge() {
  36.   digitalWrite(STATUS_LED, HIGH);
  37.   pulseWidthStart = micros();
  38.   pulseWidth = 0;
  39.   attachInterrupt(digitalPinToInterrupt(SCLK), ISRfallingEdge, FALLING);
  40. }

  41. void ISRfallingEdge() {
  42.   digitalWrite(STATUS_LED, LOW);
  43.   pulseWidthEnd = micros();
  44.   pulseWidth = pulseWidthEnd - pulseWidthStart;
  45.   attachInterrupt(digitalPinToInterrupt(SCLK), ISRrisingEdge, RISING);
  46. }

  47. void checkStart() {
  48.   if ((pulseWidth < minStartTime) or (pulseWidth > maxStartTime)) {
  49.     startFlag = false;
  50.   }
  51.   else {
  52.     startFlag = true;
  53.   }
  54. }

  55. void getData() {
  56.   if (startFlag) {
  57.     rawData = 0 ;
  58.     for (int i = 0; i < 24; i++) {
  59.       rawData = rawData >> 1;
  60.       bool tmpClk = digitalRead(SCLK);
  61.       while (tmpClk == false) {
  62.         tmpClk = digitalRead(SCLK);
  63.       }
  64.       bool tmpData = digitalRead(SDATA);
  65.       if (tmpData == true) {
  66.         rawData = rawData | 0x00800000;
  67.       }
  68.       else {
  69.         rawData = rawData & 0xFF7FFFFF;
  70.       }
  71.       if (i < 23) {
  72.         while (tmpClk == true) {
  73.           tmpClk = digitalRead(SCLK);
  74.         }
  75.       }
  76.     }
  77.   }
  78. }

  79. void showResult() {
  80.   if (rawData & 0x00100000) {
  81.     negativeFlag = true;
  82.   }
  83.   else {
  84.     negativeFlag = false;
  85.   }
  86.   unsigned long result = rawData & 0x000FFFFF; // only use 5-byte data
  87.   Serial.print("Result: ");
  88.   if (negativeFlag) {
  89.     Serial.print(" -");
  90.   }
  91.   else {
  92.     Serial.print("  ");
  93.   }
  94.   Serial.println(result);
  95. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2019-8-22 13:26 , Processed in 0.074877 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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