Zastavování cyklování programu podruhé

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: Zastavování cyklování programu podruhé

Příspěvek od Patrik » 25 čer 2020, 12:37

:ugeek:

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: Zastavování cyklování programu podruhé

Příspěvek od Patrik » 25 čer 2020, 12:53

Viz fotka. Tohle zůstalo na displeji. Žlutá led dioda normálně rychle bliká (vlastně během jedné sekundy se rozsvítí a zhasne). Vedle toho je modrá LED dioda která se rozsvítí po schváleném přístupu a úplně napravo je červená led, která po neschvalenem přístupu.
https://ibb.co/JcQqgwh

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

Re: Zastavování cyklování programu podruhé

Příspěvek od kiRRow » 25 čer 2020, 16:02

Uplně všechny statické texty ulož pomocí F() makra do flash paměti. Kolik máš zabráno paměti a kolik je volno ?

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: Zastavování cyklování programu podruhé

Příspěvek od Patrik » 25 čer 2020, 16:31

Tuším, že všechny texty (včetně výpisu na LCD displej a do serial linky mám v F). Tedy například text mám:
lcd.print (F("Pocet minut: ")); - ještě jednou překontroluji. Ovšem právě ten výpis schváleno (u kterého se to zřejmě seklo v makru F nemám, protože to mám výpis "jako dynamický text", vlastně že se postupně píše S CH V A LENO: Viz kód níže.. Myslíš, že by to mohl být problém? Pak v makru F () nemám jména ve struktuře.. Ale ty jména mám stejně uložené v Flash paměti tzn.: const PROGMEM char *jmeno; a v uživateli to vypadá viz:

Uzivatel user [] {
{"Novak", 55555, 50, 0, 0},//0 a tak dále...


To schváleno mám takto definované - jako pole char:

Kód: Vybrat vše

char array1[17] = "    Schvaleno     ";
 byte tim = 100;
 
A vypisuji ho na LCD obrazovku takto:

Kód: Vybrat vše

  for (int positionCounter1 = 0; positionCounter1 < 16; positionCounter1++)
    {
      digitalWrite (LED_BLUE, HIGH);
      lcd.print(array1[positionCounter1]); // Print a message to the LCD.
      delay(tim);                          //wait for 250 microseconds
    }
Jinak jsem zapomněl ještě dodat, že v nestíněných vodičích mám také tzv. stopovací tlačítko (cca 1,5 metrů délky), ale zde mám pull-up rezistor, protože se mi občas stalo, že došlo ke stopnutí cyklu programu, i když tlačítko nebylo zmáčknuto. Teď to funguje úplně bez problémů. Ovšem jinak bych dodal, že si nemyslím, že to S: se zobrazuje z důvodu rušení displeje... Protože pokud mě došlo k rušení displeje, tak se tam začaly zobrazovat úplně nesmyslné znaky.. Tady dle mě je problém v programu ... Asi... Možná zkusím vypsat to schváleno normálně staticky v tom makru F() a uvidím co to udělá.. ale rád bych to měl dynamicky.. pokud máte jiný návrh, jak to lépe udělat a zachovat stejnou funkčnost? Děkuji mockrát..

SRAM paměti mám využité přesně 46 %

Sketch uses 13672 bytes (5 %) of program storage space, maximum is 253952
Global variables use 3770 (46 %) of dynamic memory, leaving 4422 bytes for local variables. Max. is 8192.

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: Zastavování cyklování programu podruhé

Příspěvek od Patrik » 25 čer 2020, 16:49

Jako napadlo mě, že bych to mohl vypisovat takto po písmenku, vždy pak zastavit čas třeba na 200 ms a pak zase vypsat další písmenko... Sice to bude méně přehledné, ale mohu to zkusit.. pokud by to pomohlo.. tedy např.

Kód: Vybrat vše

lcd.setCrusor (0,0);
lcd.print (F("S"));
delay (200);
lcd.setCursor (1,0);
lcd.print (F("CH"));
delay (200);

atd... 
Je však jiné řešení?

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

Re: Zastavování cyklování programu podruhé

Příspěvek od kiRRow » 25 čer 2020, 16:54

Na takové parádičky co jsou jen na okrasu se úplně vykašli. Na ty příjde čas až pak.

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: Zastavování cyklování programu podruhé

Příspěvek od Patrik » 25 čer 2020, 18:21

Dobře tedy, zkusím to napsat jen staticky a co to bude dělat, ale pořád mi nejde do hlavy jedna věc... Tímto jsme tedy vyřešili text... Ale proč zůstala trvale svítit ta žlutá LED dioda? To přeci na to nemá vliv? Ona má správně blikat... A dle sdělení uživatelů vše funguje jak má (rozsvítí se i ta modrá LED a je přivedeno řídící U na relé).. vše prostě funguje.. Jen ta dioda svítí trvale.. Což správně dle programu nemá a nevidím v tom žádnou souvislost zároveň s tím textem:

Viz kousek kódu - celý je na úplném začátku - první příspěvek:

Kód: Vybrat vše


           for(s=set_seconds;s<60;s++)     //Seconds
      {
     printChar();
     nebyl_tam = 0;
     digitalWrite (LED_YELLOW, HIGH);
     delay(secs-(millis()%1000));
     digitalWrite (LED_YELLOW, LOW); 
     
          //pak mám kody na zmenu textu na LCD displeji v první řádku
     if (text >= 0 && text < 6) {
      lcd.clear ();
      lcd.setCursor(0, 0);
      lcd.print(F("SWver.: 03")); 
      Serial.println (F("SWver.: 03"));
      }
      if (text >= 6 && text < 11) {
       lcd.clear ();
      lcd.setCursor(0, 0);
      //lcd.print (F("                "));
      lcd.print(F("Zarizeni v chodu"));
      Serial.println (F("Zarizeni v chodu")); 
      }
      if (text >= 11 && text <= 15) {
      lcd.clear ();
      lcd.setCursor(0, 0);
      //lcd.print (F("                "));
      lcd.print (F("D: "));
      Serial.print (F("D: "));
      Serial.println (pocet_dnu);
      lcd.setCursor (4,0);
      lcd.print (pocet_dnu);
      
      lcd.setCursor (8, 0);
      lcd.print(h/10);
      lcd.print(h%10);
      lcd.print(F(":"));
      lcd.print(m/10);
      lcd.print(m%10);
      lcd.print(":");
      lcd.print(s/10);
      lcd.print(s%10); 
      }
      text++;
      if (text > 15)
      text = 0;

  // a následují další kody..

EDIT: PRojdu kod znova a všude, kde mám text zapsaný pouze lcd.print (" "); upravím do toho makra, aby to bylo ve flash pameti lcd.print (F(" ")); a to stejné v serial lince.

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

Re: Zastavování cyklování programu podruhé

Příspěvek od kiRRow » 25 čer 2020, 21:25

co když třeba výsledkem delay(secs-(millis()%1000)); se jednou za čas stane nějaký nesmysl ? By pak dávalo smysl, že vypsal první znak, rožl ledku a kousnul se na nějakým šíleným delay.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Zastavování cyklování programu podruhé

Příspěvek od ondraN » 26 čer 2020, 07:11

kiRRow píše:
25 čer 2020, 21:25
co když třeba výsledkem delay(secs-(millis()%1000)); se jednou za čas stane nějaký nesmysl ? By pak dávalo smysl, že vypsal první znak, rožl ledku a kousnul se na nějakým šíleným delay.
Jestli není čertovo kopýtko v tomhle:

Kód: Vybrat vše

Syntax

remainder = dividend % divisor;
Parameters

remainder: variable. Allowed data types: int, float, double.
dividend: variable or constant. Allowed data types: int.
divisor: non zero variable or constant. Allowed data types: int.
Možná to pro unsigned long nefunguje úplně správně.
Asi bych si ten výpočet udělal před samotnou funkcí delay() a zkontroloval jeho velikost.

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: Zastavování cyklování programu podruhé

Příspěvek od Patrik » 27 čer 2020, 15:28

Děkuji za rady. Zatím to běží již bez "problémů" co se týče cyklovani programu, ale s displejem mám zase problémy.. Už se mně to nezasekne na tom "S", ale jsou zobrazovány nesmyslné znaky (časem, třeba po dni chodu)... Program funguje normalne.. Zase ho zřejmě něco ruší.. No, zkusím zbytek těch vodicu vyměnit za stíněné a uvidím co to udělá... Nemáte nějaké návrhy? + dam k napájení LCD nějaký filtr, uvidím jestli to pomůže.

Odpovědět

Kdo je online

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