Не могу сгенерировать случайное число в Setup, а не в Loop

pridecom
Offline
Зарегистрирован: 07.07.2017

Помогите, в строке 92 генерит одно и то же

СРОЧНО

 

/*
  Скетч создан на основе FASTSPI2 EFFECTS EXAMPLES автора teldredge (www.funkboxing.com)
  А также вот этой статьи https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/...
  Доработан, переведён и разбит на файлы 2017 AlexGyver
  Смена выбранных режимов в случайном порядке через случайное время
*/

#include "FastLED.h"          // библиотека для работы с лентой
#include <EEPROM.h> // подключаем библиотеку EEPROM для энергонезависимой памяти

#define LED_COUNT 162          // число светодиодов в кольце/ленте                                                                              !!!!162 у Cаши 150 работает
#define LED_DT 13             // пин, куда подключен DIN ленты

int max_bright = 200;          // максимальная яркость (0 - 255)
boolean adapt_light = 0;       // адаптивная подсветка (1 - включить, 0 - выключить)

boolean save_mod = 0;     ///                                                                                                                     !!!!

unsigned long rnd_result;
byte fav_modes[] = {2, 11, 14, 25, 27, 30, 34, 41};  // список "любимых" режимов

//byte fav_modes[] = {34};  // список "любимых" режимов

byte num_modes = sizeof(fav_modes);         // получить количество "любимых" режимов (они все по 1 байту..)
unsigned long change_time, last_change, last_bright;
int new_bright;

int ledMode = 3;
/*
  Стартовый режим
  0 - все выключены
  1 - все включены
  3 - кольцевая радуга
  888 - демо-режим
*/

// цвета мячиков для режима
byte ballColors[3][3] = {
  {0xff, 0, 0},
  {0xff, 0xff, 0xff},
  {0   , 0   , 0xff}
};

// ---------------СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ-----------------
int BOTTOM_INDEX = 0;        // светодиод начала отсчёта
int TOP_INDEX = int(LED_COUNT / 2);
int EVENODD = LED_COUNT % 2;
struct CRGB leds[LED_COUNT];
int ledsX[LED_COUNT][2];     //-ARRAY FOR COPYING WHATS IN THE LED STRIP CURRENTLY (FOR CELL-AUTOMATA, MARCH, ETC)                              !!!было 3 стало 2

int thisdelay = 20;          //-FX LOOPS DELAY VAR
int thisstep = 10;           //-FX LOOPS DELAY VAR
int thishue = 0;             //-FX LOOPS DELAY VAR
int thissat = 255;           //-FX LOOPS DELAY VAR

int thisindex = 0;
int thisRED = 0;
int thisGRN = 0;
int thisBLU = 0;

int idex = 0;                //-LED INDEX (0 to LED_COUNT-1
int ihue = 0;                //-HUE (0-255)
int ibright = 0;             //-BRIGHTNESS (0-255)
int isat = 0;                //-SATURATION (0-255)
int bouncedirection = 0;     //-SWITCH FOR COLOR BOUNCE (0-1)
float tcount = 0.0;          //-INC VAR FOR SIN LOOPS
int lcount = 0;              //-ANOTHER COUNTING VAR
// ---------------СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ-----------------


void setup()
{
  Serial.begin(9600);              // открыть порт для связи
  LEDS.setBrightness(max_bright);  // ограничить максимальную яркость

  LEDS.addLeds<WS2811, LED_DT, GRB>(leds, LED_COUNT);  // настрйоки для нашей ленты (ленты на WS2811, WS2812, WS2812B)
  one_color_all(0, 0, 0);          // погасить все светодиоды
  LEDS.show();                     // отослать команду

  randomSeed(analogRead(0));     //!!! инциализируем генератор случайных чисел

  Serial.print("Home mode "); 
  int Home_Mode = EEPROM.read(0);
  Serial.println(Home_Mode);
  
  if (Home_Mode > 0) {
    change_mode(Home_Mode);
    }

  if (Home_Mode == 0) {
    delay (100);
    rnd_result = random(0, num_modes - 1); 
    ledMode = fav_modes[rnd_result];    // получаем новый случайный номер следующего режима
    change_mode(ledMode);
    Serial.print("New mode ");
    Serial.print(num_modes-1);
    Serial.print(" variants, select ");
    Serial.print(rnd_result);
    Serial.print(" this mode ");
    Serial.println(ledMode);
          
  }

   EEPROM.write(0, 0);

}

