Перенести функцию из другого скетча

demonstrius
Offline
Зарегистрирован: 30.04.2020

Есть два скетча для подсветки Ambilight:

1. adrilight.ino - для работы с программой Аdriligh

2. Ambilight.ino - для работы с программами AmbiBox или Prismatic.

В скетче adrilight.ino есть функция плавного отключения ленты если ее яркость превышает какое-то значение. Для меня нужная функция, чтобы лента зря не светила при работе в браузере и т.д.

Помогите эту функцию перенести в скетч Ambilight.ino.

Заранее спасибо.

adrilight.ino --------------------------------------------------------------------------------------

#include "FastLED.h"

#define NUM_LEDS 90
#define LED_DATA_PIN 1 
#define BRIGHTNESS 255 //range is 0..255 with 255 beeing the MAX brightness

// --------------------------------------------------------------------------------------------
// NO CHANGE REQUIRED BELOW THIS LINE
// --------------------------------------------------------------------------------------------

#define UPDATES_PER_SECOND 60
#define TIMEOUT 3000
#define MODE_ANIMATION 0
#define MODE_AMBILIGHT 1
#define MODE_BLACK 2

#define BUTTER_STRENGTH 3    //higher values = smoother but slower. lower values = less smooth but faster. Default: 10. Minimum = original = 1.

uint8_t mode = MODE_ANIMATION;

uint8_t currentBrightness = BRIGHTNESS;
byte MESSAGE_PREAMBLE[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 };
uint8_t PREAMBLE_LENGTH = 10;
uint8_t current_preamble_position = 0;

unsigned long last_serial_available = -1L;

CRGB leds[NUM_LEDS];
CRGB ledsTemp[NUM_LEDS];
byte buffer[3];

// Filler animation attributes
CRGBPalette16 currentPalette = RainbowColors_p;
TBlendType    currentBlending = LINEARBLEND;
uint8_t startIndex = 0;

void setup()
{
  Serial.begin(1000000);
  FastLED.clear(true);
  FastLED.addLeds<WS2812B, LED_DATA_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(currentBrightness);
  FastLED.setDither(0);
}

void loop()
{
  switch (mode) 
  {
    case MODE_ANIMATION:
      fillLEDsFromPaletteColors();
      break;

    case MODE_AMBILIGHT:
      processIncomingData();
      break;

    case MODE_BLACK:
      showBlack();
      break;
  }
}

void addButter(byte ledNum)
{
  float r = ledsTemp[ledNum].r;
  float g = ledsTemp[ledNum].g;
  float b = ledsTemp[ledNum].b;

  leds[ledNum].r = (byte)((r + BUTTER_STRENGTH*leds[ledNum].r)/(BUTTER_STRENGTH+1));
  leds[ledNum].g = (byte)((g + BUTTER_STRENGTH*leds[ledNum].g)/(BUTTER_STRENGTH+1));
  leds[ledNum].b = (byte)((b + BUTTER_STRENGTH*leds[ledNum].b)/(BUTTER_STRENGTH+1));
}

void processIncomingData()
{
  if (waitForPreamble(TIMEOUT))
  {
    int blankLeds = 0;

    for (int ledNum = 0; ledNum < NUM_LEDS+1; ledNum++)
    {
      //we always have to read 3 bytes (RGB!)
      //if it is less, we ignore this frame and wait for the next preamble
      if (Serial.readBytes((char*)buffer, 3) < 3) return;


      if(ledNum < NUM_LEDS)
      {          
        byte blue = buffer[0];
        byte green = buffer[1];
        byte red = buffer[2];
        ledsTemp[ledNum] = CRGB(red, green, blue);

        // count all leds with luminance greater than 125
        // (it's a unsaturated color, near white)
        if(ledsTemp[ledNum].getLuma() > 195)  // у меня если меньше чем 195, то тухнет на желтом и голубом цвете
        {
          blankLeds += 1;
        }
      }
      else if (ledNum == NUM_LEDS)
      {
        //this must be the "postamble" 
        //this last "color" is actually a closing preamble
        //if the postamble does not match the expected values, the colors will not be shown
        if(buffer[0] == 85 && buffer[1] == 204 && buffer[2] == 165) {
          //the preamble is correct, update the leds!     

          // TODO: can we flip the used buffer instead of copying the data?
          for (int ledNum = 0; ledNum < NUM_LEDS; ledNum++)
          {
            addButter(ledNum);                                   
            //leds[ledNum]=ledsTemp[ledNum];
          }

          // how much "near white" leds must be on
          // to start reducing the brightness.
          if(blankLeds >= 25)
          {
            if(currentBrightness > 0) currentBrightness--;
            FastLED.setBrightness(currentBrightness);
          }
          else if (currentBrightness < BRIGHTNESS)
          {
            currentBrightness++;
            FastLED.setBrightness(currentBrightness);
          }
          
          //send LED data to actual LEDs
          FastLED.show();
        }
      }
    }
  }
  else
  {
    //if we get here, there must have been data before(so the user already knows, it works!)
    //simply go to black!
    mode = MODE_BLACK;
  }
}

bool waitForPreamble(int timeout)
{
  last_serial_available = millis();
  current_preamble_position = 0;
  while (current_preamble_position < PREAMBLE_LENGTH)
  {
    if (Serial.available() > 0)
    {
      last_serial_available = millis();

      if (Serial.read() == MESSAGE_PREAMBLE[current_preamble_position])
      {
        current_preamble_position++;
      }
      else
      {
        current_preamble_position = 0;
      }
    }

    if (millis() - last_serial_available > timeout)
    {
      return false;
    }
  }
  return true;
}

void fillLEDsFromPaletteColors()
{
  startIndex++;

  uint8_t colorIndex = startIndex;
  for ( int i = 0; i < NUM_LEDS; i++) {
    leds[i] = ColorFromPalette(currentPalette, colorIndex, BRIGHTNESS, currentBlending);
    colorIndex += 3;
  }

  FastLED.delay(1000 / UPDATES_PER_SECOND);

  if (Serial.available() > 0)
  {
    mode = MODE_AMBILIGHT;
  }
}

void showBlack()
{
  if (currentBrightness > 0)
  {
    currentBrightness--;
    FastLED.setBrightness(currentBrightness);
  }

  FastLED.delay(1000 / UPDATES_PER_SECOND);

  if (Serial.available() > 0)
  {
    mode = MODE_AMBILIGHT;
  }
}

------------------------------------------------------------------------------------------------------

Ambilight.ino --------------------------------------------------------------------------------------

/*
   Arduino interface for the use of WS2812 strip LEDs
   Uses Adalight protocol and is compatible with Boblight, Prismatik etc...
   "Magic Word" for synchronisation is 'Ada' followed by LED High, Low and Checksum
   @author: Wifsimster <wifsimster@gmail.com>
   @library: FastLED v3.001
   @date: 11/22/2015
*/
#include "FastLED.h"
#define NUM_LEDS 94
#define DATA_PIN 1
#define BRIGHTNESS 255  //range is 0..255 with 255 beeing the MAX brightness

// Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf)
#define serialRate 115200

// Adalight sends a "Magic Word" (defined in /etc/boblight.conf) before sending the pixel data
uint8_t prefix[] = { 'A', 'd', 'a' }, hi, lo, chk, i;

// Initialise LED-array
CRGB leds[NUM_LEDS];

// таймер для задержки отключения почти белого цвета /////////////////////
unsigned long tmr1;


void setup() {
  // Use NEOPIXEL to keep true colors
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);

  // Initial RGB flash
  LEDS.showColor(CRGB(255, 0, 0));
  delay(500);
  LEDS.showColor(CRGB(0, 255, 0));
  delay(500);
  LEDS.showColor(CRGB(0, 0, 255));
  delay(500);
  LEDS.showColor(CRGB(0, 0, 0));

  Serial.begin(serialRate);
  // Send "Magic Word" string to host
  Serial.print("Ada\n");
}

void loop() {
  // Wait for first byte of Magic Word
  for (i = 0; i < sizeof prefix; ++i) {
waitLoop:
    while (!Serial.available())
      ;
    ;
    // Check next byte in Magic Word
    if (prefix[i] == Serial.read()) continue;
    // otherwise, start over
    i = 0;
    goto waitLoop;
  }

  // Hi, Lo, Checksum
  while (!Serial.available())
    ;
  ;
  hi = Serial.read();
  while (!Serial.available())
    ;
  ;
  lo = Serial.read();
  while (!Serial.available())
    ;
  ;
  chk = Serial.read();

  // If checksum does not match go back to wait
  if (chk != (hi ^ lo ^ 0x55)) {
    i = 0;
    goto waitLoop;
  }

  memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
  // Read the transmission data and set LED values
  for (uint8_t i = 0; i < NUM_LEDS; i++) {
    byte r, g, b;
    while (!Serial.available())
      ;
    r = Serial.read();
    while (!Serial.available())
      ;
    g = Serial.read();
    while (!Serial.available())
      ;
    b = Serial.read();
    leds[i].r = r;
    leds[i].g = g;
    leds[i].b = b;

  }

  // Shows new values
  FastLED.show();
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Доброе утро

этому запросу место в платном разделе

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вам рассказать как нажимать на Ctrl+C и Ctrl+V? Или что?

demonstrius
Offline
Зарегистрирован: 30.04.2020

b707 пишет:

Доброе утро

этому запросу место в платном разделе

Вы это можете сделать платно?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Насколько я вижу - подсветка плавно тухнет если нет данных (превышен таймаут)  от ТВ

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А это не важно. "Доктор сказал в морг, значит в морг!"... )))))

demonstrius
Offline
Зарегистрирован: 30.04.2020

Komandir пишет:

Насколько я вижу - подсветка плавно тухнет если нет данных (превышен таймаут)  от ТВ

Нет, плавное отключение происходит и при прекращении поступления данных и при открытии программы, где общий фон приближен к белому цвету .

Я проверял этот скетч.