[Projet] Comparateur ABX audio

Bonjour,

Dans la même veine que l’appareil QSC ABX comparator : http://www.ackthud.net/shawnfogg/pics/temp/ABX_manual.pdf

Mais avec des possibilités supplémentaires en terme de comparatifs possibles.

Il possèdera une télécommande (déjà reçu) et un écran OLED (que j’attends)

j’ai commencé l’écriture du code, mais j’ai un message d’erreur que je n’arrive pas à endiguer :

Le croquis utilise 16 458 octets (51%) de l’espace de stockage de programmes. Le maximum est de 32 256 octets.
Les variables globales utilisent 1 756 octets (85%) de mémoire dynamique, ce qui laisse 292 octets pour les variables locales. Le maximum est de 2 048 octets.
Low memory available, stability problems may occur.

Voici le code actuel, comme cela fait longtemps que je n’ai de programmation, je me doute qu’il est possible d’optimiser un peu ^^ :

// importation des librairies

  #include <IRremote.h>
  #include <SPI.h>
  #include <Wire.h>
  #include <Adafruit_GFX.h>
  #include <Adafruit_SSD1306.h>

// Déclaration des variables/contantes/objets

  //byte a = B0000;
  byte b = B1111;
  byte c;
  byte x = B0000;
  int choix = 1;
  int nb_trial = 0;
  int nb_succ = 0;
  const int rec_pin = 6;
  IRrecv irrecv(rec_pin);
  decode_results results;
  Adafruit_SSD1306 display(9, 10, 11, 12, 13);

void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  irrecv.enableIRIn(); // Activation du récepteur
  irrecv.blink13(true); // Active le clignotement lors de la réception de trame IR
  display.begin(SSD1306_SWITCHCAPVCC);
}

void loop() {
  if (irrecv.decode(&results)) { //Attend la détection d'une trame IR
    //Serial.println(results.value, HEX);
    //irrecv.resume(); // RAS du récepteur pour l'attente d'un nouvelle trame IR
    switch (results.value) {
      case 0xFFA25D: // Détection appui sur la touche A 
        digitalWrite(3, HIGH);
        delay(10);
      break;
      case 0xFFE21D: // Détection appui sur la touche B
      	digitalWrite(4, HIGH);
        delay(10);
      break;
      case 0xFF629D: // Détection appui sur la touche X
        digitalWrite(5, HIGH);
        delay(10);
      break;
      case 0xFF906F: // Détection appui sur la touche SELECT
        if (nb_trial == 0) {
          choix = defil_attrib (choix);
          switch (choix) {
            case (0 | 2) :
              b = B0110;
            break;
            case 1 :
              b = B1000;
            break;
            case 3 :
              b = B0001;
            break;
          }
         }
         else {
           // Demander de déterminer X entre A et B et d'appuyer sur Select pour valider
           while ((results.value) != 0xFF906F) {
             if (results.value == 0xFFA25D) {
               c = B0000;
             }
             if (results.value == 0xFFE21D) {
               c = b;
             }
           }
           nb_trial ++;
           if (c == x) {
             nb_succ ++;
           }
           // Afficher la valeur de X
           while ((results.value) != 0xFF906F) {
             x = aleatoire (b);
             // Afficher appuyer sur Select
           }
        }
      break;
      case 0xFFC23D: // Détection appui sur la touche TRIAL
        if (nb_trial == 0) {
          nb_trial = 1;
          x = aleatoire (b);
	}
	else {
          nb_trial = 0;
	  //affich_result (int nb_trial, int nb_succ);
  	}
      break;
    }
    irrecv.resume();
  }
}

byte aleatoire (byte b) {
  int z = 1; // Variable aléatoire entre 1 et 2 pour déterminer x
  byte y;
  while ((results.value) == 0xFFC23D) {
    z = random(1,3);
    delay(5);
  }
  if (z == 1){
    y = B0000;
  }
  else {
    y = b;
  }
  return y;
}

void cmd_relay (byte c) {

}

int defil_attrib (int choix) {
  irrecv.resume();
  if (irrecv.decode(&results)) {
    while ((results.value) != 0xFF906F) {
      if (results.value == 0xFFA25D) {
        switch (choix) {
        case 0:
          // Afficher ABX Sources/Préamplis/DACs/filtres actif;
          choix = 1;
        break;
        case 1:
          // Afficher ABX Amplis/Filtres passifs;
          choix = 2;
        break;
        case 2:
          // Afficher ABX Enceintes passives/Transducteurs;
          choix = 3;
        break;
        case 3:
          // Afficher ABX Enceintes actives VS passives;
          choix = 0;
        }
      }
    if (results.value == 0xFFE21D) {
      switch (choix) {
        case 0:
          // Afficher ABX Sources/Préamplis/DACs/filtres actif;
          choix = 1;
        break;
        case 1:
          // Afficher ABX Amplis/Filtres passifs;
          choix = 2;
        break;
        case 2:
          // Afficher ABX Enceintes passives/Transducteurs;
          choix = 3;
        break;
        case 3:
          // Afficher ABX Enceintes actives VS passives;
          choix = 0;
        }
      }
    }
    // Afficher les type de test ABX sélectionné ainsi que les entrées/sorties utiles (appui sur Select pour passer l'écran ?)
    return choix;
  }
}

Merci par avance pour votre aide :wink: .

Le défis ne s’arrête pas là, car par la suite j’aimerai pouvoir mesurer une tension alternative jusqu’à 50 voir 100 volts avec suffisamment de précision sur les petits signaux (typique sur les préampli …) qu’il faudra certainement passer par des calibre, mais je n’ai aucune idée de comment procéder pour l’instant.

Ensuite je dois m’attarder sur la commutation entre les voies (qui au niveau ampli iront aussi jusqu’à 50 voir 100 volts) et cela sans la moindre audibilité, c’est le challenge !

Déjà quelques pistes que l’ont m’a fournit :

http://sound.westhost.com/articles/mosfet-relay.htm

Je vous remercie encore une nouvelle fois par avance.

Bonne journée à tous

Visiblement c'est cette ligne qui me mange énormément de ressources :

Adafruit_SSD1306 display(9, 10, 11, 12, 13);

Je vais voir comment m'en passer :grin: .

EDIT : Une astuce : http://forums.adafruit.com/viewtopic.php?f=22&p=279827

;)

La librairie de l'écran gère un buffer de 1k octets pour l'afficheur 128x64. Mais en même temps c'est difficile de s'en passer sauf à dessiner directement dans l'afficheur ce qui bride pas mal les possibilités.

Bonjour,

Merci de ta réponse, car c'est effectivement un détail auquel je n'avais prêté attention lors de l'achat, pensant que ça roulerait sans soucis !

Mais bon la solution existe pour simplifier, même si on a accès à beaucoup moins de fonctionnalités :

https://forums.adafruit.com/viewtopic.php?f=47&t=26636