Probleme Bouton capacitif ESP32 parasites

Bonjour à tous,

J'étais venu à vous il y a quelques temps pour mettre en place un bouton poussoir pour activer un Wake on lan sur un ESP32, cela fonctionne parfaitement mais j'ai appris qu'on pouvait utiliser certaines pin comme des boutons capacitif en regardant ceci https://randomnerdtutorials.com/esp32-touch-pins-arduino-ide/

J'ai donc adapté le dernier exemple du lien pour qu'en touchant la pin 33 la led s'allume et le wakonlan se lance mais j'avais comme des "parasites" et donc la led s'allumé et le wakeonlan se lancé alors que je n'avais pas touché la pin.
Pour palier à ce problème je me suis dit qu'en ajoutant une condition, si je touche la pin pendant 3 secondes alors j'allume la led et le wakeonlan, après une semaines de recherches je fini par trouver le "comment faire" sans trop vraiment comprendre (je suis tout nouveau dans ce domaine) , mais j'ai toujours ces parasites qui allume la led et le wakeonlan sans rien toucher et il arrive aussi qu'il ne prenne pas en compte ces 3 secondes donc je me retrouve au point de départ.

Je m'arrache littéralement les cheveux avec ça, j'en suis rendu à revenir vers vous dans l'espoir de trouver de l'aide.
Voici le code:
Merci à vous.

#include <WiFi.h>
#include <WiFiUdp.h>

#include <WakeOnLan.h>


// set pin numbers
const int touchPin = 33; 
const int ledPin = 16;

const int threshold = 40;    // change with your threshold value
int touchval = 10;                // variable for storing the touch pin value 

int period = 3000;
unsigned long time_now = 0;


WiFiUDP UDP;
WakeOnLan WOL(UDP);

const char* ssid     = "ssid";
const char* password = "password";


void wakeMyPC() {
    const char *MACAddress = "MACAddress";
}

void setup(){

  pinMode (ledPin, OUTPUT);    
  pinMode (touchPin, INPUT);   
  
  WOL.setRepeat(3, 100); 
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  (WiFi.status() != WL_CONNECTED) ;
}


void loop(){
 
  touchval = touchRead(touchPin);
  Serial.print(touchval);

          
  if(touchval < threshold)
  {

    if((unsigned long)(millis() - time_now) >= period)
    {
      time_now = millis();
      // turn LED on
      digitalWrite(ledPin, HIGH);
      Serial.println(" - LED on");
      WOL.calculateBroadcastAddress(WiFi.localIP(), WiFi.subnetMask()); // Optional  => To calculate the broadcast address, otherwise 255.255.255.255 is used (which is denied in some networks).
      wakeMyPC();
    }
  }
  else{

    // turn LED off
    digitalWrite(ledPin, LOW);
    Serial.println(" - LED off");
  }
  delay(1000);
}

Bonjour @xkain

le positionnement du seuil ne permet pas d'éliminer les déclenchements intempestifs ?

if(touchval < threshold)

avec un test de ce type baisser le seuil pour que seuls des touchers 'francs' soient détectés.

Avec le code suivant je visualise la valeur de repos obtenue par touchRead(33) ou touchRead(T8) : environ 83.
(Elle dépend de la surface de la partie métallique reliée au GPIO)
Un toucher de la petite surface métallique reliée à GPIO33 baisse la valeur à 10 -> un seuil vers 15 ou 20 convient, si je mets le seuil à 80 ça devient un détecteur de proximité !

`/*
test touche capactitive sur GPIO33 alias T8
*/
int threshold = 15;

void setup() {
  Serial.begin(115200);
}

void loop() {
  if ( touchRead(33) < threshold) {
    Serial.println("Touch 8 détecté, GPIO33");
  }
  
//Serial.println(touchRead(33));

delay(500);
}`

On trouve aussi divers exemples dans le groupe 'ESP32/'Touch' fourni avec l'extension ESP32 pour IDE Arduino : TouchButton......

1 Like

Bonsoir al1fch

Tout d'abord merci, à présent je comprends correctement la fonction de threshold, la valeur au repos avec le code complet je suis autour des 45, j'étais persuadé que de devais mettre le threshold au plus proche de cette tranche.
Code modifié, c'est un peu mieux mais il arrive encore que ma valeur au repos se retrouve à 6 (donc déclenchement de la led et wakeonlan) pour une raison inconnu sans avoir eu de contact

Voici le code modifié suivant vos recommandations:

#include <WiFi.h>
#include <WiFiUdp.h>

#include <WakeOnLan.h>


// set pin numbers
const int touchPin = T8;
const int ledPin = 16;

const int threshold = 10;    // change with your threshold value

int period = 3000;
unsigned long time_now = 0;


WiFiUDP UDP;
WakeOnLan WOL(UDP);

const char* ssid     = "ssid";
const char* password = "password";


void wakeMyPC() {
    const char *MACAddress = "MACAddress";
}

void setup(){

  pinMode (ledPin, OUTPUT);     
  
  WOL.setRepeat(3, 100); 
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  (WiFi.status() != WL_CONNECTED) ;
}


void loop(){
 
  Serial.print(touchRead(T8));

          
  if(touchRead(T8) < threshold)
  {

    if((unsigned long)(millis() - time_now) >= period)
    {
      time_now = millis();
      // turn LED on
      digitalWrite(ledPin, HIGH);
      Serial.println(" - LED on");
      WOL.calculateBroadcastAddress(WiFi.localIP(), WiFi.subnetMask()); // Optional  => To calculate the broadcast address, otherwise 255.255.255.255 is used (which is denied in some networks).
      wakeMyPC();
    }
  }
  else{

    // turn LED off
    digitalWrite(ledPin, LOW);
    Serial.println(" - LED off");
  }
  delay(1000);
}

Merci pour votre temps, l'air de rien vous m'avez fait avancer.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.