Два скетча в один?

Алексей22

✩✩✩✩✩✩✩
25 Фев 2020
41
0
65
Доброго всем дня. Совсем не давно увлекся ардуино, увидев гирлянду на окне в YouTube. Купил ардуинку . Начал по чуть чуть ковырять программки. Загружая их в ардуинку NANO и выводить на 5 светодидов. Потихоньку с помощью гугла осваиваю программирование. И вот у меня возник вопрос на который нигде не могу найти ответ, три дня ковыряю инет. результатов ноль. Может где то и есть, но мне пока не повезло или может я чего то не понимаю. Хотя вполне возможно, все таки 60 лет.
1. Как остановить loop цыкл скетча или прописать энное количество раз?
2. Как слить несколько скетчей в один и заставить их работать по очередно по не сколько цыклов?

Скетчи к примеру
const int nDelay = 300; // задержка между загоранием светодиодов в мсек. Бегущий огонь.

const int pin1 = 2; // номер первого пина
const int pin2 = 10; // Число светодиодов
const int pin5 = pin2 + 1; // номер последнего пина + 1
void setup()
{
for (int i = pin1; i < pin5; ++i){

pinMode(i, OUTPUT);
}
}
void chaseLed(bool bState, const int t_nDelay = nDelay)
{
for (int i = pin1; i < pin5; ++i)
{
digitalWrite(i, bState);
delay(t_nDelay);
}
}
void loop()
{
chaseLed(HIGH);
chaseLed(LOW);
}
int d = 500; // скорость мигания светодиода. Заполнение и затухание ряда.
void setup(){
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);

}
void loop() {
digitalWrite(3, HIGH);
delay(d);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
delay(d);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
delay(d);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
delay(d);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
delay(d);
digitalWrite(7, LOW);
digitalWrite(6, HIGH);
delay(d);
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
delay(d);
digitalWrite(5, LOW);
digitalWrite(4, HIGH);
delay(d);
digitalWrite(4, LOW);
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
По сути эти 2 кода не совмещаются, т.к. они больше основаны на линейном программировании, вижу цель - иду к ней. А то , что по дороге за хлебом надо сходить это уже не важно.
Ну поизвращавшись совместить можно, а если 3-ий вариант добавить что будет ? Опа
Тема раз
Тема два
 

egor-kartop

✩✩✩✩✩✩✩
8 Сен 2018
8
1
Almaty
Цикл loop() на то и цикл для выполнения программ микроконтроллером, поэтому остановить его никак нельзя (если говорить буквально). Не совсем понял вас, но попробую помочь. Без изощрений вот так ваш скетч будет выглядеть:
C-like:
const int nDelay = 300; // задержка между загоранием светодиодов в мсек. Бегущий огонь.

const int pin1 = 2; // номер первого пина
const int pin2 = 10; // Число светодиодов
const int pin5 = pin2 + 1; // номер последнего пина + 1
const int nraz = 5;

int d = 500; // скорость мигания светодиода. Заполнение и затухание ряда.

int n = 0;

void setup()
{
for (int i = pin1; i < pin5; ++i)
{
pinMode(i, OUTPUT);
}
}

void chaseLed(bool bState, const int t_nDelay = nDelay)
{
for (int i = pin1; i < pin5; ++i)
{
digitalWrite(i, bState);
delay(t_nDelay);
}
}

void loop()
{
do
{
chaseLed(HIGH);
chaseLed(LOW);
++n;
}
while(n < nraz);

n = 0;

do
{
digitalWrite(3, HIGH);
delay(d);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
delay(d);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
delay(d);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
delay(d);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
delay(d);
digitalWrite(7, LOW);
digitalWrite(6, HIGH);
delay(d);
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
delay(d);
digitalWrite(5, LOW);
digitalWrite(4, HIGH);
delay(d);
digitalWrite(4, LOW);
++n;
}
while(n < nraz);

n = 0;
}
Но если разобраться более подробнее, то можно обойтись без ужасных циклов while и delay. Это уже другая история :)
 
Изменено:

egor-kartop

✩✩✩✩✩✩✩
8 Сен 2018
8
1
Almaty
@Алексей22, Просто нужно начать с чего-то более-менее простого, выстроить структуру в голове , оперировать логическим мышлением и все получится!
 

Алексей22

