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

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

Příspěvek od nichicon »

Ahoj, chcel by som Vás poprosiť o pomoc s mojim kódom:

Kód: Vybrat vše

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

// 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

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);
    delay (1000);
    digitalWrite(ledPin3, HIGH);
    delay (1000);
    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);
  }
}
Takže je to zariadenie ktorému som dal pre jednoduché skúšanie na univerzálnom poli výstupy ako "LED" tie sú 4 a vstupy na ktoré sa privádza logická úroveň HIGH/LOW a tie sú 2.

Po privedení HIGH z externého zariadenia na "inputPin1" sa okmažite rozsvieti LedPin1. Následne po 1000ms LedPin3 a po dalších 1000mS LedPin4. To je super a tak to má byť. Problém je že v prípade že sa na "inputPin1" privednie LOW tak musím čakať 2 sekundy než sa LEDky vypnú. Ja by som to potreboval hneď. V dalšej časti kódu je dalšia podmienka kde je ako vstup pre privedenie LOW/HIGH "inputPin2" a tu potrebujem aby v prípade že je úroveň HIGH okmažite začala svietiť "ledPin2" ibaže je to spozdené o delay z hornej časti programu. Tak isto je spozdené aj vypnutie ktoré by som potreboval naraz spolu s ostatnými LED. Naraz sice je ale všetky sa vypnú opozdene.

Je mi jasné že funkcia DELAY prebiehajúca dookola program zdržiava. Napadlo ma použiť funkciu millis. Skúsil som ju zatial čisto na prvé DELAY asi 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 previousMillis = 0; // Uchováva čas poslednej aktualizácie
const long interval = 1000; // Interval v milisekundách (1 sekunda)

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);

    unsigned long currentMillis = millis();

    // Čakanie 1 sekundu (1000 ms)
    if (currentMillis - previousMillis >= interval) {
      // Aktualizácia času poslednej aktualizácie
      previousMillis = currentMillis;

    
    digitalWrite(ledPin3, HIGH);
    delay (1000);
    digitalWrite(ledPin4, HIGH);

 }///////
    
  } else {
    // Zhasnutie LED na pine 12
    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);
  }
}
Ibaže to millis vôbec nespozdí rozsvietenie LED. Aj keď teda skráti čas vypnutia ale to mi nestačí. Ak by to stačilo vymazal by som z programu delay a nepoužíval ani millis.

Prosím Vás ako mám kód upraviť aby robil čo potrebujem? Ďakujem!
 ! Zpráva od: lzahradil
kód vložen mezi tag CODE aby nedocházelo k příliš dlouhé stránce
Uživatelský avatar
TomHC
Příspěvky: 1807
Registrován: pát lis 11, 2022 8:14 am
Lokalita: Hlohovec, SR
Systémové napětí: 48V
Výkon panelů [Wp]: 5520
Kapacita baterie [kWh]: 14
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Hlohovec, SR

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

Příspěvek od TomHC »

Ahoj, buď použi interrupty (prerušenia) pre vstupné piny, alebo pomocné premenné na meranie času a vykonanie akcie. Pohľadaj si články podľa kľúčových slov "avoiding delays arduino", nebudem ti to tu prepisovať ;)
2x MUST PH1800 5.5kW, 8.85kWp 3x 2S3P, V+J+Z, 16x 280 Ah LiFePO4 (14.3 kWh), BMS JBD 200A, SW: Home Assistant na Synology DS923+ ku tomu ESPHome, Tasmota, MariaDB, InfluxDB, Telegraf, Grafana, Zigbee2MQTT..., HW: ESPlan (ESP32 + LAN 8720 + RS485 + UART). Nejaké moje projekty: MUST-ESPhome, ELTEK Flatpack2 ESPhome, ESP32-EMON, PZEM-017@WiFi, diyBMS-CurrentShunt-ESPhome 01/2023 -> 11/2024 = 8.6 MWh AC
glottis
Příspěvky: 2607
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 »

