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

Roden

✩✩✩✩✩✩✩
19 Апр 2019
31
5
Либа не сырая, просто переделали её на темплейты, инициализация объекта microLed сейчас по другому.

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

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

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
long ledColor = CRGB::Aqua; //FastLED
в новом варианте
strip.setColor(3, AQUA); // диод 3, цвет AQUA
а как задать всей ленте?)
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Roden,
error: 'strip' does not name a type

перенес в блок setup, пока норм)
 

Roden

✩✩✩✩✩✩✩
19 Апр 2019
31
5
@ASM,
C++:
#define NUMLEDS    10
#define PIN    8
microLED<NUMLEDS, PIN, LED_WS2812, ORDER_RGB> strip(); // инициализация объекта типа microLED
strip.fill(mHEX(0xff0000)); // залить всю ленту красным цветом
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
microLED<NUMLEDS, PIN, LED_WS2812, ORDER_RGB> strip(); // инициализация объекта типа microLED
это в новой библиотеке
в старой 'microLED' is not a template
strip.fill(mHEX(0xff0000));
нельзя так, аналогично выше 'strip' does not name a type

желательно привязать цвет к переменной ledColor, т.к. весь код завязан на нем
 

Roden

✩✩✩✩✩✩✩
19 Апр 2019
31
5
@ASM,
C++:
#define NUMLEDS    10
#define PIN    8
microLED<NUMLEDS, PIN, LED_WS2812, ORDER_RGB> strip; // инициализация объекта типа microLED
strip.fill(mHEX(0xff0000)); // залить всю ленту красным цветом
Упс, после strip не нужны пустые скобки
Проверил у себя, на третьей версии всё компилируется.
В старой версии надо дефайнить #define ORDER_RGB если ты хочешь работать с RGB вместо GRB, и инициализировать ленту по другому:
microLED strip(указатель на LEDData буффер (массив), количество пикселей, пин)

1605293526212.png
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Roden, для моей ленты //microLED<NUM_LEDS, LED_PIN, LED_WS2812, ORDER_GRB> strip;
но в старой библиотеке нет такого, там проще #define ORDER_GRB

сейчас нужно присвоить long ledColor = strip.fill(mCOLOR(AQUA)); или long ledColor = mCOLOR(AQUA);
более подходит struct ledColor = mCOLOR(AQUA); , но выдает expected unqualified-id before '=' token

или может таблицу переделать
long ColorTable[16] = {
CRGB::Amethyst,
CRGB::Aqua,
..................
 
Изменено:

Roden

✩✩✩✩✩✩✩
19 Апр 2019
31
5
Видимо не совсем понял что надо, залить всю ленту одним цветом на старой версии?
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Roden, да, надо залить, причем через переменную, т.к. в коде есть
leds[cursor] = ledColor;
ledColor = ColorTable[2];
все на них завязло
переделать
long ledColor = CRGB::Aqua;
CRGB::Aqua,
 

Roden

✩✩✩✩✩✩✩
19 Апр 2019
31
5
1605296104436.png
C++:
LEDdata ledColor = mHEX(AQUA);
strip.fill(ledColor);
strip.show();
 
  • Лойс +1
Реакции: ASM

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
C++:
//Скетч использует 23928 байт (77%) памяти устройства. Всего доступно 30720 байт.
//Глобальные переменные используют 1574 байт (76%) динамической памяти, оставляя 474 байт для локальных переменных. Максимум: 2048 байт.
//=>microLED
//Скетч использует 22342 байт (72%) памяти устройства. Всего доступно 30720 байт.
//Глобальные переменные используют 1558 байт (76%) динамической памяти, оставляя 490 байт для локальных переменных. Максимум: 2048 байт.
#define REPLACE_FASTLED
#define COLOR_DEBTH 3
#include <microLED.h>
//#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 LED_PIN 6 // Пин дата от ленты
//#define DST_PIN 2  // Define DST adjust button pin
#define MIN_PIN 5  // Пин минутной кнопки
#define HUR_PIN 4  // Пин часовой кнопки

// сигнальный провод подключен к 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];
microLED strip(leds, NUM_LEDS, LED_PIN);
#define FastLED strip
#define LEDS strip
// 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)
LEDdata ledColor = mHEX(AQUA);
//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
  };*/

LEDdata ColorTable[17] = {
  mHEX(WHITE),
  mHEX(AQUA),
  mHEX(GRAY),
  mHEX(BLACK),
  mHEX(RED),
  mHEX(MAROON),
  mHEX(ORANGE),
  mHEX(YELLOW),
  mHEX(OLIVE),
  mHEX(LIME),
  mHEX(GREEN),
  mHEX(SILVER),
  mHEX(TEAL),
  mHEX(BLUE),
  mHEX(NAVY),
  mHEX(MAGENTA),
  mHEX(PURPLE)
};

void setup() {
  Serial.begin(9600);
  time.begin();
  //  запуск датчиков
  sensor.begin(); //датчики
  sensors.begin();//датчик уличной температуры
  Wire.begin();
  //  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);
  LEDS.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);//подача земли на барометр

  //  pinMode(8, OUTPUT); //контакт GND датчика осв
  pinMode(9, OUTPUT); //контакт VCC датчика осв
  //  digitalWrite(8, LOW);//подача земли на датчик осв
  digitalWrite(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;
  int minute = time.minutes;
  int second = time.seconds;
  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;
  return (second);
};

// Выбор яркости по данным датчика освещенности
void BrightnessCheck() {
  int hour = time.Hours;
  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;
  };
};


// Функция вывода температуры с датчика барометра
void TempToArray() {
  sensor.begin();
  int celsius = sensor.temperature - 1;
  Serial.print(celsius);
    Serial.print(" | ");  
    Serial.println(sensor.temperature);
  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.print(celsius);
    Serial.print(" | ");  
    Serial.println(sensors.getTempCByIndex(0));

    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.print(davlenie);
  Serial.print(" | ");  
  Serial.println(sensor.pressure);

  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 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 loop()  // Main loop
{
  //  DSTcheck(); // Check DST
  BrightnessCheck();
  TimeAdjust(); // Check to se if time is geting modified

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

  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);
  /*
    //  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
}

Провожу эксперименты заново, т.к. часы толком не работают.
Внедрил библиотеку microLED взамен FastLED больше ничего не делал.
Итого: в мониторе порта все идеально.
В реальности на часах стопорится отображение на TempStreetToArray(); показывает показание и все.
Есть мысли, из-за чего?)
 

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

★★★★✩✩✩
2 Авг 2018
727
208
Провожу эксперименты заново, т.к. часы толком не работают.
Внедрил библиотеку microLED взамен FastLED больше ничего не делал.
Итого: в мониторе порта все идеально.
В реальности на часах стопорится отображение на TempStreetToArray(); показывает показание и все.
Есть мысли, из-за чего?)
Сомневаюсь, что найдется много желающих копаться в 700+ строках говнокода. Могу только общий совет дать: выкидывай код постепенно, постарайся получить "минимально нерабочую" версию.

Либо более "фундаментальный" вариант: сделай свой класс для вывода на дисплей, чтоб у него наружу торчали только понятные методы, начиная с базовых, типа зажечь/погасить сегмент Х в позиции У, потом вывести символ в позиции У, потом вывести строку символов, потом вывести число.

Тогда дисплей будет гораздо проще проверить отдельно от всего остального.
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
Сомневаюсь, что найдется много желающих копаться в 700+ строках
не надо копаться во всем, все функции работают)
код рабочий с FastLED, сделана миграция на microLED и почему-то заканчивается отображение на TempStreetToArray(); хотя в мониторе полноценно все идет в цикле. Может кто-то попадался на таком или библиотека не тянет.

если ничего не решится, не страшно, памяти освобождает немного.
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
В реальности на часах стопорится отображение на TempStreetToArray(); показывает показание и все.
Есть мысли, из-за чего?)
потому что говнокод, как уже верно заметили выше...

Если всего в ленте 114 диодов, но в коде упорно, в каждой процедуре, написано вот такое
C++:
int cursor = 114; // last led number
то рано или поздно оно "выстрелит"
Программа стопорится не в процедуре TempStreetToArray(); - ее она отрабатывает и зависает в следующей, PressToArray(). которая начинается вот с такого цикла:
C++:
for (int i = 86; i <= 114; i++)
  {
    leds[i] = 0x000000;
  }
Все понятно или обьяснить? - обьясню, поскольку тут не все знатоки Си... . У нас в ленте 114 диодов, элементы массивов Си нумеруются с нуля, поэтому в массиве leds индексы изменяются от 0 до 113. А автор кода пишет в leds[114]. Результат - "распашка памяти" и зависание программы.

не надо копаться во всем, все функции работают)
ну-ну.. . работают... Редкостное Г.
Откуда вы все время этот жуткий код притаскиваете? Да там почти на каждой строчке косяки, это реально говнокод.
И ведь давно уже есть несколько исправленных вариантов этого скетча - под любое число диодов на сегмент, с нормальным кодированием и выводом цифр, а не через задницу, как тут. А все равно откуда-то тащат "это"... Коды выложены в ветке "Большие часы на адресных диодах" в нескольких вариантах начиная примерно с третьей страницы.
 
Изменено:
  • Лойс +1
Реакции: ASM и Roden

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
Откуда вы все время этот жуткий код притаскиваете?
так код был в интернете, на то время не было сборщиков тут, с 2018 года у меня проект начался, скетч много переделывал, чтобы заработал, потом допиливал датчики) Сейчас решил обновить код на свежие либы, облегчить память) планирую еще на esp запустить, заказал плату.
Коды выложены в ветке "Большие часы на адресных диодах"
посмотрю)
@bort707,
for (int i = 86; i <= 114; i++) { leds = 0x000000; }
видно FastLED такой код игнорировал, а microLED уже не пропустил)
поменял на 113, все заработало)
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
3,046
909
идно FastLED такой код игнорировал, а microLED уже не пропустил)
поменял на 113, все заработало)
дело не в библиотеке, за границу масива вы в любом случае попадаете. А дальше как повезет - если в этом месте памяти нет чувствительных данных - программа может продолжать работать, иногда долго. А если не повезло и там что-то важное - сдохнет сразу.
 
  • Лойс +1
Реакции: kostyamat и ASM

Jools

✩✩✩✩✩✩✩
16 Ноя 2020
4
0
Почему при использовании microLed перестает работать digitalRead, в частности библиотека GyverButton.
Вот такой код при нажатии на кнопку не работает. Если закомментировать в коде strip.show(), то в консоль выводиться Click при нажатии на кнопку.

C++:
#include "config.h"
#include <microLED.h>
#include <GyverButton.h>

microLED<NUM_LEDS, DATA_PIN, LED_WS2811, ORDER_RGB, CLI_AVER, SAVE_MILLIS> strip;
GButton btn(BTN_PIN);
void setup() {
    Serial.begin(9600);
    strip.clear();
    strip.fill(mGreen);
    strip.show();
}
        
void loop() {
    btn.tick();
    if(btn.isSingle()) {
        Serial.println("Click");
    }
}
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Jools, может strip надо в loop перенести?
Ну и порт кнопки не указан.
 

Jools

✩✩✩✩✩✩✩
16 Ноя 2020
4
0
Код выше рабочий. Код кнопки в config.h вынесен. Если закоментить strip.show(), то кнопка начинает работать.

Если в loop перенести такое же поведение.

C++:
#include "config.h"
#include <microLED.h>
#include <GyverButton.h>

microLED<NUM_LEDS, DATA_PIN, LED_WS2811, ORDER_RGB, CLI_AVER, SAVE_MILLIS> strip;
GButton btn(BTN_PIN);
void setup() {
    Serial.begin(9600);
}
        
void loop() {
    
    btn.tick();
    if(btn.isSingle()) {
        Serial.println("Click");
    }
    strip.clear();
    strip.fill(mGreen);
    strip.show();
}
Вот config.h
C++:
#define COLOR_DEBTH 3
#define NUM_LEDS 100
#define BTN_PIN 3 
#define DATA_PIN 6 
#define BRIGHTNESS 180
#define CRT_SQUARE
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
C++:
void loop() {

  btn.tick();
  if (btn.isSingle()) {
    Serial.println("Click");

    strip.clear();
    strip.fill(mGreen);
    strip.show();
  }
}
а если так?
 

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

★★★★★★★
14 Авг 2019
4,253
1,297
Москва
А лента окрашивается зеленым ? Если в 1-ом коде сделать так, то что выведет в монитор ?
C++:
void setup() {
    Serial.begin(9600);
    Serial.println(1);
    strip.clear();
    Serial.println(2);
    strip.fill(mGreen);
    Serial.println(3);
    strip.show();
    Serial.println(4);
}
 
  • Лойс +1
Реакции: Roden

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

★★★★✩✩✩
2 Авг 2018
727
208
Почему при использовании microLed перестает работать digitalRead, в частности библиотека GyverButton.
Вот такой код при нажатии на кнопку не работает. Если закомментировать в коде strip.show(), то в консоль выводиться Click при нажатии на кнопку.

C++:
#include "config.h"
#include <microLED.h>
#include <GyverButton.h>

microLED<NUM_LEDS, DATA_PIN, LED_WS2811, ORDER_RGB, CLI_AVER, SAVE_MILLIS> strip;
GButton btn(BTN_PIN);
void setup() {
    Serial.begin(9600);
    strip.clear();
    strip.fill(mGreen);
    strip.show();
}
      
void loop() {
    btn.tick();
    if(btn.isSingle()) {
        Serial.println("Click");
    }
}
Предположим, что микроЛЕД порты портит. Попробуй перенести кнопку на пин отличный от 0--7
 
Изменено:

Jools

✩✩✩✩✩✩✩
16 Ноя 2020
4
0
C++:
void loop() {

  btn.tick();
  if (btn.isSingle()) {
    Serial.println("Click");

    strip.clear();
    strip.fill(mGreen);
    strip.show();
  }
}
а если так?
Если так, то отрабатывает первый клик, лента светится зеленым и дальнейшие нажатия не отрабатывают (к консоли только одно сообщение Click)

А лента окрашивается зеленым ? Если в 1-ом коде сделать так, то что выведет в монитор ?
C++:
void setup() {
    Serial.begin(9600);
    Serial.println(1);
    strip.clear();
    Serial.println(2);
    strip.fill(mGreen);
    Serial.println(3);
    strip.show();
    Serial.println(4);
}
Если так, то в коносоли:
1
2
3
4

И лента зеленая.

На FastLed как раз все работает и кнопка и лента. Стал переводить на microLed и тут эта проблема вылезла.
Возможно из-за прерываний, т.к. в описании написано, что библиотека с прерываниями колдует.

Поковырял библиотеку. Глюк происходит в методе sendRaw, там где ассемблерный код идет.

C++:
case LED_WS2811:
            asm volatile (
            "LDI  r17 ,8        \n\t"       // Загружаем в счетчик циклов 8
            "_LOOP_START_%=:       \n\t"       // Начало основного цикла
            .......
Если закоментить, то клики отрабатывают, но соответственно лента не фурычит, т.к. это самый главный метод.
На этом мои полномочия все. С ассемблером не дружу.
Видно придется на FastLed возвращаться.