ARDUINO microLED. Обсуждение библиотеки

xof

★✩✩✩✩✩✩
24 Окт 2020
123
44
Всем привет,
Возможно тупой вопрос, но что-то я завис..
Вопрос скорее по основам, чем по библиотеке, но лучше заголовка для темы я не придумал.
Я хочу из прошивки иметь возможность менять количество диодов в массиве типа LEDdata (библиотека Сани - microLED).

Была мысль сделать функцию и записывать новое значение в eeprom и при запуске читать значение и формировать массив, что-то вроде такого
C++:
#include <EEPROM.h>
const int AMOUNT = EEPROM.read(1);

#include <microLED.h>
LEDdata LEDs[AMOUNT];
и т.д.
Но в результате получаю ошибку -
error: array bound is not an integer constant before ']' token
LEDdata LEDs[AMOUNT];

Что в принципе ожидаемо если разобраться. 🙈

Инициализировать в setup тоже нельзя, будет недоступна в других методах.
С++ не совсем мой язык, поэтому чувствую что я упускаю что-то очевидное.
Сильно камнями не кидайтесь.
Спасибо.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,179
1,278
Москва
Под массивы выделяется СТАТИЧЕСКАЯ память. Что бы менять размер нужно прочитать про ДИНАМИЧЕСКИЕ массивы. И не факт, что библиотеки скушают такие массивы.
Но обычно количество светодиодов не какая то постоянно меняющаяся величина. Их строго определенное кол-во. Что бы их стало больше или меньше надо что то паять. что то варить, прикручивать и приколачивать.
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
Попробуй так. Проверить мне не на чём, но вдруг угадал:
C++:
#include <EEPROM.h>
#include <microLED.h>

const byte pinLED = 4;

int AMOUNT = 0;
LEDdata *leds;
microLED* strip;

void setup() {
  AMOUNT = EEPROM.read(1);
  leds = new LEDdata(AMOUNT);
  strip = new microLED(leds, AMOUNT, pinLED);
}

void loop() {
  for(int i = 0; i < AMOUNT; i++) {
    strip->setRGB(i, 255, 0, 255);
  }
  strip->show();
}
 
  • Лойс +1
Реакции: xof

xof

★✩✩✩✩✩✩
24 Окт 2020
123
44
Попробуй так. Проверить мне не на чём, но вдруг угадал:
Не-а:
error: no matching function for call to 'microLED::microLED()'
microLED strip;

Создание пустого метода без аргументов в библиотеке ничего не решит.. Вроде..
Если что ссылка на библиотеку :

Я вот думаю, а что если просто заполнить массив на сколько хватит памяти мк, а использовать соответственно столько сколько есть диодов..
И вроде как проблема решена, на скорость это влиять не должно никак, мы не используем значения массива те что нам не нужны..



C++:
LEDdata LEDs[5];
microLED strip(LEDs, 5, STRIP_PIN);

void loop() {
  for(int i = 0; i < 5; i++)
  {
    leds[i].setRGB(i, 255, 0, 255);
  }
  strip.show();
}
и это:

C++:
LEDdata LEDs[1000];
microLED strip(LEDs, 5, STRIP_PIN);

void loop() {
  for(int i = 0; i < 5; i++)
  {
     leds[i].setRGB(i, 255, 0, 255);
  }
  strip.show();
}
Тоже самое с точки зрения производительности и всего кроме занимаемой памяти ?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,179
1,278
Москва
Так можно, решение не красивое, но рабочее. Обычное решение для школьников - я такое часто видел в решениях из задачников, так учат.
 

xof

★✩✩✩✩✩✩
24 Окт 2020
123
44
Это ты что компилировал?
Если сильно подрезать лишнее, то вот такое :

C++:
#include <EEPROM.h>
int AMOUNT = 0;
#define STRIP_PIN 6

#include <microLED.h>
LEDdata* stripLEDs;
microLED strip;

void setup()
{
  AMOUNT = EEPROM.read(1);
  stripLEDs = new LEDdata(AMOUNT);
  strip = microLED(stripLEDs, 5, STRIP_PIN);
}
void loop() {
  for(int i = 0; i < 5; i++)
  {
     stripLEDs[i] = mRGB(255, 0, 255);
  }
  strip.show();
}
Если в строчку 7 записать вот так -
microLED strip (stripLEDs, 5, STRIP_PIN);
то компилируется нормально, но пока не проверял как это будет работать..

