FastLed Arduino SPI

Bonjour,

Je me permet de me diriger vers vous car j'ai un problème avec ma programmation sur Arduino IDE, J'ai essayé le code sur un Arduino Uno et cela fonctionne très bien, mais mon souhait est de l'utiliser avec un NodeMCU V3, le soucis est que j'ai ce code erreur lorsque j'essaie avec le NodeMCU:

#pragma message: No hardware SPI pins defined. All SPI access will default to bitbanged output

pragma message "No hardware SPI pins defined. All SPI access will default to bitbanged output"

J'ai cru commprendre que le problème vient de la bibliothèque "FastLED" qui ne prend pas en charge les branches SPI, du coup j'aimerais savoir si quelqu'un peut me dire s'il y a une solution à ce problème ou que je devrais utiliser une nouvelle bibliothèque comme "Adafruit Neopixel", merci pour votre lecture.

Voici le code en question:

#define FASTLED_ESP8266_RAW_PIN_ORDER
#include <FastLED.h>

#define num_leds 30
#define PIN D2
#define brightness 100     // can set it 0-255
#define sensitivity 5     // can set it 0-10, recommended at 5

CRGB leds[num_leds];

void setup() {
  Serial.begin(9600);
  FastLED.addLeds<WS2811, PIN, GRB>(leds, num_leds);
  FastLED.setBrightness(brightness);
}

void loop() {
  int x = analogRead(0);
  x = x * sensitivity;
  int y = analogRead(1);
  int d;
  Serial.println(x);
  int c = 0;
  if (y < 100) {
    if (x < 71) {
      leds[(num_leds/2)] = CRGB(255, 0, 0);
    }
    else if (x > 71 && x <= 142) {
      leds[(num_leds/2)] = CRGB(255, 154, 0);
    }
    else if (x > 142 && x <= 213) {
      leds[(num_leds/2)] = CRGB(255, 255, 0);
    }
    else if (x > 213 && x <= 284) {
      leds[(num_leds/2)] = CRGB(0, 255, 0);
    }
    else if (x > 284 && x <= 355) {
      leds[(num_leds/2)] = CRGB(0, 0, 255);
    }
    else if (x > 355 && x <= 426) {
      leds[(num_leds/2)] = CRGB(150, 102, 255);
    }
    else {
      leds[(num_leds/2)] = CRGB(255, 0, 255);
    }
  }
  else if (y > 100 && y <= 1000) {
    if (y >= 100 && y < 250) { //2nd up
      c = ((y - 100) * (255 / 150));
      leds[(num_leds/2)] = CRGB(255, c, 0);
    }
    else if (y >= 250 && y < 400) { //1st down
      c = ((y - 400) * (-255 / 150));
      leds[(num_leds/2)] = CRGB(c, 255, 0);
    }
    else if (y >= 400 && y < 550) { //3rd up
      c = ((y - 400) * (255 / 150));
      leds[(num_leds/2)] = CRGB(0, 255, c);
    }
    else if (y >= 550 && y < 700) {//2nd down
      c = ((y - 700) * (-255 / 150));
      leds[(num_leds/2)] = CRGB(0, c, 255);
    }
    else if (y >= 700 && y < 850) {//1st up
      c = ((y - 700) * (255 / 150));
      leds[(num_leds/2)] = CRGB(c, 0, 255);
    }
    else if (y >= 850 && y < 1000) {//3rd down
      c = ((y - 1000) * (-255 / 150));
      leds[(num_leds/2)] = CRGB(255, 0, c);
    }
    else {
      leds[(num_leds/2)] = CRGB(255, 0, 0);
    }
  }
  else {
    int a = y;
    int d;
    while (y > 1000) {
      y = analogRead(1);
      if (a >= 100 && a < 250) { //2nd up
        d = ((a - 100) * (255 / 150));
        leds[(num_leds/2)] = CRGB(255, d, 0);
      }
      else if (a >= 250 && a < 400) { //1st down
        d = ((a - 400) * (-255 / 150));
        leds[(num_leds/2)] = CRGB(d, 255, 0);
      }
      else if (a >= 400 && a < 550) { //3rd up
        d = ((a - 400) * (255 / 150));
        leds[(num_leds/2)] = CRGB(0, 255, d);
      }
      else if (a >= 550 && a < 700) {//2nd down
        d = ((a - 700) * (-255 / 150));
        leds[(num_leds/2)] = CRGB(0, d, 255);
      }
      else if (a >= 700 && a < 850) {//1st up
        d = ((a - 700) * (255 / 150));
        leds[(num_leds/2)] = CRGB(d, 0, 255);
      }
      else if (a >= 850 && a < 1000) {//3rd down
        d = ((a - 1000) * (-255 / 150));
        leds[(num_leds/2)] = CRGB(255, 0, d);
      }
      else {
        leds[(num_leds/2)] = CRGB(0, 0, 0);
      }
      FastLED.show();
      delay(60);
      fill_solid( leds, num_leds, leds[(num_leds/2)]);
      a = a + 1;
      if (a > 1023){
        a = 0;
      }
    }
  }
  FastLED.show();
  delay(10);
  for (int z = num_leds; z > (num_leds/2); z--) {
    leds[z] = leds[z - 1];
  }
  for (int z = 0; z < (num_leds/2); z++) {
    leds[z] = leds[z + 1];
  }
}

