Programme qui permet de piloter un bandeau de LED ring (de la marque adafruit) en fonction du son qui provient d'un microphone externe. Programme fonctionnant sur un microcontrôleur DISCO-F746NG. Ce projet a était fait dans la cadre du cour d'interface de la Licence MECSE de l'IUT de Cachan.

Dependencies:   TS_DISCO_F746NG mbed LCD_DISCO_F746NG BSP_DISCO_F746NG NeoPixel BUTTON_GROUP

test

Revision:
13:075e7b811cc6
Parent:
12:e2bb579c4455
--- a/main.cpp	Mon Feb 22 13:40:13 2016 +0000
+++ b/main.cpp	Tue Jun 04 12:55:46 2019 +0000
@@ -1,94 +1,143 @@
-//---------------------------------------------------------------
-//  Demo program of Button class and ButtonGroup class
-//
-//  2016/02/22, Copyright (c) 2016 MIKAMI, Naoki
-//---------------------------------------------------------------
+#include "button_group.hpp"
+#include "neopixel.h"
+
+#define N 12 //Nombre de led à gerer
 
-#include "button_group.hpp"
+NeoPixelOut strip(D1);     //Sortie pour le bandeau de led
+Serial pc (USBTX, USBRX);  //Paramètre pour le debug USB
+AnalogIn sound (A0);       //Entrée analogique pour le capteur du son
+TS_DISCO_F746NG ts_;       //Parametre pour le tactile
+LCD_DISCO_F746NG lcd_;     //Parametre pour l'écran
 
 using namespace Mikami;
 