Так можно, решение не красивое, но рабочее. Обычное решение для школьников - я такое часто видел в решениях из задачников, так учат.
Ну уже что-то. Дежурный вариант так сказать. Ищем дальше.
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
Если сильно подрезать лишнее, то вот такое :

C++:
#include <EEPROM.h>
int AMOUNT = 0;
#define STRIP_PIN 6

#include <microLED.h>
LEDdata* stripLEDs;
microLED strip;

void setup()
{
  AMOUNT = EEPROM.read(1);
  stripLEDs = new LEDdata(AMOUNT);
  strip = microLED(stripLEDs, 5, STRIP_PIN);
}
void loop() {
  for(int i = 0; i < 5; i++)
  {
     stripLEDs[i] = mRGB(255, 0, 255);
  }
  strip.show();
}
Если в строчку 7 записать вот так -
microLED strip (stripLEDs, 5, STRIP_PIN);
то компилируется нормально, но пока не проверял как это будет работать..
Ты от балды что ли вносишь изменения? Почему ты, допустим, заменил microLED* strip; на microLED strip;? Почему убрал new в strip = new microLED(leds, AMOUNT, pinLED);?
 

xof

★✩✩✩✩✩✩
24 Окт 2020
123
44
Попробовал.
Вот так вот всё работает как ожидается -
C++:
//#include <EEPROM.h>
//int AMOUNT = 0;
#define STRIP_PIN 6
#define ORDER_RGB

#include <microLED.h>
LEDdata stripLEDs[5];
microLED strip(stripLEDs, 5, STRIP_PIN); // массив, количество, пин ленты

//LEDdata *stripLEDs;
//microLED* strip;

void setup()
{
  Serial.begin(9600);
  strip.setBrightness(50);
  strip.clear();
  strip.show();
  delay(50);

  for (int i = 0; i < 5; i++)
  {
    stripLEDs[i] = mRGB(100, 0, 100);
    Serial.print("setting ");
    Serial.println(i);
    strip.show();
    delay(500);

  }
  /*
    delay(50);
    int test = 10;
    Serial.println("hello");
    EEPROM.write(1,test);
    delay(1000);
    AMOUNT = EEPROM.read(1);
    Serial.print("am is ");
    Serial.println(AMOUNT);
    stripLEDs = new LEDdata(AMOUNT);
    strip = new microLED(stripLEDs, AMOUNT, STRIP_PIN);
    strip->setBrightness(50);
    strip->clear();
    strip->show();

    for(int i = 0; i < 5; i++)
    {
     stripLEDs[i] = mRGB(100, 0, 100);
     Serial.print("setting ");
     Serial.println(i);
     strip->show();
     delay(500);

    }
  */
}
void loop() {
}

А вот так вот, всё компилируется, но лента признаков жизни не подаёт:

C++:
#include <EEPROM.h>
int AMOUNT = 0;
#define STRIP_PIN 6
#define ORDER_RGB

#include <microLED.h>
//LEDdata stripLEDs[5];
//microLED strip(stripLEDs, 5, STRIP_PIN); // массив, количество, пин ленты

LEDdata *stripLEDs;
microLED* strip;

void setup()
{
  Serial.begin(9600);
  /*
    strip.setBrightness(50);
    strip.clear();
    strip.show();
    delay(50);

    for (int i = 0; i < 5; i++)
    {
    stripLEDs[i] = mRGB(100, 0, 100);
    Serial.print("setting ");
    Serial.println(i);
    strip.show();
    delay(500);

    }
  */

  int test = 10;
  Serial.println("hello world");
  EEPROM.write(1, test);
  delay(1000);
  AMOUNT = EEPROM.read(1);
  Serial.print("AMOUNT = ");
  Serial.println(AMOUNT);
  stripLEDs = new LEDdata(AMOUNT);
  strip = new microLED(stripLEDs, AMOUNT, STRIP_PIN);
  strip->setBrightness(50);
  strip->clear();
  strip->show();
  delay(50);
  for (int i = 0; i < 5; i++)
  {
    stripLEDs[i] = mRGB(100, 0, 100);
    Serial.print("setting ");
    Serial.println(i);
    strip->show();
    delay(500);
  }
}
void loop() {
}
Заранее извиняюсь если я где-то что-то не углядел и сделал не так как было предложено.
Есть идеи что не так ?
 

