Arduino, et capteur capacitif

Bonjour,

Je veux créer 3 “interrupteurs capacitifs” pour ma salle de bain, un pour allumer ou éteindre la lumière général, un pour la lumière de la douche, et un pour le miroir LED, j’ai mon code etc que je mettrais après cette description, quand je fais ça en phase d’essai sur mon bureau pas de soucis tout est ok, la détection c’est bon, une fois que je passe en réel plus moyen de quoi que ce soit.

Mon schéma électrique/électronique est tel que :

  • Une résistance de 1kOhm sur chaque Receive Pin
  • Une résistance de 33 MOhm sur chaque Send Pin
  • Les deux autres pattes des résistances ensemble avec mon antenne de détection

Je me demande si la distance des câbles entre mon arduino et l’endroit où je détecte vraiment n’est pas problématique ? J’ai essayé de mettre les résistance au plus proche de mon arduino, mon antenne est du coup d’un longueur de 4M environ, et j’ai aussi essayé en mettant 2 longueurs d’environ 4M, entre mon arduino et mes deux résistances pour avoir une antenne très petite, mais rien n’y fait, je ne comprends pas.

Voici le code :

#include <CapTouch.h>

/* CapTouch - an example for the CapTouch class
  from the v.04 - Capacitive Sensing Library for 'duino / Wiring
  by Paul Badger 2-3-2012
  <paul@moderndevice.com> http://opensource.org/licenses/mit-license.php

  This capacitive sensing method requires two microcontroller pins (send pin, receive pin)
  with a high value resistor between them (1M is a starting point)
  a small capacitor (20-40 pf) from the receive pin (the sensor is connected to this pin)
  to ground will result in more stable readings. Sensor is any wire or conductive foil
  on the receive pin.

  Also demonstrates a simple smoothing filter which is not required in any way
  by the sketch
*/


// CapTouch(sendPin, receivePin) - recieve pin is the sensor to touch
CapTouch touch_2_3 = CapTouch(2, 3);
CapTouch touch_4_5 = CapTouch(4, 5);
CapTouch touch_6_7 = CapTouch(6, 7);

float light;
float shower_light;
float mirror_light;

void setup()
{
  pinMode(10, OUTPUT);
  digitalWrite(10, 1);
  pinMode(11, OUTPUT);
  digitalWrite(11, 1);
  pinMode(13, OUTPUT);
  digitalWrite(13, 1);
}

void loop()
{

  long start = millis();                    // scheme to time performance, delete at will
  long light_sensor =  touch_2_3.readTouch(90);    //  read the sensor
  long shower_light_sensor =  touch_4_5.readTouch(90);
  long mirror_light_sensor =  touch_6_7.readTouch(90);
  long elapsedTime =  millis() - start;     // scheme to time performance, delete at will

  // simple lowpass filter to take out some of the jitter
  // change parameter (0 is min, .99 is max) or eliminate to suit
  // you need a different "smoothed" variable for each sensor is using more than one
  light = smooth(light_sensor, .95, light);
  shower_light = smooth(shower_light_sensor, .95, shower_light);
  mirror_light = smooth(mirror_light_sensor, .95, mirror_light);

  if (light >= 2000 || shower_light >= 2000 || mirror_light >= 2000)
  {
    if (light >= 2000) {
      digitalWrite(11, 0);
      delay(50);
      digitalWrite(11, 1);
    }
    else if (shower_light >= 2000) {
      digitalWrite(10, 0);
      delay(50);
      digitalWrite(10, 1);
    }
    else if (mirror_light >= 2000) {
      digitalWrite(13, 0);
      delay(50);
      digitalWrite(13, 1);
    }
    delay(500);
  }
  delay(10);
}



// simple lowpass filter
// requires recycling the output in the "smoothedVal" param
float smooth(float data, float filterVal, float smoothedVal) {

  if (filterVal > 1) {     // check to make sure param's are within range
    filterVal = .99;
  }
  else if (filterVal <= 0) {
    filterVal = 0;
  }

  smoothedVal = (data * (1 - filterVal)) + (smoothedVal  *  filterVal);

  return smoothedVal;
}

Bonjour,

Je veux créer 3 “interrupteurs capacitifs” pour ma salle de bain, un pour allumer ou éteindre la lumière général, un pour la lumière de la douche, et un pour le miroir LED, j’ai mon code etc que je mettrais après cette description, quand je fais ça en phase d’essai sur mon bureau pas de soucis tout est ok, la détection c’est bon, une fois que je passe en réel plus moyen de quoi que ce soit, j’ai bien mon GND relié à ma terre en réel puisque je suis sur bloc secteur.

