Nov 9, 2010

Capacitive sensing w/ Arduino

Aquest és el meu sensor capacitiu pensat per nesurar la humitta del terra (i per aquest motiu és estanc):






A arduino carregueu el següent programa:

/* CapitiveSense Library Demo Sketch
* Paul Badger 2008
* Uses a high value resistor e.g. 10M between send pin and receive pin
* Resistor effects sensitivity, experiment with values, 50K - 50M. Larger resistor values yield larger sensor values.
* Receive pin is the sensor pin - try different amounts of foil/metal on this pin
*/

#include

CapSense cs_4_2 = CapSense(4,2);          // 10M resistor between pins 4 & 2, pin 2 is sensor pin, add a wire and or foil if desired

void setup() {
  cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);  // turn off autocalibrate on channel 1 - just as an example
  Serial.begin(115200);
}



void loop() {
  long start = millis();
  long total = cs_4_2.capSense(30);
  Serial.println(total, DEC);                                    // print sensor output 1
  delay(10);                                                          // arbitrary delay to limit data to serial port
}

Per més informació sobre el codi anterior segueix aquest Link: Capacitive Sensing


adicionalment per veure la mesura, podem executar el següent programa Processing:

import processing.serial.*;

Serial port;
int LINE_FEED=10;
float [] punt;
float maxY;
float minY;
float mitjana;
float mitjanaMin = 0;
float mitjanaMax = 0;
void setup(){
  size(640, 480, P3D);
  port = new Serial(this, Serial.list()[0], 115200);
  frameRate(200);
  minY=0;
  maxY=height;
  punt = new float[width];

  for(int n=0;n<width;n++){
     punt[n]=0;
  }
}

void draw(){
  background(0); stroke(255);
  float lmitjana = punt[0];
  for(int n=1;n<width;n++){
    line(n-1,map(punt[n-1],minY, maxY,height,0),n,map(punt[n],minY, maxY,height,0));
    lmitjana += punt[n];
  }
  mitjana = lmitjana / width;
  mitjanaMax = (mitjana > mitjanaMax) ? mitjana : mitjanaMax;
  mitjanaMin = (mitjana < mitjanaMin) ? mitjana : mitjanaMin;

  float mapMitjana = map(mitjana, minY, maxY, height, 0);
  float mapMitjanaMin = map(mitjanaMin, minY, maxY, height, 0);
  float mapMitjanaMax = map(mitjanaMax, minY, maxY, height, 0);

  stroke(255,0,0); line(0, mapMitjanaMin, width, mapMitjanaMin);
  stroke(0,0,255); line(0, mapMitjanaMax, width, mapMitjanaMax);
  stroke(0,255,0); line(0, mapMitjana, width, mapMitjana);
}

void mousePressed(){
  mitjanaMin = mitjana;
}

void serialEvent(Serial p) {
  String data = p.readStringUntil(LINE_FEED);
  if (data != null) {
    for(int n=1;n<width;n++){
    maxY = (punt[width-1]>maxY) ? punt[width-1] : maxY;
    print((int)mitjana +" ");
  }
}