jo nesmis tam mit ty delay. Postupne rozsveceni bych resil pres incerement cisla a pak funkci na preklad cisla na ledky. Pri stisku tlacitka 2 tam pak nastavis 0.

Jinak zkus treba toto precist

https://www.arduinocircuit.com/led-blin ... -tutorial/
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 »

TomHC, tak ale to bude opäť cez funkciu millis. Skúsil som to 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 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();
    
    // Ak uplynulo 1 sekunda, prejdeme na druhú LED
    if (currentMillis1 - previousMillis1 >= interval1) {
      digitalWrite(ledPin3, HIGH);
      previousMillis1 = currentMillis1;
    }

      // 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);
  }
}
Prvé zapnutie funguje dobre. Rozsvieti sa okamžite prvá LED, po sekunde druhá LED a po dalšej sekunde tretia LED. Ak logická úroveň HIGH zo vstupu zmizne a je tam teda LOW tak všetky LED okamžite zhasnú.

Ibaže keď chcem aby sa postupne rozsvietili aj druhý krát, tým že znovu privediem HIGH tak už asi nastane nejaky chaos v časoch. Občas to trafím tak že už svietia všetky alebo alebo začnú svietiť skôr. To millis sa musí urobiť nejako inak než mám.

glottis, to už je asi lahšie skúsiť s tým millis. Ale ďakujem.

 ! Zpráva od: lzahradil
kód vložen mezi tag CODE aby nedocházelo k příliš dlouhé stránce
Uživatelský avatar
TomHC
Příspěvky: 1807
Registrován: pát lis 11, 2022 8:14 am
Lokalita: Hlohovec, SR
Systémové napětí: 48V
Výkon panelů [Wp]: 5520
Kapacita baterie [kWh]: 14
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Hlohovec, SR

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

Příspěvek od TomHC »

Tak si nastav debug správy cez sériovú konzolu, nech vieš v akom stave to máš.
2x MUST PH1800 5.5kW, 8.85kWp 3x 2S3P, V+J+Z, 16x 280 Ah LiFePO4 (14.3 kWh), BMS JBD 200A, SW: Home Assistant na Synology DS923+ ku tomu ESPHome, Tasmota, MariaDB, InfluxDB, Telegraf, Grafana, Zigbee2MQTT..., HW: ESPlan (ESP32 + LAN 8720 + RS485 + UART). Nejaké moje projekty: MUST-ESPhome, ELTEK Flatpack2 ESPhome, ESP32-EMON, PZEM-017@WiFi, diyBMS-CurrentShunt-ESPhome 01/2023 -> 11/2024 = 8.6 MWh AC
Soban
Příspěvky: 3860
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 nějak takto?

Kód: Vybrat vše

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

// 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

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);

    for (int i = 0; i <= 1000; i++) {
      // Čítanie hodnoty digitálneho pinu 3
      int value2 = digitalRead(inputPin2);

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

    digitalWrite(ledPin3, HIGH);

    for (int i = 0; i <= 1000; i++) {
      // Čítanie hodnoty digitálneho pinu 3
      int value2 = digitalRead(inputPin2);

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

    digitalWrite(ledPin4, HIGH);
    
  } else {
    // Zhasnutie LED 
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
  }
  // Čítanie hodnoty digitálneho pinu 3
  int value2 = digitalRead(inputPin2);

  // Kontrola, či je hodnota HIGH na pine 3
  if (value2 == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);
  }
}
3,6kWp ::pv:: | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt*
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, ďakujem ale nefunguje to. Opäť tie ledky v prípade že sa HIGH zmení na LOW nezareagujú zhasnutím okamžite.

Rád by som to riešil cez to millis. Rozmýšlal som nad tým (a keď na vstupe bolo LOW a zmenilo sa na HIGH postupne sa rozsvietili LED). Napadlo ma že keď dojde na vstupe ku zmene z HIGH na LOW a LED majú zhasnúť, tak tam zároveň pridám nulovanie premenných kde som ukladal časové údaje z MILLIS. Takto ako to je nižšie so to urobil. Ibaže stále to nerobí to čo to robiť má. Musím nejako ešte zohladniť že MILLIS stále stúpa... Asi, predpokladám že v tom je teraz problém.

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);
    unsigned long previousMillis1 = 0;
    unsigned long previousMillis2 = 0;
    unsigned long currentMillis1 = 0;
    unsigned long currentMillis2 = 0;
  }
  // Čí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);
  }
}
Soban
Příspěvky: 3860
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 takhle?

Kód: Vybrat vše

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

// 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

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);

    for (int i = 0; i <= 1000; i++) {
      // Čítanie hodnoty digitálneho pinu 3
      int value2 = digitalRead(inputPin2);

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

    }
    if (value1 == HIGH) {
    digitalWrite(ledPin3, HIGH);

    for (int i = 0; i <= 1000; i++) {
      // Čítanie hodnoty digitálneho pinu 3
      int value2 = digitalRead(inputPin2);

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

    if (value1 == HIGH) digitalWrite(ledPin4, HIGH);
    
  } else {
    // Zhasnutie LED 
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
  }
  // Čítanie hodnoty digitálneho pinu 3
  int value2 = digitalRead(inputPin2);

  // Kontrola, či je hodnota HIGH na pine 3
  if (value2 == HIGH) {
    // Rozsvietenie LED na pine 13
    digitalWrite(ledPin2, HIGH);
  } else {
    // Zhasnutie LED na pine 13
    digitalWrite(ledPin2, LOW);
  }
}
Musí se stopnout čekání proto jsem tam přidal break
3,6kWp ::pv:: | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt*
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, teraz už zhasnú hneď. Len jedna vec ktorá v pôvodnom kóde išla tak nefunguje. Ak nie je splnená prvá podmienka (alebo prestala platiť) nemá sa vykonať druhá podmienka. Takže ak je na ledPin1 LOW a všetky LED (až na ledPin2) zhasli. Tak zároveň prestala platiť druhá podmienka a musí zhasnúť aj ledPin2. A vlastne zároveň druhá podmienka nikdy bez splnenia prvej nemôže fungovať.

Každopadne by ma aj tak najviac zaujímalo ako program napísať pri použití MILLIS ako je v mojom poslednom kóde. Bohužial tam mám chybu. Chceto nejako zohladniť že hodnota MILLIS stále stúpa. Premenné kde som ukladal časový údaj viem zmazať a aj ich zmazávam ale neviem ako to napísať pri zohladnení že MILLIS stále stúpa. Pardon možno to zle vysvetlujem :-D Ale snažím sa...
Uživatelský avatar
TomHC
Příspěvky: 1807
Registrován: pát lis 11, 2022 8:14 am
Lokalita: Hlohovec, SR
Systémové napětí: 48V
Výkon panelů [Wp]: 5520
Kapacita baterie [kWh]: 14
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Hlohovec, SR

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

Příspěvek od TomHC »

Treba aktualizovať last_update a počítať rozdiel: if (last_update + 1000 > millis()) ...
2x MUST PH1800 5.5kW, 8.85kWp 3x 2S3P, V+J+Z, 16x 280 Ah LiFePO4 (14.3 kWh), BMS JBD 200A, SW: Home Assistant na Synology DS923+ ku tomu ESPHome, Tasmota, MariaDB, InfluxDB, Telegraf, Grafana, Zigbee2MQTT..., HW: ESPlan (ESP32 + LAN 8720 + RS485 + UART). Nejaké moje projekty: MUST-ESPhome, ELTEK Flatpack2 ESPhome, ESP32-EMON, PZEM-017@WiFi, diyBMS-CurrentShunt-ESPhome 01/2023 -> 11/2024 = 8.6 MWh AC
Soban
Příspěvky: 3860
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 »

