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;
}
}