xof

★✩✩✩✩✩✩
24 Окт 2020
123
44
Разрази меня гром. Работает.
Всем спасибо.
Ответ пометил, лойсы раздал.
 

xof

★✩✩✩✩✩✩
24 Окт 2020
123
44
Всем привет,

Сразу к делу. Библиотека microLED - используя сжатие цвета до 1 байта, диоды теряют способность плавно гаснуть\зажигаться (во всяком случае используя код ниже).
При 2 (и соответственно 3) байтах на глаз достаточно плавно, без рывков.
По коду - зажигаем по-диодно пачку диодов используя RGB с 0 до 255, гасим всю ленту сразу используя метод из библиотеки (который по сути делает то же самое).

C++:
#define STRIP_PIN 6
#define ORDER_GRB
#define COLOR_DEBTH 2

#include <microLED.h>

int AMOUNT = 0;

LEDdata *stripLEDs;
microLED *strip;

void setup()
{
  Serial.begin(9600);
  AMOUNT = 10;
  stripLEDs = new LEDdata[AMOUNT];
  strip = new microLED(stripLEDs, AMOUNT, STRIP_PIN);
  strip->setBrightness(255);
  strip->clear();
  strip->show();
  delay(50);
   
  //Плавно зажигаем
  float r, g, b;
  for (int j = 0; j < 256; j++) {
    for (int i = 0; i < 10; i++) {
      r = (j / 256.0) * 255;
      g = (j / 256.0) * 255;
      b = (j / 256.0) * 255;
      stripLEDs[i] = mRGB(r, g, b);
    }
    strip->show();
    delay(5);
  }
  //Плавно гасим
  int changeBright = 255;
  do {
    delay(5);
    strip->setBrightness(changeBright);
    strip->show();
    changeBright--;
  } while (changeBright > 0);
}
void loop() {
}

Почему это происходит понятно, но может есть у кого какие идеи как решить это ?
Или решение простое - максимальное сжатие = статичные цвета ?

И сразу вопрос 2, кто-нибудь использовал microLED на мега2560 ?
Работает ?
 

bort707

★★★★★★✩
21 Сен 2020
2,892
858
Почему это происходит понятно, но может есть у кого какие идеи как решить это ?
Или решение простое - максимальное сжатие = статичные цвета ?
если вам понятно, почему это происходит - то какие вопросы?
Если вы уменьшите разрешение графического файла в 10 раз, а потом разожмете его обратно - у вас будет не изображение, а сплошные квадраты.
Здесь ровно так же - либо полный цвет, либо отсутствие плавных переходов

Решение - не пытаться впихнуть в жалкую мегу тысячи диодов, возьмите СТМ или ЕСП, там памяти в разы больше и экономить с микроЛЕД не нужно будет
 
Изменено:

xof

★✩✩✩✩✩✩
24 Окт 2020
123
44
Ну да, понятно. Опыта с STM не имею пока, только минимально esp (ну и avr разумеется). Полистал матчасть, выглядит что stm32 больше подошла бы мне, учитывая желание использовать голый камень. Правда выглядит что с библиотеками и информацией в целом не так сильно всё развито в том лесу. Пока буду писать что хочу под Мегу 2560, 8кб оперативки мне более чем хватит, параллельно уже заказал синюю таблетку (blue pill) на базе stm32, придёт, поиграюсь, посмотрю..
Neopixel вроде как работает с ней. OLED дисплей тоже. И кнопки тоже.
Больше мне ничего не надо. Пока что. Вроде.
Ладно, спасибо.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,179
1,278
Москва
Такой вопрос , если нужно плавно, то надо полноценно использовать МикроЛЕД. А если полноценно, то можно использовать и ФастЛЕД и Неопиксель со всеми их наворотами. И уж они то точно будут работать на меге
 

xof

