Masque dans le code arduino

Bonjours, j'ai trouvé sur internet un projet très intéressant, c'est un visualiseur de musique sur une bande led, et j'ai voulue le reproduire chez moi.

J'ai parfaitement réussi, mais je souhaiterais le modifier pour l'adapter dans un autre projet à moi maintenant.

Le problème est que son code n'est pas beaucoup commenté pour moi débutant, et j'ai un problème avec les sorties/entrées

Dans mon projet, j'utilise un écran LCD, déclaré comme ceci :

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

Ainsi qu'un bouton poussoir sur l'entrée A2 de la carte.

Dans son projet il utilise un potentiométre sur l'entrée A1, et un module micro sur l'entrée A0. Je me dis alors que c'est compatible ... J'aimerais bien en tout cas ...

Mes quand je fusionne les deux codes, l'écran reste bloquer.

Son code de déclarions des entrées est le suivant :

  ADCSRA = 0xe5; // set the adc to free running mode
  ADMUX = 0x40; // use adc0
  DIDR0 = 0x01; // turn off the digital input for adc0

Je me doute que les valeurs en Hexa correspondent à des masque sur les sorties, mais alors comment je peux faire pour le rendre compatible avec les entrées de mon code ?

Je pense que ces masques concernent plutôt le micro. Un peu d'explications ici, dans la réponse de Nick Gammon. Ils servent à augmenter la bande passante de l'ADC qui est limitée en standard à 9.6 kHz.

lesept:
Je pense que ces masques concernent plutôt le micro. Un peu d'explications ici, dans la réponse de Nick Gammon. Ils servent à augmenter la bande passante de l'ADC qui est limitée en standard à 9.6 kHz.

Donc c'est pour augmenter la sensibiliter et la précision du micro, mais pourquoi quand je met la ligne en commentaire l'écran fonctionne, mais quand je ne la met pas en commentaire l'écran ne s'actualise plus ?

Je n'ai pas précisé mais c'est la première ligne qui me pose problème :
ADCSRA = 0xe5; // set the adc to free running mode

Merci pour la réponse et l'article du forum

Poste ton code, j'ai du mal à le lire d'ici :grin:
Si on ne trouve pas de solution, je te conseille de changer d'écran et de passer sur un OLED I2C. Ces LCD sont trop galère...

Voici le code que j’ai de base :

#include <DS3231.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <FastLED.h>
#define LED_PIN     10
#define NUM_LEDS    75
#define LED_DEBUT   17
CRGB leds[NUM_LEDS];

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
DS3231 Clock;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.println("Test");
  pinMode(LED, OUTPUT);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Reveil Erwan V.6");
  lcd.setCursor(5, 1);
  lcd.print(Aheure);
  lcd.print("h");
  lcd.print(Aminute);
  delay(500);
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i] = CRGB(0, 0, 0);
  }
  FastLED.show();
  pinMode(LedLcd, OUTPUT);
  analogWrite(LedLcd, brightness);
}

Je n’ai pas mis toutes les variables ni la loop, car le problème n’ai pas là, il le code fait beaucoup de ligne …

Et le code que je veux rajouter :

#include "FastLED.h"

// How many leds in your strip?
#include <FastLED.h>


#define OCTAVE 1 //   // Group buckets into octaves  (use the log output function LOG_OUT 1)
#define OCT_NORM 0 // Don't normalise octave intensities by number of bins
#define FHT_N 256 // set to 256 point fht
#include <FHT.h> // include the library
//int noise[] = {204,188,68,73,150,98,88,68}; // noise level determined by playing pink noise and seeing levels [trial and error]{204,188,68,73,150,98,88,68}


int noise[] = {204, 190, 108, 85, 65, 65, 55, 60}; // noise for mega adk
//int noise[] = {204,195,100,90,85,80,75,75}; // noise for NANO
//int noise[] = {204, 198, 100, 85, 85, 80, 80, 80};
float noise_fact[] = {15, 7, 1.5, 1, 1.2, 1.4, 1.7, 3}; // noise level determined by playing pink noise and seeing levels [trial and error]{204,188,68,73,150,98,88,68}
float noise_fact_adj[] = {15, 7, 1.5, 1, 1.2, 1.4, 1.7, 3}; // noise level determined by playing pink noise and seeing levels [trial and error]{204,188,68,73,150,98,88,68}


#define LED_PIN     5
#define LED_TYPE    WS2812B
#define COLOR_ORDER RGB


// Params for width and height
const uint8_t kMatrixWidth = 11;
const uint8_t kMatrixHeight = 7;
#define NUM_LEDS (kMatrixWidth * kMatrixHeight)
//#define NUM_LEDS    15

CRGB leds[NUM_LEDS];

int counter2 = 0;



void setup() {
  //  Serial.begin(115200);
  delay(1000);
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );

  FastLED.setBrightness (200);
  fill_solid(leds, NUM_LEDS, CRGB::Black);
  FastLED.show();
  // TIMSK0 = 0; // turn off timer0 for lower jitter
  ADCSRA = 0xe5; // set the adc to free running mode
  ADMUX = 0x40; // use adc0
  DIDR0 = 0x01; // turn off the digital input for adc0

}




void loop() {
  int prev_j[8];
  int beat = 0;
  int prev_oct_j;
  int counter = 0;
  int prev_beat = 0;
  int led_index = 0;
  int saturation = 0;
  int saturation_prev = 0;
  int brightness = 0;
  int brightness_prev = 0;

  while (1) { // reduces jitter

    cli();  // UDRE interrupt slows this way down on arduino1.0

    for (int i = 0 ; i < FHT_N ; i++) { // save 256 samples
      while (!(ADCSRA & 0x10)); // wait for adc to be ready
      ADCSRA = 0xf5; // restart adc
      byte m = ADCL; // fetch adc data
      byte j = ADCH;
      int k = (j << 8) | m; // form into an int
      k -= 0x0200; // form into a signed int
      k <<= 6; // form into a 16b signed int
      fht_input[i] = k; // put real data into bins
    }
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_octave(); // take the output of the fht  fht_mag_log()

    // every 50th loop, adjust the volume accourding to the value on A2 (Pot)
    if (counter >= 50) {
      ADMUX = 0x40 | (1 & 0x07); // set admux to look at Analogpin A1 - Master Volume


      while (!(ADCSRA & 0x10)); // wait for adc to be ready
      ADCSRA = 0xf5; // restart adc
      delay(10);
      while (!(ADCSRA & 0x10)); // wait for adc to be ready
      ADCSRA = 0xf5; // restart adc
      byte m = ADCL; // fetch adc data
      byte j = ADCH;
      int k = (j << 8) | m; // form into an int
      float master_volume = (k + 0.1) / 1000 + .5; // so the valu will be between ~0.5 and 1.5
      // Serial.println (master_volume);


      for (int i = 1; i < 8; i++) {
        noise_fact_adj[i] = noise_fact[i] * master_volume;
      }

      ADMUX = 0x40 | (0 & 0x07); // set admux back to look at A0 analog pin (to read the microphone input
      counter = 0;
    }

    sei();
    counter++;


    // End of Fourier Transform code - output is stored in fht_oct_out[i].

    // i=0-7 frequency (octave) bins (don't use 0 or 1), fht_oct_out[1]= amplitude of frequency for bin 1
    // for loop a) removes background noise average and takes absolute value b) low / high pass filter as still very noisy
    // c) maps amplitude of octave to a colour between blue and red d) sets pixel colour to amplitude of each frequency (octave)

    for (int i = 1; i < 8; i++) {  // goes through each octave. skip the first 1, which is not useful

      int j;
      j = (fht_oct_out[i] - noise[i]); // take the pink noise average level out, take the asbolute value to avoid negative numbers
      if (j < 10) {
        j = 0;
      }
      j = j * noise_fact_adj[i];

      if (j < 10) {
        j = 0;
      }
      else {
        j = j * noise_fact_adj[i];
        if (j > 180) {
          if (i >= 7) {
            beat += 2;
          }
          else {
            beat += 1;
          }
        }
        j = j / 30;
        j = j * 30; // (force it to more discrete values)
      }

      prev_j[i] = j;

      //     Serial.print(j);
      //     Serial.print(" ");


      // this fills in 11 LED's with interpolated values between each of the 8 OCT values
      if (i >= 2) {
        led_index = 2 * i - 3;
        prev_oct_j = (j + prev_j[i - 1]) / 2;

        saturation = constrain(j + 30, 0, 255);
        saturation_prev = constrain(prev_oct_j + 30, 0, 255);
        brightness = constrain(j, 0, 255);
        brightness_prev = constrain(prev_oct_j, 0, 255);
        if (brightness == 255) {
          saturation = 50;
          brightness = 200;
        }
        if (brightness_prev == 255) {
          saturation_prev = 50;
          brightness_prev = 200;
        }


        for (uint8_t y = 0; y < kMatrixHeight; y++) {
          leds[XY(led_index - 1, y)] = CHSV(j + y * 30, saturation, brightness);
          if (i > 2) {
            prev_oct_j = (j + prev_j[i - 1]) / 2;
            leds[ XY(led_index - 2, y)] = CHSV(prev_oct_j + y * 30, saturation_prev, brightness_prev);
          }
        }
      }
    }



    if (beat >= 7) {
      fill_solid(leds, NUM_LEDS, CRGB::Gray);
      FastLED.setBrightness(120);


      //    FastLED.setBrightness(200);

    }
    else {
      if (prev_beat != beat) {
        FastLED.setBrightness(40 + beat * beat * 5);
        prev_beat = beat;
      }

    }

    FastLED.show();
    if (beat) {
      counter2 += ((beat + 4) / 2 - 2);
      if (counter2 < 0) {
        counter2 = 1000;
      }
      if (beat > 3 && beat < 7) {
        FastLED.delay (20);
      }
      beat = 0;
    }

    // Serial.println();
  }
}



// Param for different pixel layouts
const bool    kMatrixSerpentineLayout = true;
// Set 'kMatrixSerpentineLayout' to false if your pixels are
// laid out all running the same way, like this:

// Set 'kMatrixSerpentineLayout' to true if your pixels are
// laid out back-and-forth, like this:

uint16_t XY( uint8_t x, uint8_t y)
{
  uint16_t i;

  if ( kMatrixSerpentineLayout == false) {
    i = (y * kMatrixWidth) + x;
  }

  if ( kMatrixSerpentineLayout == true) {
    if ( y & 0x01) {
      // Odd rows run backwards
      uint8_t reverseX = (kMatrixWidth - 1) - x;
      i = (y * kMatrixWidth) + reverseX;

    } else {
      // Even rows run forwards
      i = (y * kMatrixWidth) + x;

    }
  }

  i = (i + counter2) % NUM_LEDS;
  return i;
}

lesept:
Je te conseille de changer d'écran et de passer sur un OLED I2C. Ces LCD sont trop galère...

Si je prend un lcd mais en i2C, c'est bien aussi ? Car je préfére l'afficage du lcd ...

Peut-être, je n'ai jamais essayé ce genre d'écran. Si tu en as un teste-le.

lesept:
Peut-être, je n'ai jamais essayé ce genre d'écran. Si tu en as un teste-le.

Non je n'en ai pas non plus, et pour mon code, tu as une idée ?

Quelques remarques dans le premier code :

  • Tu déclares ton bandeau FastLED sur la broche LED_PIN mais tu fais le pinmode sur la broche LED (qui n'est pas déclarée)
  • Pareil pour Ledlcd et brightness qui ne sont pas déclarés
    Est-ce lié à ta phrase :

Je n'ai pas mis toutes les variables ni la loop, car le problème n'est pas là

Si le problème vient de la combinaison des deux codes, c'est plutôt le code final qui aiderait.
Je te suggère de réécrire ton code de manière qu'il soit plus lisible, c'est à dire en déclarant des fonctions qui seront appelées dans la loop. Éventuellement dès qu'une fonction est validée, tu la met dans un fichier .h dans le même répertoire, comme ça elle n'encombre plus le programme principal.

Un exemple de ce que je veux dire : ici. Si tu regardes directement le dernier code "Example 6 - Program to receive binary data", le plus complet, tu verras que la loop ne comporte que 2 lignes :

void loop() {
    recvBytesWithStartEndMarkers();
    showNewData();
}

D’accord je vais mettre tous le code avec des fonctions, mais il est vraiment très long, donc je vais simplifier avec juste un lcd et un bouton poussoir, le reste n’est que des fonctions complémentaire.

Si je n’arrive toujours pas à trouver de solutions je reviendrais voir, merci !

J’ai aussi une petite question, c’est quoi la différence entre :

#include <FastLED.h>

et :

#include "FastLED.h"

Est-ce que c’est utile de mettre les deux ou un seul suffi ?

Un seul suffit. Les <> ou “” sont un moyen d’indiquer au compilateur où il doit chercher les bibliothèques, dans un cas c’est d’abord dans le répertoire du code, dans l’autre c’est directement dans le répertoire “libraries” (je ne sais plus lequel est lequel)

J'ai trouvé une solution, je fais les 3 lignes qui me posait problème directement dans mon fonction dédiée à ce programme rajouté.

Sa fonctionne a peu-près, mais une fois rentré dans la fonction, je ne peux plus en ressortir, mais pas très grave pour le moment.

Merci beaucoup lesept pour ton aide, c'est toujours agréable d'avoir des réponses rapides comme aujourd'hui
:wink: