Большие часы на адресных светодиодах WS2812B

Вячеслав_45

★✩✩✩✩✩✩
10 Июл 2020
39
15
@ASM, встав свой код и будет плавно. Тут всего 4 уровня яркости

C++:
if(sensorValue>=101 && sensorValue <=200){LEDS.setBrightness(brightnessHigh);delay(1000);}
        else
    if(sensorValue>=201 && sensorValue <=252){LEDS.setBrightness(brightnessMid);delay(1000);}
        else
    if(sensorValue>=253){LEDS.setBrightness(brightnessLow);delay(1000);}
        else
    if(sensorValue<=100){LEDS.setBrightness(brightnessDay);delay(1000);}};
Ну или хотя бы так
 

Вячеслав_45

★✩✩✩✩✩✩
10 Июл 2020
39
15
@ASM, Сделай как у меня в 1.7 там плавно меняется. И просто сделано

@ASM, или я не понял вот это твой
C++:
void BrightnessCheck(){

  const byte sensorPin = A0;

  const byte brightnessLow = 5;   // низкая яркость

  const byte brightnessMid = 10;  // низкая яркость

  const byte brightnessHigh = 40; // высокая яркость

  const byte brightnessDay = 60;  // высокая яркость

 int sensorValue = analogRead(sensorPin);

  sensorValue = map(sensorValue, 0, 1023, 0, 255);

  LEDS.setBrightness(sensorValue);

//если в комнате светло, то светит ярче, если мало света, то тусклее, в ночном режиме светит тускло

    if(sensorValue>=221 && sensorValue <=240){LEDS.setBrightness(brightnessHigh);delay(1000);}

        else

    if(sensorValue>=241 && sensorValue <=252){LEDS.setBrightness(brightnessMid);delay(1000);}

        else

    if(sensorValue>=253){LEDS.setBrightness(brightnessLow);delay(1000);}

        else

    if(sensorValue<=220){LEDS.setBrightness(brightnessDay);delay(1000);}};
А хочеш сделать так
C++:
#define max_bright 100       // максимальная яркость (0 - 255)

#define min_bright 10        // минимальная яркость (0 - 255)

#define bright_constant 1000  // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость

#define coef 0.1             // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость

void BrightnessCheck() {

  if (auto_bright) {                         

    if (millis() - bright_timer > 100) {     

      bright_timer = millis();               

      new_bright = map(analogRead(BRI_PIN), 0, bright_constant, min_bright, max_bright);   

      new_bright = constrain(new_bright, max_bright, min_bright);    //поменял местами max и min                     

      new_bright_f = new_bright_f * coef + new_bright * (1 - coef);

      LEDS.setBrightness(new_bright_f);}}};
 

ASM

★✩✩✩✩✩✩
26 Окт 2018
190
14
Сделай как у меня в 1.7
Сделал, попробую потом отладить яркость, в зависимости от освещения
вроде понял, просто в своем примере делал комфортную яркость под разную освещенность комнаты по показаниям датчика.
а т.к. переписываю код полностью, сравнивая последние скетчи от разных авторов и внедряя в свой, споткнулся в этом месте)
 

bort707

★★✩✩✩✩✩
21 Сен 2020
263
66
@Вячеслав_45, в моем есть граничные переходы, что выглядит не очень, или делать плавные переходы...
@ASM, в твоем коде из #225 коэффициент неверный, поэтому и переходы неплавные
Подставь там в третьей строчке вместо
C++:
#define coef 0.1
значение 0.9 или 0.8

А так это самый правильный вариант настройки, без резких изменений и ступенек яркости
 

ASM

★✩✩✩✩✩✩
26 Окт 2018
190
14
в твоем коде из #225 коэффициент неверный, поэтому и переходы неплавные
в моем коде нет такого) это я ваши привел из темы)
сейчас поставлю по аналогии с Вячеславом, только константы поменяю, почему-то на ночь у них яркая подсветка стоит, а не наоборот)
 

ASM

★✩✩✩✩✩✩
26 Окт 2018
190
14
Вот, переписал код, используя наработки из этой темы, надеюсь стало лучше)))
Какие будут замечания?) Код в loop буду переделывать на millis, чтобы время удобней было корректировать...
C++:
#include <DS3232RTC.h>
#include <FastLED.h>
#include <microDS18B20.h>
MicroDS18B20 sensors(2);
#include <iarduino_Pressure_BMP.h>
iarduino_Pressure_BMP sensor(0x76); //Барометр

#define LEDS_IN_SEGMENT 4     // Задаём сколько у нас светодиодов в сегменте
#define DOTS_NUM 2            // Задаём сколько у нас разделительных точек
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) // Вычисляем кол-во светодиодов
#define NUM_COLORS 16         // Количество цветов
#define COLOR_CHANGE 0        // Смена цвета ( 0 - никогда, 1 - раз в минуту, 2 - каждые десять минут, 3 - каждый час, 4 - каждые десять часов)
#define max_bright 200        // максимальная яркость (0 - 255)
#define min_bright 10         // минимальная яркость (0 - 255)

#define COLOR_ORDER GRB  // Тип ленты
#define LED_PIN 6  // Пин дата от ленты
#define MIN_PIN 5  // Пин минутной кнопки
#define HUR_PIN 4  // Пин часовой кнопки
#define BRI_PIN A0 // PIN фоторезистора

CRGB leds[NUM_LEDS]; // Define LEDs strip

uint8_t  digits[] = {
  0b00111111,     // Digit 0
  0b00100001,     // Digit 1
  0b01110110,     // Digit 2
  0b01110011,     // Digit 3
  0b01101001,     // Digit 4
  0b01011011,     // Digit 5
  0b01011111,     // Digit 6
  0b00110001,     // Digit 7
  0b01111111,     // Digit 8
  0b01111011,     // Digit 9
  0b01111000,     // Digit * градус  10
  0b00011110,     // Digit C         11
  0b01111100,     // Digit P         12
  0b00000000,     // Blank           13
  0b01000000      // Digit -         14
};

bool Dot = true;  //переменная для точек
//bool TempShow = true;  //переменная для температуры
//bool PressShow = true; //переменная для давления
int last_digit = 0;
byte set_light;
byte brightness;

//управление цветом
//int ledColor = 0x00FFFF; // Color used (in hex)
long ledColor = CRGB::Blue; // Color used (in hex)
//массив цветов, для рандом при включенном режиме cylon(); ledColor =  ColorTable[random(16)];
long ColorTable[NUM_COLORS] = {
  CRGB::Amethyst,
  CRGB::Aqua,
  CRGB::Blue,
  CRGB::Chartreuse,
  CRGB::DarkGreen,
  CRGB::DarkMagenta,
  CRGB::DarkOrange,
  CRGB::DeepPink,
  CRGB::Fuchsia,
  CRGB::Gold,
  CRGB::GreenYellow,
  CRGB::LightCoral,
  CRGB::Tomato,
  CRGB::Salmon,
  CRGB::Red,
  CRGB::Orchid
};

void setup() {
  Serial.begin(9600);
  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);
  pinMode(MIN_PIN, INPUT_PULLUP); // Define Minutes adjust button pin
  pinMode(HUR_PIN, INPUT_PULLUP); // Define Hours adjust button pin

  pinMode(A3, OUTPUT); //контакт GND барометра
  digitalWrite(A3, LOW);//подача земли на барометр

  pinMode(9, OUTPUT); //контакт VCC датчика осв
  digitalWrite(9, HIGH);//подача питания на датчик осв
}

int GetTime() {
  tmElements_t Now;
  RTC.read(Now);
  int hour = Now.Hour;
  int minute = Now.Minute;
  int second = Now.Second;
  Serial.print(hour);   Serial.print(":");  // Вывод часов
  Serial.print(minute); Serial.print(":");  // Вывод минут
  Serial.print(second); Serial.println(""); // Вывод секунд
  Dot = second % 2;
  return (hour * 100 + minute);
};

int GetSecond() {
  tmElements_t Now;
  RTC.read(Now);
  int second = Now.Second;
  return (second);
};

void BrightnessCheck() {
  int sensor_value = analogRead(BRI_PIN);
  if (set_light == 0) brightness = map(sensor_value, 0, 1023, max_bright, min_bright);
  else brightness = set_light * 10;
  LEDS.setBrightness(brightness);
}

