Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Arduino timer

Zdravím.
Zkouším timer a asi jsem nepochopil princip

Timer

#include "Timer.h"
  
Timer t;
int pin = 2;
int pin1 = 13;
 
void setup()
{
  Serial.begin(9600);
  pinMode(pin1,INPUT_PULLUP);
  pinMode(pin,INPUT_PULLUP);
  pinMode(pin, OUTPUT); 
}
 
 
void loop()
{
  if (digitalRead(pin1)== LOW){  
    t.pulse(pin, 10 * 10 * 1000, LOW);
    Serial.println("hups");
 }
t.update();  
Serial.println("ja si dělam co chci");
}

Co je špatně?

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Skus este do toho setup() pridat to tucne: pinMode(pin,INPUT_PULLUP); pinMode(pin, OUTPUT); digitalW…
kikoš 08.02.2016 08:31
kikoš
Ked chces thready tak si pouzi thready, ale msuis potom pre mechnicky vstup urobit debouncing (aspon… nový
MM.. 08.02.2016 10:21
MM..
Skus toto (copypastni to cele tak jak je), je tam zabranene aby sa zavolal timer znova (kvoli bounci… nový
MM.. 08.02.2016 11:06
MM..
A to t.pulse nefunguje mozno aj preto lebo pretazujes vystup, a ta funkcia po uplynuti doby invertuj… nový
MM.. 08.02.2016 11:14
MM..
Tak to poslední funguje jak má :-) už se mi to podařilo udělat i pomocí threadu if(myThread.should… nový
kikoš 08.02.2016 11:32
kikoš
Tak pouzivaj radsej to posledni, je to asi bezpecnejsie. Ked spustas thread mechanickym tlacitkom,… nový
MM.. 08.02.2016 11:43
MM..
JJ, děkují ;-) poslední
kikoš 08.02.2016 13:56
kikoš

Skus este do toho setup() pridat to tucne:
pinMode(pin,INPUT_PULLUP);
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
nejaka zmena?

S telatky jsem už vyzkoušel vše
Ono to funguje takto spolehlivě.
pinMode(pin,INPUT_PULLUP);
pinMode(pin, OUTPUT);
Relatka při najíždění arduina aní necvaknou.

Já řeším problém, jak sepnout rele třeba na 10 minut, tak aby arduino vykonávalo další přikazy.

Princip tohohle timeru jsem nepochopil, no škoda :.(

Ja myslel že timer v arduinu funguje stejně jako v delphi

Timer1.Interval : = 300; nastavím čas
timer1.Enabled:=true; a spustím si ho.
a klidně si ho v procedure TForm1.Timer po prvním pruchodu mužu zastavit.
timer1.Enabled:=false
No asi ne.

Ale koukám na ArduinoThread co by mnělo muj problem vyřešít.

To vlakna dam

digitalWrite(2, LOW);
delay(1000);
digitalWrite(2, HIGH);

A pak v te podminfe to vlakno spustím

if(myThread.shouldRun())
myThread.run();

Skus toto (copypastni to cele tak jak je), je tam zabranene aby sa zavolal timer znova (kvoli bouncingu tlacitka) ked timer uz bezi.

#include "Timer.h"
  
Timer t;
int pin = 2;
int pin1 = 13;
int stav = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(pin1,INPUT_PULLUP);
  pinMode(pin,INPUT_PULLUP);
  pinMode(pin, OUTPUT); 
}

void vratPinNaHigh()
{
  digitalWrite(pin, HIGH);
  stav = 0;
}
 
void loop()
{
  if (digitalRead(pin1)== LOW && stav == 0){
     digitalWrite(pin, LOW);
     t.after(10*1000, vratPinNaHigh) 
     Serial.println("hups");
     stav = 1;
    }

  t.update();
}

to funguje jak?
Da sa to urobit blbovzdorne X roznymi sposobmi, da sa urobit debouncing len pomocou delay(10) a nechat povodny kod, da sa to urobit komplikovany debouncing s ratatnim alebo dalsim timerom ak je prechod cez loop casovo kriticky, atd.

Alebo ked pouzijes tie tvoje thready, tak musis urobit debouncing tlacitka. V tomto co som pisal to neni nutne ptz je to fuk, pocas celeho pulzu som v stav = 1 (a pisal si ze vstupny pulz je kratsi jak vystupny).

A to t.pulse nefunguje mozno aj preto lebo pretazujes vystup, a ta funkcia po uplynuti doby invertuje vystup, a zrejme tak ze si precita stav na vystupe a invertuje ho. Ked ale vystup pretazis ze pri hodnote HIGH cita z neho napatie LOW, tak ten vystup po uplynuti doby ta funkcia "invertuje" na nespravnu hodnotu. Nechce sa mi teraz citat zdrojaky tych fcii ale tipujem ze to robi tak. Zdrojak ktory som dal teraz tu do predch.odpovede nema tento problem.
Ked nieco robis tak to musis chapat, inac nebudes schopny nikdy garantovat ze to na 100% pojde vzdy spravne.

Tak pouzivaj radsej to posledni, je to asi bezpecnejsie.

Ked spustas thread mechanickym tlacitkom, tak musis aspon urobit delay(10) na debouncing. A samozrejme ze musis aj pamata stav, aby si ten thread nevytvoril 1000x (co sice nemusis vidiet hned, ale za urcitych okolnosti to potom moze uplne rohdoit cely system) T.j. napr.
if(digitalRead(pin) == HIGH && stav == 0)
{
spust thread
stav = 1;
delay(10); // debouncing
}

if(digitalRead(pin) == LOW && stav == 1)
{
stav = 0;
delay(10); // debouncing
}

Nevyhoda takehoto jednoducheho debouncingu je to ze to zastavi cele arduino na 10ms, ale je to takto najjednoduchsie.
Ked na to nemyslis a mas tam napr. debug vystup tak ten urobi opozdenie kludne aj 10ms a myslis si ze vsetko je super aj bez debouncingu a raz vyhodis ten debug vystup a zistis ze zrazu to blbne :)

Zpět do poradny Odpovědět na původní otázku Nahoru