void one_color_all(int cred, int cgrn, int cblu) {       //-SET ALL LEDS TO ONE COLOR
  for (int i = 0 ; i < LED_COUNT; i++ ) {
    leds[i].setRGB( cred, cgrn, cblu);
  }
}

void loop() {
//  if (adapt_light) {                        // если включена адаптивная яркость
//    if (millis() - last_bright > 500) {     // каждые полсекунды
//      last_bright = millis();               // сброить таймер
//      new_bright = map(analogRead(6), 1, 1000, 3, max_bright);   // считать показания с фоторезистора, перевести диапазон
//      LEDS.setBrightness(new_bright);        // установить новую яркость
//    }
//  }

//  if (millis() - last_change > change_time) {
//    change_time = random(5000, 20000);                // получаем новое случайное время до следующей смены режима
//    ledMode = fav_modes[random(0, num_modes - 1)];    // получаем новый случайный номер следующего режима
//    change_mode(ledMode);                             // меняем режим через change_mode (там для каждого режима стоят цвета и задержки)
//    last_change = millis();
//  }

//Serial.print("Ranadon test"); 
//Serial.println(random(0, num_modes - 1));

if ((millis()>10000) && (save_mod == 0)) { //если уже долго горит, запоминаем режим
  Serial.println("Best Mode for save"); 
  Serial.println(ledMode); 
  EEPROM.write(0, ledMode);
  save_mod = 1 ;   
}

  /*
    if (Serial.available() > 0) {     // если что то прислали
      ledMode = Serial.parseInt();    // парсим в тип данных int
      change_mode(ledMode);           // меняем режим через change_mode (там для каждого режима стоят цвета и задержки)
    }
  */
  switch (ledMode) {
    case 999: break;                           // пазуа
    case  2: rainbow_fade(); break;            // плавная смена цветов всей ленты
    case  3: rainbow_loop(); break;            // крутящаяся радуга
    case  4: random_burst(); break;            // случайная смена цветов
    case  5: color_bounce(); break;            // бегающий светодиод
    case  6: color_bounceFADE(); break;        // бегающий паровозик светодиодов
    case  7: ems_lightsONE(); break;           // вращаются красный и синий
    case  8: ems_lightsALL(); break;           // вращается половина красных и половина синих
    case  9: flicker(); break;                 // случайный стробоскоп
    case 10: pulse_one_color_all(); break;     // пульсация одним цветом
    case 11: pulse_one_color_all_rev(); break; // пульсация со сменой цветов
    case 12: fade_vertical(); break;           // плавная смена яркости по вертикали (для кольца)
    case 13: rule30(); break;                  // безумие красных светодиодов
    case 14: random_march(); break;            // безумие случайных цветов
    case 15: rwb_march(); break;               // белый синий красный бегут по кругу (ПАТРИОТИЗМ!)
    case 16: radiation(); break;               // пульсирует значок радиации
    case 17: color_loop_vardelay(); break;     // красный светодиод бегает по кругу
    case 18: white_temps(); break;             // бело синий градиент (?)
    case 19: sin_bright_wave(); break;         // тоже хрень какая то
    case 20: pop_horizontal(); break;          // красные вспышки спускаются вниз
    case 21: quad_bright_curve(); break;       // полумесяц
    case 22: flame(); break;                   // эффект пламени
    case 23: rainbow_vertical(); break;        // радуга в вертикаьной плоскости (кольцо)
    case 24: pacman(); break;                  // пакман
    case 25: random_color_pop(); break;        // безумие случайных вспышек
    case 26: ems_lightsSTROBE(); break;        // полицейская мигалка
    case 27: rgb_propeller(); break;           // RGB пропеллер
    case 28: kitt(); break;                    // случайные вспышки красного в вертикаьной плоскости
    case 29: matrix(); break;                  // зелёненькие бегают по кругу случайно
    case 30: new_rainbow_loop(); break;        // крутая плавная вращающаяся радуга
    case 31: strip_march_ccw(); break;         // чёт сломалось
    case 32: strip_march_cw(); break;          // чёт сломалось
    case 33: colorWipe(0x00, 0xff, 0x00, thisdelay);
      colorWipe(0x00, 0x00, 0x00, thisdelay); break;                                // плавное заполнение цветом
    case 34: CylonBounce(0xff, 0, 0, 4, 10, thisdelay); break;                      // бегающие светодиоды
    case 35: Fire(55, 120, thisdelay); break;                                       // линейный огонь
    case 36: NewKITT(0xff, 0, 0, 8, 10, thisdelay); break;                          // беготня секторов круга (не работает)
    case 37: rainbowCycle(thisdelay); break;                                        // очень плавная вращающаяся радуга
    case 38: TwinkleRandom(20, thisdelay, 1); break;                                // случайные разноцветные включения (1 - танцуют все, 0 - случайный 1 диод)
    case 39: RunningLights(0xff, 0xff, 0x00, thisdelay); break;                     // бегущие огни
    case 40: Sparkle(0xff, 0xff, 0xff, thisdelay); break;                           // случайные вспышки белого цвета
    case 41: SnowSparkle(0x10, 0x10, 0x10, thisdelay, random(100, 1000)); break;    // случайные вспышки белого цвета на белом фоне
    case 42: theaterChase(0xff, 0, 0, thisdelay); break;                            // бегущие каждые 3 (ЧИСЛО СВЕТОДИОДОВ ДОЛЖНО БЫТЬ КРАТНО 3)
    case 43: theaterChaseRainbow(thisdelay); break;                                 // бегущие каждые 3 радуга (ЧИСЛО СВЕТОДИОДОВ ДОЛЖНО БЫТЬ КРАТНО 3)
    case 44: Strobe(0xff, 0xff, 0xff, 10, thisdelay, 1000); break;                  // стробоскоп

    case 45: BouncingBalls(0xff, 0, 0, 3); break;                                   // прыгающие мячики
    case 46: BouncingColoredBalls(3, ballColors); break;                            // прыгающие мячики цветные

    case 888: demo_modeA(); break;             // длинное демо
    case 889: demo_modeB(); break;             // короткое демо
  }
}

void change_mode(int newmode) {
  thissat = 255;
  switch (newmode) {
    case 0: one_color_all(0, 0, 0); LEDS.show(); break; //---ALL OFF
    case 1: one_color_all(255, 255, 255); LEDS.show(); break; //---ALL ON
    case 2: thisdelay = 60; break;                      //---STRIP RAINBOW FADE
    case 3: thisdelay = 20; thisstep = 10; break;       //---RAINBOW LOOP
    case 4: thisdelay = 20; break;                      //---RANDOM BURST
    case 5: thisdelay = 20; thishue = 0; break;         //---CYLON v1
    case 6: thisdelay = 80; thishue = 0; break;         //---CYLON v2
    case 7: thisdelay = 40; thishue = 0; break;         //---POLICE LIGHTS SINGLE
    case 8: thisdelay = 40; thishue = 0; break;         //---POLICE LIGHTS SOLID
    case 9: thishue = 160; thissat = 50; break;         //---STRIP FLICKER
    case 10: thisdelay = 15; thishue = 0; break;        //---PULSE COLOR BRIGHTNESS
    case 11: thisdelay = 30; thishue = 0; break;        //---PULSE COLOR SATURATION
    case 12: thisdelay = 60; thishue = 180; break;      //---VERTICAL SOMETHING
    case 13: thisdelay = 100; break;                    //---CELL AUTO - RULE 30 (RED)
    case 14: thisdelay = 80; break;                     //---MARCH RANDOM COLORS
    case 15: thisdelay = 80; break;                     //---MARCH RWB COLORS
    case 16: thisdelay = 60; thishue = 95; break;       //---RADIATION SYMBOL
    //---PLACEHOLDER FOR COLOR LOOP VAR DELAY VARS
    case 19: thisdelay = 35; thishue = 180; break;      //---SIN WAVE BRIGHTNESS
    case 20: thisdelay = 100; thishue = 0; break;       //---POP LEFT/RIGHT
    case 21: thisdelay = 100; thishue = 180; break;     //---QUADRATIC BRIGHTNESS CURVE
    //---PLACEHOLDER FOR FLAME VARS
    case 23: thisdelay = 50; thisstep = 15; break;      //---VERITCAL RAINBOW
    case 24: thisdelay = 50; break;                     //---PACMAN
    case 25: thisdelay = 35; break;                     //---RANDOM COLOR POP
    case 26: thisdelay = 25; thishue = 0; break;        //---EMERGECNY STROBE
    case 27: thisdelay = 100; thishue = 0; break;        //---RGB PROPELLER
    case 28: thisdelay = 100; thishue = 0; break;       //---KITT
    case 29: thisdelay = 100; thishue = 95; break;       //---MATRIX RAIN
    case 30: thisdelay = 15; break;                      //---NEW RAINBOW LOOP
    case 31: thisdelay = 100; break;                    //---MARCH STRIP NOW CCW
    case 32: thisdelay = 100; break;                    //---MARCH STRIP NOW CCW
    case 33: thisdelay = 50; break;                     // colorWipe
    case 34: thisdelay = 50; break;                     // CylonBounce
    case 35: thisdelay = 15; break;                     // Fire
    case 36: thisdelay = 50; break;                     // NewKITT
    case 37: thisdelay = 20; break;                     // rainbowCycle
    case 38: thisdelay = 10; break;                     // rainbowTwinkle
    case 39: thisdelay = 50; break;                     // RunningLights
    case 40: thisdelay = 0; break;                      // Sparkle
    case 41: thisdelay = 30; break;                     // SnowSparkle
    case 42: thisdelay = 50; break;                     // theaterChase
    case 43: thisdelay = 50; break;                     // theaterChaseRainbow
    case 44: thisdelay = 100; break;                    // Strobe

    case 101: one_color_all(255, 0, 0); LEDS.show(); break; //---ALL RED
    case 102: one_color_all(0, 255, 0); LEDS.show(); break; //---ALL GREEN
    case 103: one_color_all(0, 0, 255); LEDS.show(); break; //---ALL BLUE
    case 104: one_color_all(255, 255, 0); LEDS.show(); break; //---ALL COLOR X
    case 105: one_color_all(0, 255, 255); LEDS.show(); break; //---ALL COLOR Y
    case 106: one_color_all(255, 0, 255); LEDS.show(); break; //---ALL COLOR Z
  }
  bouncedirection = 0;
  one_color_all(0, 0, 0);
  ledMode = newmode;
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вы бы для начала хоть вывели на печать то, что используете в 80-й строке.

Вы вообще в курсе, что существует такой процесс как отладка?

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

pridecom пишет:

Помогите, в строке 92 генерит одно и то же

СРОЧНО

Точно срочно? Настолько срочно, что даже "пожалуйста" некогда написать?

ЛЕСОМ

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

andriano пишет:

Вы вообще в курсе, что существует такой процесс как отладка?

Зачем? Это же код от гивера - чего его отлаживать-то?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ЕвгенийП пишет:

andriano пишет:

Вы вообще в курсе, что существует такой процесс как отладка?

Зачем? Это же код от гивера - чего его отлаживать-то?

Моя плакать...

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

Kakmyc пишет:
Моя плакать...
Если вдруг надо, то вот тут хороший выбор :-)

Пушной звер
Пушной звер аватар
Offline
Зарегистрирован: 17.03.2013

unsigned long rnd_result;

byte fav_modes[] = {2, 11, 14, 25, 27, 30, 34, 41}; // список любимых режимов

byte num_modes = sizeof(fav_modes);  // получить количество любимых режимов (они все по 1 байту..)

rnd_result = random(0, num_modes - 1);

 

facepaw... а я та думал что я писать не умею.

 

....

вообще это: randomSeed(analogRead(0)); не самый хороший способ получить сид, возможно у тебя на А0 чета висит и ацп читает одинаковое значение.

nik182
Offline
Зарегистрирован: 04.05.2015

Ну так можно А1 А2 и.т.д. которая в воздухе висит.

Пушной звер
Пушной звер аватар
Offline
Зарегистрирован: 17.03.2013

в том и суть, может там наводки от рядомстоящего дцдц и можно менять ноги до посиения... оно не гарантирует получение шума.

Izvekoff
Offline
Зарегистрирован: 02.03.2020

Пушной звер пишет:

в том и суть, может там наводки от рядомстоящего дцдц и можно менять ноги до посиения... оно не гарантирует получение шума.

Перефразируя Израиль Моисеевича, ... ноги меня не интересуют, я их отбрасываю  (откусываю)...нет ног...нет проблем...

nik182
Offline
Зарегистрирован: 04.05.2015

Пушной звер пишет:

в том и суть, может там наводки от рядомстоящего дцдц и можно менять ноги до посиения... оно не гарантирует получение шума.

Только  в том случае, если нога закорочена на массу или питание. В остальных случаях полученное случайное значение АЦП вполне подходит для бытовых нужд инициализации генератора случайных чисел. По крайней мере "случайность" полученного значения будет выше, чем генерируемые стандартной функцией случайные числа. Хотите лучше - берите STM32 c встроенными аппаратными генераторами.  

 

raven78
Offline
Зарегистрирован: 03.11.2019

Вот вариант получения для randomseed случайного числа, надыбанный в интернете, вроде работает. Правда для меня это тёмный лес))).

#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <util/atomic.h>
#define randomSeed(s) srandom(s)
 
volatile uint32_t seed;  
volatile int8_t nrot;    
                         
 
uint32_t CreateTrulyRandomSeed()
{
  seed = 0;
  nrot = 32; 
  
 
  cli();                                             
  MCUSR = 0;                                         
  _WD_CONTROL_REG |= (1<<_WD_CHANGE_BIT) | (1<<WDE); 
  _WD_CONTROL_REG = (1<<WDIE);                       
  sei();                                             
 
  while (nrot > 0);  
  cli();                                             
  MCUSR = 0;                                         
  _WD_CONTROL_REG |= (1<<_WD_CHANGE_BIT) | (0<<WDE); 
  _WD_CONTROL_REG = (0<< WDIE);                      
  sei(); 
  return seed;                                            
}
 
ISR(WDT_vect)
{
  nrot--;
  seed = seed << 8;
  seed = seed ^ TCNT1L;
}

 
void setup()
{
   Serial.begin(9600);
 
}
 
void loop()
{
  Serial.println(CreateTrulyRandomSeed());
}

Источник https://sites.google.com/site/astudyofentropy/project-definition/timer-j...

sadman41
Offline
Зарегистрирован: 19.10.2016

Интересно, зачем вачдог навернут? Если в цикле 32 раза взять TCNT1L, то должно быть то же самое. Или в цикле 32 раза поумножать результат чтения AЦП с привешенным длинным проводником.

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

sadman41 пишет:
Интересно, зачем вачдог навернут?
Это с конкурса на самый сложный и развесистый способ почесать тестикулы.

nik182
Offline
Зарегистрирован: 04.05.2015

Наверно хотели использовать генератор вачдога, который не кварцованый и зависит от температуры и питания. Но как то это тестикулярно. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, если этот таймер действительно болтает сильно в зависимости от внешних условий, то логика прослеживается.

Пушной звер
Пушной звер аватар
Offline
Зарегистрирован: 17.03.2013

nik182 пишет:

Пушной звер пишет:

в том и суть, может там наводки от рядомстоящего дцдц и можно менять ноги до посиения... оно не гарантирует получение шума.

Только  в том случае, если нога закорочена на массу или питание. В остальных случаях полученное случайное значение АЦП вполне подходит для бытовых нужд инициализации генератора случайных чисел. По крайней мере "случайность" полученного значения будет выше, чем генерируемые стандартной функцией случайные числа. Хотите лучше - берите STM32 c встроенными аппаратными генераторами.  

 

вы это топикстартеру рассказывайте.

nik182
Offline
Зарегистрирован: 04.05.2015

Пушной звер пишет:

вы это топикстартеру рассказывайте.

Ему то зачем? Это у вас фобия на аналогрид. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Да, похоже, что nik182 прав - джиттер эксплуатируется для получения хорошей (насколько возможно) энтропии без занятия входа с АЦП: https://hackaday.com/2018/01/08/entropy-and-the-arduino/ , https://gist.github.com/endolith/2568571

Для потоковой генерации чисел скорость, конечно, невелика, однако для инициализации генератора ПСЧ, используемого в любительских поделках, метода может и подойти. Главное - слишком качественное питание не подавать и теплоизоляцию хорошую не делать.