photobooth avec neopixel ring 60 adafruit

Accueil/Projets/photobooth avec neopixel ring 60 adafruit
photobooth avec neopixel ring 60 adafruit 2015-05-11T10:21:24+00:00

Accueil Forums Projets photobooth avec neopixel ring 60 adafruit

15 sujets de 1 à 15 (sur un total de 16)
  • Auteur
    Messages
  • zygomatique
    Participant
    Nombre d'articles : 13
    #8669 |

    Bonjour à tous. je vais avoir besoin de votre aide pour un projet dans lequel je me lance.

    Une première chose me pose problème, le transfert d’un programme dans ma carte. mais avant de poser mes questions, je vais vous faire un état des lieux et un cahier des charges.

    Je suis photographe de mariage et j’ai fabriqué un photobooth.
    LE PHOTOBOOTH est un boitier dans avec lequel les invités d’un mariage (dans mon cas) se prennent en photos seuls en appuyant sur un boutons. (un peu dans l’idée des photomatons)
    Voici à quoi ressemble mon boitier
    boitier photobooth

    description du contenu du boitier
    partie haute :
    derrière la plaque opaque : deux flashs alimenté en 220v pilotés en filaire depuis l’appareil photo autour du trou derrière la plaque opaque : un anneau neopixel ring 60 entourant l’objectif.
    à travers le trou : l’objectif monté sur l’appareil photo

    au milieu : l’écran hdmi branché sur l’appareil photo.

    en bas : un bouton à led vert

    Fonctionnement et raccordement de l’appareil photo

    -Depuis un contact sec (BP à fermeture sur l’arduino ?) l’appareil est déclenché.
    -Au déclenchement celui ci prend une photo.
    -L’écran permet de visualiser en permanence ce que voit l’appareil photo (live-view)
    -Une fois que la photo est prise celle ci apparaît pendant quelques secondes sur l’écran.
    -Au moment de la prise de vue l’appareil pilote les deux flash intégré.
    -Pour permettre à l’appareil un grande autonomie, la batterie est remplacée par un cordon directement mis en lieu et place de la batterie.
    -La carte mémoire dans l’appareil photo est une carte avec wifi intégré qui permet de transmettre les photos directement sur un Ipad (intégré au dos du photobooth). Les invités peuvent s’envoyer les photos par mail directement depuis l’appli specifique qui est verrouillée (l’ipad est lui aussi sur alim permanente)

    Je ne souhaite pas utiliser le timer de l’appareil photo car le choix, soit de 3, soit 10 secondes ne me semble pas judicieux (l’idéal me semble être 6 secondes)!

    C’EST LA QUE LA CARTE ARDUINO APPARAIT !

    Voici un cycle de fonctionnement tel que je souhaite le réaliser.

    Au repos :
    -l’écran montre ce que voit l’appareil photo
    -l’anneau autour de l’objectif est en « mode veille » (j’aime bien l’animation ou toutes les couleurs tournent doucement sur l’anneau)
    -le bouton vert est allumé fixe

    lors de l’appui sur le bouton vert (pendant une durée de 6 secondes)
    -l’écran montre toujours ce que voit l’objectif.
    -le bouton vert clignote allumé et éteint alternativement une fois par seconde (si l’alternance peut être gradué ça serait top)
    -l’anneau est tout vert et devient progressivement rouge (le choix des couleurs n’est pas vraiment fixé)

    Au bout des 6 secondes (durée de l’action : 10 sec)
    -un contact sec sur l’arduino est fermé pendant une demie secondes pour prendre la photo via le cordon de commande branché sur l’appareil photo(ne pas envoyer de tension dedans).
    -l’anneau clignote très rapidement en blanc pendant une secondes, puis alterne entre éteins et allumé graduellement pendant 9 secondes (en bleu par exemple) pour signifier que la photo est en train d’être traité et va apparaître sur l’écran et sur l’ipad.
    -le bouton vert est éteint et inactif pendant 10 secondes.

    Au bout des 10 secondes
    fin du cycle

    voila l’idée globale !

    J’ai pour ce faire investi dans une carte arduino Uno R3, une alimentation 5V, et les éléments neopixel ring 1/4 60 (4 piéces à souder ensemble.)

    enfin j’ai téléchargé le logiciel arduino pour faire la liaison entre la carte arduino et l’ordinateur (un Imac) ainsi que les codes nepixelring pour faire fonctionner l’anneau.

    NOTE : je garde sous le coude l’idée que trois ou quatres photos consécutives soient prises à une intervalle de 3 secondes !

    Seulement voila…

    PREMIER OBSTACLE :

    quand je lance le transfert de la commande neopixel « standard » (des lignes de commandes qui permettent de créer une animation basique sur l’anneau), le transfert ne fonctionne pas. j’ai un message d’erreur.

    Merci d’avance pour l’aide que vous m’apporterez !

    David

    zygomatique
    Participant
    Nombre d'articles : 13

    voici le code que j’ai tenté de transférer sur la carte arduino sans succès

    ————————————————————————-

    #include <Adafruit_NeoPixel.h>
    #include <avr/power.h>
    
    #define PIN 6
    
    // Parameter 1 = number of pixels in strip
    // Parameter 2 = Arduino 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)
    Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
    
    // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
    // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
    // and minimize distance between Arduino and first pixel.  Avoid connecting
    // on a live circuit...if you must, connect GND first.
    
    void setup() {
      // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
    #if defined (__AVR_ATtiny85__)
      if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
    #endif
      // End of trinket special code
    
      strip.begin();
      strip.show(); // Initialize all pixels to 'off'
    }
    
    void loop() {
      // Some example procedures showing how to display to the pixels:
      colorWipe(strip.Color(255, 0, 0), 50); // Red
      colorWipe(strip.Color(0, 255, 0), 50); // Green
      colorWipe(strip.Color(0, 0, 255), 50); // Blue
      // Send a theater pixel chase in...
      theaterChase(strip.Color(127, 127, 127), 50); // White
      theaterChase(strip.Color(127,   0,   0), 50); // Red
      theaterChase(strip.Color(  0,   0, 127), 50); // Blue
    
      rainbow(20);
      rainbowCycle(20);
      theaterChaseRainbow(50);
    }
    
    // Fill the dots one after the other with a color
    void colorWipe(uint32_t c, uint8_t wait) {
      for(uint16_t i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, c);
          strip.show();
          delay(wait);
      }
    }
    
    void rainbow(uint8_t wait) {
      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);
      }
    }
    
    // Slightly different, this makes the rainbow equally distributed throughout
    void rainbowCycle(uint8_t wait) {
      uint16_t i, j;
    
      for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
        for(i=0; i< strip.numPixels(); i++) {
          strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
        }
        strip.show();
        delay(wait);
      }
    }
    
    //Theatre-style crawling lights.
    void theaterChase(uint32_t c, uint8_t wait) {
      for (int j=0; j<10; j++) {  //do 10 cycles of chasing
        for (int q=0; q < 3; q++) {
          for (int i=0; i < strip.numPixels(); i=i+3) {
            strip.setPixelColor(i+q, c);    //turn every third pixel on
          }
          strip.show();
         
          delay(wait);
         
          for (int i=0; i < strip.numPixels(); i=i+3) {
            strip.setPixelColor(i+q, 0);        //turn every third pixel off
          }
        }
      }
    }
    
    //Theatre-style crawling lights with rainbow effect
    void theaterChaseRainbow(uint8_t wait) {
      for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
        for (int q=0; q < 3; q++) {
            for (int i=0; i < strip.numPixels(); i=i+3) {
              strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
            }
            strip.show();
           
            delay(wait);
           
            for (int i=0; i < strip.numPixels(); i=i+3) {
              strip.setPixelColor(i+q, 0);        //turn every third pixel off
            }
        }
      }
    }
    
    // Input a value 0 to 255 to get a color value.
    // The colours are a transition r - g - b - back to r.
    uint32_t Wheel(byte WheelPos) {
      WheelPos = 255 - WheelPos;
      if(WheelPos < 85) {
       return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
      } else if(WheelPos < 170) {
        WheelPos -= 85;
       return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
      } else {
       WheelPos -= 170;
       return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
      }
    }
    • Cette réponse a été modifiée le il y a 2 ans et 2 mois par  arnaud39.
    zygomatique
    Participant
    Nombre d'articles : 13

    j’ai réussi à transférer le programme (me demandez pas comment. je crois qu’il fallait ouvrir le port ?)

    voici la vidéo de l’animation correspondant au programme çi dessus.

    https://youtu.be/Imt3qr6fxlQ

    zygomatique
    Participant
    Nombre d'articles : 13

    j’ai depuis un peu fouiné dans les lignes du programme et j’ai à peu prêt trouvé ce que je cherche (à l’exception d’un allumage simple d’une couleur)

    je dois maintenant incrémenter une entrée pin pour le bouton poussoir et que l’appui sur le BP lance une séquence.
    puis programmer l’arduino pour qu’en dehors de la séquence l’anneau soit constamment en mode rainbowcycle

    enfin je dois piloter un contact sec avec l’arduino pour que XX secondes après l’appui sur le BP il se ferme pendant 1/2 seconde… et alors là… je seche !

    • Cette réponse a été modifiée le il y a 2 ans et 2 mois par  zygomatique.
    zygomatique
    Participant
    Nombre d'articles : 13

    Après avoir lu dans tout les sens les tutos, je pense que l’investissement dans une petite carte avec 4 relais devrait répondre à mon besoin et simplifier ma programmation. Chose faite chez amazon. Demain donc, je reçois ma carte et je pourrais donc :
    via un premier relais : désactiver le bouton pendant la séquence
    via un second relais : jouer sur l’allumage ou nom de ma led incorporée au bouton
    via un troisième relais : fermer pendant une demie seconde un contact sec pilotant mon appareil reflex…

    il faut donc maintenant que je regarde comment ça se passe au niveau programmation…:)

    zygomatique
    Participant
    Nombre d'articles : 13

    j’ai encore fouillé un peu et je crois avoir trouver des fonctions pour la led de mon bouton vert

    blink : clignotant
    fade : variation progressive de la luminosité

    de plus dans les commandes proposées dans le logiciel arduino j’ai également trouvé la fonction
    « BUTTON »

    par contre je vais devoir modifier tout ça à ma sauce…

    Mais si Qqun veut bien m’orienter ça me ferra sans doute éviter bien des erreurs…

    arnaud9212
    Admin bbPress
    Nombre d'articles : 118

    Bonjour David,

    Je vois que tu as bien avancé dans ton projet,
    Pour utiliser les fonctions de bases comme clignotement d’une led, gestion des boutons, regarde les tutoriels les plus basiques de l’Arduino, afin de comprendres les fonctions telles que digitalWrite() et autres.
    Au niveau de la led de ton bouton, tu peux surement la relier directement à ton Arduino, sans relais, regarde pour cela le tutoriel consacré aux leds.
    Sinon, je pourrais t’aider dans la programmation si tu as du mal, mais avoir un schéma précis avec les différentes choses à faire, et les interactions du bouton serait une grande aide.

    zygomatique
    Participant
    Nombre d'articles : 13

    salut Arnaud.

    Merci pour ton message. je commençais à me sentir seul.:(

    j’ai effectivement trouvé la fonction « fading » (gradation) et « Blink » (clignotant) dans les « programmes » préexistant dans le logiciel de communication.

    l’idée est donc quand j’appui sur le bouton, que le led du bouton passe en mode blink pendant le temps de décompte puis en mode blink un fois la photo prise.
    Et pendant la durée de toute la « routine », un relais ouvre un contact pour inactiver le bouton poussoir.

    je fais un schéma pour expliquer le fonctionnement et je le poste ici.

    zygomatique
    Participant
    Nombre d'articles : 13

    voici la routine décrite :

    CYCLE DE FONCTIONNEMENT
    Au départ : en mode veille
    -Anneau en mode rainbowcycle
    -Relais du BP incatif
    -Relais appareil photo inactif)
    -Led BP allumé normalement
    A l’appui sur le BP :
    -Relais BP actif pendant 6 sec (pour ouvrir le contact du BP)
    -anneau en mode colorwipe (plusieurs fois de différentes couleurs) pendant 6 sec
    -led BP en mode Blink
    6 sec après l’appui sur le BP
    -Anneau en mode theaterChase pendant 1 sec
    -relais du BP toujours actif
    -led BP eteint
    1 seconde plus tard
    -relais du Reflex fermé pendant 1/2 sec
    -début de la séquence « rainbow » sur l’anneau pendant 10sec
    -relais du BP toujours actif
    -led BP en mode fading pendant 10sec
    retour au mode veille…

    et voici le schéma de branchement

    schéma de branchement photobooth

    zygomatique
    Participant
    Nombre d'articles : 13

    mes problèmes actuels

    comment lancer simultanément plusieurs action suite à un appui sur le BP

    comment mettre un delay avant une action (par exemple le led du BP est en mode fading au bout de 7 secondes pour une durée de 10 sec !

    en fait je dois lancer plusieurs actions, certaines avec un delay d’autres instantanément et toute avec une durée bien determinée.
    pour un meme recepteur (par exemple l’anneau) puis je mettre les action à la chaine ?

    comment mettre une partie du programme qui fonctionne ne mode veille ?

    arnaud9212
    Admin bbPress
    Nombre d'articles : 118

    Bonjour,

    Alors quelques points :
    – tout d’abord au niveau de la led du BP, elle ne passe pas par la librairie Adafruit, donc tu ne pourras pas utiliser les fonctions blink et fade, il te faudra les programmer toi-même, à l’aide de la librairie Timer par exemple : https://tutoarduino.com/portfolio-items/8555/?portfolioID=5389

    – Pour tout ce qui est delay, je te conseille fortement d’aller voir notre tutoriel sur les timers, cela te permettra d’appeller des fonctions, par exemple pour déclencher l’appareil photo, après un certain temps : https://tutoarduino.com/portfolio-items/8555/?portfolioID=5389

    – Pour lancer des actions simultanément, il te faut les mettre les unes après les autres, mais évite à tout prix la fonction delay() car elle met en pause l’Arduino, et tes actions ne seront donc plus simultanés, je te conseille donc encore une fois de te tourner vers les timers

    – Pour le bouton, pas besoin de le relier au relais, il suffit d’ignorer son action dans le programme si le mode est actif

    – Pour l’organisation de ton programme, je te conseil de réaliser un code à peu près de cette facon (je te met en commentaire ce qu’il faudra programmer:

    int mode = 0; // 0 = veille; 1 = actif
    void setup() {
    //tous les setups
    }
    
    void loop() {
    // si bouton appuyé et que on est en mode veille, on passe en mode actif
    if(bouton appuyé){
      if(veille){ 
         mode = actif;
         // tu lances tous les timers: anneau en colorwipe pour 6 sec, en theaterChase dans 6sec, rainbow dans 7 sec, retour en mode veille dans 17 sec (et même chose pour la led et l'appareil photo)
      }
      else ;
    
    }
     
    }
    
    void retourveille() { // cette fonction fait le retour en mode veille
      // eteind tous les timers
      // regle ta led et ton led circle
      mode = veille;
    
    }
    Declan Valdanec
    Participant
    Nombre d'articles : 13

    Voilà, si ça peut aider toutes les instructions pour faire un déclencheur automatique (via capteur de mouvement) d’un appareil photo
    Voici le matériel qu’il faut :

    1. Un boîtier NIKON D90
    2. Une télécommande filaire premier prix (Disponible [ici][1])
    3. Un arduino uno
    4. Un servomoteur
    5. Un capteur ultrasons
    6. Une breadboard
    7. Quatres afficheurs 7 segments
    8. Une touche de talent

    Achat de la télécommande

    La première étape consiste à acheter une télécommande qui va piloter le déclenchement de l’appareil photo. Celle ci suffit amplement : http://quent.in/Af9bg0
    Couper délicatement l’extrémité de la télécommande afin de ne pas détériorer les 3 fils qui se cachent sous la gaîne en plastique.
    Parmis ces 3 fils, on trouve un fil blanc, jaune et rouge.

    • Le contact du fil blanc (masse) et jaune permettent de faire l’autofocus.
    • Le contact du fil blanc (masse) et du fil rouge permettent de déclencher la capture.

    Schémas de montage

    • 2 optocoupleurs pour contrôler le mécanisme de focus et de shoot (et d’isoler l’appareil photo du reste du circuit) ;
    • 1 capteur ultrasons permettant de calculer la distance d’un obstacle (30° d’ouverture) ;
    • 1 servomoteur permettant au capteur ultrasons de balayer un champ plus large (180°) ;
    • 4 afficheurs 7 segments permettant de compter le nombre de photos prises.

    Schéma
    Schéma 2

    Et voici le code :

    /*
    ||
    || @author Yohann Lepage
    || @author Quentin Rousseau
    || @version 0.2
    ||
    || @description
    || PhotoCatch prend automatiquement une photo lorsque
    || quelqu'un passe devant l'appareil grace à son capteur
    || à ultra-son
    ||
    */
    
    #include <Servo.h>
    #include <SoftwareSerial.h>
    #define DEBUG true
    
    // Librairies utilisées
    // http://arduino.cc/en/Tutorial/Sweep
    // http://arduino.cc/en/Tutorial/Ping
    
    //7 Segments
    int rxSegPin =  0;
    int txSegPin  = 3;
    int photosCounter = 0;
    SoftwareSerial segSerial = SoftwareSerial(rxSegPin, txSegPin);
    
    // Ultra Son
    // Pin Ultra son
    int pingPin = 9;
    int val = 0;
    int ultrasoundValue = 0;
    int timecount = 0; // Echo counter
    
    // Appareil Photo
    // Pin Focus
    int focusPin = 5;
    // Pin Shoot
    int shootPin = 6;
    // Durée du focus
    int focusTime = 0;
    
    // Distance pour le shoot
    int shoot_threshold = 100;
    
    // Servo Moteur
    Servo myservo;
    // Pin Servo
    int servoPin = 10;
    // Position du Servo Moteur 0 - 180° 
    int pos = 0;
    
    // Démarrage de l'Arduino
    void setup()
    {  
        //Serial pour mode DEBUG
        if(DEBUG)
          Serial.begin(9600);    
        // Attachement du servo au servoPin 
        myservo.attach(servoPin);
        // Passage en mode Output pour l'ultra son
        pinMode(pingPin, OUTPUT);
        // Passage en Output pour le focus
        pinMode(focusPin, OUTPUT);
        // Passage en Output pour le Shoot
        pinMode(shootPin, OUTPUT);
        // Passage en low des focus et shoot
        digitalWrite(focusPin, LOW);
        digitalWrite(shootPin, LOW);
        //7 Segments
        segSerial.begin(9600);
        pinMode(rxSegPin, INPUT);
        pinMode(txSegPin, OUTPUT);
        
        segSerial.print("vv");
        //Turn Colon Off
        segSerial.print('4d',HEX);
        segSerial.print('00',HEX);
    }
    
    // Démarrage de la boucle principale
    void loop()
    {
    	// Appel à la méthode de balayage grace au servo
        sweep();
    }
    
    // Détection d'un objet
    void sonar()
    {
       // establish variables for duration of the ping, 
       // and the distance result in inches and centimeters:
       long duration, inches, cm;
    
       // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
       // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
       pinMode(pingPin, OUTPUT);
       digitalWrite(pingPin, LOW);
       delayMicroseconds(2);
       digitalWrite(pingPin, HIGH);
       delayMicroseconds(5);
       digitalWrite(pingPin, LOW);
    
       // The same pin is used to read the signal from the PING))): a HIGH
       // pulse whose duration is the time (in microseconds) from the sending
       // of the ping to the reception of its echo off of an object.
       pinMode(pingPin, INPUT);
       duration = pulseIn(pingPin, HIGH);
       
       Serial.print(microsecondsToCentimeters(duration));
       Serial.print(" cm\n");
       
       if(microsecondsToCentimeters(duration) <= shoot_threshold)
       {
         shoot();
       } 
       
       delay(150);
    }
    // Balayage avec le Servo
    void sweep()
    {
        for(pos = 0; pos < 90; pos += 1) // goes from 0 degrees to 180 degrees
        
        { // in steps of 1 degree
            myservo.write(pos); // tell servo to go to position in variable 'pos'
            //delay(15); // waits 15ms for the servo to reach the position
            sonar();
        }
        
        for(pos = 90; pos >=1; pos-=1) // goes from 180 degrees to 0 degrees
        
        {
            myservo.write(pos); // tell servo to go to position in variable 'pos'
            //delay(15); // waits 15ms for the servo to reach the position
            sonar();
        }
    }
    
    long microsecondsToCentimeters(long microseconds)
    {
       // The speed of sound is 340 m/s or 29 microseconds per centimeter.
       // The ping travels out and back, so to find the distance of the
       // object we take half of the distance travelled.
       return microseconds / 29 / 2;
    }
    
    //Display Photos Counter on the 7 Segments Display
    void displaySeg()
    {
      photosCounter = photosCounter +1 ;
      
      if(photosCounter < 10) 
      {
        segSerial.print("   ");
        segSerial.print(photosCounter);
      } 
      else if(photosCounter < 100) 
      {
        segSerial.print("  ");
        segSerial.print(photosCounter);
      } 
      else if(photosCounter < 1000) 
      {
        segSerial.print(" ");
        segSerial.print(photosCounter);
      } 
      else 
      {
        segSerial.print(photosCounter);
      } 
      
      Serial.print("Compteur photos : ");
      Serial.print(photosCounter);
      Serial.print("\n");
    }
    
    // Capture d'une photo
    void shoot()
    {
        // Focus
        digitalWrite(focusPin, HIGH);
        delay(focusTime);
        
        // Déclenchement de la photo 
        digitalWrite(shootPin, HIGH);
        delay(200);
        
        displaySeg();
        
        //  Remise à 0 des Pins
        digitalWrite(focusPin, LOW);
        digitalWrite(shootPin, LOW);
    }

    Sources : Github

    00PET
    Participant
    Nombre d'articles : 19

    Beau projet, j’attends la suite 🙂

    zygomatique
    Participant
    Nombre d'articles : 13

    je ne m’en sors pas avec les codes. mon bouton n’agit absolument pas… voici une premier commande rédigée a partir de la commande « button » dans la bibliothèque « digital » du logiciel arduino et les commandes adafruit

    voici ce que j’ai écrit

    ———————————————————–

    //parametre anneaux
    #include <Adafruit_NeoPixel.h>
    #include <avr/power.h>
    #define PIN 6
    Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);

    const int buttonPin = 2; // pin du bouton
    // le bouton est branche entre la borne 5V et la borne 2

    // variables will change:
    int buttonState = 0; // variable pour la lecture du status du bouton

    void setup() {

    strip.begin();
    strip.show(); // Initialisation des led de l’anneaux

    // initialise le bouton en tant qu’entree
    pinMode(buttonPin, INPUT);
    }

    void loop() {
    // lecture de l’etat de la valeur du bouton
    buttonState = digitalRead(buttonPin);

    // action du bouton au repos
    if (buttonState == LOW) // si l’etat du bouton buttonstate est egale a LOW
    {
    rainbowCycle(1);// alors l’anneaux sera en mode rainbowcycle
    }

    // action du bouton en action

    // puis
    // puis colorwipe devient bleu puis s’eteins en 6 secondes
    // et fin de l’animation

    if (buttonState == HIGH) { // si l’etat du bouton buttonstate est egale a HIGH
    // alors l’anneaux sera en mode colorwipe
    colorWipe(strip.Color(0, 155, 0), 20); // vert deux secondes
    colorWipe(strip.Color(50, 0, 0), 50); // rouge 5 secondes
    rainbow(1);// puis animation rainbow pendant 1 seconde juste avant prise de la photo

    //A ce moment prise de la photo (reste a programmer)

    colorWipe(strip.Color(0, 0, 100), 10); // puis allumage de l’anneau en bleu en une seconde
    colorWipe(strip.Color(0, 0, 0), 50); // puis extinction de l’anneau en 5 secondes
    }
    else {

    }

    }

    void colorWipe(uint32_t c, uint8_t wait) {
    for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
    }
    }

    void rainbow(uint8_t wait) {
    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);
    }
    }

    // Slightly different, this makes the rainbow equally distributed throughout
    void rainbowCycle(uint8_t wait) {
    uint16_t i, j;

    for(j=0; j<256*10; j++) { // 10 cycles de toutes les couleurs sur l’anneaux
    for(i=0; i< strip.numPixels(); i++) {
    strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
    }
    }

    // toute les couleurs repartie sur l’anneaux
    void rainbowCycle2(uint8_t wait) {
    uint16_t i, j;

    for(j=0; j<256*20; j++) { // 20 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
    strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
    }
    }

    //Theatre-style crawling lights.
    void theaterChase(uint32_t c, uint8_t wait) {
    for (int j=0; j<10; j++) { //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
    for (int i=0; i < strip.numPixels(); i=i+3) {
    strip.setPixelColor(i+q, c); //turn every third pixel on
    }
    strip.show();

    delay(wait);

    for (int i=0; i < strip.numPixels(); i=i+3) {
    strip.setPixelColor(i+q, 0); //turn every third pixel off
    }
    }
    }
    }

    //Theatre-style crawling lights with rainbow effect
    void theaterChaseRainbow(uint8_t wait) {
    for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
    for (int i=0; i < strip.numPixels(); i=i+3) {
    strip.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on
    }
    strip.show();

    delay(wait);

    for (int i=0; i < strip.numPixels(); i=i+3) {
    strip.setPixelColor(i+q, 0); //turn every third pixel off
    }
    }
    }
    }

    // Input a value 0 to 255 to get a color value.
    // The colours are a transition r – g – b – back to r.
    uint32_t Wheel(byte WheelPos) {
    WheelPos = 255 – WheelPos;
    if(WheelPos < 85) {
    return strip.Color(255 – WheelPos * 3, 0, WheelPos * 3);
    } else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 – WheelPos * 3);
    } else {
    WheelPos -= 170;
    return strip.Color(WheelPos * 3, 255 – WheelPos * 3, 0);
    }
    }

    ————-

    Le problème c’est que l’anneau fait son animation et le bouton n’a aucun effet.

    arnaud9212
    Admin bbPress
    Nombre d'articles : 118

    Salut, désolé pour le temps de réponse, mais on est vachement prs en ce moment. Je pense que si ton bouton est bien branché, alors il a un effet.
    J’ai remarqué une erreur de delay par contre, lorsque le bouton est appuyé, tu mets ces lignes :

    colorWipe(strip.Color(0, 155, 0), 20); // vert deux secondes
    colorWipe(strip.Color(50, 0, 0), 50); // rouge 5 secondes

    Or dans ta fonction colorWipe tu as :

    delay(wait);

    Donc si tu veux mettre vert pendant 2 secondes, il te faut mettre :

    colorWipe(strip.Color(0, 155, 0), 2000); // vert deux secondes
    colorWipe(strip.Color(50, 0, 0), 5000); // rouge 5 secondes
    rainbow(1000);// puis animation rainbow pendant 1 seconde juste avant prise de la photo
    //A ce moment prise de la photo (reste a programmer)
    colorWipe(strip.Color(0, 0, 100), 1000); // puis allumage de l’anneau en bleu en une seconde
    colorWipe(strip.Color(0, 0, 0), 5000); // puis extinction de l’anneau en 5 secondes

15 sujets de 1 à 15 (sur un total de 16)

Vous devez être connecté pour répondre à ce sujet.