Re: Program Arduino nano
Napsal: 10 bře 2022, 19:28
Tak jsem se řídil Vámi udělenými radami, a po prostudování fce Millis() jsem se dobral výsledku.
Funguje téměř dokonale, impulzy počítá jak má, a na výstup se impulzy posílají většinou taky jak mají. Občas se objeví totiž taková anomálie (cca jednou za 10-20 cyklů, někdy vůbec), kdy se na pin 12 pošle impulz (nízká úroveň), ale po uběhnutí daného časového intervalu (200ms) kdy se má pin 12 přehodit opět do high stavu, se nic neděje. Přeskočí tam až po uběhnutí dalších 180 impulzů encoderu. Je to způsobeno nějákou nedokonalostí, nebo nepřesností procesoru, nebo je chyba jako obvykle na straně člověka? :DD
Kód: Vybrat vše
int cnt;
boolean pricetl_jsem;
unsigned long cas_1;
unsigned long cas_2;
boolean flag;
void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(12, OUTPUT);
Serial.begin(9600);
cnt=0;
pricetl_jsem=false;
flag=false;
digitalWrite(12, HIGH);
}
void loop() {
if((digitalRead(2) == LOW) && pricetl_jsem == false) {
cnt=cnt+1;
Serial.println(cnt); //Kdyz je enkoder na Low pricti si +1 a zaroven si poznamenej ze uz jsi pricetl.... Pokud je Low a pricetl jsi, nedelej nic. Pokud je high, tak nastav ze jsi jeste necetl.
pricetl_jsem=true;
}
if((digitalRead(2) == HIGH) && pricetl_jsem == true) {
pricetl_jsem=false;
}
if(cnt == 180) {
cnt=0;
Serial.println("nizka na 12"); //impulz se poslal
digitalWrite(12, LOW);
cas_1=millis();
cas_2=cas_1+200UL;
flag=true;
}
if((cas_2 == millis()) && flag == true) {
Serial.println("vysoka na 12"); //konec impulzu
digitalWrite(12, HIGH);
flag=false;
}
}