kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Automatizace, řízení, měření, logování a programování s využitím platformy Arduino.
nichicon
Příspěvky: 16
Registrován: pát bře 25, 2022 3:38 pm

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od nichicon »

Soban, tak sú tam proti naindukovaniu čohokolvek, to sa stane lahko vzhladom k vysokej vstupnej impedancií, tipujem nejakych tranzistorov mosfet ktoré vstup obsahuje v rámci integrovaného obvodu. Keď sa definuje pevná vstupná impedancia napríklad odporom na 10k proti zemi tak to náhodne nebude spínať, ale pri privedení +5V zo zopne zaručene. Tomuto rozumiem.

Ja kedže niesom dobrý programátor tak preferujem HW riešenia. To sú externé odpory. Každopadne ich tam nebude treba reálne ten kód pracuje s optočlenmi na vstupoch a na výstupoch zase niesu LED ale sú to LED v optočlenoch a relé (16A, 16A a 48A, spínané cez tranzistory). Ja som to tu len nechcem zbytočne rozpisovať aby sa to nekomplikovalo.

Hodilo by sa mi skôr vysvetliť ako presne ten program upraviť s tým millis :-( Mám pocit že pre ľudí tu to nebude problém a ja na to sám asi neprídem :-(

Každopadne nad tým ešte popremýšlam. Chápem to tak že na millis vznikne prilíš velká hodnota a podmienka, vlastne podmienky, sú splnené okamžite. Tak teraz už aspoň rozumiem problému :-D Buď sa tam pridá nejaka dalšia premenná kde sa bude millis teda čas ukladať celý čas a nejako sa zahrnie do existujúcej podmienky alebo sa tam pridá nejaka dalšia ale zatial netuším ako to urobiť :-D
Soban
Příspěvky: 3467
Registrován: pon úno 07, 2022 10:11 pm
Lokalita: Zlaté Hory / Olomouc
Systémové napětí: 24V
Výkon panelů [Wp]: 3600
Kapacita baterie [kWh]: 16
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Zlaté Hory

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od Soban »

Prostě před čekáním si musíš hodnotu uložit

No potom ve smyčce ji znovu číst a porovnat a jak uplyne čas tak je čekání ukončeno.....
3,6kWp ::pv:: 600Wp (4x 150Wp 4S) + 1kWp (2x 500Wp 2S) + 2kWp (4x 500Wp 2S2P) | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt* (2x 12V/200Ah AGM) + 25.6V/120Ah + 25.6V/125Ah + 25.6V/230Ah LiFePO4 | Jak nepostavit FVE Zlaté Hory :home:
nichicon
Příspěvky: 16
Registrován: pát bře 25, 2022 3:38 pm

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od nichicon »

Skúsil som tento kód (dával som ho na predošlú stranu ako posledný):

Kód: Vybrat vše



// Definícia pinu pre pripojenie LED
const int ledPin1 = 12; // Pripojenie LED pre pin 2
const int ledPin2 = 13; // Pripojenie LED pre pin 3
const int ledPin3 = 11; // Pripojenie LED pre pin 3
const int ledPin4 = 10; // Pripojenie LED pre pin 3

// Definícia pinu pre sledovanie stavu
const int inputPin1 = 2; // Pripojenie pre vstup na pin 2
const int inputPin2 = 3; // Pripojenie pre vstup na pin 3

unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
const long interval1 = 1000; // Interval v milisekundách (1 sekunda) pre prvé LED
const long interval2 = 2000; // Interval v milisekundách pre druhé LED

void setup() {
  // Nastavenie pinov LED ako výstupov
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  
  // Nastavenie pinov pre vstup
  pinMode(inputPin1, INPUT);
  pinMode(inputPin2, INPUT);
}

void loop() {
  // Čítanie hodnoty digitálneho pinu 2
  int value1 = digitalRead(inputPin1);

  // Kontrola, či je hodnota HIGH na pine 2
  if (value1 == HIGH) {
    // Rozsvietenie LED na pine 12
    digitalWrite(ledPin1, HIGH);
    
    // Získanie aktuálneho času
    unsigned long currentMillis1 = millis();              //čas z millis uloží do currentMillis1
    // Ak uplynulo 1 sekunda, prejdeme na druhú LED       
    if (currentMillis1 - previousMillis1 >= interval1) {  //od currentMillis1 odčíta previousMillis1, ak je výsledok väčší alebo rovný interval1, vykoná sa podmienka
      digitalWrite(ledPin3, HIGH);
      previousMillis1 = currentMillis1;                   //čas z currentMillis1 uloží do previousMillis1
    }

      // Získanie aktuálneho času
      unsigned long currentMillis2 = millis();
      
      // Ak uplynulo 1 sekunda, vypneme druhú LED
      if (currentMillis2 - previousMillis2 >= interval2) {
        digitalWrite(ledPin4, HIGH);
        previousMillis2 = currentMillis2;
      }
    
  } else {
    // Zhasnutie LED 
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin2, LOW);
  }
  // Čítanie hodnoty digitálneho pinu 3
  int value2 = digitalRead(inputPin2);

  // Kontrola, či je hodnota HIGH na pine 3
  if (value2 == HIGH && value1 == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);
  }
}


Upraviť aby to aj pri zhodení HIGH na vstupe do LOW a následnom nahodení znovu do HIGH počítal správne sekundy. To znamená rozsvecovalo LED v poradí a s postupnostou ako pri prvom spustení. No chcel som to urobiť sám a takýto neštastný je výsledok, ale lepšie to neviem :-(

Kód: Vybrat vše


// Definícia pinu pre pripojenie LED
const int ledPin1 = 12; // Pripojenie LED pre pin 2
const int ledPin2 = 13; // Pripojenie LED pre pin 3
const int ledPin3 = 11; // Pripojenie LED pre pin 3
const int ledPin4 = 10; // Pripojenie LED pre pin 3

// Definícia pinu pre sledovanie stavu
const int inputPin1 = 2; // Pripojenie pre vstup na pin 2
const int inputPin2 = 3; // Pripojenie pre vstup na pin 3

unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
unsigned long last_update = 0;
const long interval1 = 1000; // Interval v milisekundách (1 sekunda) pre prvé LED
const long interval2 = 2000; // Interval v milisekundách pre druhé LED

void setup() {
  // Nastavenie pinov LED ako výstupov
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  
  // Nastavenie pinov pre vstup
  pinMode(inputPin1, INPUT);
  pinMode(inputPin2, INPUT);
}

void loop() {

  unsigned long last_update = millis(); 

  // Čítanie hodnoty digitálneho pinu 2
  int value1 = digitalRead(inputPin1);

  // Kontrola, či je hodnota HIGH na pine 2
  if (value1 == HIGH) {
    // Rozsvietenie LED na pine 12
    digitalWrite(ledPin1, HIGH);
    
    if (last_update + 1001 > currentMillis1) {
    unsigned long previousMillis1 = last_update;
    }
    
    // Získanie aktuálneho času
    unsigned long currentMillis1 = millis();              //čas z millis uloží do currentMillis1      
    // Ak uplynulo 1 sekunda, prejdeme na druhú LED       
    if (currentMillis1 - previousMillis1 >= interval1) {  //od currentMillis1 odčíta previousMillis1, ak je výsledok väčší alebo rovný interval1, vykoná sa podmienka
      digitalWrite(ledPin3, HIGH);
      previousMillis1 = currentMillis1;                   //čas z currentMillis1 uloží do previousMillis1
    }

    if (last_update + 2001 > currentMillis2) {
    unsigned long previousMillis2 = last_update;
    }

      // Získanie aktuálneho času
      unsigned long currentMillis2 = millis();
      
      // Ak uplynulo 1 sekunda, vypneme druhú LED
      if (currentMillis2 - previousMillis2 >= interval2) {
        digitalWrite(ledPin4, HIGH);
        previousMillis2 = currentMillis2;
      }
    
  } else {
    // Zhasnutie LED 
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin2, LOW);

  }
  // Čítanie hodnoty digitálneho pinu 3
  int value2 = digitalRead(inputPin2);

  // Kontrola, či je hodnota HIGH na pine 3
  if (value2 == HIGH && value1 == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);
  }
}

Pribudlo tam:

Kód: Vybrat vše