Mon schéma électrique/électronique est tel que :

  • Une résistance de 1kOhm sur chaque Receive Pin
  • Une résistance de 33 MOhm sur chaque Send Pin
  • Les deux autres pattes des résistances ensemble avec mon antenne de détection

Je me demande si la distance des câbles entre mon arduino et l’endroit où je détecte vraiment n’est pas problématique ? J’ai essayé de mettre les résistance au plus proche de mon arduino, mon antenne est du coup d’un longueur de 4M environ, et j’ai aussi essayé en mettant 2 longueurs d’environ 4M, entre mon arduino et mes deux résistances pour avoir une antenne très petite, mais rien n’y fait, je ne comprends pas.

Voici le code :

#include <CapTouch.h>

/* CapTouch - an example for the CapTouch class
  from the v.04 - Capacitive Sensing Library for 'duino / Wiring
  by Paul Badger 2-3-2012
  <paul@moderndevice.com> http://opensource.org/licenses/mit-license.php

  This capacitive sensing method requires two microcontroller pins (send pin, receive pin)
  with a high value resistor between them (1M is a starting point)
  a small capacitor (20-40 pf) from the receive pin (the sensor is connected to this pin)
  to ground will result in more stable readings. Sensor is any wire or conductive foil
  on the receive pin.

  Also demonstrates a simple smoothing filter which is not required in any way
  by the sketch
*/


// CapTouch(sendPin, receivePin) - recieve pin is the sensor to touch
CapTouch touch_2_3 = CapTouch(2, 3);
CapTouch touch_4_5 = CapTouch(4, 5);
CapTouch touch_6_7 = CapTouch(6, 7);

float light;
float shower_light;
float mirror_light;

void setup()
{
  pinMode(10, OUTPUT);
  digitalWrite(10, 1);
  pinMode(11, OUTPUT);
  digitalWrite(11, 1);
  pinMode(13, OUTPUT);
  digitalWrite(13, 1);
}

void loop()
{

  long start = millis();                    // scheme to time performance, delete at will
  long light_sensor =  touch_2_3.readTouch(90);    //  read the sensor
  long shower_light_sensor =  touch_4_5.readTouch(90);
  long mirror_light_sensor =  touch_6_7.readTouch(90);
  long elapsedTime =  millis() - start;     // scheme to time performance, delete at will

  // simple lowpass filter to take out some of the jitter
  // change parameter (0 is min, .99 is max) or eliminate to suit
  // you need a different "smoothed" variable for each sensor is using more than one
  light = smooth(light_sensor, .95, light);
  shower_light = smooth(shower_light_sensor, .95, shower_light);
  mirror_light = smooth(mirror_light_sensor, .95, mirror_light);

  if (light >= 2000 || shower_light >= 2000 || mirror_light >= 2000)
  {
    if (light >= 2000) {
      digitalWrite(11, 0);
      delay(50);
      digitalWrite(11, 1);
    }
    else if (shower_light >= 2000) {
      digitalWrite(10, 0);
      delay(50);
      digitalWrite(10, 1);
    }
    else if (mirror_light >= 2000) {
      digitalWrite(13, 0);
      delay(50);
      digitalWrite(13, 1);
    }
    delay(500);
  }
  delay(10);
}



// simple lowpass filter
// requires recycling the output in the "smoothedVal" param
float smooth(float data, float filterVal, float smoothedVal) {

  if (filterVal > 1) {     // check to make sure param's are within range
    filterVal = .99;
  }
  else if (filterVal <= 0) {
    filterVal = 0;
  }

  smoothedVal = (data * (1 - filterVal)) + (smoothedVal  *  filterVal);

  return smoothedVal;
}

Il y a des infos ici sur le choix des composants:

Here are some guidelines for resistors but be sure to experiment for a desired response.

  • Use a 1 megohm resistor (or less maybe) for absolute touch to activate.
  • With a 10 megohm resistor the sensor will start to respond 4-6 inches away.
  • With a 40 megohm resistor the sensor will start to respond 12-24 inches away (dependent on the foil size). Common resistor sizes usually end at 10 megohm so you may have to solder four 10 megohm resistors end to end.
  • One tradeoff with larger resistors is that the sensor’s increased sensitivity means that it is slower. Also if the sensor is exposed metal, it is possible that the send pin will never be able to force a change in the receive (sensor) pin, and the sensor will timeout.
  • Also experiment with small capacitors (100 pF - .01 uF) to ground, on the sense pin. They improve stability of the sensor.

Note that the hardware can be set up with one sPin and several resistors and rPin’s for calls to various capacitive sensors. See the example sketch.

D’autres infos ici

Oui j’ai déjà lu ces documentations.
Mais du coup entre mes phases de test et d’applications réel pour moi il n’y a que la distance de “l’antenne de réception” qui change et du coup j’aimerais savoir si c’est ça qui peut poser problème, du fait de la longue distance.

J’ai commandé des feuilles de cuivre que je vais recevoir aujourd’hui, pour en placer un bout à la fin de mon antenne voir si ça change quelque chose.

image

Dans ma colonne de gauche, j’ai fait le schéma situé ici avec une résistance de 51MOhm, je trouve que les valeurs sont très volatiles.

Par contre les deux autres colonnes J’ai fait avec deux résistances voir schéma ci dessous.

L’ESP32 a des pins configurables en entrée capacitive, sans avoir besoin de composants extérieurs. Pour des distances importantes, relier le point touché à la carte par un câble coaxial avec l’écran à la masse.

Ok merci de la réponse, je n’avais pas pensé au câble coaxiale, je vais essayé ça dans l’après-midi, et je viendrais apporté mon retour à la suite.

Après je ne veux pas que ce soit du toucher mais de la détection à l’approche de la main, c’est pour ça que j’ai mis la résistance. Mais je pense que je descendrais sa valeur à 10MOhm.

Bonjour
Vérifiée comment la mise à la terre effective ?
l’utilisation d’un bloc secteur n’entraine pas automatiquement la mise à la terre “reelle”
je dirais que c’est même plus souvent l’inverse

Ah non mais oui effectivement mon bloc secteur est classe 2 donc pas de MALT sur celui ci, mais j’ai relié mon GND directement à mon circuit de terre.

Comment effectivement ? Quel cablage reel ?

La “terre” disponible a été mesurée/verifiée ?
parce que ce n’est pas rare du tout de trouver des installs “domestiques” où la supposée “terre” n’est finalement reliée à… RIEN

J’ai mes arrivées, lumières et prises de courant qui arrivent dans mon grenier, donc avec une terre, qui elle sont reliées à ma barrette de terre dans mon coffret électrique, et cette barrette qui est elle même reliée à mon piquet de terre dans ma cave, avec une mesure de terre à 50 Ohm.

ok 50 Ω c’est dans les clous

tu (re)pique la terre vers le GND arduino comment ?
un simple bout de fil vers un pinoche de terre dispo sur une PC ?

A lire

Un fil qui va du GND arduino sur un Wago où j’ai ma terre

Alors, essai avec le câble coaxiale d’une longueur de 4m environ, de base la fonction capacitiveSensor() me retourner un statut -2, j’ai changé la valeur de CS_Timeout_Millis à 5 secondes, mais le programme est beaucoup plus lent du coup, du fait que la mesure prenne plus de temps .
D’après ce que je comprend la distance au niveau des câbles est quand même contraignante.

Est ce que si je place cette longueur entre l’arduino et ma résistance plutôt qu’entre ma résistance et mon point de détection cela pourrait-il aidé ?

Pour utiliser un capteur capacitif, il faut essayer de réduire au minimum les capacités parasites.
Il faut bien comprendre que la variation de capacité mesurée avec et sans doigt est relativement faible. Le simple fait d’avoir 4m de câble entre le capteur et l’entrée de mesure pose un problème. Ces 4m de câble apportent une capacité parasite bien supérieure à celle que tu veux mesurer. Du coup, la variation de capacité doit se trouver dans le bruit de mesure.

Une solution :


Ces modules sont en vente sur AliExpress. Leur sortie est basse impédance.

fdufnews Alors oui du coup, j’ai fait un essai en mettant un câble coaxial justement pour le ReceivePin, et avec le blindage du coaxial c’est beaucoup mieux, après à mettre en pratique ça va être beaucoup plus chiant.

hbachetti oui j’avais vu ces modules, je voulais le faire par moi même, mais du coup dans mon cas ça va être très compliqué avec la distance donc du coup oui je pense que ce module va être ma solution. Merci, aurais tu le lien du produit s’il te plaît ?

https://fr.aliexpress.com/item/1005001688869291.html?spm=a2g0o.productlist.0.0.63f71bcatbT1dW&algo_pvid=null&algo_expid=null&btsid=2100bde316196871751197794ecbc9&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_

Merci

A la base, c’est un produit Heltec (les mêmes qui font des cartes ESP32 et autres)
Voir leur boutique où il y a plus d’info. En particulier il y a un mode contact permanent ou momentané.