|
楼主 |
发表于 2019-4-17 16:21:32
|
显示全部楼层
不使用 pulseIn(),用 pin2 interrupt 的範例: - /*
- Capacitive Grid Sensor Module TM003 Readout Program (Use Interrupt pin2)
- https://item.taobao.com/item.htm?id=17251121381&ns=1&abbucket=14#detail
- Date: 20190417
- Rev: 01
- By: Eddie
- */
- #define SCLK 2 // Clock come from TM003 SCLK pin
- #define SDATA 3 // Data come from TM003 SDATA pin
- #define CLEAR 7 // Connect to TM003 CLEAR pin, Low 0.5sec to set Zero
- #define STATUS_LED 13 // To output the waveform as pin2 SCLK input
- #define minStartTime 100000 //
- #define maxStartTime 500000 //
- unsigned long startDuration = 0;
- unsigned long rawData = 0;
- bool startFlag = false;
- bool negativeFlag = false;
- volatile bool inHighFlag = false;
- volatile bool inLowFlag = false;
- volatile unsigned long pulseWidthStart, pulseWidthEnd, pulseWidth;
- void setup() {
- pinMode(SCLK, INPUT);
- pinMode(SDATA, INPUT);
- pinMode(CLEAR, INPUT);
- pinMode(STATUS_LED, OUTPUT);
- digitalWrite(STATUS_LED, LOW);
- attachInterrupt(digitalPinToInterrupt(SCLK), ISRrisingEdge, RISING);
- Serial.begin(115200);
- }
- void loop() {
- checkStart();
- getData();
- showResult();
- }
- void ISRrisingEdge() {
- digitalWrite(STATUS_LED, HIGH);
- pulseWidthStart = micros();
- pulseWidth = 0;
- attachInterrupt(digitalPinToInterrupt(SCLK), ISRfallingEdge, FALLING);
- }
- void ISRfallingEdge() {
- digitalWrite(STATUS_LED, LOW);
- pulseWidthEnd = micros();
- pulseWidth = pulseWidthEnd - pulseWidthStart;
- attachInterrupt(digitalPinToInterrupt(SCLK), ISRrisingEdge, RISING);
- }
- void checkStart() {
- if ((pulseWidth < minStartTime) or (pulseWidth > maxStartTime)) {
- startFlag = false;
- }
- else {
- startFlag = true;
- }
- }
- void getData() {
- if (startFlag) {
- rawData = 0 ;
- for (int i = 0; i < 24; i++) {
- rawData = rawData >> 1;
- bool tmpClk = digitalRead(SCLK);
- while (tmpClk == false) {
- tmpClk = digitalRead(SCLK);
- }
- bool tmpData = digitalRead(SDATA);
- if (tmpData == true) {
- rawData = rawData | 0x00800000;
- }
- else {
- rawData = rawData & 0xFF7FFFFF;
- }
- if (i < 23) {
- while (tmpClk == true) {
- tmpClk = digitalRead(SCLK);
- }
- }
- }
- }
- }
- void showResult() {
- if (rawData & 0x00100000) {
- negativeFlag = true;
- }
- else {
- negativeFlag = false;
- }
- unsigned long result = rawData & 0x000FFFFF; // only use 5-byte data
- Serial.print("Result: ");
- if (negativeFlag) {
- Serial.print(" -");
- }
- else {
- Serial.print(" ");
- }
- Serial.println(result);
- }
复制代码 |
|