nichicon píše: sob led 20, 2024 9:06 pm
Soban, teraz už zhasnú hneď. Len jedna vec ktorá v pôvodnom kóde išla tak nefunguje. Ak nie je splnená prvá podmienka (alebo prestala platiť) nemá sa vykonať druhá podmienka. Takže ak je na ledPin1 LOW a všetky LED (až na ledPin2) zhasli. Tak zároveň prestala platiť druhá podmienka a musí zhasnúť aj ledPin2. A vlastne zároveň druhá podmienka nikdy bez splnenia prvej nemôže fungovať.
Tak si to tam doplň do toho if(vstup==HIGH ....... já to vyhodil protože jsem myslel že se má každé ovládat zvlášť.

Kód: Vybrat vše

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

// 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

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);

    for (int i = 0; i <= 1000; i++) {
      // Čí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);
      }
      delay(1);
      int value1 = digitalRead(inputPin1);
      if (value1 == LOW) break;

    }
    if (value1 == HIGH) {
    digitalWrite(ledPin3, HIGH);

    for (int i = 0; i <= 1000; i++) {
      // Čí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);
      }
      delay(1);
      int value1 = digitalRead(inputPin1);
      if (value1 == LOW) break;
    }
    }

    if (value1 == HIGH) digitalWrite(ledPin4, HIGH);
    
  } else {
    // Zhasnutie LED 
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, 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:: | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt*
Soban
Příspěvky: 3860
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 »

nichicon píše: sob led 20, 2024 9:06 pm
Každopadne by ma aj tak najviac zaujímalo ako program napísať pri použití MILLIS ako je v mojom poslednom kóde. Bohužial tam mám chybu. Chceto nejako zohladniť že hodnota MILLIS stále stúpa. Premenné kde som ukladal časový údaj viem zmazať a aj ich zmazávam ale neviem ako to napísať pri zohladnení že MILLIS stále stúpa. Pardon možno to zle vysvetlujem :-D Ale snažím sa...
Pracování s millis z jiného mého programu:

Kód: Vybrat vše

void loop() {

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    // zapnuty termostat zapnutí - vypnutí
    if (termostat==true) {
      int t_c = teplota_cidla1_int();
      if (t_c == -127) {
        delay(500);
        // A zkusíme to znovu
        t_c = teplota_cidla1_int();
      }
      timeClient.update();
      int hodina = timeClient.getHours();
      if ((hodina < ZAP_NOCNI) && (hodina >= VYP_NOCNI)) teplota_termostat = teplota_termostat_den;
      else teplota_termostat = teplota_termostat_noc;
      if (t_c == -127) {
        komunikace = -127;
        previousMillis -= interval;
      }
      else komunikace = 0;
      if ((t_c < teplota_termostat) && (t_c != -127)) rele_on();
      if ((t_c >= teplota_termostat) && (t_c != -127)) rele_off();
    }
    else {
      if (currentMillis - casovac_termostat >= casovac_termostat_interval) termostat = true;
      }
    } 
  nouzove_ovladani();

  // pravidelné volání detekce klienta,
  // v případě otevření stránky se provedou
  // funkce nastavené výše
  server.handleClient();
  
}
3,6kWp ::pv:: | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt*
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 »

Snažím sa ale bohužial neviem ako to napísať :-(

Zopakujem ako to funguje: Keď sa prvý krát na vstupe inputPin1 objaví úroveň HIGH LEDky sa podla millis pekne postupne rozsvietia ledPin1, ledPin3, ledPin4. Ak sa počas toho kým je na inputPin1 HIGH (a svietia LEDky) objaví HIGH na inputPin2 okamžite sa rozsvieti ledPin2, ak sa na inputPin2 objaví LOW ledPin2 okamžite zhasne. Ak sa na inputPin1 objaví LOW musia okamžite všetky LEDky zhasnúť.

Po privedení HIGH na inputPin1 by sa mal program opakovať. Teda LEDky ledPin1, ledPin3, ledPin4 postupne rozsvietiť.

Problém je že ten program beží dookola keď sa na inputPin1 objaví znovu HIGH ledky sa nerozsvietia postupne ale program beží "na pozadí" a svietia podla toho v akom bode som to chytil.

Prosím vedel by mi niekto ten kód upraviť a zachovať to millis? Aktuálne mám toto:

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);
  }
}

Soban, ďakujem ale som začiatočník. Ten tvoj kód bohužial teraz velmi nepochopím :-(
Uživatelský avatar
TomHC
Příspěvky: 1807
Registrován: pát lis 11, 2022 8:14 am
Lokalita: Hlohovec, SR
Systémové napětí: 48V
Výkon panelů [Wp]: 5520
Kapacita baterie [kWh]: 14
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Hlohovec, SR

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

Příspěvek od TomHC »

Ak si začiatočník, tak ti veľmi nepomôže, ak to urobí niekto namiesto teba. Vidím tam ešte pár nedostatkov:
- chýba INPUT_PULLUP, ak teda na tlačítkach nemáš pull-up rezistory
- nemáš tam debounce na tlačítka (kuk google)

Pridal by som pomocnú bool premennú, ktorá bola true ak začalo rozsvecovanie led. Alebo by som použil slučku do... while.

Cez víkend na takéto veci nemám čas, zajtra to môžem napísať, ale... To ťa moc neposunie.
2x MUST PH1800 5.5kW, 8.85kWp 3x 2S3P, V+J+Z, 16x 280 Ah LiFePO4 (14.3 kWh), BMS JBD 200A, SW: Home Assistant na Synology DS923+ ku tomu ESPHome, Tasmota, MariaDB, InfluxDB, Telegraf, Grafana, Zigbee2MQTT..., HW: ESPlan (ESP32 + LAN 8720 + RS485 + UART). Nejaké moje projekty: MUST-ESPhome, ELTEK Flatpack2 ESPhome, ESP32-EMON, PZEM-017@WiFi, diyBMS-CurrentShunt-ESPhome 01/2023 -> 11/2024 = 8.6 MWh AC
glottis
Příspěvky: 2607
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 »

tak jsme to zkusil napsat do chat GPT, jen tak pro zajimavost. Zadani jsme zadal tohle ale mozna jsem to nepopsal dobre

Napis neblokojici kod pro arduino s nasledujici funkci. Mam dva vstupni piny na tlacitka a 4 vystupni piny na LED. Pokod stlacim a drzim tlacitko 1, rozsviti se prvni LED 1 a s periodou 1000ms se rozsvecuji postupne dalsi. Pokud tlacitko 1 pustim, led zhasnou. POkud stlacim a drzim tlacitko 2, okamzite se rozsviti LED 2. Kdyz tlacitko pustim, led zhasne.

a pak jsme ho jednou opravil, ze to udelal na prvni pohled blokujici. Jestli to funguje jsem nezkousel ani presne nekontroloval ale zda se to minimalne na inspiraci zajimave

Kód: Vybrat vše

const int buttonPin1 = 2;  // Tlačítko 1
const int buttonPin2 = 3;  // Tlačítko 2
const int ledPins[] = {4, 5, 6, 7};  // Piny pro LEDky
const int numLeds = 4;  // Celkový počet LEDek
const int delayTime = 1000;  // Časová prodleva mezi postupným rozsvěcováním LEDek

bool button1Pressed = false;
bool button2Pressed = false;

void setup() {
  for (int i = 0; i < numLeds; i++) {
    pinMode(ledPins[i], OUTPUT);  // Nastavit piny LEDek jako výstupy
  }
  pinMode(buttonPin1, INPUT_PULLUP);  // Nastavit tlačítko 1 jako vstup s pull-up rezistory
  pinMode(buttonPin2, INPUT_PULLUP);  // Nastavit tlačítko 2 jako vstup s pull-up rezistory
}

void loop() {
  if (digitalRead(buttonPin1) == LOW) {
    // Tlačítko 1 je stisknuto
    button1Pressed = true;
    button2Pressed = false;
  } else if (digitalRead(buttonPin2) == LOW) {
    // Tlačítko 2 je stisknuto
    button2Pressed = true;
    button1Pressed = false;
  }

  if (button1Pressed) {
    turnOnSequence();
  } else if (button2Pressed) {
    digitalWrite(ledPins[1], HIGH);  // Rozsvítit LED 2
  } else {
    digitalWrite(ledPins[1], LOW);  // Zhasnout LED 2
  }
}

void turnOnSequence() {
  static unsigned long previousMillis = 0;
  static int currentLed = 0;

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= delayTime) {
    digitalWrite(ledPins[currentLed], HIGH);  // Rozsvítit aktuální LED
    previousMillis = currentMillis;

    currentLed++;

    if (currentLed >= numLeds) {
      currentLed = 0;
      button1Pressed = false;  // Resetovat příznak stisknutého tlačítka
    }
  }
}