✩✩✩✩✩✩✩
25 Фев 2020
41
0
65
Народ, доброго Всем дня. Имею Arduino Nano и SD Карта . Подключал матрицу 10х10 все работало отлично и с SD карты и просто с Arduino Nano, но когда спаял матрицу 17х17 скетч сожрал всю память и все зависло? Бьюсь вот над этим скетчем, ужал все что знал и все что смог в силу своих познаний, но мне еще нужно 300 байт оперативки может кто поможет?

////// GLEDIATOR_with_SD_Card_WS2811_final //////

#include <FastLED.h>
#include <SPI.h>
#include <SD.h>

#define NUM_LEDS 289
#define DATA_PIN 6
#define CHIPSET WS2811
#define CMD_NEW_DATA 1
#define BAUD_RATE 115200

Файл fxdata;
Светодиоды CRGB [NUM_LEDS];

настройка void ()
{
FastLED.addLeds <CHIPSET, DATA_PIN> (светодиоды, NUM_LEDS);
Serial.begin (BAUD_RATE);


для (int y = 0; y <NUM_LEDS; y ++)
{
светодиоды [y] = CRGB :: Black;
}
FastLED.show();

pinMode (10, ВЫХОД);
digitalWrite (10, HIGH);

if (! SD.begin (4))
{
Serial.println (F («Сбой инициализации SD-карты!»));
возвращение;
}
Serial.println (F ("инициализация SDCard выполнена."));

// тестовый файл открыт
fxdata = SD.open ("myanim.dat"); // только для чтения
if (fxdata)
{
Serial.println (F ("файл открыт в порядке"));
fxdata.close ();
}
}

int serialGlediator ()
{
while (! Serial.available ()) {}
return Serial.read ();
}

void loop ()
{
fxdata = SD.open ("myanim.dat");
if (fxdata)
{
Serial.println (F ("файл открыт в порядке"));
}

while (fxdata.available ())
{
fxdata.readBytes ((char *) светодиоды, NUM_LEDS * 3);
FastLED.show();
задержка (50); // установить скорость анимации. 20 - около 500 кбод
}


fxdata.close ();
}
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
1) если сериал нужен только для отладки - убирай его.
2) Если фастлед не использует всякие крутые ништяки из библиотеки типа шумов , то можно попробовать заменить на миколед , это само по себе уменьшит некоторое кол-во используемой памяти, а если ужать качество цвета , то уменьшит еще дополнительно.
 

Алексей22

✩✩✩✩✩✩✩
25 Фев 2020
41
0
65
1) если сериал нужен только для отладки - убирай его.
2) Если фастлед не использует всякие крутые ништяки из библиотеки типа шумов , то можно попробовать заменить на миколед , это само по себе уменьшит некоторое кол-во используемой памяти, а если ужать качество цвета , то уменьшит еще дополнительно.
[/ QUOTE]
Огромное спасибо что откликнулись, на сериал выхватил 2 б. на остальное ума пока не хватает...
 

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

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Сама библиотека: https://alexgyver.ru/microled/
Пошаговая инструкция в разделе "Переводим скетч с FastLED на microLED"
17 на 17 это 289 светодиодов
выгода по флешу бдует 2462 байта, всегда
по SRAM 957-907 = 50 байт если в полноцветном варианте
по SRAM 957-309 = 648 байт если в максимально экономном варианте
ну и 350 байт в среднем.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
724
148
я так понял, что автор использует еще и прогу Glediator для составления эффектов или проигрыания их с компутера

если не использует, то можно убрать этот код с сериалом, это сразу килобайт освобождает
 

Алексей22

✩✩✩✩✩✩✩
25 Фев 2020
41
0
65
я так понял, что автор использует еще и прогу Glediator для составления эффектов или проигрыания их с компутера
если не использует, то можно убрать этот код с сериалом, это сразу килобайт освобождает
Мне скетч и нужен для того чтоб записать эффекты на микро SD и потом воспроизвести на матрице.
 
Изменено:

Алексей22

✩✩✩✩✩✩✩
25 Фев 2020
41
0
65
Сама библиотека: https://alexgyver.ru/microled/
Пошаговая инструкция в разделе "Переводим скетч с FastLED на microLED"
17 на 17 это 289 светодиодов
выгода по флешу бдует 2462 байта, всегда
по SRAM 957-907 = 50 байт если в полноцветном варианте
по SRAM 957-309 = 648 байт если в максимально экономном варианте
ну и 350 байт в среднем.

Хотабыч, доброго дня. Спасибо за подсказку. Все как будто понятно, но один нюанс не прет что значит ""5) Создать объект ленты microLED"". Хотабыч выручай.

Снимок.JPG
 
Изменено:

Алексей22

✩✩✩✩✩✩✩
25 Фев 2020
41
0
65

Вложения

Изменено:

Алексей22

✩✩✩✩✩✩✩
25 Фев 2020
41
0
65

Вложения

Изменено:

Алексей22

✩✩✩✩✩✩✩
25 Фев 2020
41
0
65

Вложения

Изменено:

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

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
тут не могу понять. вот мой рабочий кусок кода
C++:
#ifdef REPLACE_FASTLED
  LEDdata d_color = CRGB(0, 0, 0);
#else
  CRGB d_color = CRGB(0, 0, 0);
#endif
верхняя часть для микроледа , а нижняя для фастледа. я как раз запоминаю черный цвет в переменной и потом его использую где надо.
проверь написание CRGB, что бы все буковки были латинские чтоль
 

Алексей22

✩✩✩✩✩✩✩
25 Фев 2020
41
0
65
тут не могу понять. вот мой рабочий кусок кода
C++:
 #ifdef REPLACE_FASTLED
  LEDdata d_color = CRGB (0, 0, 0);
#else
  CRGB d_color = CRGB (0, 0, 0);
#endif
верхняя часть для микроледа , а нижняя для фастледа. я как раз запоминаю черный цвет в переменной и потом его использую где надо.
проверь написание CRGB, что бы все буковки были латинские чтоль
Хататабыч, будь добр, проверь. Может я чего на косячил?

#include <microLED.h>
#include <SPI.h>
#include <SD.h>

#define NUM_LEDS 289 //
#define DATA_PIN 6 //
#define REPLACE_FASTLED // пункт 0
#define COLOR_DEBTH 3 // пункт 1
#define CHIPSET WS2811 //
#define CMD_NEW_DATA 1
#define BAUD_RATE 115200 //
символ без знака x = 17; // матрица х размер
символ без знака y = 17; // размер матрицы y
#define COLOR_ORDER GRB
#define BRIGHTNESS 50

int count_files = 15; //

Файл fxdata;
LEDdata leds[NUM_LEDS]; //CRGB leds[NUM_LEDS]; 4) Заменить CRGB на LEDdata при создании буфера
microLED strip(leds, NUM_LEDS, DATA_PIN); // 5) Создать объект ленты microLED
int val;
настройка void ()
{
//FastLED.addLeds<CHIPSET, DATA_PIN, COLOR_ORDER> (светодиоды, NUM_LEDS) .setCorrection (TypicalLEDStrip);
//FastLED.setBrightness(BRIGHTNESS);

Serial.begin (BAUD_RATE); // при использовании Glediator через usb
Serial.begin (115200);

для (int y = 0; y <NUM_LEDS; y ++)
{
светодиоды [y] = CRGB (0,0,0); // установить все светодиоды на черный во время установки
}
// FastLED.show();

pinMode (10, ВЫХОД); // CS / SS
digitalWrite (10, HIGH); //

if (! SD.begin (4))
{
возвращение;
}


// тестовый файл открыт
fxdata = SD.open ("1.out"); // только для чтения
if (fxdata)
{
fxdata.close ();
}
}

int serialGlediator ()
{
while (! Serial.available ()) {}
return Serial.read ();
}

void loop ()
{

for (val = 1; val <= count_files; val ++)
{


fxdata = SD.open (String (val) + ". out"); //
if (fxdata)
{
}

while (fxdata.available ())
{
fxdata.readBytes ((char *) светодиоды, NUM_LEDS * 3);
ledSort (4); // 1-4 возможно, установите позицию вашего первого светодиода. Измените число: 1 = TL (вверху слева), 2 = TR (вверху справа), 3 = BL (внизу слева), 4 = BR (внизу справа)
FastLED.show();
задержка (50); // установить скорость анимации. 20 - около 500 кбод
}

// закрываем файл, чтобы предотвратить зависание ввода-вывода или подобное
fxdata.close ();
}
}
int ledSort (int modus) {// 1 = TL, 2 = TR, 3 = BL, 4 = BR, эта функция переставит массив светодиодов ;-)
LEDdata tmp [x]; // CRGB tmp [x];
if (modus == 3 || modus == 4) {

для (int i = 0; i <(y / 2); i ++) {
для (int j = 0; j <x; j ++) {
tmp [j] = leds [i * x + j];
leds [i * x] = leds [(y - i - 1) * x];
светодиоды [(y - i - 1) * x] = tmp [j];
}
}
}

// if (modus == 1 || modus == 3) {
// for (int i = 1; i <y; i = i + 2) {
// for (int j = x; j> 0; j--) {
// tmp [(x - j)] = leds [i * x + j - 1];
// }
// for (int j = 0; j <x; j ++) {
// leds [i * x + j] = tmp [j];
// }
// }
//
// }


if (modus == 2 | modus == 4) {
для (int i = 0; i <y; i = i + 2) {
для (int j = x; j> 0; j--) {
tmp [(x - j)] = светодиоды [i * x + j - 1];
}
для (int j = 0; j <x; j ++) {
светодиоды [i * x + j] = tmp [j];
}
}

}
возврат 1;

}
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Отредактируй сообщение. сделай код как положено: на панели есть символ : три точки и стрелка вниз, справа от смайлика. Там выбирай код, и в код вставь скетч.
 

Алексей22

✩✩✩✩✩✩✩
25 Фев 2020
41
0
65
C++:
#include <microLED.h>
#include <SPI.h>
#include <SD.h>

#define NUM_LEDS 289 //
#define DATA_PIN 6    //
#define REPLACE_FASTLED // пункт 0
#define COLOR_DEBTH 3   // пункт 1
#define CHIPSET WS2811  //
#define CMD_NEW_DATA 1
#define BAUD_RATE 115200//
unsigned char x = 17; // matrix x size
unsigned char y = 17; // matrix y size
#define COLOR_ORDER GRB
#define BRIGHTNESS  50

int count_files = 15;       //

File fxdata;
LEDdata leds[NUM_LEDS];                         //CRGB leds[NUM_LEDS];    4) Заменить CRGB на LEDdata при создании буфера
microLED strip(leds, NUM_LEDS, DATA_PIN);        //  5) Создать объект ленты microLED
int val;
void setup()
{
                     //FastLED.addLeds<CHIPSET, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
                     //FastLED.setBrightness(BRIGHTNESS);
 
 Serial.begin(BAUD_RATE); // when using Glediator via usb
  Serial.begin(115200);

  for(int y = 0 ; y < NUM_LEDS ; y++)
  {
   leds[y] = CRGB(0,0,0);       // set all leds to black during setup
  }
                                         // FastLED.show();

  pinMode(10, OUTPUT); // CS/SS
  digitalWrite(10, HIGH); //

  if (!SD.begin(4))
  {
    return;
  }


  // test file open
  fxdata = SD.open("1.out");  // read only
  if (fxdata)
  {
    fxdata.close();
  }
}

int serialGlediator ()
{
  while (!Serial.available()) {}
  return Serial.read();
}

void loop()
{

for(val = 1; val <= count_files; val++)
{


  fxdata = SD.open(String(val)+".out");  //
  if (fxdata)
    {
    }

  while (fxdata.available())
  {
    fxdata.readBytes((char*)leds, NUM_LEDS*3);
    ledSort(4);  //1-4 possible, set your first LED's position. Change the number: 1=TL(top left),2=TR(top right),3=BL(bottom left),4=BR(bottom right)
     FastLED.show();
    задержка (50); // установить скорость анимации. 20 - около 500 кбод
  }

  // закрываем файл, чтобы предотвратить зависание ввода-вывода или подобное
  fxdata.close ();
}
}
int ledSort (int modus) {// 1 = TL, 2 = TR, 3 = BL, 4 = BR, эта функция переставит массив светодиодов ;-)
   LEDdata tmp [x]; // CRGB tmp [x];
    if (modus == 3 || modus == 4) {

    для (int i = 0; i <(y / 2); i ++) {
        для (int j = 0; j <x; j ++) {
        tmp [j] = leds [i * x + j];
        leds [i * x] = leds [(y - i - 1) * x];
        светодиоды [(y - i - 1) * x] = tmp [j];
         }
        }
     }

// if (modus == 1 || modus == 3) {
// for (int i = 1; i <y; i = i + 2) {
// for (int j = x; j> 0; j--) {
// tmp [(x - j)] = leds [i * x + j - 1];
//          }
// for (int j = 0; j <x; j ++) {
// leds [i * x + j] = tmp [j];
//        }
//       }
//
//      }


     if (modus == 2 | modus == 4) {
      для (int i = 0; i <y; i = i + 2) {
       для (int j = x; j> 0; j--) {
        tmp [(x - j)] = светодиоды [i * x + j - 1];
          }
           для (int j = 0; j <x; j ++) {
        светодиоды [i * x + j] = tmp [j];
        }
       }

      }
     возврат 1;
 
}[/КОД]
 

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

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Скетч нужен рабочий или тот, что пытался исправить, но не с переводом операторов на русский язык. Если памяти не хватает, то сложно назвать твоим косяком. Ну возьми мегу напримере, там памяти поболее будет
 

Алексей22

✩✩✩✩✩✩✩
25 Фев 2020
41
0
65
C++:
#include <FastLED.h>
#include <SPI.h>
#include <SD.h>

#define NUM_LEDS 100 // LED number
#define DATA_PIN 6    // your data arduino pin
#define CHIPSET WS2811  // your LED chip type
#define CMD_NEW_DATA 1
#define BAUD_RATE 500000  //if using Glediator via serial
unsigned char x = 10; // matrix x size
unsigned char y = 10; // matrix y size

#define COLOR_ORDER GRB
#define BRIGHTNESS  150

int count_files = 15;                                        // Количество файлов

File fxdata;
CRGB leds[NUM_LEDS];

int val;
void setup()
{
  FastLED.addLeds<CHIPSET, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(BRIGHTNESS);
 
 Serial.begin(BAUD_RATE); // when using Glediator via usb
  Serial.begin(115200);

  for(int y = 0 ; y < NUM_LEDS ; y++)
  {
    leds[y] = CRGB::Black; // set all leds to black during setup
  }
  FastLED.show();

  pinMode(10, OUTPUT); // CS/SS pin as output for SD library to work.
  digitalWrite(10, HIGH); // workaround for sdcard failed error...

  if (!SD.begin(4))
  {
    Serial.println("sdcard initialization failed!");
    return;
  }
  Serial.println("sdcard initialization done.");

  // test file open
  fxdata = SD.open("1.out");  // read only
  if (fxdata)
  {
    Serial.println("file open ok");
    fxdata.close();
  }
}

int serialGlediator ()
{
  while (!Serial.available()) {}
  return Serial.read();
}

void loop()
{

for(val = 1; val <= count_files; val++)
{


  fxdata = SD.open(String(val)+".out");  // read only
  if (fxdata)
    {
      Serial.println("file open ok");
    }

  while (fxdata.available())
  {
    fxdata.readBytes((char*)leds, NUM_LEDS*3);
    ledSort(4);  //1-4 possible, set your first LED's position. Change the number: 1=TL(top left),2=TR(top right),3=BL(bottom left),4=BR(bottom right)
     FastLED.show();
    delay(50); // set the speed of the animation. 20 is appx ~ 500k bauds
  }

  // close the file in order to prevent hanging IO or similar throughout time
  fxdata.close();
}
}
int ledSort (int modus) { //1=TL,2=TR,3=BL,4=BR, this function will rearrange the led array ;-)
    CRGB tmp[x];
    if(modus == 3 || modus == 4) {

    for(int i = 0; i < (y / 2);i++) {
        for(int j = 0; j < x;j++) {
        tmp[j] = leds[i * x + j];
        leds[i * x] = leds[(y - i - 1) * x];
        leds[(y - i - 1) * x] = tmp[j];
         }
        }
     }

//     if(modus == 1 || modus == 3) {
//       for(int i = 1; i < y; i = i + 2) {
//       for(int j = x; j > 0;j--) {
//        tmp[(x - j)] = leds[i * x + j - 1];
//          }
//           for(int j = 0; j < x;j++) {
//        leds[i * x + j] = tmp[j];
//        }
//       }
//
//      }


     if(modus == 2 | modus == 4) {
      for(int i = 0; i < y; i = i + 2) {
       for(int j = x; j > 0;j--) {
        tmp[(x - j)] = leds[i * x + j - 1];
          }
           for(int j = 0; j < x;j++) {
        leds[i * x + j] = tmp[j];
        }
       }

      }
     return 1;
 
}
Этот код работает на 120 диодах. Так что вариантов нет что то сделать с НАНО?

Скетч нужен рабочий или тот, что пытался исправить, но не с переводом операторов на русский язык. Если памяти не хватает, то сложно назвать твоим косяком. Ну возьми мегу напримере, там памяти поболее будет
Хотабыч посмотри, выложил рабочий код, пожалуйста.
 
Изменено: