arduino for loop

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

Rockn_Rolla
Stály člen
Stály člen
Príspevky: 161
Dátum registrácie: 11 Jún 2014, 20:35

arduino for loop

Príspevok od používateľa Rockn_Rolla » 18 Mar 2020, 14:42

zdravím, taká blbá otázka ale nejak som nenašiel odpoveď kedže sa učím sám.

potrebujem vedieť či sa dajú robiť aj iné veci na arduino keď sa mi spusti for loop.

lebo keď sa mi spusti for loopovanie nemôžem nič robiť pokiaľ neskonči.

Potrebujem vykonávať viac veci naraz.

Mam ovládanie cez encoder, keď spustím stmievanie led, tak ledku stimeva. Ale nejde nič iné robiť pokiaľ ten for loop neskončí.
Dá sa to nejako obísť?

Používam Arduino UNO
knihovňa RotaryEncoder

Tu je skrátená verzia môjho problému.

Kód: Vybrať všetko

#include <RotaryEncoder.h>
#include <Wire.h>
#define ROTARYSTEPS 1
#define ROTARYMIN 0
#define ROTARYMAX 16
int setPos;
int bright = 0;
int ledPin = 9;
const byte buttonPin = 4; 
byte buttonState = 0;

int newPos;

int lastPos = -1;

RotaryEncoder encoder(3, 2);
void setup()
{
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  Serial.println("LimitedRotator ");
  encoder.setPosition(setPos / ROTARYSTEPS); } 



void loop()
{
  
  buttonState = digitalRead(buttonPin);
 encoder.tick();

  newPos = encoder.getPosition() * ROTARYSTEPS;

  if (newPos < ROTARYMIN) {
    encoder.setPosition(ROTARYMIN / ROTARYSTEPS);
    newPos = ROTARYMIN;

  } else if (newPos > ROTARYMAX) {
    encoder.setPosition(ROTARYMAX / ROTARYSTEPS);
    newPos = ROTARYMAX;
  }

  if (lastPos != newPos) {
    Serial.print(newPos);
    Serial.println();
  }
  if (buttonState == 0 && newPos == 5) {
    digitalWrite(ledPin, HIGH);
  }

  if (buttonState == 0 && newPos == 12) {
    digitalWrite(ledPin, LOW);
  }

  if(buttonState == 0 && newPos == 15){
  bright = 0;  
    for (int i = 0; i < 250; i++) {
      bright = i;
    delay(150);
    analogWrite(ledPin, bright);
    lastPos = newPos;
    }
 
  }
    lastPos = newPos;

} 
 
Ďakujem za každú radu
0

popopepe
Stály člen
Stály člen
Príspevky: 404
Dátum registrácie: 22 Jún 2009, 00:00

Re: arduino for loop

Príspevok od používateľa popopepe » 18 Mar 2020, 14:52

0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: arduino for loop

Príspevok od používateľa jirka.jirka. » 18 Mar 2020, 15:39

Kdyby to nešlo obejít, tak počítače by byly nepoužitelné.

Takže jako první co potřebuješ je seznámit se s:
Čítač/Časovač
Přerušení

To jsem našel v rychlosti tady: http://src.athaj.cz/teaching/rev/arch_timers_interrupts

Potom, až budeš vědět co děláš, tak můžeš začít implementovat to do arduina. :thumbup:
A to by možná šlo podle tohoto: https://www.arduinoslovakia.eu/blog/201 ... me?lang=cs, ale jistý si nejsem.
0

Používateľov profilový obrázok
roboulbricht
Stály člen
Stály člen
Príspevky: 156
Dátum registrácie: 07 Jan 2015, 12:01
Bydlisko: Banská Bystrica
Vek: 54
Kontaktovať používateľa:

Re: arduino for loop

Príspevok od používateľa roboulbricht » 18 Mar 2020, 19:43

Možností máš veľa. Aj napríklad cez ten CTC timer. Najpohodlnejšie pre teba asi bude použitie niektorého timera. Napríklad si nastavíš na timeri periódu 1000 Hz a budeš dostávať prerušenie každú 1 ms. Od toho ľahko odvodíš tých tvojich 150 ms. Pri timeri si ale treba dať pozor, že ak nastavíš timer, tak môže kolidovať s funkciou analogWrite. Čiže si treba dobre rozmyslieť, ktorý timer použiješ a ktorý PWM pin budeš používať.

Timer kalkulátor
https://www.arduinoslovakia.eu/applicat ... calculator

O timeroch som napísal zopár článkov, tak použi tento rozcestník. Ale jirka.jirka ti dal link na základnú teóriu okolo CTC timerov.
https://www.arduinoslovakia.eu/page/casovac-(timer)

