Kapazitiven Sensor Auswerten, Capacitive Switch


guten morgen,
ich verwende hier einen kapazitiven sensor als lichtschalter, grundsätzlich schon relativ gut funktioniert. dabei verwende ich die hier erwähnte bibliothek:
capacitive sensing
zwischen pin 2 und 5 hängt ein 1m widerstand und ein kleiner kondensator (ich meine 100pf) geht von pin 2 auf masse.
der code sieht wie folgt aus:

code: [select]
#include <capacitivesensor.h>
int dosean = 12; // pin 12 schaltet über reed relais, das relais für licht
int statusreset = 0; // verhindert schalten bevor reset schwellenwert unterschritten ist
int statusan = 0; // speichert status licht an
unsigned long previousmillis = 0; // speichert wie viele sekunden seit derletzten Änderung vergangen sind
unsigned long interval = 3000;    // kalibrierungsinterval

capacitivesensor   cs_5_2 = capacitivesensor(5,2);        // 1m widerstand zwischen pin 5 und 2, pin 2 hängt die sensorfläche

void setup()                   
{
  serial.begin(9600);
  pinmode(dosean, output);    // pin dosean als ausgang definieren
}


void loop()                   
{
  // an
  long start = millis();
  long total1 =  cs_5_2.capacitivesensor(30);
  if( (total1 > 600 )&&(statusreset == 0)&&(statusan == 0) ){
    digitalwrite(dosean, high);
    statusan = 1;
    statusreset = 1;
    delay(300);
   serial.println("an");
  }

  //aus
  start = millis();
  total1 =  cs_5_2.capacitivesensor(30);
  if( (total1 > 600 )&&(statusreset == 0)&&(statusan == 1) ){
   digitalwrite(dosean, low);
    statusan = 0;
    statusreset = 1;
    delay(300);
    serial.println("aus");   
  }

  // reset aus
  start = millis();
  total1 =  cs_5_2.capacitivesensor(30);
  if(total1 < 310 ){
    statusreset = 0;
   serial.println("reset");
  }

  // kalibrierung alle 3 sekunden
  if (millis() - previousmillis > interval) {
    previousmillis = millis();
    cs_5_2.reset_cs_autocal();
    serial.println("kalibrierung");
  }

// daten über serial monitor ausgeben
 serial.println(total1);   // sensorwert sensor 1 über serial port ausgeben
  delay(250);                             // delay für serialport ausgabe
}



um das system stabil zu bekommen, muss ich alle paar sekunden einen kalibrierung durchführen lassen, die reaktion des lichtschalters unnötig langsam macht. wenn ich die kalibrierung nicht durchführen lasse, steigt der gelesene wert stetig an, bis das licht von selbst ein oder ausgeschaltet wird. evtl. lässt sich das problem hardwareseitig lösen, indem ein kondensator oder hochohmiger entladewiderstand von der sensorfläche gegen masse geschalten wird.

ich würde die ganze problematik nun aber gerne wie folgt umgehen, weiß aber nicht wie der code dazu aussehen müsste.

momentan sieht der code welcher die problematik betrifft ja wie folgt aus

code: [select]
{
  // an
  long start = millis();
  long total1 =  cs_5_2.capacitivesensor(30);
  if( (total1 > 600 )&&(statusreset == 0)&&(statusan == 0) ){
    digitalwrite(dosean, high);
    statusan = 1;
    statusreset = 1;
    delay(300);
   serial.println("an");
  }


ich würde den schaltpunkt nun gerne nicht über einen absolutwert ((total1 > 600) sondern über die steilheit des wertanstieges definieren. wie folgt if ( (total1 innerhalb 400ms um mehr als 500 einheiten steigt dann...
da ich leider nicht wirklich vom fach bin fehlt mir leider ein ansatzpunkt wie das umzusetzen wäre. ist klar ich erreichen möchte und hat wer eine idee wie ich das umsetzen kann?

grüße,

jan

in diesem thread hier ganz unten findest du einen sketch wo ich sowas ähnliches gemacht habe:

http://forum.arduino.cc/index.php?topic=257024.msg1837174#msg1837174

die funktion glaetten() macht den geglätteten wert. je nach größe des faktors wird stärker oder weniger geglättet.

grüße,

sven


Arduino Forum > International > Deutsch (Moderator: uwefed) > Kapazitiven Sensor Auswerten, Capacitive Switch


arduino

Comments

Popular posts from this blog

invalid use of void expresion in FlexiTimer2 library

error: a function-definition is not allowed here before '{' token

LED Strip Code