###
//#define DEBUG true
class CapaSensor {
  private:
  int vCtrlPin;
  int vSensingPin;
  int vTryNumber;
  int vThreshold;
  
  public:
  CapaSensor(int aCtrlPin, int aSensingPin, int aTryNumber) {
    pinMode(aCtrlPin, OUTPUT);
    pinMode(aSensingPin, INPUT);
    vCtrlPin = aCtrlPin;
    vSensingPin = aSensingPin;
    vTryNumber = aTryNumber;
    vThreshold = (int)(read() * 1.2);
#if DEBUG    
    Serial.print("CapaSensor[");
    Serial.print(vCtrlPin);  
    Serial.print("-");
    Serial.print(vSensingPin);  
    Serial.print("x");
    Serial.print(aTryNumber);  
    Serial.print(">");
    Serial.println(vThreshold);
#endif
  }
  int read() {
    int ret = 0;
    for(int i = 0; i < vTryNumber; i++) {
      int cnt = 0;
      digitalWrite(vCtrlPin, HIGH);
      while(digitalRead(vSensingPin) < HIGH) {
        cnt++;
      }
      if (ret < cnt) ret = cnt;
      digitalWrite(vCtrlPin, LOW);
      delay(5);
    }
    return ret;
  }
  int touched() {
    int ret = 0;
    for(int i = 0; i < vTryNumber; i++) {
      int cnt = 0;
      digitalWrite(vCtrlPin, HIGH);
      while(digitalRead(vSensingPin) < HIGH) {
        cnt++;
        if (cnt > vThreshold) {
          return true;
          #if DEBUG
            Serial.print("@-");
            Serial.print(vThreshold);
            Serial.print(" <? ");
            Serial.println(cnt);
          #endif
        }
      }
      if (ret < cnt) ret = cnt;
      digitalWrite(vCtrlPin, LOW);
      delay(5);
    }
#if DEBUG
    Serial.print(ret > vThreshold ? "@ " : "  ");
    Serial.print(vThreshold);
    Serial.print(" <? ");
    Serial.println(ret);
#endif
    return ret > vThreshold;
  }
};

int oLed = 13;
CapaSensor* capa;
void setup() {
  Serial.begin(9600);
  Serial.print("Setup");
  analogWrite(oLed, 0);
  capa = new CapaSensor(8,9,10);
}

void loop() {
  analogWrite(oLed, capa->touched()?128:0);
  delay(100);
}
###

###
#ifndef CapaSensorHpp
#define CapaSensorHpp

#include "Arduino.h"

class CapaSensor {
  private:
    int mDebug = false;

  public:
    CapaSensor(int aCtrlPin, int aDataPin, int aTryNumber) {
      pinMode(aCtrlPin, OUTPUT);
      pinMode(aDataPin,  INPUT);
       
      mCtrlPin = aCtrlPin;
      mDataPin = aDataPin;
      mTryNumber = aTryNumber;
      mThreshold = (int)(read() * 1.2);

      if (mDebug) {
        Serial.print("CapaSensor["); 
        Serial.print(mCtrlPin); 
        Serial.print(","); 
        Serial.print(mDataPin); 
        Serial.print("]x"); 
        Serial.print(mTryNumber); 
        Serial.print(">"); 
        Serial.print(mThreshold); 
        Serial.println("x"); 
      }
    }
    int read() {
      int ret = 0;
      fReset();
      for (int i = 0; i < mTryNumber; i ++) {
        digitalWrite(mCtrlPin, HIGH);
        for (int cnt = 0; digitalRead(mDataPin) < HIGH; cnt++) {
          if (ret < cnt) ret = cnt;
        }
        fReset();
      }
      return ret;
    }
    bool touched() {
      fReset();
      for (int i = 0; i < mTryNumber; i ++) {
        digitalWrite(mCtrlPin, HIGH);
        for (int cnt = 0; digitalRead(mDataPin) < HIGH; cnt++) {
          if (cnt > mThreshold) {
            if (mDebug) {
              Serial.print("  Capa = ");
              Serial.print(cnt);
              Serial.print(" >= ");
              Serial.println(mThreshold);
            }
            return true; 
          }
        }
        fReset();
      }
      return false;
    }
  private:
    int mCtrlPin;
    int mDataPin;
    
    int mTryNumber;
    int mThreshold;

    void fReset() {
      digitalWrite(mCtrlPin, LOW);
      while(digitalRead(mDataPin) > LOW) {;}
      delay(2);
    }
};

#endif

###
    技術 一覧 検索 最新 バックアップ リンク元   ヘルプ   最終更新のRSS