-TS_DISCO_F746NG ts_;
-LCD_DISCO_F746NG lcd_;
+//Fonctions
+void allumeLed(long couleur);  //Fonction qui allumer les toutes les leds, elle prends en parametre la couleur à allumer
+void allumeLed(long couleur, int i); //Fonction qui allumer les leds de la couleur 1,
+                                     //elle prends en parametre la couleur à allumer 
+                                     //et i etant le numéro de la led à allumer
+void eteindreLed();        //Fonction qui eteinds toutes les leds
+
+
+//Variables
+float lum = 1.0;           //Valeur de la luminosité de 0.1 à 1.0
+long couleur1 = 0x00FF00;  //Valeur de la couleur 1
+long couleur2 = 0xFF0000;  //Valeur de la couleur 2
+
 
 int main()
 {
     const int Y0 = 5;
-    const int X1 = 30;
-    const int Y1 = 100;
-
     const uint32_t BACK_COLOR = 0xFF006A6C;             // teal green
-    const uint32_t INACTIVE = BACK_COLOR & 0xE0FFFFFF;  // color for inactive button
     lcd_.Clear(BACK_COLOR);
-       
-    const int NUMBER_BUTTONS = 4;
-    const string STR[NUMBER_BUTTONS] = {"Button1", "Button2", "Button3", "Button4"};
-    ButtonGroup bGroup(lcd_, ts_, 10, Y0, 66, 40,
+
+    const int NUMBER_BUTTONS = 2;
+    const string STR[NUMBER_BUTTONS] = {"Mode 1 : Normal", "Mode 2 : Chenillard"};
+    ButtonGroup bGroup(lcd_, ts_, 10, Y0+150, 180, 40,
                        LCD_COLOR_BLUE, BACK_COLOR, NUMBER_BUTTONS, STR, 5, 5, 3);
-                       
-    const string STR_SW[2] = {"ON", "OFF"};
-    ButtonGroup sw(lcd_, ts_, 10, 160, 66, 40,
-                   LCD_COLOR_GREEN, BACK_COLOR, 2, STR_SW, 5, 0, 2);
-                       
-    Button reset(lcd_, ts_, 410, Y0, 60, 40,
-                 LCD_COLOR_BLUE, BACK_COLOR, "Reset", Font12);
-    reset.Draw(INACTIVE, LCD_COLOR_GRAY);
+    bGroup.Draw(0, LCD_COLOR_DARKBLUE);
 
     const string MULTI[2] = {"ON", "OFF"};
-    ButtonGroup multiTouch(lcd_, ts_, 300, Y0+100, 60, 40,
-                 LCD_COLOR_BLUE, BACK_COLOR, 2, MULTI, 5, 0, 2);
-    multiTouch.Draw(0, LCD_COLOR_DARKBLUE);
+    ButtonGroup multiTouch(lcd_, ts_, 10, Y0+70, 60, 40,
+                           LCD_COLOR_BLUE, BACK_COLOR, 2, MULTI, 5, 0, 2);
+    multiTouch.Draw(1, LCD_COLOR_DARKBLUE);
 
     lcd_.SetTextColor(LCD_COLOR_WHITE);
     lcd_.SetFont(&Font16);
-    lcd_.DisplayStringAt(250, Y0+80, (uint8_t *)"Multi-touch ON, OFF", LEFT_MODE);
+    lcd_.DisplayStringAt(10, Y0+50, (uint8_t *)"Activation :", LEFT_MODE);
+
+    int num;             //Vairable qui stock la valeur de la touche appuyée
+    float valeurMicro;   //Variable qui sotck la valeur de notre micro
+    bool start = false;  //Variable pour savoir si on est à on ou off
+    int mode = 1;        //Variable pour savoir quel mode est activé
+
+
+
+    while (true) {
+        for (int i = 0; i < N ; i++) { //Boucle qui permet d'activer led par led
+            char str[20];             //Variable qui permet d'afficher sur notre écran
+            sprintf(str,"Son : %f", 0.00); //On affiche la valeur 0
+            lcd_.SetFont(&Font20);
 
-    lcd_.SetFont(&Font20);
-    lcd_.DisplayStringAt(120, 250, (uint8_t *)"02/22 22:36", LEFT_MODE);
-        
-    DigitalOut dOut(D7);
-    int num;
+
+            int mNum; //Variable qui permet de savoir sur quel bouton on a appuyé
+            if (multiTouch.GetTouchedNumber(mNum, LCD_COLOR_DARKBLUE)) {   //Si on a appuyé sur un bouton
+                Button::SetMultiTouch(mNum == 0);   // Set or reset multi-touch
+                if (mNum == 0) {
+                    //Si on a appuyé sur le bouton On
+                    start = true;                                           //Variable start à true
+                    //lcd_.DisplayStringAt(10, Y0+120, (uint8_t *)"ON ", LEFT_MODE); //On affiche On sur l'ecran
+                } else {
+                    //Sinon bouton OFF
+                    eteindreLed();
+                    start = false;                                          //Variable start à false
+                    //lcd_.DisplayStringAt(10, Y0+120, (uint8_t *)"OFF", LEFT_MODE);  //On affiche Off sur l'ecran
+                }
+            }
 
-    while (true)
-    {
-        dOut = 1;
-        bool touched = bGroup.GetTouchedNumber(num, LCD_COLOR_DARKBLUE);
-        dOut = 0;
-        
-        if (touched)
-        {
-            char str[20];
-            lcd_.SetFont(&Font16);
-            lcd_.SetTextColor(LCD_COLOR_WHITE);
-            sprintf(str, "Button%d pressed", num+1);
-            lcd_.DisplayStringAt(X1, Y1, (uint8_t *)str, LEFT_MODE);
-            
-            reset.Redraw();
+            lcd_.SetFont(&Font20);
+            if (start == true) {      //Si on appuyé sur le bouton On
+                valeurMicro = sound.read(); //On recupere la valeur du son
+                sprintf(str,"Son : %f", valeurMicro);  //On affiche la valeur de notre micro sur l'écran
+                if (valeurMicro < 0.25) {                  //Si on est inférieur à valeur on est inferieur à la limite on change la couleur 2
+                    if (mode == 1) {                       //Si nous somme dans le mode 1
+                        allumeLed(couleur1);
+                    } else {                               //Sinon
+                        allumeLed(couleur1, i);
+                    }
+                } else {                                   //Si on est supérieur à valeur on est inferieur à la limite on change la couleur 2
+                    if (mode == 1) {                       //Si nous somme dans le mode 1
+                        allumeLed(couleur2);
+                    } else {                               //Sinon
+                        allumeLed(couleur2, i);
+                    }
+                }
+            }
+
+            lcd_.DisplayStringAt(10, Y0+20, (uint8_t *)str, LEFT_MODE); //On met à jour l'affichage
+            bool touched = bGroup.GetTouchedNumber(num, LCD_COLOR_DARKBLUE);
+            if (touched) {
+                char str[20];
+                if (num == 0) {
+                    mode = 1;
+                } else {
+                    mode =2 ;
+                }
+
+            }
+
+            wait(0.03f); //Tempo
         }
-        
-        if (sw.Touched(0, LCD_COLOR_DARKGREEN))
-            lcd_.DisplayStringAt(X1, 210, (uint8_t *)"ON ", LEFT_MODE);
-        if (sw.Touched(1, LCD_COLOR_DARKGREEN))
-            lcd_.DisplayStringAt(X1, 210, (uint8_t *)"OFF", LEFT_MODE);
-        
-        if (reset.Touched())
-        {
-            bGroup.Redraw(num);
-            reset.Draw(INACTIVE, LCD_COLOR_GRAY);
-            lcd_.SetFont(&Font16);
-            lcd_.DisplayStringAt(X1, Y1, (uint8_t *)"               ", LEFT_MODE);
-        }
-        
-        int mNum;
-        if (multiTouch.GetTouchedNumber(mNum, LCD_COLOR_DARKBLUE))
-        {
-            Button::SetMultiTouch(mNum == 0);   // Set or reset multi-touch
-            if (mNum == 0)
-                lcd_.DisplayStringAt(320, Y0+150, (uint8_t *)"ON ", LEFT_MODE);
-            else
-                lcd_.DisplayStringAt(320, Y0+150, (uint8_t *)"OFF", LEFT_MODE);
-        }
-        wait(0.01f);
     }
+
 }
 
+void allumeLed(long couleur)
+{
+    Pixel strip1[N];
+    strip.global_scale = lum;
+    for(int i =0; i <N; i++) {
+        strip1[i].hex = couleur;
+    }
+    strip.send(strip1, N);
+}
+
+void allumeLed(long couleur, int i)
+{
+    Pixel strip1[N];
+    strip.global_scale = lum;
+    strip1[i].hex = couleur;
+    strip.send(strip1, i);
+
+}
+
+void eteindreLed()
+{
+
+    Pixel strip1[N];
+    for(int i =0; i < N; i++) {
+        strip1[i].hex = 0x000000;
+    }
+    strip.global_scale = 0.01;
+    strip.send(strip1, N);
+}
\ No newline at end of file