void loop() {

unsigned long last_update = millis(); 



Myslím že je dobré sledovať pomocou last_update čas z millis bez ohladu na vykonanie podmienky. Potom som ho zapisoval do previousMillis1 ak bolo millis väčšie než currentMillis1. Aby sa podmienka nevykonávala automaticky ale až uplynie znovu čas +1001.

Kód: Vybrat vše


if (last_update + 1001 > currentMillis1) {
unsigned long previousMillis1 = last_update;

Ale je tam nejaka chyba, nejde to ani skompilovať a asi celkovo to nie je dobre!? :-(
Soban
Příspěvky: 3467
Registrován: pon úno 07, 2022 10:11 pm
Lokalita: Zlaté Hory / Olomouc
Systémové napětí: 24V
Výkon panelů [Wp]: 3600
Kapacita baterie [kWh]: 16
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Zlaté Hory

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od Soban »

A co takto.....?

Kód: Vybrat vše

// Definícia pinu pre pripojenie LED
const int ledPin1 = 12; // Pripojenie LED pre pin 2
const int ledPin2 = 13; // Pripojenie LED pre pin 3
const int ledPin3 = 11; // Pripojenie LED pre pin 3
const int ledPin4 = 10; // Pripojenie LED pre pin 3

// Definícia pinu pre sledovanie stavu
const int inputPin1 = 2; // Pripojenie pre vstup na pin 2
const int inputPin2 = 3; // Pripojenie pre vstup na pin 3

unsigned long last_update = 0;
const unsigned long interval1 = 1000; // Interval v milisekundách (1 sekunda) pre prvé LED
const unsigned long interval2 = 2000; // Interval v milisekundách pre druhé LED

void setup() {
  // Nastavenie pinov LED ako výstupov
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  
  // Nastavenie pinov pre vstup
  pinMode(inputPin1, INPUT);
  pinMode(inputPin2, INPUT);
}

void loop() {

  // nepotřebuješ vytěžovat CPU na 100% 
  // stačí reakce co 10ms
  delay(10);

  // Čítanie hodnoty digitálneho pinu 2
  int value1 = digitalRead(inputPin1);

  // Od tohoto casu budeme pocitat ale pouze od vypnutí světla
  if (value1==LOW) unsigned long last_update = millis(); 

  // Kontrola, či je hodnota HIGH na pine 2
  if (value1 == HIGH) {
    
    // Rozsvietenie LED na pine 12
    digitalWrite(ledPin1, HIGH);
    unsigned long aktualni_millis=millis();
    
    if ((last_update + interval1) < aktualni_millis) digitalWrite(ledPin3, HIGH);
    if ((last_update + interval2) < aktualni_millis) digitalWrite(ledPin4, HIGH);
    
  } else {
    // Zhasnutie LED 
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin2, LOW);

  }
  // Čítanie hodnoty digitálneho pinu 3
  int value2 = digitalRead(inputPin2);

  // Kontrola, či je hodnota HIGH na pine 3
  if (value2 == HIGH && value1 == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);
  }
}

3,6kWp ::pv:: 600Wp (4x 150Wp 4S) + 1kWp (2x 500Wp 2S) + 2kWp (4x 500Wp 2S2P) | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt* (2x 12V/200Ah AGM) + 25.6V/120Ah + 25.6V/125Ah + 25.6V/230Ah LiFePO4 | Jak nepostavit FVE Zlaté Hory :home:
nichicon
Příspěvky: 16
Registrován: pát bře 25, 2022 3:38 pm

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od nichicon »

Soban, prvý krát ak som mal od resetu arduina na imputPin1 úroveň HIGH tak sa rozsvietia postupne. Ale ak tam bolo LOW a HIGH dám neskôr alebo ho dávam druhý krát, tak sa všetky LED rozsvietia naraz :-( a tá samostatná LED, ledPin2, tak nefunguje vôbec :-( Bohužial ten kód nebeží :-(
Soban
Příspěvky: 3467
Registrován: pon úno 07, 2022 10:11 pm
Lokalita: Zlaté Hory / Olomouc
Systémové napětí: 24V
Výkon panelů [Wp]: 3600
Kapacita baterie [kWh]: 16
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Zlaté Hory

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od Soban »

Tak teď by to mělo být snad ok

Kód: Vybrat vše

// Definícia pinu pre pripojenie LED
const int ledPin1 = 12; // Pripojenie LED pre pin 2
const int ledPin2 = 13; // Pripojenie LED pre pin 3
const int ledPin3 = 11; // Pripojenie LED pre pin 3
const int ledPin4 = 10; // Pripojenie LED pre pin 3

// Definícia pinu pre sledovanie stavu
const int inputPin1 = 2; // Pripojenie pre vstup na pin 2
const int inputPin2 = 3; // Pripojenie pre vstup na pin 3

unsigned long last_update = 0;
unsigned long interval1 = 1000; // Interval v milisekundách (1 sekunda) pre prvé LED
unsigned long interval2 = 2000; // Interval v milisekundách pre druhé LED

void setup() {
  // Nastavenie pinov LED ako výstupov
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  
  // Nastavenie pinov pre vstup
  pinMode(inputPin1, INPUT);
  pinMode(inputPin2, INPUT);
}

void loop() {

  // nepotřebuješ vytěžovat CPU na 100% 
  // stačí reakce co 10ms
  delay(10);

  // Čítanie hodnoty digitálneho pinu 2
  int value1 = digitalRead(inputPin1);

  // Kontrola, či je hodnota HIGH na pine 2
  if (value1 == HIGH) {
    
    // Rozsvietenie LED na pine 12
    digitalWrite(ledPin1, HIGH);
    unsigned long aktualni_millis=millis();

    unsigned long interval_millis=last_update + interval1;
    
    if (interval_millis < aktualni_millis) digitalWrite(ledPin3, HIGH);

    interval_millis=last_update + interval2;

    if (interval_millis < aktualni_millis) digitalWrite(ledPin4, HIGH);
    
  } else {
    // Zhasnutie LED 
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin2, LOW);
    last_update = millis();

  }
  // Čítanie hodnoty digitálneho pinu 3
  int value2 = digitalRead(inputPin2);

  // Kontrola, či je hodnota HIGH na pine 3
  if (value2 == HIGH && value1 == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);
  }
}


Jinak nezakmitávají tě tam ty vstupy? Skus zvětšit to delay(10) na začátku třeba na 100.
3,6kWp ::pv:: 600Wp (4x 150Wp 4S) + 1kWp (2x 500Wp 2S) + 2kWp (4x 500Wp 2S2P) | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt* (2x 12V/200Ah AGM) + 25.6V/120Ah + 25.6V/125Ah + 25.6V/230Ah LiFePO4 | Jak nepostavit FVE Zlaté Hory :home:
nichicon
Příspěvky: 16
Registrován: pát bře 25, 2022 3:38 pm

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od nichicon »

Soban, vau, ďakujem za pomoc! Už to funguje :-) Som fakt rád. Keby ta zaujímalo do čoho to je tak ti pošelm do správy fotku dosiek ktoré to bude riadiť :-) Večer ten kód skúsim poriadne naštudovať a pozrieť.
Soban
Příspěvky: 3467
Registrován: pon úno 07, 2022 10:11 pm
Lokalita: Zlaté Hory / Olomouc
Systémové napětí: 24V
Výkon panelů [Wp]: 3600
Kapacita baterie [kWh]: 16
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Zlaté Hory

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od Soban »

Podle mě tam dochází k zakmitávání kontaktu, a další zrada mohla být ve špatném počítání unsigned long v if

Samozřejmě ještě třeba ošetřit to zakmitávání kontaktů a pak přetečení proměnné millis které není ošetřené.
3,6kWp ::pv:: 600Wp (4x 150Wp 4S) + 1kWp (2x 500Wp 2S) + 2kWp (4x 500Wp 2S2P) | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt* (2x 12V/200Ah AGM) + 25.6V/120Ah + 25.6V/125Ah + 25.6V/230Ah LiFePO4 | Jak nepostavit FVE Zlaté Hory :home:
nichicon
Příspěvky: 16
Registrován: pát bře 25, 2022 3:38 pm

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od nichicon »

Ono zakmitávajú len tlačítka a tu nikde tlačítko nebude, všade budú optočleny a relé... Ani teraz pri testovaní som nepoužil tlačítko.

Na to pretečenie som sa tiež chcel opýtať. Po akej dlhej dobe k nemu dojde pri ATmega328? Nedá sa to riešiť nejakym resetom MCU pri každom spúštaní "zariadenia"? Alebo sa to rieši ukladaním premenných do nejakej vnútornej pamäte tesne pred pretečením? Ako sa to potom prejaví až dojde k pretečeniu? Všetko sa vypne a pobeží to odznovu?
glottis
Příspěvky: 2069
Registrován: stř úno 02, 2022 10:30 am
Lokalita: okolí Mělníka
Systémové napětí: 48V
Výkon panelů [Wp]: 13000
Kapacita baterie [kWh]: 15

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od glottis »

preteceni nemusis resit resetem. staci spravne udelat aritmetiku kolem tech timestampu.

Tu je priklad hned na zacatku clanku. Prvni kus kodu ma problem a druhy ne

https://www.norwegiancreations.com/2018 ... nd-micros/

Tezi to z toho, ze je promena s casem unsigned long. A kdyz dojde k preteceni interniho millis counteru, nic se nestane a vysledek je dobre
Soban
Příspěvky: 3467
Registrován: pon úno 07, 2022 10:11 pm
Lokalita: Zlaté Hory / Olomouc
Systémové napětí: 24V
Výkon panelů [Wp]: 3600
Kapacita baterie [kWh]: 16
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Zlaté Hory

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od Soban »

Tak pokud jsem tu ochranu proti přetečení pochopil tak by to mělo být nějak takhle:

Kód: Vybrat vše

// Definícia pinu pre pripojenie LED
const int ledPin1 = 12; // Pripojenie LED pre pin 2
const int ledPin2 = 13; // Pripojenie LED pre pin 3
const int ledPin3 = 11; // Pripojenie LED pre pin 3
const int ledPin4 = 10; // Pripojenie LED pre pin 3

// Definícia pinu pre sledovanie stavu
const int inputPin1 = 2; // Pripojenie pre vstup na pin 2
const int inputPin2 = 3; // Pripojenie pre vstup na pin 3

unsigned long last_update = 0;
int interval1 = 1000; // Interval v milisekundách (1 sekunda) pre prvé LED
int interval2 = 2000; // Interval v milisekundách pre druhé LED

void setup() {
  // Nastavenie pinov LED ako výstupov
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  
  // Nastavenie pinov pre vstup
  pinMode(inputPin1, INPUT);
  pinMode(inputPin2, INPUT);
}

void loop() {

  // nepotřebuješ vytěžovat CPU na 100% 
  // stačí reakce co 10ms
  delay(10);

  // Čítanie hodnoty digitálneho pinu 2
  int value1 = digitalRead(inputPin1);

  // Kontrola, či je hodnota HIGH na pine 2
  if (value1 == HIGH) {
    
    // Rozsvietenie LED na pine 12
    digitalWrite(ledPin1, HIGH);
    
    if (millis() - last_update > interval1) digitalWrite(ledPin3, HIGH);


    if (millis() - last_update > interval2) digitalWrite(ledPin4, HIGH);
    
  } else {
    // Zhasnutie LED 
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin2, LOW);
    last_update = millis();

  }
  // Čítanie hodnoty digitálneho pinu 3
  int value2 = digitalRead(inputPin2);

  // Kontrola, či je hodnota HIGH na pine 3
  if (value2 == HIGH && value1 == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);
  }
}


3,6kWp ::pv:: 600Wp (4x 150Wp 4S) + 1kWp (2x 500Wp 2S) + 2kWp (4x 500Wp 2S2P) | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt* (2x 12V/200Ah AGM) + 25.6V/120Ah + 25.6V/125Ah + 25.6V/230Ah LiFePO4 | Jak nepostavit FVE Zlaté Hory :home:
kodl69
Příspěvky: 7403
Registrován: sob črc 19, 2014 8:56 pm
Lokalita: severně od Brna
Systémové napětí: 48V
Výkon panelů [Wp]: 8kWp
Kapacita baterie [kWh]: 12kWh
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od kodl69 »

celekm dobrý, ale každejch cca 7 dní ti přeteče časovač milis, a počítá od nuly, a zblbne se to, protože currentmillis bude menší než previousmillis
tady je ten zakopanej pes:

Kód: Vybrat vše

 if (currentMillis1 - previousMillis1 >= interval1) 
je několik řešení tohoto problému, třeba http://www.xpablo.cz/?p=421#more-421
což je dobrý i pro složitější programy, kde se nemusí na nic čekat a program vždycky vykoná jenom to co je "expired" , tj každou sekundu měří, každý 3s přepíše displej a každou minutu odešle data...
a nebo přidat podmínky na zápornej čas: If (millis() <previousmillis) then... všechny millis nastav na currentmillis - se mi to nechce vypisovat. Jinak budeš každej tejden koukat na zaseknutý ledky a říkat si, že ten čínskej klon atmegy stojí za ... a ona je chyba v programátorovi, ne v HW...
ostrov skoro 8kWp neustále ve stádiu zrodu: smartshunt(ex WBJR), MPPT150/45, MPPT 250/100(ex midnitesolar 150 clasic lite), 16S a různě P cca 340Ah Winston, MP II 5000,( ex Powerjack 8kW, ex samodomo cca 4kW). 48V DC rozvody a spotřebiče.
glottis
Příspěvky: 2069
Registrován: stř úno 02, 2022 10:30 am
Lokalita: okolí Mělníka
Systémové napětí: 48V
Výkon panelů [Wp]: 13000
Kapacita baterie [kWh]: 15

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od glottis »

kodl: ale ono mu to bude fungovat v unsigned long.

soban: ano, mel bys to ted mit dobre ... mala ukazka

unsigned long je 0 to 4,294,967,295

a kdyz udela 10 - 4,294,967,295 tak to spravne ukaze 10

Kód: Vybrat vše

void loop() {

        unsigned long y = 4294967295;

        Serial.print(millis());
        Serial.print(" + ");
        Serial.print(y);
        Serial.print(" = ");
        Serial.println(millis() - y);

	delay(1000);
       
}

0 + 4294967295 = 1
1000 + 4294967295 = 1001
2000 + 4294967295 = 2002
3002 + 4294967295 = 3004
4002 + 4294967295 = 4004
5004 + 4294967295 = 5006
6004 + 4294967295 = 6006
7006 + 4294967295 = 7008
8006 + 4294967295 = 8008
Soban
Příspěvky: 3467
Registrován: pon úno 07, 2022 10:11 pm
Lokalita: Zlaté Hory / Olomouc
Systémové napětí: 24V
Výkon panelů [Wp]: 3600
Kapacita baterie [kWh]: 16
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Zlaté Hory

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od Soban »

Díky, já ten HW nemám takže to nemůžu otestovat na všechny stavy, určitě by to ještě chtělo ošetřit vstup, protože i když tam nejsou tlačítka tak rušení je svinstvo a stačí aby to na vstupu spadlo na chvíli do LOW a můžou ty ledky blikat....
3,6kWp ::pv:: 600Wp (4x 150Wp 4S) + 1kWp (2x 500Wp 2S) + 2kWp (4x 500Wp 2S2P) | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt* (2x 12V/200Ah AGM) + 25.6V/120Ah + 25.6V/125Ah + 25.6V/230Ah LiFePO4 | Jak nepostavit FVE Zlaté Hory :home:
nichicon
Příspěvky: 16
Registrován: pát bře 25, 2022 3:38 pm

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od nichicon »

Soban píše: pon led 22, 2024 9:22 pm Tak pokud jsem tu ochranu proti přetečení pochopil tak by to mělo být nějak takhle:

Kód: Vybrat vše

// Definícia pinu pre pripojenie LED
const int ledPin1 = 12; // Pripojenie LED pre pin 2
const int ledPin2 = 13; // Pripojenie LED pre pin 3
const int ledPin3 = 11; // Pripojenie LED pre pin 3
const int ledPin4 = 10; // Pripojenie LED pre pin 3

// Definícia pinu pre sledovanie stavu
const int inputPin1 = 2; // Pripojenie pre vstup na pin 2
const int inputPin2 = 3; // Pripojenie pre vstup na pin 3

unsigned long last_update = 0;
int interval1 = 1000; // Interval v milisekundách (1 sekunda) pre prvé LED
int interval2 = 2000; // Interval v milisekundách pre druhé LED

void setup() {
  // Nastavenie pinov LED ako výstupov
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  
  // Nastavenie pinov pre vstup
  pinMode(inputPin1, INPUT);
  pinMode(inputPin2, INPUT);
}

void loop() {

  // nepotřebuješ vytěžovat CPU na 100% 
  // stačí reakce co 10ms
  delay(10);

  // Čítanie hodnoty digitálneho pinu 2
  int value1 = digitalRead(inputPin1);

  // Kontrola, či je hodnota HIGH na pine 2
  if (value1 == HIGH) {
    
    // Rozsvietenie LED na pine 12
    digitalWrite(ledPin1, HIGH);
    
    if (millis() - last_update > interval1) digitalWrite(ledPin3, HIGH);


    if (millis() - last_update > interval2) digitalWrite(ledPin4, HIGH);
    
  } else {
    // Zhasnutie LED 
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin2, LOW);
    last_update = millis();

  }
  // Čítanie hodnoty digitálneho pinu 3
  int value2 = digitalRead(inputPin2);

  // Kontrola, či je hodnota HIGH na pine 3
  if (value2 == HIGH && value1 == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);
  }
}


pardon, pár dní som riešil iné veci ale som rád že sa to tu tak rozbehlo :-)

7 dní sa mi sice čakať nechce. Aj keď niekedy to skúsiť môžem... Ale nahral som tam aj verziu kódu kde by k pretečeniu nemalo dojsť a každopadne funkcie fungujú :-)

Web toho PablaX si pamätám ešte z roku 2007, ježiš... :-)
nichicon
Příspěvky: 16
Registrován: pát bře 25, 2022 3:38 pm

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od nichicon »

Tak som nahrával kód do finalneho HW a jedna vec nefunguje ako by mala. Skúšal som dva posledné kódy od Sobran-a.

Táto posledná podmienka kódu:

Kód: Vybrat vše


  if (value2 == HIGH && value1 == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);


"ledPin2, HIGH" by sa malo vykonať až po tom čo platia a vykonajú sa prvé 3 podmienky kódu. Teda toto:

Kód: Vybrat vše


  int value1 = digitalRead(inputPin1);

  // Kontrola, či je hodnota HIGH na pine 1
  if (value1 == HIGH) {
    
    // Rozsvietenie LED na pine 12
    digitalWrite(ledPin1, HIGH);
    
    if (millis() - last_update > interval1) digitalWrite(ledPin3, HIGH);


    if (millis() - last_update > interval2) digitalWrite(ledPin4, HIGH);



Chápem že to nie je viazané na uplynutie millis a rozsvietenie LED ale len na value1 (inputPin1) a value2 (inputPin2). Blbé je že tie začnú platiť ešte skôr než ubehnú millis a rozsvietia sa LEDky...

Skúšal som to logicky prepísať z if (value2 == HIGH && value1 == HIGH) { na if (ledPin3 == HIGH && ledPin4 == HIGH) { Ale to nebeží. Ako to teda urobiť? Mám skúsiť úroveň HIGH/LOW zapisovať do premennej a do tej podmienky dať hodnotu premennej na miesto rovno hodnoty LOW/HIGH na LED? Ďakujem.

EDIT: tak skúšam vytvoriť tie premenné asi takto:

Kód: Vybrat vše


// Definícia pinu pre pripojenie LED
const int ledPin1 = 3; // Pripojenie LED pre pin 1 //
const int ledPin2 = 6; // Pripojenie LED pre pin 2 //
const int ledPin3 = 10; // Pripojenie LED pre pin 3 //
const int ledPin4 = 9; // Pripojenie LED pre pin 4 //

// Definícia pinu pre sledovanie stavu
const int inputPin1 = 1; // Pripojenie pre vstup na pin 1 //
const int inputPin2 = 5; // Pripojenie pre vstup na pin 2 //

unsigned long last_update = 0;
int interval1 = 1000; // Interval v milisekundách (1 sekunda) pre prvé LED
int interval2 = 2000; // Interval v milisekundách pre druhé LED

int valueA; //vytvoril som si premennú A  
int valueB; //vytvoril som si premennú B

void setup() {
  // Nastavenie pinov LED ako výstupov
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  
  // Nastavenie pinov pre vstup
  pinMode(inputPin1, INPUT);
  pinMode(inputPin2, INPUT);
}

void loop() {

  // nepotřebuješ vytěžovat CPU na 100% 
  // stačí reakce co 10ms
  delay(10);

  // Čítanie hodnoty digitálneho pinu 1
  int value1 = digitalRead(inputPin1);

  // Kontrola, či je hodnota HIGH na pine 1
  if (value1 == HIGH) {
    
    // Rozsvietenie LED na pine 12
    digitalWrite(ledPin1, HIGH);
    
    if (millis() - last_update > interval1) digitalWrite(ledPin3, HIGH);
    int valueA = HIGH;


    if (millis() - last_update > interval2) digitalWrite(ledPin4, HIGH);
    int valueB = HIGH;
    
  } else {
    // Zhasnutie LED 
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin2, LOW);
    last_update = millis();

  }
  // Čítanie hodnoty digitálneho pinu 2
  int value2 = digitalRead(inputPin2);

  // Kontrola, či je hodnota HIGH na pine 2
  if (valueA == HIGH && valueB == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);
  }
}

Ale nebeží to :-( Tak som skúsil priradiť premenným počiatočné hodnoty LOW takto:

Kód: Vybrat vše


// Definícia pinu pre pripojenie LED
const int ledPin1 = 3; // Pripojenie LED pre pin 1 //
const int ledPin2 = 6; // Pripojenie LED pre pin 2 //
const int ledPin3 = 10; // Pripojenie LED pre pin 3 //
const int ledPin4 = 9; // Pripojenie LED pre pin 4 //

// Definícia pinu pre sledovanie stavu
const int inputPin1 = 1; // Pripojenie pre vstup na pin 1 //
const int inputPin2 = 5; // Pripojenie pre vstup na pin 2 //

unsigned long last_update = 0;
int interval1 = 1000; // Interval v milisekundách (1 sekunda) pre prvé LED
int interval2 = 2000; // Interval v milisekundách pre druhé LED

int valueA = LOW; //vytvoril som si premennú A a priradil jej počiatočnú hodnotu LOW  
int valueB = LOW; //vytvoril som si premennú B a priradil jej počiatočnú hodnotu LOW  

void setup() {
  // Nastavenie pinov LED ako výstupov
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  
  // Nastavenie pinov pre vstup
  pinMode(inputPin1, INPUT);
  pinMode(inputPin2, INPUT);
}

void loop() {

  // nepotřebuješ vytěžovat CPU na 100% 
  // stačí reakce co 10ms
  delay(10);

  // Čítanie hodnoty digitálneho pinu 1
  int value1 = digitalRead(inputPin1);

  // Kontrola, či je hodnota HIGH na pine 1
  if (value1 == HIGH) {
    
    // Rozsvietenie LED na pine 12
    digitalWrite(ledPin1, HIGH);
    
    if (millis() - last_update > interval1) digitalWrite(ledPin3, HIGH);
    int valueA = HIGH;


    if (millis() - last_update > interval2) digitalWrite(ledPin4, HIGH);
    int valueB = HIGH;
    
  } else {
    // Zhasnutie LED 
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin2, LOW);
    last_update = millis();

  }
  // Čítanie hodnoty digitálneho pinu 2
  int value2 = digitalRead(inputPin2);

  // Kontrola, či je hodnota HIGH na pine 2
  if (valueA == HIGH && valueB == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);
    int valueA = LOW;
    int valueB = LOW;
  }
}

tak ma napadlo či by sa tým premenným nemala hodnota priradiť inak, nejako takto?

Kód: Vybrat vše


// Definícia pinu pre pripojenie LED
const int ledPin1 = 3; // Pripojenie LED pre pin 1 //
const int ledPin2 = 6; // Pripojenie LED pre pin 2 //
const int ledPin3 = 10; // Pripojenie LED pre pin 3 //
const int ledPin4 = 9; // Pripojenie LED pre pin 4 //

// Definícia pinu pre sledovanie stavu
const int inputPin1 = 1; // Pripojenie pre vstup na pin 1 //
const int inputPin2 = 5; // Pripojenie pre vstup na pin 2 //

unsigned long last_update = 0;
int interval1 = 1000; // Interval v milisekundách (1 sekunda) pre prvé LED
int interval2 = 2000; // Interval v milisekundách pre druhé LED

int valueA = LOW; //vytvoril som si premennú A a priradil jej počiatočnú hodnotu LOW  
int valueB = LOW; //vytvoril som si premennú B a priradil jej počiatočnú hodnotu LOW  

void setup() {
  // Nastavenie pinov LED ako výstupov
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  
  // Nastavenie pinov pre vstup
  pinMode(inputPin1, INPUT);
  pinMode(inputPin2, INPUT);
}

void loop() {

  // nepotřebuješ vytěžovat CPU na 100% 
  // stačí reakce co 10ms
  delay(10);

  // Čítanie hodnoty digitálneho pinu 1
  int value1 = digitalRead(inputPin1);

  // Kontrola, či je hodnota HIGH na pine 1
  if (value1 == HIGH) {
    
    // Rozsvietenie LED na pine 12
    digitalWrite(ledPin1, HIGH);
    
    if (millis() - last_update > interval1) digitalWrite(ledPin3, HIGH && valueA, HIGH);
    

    if (millis() - last_update > interval2) digitalWrite(ledPin4, HIGH && valueB, HIGH);
    
  } else {
    // Zhasnutie LED 
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin2, LOW);
    last_update = millis();

  }
  // Čítanie hodnoty digitálneho pinu 2
  int value2 = digitalRead(inputPin2);

  // Kontrola, či je hodnota HIGH na pine 2
  if (valueA == HIGH && valueB == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);
    int valueA = LOW;
    int valueB = LOW;
  }
}

Ale to tiež nefunguje a nejde ani skompilovať :-(
Naposledy upravil(a) nichicon dne pát úno 02, 2024 7:41 pm, celkem upraveno 2 x.
Soban
Příspěvky: 3467
Registrován: pon úno 07, 2022 10:11 pm
Lokalita: Zlaté Hory / Olomouc
Systémové napětí: 24V
Výkon panelů [Wp]: 3600
Kapacita baterie [kWh]: 16
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Zlaté Hory

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od Soban »

No tak proměnnou kterou nastavíš jak se první světlo rozsvítí naplno a vynuluješ při zhasnutí světla.
3,6kWp ::pv:: 600Wp (4x 150Wp 4S) + 1kWp (2x 500Wp 2S) + 2kWp (4x 500Wp 2S2P) | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt* (2x 12V/200Ah AGM) + 25.6V/120Ah + 25.6V/125Ah + 25.6V/230Ah LiFePO4 | Jak nepostavit FVE Zlaté Hory :home:
nichicon
Příspěvky: 16
Registrován: pát bře 25, 2022 3:38 pm

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od nichicon »

Dalo by sa to prosím trochu viac vysvetliť/rozpísať? :-( Ja to potrebujem práve nie až sa rozsvieti prvé svetlo (tak to funguje teraz) ale až sa rozsvieti to posledné (teda tým posledným myslím LED čo sa rozsvieti po 2000mS)

Mne sa zdalo že to dáva zmysel takto:

Kód: Vybrat vše


// Definícia pinu pre pripojenie LED
const int ledPin1 = 3; // Pripojenie LED pre pin 1 //
const int ledPin2 = 6; // Pripojenie LED pre pin 2 //
const int ledPin3 = 10; // Pripojenie LED pre pin 3 //
const int ledPin4 = 9; // Pripojenie LED pre pin 4 //

// Definícia pinu pre sledovanie stavu
const int inputPin1 = 1; // Pripojenie pre vstup na pin 1 //
const int inputPin2 = 5; // Pripojenie pre vstup na pin 2 //

unsigned long last_update = 0;
int interval1 = 1000; // Interval v milisekundách (1 sekunda) pre prvé LED
int interval2 = 2000; // Interval v milisekundách pre druhé LED

int valueA = LOW; //vytvoril som si premennú A a priradil jej počiatočnú hodnotu LOW  
int valueB = LOW; //vytvoril som si premennú B a priradil jej počiatočnú hodnotu LOW  

void setup() {
  // Nastavenie pinov LED ako výstupov
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  
  // Nastavenie pinov pre vstup
  pinMode(inputPin1, INPUT);
  pinMode(inputPin2, INPUT);
}

void loop() {

  // nepotřebuješ vytěžovat CPU na 100% 
  // stačí reakce co 10ms
  delay(10);

  // Čítanie hodnoty digitálneho pinu 1
  int value1 = digitalRead(inputPin1);

  // Kontrola, či je hodnota HIGH na pine 1
  if (value1 == HIGH) {
    
    // Rozsvietenie LED na pine 12
    digitalWrite(ledPin1, HIGH);
    
    if (millis() - last_update > interval1) digitalWrite(ledPin3, HIGH);
    valueA = HIGH;


    if (millis() - last_update > interval2) digitalWrite(ledPin4, HIGH);
    valueB = HIGH;
    
  } else {
    // Zhasnutie LED 
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin2, LOW);
    valueA = LOW;
    valueB = LOW;
    last_update = millis();

  }
  // Čítanie hodnoty digitálneho pinu 2
  int value2 = digitalRead(inputPin2);

  // Kontrola, či je hodnota HIGH na pine 2
  if (valueA == HIGH && valueB == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);
    valueA = LOW;
    valueB = LOW;
  }
}

Ale kedže to nebeží tak asi nie :-D
Soban
Příspěvky: 3467
Registrován: pon úno 07, 2022 10:11 pm
Lokalita: Zlaté Hory / Olomouc
Systémové napětí: 24V
Výkon panelů [Wp]: 3600
Kapacita baterie [kWh]: 16
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Zlaté Hory

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od Soban »

Kód: Vybrat vše

if (millis() - last_update > interval2) {
	digitalWrite(ledPin4, HIGH);
    	valueB = HIGH;
    	}
    	
    	
valueA zruš chceš aby se to rozsvěcovalo až po té poslední automatické rozsvícené

Kód: Vybrat vše

  // Kontrola, či je hodnota HIGH na pine 2
  if (value2 == HIGH && valueB == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);
  }
3,6kWp ::pv:: 600Wp (4x 150Wp 4S) + 1kWp (2x 500Wp 2S) + 2kWp (4x 500Wp 2S2P) | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt* (2x 12V/200Ah AGM) + 25.6V/120Ah + 25.6V/125Ah + 25.6V/230Ah LiFePO4 | Jak nepostavit FVE Zlaté Hory :home:
nichicon
Příspěvky: 16
Registrován: pát bře 25, 2022 3:38 pm

Re: kód postupného rozsvecovania LED a ich okamžitého zhasnutia

Příspěvek od nichicon »

ďakujem :-) funguje to