Světelná tyč - malování světlem

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Wrchi
Příspěvky: 24
Registrován: 19 dub 2019, 23:31
Reputation: 0

Re: Světelná tyč - malování světlem

Příspěvek od Wrchi » 08 lis 2021, 22:36

Kód použivám zatím prakticky stejný jako na první stránce, jen si upravuju barvy ledek a opakující se pořadí podle toho kolik krát jí chcu vypnout a zapnout, tak aby i zase zaclo svítit stejné pořadí. Je to zdlouhavé, vůbec né pohodlne, ale apoň to takhle funguje. Princip eeprom chápu ale prostě se mi nedaří to zkombinovat s tím mým kódem. Zkoušel jsem si i upravit ten kód z odkazu s pamětí ale tam pak zase zamotám do nastavení barev ledek. Na zimní období bude snad více času po večerech to zkoušet. Nejsem v tom pořád moc znalý, takže to zkouším formou pokus/omyl. S přechodem díky za tip. Zkusím si to rozepsat na nějakou barvu a vyzkouším jak to bude vypadat.

kód který teď používám:

Kód: Vybrat vše

#include <FastLED.h>

#define BUTTON_PIN   2
#define LED_PIN     6
#define NUM_LEDS    120

CRGB leds[NUM_LEDS];

bool oldState = HIGH;
int showType = 0;


void setup() {
  
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
  pinMode(BUTTON_PIN, INPUT_PULLUP);

}

void loop() {
  bool newState = digitalRead(BUTTON_PIN);  
  if (newState == LOW && oldState == HIGH) {
    delay(20);
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 7)
        showType=0;
      startShow(showType);
    }
  }
  oldState = newState;
}

void startShow(int i) {
  switch(i){
    case 0:  for (int i = 0; i <= 119; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  break;


    case 1: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 255, 0, 0);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
 break;

      case 2: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
 break;
          
      case 3: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 0, 0, 255);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
 break;

      case 4: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 255, 0, 0);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 255, 0, 0);
  }
break;

      case 5: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  }
 break;

      case 6: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 255, 0, 255);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  }
            break;
                    case 7: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 0, 255, 255);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  }
            break;
  
  }
      FastLED.show();
}
}

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

Re: Světelná tyč - malování světlem

Příspěvek od kiRRow » 09 lis 2021, 12:05

No tak nejprve naimportuješ knihovnu EEPROM

Kód: Vybrat vše

#include <EEPROM.h>
Potom si najdeš místo v programu, kde se změní showType a tam dáš příkaz pro uložení do EEPROM

Kód: Vybrat vše

EEPROM.put(0, showType); // vlož int showType do EEPROM počínaje adresou 0
startShow(showType);
Mno a pak musíš tu hodnotu po zapnutí zase načíst, takže upravíš setup

Kód: Vybrat vše

pinMode(BUTTON_PIN, INPUT_PULLUP);
EEPROM.get(0, showType); // vyčti int showType z EEPROM počínaje adresou 0
... celé tři řádky vykopírované z examplů

Wrchi
Příspěvky: 24
Registrován: 19 dub 2019, 23:31
Reputation: 0

Re: Světelná tyč - malování světlem

Příspěvek od Wrchi » 15 lis 2021, 00:31

Zase jsem nad tím seděl ale prostě se mi to nedaří. Nejsem si jistý tím kódem ale chybu mi to nehází. Příjde mi, že mi tam dělá problém to tlačítko a funkce, že musím znova tlačítko zmáčknout pro rozsvícení. Tím se mi to ale opět posune na další barvu. Zase jsem zkoušel pokus/omyl, ale nepovedlo s mi tu funkci zrušit. Přestali mi pak fungovat ty posuny po zmáčknutí. Kód mám teď takhle:

Kód: Vybrat vše

#include <FastLED.h>
#include <EEPROM.h>

#define BUTTON_PIN   2
#define LED_PIN     6
#define NUM_LEDS    8

CRGB leds[NUM_LEDS];

bool oldState = HIGH;
int showType;


void setup() {
  
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
   // Check if this is first time EEPROM is used
  if (EEPROM.read(256) != 123) {  // not equal to 123
    EEPROM.write(256, 123);  // write value 123 to byte 256
    showType=0;  // set the number of lit leds to 0
    
  } else {  // if byte 256 is equal to 123
      EEPROM.get(0, showType);  // get previous lit leds before power failure
  } 

}

void loop() {
  bool newState = digitalRead(BUTTON_PIN);  
  if (newState == LOW && oldState == HIGH) {
    delay(20);
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 3)
        showType=0;
         EEPROM.put(0, showType);
      startShow(showType);
    }
  }
  oldState = newState;
}

void startShow(int i) {

  switch(i){

    case 0:  for (int i = 0; i <= 7; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  break;

    case 1: 
 for (int i = 0; i <= 5; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  for (int i = 6; i <= 7; i++) {
    leds[i] = CRGB ( 255, 0, 0);
  } 
 break;

      case 2: 
 for (int i = 0; i <= 5; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  for (int i = 6; i <= 7; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  } 
 break;
          
      case 3: 
 for (int i = 0; i <= 5; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  for (int i = 6; i <= 7; i++) {
    leds[i] = CRGB ( 0, 0, 255);
  } 
 break;
  }
      FastLED.show();
}



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

Re: Světelná tyč - malování světlem

Příspěvek od kiRRow » 16 lis 2021, 10:13

Až v setupu načteš ty data z EEPROM do proměnné showType, tak musíš zavolat funkci startShow(showType), aby jsi to dostal do těch diod.

ps:
na hledání chyb v programu je dobré si otevřít seriový monitor a nechat si na něj z různých částí posílat různé hlášky, nebo vypisovat obsahy proměnné. Víš pak kam se ten program při vykonávání kódu dostal, nebo naopak nedostal a co se děje zrovna v různých proměnných

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

Re: Světelná tyč - malování světlem

Příspěvek od kiRRow » 16 lis 2021, 10:55

Jinak ... nevím odkud jsi to vykopíroval a jestli víš co to tvoří

Kód: Vybrat vše

   // Check if this is first time EEPROM is used -- Kontrola jestli EEPROM byla použita
  if (EEPROM.read(256) != 123) {  // not equal to 123 -- Mkrnu na adresu 256 jestli je tam číslo 123
    EEPROM.write(256, 123);  // write value 123 to byte 256 -- není tam číslo 123, tak ho tam zapíšu a příště se tu už nedostanu
    showType=0;  // set the number of lit leds to 0 -- typ ledek si nastavím tedy na 0
    // A TADY CHYBÍ : -- ZAPÍŠU SI DO EEPROM NA ADRESU 0 PROMĚNNOU showType -- příště už tu nebudu, budu až za else, kde se budu snažit načíst něco co jsem neuložil
  } else {  // if byte 256 is equal to 123 -- ha, někdo něco napsal na adresu 256 a je to zrovna to co chci .. 123 .. super v eepromce něco bude
      EEPROM.get(0, showType);  // get previous lit leds before power failure -- čtu adresu 0 ... a je tu něco nebo ne ? :D
  } 
Ono jako při prvním stisku tlačítka se to "samo opraví", protože se na tu adresu zapíše nová hodnota showType a showType je správně nastaven. Ale takováto kontrola paměti je dosti mizerná. V podstatě ti to fungovalo kvůli náhodě. Kdyby jsi to napoprvé spustil, nezmáčnul tlačítko a měl nastaveno rozsvícení led hned v setupu - program by se pravděpodobně zasekl. Stalo by se to, že by si to zapsalo, že v eepromce jsou data. Pokud by si nezmáčknul tlačítko a vypnul to a pak zase zapnul, snažilo by se to načíst data, které ale v eepromce nejsou. Do showType by se tak dostalo číslo -32768 a v momentě kdy bys spustil startShow, tak fakt netuším co by se dělo.
--- edit 19.11.2021 :
U této řady čipů by prázdná eeprom měla obsahovat 00. Takže by se katastrofický scénař nekonal. Často má ale prázdná eeprom hodnotu FF, tam už by se pak děly kousky.

Wrchi
Příspěvky: 24
Registrován: 19 dub 2019, 23:31
Reputation: 0

Re: Světelná tyč - malování světlem

Příspěvek od Wrchi » 19 lis 2021, 00:12

Vypadá to, že se mi to povedlo. Jen nerozumím, že mi to jede i bez těch příkazů na eeprom ? :shock: Přitom mi to funguje přesně tak jak jsem chtěl. Na vypínání světel používám spínač co odpojí plusový vodič z arduina k led pásku. Samotné arduino je pořád pod napětím z baterie.

Kód: Vybrat vše

#include <FastLED.h>

#define BUTTON_PIN 2
#define LED_PIN 6
#define NUM_LEDS 8

CRGB leds[NUM_LEDS];

bool oldState = HIGH;
int showType;

void setup() {
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
 pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop() {
 FastLED.show();
  bool newState = digitalRead(BUTTON_PIN);  
    if (newState == LOW && oldState == HIGH) {
    delay(100);    
  newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
    if (showType > 3)
      showType=0;

      
      startShow(showType);
    }
  }
  oldState = newState;
}

void startShow(int i) {

  switch(i){

    case 0:  for (int i = 0; i <= 7; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  break;

    case 1: 
 for (int i = 0; i <= 5; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  for (int i = 6; i <= 7; i++) {
    leds[i] = CRGB ( 255, 0, 0);
  } 
 break;

      case 2: 
 for (int i = 0; i <= 5; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  for (int i = 6; i <= 7; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  } 
 break;
          
      case 3: 
 for (int i = 0; i <= 5; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  for (int i = 6; i <= 7; i++) {
    leds[i] = CRGB ( 0, 0, 255);
  } 
 break;
  }
      FastLED.show();
   
}

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

Re: Světelná tyč - malování světlem

Příspěvek od kiRRow » 19 lis 2021, 10:19

Dne 20. Čer 2020 :
Když vypnu tlačítkem napájení ledek (přerušuju plusový vodič co vede přímo k LED pásku, arduino samotné je stále napájené) Tak když ho znova zapnu tak se ledky znova nerozsvítí na stejné barevné variantě, na které byly, ale jsou zhasnuté. Musím zmáčknout znova druhé tlačítko na změnu barevných variant. Pak se Ledky rozsvítí ale zároveň se hned posunou na další variantu.
Dne 19. Lis 2021 :
Vypadá to, že se mi to povedlo. Jen nerozumím, že mi to jede i bez těch příkazů na eeprom ? :shock: Přitom mi to funguje přesně tak jak jsem chtěl. Na vypínání světel používám spínač co odpojí plusový vodič z arduina k led pásku. Samotné arduino je pořád pod napětím z baterie.
Mi to příjde tak, že po odpojení napájecího vodiče jsou čipy v pásku "nějak" drženy při životě proudem z datového vodiče. Ještě dost na to, aby držely paměť, ale málo na to, aby svítili. Rozhodně bych to nepovažoval za úspěch, spíš za náhodu. Teď se to tváří, že to funguje, ale co to provede až se baterky trošku poždímou a klesne jim napětí, bude se to chovat stále stejně při každém "pokusu" ?

Já bych se nespokojil s ničím jiným, než že arduino vypnu od napájení a pak se mi rozběhne v posledním režimu,
nebo arduino pojede dál, ale do ledek pošlu, že mají svítit "černě" + pamatuji si ve kterém režimu jsem

Wrchi
Příspěvky: 24
Registrován: 19 dub 2019, 23:31
Reputation: 0

Re: Světelná tyč - malování světlem

Příspěvek od Wrchi » 19 lis 2021, 10:40

Mam to ted jen v testovacim pasku na stole napajene z usb pocitace. Vecer to zkusim nahrat do te moji hotove tyce, vyzkousim to a uvidim co to udela primo na baterie. Pokud by to neslo nebo blblo, tak to budu dal zkouset uz primo na tyci a zkusim to dodelat i s tou pameti.

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

Re: Světelná tyč - malování světlem

Příspěvek od kiRRow » 19 lis 2021, 11:25

Vždyť už jsi to měl, jediné co ti chybělo bylo zapsat showType když byla eeprom prázdná a rozsvítit ledky voláním funkce showStart po načtení dat z EEPROM.

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

Re: Světelná tyč - malování světlem

Příspěvek od kiRRow » 19 lis 2021, 11:43

kiRRow píše:
19 lis 2021, 10:19
Já bych se nespokojil s ničím jiným, než že arduino vypnu od napájení a pak se mi rozběhne v posledním režimu,
nebo arduino pojede dál, ale do ledek pošlu, že mají svítit "černě" + pamatuji si ve kterém režimu jsem
.... a když nad tím přemýšlím ... tak spíše tu druhou možnost. Pokud budu chtít ono rozsvícení i nějak načasovat - tak po zapnutí arduina se nejprve spustí bootloader, který pár vteřin naslouchá na sériové lince jestli nepřichází nový program, až pak spustí samotný kód. Pokud nechám arduino běžet a do ledek pošlu "tmu", nebo poslední showType, tak se zbavím té několika vteřinové prodlevy. Nebo bys musel ve finální verzi bootloader odstranit, což ti znemožní ho dále programovat přes USB a budeš ho muset programovat přes ICSP.

Odpovědět

Kdo je online

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