★✩✩✩✩✩✩
24 Окт 2020
123
44
Такой вопрос , если нужно плавно, то надо полноценно использовать МикроЛЕД. А если полноценно, то можно использовать и ФастЛЕД и Неопиксель со всеми их наворотами. И уж они то точно будут работать на меге
Именно такой план и есть. (y)
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,282
950
58
Марий-Эл
Правда выглядит что с библиотеками и информацией в целом не так сильно всё развито в том лесу
Все библиотеки для ардуины перетягиваются на Blue Pill и Maple на ура. Если программировать умеете. Плюс к этому для Arduino IDE есть ядро позволяющее на нём писать как на Atmel. И средства разработки для STM уж более лучше и продвинутее чем Arduino IDE.
параллельно уже заказал синюю таблетку (blue pill)
Лучше было брать Maple. Ядро то же а памяти поболее.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,506
293
Всем привет, переделываю проект на библиотеки Gyver, кнопки и время перенеслись без особых проблем, но с microLED непонятки

есть строка
C++:
LEDdata leds[NUM_LEDS];
компилятор на нее ругается, не понимает, что такое LEDdata
'LEDdata' does not name a type; did you mean 'mData'?
в описаниях и примерах аналогично написано, разъясните)

Полный код:
#include <GyverButton.h>
#define MIN_PIN 5  // Пин минутной кнопки
#define HUR_PIN 4  // Пин часовой кнопки
GButton MinBut(MIN_PIN);
GButton HourBut(HUR_PIN);

#include <microWire.h>
#include <microDS3231.h>
MicroDS3231 rtc;

#include <GyverHacks.h>

#define REPLACE_FASTLED
#include <microLED.h>
#define LED_PIN 6 // Пин дата от ленты
#define NUM_LEDS 114 // 4*7*4 +2  Кол-во светодиодов
#define ORDER_GRB  // Тип ленты
#define COLOR_DEBTH 3   // цветовая глубина: 1, 2, 3 (в байтах)

//#include <DS3232RTC.h>
//#include <TimeLib.h>
//#include <Time.h>
//#include <Wire.h>
//#include <OneWire.h>
#include <DallasTemperature.h>
//#include <FastLED.h>
//#include <iarduino_RTC.h>
//iarduino_RTC time(RTC_DS1302,12,10,11);
//iarduino_RTC time(RTC_DS3231);

#include <iarduino_Pressure_BMP.h>
iarduino_Pressure_BMP sensor(0x76);

//#define NUM_LEDS 114 // 4*7*4 +2  Кол-во светодиодов
//#define COLOR_ORDER GRB  // Тип ленты

//#define DST_PIN 2  // Define DST adjust button pin

// сигнальный провод подключен к 2 пину на Arduino
#define ONE_WIRE_BUS_2 2

// настроим библиотеку 1-Wire для связи с датчиком
OneWire oneWire_out(ONE_WIRE_BUS_2);
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensors(&oneWire_out);

//CRGB leds[NUM_LEDS]; // Define LEDs strip
  LEDdata leds[NUM_LEDS];  // буфер ленты типа LEDdata (размер зависит от COLOR_DEBTH)
  microLED strip(leds, NUM_LEDS, LED_PIN);  // объект лента