Uživatelský avatar
TomHC
Příspěvky: 1807
Registrován: pát lis 11, 2022 8:14 am
Lokalita: Hlohovec, SR
Systémové napětí: 48V
Výkon panelů [Wp]: 5520
Kapacita baterie [kWh]: 14
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Hlohovec, SR

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

Příspěvek od TomHC »

A programátori budú bez práce ::cry2::
2x MUST PH1800 5.5kW, 8.85kWp 3x 2S3P, V+J+Z, 16x 280 Ah LiFePO4 (14.3 kWh), BMS JBD 200A, SW: Home Assistant na Synology DS923+ ku tomu ESPHome, Tasmota, MariaDB, InfluxDB, Telegraf, Grafana, Zigbee2MQTT..., HW: ESPlan (ESP32 + LAN 8720 + RS485 + UART). Nejaké moje projekty: MUST-ESPhome, ELTEK Flatpack2 ESPhome, ESP32-EMON, PZEM-017@WiFi, diyBMS-CurrentShunt-ESPhome 01/2023 -> 11/2024 = 8.6 MWh AC
glottis
Příspěvky: 2607
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 »

programatori asi ne, prece jen nejde na to jen to napsat ale hlavne to vymyslet :) a to co nableje ted gpt se neda vzit a pouzit. To je jak to zkopirovat ze stack overflow :) ale treba prekladatele to budou mit urcite tezsi :)
Soban
Příspěvky: 3860
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 »

Nejlepší je jak si uděláš blokový diagram jak to má postupovat aby jsi měl přehled.....

A pak to začneš přepisovat.
3,6kWp ::pv:: | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt*
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 »

TomHC, pull up tam netreba. Reálne MCU komunikuje cez optočleny. Ak to chcem ošetriť proti rušeniu tak už to cez 10k odpor buď dám na zem, ak sa tam privádza logická 1/HIGH alebo naopak na napájanie ak by sa tam privádzala 0/LOW... Ani prekmity tlačítka tam teda netreba riešiť. Práve že keby mi niekto napísal ako to má vyzerať s millis tak by mi to dosť pomohlo. Vedel by som to tak urobiť aj v budúcnosti a osvojiť si to. Ak by si mal čas tak budem velmi rád. Vyzerá to že ľudia tu by to mali prepísané za pár minút :-)

Soban, dnes skúsim ten kód od teba vyskúšať. Ďakujem

glottis, pre srandu to vyskúšam tiež
Soban
Příspěvky: 3860
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 »

Ty odpory tam nejsou proti rušení, ale aby byla zaručená úroveň na vstupu jak je tlačítko rozpojené, či rozepnut jiný spínací prvek a proč nevyužít odpor který už je integrovaný v CPU?

A tady příklady: https://forum.arduino.cc/t/using-millis ... ide/483573
3,6kWp ::pv:: | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt*