подцветка для посоха)

Тема в разделе "Arduino & Shields", создана пользователем Centurio_Mark, 19 янв 2019.

  1. Centurio_Mark

    Centurio_Mark Нерд

    Прошу вас посмотреть и исправить ошибку в коде. Цикл-1 минуты не работает,смена цвета происходит только через 47 сек,при этом в коде указанно 40,цвета сменяются не плавно как хотелось,при дополнении или смены строк в коде,появляются ошибки и много,при удалении строк жёлтого цвета в цикле возникает следующее:цикл завершается красным цветом и смены последующих цветов не происходит 25 минут ждал и без результата.Плату использовал Arduino UNO питание от powerbank 5800,через USB переходник.
    КОД:
    #include <Adafruit_NeoPixel.h>

    Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);
    Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(16, 3, NEO_GRB + NEO_KHZ800);

    int oldRed = 80, newRed = 0, redDiff = 0;
    int oldGreen = 80, newGreen = 0, greenDiff = 0;
    int oldBlue = 80, newBlue = 0, blueDiff = 0;
    int oldYellow = 80, newYellow = 0, yellowDiff = 0;

    unsigned long timeToChangeColor = 0;
    #define DELAY_TO_CHANGE_COLOR 20;

    unsigned long delayTime = 40000; // Пауза между циклами
    unsigned long timeNow = 0; // Пауза между циклами
    int gradientWidth = 100; // Сколько раз меняем градиент
    int gradientFrequency = 100; // Частота с которой меняем цвет в градиенте
    int gradientTime = gradientWidth * gradientFrequency; // Всего времени на градиент

    void setColorDifference() {
    if (oldRed == newRed) { redDiff = 0; }
    else { redDiff = abs(oldRed - newRed) / gradientWidth; }
    if (oldRed > newRed) { redDiff *= -1; }

    if (oldGreen == newGreen) { greenDiff = 0; }
    else { greenDiff = abs(oldGreen - newGreen) / gradientWidth; }
    if (oldGreen > newGreen) { greenDiff *= -1; }

    if (oldBlue == newBlue) { blueDiff = 0; }
    else { blueDiff = abs(oldBlue - newBlue) / gradientWidth; }
    if (oldBlue > newBlue) { blueDiff *= -1; }

    if (oldYellow == newYellow) { yellowDiff = 0; }
    else { yellowDiff = abs(oldYellow - newYellow) / gradientWidth; }
    if (oldYellow > newYellow) { yellowDiff *= -1; }
    }

    void setup() {
    strip1.begin(); strip2.begin();
    strip1.show(); strip2.show();
    }

    void setRandomNewColor() {
    randomSeed(analogRead(0));
    newRed = random(0, 80);
    randomSeed(analogRead(0));
    newGreen = random(0, 80);
    randomSeed(analogRead(0));
    newBlue = random(0, 80);
    randomSeed(analogRead(0));
    newYellow = random(0, 80);
    }

    void loop() {
    setRandomNewColor();
    setColorDifference();
    for (int c = 1 ; c < gradientWidth + 1; c++) {
    for (int i = 0; i < strip1.numPixels(); i++) {
    strip1.setPixelColor(i, strip1.Color(
    round(oldRed + (c * redDiff)),
    round(oldGreen + (c * greenDiff)),
    round(oldBlue + (c * blueDiff)),
    round(oldYellow + (c * yellowDiff))
    ));
    }
    for (int i = 0; i < strip2.numPixels(); i++) {
    strip2.setPixelColor(i, strip2.Color(
    round(oldRed + (c * redDiff)),
    round(oldGreen + (c * greenDiff)),
    round(oldBlue + (c * blueDiff)),
    round(oldYellow + (c * yellowDiff))
    ));
    }

    strip1.show(); strip2.show();
    delay(gradientFrequency);
    }
    oldRed = newRed;
    oldBlue = newBlue;
    oldGreen = newGreen;
    oldYellow = newYellow;

    timeNow = millis();
    while (millis() < timeNow + delayTime) {}
    }
     

    Вложения:

    • neopixel_1.ino
      Размер файла:
      2,8 КБ
      Просмотров:
      480
    Последнее редактирование: 20 янв 2019
  2. Daniil

    Daniil Гуру

    Выложите код, пожалуйста, через теги.
     
  3. Airbus

    Airbus Радиохулиган Модератор

  4. nem-victor

    nem-victor Нерд

  5. nem-victor

    nem-victor Нерд

    вот код
    Код (C++):
    #include <Adafruit_NeoPixel.h>

    Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);
    Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(16, 3, NEO_GRB + NEO_KHZ800);

    int oldRed = 80, newRed = 0, redDiff = 0;
    int oldGreen = 80, newGreen = 0, greenDiff = 0;
    int oldBlue = 80, newBlue = 0, blueDiff = 0;
    int oldYellow = 80, newYellow = 0, yellowDiff = 0;

    unsigned long timeToChangeColor = 0;
    #define DELAY_TO_CHANGE_COLOR 20;

    unsigned long delayTime = 40000; // Пауза между циклами
    unsigned long timeNow = 0; // Пауза между циклами
    int gradientWidth = 100; // Сколько раз меняем градиент
    int gradientFrequency = 100; // Частота с которой меняем цвет в градиенте
    int gradientTime = gradientWidth * gradientFrequency; // Всего времени на градиент

    void setColorDifference() {
      if (oldRed == newRed) { redDiff = 0; }
        else { redDiff = abs(oldRed - newRed) / gradientWidth; }
        if (oldRed > newRed) { redDiff *= -1; }

      if (oldGreen == newGreen) { greenDiff = 0; }
        else { greenDiff = abs(oldGreen - newGreen) / gradientWidth; }
        if (oldGreen > newGreen) { greenDiff *= -1; }

      if (oldBlue == newBlue) { blueDiff = 0; }
        else { blueDiff = abs(oldBlue - newBlue) / gradientWidth; }
        if (oldBlue > newBlue) { blueDiff *= -1; }

      if (oldYellow == newYellow) { yellowDiff = 0; }
        else { yellowDiff = abs(oldYellow - newYellow) / gradientWidth; }
        if (oldYellow > newYellow) { yellowDiff *= -1; }
    }

    void setup() {
      strip1.begin(); strip2.begin();
      strip1.show(); strip2.show();
    }

    void setRandomNewColor() {
      randomSeed(analogRead(0));
      newRed = random(0, 80);
      randomSeed(analogRead(0));
      newGreen = random(0, 80);
      randomSeed(analogRead(0));
      newBlue = random(0, 80);
        randomSeed(analogRead(0));
        newYellow = random(0, 80);
    }

    void loop() {
      setRandomNewColor();
        setColorDifference();
      for (int c = 1 ; c < gradientWidth + 1; c++) {
        for (int i = 0; i < strip1.numPixels(); i++) {
          strip1.setPixelColor(i, strip1.Color(
                    round(oldRed + (c * redDiff)),
                    round(oldGreen + (c * greenDiff)),
                    round(oldBlue + (c * blueDiff)),
                    round(oldYellow + (c * yellowDiff))
                ));
        }
        for (int i = 0; i < strip2.numPixels(); i++) {
          strip2.setPixelColor(i, strip2.Color(
                    round(oldRed + (c * redDiff)),
                    round(oldGreen + (c * greenDiff)),
                    round(oldBlue + (c * blueDiff)),
                    round(oldYellow + (c * yellowDiff))
                ));
        }

        strip1.show(); strip2.show();
            delay(gradientFrequency);
      }
        oldRed = newRed;
        oldBlue = newBlue;
        oldGreen = newGreen;
        oldYellow = newYellow;

      timeNow = millis();
      while (millis() < timeNow + delayTime) {}
    }
    а тут предупреждение
    Код (Text):
    C:\Users\nemvi.DESKTOP-SFK8G8G\Documents\Arduino\neopixel_1\neopixel_1.ino: In function 'void loop()':

    C:\Users\nemvi.DESKTOP-SFK8G8G\Documents\Arduino\neopixel_1\neopixel_1.ino:58:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

         for (int i = 0; i < strip1.numPixels(); i++) {

                           ^

    C:\Users\nemvi.DESKTOP-SFK8G8G\Documents\Arduino\neopixel_1\neopixel_1.ino:66:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

         for (int i = 0; i < strip2.numPixels(); i++) {

                           ^
     
  6. nem-victor

    nem-victor Нерд

    а вот исправленный код
    Код (C++):
    #include <Adafruit_NeoPixel.h>

    Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);
    Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(16, 3, NEO_GRB + NEO_KHZ800);

    int oldRed = 80, newRed = 0, redDiff = 0;
    int oldGreen = 80, newGreen = 0, greenDiff = 0;
    int oldBlue = 80, newBlue = 0, blueDiff = 0;
    int oldYellow = 80, newYellow = 0, yellowDiff = 0;

    unsigned long timeToChangeColor = 0;
    #define DELAY_TO_CHANGE_COLOR 20;

    unsigned long delayTime = 40000; // Пауза между циклами
    unsigned long timeNow = 0; // Пауза между циклами
    int gradientWidth = 100; // Сколько раз меняем градиент
    int gradientFrequency = 100; // Частота с которой меняем цвет в градиенте
    int gradientTime = gradientWidth * gradientFrequency; // Всего времени на градиент

    void setColorDifference() {
      if (oldRed == newRed) { redDiff = 0; }
        else { redDiff = abs(oldRed - newRed) / gradientWidth; }
        if (oldRed > newRed) { redDiff *= -1; }

      if (oldGreen == newGreen) { greenDiff = 0; }
        else { greenDiff = abs(oldGreen - newGreen) / gradientWidth; }
        if (oldGreen > newGreen) { greenDiff *= -1; }

      if (oldBlue == newBlue) { blueDiff = 0; }
        else { blueDiff = abs(oldBlue - newBlue) / gradientWidth; }
        if (oldBlue > newBlue) { blueDiff *= -1; }

      if (oldYellow == newYellow) { yellowDiff = 0; }
        else { yellowDiff = abs(oldYellow - newYellow) / gradientWidth; }
        if (oldYellow > newYellow) { yellowDiff *= -1; }
    }

    void setup() {
      strip1.begin(); strip2.begin();
      strip1.show(); strip2.show();
    }

    void setRandomNewColor() {
      randomSeed(analogRead(0));
      newRed = random(0, 80);
      randomSeed(analogRead(0));
      newGreen = random(0, 80);
      randomSeed(analogRead(0));
      newBlue = random(0, 80);
        randomSeed(analogRead(0));
        newYellow = random(0, 80);
    }

    void loop() {
      setRandomNewColor();
        setColorDifference();
      for (int c = 1 ; c < (int)gradientWidth + 1; c++) {
        for (int i = 0; i < (int)strip1.numPixels(); i++) {
          strip1.setPixelColor(i, strip1.Color(
                    round(oldRed + (c * redDiff)),
                    round(oldGreen + (c * greenDiff)),
                    round(oldBlue + (c * blueDiff)),
                    round(oldYellow + (c * yellowDiff))
                ));
        }
        for (int i = 0; i < (int)strip2.numPixels(); i++) {
          strip2.setPixelColor(i, strip2.Color(
                    round(oldRed + (c * redDiff)),
                    round(oldGreen + (c * greenDiff)),
                    round(oldBlue + (c * blueDiff)),
                    round(oldYellow + (c * yellowDiff))
                ));
        }

        strip1.show(); strip2.show();
            delay(gradientFrequency);
      }
        oldRed = newRed;
        oldBlue = newBlue;
        oldGreen = newGreen;
        oldYellow = newYellow;

      timeNow = millis();
      while (millis() < timeNow + delayTime) {}
    }
     
  7. Centurio_Mark

    Centurio_Mark Нерд

    можешь показать как лента стала работать???
     
  8. nem-victor

    nem-victor Нерд

    не могу, я не знаю как Вы ее подключили, схему выложи, или адрес на проект дай
     
    Последнее редактирование: 20 янв 2019
  9. nem-victor

    nem-victor Нерд

    Пробовал симуляцию в протеус - есть каке то данные на портах, но в протеусе кажеться не работает 2812 лед
     
    Последнее редактирование: 20 янв 2019
  10. Centurio_Mark

    Centurio_Mark Нерд

    подключал два кольца https://www.chipdip.ru/product/neopixel-ring-16-8?from=suggest_product вот попробуй прям на ленте
     
    Последнее редактирование: 20 янв 2019
  11. Centurio_Mark

    Centurio_Mark Нерд

    просто мне пока некуда подключать((