// 0,0,0,0
// 1,1,1,1
//  1 2 3 4 5 6 7 8 9 10111213141516171819202122232425262728
byte digits[14][28] = {{0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 0
  {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, // Digit 1
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, // Digit 2
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 3
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, // Digit 4
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 5
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 6
  {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, // Digit 7
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 8
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 9 | 2D Array for numbers on 7 segment
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Digit *0
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, // Digit C
  {1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Digit -
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};  // Digit

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

//управление цветом
//int ledColor = 0x00FFFF; // Color used (in hex)
//long ledColor = CRGB::Aqua; // Color used (in hex)
myGrad.colors[] = mAqua;
//long ledColor = CRGB::MediumVioletRed;
//Random colors i picked up
//массив цветов, для рандом при включенном режиме cylon(); ledColor =  ColorTable[random(16)];
long ColorTable[16] = {
  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);
  setADCrate(1);
//  time.begin();
  //  запуск датчиков
  sensor.begin(); //датчики
  sensors.begin();//датчик уличной температуры
  Wire.begin();
//  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);

//  LEDS.setBrightness(75); // Установка яркости
strip.setBrightness(75);
  //  pinMode(DST_PIN, INPUT_PULLUP); // Define DST adjust button pin
  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);//подача земли на барометр
setPin(A3, LOW);

  //  pinMode(8, OUTPUT); //контакт GND датчика осв
  pinMode(9, OUTPUT); //контакт VCC датчика осв
  //  digitalWrite(8, LOW);//подача земли на датчик осв
//  digitalWrite(9, HIGH);//подача питания на датчик осв
setPin(9, HIGH);

  //  pinMode(A2, OUTPUT); //контакт GND часов
  //  pinMode(A1, OUTPUT); //контакт VCC часов
  //  digitalWrite(A2, LOW);//подача земли на часы
  //  digitalWrite(A1, HIGH);//подача питания на часы

  //  pinMode(A6, OUTPUT); //контакт GND уличного термометра, на общей земле сейчас
  //  pinMode(A7, OUTPUT); //контакт VCC уличного термометра, на дополнительном питании на ножке резистора
  //  digitalWrite(A6, LOW);//подача земли на уличный термометр
  //  digitalWrite(A7, HIGH);//подача питания на уличный термометр
}

// Get time in a single number, if hours will be a single digit then time will be displayed 155 instead of 0155
int GetTime() {
//  time.gettime();
  //  tmElements_t Now;
  // RTC.read(Now);
  //time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object
//  int hour = time.Hours;
  uint8_t hour = rtc.getHours();
//  int minute = time.minutes;
  uint8_t minute = rtc.getMinutes();
//  int second = time.seconds;
  uint8_t second = rtc.getSeconds();
  Serial.print(hour);   Serial.print(":");  // Вывод часов
  Serial.print(minute); Serial.print(":");  // Вывод минут
  Serial.print(second); Serial.println(""); // Вывод секунд
  //  if (second % 2==0) {Dot = false;}
  //    else {Dot = true;};
  Dot = second % 2;

  return (hour * 100 + minute);

};

int GetSecond() { //функция запроса текущей секунды, результат в переменной "second"
//  time.gettime();
//  int second = time.seconds;
uint8_t second = rtc.getSeconds();
  return (second);
};

// Выбор яркости по данным датчика освещенности
void BrightnessCheck() {
//  int hour = time.Hours;
uint8_t hour = rtc.getHours();
  const byte sensorPin = A0; // контакт датчика осв
  const byte brightnessLow = 5; // низкая яркость
  const byte brightnessMid = 10; // низкая яркость
  const byte brightnessHigh = 40; // высокая яркость
  const byte brightnessDay = 60; // высокая яркость
  int sensorValue = analogRead(sensorPin); // Считывание датчика
  // int sensorValue = digitalRead(sensorPin); // Считывание датчика
  //  Serial.print("Датчик: ");Serial.println(sensorValue);
  sensorValue = map(sensorValue, 0, 1023, 0, 255);//перевод диапазона измерения
  LEDS.setBrightness(sensorValue);
  //Serial.println(hour);
  //эксперименты освещенности в зависимости от времени
  // if (hour=23||hour>=0 && hour<=7) {LEDS.setBrightness(5);}
  //     else
  //   if (sensorValue == 0) {LEDS.setBrightness(brightnessHigh);}
  //   else {LEDS.setBrightness(brightnessLow);
  //     }
  //если в комнате светло, то светит ярче, если мало света, то тусклее, в ночном режиме светит тускло
  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);
  }

  //          Serial.println("Датчик: ");
  //     Serial.println(sensorValue);

};