void TimeToArray()
{
  int Now = GetTime(); // Получаем время
  Dots(Dot);
  for (int i = 1; i <= 4; i++) {
    int digit = Now % 10; // Получаем последнюю цифру в времени
    int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
    if (i > 2) {
      cursor -= DOTS_NUM;
    }
    if ( i == 4 & digit == 0)Digit(digits[13], cursor); //Если впереди ноль, то выключаем его
    else
      Digit(digits[digit], cursor);                     //Иначе показываем символ
    if ( i == COLOR_CHANGE) {                           //Как часто менять цвет
      if (digit != last_digit) {
        ledColor =  ColorTable[random(NUM_COLORS)];    // Случайный цвет из таблицы
      }
      last_digit = digit;
    }
    Now /= 10;
  };
};

void TempStreetToArray() {
  sensors.requestTemp();
  int celsius = sensors.getTemp();
  Serial.println (celsius);
  Dots(0);
  Digit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7));
  int digit = abs (celsius % 10);
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));
  digit = celsius / 10;
  if (digit == 0)Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //Если впереди ноль, то выключаем его
  else
    Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2));
  if (sensors.getTemp() <= -1)Digit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));//если < или = -1, то показываем -
  else
    Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //иначе выключаем
};

void TempToArray() {
  sensor.begin();
  int celsius = sensor.temperature - 1; // датчик за часами, часы на стене, там температура чуть выше
  Serial.println (celsius);
  Dots(0);
  Digit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7));
  int digit = abs (celsius % 10);
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));
  digit = celsius / 10;
  if (digit == 0)Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //Если впереди ноль, то выключаем его
  else
    Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));
  Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //отключаем
};

void PressToArray() {
  sensor.begin();
  int davlenie = sensor.pressure;
  Serial.println (davlenie);
  Dots(0);
  int digit = davlenie % 10;
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7));
  digit = davlenie % 100 / 10;
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));
  digit = davlenie / 100;
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));
  Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //отключаем
};

void TimeAdjust() {
  int buttonH = digitalRead(HUR_PIN);
  int buttonM = digitalRead(MIN_PIN);
  if (buttonH == LOW || buttonM == LOW) {
    delay(200);
    tmElements_t Now;
    RTC.read(Now);
    int hour = Now.Hour;
    int minutes = Now.Minute;
    int second = Now.Second;
    if (buttonH == LOW) {
      if (Now.Hour == 23) {
        Now.Hour = 0;
      }
      else {
        Now.Hour += 1;
      };
    } else {
      if (Now.Minute == 59) {
        Now.Minute = 0;
      }
      else {
        Now.Minute += 1;
      };
    };
    RTC.write(Now);
  }
}

void Dots (boolean Dot_On) {
  leds[56] = (Dot_On) ? ledColor : 0;
  leds[57] = (Dot_On) ? ledColor : 0;
}

void Digit (uint8_t digit, uint8_t cursor) {
  for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1) {
    for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++) {
      leds[cursor] = (digit & mask) ? ledColor : 0;
      cursor ++;
    }
  }
}

void loop()
{
  BrightnessCheck();
  TimeAdjust();
  TimeToArray();
  FastLED.show();
  delay(1000);
  TimeToArray();
  FastLED.show();
  delay(1000);
  TimeToArray();
  FastLED.show();
  delay(1000);
  TimeToArray();
  FastLED.show();
  delay(1000);
  TimeToArray();
  FastLED.show();
  delay(1000);
  TempToArray();
  FastLED.show();
  delay(2000);
  TempStreetToArray();
  FastLED.show();
  delay(2000);
  PressToArray();
  FastLED.show();
  delay(2000);
}
Попробовал скодить с millis
Первый вариант:
  TTime = millis();
    if (millis() - TTime == 5000)TimeToArray();
    if (millis() - TTime == 7000)TempToArray();
    if (millis() - TTime == 9000)TempStreetToArray();
    if (millis() - TTime == 11000)PressToArray();
никакой реакции)
Второй вариант:
      TTime = millis();
    if (millis() - TTime == 5000) {
      TimeToArray();
      THome = millis();
    }
    if (millis() - THome == 2000) {
      TempToArray();
      TStreet = millis();
    }
    if (millis() - TStreet == 2000) {
      TempStreetToArray();
      TPress = millis();
    }
    if (millis() - TPress == 2000) {
      PressToArray();
    }
показывает показания датчиков одним циклом, куда копать?)
 
Последнее редактирование: