|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
programming Član
Pridružen-a: Sre 09 Jan 2013 19:58 Prispevkov: 33 Aktiv.: 0.24
|
Objavljeno: Pon Sep 20, 2021 12:09 pm Naslov sporočila: Ultrasonic senzor in senzor dotika |
|
|
Pozdravljeni, prosim za pomoč pri pisanju programa v katerem imam vključena senzor dotika in ultrasonic senzor razdalje. Program naj deluje tako, da ko je pritisnjena tipka oziroma, ko je aktiviran senzor dotika in ta ostane pritisnjen/aktiviran se prižge modra led, ki ostane prižgana dve sekundi, nato se modra led ugasne in hkrati prižge zelena led takrat spustimo pritisnjeno tipko oziroma senzor dotika in se istočasno ob spustu tipke/senzorja dotika prične merjenje časa, ki je aktivno dokler se ne aktivira ultrasonic senzor razdalje za vrednost zaznavanja do 1m, nato se merjenje časa ustavi in izmerjeni čas izpiše na zaslonu. Ob ponovnem pritisku tipke oziroma aktiviranju senzorja dotika se postopek ponovi.
Pri senzorju dotika je problem predvsem, da ko je pritisnjen in ostane pritisnjen program ostane na začetku in ne nadaljuje do preostalih ukazov.
Pri ultrasonic senzorju razdalje me zanima ali ga je mogoče uporabit za zaznavanje objektov/predmetov in da je ob tem mogoče natančno merjenje časa.
Prosim za pomoč in kakšne popravke bi potreboval pri spodnjem programu za pravilno delovanje.
Koda: |
int trigPin = 12;
int echoPin = 11;
int modra= 3;
int zelena= 8;
int touch = 9;
int Buzzer = 4;
long duration, distance;
int startTime = 0;
int endTime = 0;
void setup() {
Serial.begin(9600);
pinMode(Buzzer, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(touch, INPUT);
pinMode(modra, OUTPUT);
pinMode(zelena, OUTPUT);
}
void loop() {
digitalWrite(trigPin,HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration=pulseIn(echoPin, HIGH);
distance =(duration/1)/29.1;
duration=pulseIn(echoPin, LOW);
delay(10);
if(digitalRead(touch) == HIGH) {
digitalWrite(modra,HIGH);
delay(2000);
digitalWrite(modra,LOW);
digitalWrite(zelena,HIGH);
while (digitalRead(touch) == LOW)
{
}
startTime = millis();
}
if((distance<=100))
{
digitalWrite(zelena,LOW);
}
endTime = millis();
int totalTime = endTime - startTime;
Serial.print(totalTime);
Serial.println("ms");
}
|
|
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.91 Kraj: Grosuplje
|
Objavljeno: Pon Sep 20, 2021 7:50 pm Naslov sporočila: |
|
|
Kakšen oz. kateri senzor pritiska imaš in kako je povezan na Arduina? _________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
programming Član
Pridružen-a: Sre 09 Jan 2013 19:58 Prispevkov: 33 Aktiv.: 0.24
|
Objavljeno: Tor Sep 21, 2021 1:15 am Naslov sporočila: |
|
|
Jaka57 je napisal/a: |
Kakšen oz. kateri senzor pritiska imaš in kako je povezan na Arduina? |
Senzor dotika:
https://www.aliexpress.com/item/1774130959.html
Povezan je na D9 arduino NANO ploščo. |
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.91 Kraj: Grosuplje
|
Objavljeno: Tor Sep 21, 2021 8:09 pm Naslov sporočila: |
|
|
Ali ti tudi ne izpiše nič v oknu terminala? _________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
programming Član
Pridružen-a: Sre 09 Jan 2013 19:58 Prispevkov: 33 Aktiv.: 0.24
|
Objavljeno: Tor Sep 21, 2021 10:20 pm Naslov sporočila: |
|
|
Izpisuje čas v ms približno vsako sekundo, ko pritisnem touch (senzor dotika), ultrasonic senzor nato ne ustavi časa, niti ne izklopi led, pri touch je problem ker je ob pritisku pritisnjena več časa (min 2s) do prižiga zelene led in zato program ves čas skače na začetek ukaza in na nadaljuje do ostalih ukazov v programu? |
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.91 Kraj: Grosuplje
|
Objavljeno: Tor Sep 21, 2021 10:31 pm Naslov sporočila: |
|
|
Še enkrat sem šel prebrat, kaj počenjaš. Problem je, ko se prižge zelena LED nisi dovolj hiter, pri spuščanju senzorja dotika (mikrosekunde)
programming je napisal/a: |
..... da ko je pritisnjena tipka oziroma, ko je aktiviran senzor dotika in ta ostane pritisnjen/aktiviran se prižge modra led, ki ostane prižgana dve sekundi,
nato se modra led ugasne in hkrati prižge zelena led takrat spustimo pritisnjeno tipko oziroma senzor dotika in se istočasno ob spustu tipke/senzorja dotika prične merjenje časa,......... |
Ker nisi dovolj hiter, program enostavno preskoči zanko, izvede vse kar je potem in gre ponovno v void Loop():
Koda: |
while (digitalRead(touch) == LOW)
{
} |
Probaj:
Koda: |
while (digitalRead(touch) == HIGH)
|
V tem primeru bo čakal, da spustiš tipko, ko se prižge zelena LED. _________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
programming Član
Pridružen-a: Sre 09 Jan 2013 19:58 Prispevkov: 33 Aktiv.: 0.24
|
Objavljeno: Tor Sep 21, 2021 11:41 pm Naslov sporočila: |
|
|
Sem popravil, sedaj deluje ampak se pojavi nov problem pri ultrasonic senzorju, saj ne zazna takoj predmeta,ovire ampak šele po določenem času, to je verjetno zaradi delay, saj tudi čas izpisuje v preslednkih na minuto in ko se zelena led izklopi čas še vedno teče naprej na serijskem vmesniku. Je sploh mogoče natančno merjenje časa v kombinaciji z ultrasonic senzorjem za prekinitev (ob zaznanju predmeta)? |
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.91 Kraj: Grosuplje
|
Objavljeno: Sre Sep 22, 2021 12:06 am Naslov sporočila: |
|
|
Saj nimaš nikjer v programu zapisano, da si zapomni čas, ko zazna predmet!
Tudi tvoja formula za izračun razdalje je malo čudna, razen, če računaš razdaljo v nekem mediju drugačnem od zraka(voda, olje,........):
Koda: |
distance =(duration/1)/29.1; |
Najprej nekaj deliš z 1 nato pa še z 29.1!?
Kako natančno bi rad meril čas? _________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
programming Član
Pridružen-a: Sre 09 Jan 2013 19:58 Prispevkov: 33 Aktiv.: 0.24
|
Objavljeno: Sre Sep 22, 2021 9:34 am Naslov sporočila: |
|
|
Očitno bo potrebnih nekaj popravkov programa, čas bi meril v sekundah, do stotinke natančno. |
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.91 Kraj: Grosuplje
|
Objavljeno: Sre Sep 22, 2021 7:37 pm Naslov sporočila: |
|
|
Ja, kar nekaj popravkov bo treba in merjenje do storinke natančno naj ne bi bil problem.
Lahko bi pa opisal bolj natančno ta tvoj projekt, ker takole na pamet enostavno ne gre, iz svojega opisa izpustiš samo en detalj in je lahko program popolnoma drugačen.
Recimo, nekaj se približuje tvojemu UZ senzorju ali je potrebno merit čas od začetka prižgane zelene LED diode do trenutka, ko se predmet približa na razdaljo <1m ali kako?
Če je temu tako, potem je potrebno krepko spremeniti program, kajti tako kot je napisan sedaj, je potrebno za vsako merjenje razdalje ponovno pritisnit tipko. _________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
programming Član
Pridružen-a: Sre 09 Jan 2013 19:58 Prispevkov: 33 Aktiv.: 0.24
|
Objavljeno: Pon Sep 27, 2021 6:35 pm Naslov sporočila: |
|
|
Jaka57 je napisal/a: |
Ja, kar nekaj popravkov bo treba in merjenje do storinke natančno naj ne bi bil problem.
Lahko bi pa opisal bolj natančno ta tvoj projekt, ker takole na pamet enostavno ne gre, iz svojega opisa izpustiš samo en detalj in je lahko program popolnoma drugačen.
Recimo, nekaj se približuje tvojemu UZ senzorju ali je potrebno merit čas od začetka prižgane zelene LED diode do trenutka, ko se predmet približa na razdaljo <1m ali kako?
Če je temu tako, potem je potrebno krepko spremeniti program, kajti tako kot je napisan sedaj, je potrebno za vsako merjenje razdalje ponovno pritisnit tipko. |
Hvala za pomoč sem rešil problem, niti ni bilo tako težko samo nekaj volje je bilo potrebno in vse deluje kot švicarska ura!
Me pa zanima s katerim ukazom lahko pretvorim milisekunde v sekunde na tri decimalke natančno, za pretvorbo na dve decimalni mesti natačno sem uporabil ukaz:
Koda: |
Serial.println((double)totalTime/1000);
|
|
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 70 dni
Powered by phpBB © 2001, 2005 phpBB Group
|