cherche à faire un switch capacitif avec un Attiny85

Bonjour, Je suis un peu noob en programmation et je cherche à réaliser un switch capacitif afin de basculer entre plusieurs mode de fonctionnement d'un strip neopixel.

Pour ce faire, je dispose d'une part, d'un code qui fonctionne très bien pour switcher grâce à un bouton poussoir et d'autre part un code qui permet d'éteindre et allumer une led grâce à un capteur sensitif DIY (CapacitiveSensor.h)

Cela fait des heures que je cherche à intégrer l'un à l'autre pour des résultats assez décevants pour le moment... en fait j'ai bien une réaction mais... aléatoire...

Le montage électronique est très simple:
un strip neopixel sur la broche 0
une résistance d'1Mohm entre les broches 3 et 4

Voici mes codes, j'espère que quelqu'un pourra m'aider et je vous remercie chaleureusement par avance!
J'espère avoir fourni suffisamment d'infos et que mon code ne vous fera pas trop saigner des yeux!!

Le premier code, celui qui fait s'allumer et s'éteindre une led par simple contact (fonctionne parfaitement sur l'arduino leonardo)

#include <CapacitiveSensor.h>
#define CAPA1 8                                              //sur un arduino leonardo
#define CAPA2 9                                              //une résistance 1Mohm entre les broches 8 et 9
#define OUT 2                                                //une led et sa resistance sur la broche 2
CapacitiveSensor   cs_2_4 = CapacitiveSensor(CAPA1,CAPA2);   
  
int state = LOW;  
int r;           
int p = LOW;    
long time = 0;       
long debounce = 200;

void setup()
{
  pinMode(CAPA2, INPUT);
  pinMode(OUT, OUTPUT);
}

void loop() 
{
  r = digitalRead(CAPA2);
  if (r == HIGH && p == LOW && millis() - time > debounce) {
    if (state == HIGH)
      state = LOW;
    else 
      state = HIGH;
    time = millis();    
  }
  digitalWrite(OUT, state);
  p = r;
}

Le deuxième code, celui qui permet de switcher grâce à un bouton poussoir entre plusieurs modes sur un strip neopixel (fonctionne parfaitement sur un attiny85)

#include <Adafruit_NeoPixel.h>
#define BUTTON_PIN   1
#define PIXEL_PIN    0
#define PIXEL_COUNT 9
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRBW + NEO_KHZ800);

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.show(); 
}

void loop() {

    debounce();
    rainbow(100);
    debounce();
    rainbow(10);
    debounce();
    rainbow(5);

}

void rainbow(uint8_t wait) {
    for(;;) {
        uint16_t i, j;

        for (j = 0; j < 256; j++) {
            for (i = 0; i < strip.numPixels(); i++) {
                strip.setPixelColor(i, Wheel((i + j) & 255));
            }
            strip.show();
            delay(wait);
            if(digitalRead(BUTTON_PIN) == LOW) {
                return;
            }
        }
    }
}


uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

void debounce() {
    unsigned long start = millis();
    while(millis() - start < 20UL) {
        if(digitalRead(BUTTON_PIN) == LOW) {
            start = millis();
        }
    }
}

Le troisième code, celui que je m'évertue à faire fonctionner en vain (toujours une un attiny85)

//essai de switch sensitif 

//concerne le pilotage des neopixel
#include <Adafruit_NeoPixel.h>
#define PIXEL_PIN    0                                            // un strip de 9 leds GRBW sur la broche 0
#define PIXEL_COUNT 9
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRBW + NEO_KHZ800);

//concerne la gestion du switch capacitif
#include <CapacitiveSensor.h>
#define CAPA2 3                                                   //une résistance 1Mohm entre les broches 3 et 4
#define CAPA1 4                                                   //dont la broche 4 est reliè a gnd
CapacitiveSensor   cs_2_4 = CapacitiveSensor(CAPA1,CAPA2);
  
int state = LOW;  
int r;           
int p = LOW;    
long time = 150;       
long debounce = 200;

void setup() {
  strip.begin();
  strip.show(); 
  pinMode(CAPA1, INPUT);
  pinMode(CAPA2, INPUT);
}

void loop() {
  
    capa;
    rainbow(1);
    capa;
    rainbow(10);

}

void rainbow(uint8_t wait) {
    for(;;) {
        uint16_t i, j;

        for (j = 0; j < 256; j++) {
            for (i = 0; i < strip.numPixels(); i++) {
                strip.setPixelColor(i, Wheel((i + j) & 255));
            }
            strip.show();
            delay(wait);
            if(digitalRead(CAPA1) == HIGH) {
                return;
            }
        }
    }
}


uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}



void capa() {
    r = digitalRead(CAPA2);
  if (r == HIGH && p == LOW && millis() - time > debounce) {
    if (state == HIGH)
      state = LOW;
    else 
      state = HIGH;
    time = millis(); 
    p = r;   

}
}

Bonjour,

Il faut certainement essayer le premier programme sur l'attiny85 pour voir si elle fonctionne bien comme sur la uno.

Une fois fait, il faudra s'attaquer à la fusion des deux.

Je pense que les timmings doivent être important pour ces applications.

Bonne bidouille ..à suivre.

Merci Leptro pour ta réponse.
Le premier code fonctionne très bien sur l'Attiny85 aussi, je viens de faire le test, la led switche bien quand je touche mon "capteur"
Pour le troisième code, ça switche parfois de rainbow(1) vers rainbow(10) mais souvent ça relance rainbow(1).

Je suis d'accord, il doit s'agir d'un problème de timing, j'ai joué sur les paramètres "time" et "debounce" au petit bonheur mais j'ai pas trouvé de valeurs satisfaisantes. Ça dépasse mes compétences!
Pour moi c'est vraiment un problème de code qui ne doit pas être très compliqué, mais... un peu trop pour moi!

Des idées... je suis preneur...

Je ne vais pas laisser tomber, je suis sûr qu'il est possible de réaliser simplement ce genre de dispositif.
Mais je me suis tout de même commandé des modules tout fait dans le doute...

L'ennui c'est que je souhaite utiliser un objet métallique comme surface sensitive, et je ne sais pas si c'est possible avec ces modules.