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
Diff: main.cpp
- Revision:
- 13:075e7b811cc6
- Parent:
- 12:e2bb579c4455
diff -r e2bb579c4455 -r 075e7b811cc6 main.cpp --- 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