Je n'utilise pas de carte NodeMCU et tu ne donnes pas ton code.
Le message semble indiqué que ton code n'utilise pas les broches du port SPI de la carte et qu'il va donc utiliser une émulation logicielle du SPI. Ce n'est pas un message d'erreur c'est juste un avertissement que les performances du système risquent d'être réduites.

1 Like

Je suis désolé d'avoir oublié de mettre le code, je vais le modifier de suite mon commentaire ci-dessus

Dans la librairie, il y a une remarque sur l'usage des cartes NodeMCU voir ici

Il faut placer le code entre balises (bouton </> sur la barre au-dessus de la zone d'édition) sinon la mise en forme est perdue et il devient illisible.

1 Like

Merci les leds s'allument maintenant, mais contrairement à l'arduino uno, les leds restent violet lorsqu'aucun n'est détectés alors que sur arduino Uno ces derniers n'ont aucune couleur, est-ce qu'il existe d'autres bibliothèques de couleurs qui sont compatible avec mon code et qui n'auraient pas ce bug pour afficher les leds en violet ?

Tu fais

  int x = analogRead(0);
  x = x * sensitivity;
  int y = analogRead(1);

or, à ma connaissance, l'ESP8266 ne possède qu'une seule entrée analogique donc je ne vois pas très bien comment cela peut fonctionner.

Oui effectivement le soucis vient de là, mais du coup j'aimerais essayer une autre méthode, est-il possible d'envoyer les données du port d'Arduino Uno en temps réel sur le NodeMCU (esp8266) ?, via fils bien évidemment, ce sont ces données là :

Ton code est compliqué; il serait plus facile de t'aider si tu expliquais clairement ce que tu veux faire ...

  • Pourquoi choisir un NodeMCU : tu veux le Wifi ?
  • Tu lis des données analogiques : ce sont des potentiomètres ?

Si tu veux à la fois le Wifi et des ADC, prends un ESP32 :

The ESP32 peripherals include:

Il y a du monde...

Mon but est de récupérer les données de mon micro et de faire varier les leds en fonction de ces données, ce que j'y arrive avec Arduino Uno, car il gère deux rentrés analogiques, mais le NodeMCU non, donc j'essaie de trouer comment récupérer les données du micro via l'Arduino Uno en temps réel (ex avec SPI, ou connexion en série, mais j'y arrive pas), une fois ces données récupérées sur le NodeMcu je souhaite les partager à 3 autres NodeMCU via Wi-Fi, pour que ces derniers, aliment de leur tour leurs leds. concernant prendre ESP32, je n'ai pas beaucoup de budget pour dépenser, et que j'ai 5 NodeMCU et j'aurais pas vraiment l'utilité après ce projet.[quote="lesept, post:8, topic:861521, full:true"]
Ton code est compliqué; il serait plus facile de t'aider si tu expliquais clairement ce que tu veux faire ...

  • Pourquoi choisir un NodeMCU : tu veux le Wifi ?
  • Tu lis des données analogiques : ce sont des potentiomètres ?

Si tu veux à la fois le Wifi et des ADC, prends un ESP32 :

The ESP32 peripherals include:

Il y a du monde...
[/quote]