Capacitive sensor et une LED Sequin qui fade

Bonjour a tous !

Je vous écris car j'ai un petit bug sur un projet que je fais, je précise que je suis novice dans le monde de l'arduino !

Mon projet :
Une LED sequin dans une fausse fleur, un fil conducteur (adafruit aussi, fil de couture conducteur) enroulé autour de la fausse plante relié a la fonction de capacitive sensor, pour que la LED caché dans les pétales s'active lorsqu'on touche la fleur (oui je suis une romantique). Pour un effet scintillant, j'ai donné une fonction de fading a ma LED, qui alterne un petit fade in et fade out non stop jusqu’à ce qu'on ne touche plus la fleur. Je voulais aussi que le fade reparte a zéro lorsqu'on lâche la fleur, c'est a dire que si quand on lâche la fleur la LED était a sa luminosité maximum, le fade repartira a zéro au prochain contact, je trouve que ça donne une effet plus naturel.

Set up :
Arduino UNO board, LED sequin output pin 9 + GND, Capacitive sensor sur pin 4 et 8 (avec une résistance 1M).

Le code :

 #include <CapacitiveSensor.h>

CapacitiveSensor   cs_4_8 = CapacitiveSensor(4,8);

int led = 9;           // the PWM pin the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by


void setup()                    
{
   cs_4_8.set_CS_AutocaL_Millis(0xFFFFFFFF);// turn off autocalibrate on channel 1 - just as an example
   Serial.begin(9600);
   pinMode(9,OUTPUT);
}

void loop()                    
{
 long sensor1 =  cs_4_8.capacitiveSensor(50);

    Serial.println(sensor1);  // print sensor output 
   if(sensor1 >= 1000)
   {
    // digitalWrite(9,HIGH);
    analogWrite(9, brightness);
    brightness = brightness + fadeAmount;
    if (brightness <= 0 || brightness >= 125) {
    fadeAmount = -fadeAmount;
  }
    delay(50);
   }
   else{
    digitalWrite(9,LOW);
   // brightness = 0;           //brightness back to 0 when not touch
   }
}

Mon problème :

Jusqu'ici tout fonctionne bien avec ce set up et ce code. Quand le sensor est actif, la LED effectue son scintillement correctement, et si je ne suis plus en contact avec la fleur, le fade reprendra a zéro au prochain contact. Le seul hic c'est que si je lâche la fleur pendant que la LED est en fade out puis que je la touche de nouveau, la LED flash très rapidement, comme si la fonction HIGH et LOW se contredisait a ce moment la. Cela arrive seulement quand la LED est en train de fade out.
J'ai cherché des troubleshooting de LED sequin en mode fade mais je ne trouve rien...
J’espère que c'est assez clair et que quelqu'un aura une idée d’où peu venir mon problème.

Merci d'avance !

et tout simplement en décommentant cette ligne, de sorte qu'elle fasse ce qui est dit justement dans le commentaire ?

 // brightness = 0;           //brightness back to 0 when not touch

et moi je rajouterai aussi

fadeAmount = 5;

ou encore pour ne pas écrire la valeur en dur :

if ( fadeAmount<0 ) fadeAmount = -fadeAmount;

juste après, pour être sur d'être "dans le bon sens" dès le début
ou alors il faut placer le test sur le sens de variation en début et non en fin du code executé quand le bouton est actif

Oups désolé j'avais mis le //brightness = 0; en off pour un petit test j'avais oublié de le remettre quand je l'ai copié ^^

J'ai testé avec le fadeAmount = 5; et ça fonctionne !! La LED ne flash plus :slight_smile:

Merci beaucoup !! :slight_smile:

cool

il vaut mieux utiliser la seconde proposition, comme ça si tu dois changer la valeur de fadeAmount tu ne dois le faire que au début.

ce qui se passait, c'est que lors d'une reprise après un arrêt durant un fade out, ta valeur de fadeAmount était à -5, donc tu repart de zéro et la première fois tu affiche la valeur de brightness avec du coup 0-5 = -5, sauf que analogWrite attends une valeur positive entre 0 et 255, mais ne vérifie pas si la valeur est bien dans cette plage.
Du coup si tu lui envoie -5, le bit de signe est considéré comme sur un nombre non signé, et en fait la valeur réelle prise en compte est du coup 65531, donc tu allume la led à pleine puissance durant le premier tour de boucle, soit en gros pendant 50ms (durée du delay de ta boucle)

exemple pour comprendre :

int truc = -5;
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
Serial.print("truc=");
Serial.println(truc);
Serial.print("truc non signé=");
Serial.println((unsigned int)truc);

}

void loop() {
  // put your main code here, to run repeatedly:

}

ce qui donne dans la console :

truc=-5
truc non signé=65531