// Конвертация времени в массив, для отображения на дисплее
void TimeToArray() {
  //   time.gettime();
  int Now = GetTime();  // Get time
  int cursor = 114; // last led number
  //Serial.print("Time is: ");Serial.println(Now);
  /*  if (DST){   // if DST is true then add one hour
     Now+=100;
    // Serial.print("DST is ON, time set to : ");Serial.println(Now);
    }; */
  //мигание светодиодов для секунд, горит цветом из установок, либо гаснет
  if (Dot) {
    leds[57] = ledColor;
    leds[56] = ledColor;
  }
  else  {
    leds[57] = 0x000000;
    leds[56] = 0x000000;
  };

  for (int i = 1; i <= 4; i++) {
    int digit = Now % 10; // get last digit in time
    if (i == 1) {
      //  Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");

      cursor = 86;

      for (int k = 0; k <= 27; k++) {
        // Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      // Serial.println();

      if (digit != last_digit)
      {
        //        cylon();
        //ledColor =  ColorTable[random(16)];
        ledColor =  ColorTable[2];

      }
      last_digit = digit;

    }
    else if (i == 2) {
      // Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");

      cursor = 58;

      for (int k = 0; k <= 27; k++) {
        // Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      // Serial.println();
    }
    else if (i == 3) {
      // Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 28;
      for (int k = 0; k <= 27; k++) {
        // Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      // Serial.println();
    }
    else if (i == 4) {
      // Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 0;
      for (int k = 0; k <= 27; k++) {
        // Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      // Serial.println();
    }
    Now /= 10;
  };
};
/*
  // функция вывода даты

  int GetDate(){
  time.gettime();
  int day=time.day;
  int month=time.month;
  Dot = false;
  return (day*100+month);
  DateToArray();};

  void DateToArray(){
  int Now = GetDate();  // Get time
  int cursor = 114; // last led number
   leds[57]=0x000000;
   leds[56]=0x000000;
  for(int i=1;i<=4;i++){
    int digit = Now % 10; // get last digit in time
    if (i==1){
    //  Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");

      cursor = 86;

      for(int k=0; k<=27;k++){
        // Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      // Serial.println();

      if (digit != last_digit)
      {
  //        cylon();
  //        ledColor =  ColorTable[random(16)];

      }
      last_digit = digit;

      }
    else if (i==2){
      // Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");

      cursor =58;

      for(int k=0; k<=27;k++){
        // Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      // Serial.println();
      }
    else if (i==3){
      // Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor =28;
      for(int k=0; k<=27;k++){
        // Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      // Serial.println();
      }
    else if (i==4){
      // Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor =0;
      for(int k=0; k<=27;k++){
        // Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      // Serial.println();
      }
    Now /= 10;
  };
  };
*/

// Функция вывода температуры с датчика барометра
void TempToArray() {
  sensor.begin();
  int celsius = sensor.temperature - 1;
  Serial.println(celsius);

  int cursor = 114; // last led number
  //отключение секундных точек
  leds[57] = 0x000000;
  leds[56] = 0x000000;

  for (int i = 1; i <= 4; i++) {
    int digit = celsius % 10; // get last digit in time
    if (i == 3) {
      //      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");

      cursor = 86;

      for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[11][k]);
        if (digits[11][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[11][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      //      Serial.println();
    }
    else if (i == 4) {
      //      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");

      cursor = 58;

      for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[10][k]);
        if (digits[10][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[10][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      //      Serial.println();
    }
    else if (i == 1) {
      //      Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 28;
      for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      //      Serial.println();
    }
    else if (i == 2) {
      //      Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 0;
      for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      //      Serial.println();
    }
    celsius /= 10;
  };
};

// Функция вывода температуры с уличного датчика
void TempStreetToArray() {
  sensors.begin();
  //    delay(1000);
  sensors.requestTemperatures();
  if (sensors.getTempCByIndex(0) < 0) {
    int celsius = (sensors.getTempCByIndex(0) * (-1));
    Serial.println(celsius);

    int cursor = 114; // last led number
    //отключение секундных точек
    leds[57] = 0x000000;
    leds[56] = 0x000000;

    for (int i = 1; i <= 4; i++) {
      int digit = celsius % 10; // get last digit in time

      if (i == 3) {
        //      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");

        cursor = 86;

        for (int k = 0; k <= 27; k++) {
          //        Serial.print(digits[10][k]);
          if (digits[10][k] == 1) {
            leds[cursor] = ledColor;
          }
          else if (digits[10][k] == 0) {
            leds[cursor] = 0x000000;
          };
          cursor ++;
        };
        //      Serial.println();
      }
      else if (i == 1) {
        //      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");

        cursor = 58;

        for (int k = 0; k <= 27; k++) {
          //        Serial.print(digits[digit][k]);
          if (digits[digit][k] == 1) {
            leds[cursor] = ledColor;
          }
          else if (digits[digit][k] == 0) {
            leds[cursor] = 0x000000;
          };
          cursor ++;
        };
        //      Serial.println();
      }
      else if (i == 2) {
        //      Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
        cursor = 28;
        for (int k = 0; k <= 27; k++) {
          //        Serial.print(digits[digit][k]);
          if (digits[digit][k] == 1) {
            leds[cursor] = ledColor;
          }
          else if (digits[digit][k] == 0) {
            leds[cursor] = 0x000000;
          };
          cursor ++;
        };
        //      Serial.println();
      }
      else if (i == 4) {
        //      Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
        cursor = 0;
        for (int k = 0; k <= 27; k++) {
          //        Serial.print(digits[12][k]);
          if (digits[12][k] == 1) {
            leds[cursor] = ledColor;
          }
          else if (digits[12][k] == 0) {
            leds[cursor] = 0x000000;
          };
          cursor ++;
        };
        //      Serial.println();
      }
      celsius /= 10;
    };
  }

  else
  {
    int celsius = (sensors.getTempCByIndex(0));
    Serial.println(celsius);

    int cursor = 114; // last led number
    //отключение секундных точек и точек от минуса, не помню нужны ли они и для чего делал))
    leds[0] = 0x000000;
    leds[1] = 0x000000;
    leds[2] = 0x000000;
    leds[3] = 0x000000;
    leds[57] = 0x000000;
    leds[56] = 0x000000;

    for (int i = 1; i <= 4; i++) {
      int digit = celsius % 10; // get last digit in time

      if (i == 3) {
        //      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");

        cursor = 86;

        for (int k = 0; k <= 27; k++) {
          //        Serial.print(digits[10][k]);
          if (digits[10][k] == 1) {
            leds[cursor] = ledColor;
          }
          else if (digits[10][k] == 0) {
            leds[cursor] = 0x000000;
          };
          cursor ++;
        };
        //      Serial.println();
      }
      else if (i == 1) {
        //      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");

        cursor = 58;

        for (int k = 0; k <= 27; k++) {
          //        Serial.print(digits[digit][k]);
          if (digits[digit][k] == 1) {
            leds[cursor] = ledColor;
          }
          else if (digits[digit][k] == 0) {
            leds[cursor] = 0x000000;
          };
          cursor ++;
        };
        //      Serial.println();
      }
      else if (i == 2) {
        //      Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
        cursor = 28;
        for (int k = 0; k <= 27; k++) {
          //        Serial.print(digits[digit][k]);
          if (digits[digit][k] == 1) {
            leds[cursor] = ledColor;
          }
          else if (digits[digit][k] == 0) {
            leds[cursor] = 0x000000;
          };
          cursor ++;
        };
        //      Serial.println();
      }
      else if (i == 4) {
        //      Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
        cursor = 0;
        for (int k = 0; k <= 27; k++) {
          //        Serial.print(digits[13][k]);
          if (digits[13][k] == 1) {
            leds[cursor] = ledColor;
          }
          else if (digits[13][k] == 0) {
            leds[cursor] = 0x000000;
          };
          cursor ++;
        };
        //      Serial.println();
      }
      celsius /= 10;
    };
  };
};

// Функция вывода давление с барометра
void PressToArray() {
  sensor.begin();
  int davlenie = sensor.pressure;
  Serial.println(davlenie);

  int cursor = 85; // last led number
  for (int i = 86; i <= 114; i++)
  {
    leds[i] = 0x000000;
  }
  //отключение секундных точек
  leds[56] = 0x000000;
  leds[57] = 0x000000;

  for (int i = 1; i <= 3; i++) {
    int digit = davlenie % 10; // get last digit in time
    if (i == 1) {
      //      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");

      cursor = 58;

      for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      //      Serial.println();
      last_digit = digit;
    }
    else if (i == 2) {
      //      Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");

      cursor = 28;

      for (int k = 0; k <= 27; k++) {
        //       Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      //      Serial.println();
      last_digit = digit;
    }
    else if (i == 3) {
      //      Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 0;
      for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      //      Serial.println();
    }
    //отключил первый символ и сдвинул регистр вправо, чтобы понятно было, какой датчик показывает температуру)
    /*    else if (i==2){
          Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
          cursor =0;
          for(int k=0; k<=27;k++){
            Serial.print(digits[digit][k]);
            if (digits[digit][k]== 1){leds[cursor]=ledColor;}
             else if (digits[digit][k]==0){leds[cursor]=0x000000;};
             cursor ++;
            };
          Serial.println();
          }*/
    davlenie /= 10;
  };
};

/*
  void DSTcheck(){
   int buttonDST = digitalRead(DST_PIN);
   if (buttonDST == HIGH){
    delay(500);
    ledColor = ColorTable[random(16)];

   };
  }
*/
/*
  //настройка времени
  void TimeAdjust(){
  int buttonH = digitalRead(HUR_PIN);
  int buttonM = digitalRead(MIN_PIN);
  if (buttonH == LOW || buttonM == LOW){
    delay(50);
     time.gettime();
  //    tmElements_t Now;
  //   RTC.read(Now);
    int hour=time.Hours;
    int minutes=time.minutes;
    int second =time.seconds;
      if (buttonH == LOW){
        if (hour== 23){hour=0;}
          else {hour += 1;};
        }else {
          if (minutes== 59){minutes=0;}
          else {minutes += 1;};
          };
   // RTC.write(Now);

  time.settime(0, minutes, hour);   }
  }
*/
void SetTime() {
  
  uint8_t hours = rtc.getHours();
  uint8_t minutes = rtc.getMinutes();
    HourBut.tick();
  if (HourBut.isClick()) {
    if (hours == 23) {
      hours = 0;
    }
    else {
      hours += 1;
    }
  }

  MinBut.tick();
  if (MinBut.isClick()) {
    if (minutes == 59) {
      minutes = 0;
    }
    else {
      minutes += 1;
    }
  }
  if (MinBut.isHold()) {
    if (minutes == 59) {
      minutes = 0;
    }
    else {
      minutes += 5;
    };
  }
  rtc.setTime(0, minutes, hours,"","","");

}



//вот эта функция отвечает за смену цветов и всяким эффектам, нужно открыть void fadeall и void cylon и открыть выше в коде))
// спецэффекты
//void fadeall() { for(int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); } }

/*
  void cylon () {
  static uint8_t hue = 0;
  Serial.print("x");
  // First slide the led in one direction
  for(int i = 0; i < NUM_LEDS; i++) {
    // Set the i'th led to red
    leds[i] = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds[i] = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(10);
  }
  Serial.print("x");

  // Now go in the other direction.
  for(int i = (NUM_LEDS)-1; i >= 0; i--) {
    // Set the i'th led to red
    leds[i] = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds[i] = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(10);
  }
  }
*/
void loop()  // Main loop
{
  //  DSTcheck(); // Check DST
  BrightnessCheck();
  //  TimeAdjust(); // Check to se if time is geting modified
  SetTime;
  //  TimeToArray(); // Get leds array with required configuration
  //  displayDate();
  //  TempToArray();
  //  PressToArray();

  //  if (TempShow == true)
  //  delay (5000);
  //    if (PressShow == true)
  //  delay (5000);
  //     if (DateShow == true)
  //  delay (5000);

  //очередность вывода показаний с датчиков и задержка отображения

  TimeToArray();
  strip.show();
  delay(1000);
  TimeToArray();
  strip.show();
  delay(1000);
  TimeToArray();
  strip.show();
  delay(1000);
  TimeToArray();
  strip.show();
  delay(1000);
  TimeToArray();
  strip.show();
  delay(1000);
  TempToArray();
  strip.show();
  delay(2000);
  TempStreetToArray();
  strip.show();
  delay(2000);
  PressToArray();
  strip.show();
  delay(2000);
  /*
    //  if (GetSecond()>=0 && GetSecond() <= 10 || (GetSecond()>=17 &&GetSecond()<=27) )
    //  {TimeToArray();} //вызов функции отображения времени 1

          if (GetSecond()>=16 && GetSecond()<=20 || (GetSecond()>=41 &&GetSecond()<=45))
            {TempStreetToArray();} //вызов функции отображения уличной температуры


            else if (GetSecond()>=8 && GetSecond()<=15 || (GetSecond()>=34 &&GetSecond()<=40))
              {TempToArray();} //вызов функции отображения температуры


              else if (GetSecond()>=21&& GetSecond()<=25 || (GetSecond()>=46 && GetSecond()<=50))
                {PressToArray();}//вызов функции отображения давления


                 else    {TimeToArray();} //вызов функции отображения времени

  */

  //  FastLED.show(); // Display leds array


}
 
Изменено:

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
Библиотека microLED обновилась 8 дней назад. LEDdata больше нету, есть mData. Есть и другие изменения. Так что лучше скачай версию постарее. Либо переделывай под новую.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,506
293
@Александр Симонов, mData подошла, но дальше ругается на error: invalid use of template-name 'microLED' without an argument list
походу сырая либа) я сначала старую установил, но потом увидел надпись и заменил на новую)
Попробую откатить версию)

Откат помог, буду дальше разбираться, надеюсь функций хватит)
 
Изменено: