Laserový senzor s počítadlem

Odpovědět
qdj
Příspěvky: 6
Registrován: 09 pro 2018, 06:52
Reputation: 0

Laserový senzor s počítadlem

Příspěvek od qdj » 09 pro 2018, 07:09

Zdravím,

následující kód dělá to, že když laserový senzor detekuje laserový paprsek, zvýší se hodnota na dipleji o 1. Nyní mám nastavenu prodlevu pro zjišťování hodnot ze senzoru na 10 ms, takže se stává, že na jeden zásah laserem se zvýší hodnota na displeji i o 3. Když nastavím delší prodlevu, tak to občas laser nezachytí. Řešením by bylo nechat prodlevu na 10 ms s tím, že po zásahu laserem se přičte 1 a další zásahy se po dobu např. 500 ms nepočítají. Jak upravit kód? Děkuji.

#include <Arduino.h>
#include <TM1637Display.h>

#define DETECT 4
#define ACTION 3
#define CLK 2
#define DIO 3


#define TEST_DELAY 2000


TM1637Display display(CLK, DIO);

void setup()
{
Serial.begin(9600);
pinMode(DETECT, INPUT);//define detect input pin
pinMode(ACTION, OUTPUT);//define ACTION output pin
display.setBrightness(6);
}

int numb=0;

void loop()
{
int detected = digitalRead(DETECT);// read Laser sensor
display.setBrightness(0x0f);
display.showNumberDec(numb,false);
if(detected==HIGH)
{
digitalWrite(ACTION,HIGH);
numb++;
}
else
{
digitalWrite(ACTION,LOW);
}
delay(10);
}

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Laserový senzor s počítadlem

Příspěvek od petan » 09 pro 2018, 10:01

No, v tomto programu by bylo asi nejjednodušší jednoduše, pokud byl zaznamenán zásah laserem (?) tak počkat zbylých 500 ms. Pokud laser nebyl zaznamenán, tak čekat jenom těch 10 ms. Takže jednoduše doplnit příkaz delay do podmínky.

Jinak, celej program je tak nějak spíchlej horkou jehlou...
Všeobecně detekovat nějakej signál zároveň s příkazem delay není nikdy správná volba. Lepší by bylo použít přerušení a debounce řešit jinak
V programu je v cyklu zbytečně použit příkaz "display.setBrightness(0x0f);". Ten nastavuje podsvětlení displeje. Opravdu je potřeba v každém cyklu nastavovat stejnou hodnotu?
Logická hodnodu (digitalRead) je lepší zapsat do bool proměnné. Stejně může nabývat hodnotu jenom true, nebo false. Takže se tím ušetří místo v paměti a zpřehlednit program.
Přiřazování hodnoty na výstup se provádí v podmínce podle aktuálního vstupu. Signál je tedy vždy stejný (když pominu zpoždění při vykreslování displeje). Lze tedy pod čtením hned nastavit výstup. A protože je aktuální stav vstupu v bool proměnné detected, může se na výstup zapsat tento stav.
V případě detekce se na displej vykreslí nejdříve stará hodnota a pak nová hodnota. Vykreslení by mělo být až za novým nastavením proměnné. Proto je lepší vykreslovat číslo až na konci programu.

Doporučuji si stáhnout/koupit knihu Průvodce světem Arduina.


Kód: Vybrat vše

#include <Arduino.h>
#include <TM1637Display.h>

#define DETECT 4 
#define ACTION 3 
#define CLK 2
#define DIO 3


#define TEST_DELAY 2000


TM1637Display display(CLK, DIO);

void setup()
{
   Serial.begin(9600);
   pinMode(DETECT, INPUT);//define detect input pin
   pinMode(ACTION, OUTPUT);//define ACTION output pin
   display.setBrightness(6); 
   display.setBrightness(0x0f);	//proč je to tu dvakrát?
}

int numb=0;

void loop(){
   bool detected = digitalRead(DETECT);// read Laser sensor
   digitalWrite(ACTION,detected );	//zapsat stav laseru na výstup

   if(detected){
      //pokud byl detekován signál detected == high
      numb++;	//přičíst 1
      delay(500);	//čekat 500 ms
   }
   else{
      //signál nebyl detekován
      delay(10);	//čekat 10 ms
   }
   
   display.showNumberDec(numb,false);
}

qdj
Příspěvky: 6
Registrován: 09 pro 2018, 06:52
Reputation: 0

Re: Laserový senzor s počítadlem

Příspěvek od qdj » 09 pro 2018, 18:02

Díky moc, funguje to. Ten program jsem splácal ze dvou různých stažených z netu (zvlášť pro displej a pro senzor), ale protože to je první věc, co v Arduinu dělám tak to dopadlo takto. Děkuji za rady a zároveň mám i dotaz. Jakou nejnižší hodnotu "delay" lze nastavit tak, aby program smysluplně fungoval (obecně, ne jen tento)?

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Laserový senzor s počítadlem

Příspěvek od jankop » 09 pro 2018, 19:50

Obecně je delay() funkce, kterou je třeba používat co nejméně, respektive je nejlepší ji nepoužívat vůbec.

qdj
Příspěvky: 6
Registrován: 09 pro 2018, 06:52
Reputation: 0

Re: Laserový senzor s počítadlem

Příspěvek od qdj » 09 pro 2018, 21:03

Znamená to, že když funkci delay vypustím, tak zařízení bude vyhodnocovat přítomnost signálu kontinuálně?

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Laserový senzor s počítadlem

Příspěvek od jankop » 09 pro 2018, 21:21

Celý proces bude vždy sekvenční, ale pochopitelně čím méně nečinných prodlev, tím vyšší četnost vzorkování.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Laserový senzor s počítadlem

Příspěvek od gilhad » 11 pro 2018, 00:05

Ne zase tak jiny problem jsem onehda resil - potrebuju okamzitou reakci na stisknuti/pusteni tlacitka, ale tlacitko samo o sobe ma priserne zakmity a mezitim, co cekam, az se nejak uklidni, tak potrebuju delat i jine veci (klikat mysi), mnohem rychleji, nez se to tlacitko uklidni.

Cely program je tady, zkus se tim probrat, treba ti to mnohe ozrejmi (jo, bezi mi tam nekolik nezavislych casovanych cyklu prez sebe - zadny delay, zadny problem :)

http://robodoupe.cz/2018/drobnicky-006- ... e-klikacu/

qdj
Příspěvky: 6
Registrován: 09 pro 2018, 06:52
Reputation: 0

Re: Laserový senzor s počítadlem

Příspěvek od qdj » 12 pro 2018, 12:40

Hezké - díky a kradu :mrgreen:

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Laserový senzor s počítadlem

Příspěvek od petan » 12 pro 2018, 15:59

Nejrychlejší reakce na stisk tlačítka je přímej drát :D
Ale samozřejmě v Arduinu to je přerušení... To i v případě, že má program něco rozdělanýho zareaguje na stisk signálu.

Odpovědět

Kdo je online

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