Merci Bearcorrupted mais j'ai pas tous pigé
Bon en essayant de m'inspiré de ce que j'ai compris avec ton lien voila ce que j'ai pondu.
La V0.2 en quelque sorte.
/*
*
Teste avec organisation en fonction() dirigé par un switch case
_____________________________________________________________
*/
#include <Adafruit_NeoPixel.h>
#define BI 8 // incremente en mode pullup
#define BD 7 // decremente en mode pullup
#define PIXEL_PIN 6 // DI ws2812b
#define Trig 12 // emeteur hcsr04
#define Echo 13 // recepteur hcsr04
#define SharpD A3 // reception sharps droit
#define SharpG A4 // reception sharps gauche
#define NBLED 3 // proto sans alim supplementaire 28 au final
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NBLED, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
byte divi = 5;
int cumul = 0;
long rEcho = 0;
long mEcho = 0;
long dEcho = 0;
long bEcho;
byte bVb;
byte cVb;
bool etatI;
bool etatD;
bool oldI = HIGH;
bool oldD = HIGH;
int index = 0;
//Stock de variable
void setup() {
Serial.begin(9600); //ouverture port com
strip.begin(); // initialise ruban
strip.show(); // refresh null
pinMode(Trig, OUTPUT); // sortie hcsr04
digitalWrite(Trig, LOW); // 0 par defaut
pinMode(Echo, INPUT); // reception hcsr04
pinMode(SharpD, INPUT); // voltage sharp
pinMode(SharpG, INPUT); // voltage sharp
pinMode(BI, INPUT_PULLUP); // Boutton +
pinMode(BD, INPUT_PULLUP); // Boutton -
}
void loop() {
mEcho = lecture_echo(); // fonction pour lire "Divi" fois la valeur hcsr04 pour une moyenne
rEcho = constrain(mEcho, 500, 1000); // renvoie uniquement les valeur comprise entre
cVb = map(rEcho, 500, 1000, 255, 0); // 255 lorsque echo faible 0 si sup a 1000
bEcho = constrain(mEcho, 1000, 3000); // renvoie uniquement les valeur comprise entre
bVb = map(bEcho, 3000, 1000, 255, 0); // 255 lorsque 3000 et zero jusqua 1000
// boucle découte des switch
etatI = digitalRead(BI);
if (etatI == LOW && oldI == HIGH) { // si nouvelle pression
delay(10); // anti parasite
etatI = digitalRead(BI); // enregistre le nouvelle etat
if (etatI == LOW) { // si letat est appuyer incrementer l'index
index++;
if (index > 5) { // jusqua 5
index = 0;
}
}
}
oldI = etatI; // memorise letat
etatD = digitalRead(BD);
if (etatD == LOW && oldD == HIGH) { //idem pour décrementer l'index
delay(10); // anti parasite
etatD = digitalRead(BD);
if (etatD == LOW) {
index--;
if (index < 0) {
index = 5;
}
}
}
oldD = etatD;
// on affiche l'animation correspondante avec l'onglet
onglet(index);
Serial.println(":");
Serial.print(index); // debug
}
void onglet(int i) {
switch (i) {
case 0: Serial.println("off"); delay(150); couleurSimple(strip.Color(0, 0, 0), 150);
break;
case 1: couleurSimple(strip.Color(bVb, 0, 0), 150);
// si très loin s'allume fort , extinction lorsque inférieur a 1000
break;
case 2: couleurSimple(strip.Color(cVb, 0, 0), 50);
// si très proche s'allumé fort. extinction lorsque plus loin que 1000
break;
case 3: couleurSimple(strip.Color(cVb , bVb, 0), 50);
// on joue avec les nuances
break;
case 4: couleurSimple(strip.Color(~cVb, 0, 0), 50);
// on essaye un peu tout et n'importe quoi
break;
case 5: couleurSimple(strip.Color(0, ~bVb-cVb, ~cVb), 150);
// vraiment n'importe quoi mais sa clignote quand entre 800 et 1200 c'est jolie
break;
}
}
void couleurSimple(uint32_t c, uint8_t temp) { // convertis c en 32bits et temp 8bit
for (uint16_t i = 0; i < strip.numPixels(); i++) {
// boucle pour chaque led
strip.setPixelColor(i, c);
strip.show();
// envoie sur led X couleur Y puis l'affiche
delay(temp);
}
}
long lecture_echo() { // renvoie une moyenne de mesure
for (int n = 0; n < divi; n++) {
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
dEcho = pulseIn(Echo, HIGH);
cumul = cumul + dEcho;
}
mEcho = cumul / divi;
cumul = 0;
return mEcho;
}
Si quelqu'un peut me dire ce qu'il en pense.
Pour ce qui est des teste in situ j'ai noté 4 valeur clé avec le detecteur ultrason dans l'environnement et les situations qui m’intéresse.
De 200 à 700 :
Quelqu'un proche du capteur
De 700 à 1200 :
Quelqu'un se tien loin du capteur
De 1200 à environ 3000 :
Quelqu'un passe entre le mur et le capteur
Au dessus de 3000 rien n'est dans son champs.
Par contre après quelque test avec les capteurs infrarouge j'ai du grand n'importe quoi je suis passablement déçu.
Au mieux j'ai une valeur qui répond bien au variation de distance entre 15cm et 60cm.
Mais devoir être en dessous de 50~60cm ça ne m’intéresse pas dans mon fonctionnement , je ne veut pas avoir a " touché " le miroir.
Ducoup je crois que je vais commander un ou deux autre capteur ultrason.
D'ici la je continue à cherché des façons de bien géré mes couleurs.