A dá sa to aj bez timera robiť. Môžeš sa inšpirovať mojimi kódmi na LED stmievač. Tam postupuješ tak, že funkciou millis si čítaš aktuálny čas a ten si porovnávaš, či už uplynul tvoj interval a vtedy posunieš hodnotu PWM o 1.
https://www.arduinoslovakia.eu/page/stm ... u-attiny85
https://github.com/RoboUlbricht/arduino ... chenDimmer
0

pocitujlasku
Ultimate člen
Ultimate člen
Príspevky: 6201
Dátum registrácie: 20 Júl 2007, 00:00
Vek: 41

Re: arduino for loop

Príspevok od používateľa pocitujlasku » 18 Mar 2020, 19:46

ja vsetko na arduine riesim cez millis. napr. stmievanie 4 led nezavisle + popri tom meranie teploty + odosielanie aktualnych stavov.
v principe si ukladam do premennych krok a millis. napr. stmievanie. nastavim pwm a ulozim si do premennej, ze dalsi krok urob za millis +250. a to v tom loope kontrolujem ak je splnena podmienka, tak opat nastavim pwm a cas kedy sa ma urobit dalsi krok. takto mam pod sebou nasekane vsetko. proste to rozbijem na male kusocky a tie vykonavam za sebou. taky primitivny multitasking. samozrejme si musim davat pozor aby jedna operacia netrvala dlho.
0
Jedním z největších projevů nedůvěry v Boha je hromosvod na kostele.

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: arduino for loop

Príspevok od používateľa peterple » 18 Mar 2020, 20:34

Vybral si sa na tenký ľad. Tu už končí sranda v podobe lepenia knižničných funkcií. Sú dve cesty. Jedna je cesta časovačov čo je tá náročnejšia na štúdium. Podľa kódu čo si postol by som ti ju neodporúčal. Vyžaduje hlboké štúdiom. Ľahšia cesta je knižničnou funkciou millis ako ti tu doporučovali. Ale má to svoje háčiky a háky.
To čo nalinkoval popopepe je OK
To čo nalinkoval roboulbricht už celkom tak OK nieje. Možno v jeho prípade je. Neštudoval som to detailne. Len som tam okamžite našiel častú chybu ktorá sa robí pri použití millis.

Tu si o tom môžeš prečítať viacej.
http://www.plesnik.sk/Sim/milis.html
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

pocitujlasku
Ultimate člen
Ultimate člen
Príspevky: 6201
Dátum registrácie: 20 Júl 2007, 00:00
Vek: 41

Re: arduino for loop

Príspevok od používateľa pocitujlasku » 19 Mar 2020, 10:33

peterple: ano, tak ako je to v tom odkaze, tak nejak to pouzivam aj ja, len treba davat pozor, aby v niektorych volaniach nebol delay (nejake narychlo zbuchane)
0
Jedním z největších projevů nedůvěry v Boha je hromosvod na kostele.

Rockn_Rolla
Stály člen
Stály člen
Príspevky: 161
Dátum registrácie: 11 Jún 2014, 20:35

Re: arduino for loop

Príspevok od používateľa Rockn_Rolla » 19 Mar 2020, 11:01

Vďaka chlapci skoro celú noc som študoval millis() :D. Nejak som to dúfam pochopil. Len to som dal ako príklad. Ono v podstate mam rozbehnute niečo náročnejšie. Otázka znie: bude to fungovať spoľahlivo aj cez real time clock? Takže čas zapnutia rozsvitu LED == real time.
Trvanie od 0 - 100% cca 10min. potom trvalo svieti. Čas vypnutia LED == real time. Trvanie od 100 - 0% cca 10min.

Mám obavy že cez millis to bude robiť problém, jedine žeby som ho resetoval, keď real time == 00:00 (keď to je možné a nebude mi to robiť problémy s real time).

Ale ešte to nemám poriadne preštudované, preto sa to chcem naučiť na tom jednoduchom príklade hore.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: arduino for loop

Príspevok od používateľa jirka.jirka. » 19 Mar 2020, 11:06

Přečetl jsem to asi 3x a nepochopil jsem to. Co tam máš s real time? Kde jsi vzal real time?

Napiš, co přesně děláš, nebo je to snad vojenské tajemství? :biggrin:
0

Rockn_Rolla
Stály člen
Stály člen
Príspevky: 161
Dátum registrácie: 11 Jún 2014, 20:35

Re: arduino for loop

Príspevok od používateľa Rockn_Rolla » 19 Mar 2020, 11:33

Sorry blbo som to vysvetlil. Mam rozbehnutý projekt kde používam DS3231 I2C real time clock.
Tam som narazil na ten problém. Pri nastavenom čase mi funguje rozsvit a stmievanie LED len mi arduino zmrzne pokiaľ to neukončí delay().

V prvom príspevku to bol len príklad ktorý poukazuje na môj problém.
Problém ste mi pomohli vyriešiť začo vám ďakujem.
Len po preštudovaní millis() za pár hodín ma napadla ta druha otázka. :mrgreen: viem že si to mam poriadne preštudovať ale radšej sa spýtam. :argue:

Snáď je to zrozumiteľné. :)


Čo sa týka millis():
Otázka znie: bude to fungovať spoľahlivo aj cez real time clock? Takže čas zapnutia rozsvitu LED == real time.
Trvanie od 0 - 100% cca 10min. potom trvalo svieti. Čas vypnutia LED == real time. Trvanie od 100 - 0% cca 10min.
0

pocitujlasku
Ultimate člen
Ultimate člen
Príspevky: 6201
Dátum registrácie: 20 Júl 2007, 00:00
Vek: 41

Re: arduino for loop

Príspevok od používateľa pocitujlasku » 19 Mar 2020, 12:58

nemiesaj rtc a millis. jednoducho pridas podmienku ak je datum cas taky a taky, tak nastavis premenne na prvy krok - teda krok 1 a nastavis si premennu pre dalsi krok na millis+ ten "delay". teda vlastne tebe to datum a cas odstartuje a dalej sa riadis hodnotou millis. len pri tej kontrole datumu a casu si musis skontrolovat ci uz nahodou nebezi to stmievanie, aby ti to stale nedavalo do prveho kroku.
0
Jedním z největších projevů nedůvěry v Boha je hromosvod na kostele.

Rockn_Rolla
Stály člen
Stály člen
Príspevky: 161
Dátum registrácie: 11 Jún 2014, 20:35

Re: arduino for loop

Príspevok od používateľa Rockn_Rolla » 19 Mar 2020, 14:49

Super už tomu všetkému začínam konečne chápať. :) Tak zatiaľ vám všetkým Ďakujem :thumbup:
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: arduino for loop

Príspevok od používateľa peterple » 19 Mar 2020, 18:58

Rockn_Rolla napísal:Otázka znie: bude to fungovať spoľahlivo aj cez real time clock?
To záleží len od toho ako to urobíš. Zle sa dá urobiť aj test pre millis ale aj reset počítadla po jednom dni. Jednoznačne sa to dá povedať až podľa kódu ktorý reálne použiješ. Napríklad takto je to zle:

Kód: Vybrať všetko

timer0_millis=0;
S tým RTC máš aké skúsenosti ohľadom presnosti? Keď som kedysi dávno robil hodiny tak RTC som mal len ako zálohu času a nastavoval som ho každú minútu aby sa mi nerozchádal. Čas počítaný procesorom bol v presnosti rádu sekund za mesiac. Samozrejme nie s hocijakým kryštálom, ale s presným 4,194304Mhz.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Rockn_Rolla
Stály člen
Stály člen
Príspevky: 161
Dátum registrácie: 11 Jún 2014, 20:35

Re: arduino for loop

Príspevok od používateľa Rockn_Rolla » 19 Mar 2020, 19:21

Aha tak je to zle:

Kód: Vybrať všetko

 timer0_millis=0;  
A ako to je dobre?

Ako projekt s rtc mam stále v testovacej verzii. Ešte som ho nenechal pracovať viac ako deň. Takže neviem povedať. Je to cez i2c a že vraj je spoľahlivé.
Ale budem to testovať časom.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: arduino for loop

Príspevok od používateľa peterple » 19 Mar 2020, 20:53

napríklad:

Kód: Vybrať všetko

ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
	timer0_millis=0;
}
Presnosť si vyskúšaj, aby si nebol prekvapený. Ani ten 16Mhz kryštál arduina nie je nič moc. Zvyčajne to je tak max 16.000 MHz. Teda ani tá millis nie je ktovie ako presná.
U RTC presnosť nesúvisí s komunikačnou zbernicou. Vlastnosti I2C na to nemajú vplyv. Vplyv na to má presnosť 32kHz kryštála a jeho teplotná stabilita.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: arduino for loop

Príspevok od používateľa jirka.jirka. » 20 Mar 2020, 06:59

U toho DS3231 bude stabilita velmi dobrá. https://datasheets.maximintegrated.com/en/ds/DS3231.pdf

Myslím si, že nebude ani potřeba žádné kompenzace, protože tento chip "pokud to bude originál" bude velmi kvalitní. Ale to zjistí až časem a nějakým vhodným měřením. Kdežto krystal u MCU bude lítat nahoru dolů s teplotou jak šílený.
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok