Blikací majáky.

jugger
Příspěvky: 6
Registrován: 03 pro 2022, 23:35
Reputation: 0

Blikací majáky.

Příspěvek od jugger » 03 pro 2022, 23:43

Dobrý den
Může mi prosím někdo poradit jak pomocí jednoho tlačítka preskočit na další nastavené blikání ?? Hledal jsem ale nějak mi nic nejde :cry:
void mix_rwb , void mix_rb atd... ?
Díky

Kód: Vybrat vše

#include <FastLED.h>
#define LED_PIN     5
#define NUM_LEDS    16



// #define BUTTON_PIN 2
// int buttonPin = 2;

int strobo_1 = 30;
int strobo_2 = 50;
int strobo_3 = 80;
int strobo_4 = 100;

int freq_1 = 10;
int freq_2 = 30;
int freq_3 = 100;

int Pot = A0;
int PotVal = 0;
int OutVal = 0;


CRGB leds[NUM_LEDS];



void setup() {

  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);

   Serial.begin(9600);

  // FastLED.setBrightness(MAX_BRIGHTNESS);




}

      //      *******************************************************************************************

void mix_rwb()  {

  for (int i = 0; i <= 6; i++) {
    leds[0] = CRGB (255, 0, 0);
    leds[1] = CRGB (255, 0, 0);
    leds[2] = CRGB (255, 0, 0);
    leds[3] = CRGB (255, 0, 0);



    leds[4] = CRGB (255, 255, 255);
    leds[5] = CRGB (255, 255, 255);
    leds[6] = CRGB (255, 255, 255);
    leds[7] = CRGB (255, 255, 255);
    leds[8] = CRGB (255, 255, 255);
    leds[9] = CRGB (255, 255, 255);
    leds[10] = CRGB (255, 255, 255);
    leds[11] = CRGB (255, 255, 255);

    leds[12] = CRGB (0, 0, 255);
    leds[13] = CRGB (0, 0, 255);
    leds[14] = CRGB (0, 0, 255);
    leds[15] = CRGB (0, 0, 255);

    FastLED.show();
    delay(strobo_1);

    FastLED.clear ();
    delay(strobo_1);

    FastLED.show();
    delay(strobo_1);

  }

}


  //           *******************************************************************************

void mix_rb()  {

  for (int i = 0; i <= 3; i++) {

    leds[0] = CRGB (255, 0, 0);
    leds[1] = CRGB (255, 0, 0);
    leds[2] = CRGB (255, 0, 0);
    leds[3] = CRGB (255, 0, 0);
    leds[4] = CRGB (255, 0, 0);
    leds[5] = CRGB (255, 0, 0);
    leds[6] = CRGB (255, 0, 0);
    leds[7] = CRGB (255, 0, 0);


    leds[8] = CRGB (0, 0, 255);
    leds[9] = CRGB (0, 0, 255);
    leds[10] = CRGB (0, 0, 255);
    leds[11] = CRGB (0, 0, 255);
    leds[12] = CRGB (0, 0, 255);
    leds[13] = CRGB (0, 0, 255);
    leds[14] = CRGB (0, 0, 255);
    leds[15] = CRGB (0, 0, 255);


    FastLED.show();
    delay(strobo_1);
    FastLED.clear ();
    delay(strobo_1);
  }


  for (int i = 0; i <= 3; i++) {


    leds[15] = CRGB (255, 0, 0);
    leds[14] = CRGB (255, 0, 0);
    leds[13] = CRGB (2550, 0, 0);
    leds[12] = CRGB (2550, 0, 0);
    leds[11] = CRGB (2550, 0, 0);
    leds[10] = CRGB (2550, 0, 0);
    leds[9] = CRGB (2550, 0, 0);
    leds[8] = CRGB (2550, 0, 0);


    leds[7] = CRGB (0, 0, 255);
    leds[6] = CRGB (0, 0, 255);
    leds[5] = CRGB (0, 0, 255);
    leds[4] = CRGB (0, 0, 255);
    leds[3] = CRGB (0, 0, 255);
    leds[2] = CRGB (0, 0, 255);
    leds[1] = CRGB (0, 0, 255);
    leds[0] = CRGB (0, 0, 255);


    FastLED.show();
    delay(strobo_1);
    FastLED.clear ();
    delay(strobo_1);

  }

}

    //  *******************************************************************************



void loop() {

    PotVal = analogRead(Pot);
    Serial.println(OutVal);
    OutVal = map(PotVal, 0, 1023, 0, 255);

    analogWrite(NUM_LEDS, OutVal);

    FastLED.setBrightness(OutVal);


  
  mix_rb();
  delay(strobo_4);

  

  

   mix_rwb();
   delay(strobo_2);
  


}
Edit: Používej tag code (tlačítko </>)
Naposledy upravil(a) gilhad dne 14 pro 2022, 13:16, celkem upraveno 1 x.
Důvod: Edit: Používej tag code (tlačítko </>)

AstroMiK
Příspěvky: 542
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Blikací majáky.

Příspěvek od AstroMiK » 04 pro 2022, 17:50

Zarytí odpůrci funkce delay() by ti řekli, že je ten program špatně napsaný a je nutné ho od základu předělat.



Kdybych ale měl použít to co je, tak bych na začátek programu (před blok setup) zavedl jednu globální proměnnou:

Kód: Vybrat vše

byte styl;
V bloku setup() bych nastavil ten vstup pro tlačítko:

Kód: Vybrat vše

  pinMode(BUTTON_PIN, INPUT_PULLUP);

A do hlavní smyčky bych pak místo posledních 4 řádek přidal tenhle kód:

Kód: Vybrat vše

    if (digitalRead(BUTTON_PIN) == LOW)               // bylo stisknuto tlacitko
      {
        styl ++;                                      // zmeni se styl blikani
        if (styl > 1) styl = 0;                       // pocet stylu blikani je v tomto pripade omezen jen na dva (0 a 1)
    
        delay(50);                                    // odruseni zakmitu pri stisku
        while (digitalRead(BUTTON_PIN) == LOW) ;      // ceka se dokud se tlacitko neuvolni
        delay(50);                                    // odruseni zakmitu pri uvolneni
      } 
    
    
    
    switch (styl)                                     // prepnuti na nastaveny styl blikani
      {
        case 0:
          mix_rb();
          delay(strobo_4);
          break;
    
        case 1:
          mix_rwb();
          delay(strobo_2);
          break;
      }

Má to teda trochu nevýhodu v tom, že se bude muset držet to tlačítko tak dlouho, než se dokončí předchozí sekvence blikání.
Když to ale počítám, tak by to nikdy nemělo být déle než 0,3 sekundy a to se dá ještě vydržet.
Při delších sekvencích (přes sekundu) už by to ale bylo docela blbý.


Mimochodem, co tam má znamenat ta řádka:

Kód: Vybrat vše

  analogWrite(NUM_LEDS, OutVal);
Na pinu 16 (existuje vůbec na tvém Arduinu?) se mění střída PWM signálu podle natočení potenciometru.

jugger
Příspěvky: 6
Registrován: 03 pro 2022, 23:35
Reputation: 0

Re: Blikací majáky.

Příspěvek od jugger » 04 pro 2022, 20:56

Jo něco o delay jsem četl že to není zrovna vhodný ale je to promazanej větší program . Předělat to celý je nad moje schopnosti.
HW pro mě problém není ale SW jo :) . Po vložení to funguje tak mooc děkuju :D
Maximálně se mi ještě podaří implementovat pípání a dětičky budou spokojený.

analogWrite(NUM_LEDS, OutVal); je pozustatek k ničemu smazal jsem .
Ještě jednou děkuju .

jugger
Příspěvky: 6
Registrován: 03 pro 2022, 23:35
Reputation: 0

Re: Blikací majáky.

Příspěvek od jugger » 13 pro 2022, 23:23

Tak HW už je . Přidal jsem potenciometr na jas a druhý na rychlost.
Pak také piezo na bee bee , ale nedaří se mi udělat melodii k blikání ... asi funkce delay ? A pak taky tu melodii když je to podle not :-/ Nějaký lepší nápad?

Ještě krabičku a je to .

Někdo kdo by to předělal do funkčního stavu aby to beepalo a zároveň blikalo ? Za rozumnou odměnu samozřejmě.

Pak ještě otázka dá se místo každé led napsat 1,2,3 barva xxx a podobně ? taky mi to nejde :(

Děkuji.

Uživatelský avatar
kiRRow
Příspěvky: 978
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Blikací majáky.

Příspěvek od kiRRow » 14 pro 2022, 14:44

Buď delay (jakmile se program dostane k delay, tak v praxi se zacykluje v prázdné smyčce a není schopen bez přerušení vykonávat jiný kód - toť důvod proč hodně lidí delay doslova nenávidí), nebo používáš takovou kombinaci knihoven, že se perou o časovač.

jugger
Příspěvky: 6
Registrován: 03 pro 2022, 23:35
Reputation: 0

Re: Blikací majáky.

Příspěvek od jugger » 15 pro 2022, 21:06

Sotva jsem to vykopíroval a sestavil takže na víc asi nestačím :cry:
Radši hardware , něco svařit, sestavit, vyrobit, sehnat ale software nee :D

Axamith
Příspěvky: 526
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Blikací majáky.

Příspěvek od Axamith » 16 pro 2022, 18:25

Nevzdávej to, většina z nás začínala od nuly, kopírováním cizích kódů. Nějak se začít musí.

Uživatelský avatar
kiRRow
Příspěvky: 978
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Blikací majáky.

Příspěvek od kiRRow » 16 pro 2022, 19:12

Opět znovu, prosím, celý kód... včetně knihoven... jestli je i nějaký výpis ze sériové linky ....... Ať nemusíme žhavit věštecký koule ...

jugger
Příspěvky: 6
Registrován: 03 pro 2022, 23:35
Reputation: 0

Re: Blikací majáky.

Příspěvek od jugger » 16 pro 2022, 20:40

Mám to takto .. pitches.h jsou ty noty to jsem už nepoužil, tak to jen bliká .
Bohužel mám dost jiný práce než se učit arduino i když bych rád.
U PLC jsem skončil u siemens loga to jde celkem v pohodě a zatím stačilo na vše.
Normální majáky mám ale to je dost nekompaktní balení na hraní pro děti :lol:

Kód: Vybrat vše

#include <FastLED.h>
#define LED_PIN     5
#define NUM_LEDS    32



#define BUTTON_PIN 2
int buttonPin = 2;

// #include "pitches.h"




int strobo_1 = 40;
int strobo_2 = 50;
int strobo_3 = 80;
int strobo_4 = 100;

int freq_1 = 10;
int freq_2 = 30;
int freq_3 = 100;

int freq_pattern_1 = 40;

int Pot = A0;
int PotVal = 0;
int OutVal = 0;

int PotSpeed = A1;
int PotValSpeed = 0;
int OutValSpeed = 0;



CRGB leds[NUM_LEDS];

byte styl;

void setup() {

  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);

   Serial.begin(9600);

   pinMode(BUTTON_PIN, INPUT_PULLUP);


}

      //      *******************************************************************************************

void mix_rwb()  {


  
  for (int i = 0; i <= 6; i++) {
    leds[0] = CRGB (255, 0, 0);
    leds[1] = CRGB (255, 0, 0);
    leds[2] = CRGB (255, 0, 0);
    leds[3] = CRGB (255, 0, 0);
    leds[4] = CRGB (255, 255, 255);
    leds[5] = CRGB (255, 255, 255);
    leds[6] = CRGB (255, 255, 255);
    leds[7] = CRGB (255, 255, 255);
    leds[8] = CRGB (255, 255, 255);
    leds[9] = CRGB (255, 255, 255);
    leds[10] = CRGB (255, 255, 255);
    leds[11] = CRGB (255, 255, 255);
    leds[12] = CRGB (0, 0, 255);
    leds[13] = CRGB (0, 0, 255);
    leds[14] = CRGB (0, 0, 255);
    leds[15] = CRGB (0, 0, 255);


    leds[16] = CRGB (255, 0, 0);
    leds[17] = CRGB (255, 0, 0);
    leds[18] = CRGB (255, 0, 0);
    leds[19] = CRGB (255, 0, 0);
    leds[20] = CRGB (255, 255, 255);
    leds[21] = CRGB (255, 255, 255);
    leds[22] = CRGB (255, 255, 255);
    leds[23] = CRGB (255, 255, 255);
    leds[24] = CRGB (255, 255, 255);
    leds[25] = CRGB (255, 255, 255);
    leds[26] = CRGB (255, 255, 255);
    leds[27] = CRGB (255, 255, 255);
    leds[28] = CRGB (0, 0, 255);
    leds[29] = CRGB (0, 0, 255);
    leds[30] = CRGB (0, 0, 255);
    leds[31] = CRGB (0, 0, 255);

    
    FastLED.show();
    delay(strobo_1);

    FastLED.clear ();
    delay(strobo_1);

    FastLED.show();
    delay(strobo_1);

  }


}


  //           *******************************************************************************

void mix_rb()  {

  for (int i = 0; i <= 3; i++) {

    leds[0] = CRGB (255, 0, 0);
    leds[1] = CRGB (255, 0, 0);
    leds[2] = CRGB (255, 0, 0);
    leds[3] = CRGB (255, 0, 0);
    leds[4] = CRGB (255, 0, 0);
    leds[5] = CRGB (255, 0, 0);
    leds[6] = CRGB (255, 0, 0);
    leds[7] = CRGB (255, 0, 0);


    leds[8] = CRGB (0, 0, 255);
    leds[9] = CRGB (0, 0, 255);
    leds[10] = CRGB (0, 0, 255);
    leds[11] = CRGB (0, 0, 255);
    leds[12] = CRGB (0, 0, 255);
    leds[13] = CRGB (0, 0, 255);
    leds[14] = CRGB (0, 0, 255);
    leds[15] = CRGB (0, 0, 255);

    
    leds[16] = CRGB (255, 0, 0);
    leds[17] = CRGB (255, 0, 0);
    leds[18] = CRGB (255, 0, 0);
    leds[19] = CRGB (255, 0, 0);
    leds[20] = CRGB (255, 0, 0);
    leds[21] = CRGB (255, 0, 0);
    leds[22] = CRGB (255, 0, 0);
    leds[23] = CRGB (255, 0, 0);


    leds[24] = CRGB (0, 0, 255);
    leds[25] = CRGB (0, 0, 255);
    leds[26] = CRGB (0, 0, 255);
    leds[27] = CRGB (0, 0, 255);
    leds[28] = CRGB (0, 0, 255);
    leds[29] = CRGB (0, 0, 255);
    leds[30] = CRGB (0, 0, 255);
    leds[31] = CRGB (0, 0, 255);


    FastLED.show();
    delay(OutValSpeed);
    FastLED.clear ();
     delay(OutValSpeed);
    FastLED.clear ();
  }


  for (int i = 0; i <= 3; i++) {


    leds[0] = CRGB (0, 0, 255);
    leds[1] = CRGB (0, 0, 255);
    leds[2] = CRGB (0, 0, 255);
    leds[3] = CRGB (0, 0, 255);
    leds[4] = CRGB (0, 0, 255);
    leds[5] = CRGB (0, 0, 255);
    leds[6] = CRGB (0, 0, 255);
    leds[7] = CRGB (0, 0, 255);

    leds[8] = CRGB (255, 0, 0);
    leds[9] = CRGB (255, 0, 0);
    leds[10] = CRGB (255, 0, 0);
    leds[11] = CRGB (255, 0, 0);
    leds[12] = CRGB (255, 0, 0);
    leds[13] = CRGB (255, 0, 0);
    leds[14] = CRGB (255, 0, 0);
    leds[15] = CRGB (255, 0, 0);

    leds[16] = CRGB (0, 0, 255);
    leds[17] = CRGB (0, 0, 255);
    leds[18] = CRGB (0, 0, 255);
    leds[19] = CRGB (0, 0, 255);
    leds[20] = CRGB (0, 0, 255);
    leds[21] = CRGB (0, 0, 255);
    leds[22] = CRGB (0, 0, 255);
    leds[23] = CRGB (0, 0, 255);

    leds[24] = CRGB (255, 0, 0);
    leds[25] = CRGB (255, 0, 0);
    leds[26] = CRGB (255, 0, 0);
    leds[27] = CRGB (255, 0, 0);
    leds[28] = CRGB (255, 0, 0);
    leds[29] = CRGB (255, 0, 0);
    leds[30] = CRGB (255, 0, 0);
    leds[31] = CRGB (255, 0, 0);


    FastLED.show();
    delay(OutValSpeed);
    FastLED.clear ();
    delay(OutValSpeed);

  }

}

    //  *******************************************************************************


void looping() {
       for(int j = 0; j < 256; j++) {
   for(int i = 0; i < NUM_LEDS; i++) {
      leds[i] = Scroll((i * 256 / NUM_LEDS + j) % 256);      
    } 

    FastLED.show();
    delay(1);    
  } 
}

// WS2812B LED Strip switches Red and Green
CRGB Scroll(int pos) {
  CRGB color (0,0,0);
  if(pos < 85) {
    color.g = 0;
    color.r = ((float)pos / 85.0f) * 255.0f;
    color.b = 255 - color.r;
  } else if(pos < 170) {
    color.g = ((float)(pos - 85) / 85.0f) * 255.0f;
    color.r = 255 - color.g;
    color.b = 0;
  } else if(pos < 256) {
    color.b = ((float)(pos - 170) / 85.0f) * 255.0f;
    color.g = 255 - color.b;
    color.r = 1;
  }
  return color;
}


  //*********************************************************************

void loop() {

    PotVal = analogRead(Pot);
    Serial.println(OutVal);
    OutVal = map(PotVal, 0, 1023, 10, 255);

    FastLED.setBrightness(OutVal);



    PotValSpeed = analogRead(PotSpeed);
    Serial.println(OutValSpeed);
    OutValSpeed = map(PotValSpeed, 0, 1023, 150, 5);






if (digitalRead(BUTTON_PIN) == LOW)               // bylo stisknuto tlacitko
      {
        styl ++;                                      // zmeni se styl blikani
        if (styl > 2) styl = 0;                       // pocet stylu blikani je v tomto pripade omezen jen na dva (0 a 1)
    
        delay(50);                                    // odruseni zakmitu pri stisku
        while (digitalRead(BUTTON_PIN) == LOW) ;      // ceka se dokud se tlacitko neuvolni
        delay(50);                                    // odruseni zakmitu pri uvolneni
      } 
    
    
    
    switch (styl)                                     // prepnuti na nastaveny styl blikani
      {
        case 0:
          mix_rb();
          delay(strobo_4);
          break;
    
        case 1:
          mix_rwb();
          delay(strobo_2);
          break;

        case 2:
          looping();
          delay(strobo_2);
          break;



          
      }


}
Edit: Používej tag code ( tlačítko </> )
Naposledy upravil(a) gilhad dne 17 pro 2022, 10:24, celkem upraveno 1 x.
Důvod: Edit: Používej tag code ( tlačítko </> )

Uživatelský avatar
kiRRow
Příspěvky: 978
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Blikací majáky.

Příspěvek od kiRRow » 17 pro 2022, 14:19

Jo to ti dělají ty delay v mix_rwb a mix_rb. Jestli chceš k tomu i zvuk, nemůžeš procesor zastavovat, je třeba pomocí millis micros dělat multitasking.

Kód: Vybrat vše

  for (int i = 0; i <= 6; i++) {
    leds[0] = CRGB (255, 0, 0);
    leds[1] = CRGB (255, 0, 0);
    leds[2] = CRGB (255, 0, 0);
    leds[3] = CRGB (255, 0, 0);
    leds[4] = CRGB (255, 255, 255);
    leds[5] = CRGB (255, 255, 255);
    leds[6] = CRGB (255, 255, 255);
    leds[7] = CRGB (255, 255, 255);
    leds[8] = CRGB (255, 255, 255);
    leds[9] = CRGB (255, 255, 255);
    leds[10] = CRGB (255, 255, 255);
    leds[11] = CRGB (255, 255, 255);
    leds[12] = CRGB (0, 0, 255);
    leds[13] = CRGB (0, 0, 255);
    leds[14] = CRGB (0, 0, 255);
    leds[15] = CRGB (0, 0, 255);


    leds[16] = CRGB (255, 0, 0);
    leds[17] = CRGB (255, 0, 0);
    leds[18] = CRGB (255, 0, 0);
    leds[19] = CRGB (255, 0, 0);
    leds[20] = CRGB (255, 255, 255);
    leds[21] = CRGB (255, 255, 255);
    leds[22] = CRGB (255, 255, 255);
    leds[23] = CRGB (255, 255, 255);
    leds[24] = CRGB (255, 255, 255);
    leds[25] = CRGB (255, 255, 255);
    leds[26] = CRGB (255, 255, 255);
    leds[27] = CRGB (255, 255, 255);
    leds[28] = CRGB (0, 0, 255);
    leds[29] = CRGB (0, 0, 255);
    leds[30] = CRGB (0, 0, 255);
    leds[31] = CRGB (0, 0, 255);

    
    FastLED.show();
    delay(strobo_1);

    FastLED.clear ();
    delay(strobo_1);

    FastLED.show();
    delay(strobo_1);

  }
// jaký je smysl pořád neustále nastavovat leds ... smysl to má jen když místo konstantního čísla používáš proměnnou tak jako ve funkci looping ...
//
//
    leds[0] = CRGB (255, 0, 0);
    leds[1] = CRGB (255, 0, 0);
    leds[2] = CRGB (255, 0, 0);
    leds[3] = CRGB (255, 0, 0);
    leds[4] = CRGB (255, 255, 255);
    leds[5] = CRGB (255, 255, 255);
    leds[6] = CRGB (255, 255, 255);
    leds[7] = CRGB (255, 255, 255);
    leds[8] = CRGB (255, 255, 255);
    leds[9] = CRGB (255, 255, 255);
    leds[10] = CRGB (255, 255, 255);
    leds[11] = CRGB (255, 255, 255);
    leds[12] = CRGB (0, 0, 255);
    leds[13] = CRGB (0, 0, 255);
    leds[14] = CRGB (0, 0, 255);
    leds[15] = CRGB (0, 0, 255);


    leds[16] = CRGB (255, 0, 0);
    leds[17] = CRGB (255, 0, 0);
    leds[18] = CRGB (255, 0, 0);
    leds[19] = CRGB (255, 0, 0);
    leds[20] = CRGB (255, 255, 255);
    leds[21] = CRGB (255, 255, 255);
    leds[22] = CRGB (255, 255, 255);
    leds[23] = CRGB (255, 255, 255);
    leds[24] = CRGB (255, 255, 255);
    leds[25] = CRGB (255, 255, 255);
    leds[26] = CRGB (255, 255, 255);
    leds[27] = CRGB (255, 255, 255);
    leds[28] = CRGB (0, 0, 255);
    leds[29] = CRGB (0, 0, 255);
    leds[30] = CRGB (0, 0, 255);
    leds[31] = CRGB (0, 0, 255);
  for (int i = 0; i <= 6; i++) {
      
    FastLED.show();
    delay(strobo_1);

    FastLED.clear ();
    delay(strobo_1);

    FastLED.show();
    delay(strobo_1);

  }

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host