Arduino programozás segítség

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
csegebiga
Chipgyilok
Hozzászólások: 284
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Arduino programozás segítség

HozzászólásSzerző: csegebiga » 2018. május 2. szerda, 16:22

Megint fordítva ülsz a lovon.
A millis() függvény a chip indulásától tulcsordulásig számolja az eltelt időt millisecundumban.
Tehát te nem nullázod.
Ha a változódnak adsz millis()-el értéket, utána ne nullázd le, mert elvész az (idő)információd
Csináld a következőt

Kód: Egész kijelölése

Most= millis();
Ciklus
Ha millis() nagyobb Most+1000
 Akkor
  Másodperc++;
  Most=millis();
  Ide jönne a többi átvitel is
  (perc,óra,nap,hét,hónap,év)
 Akkor vége
Ciklus vége

Kihagytuk az osztást, egyszerűsödött a program.

Ha mégjobban odafigyelsz, láthatod hogy a '+1000' művelet minden ciklusban végrehajtódik a feltétel vizsgálatakor.
Ezt is kiszedheted a kódból:

Kód: Egész kijelölése

Eltelt= millis()+1000;
Ciklus
Ha millis() nagyobb Eltelt
 Akkor
  Másodperc++;
  Eltelt=millis()+1000);
  Ide jönne a többi áviel is
  (perc,óra,nap,hét,hónap,év)
 Akkor vége
Ciklus vége

Avatar
csegebiga
Chipgyilok
Hozzászólások: 284
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Arduino programozás segítség

HozzászólásSzerző: csegebiga » 2018. május 2. szerda, 16:45

Verjoz írta:Értem! Vagyis figyelmetlen voltam és tulkombinaltam. De mi van akkor ha én nem
long valtozo=0;
hanem
int változó=0;
vagy
byte valtozo=0;

Csak a konkrét példanal nem értem hogy miért longot használ. Vagy miért is használ egyáltalán.
Nagyon hiányos a tudáso...

A pulsein() függvény az eltelt időt adja vissza MIKROmásodpercben.
Kérlek nézd át a klf változótipusok értékkészletét!
És szorzzál egy kicsit
Byte esetén 256usec után túlcsordul. Ez 0.256 msec , vagyis 0.000256 sec. Rettenetesen kicsi
Int esetén az általad említett 32K az 32msec, vagyis 0.032 sec és vége.
Ezért használ long tipust és ezért használja az unsigned long verziót, mivel az eltelt idő nem lehet negatív.

A változótipusoknál nagyon észnél kell lenni, mert a konverzióknál információ veszhet el, és bitang nehéz utána megtalálni, hogy hol áll fejre a programod.
(Pl lebegőpontos értéket teszel egészbe, vagy byteba intet)

Verjoz
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

HozzászólásSzerző: Verjoz » 2018. május 14. hétfő, 10:53

Köszönöm a megtisztelő válaszaitokat!
Ami újabb fejtörést okoz szinte le sem merem írni,
mert annyira alap dolog de valahogy nekem nem jön össze.
Analóg bemenet digitális INPUT ként kezelni.
void setup ban adom meg?
pinMode(A0,INPUT); ?????
Mert a reference azt írja hogy lehet analóg inputot
digitális INPUT ként használni.
Én egy nyomogombos szeretnék ide kötni helyesebben 4 db ot.
És amikor megnyomom az 5 V őt raengedem és ez lenne egy magas jel a program számára.
Ez azért kell mert a Digitális I/O elfogyott. Az LCD meg amit meghajtok vele az Unon felemésztette a digitális oldalt. A Digitális 0,1 pincéket még nem tudom bemenetkénk használni.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: Arduino programozás segítség

HozzászólásSzerző: kapu48 » 2018. május 14. hétfő, 12:12

Igen lehet.

Verjoz
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

HozzászólásSzerző: Verjoz » 2018. május 14. hétfő, 19:33

És mi a módja?

atilla
Biztosítékgyilkos
Hozzászólások: 51
Csatlakozott: 2016. május 10. kedd, 18:35

Re: Arduino programozás segítség

HozzászólásSzerző: atilla » 2018. május 14. hétfő, 20:04

void setup() {
pinMode(14, INPUT);
}
...és így tovább...

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9908
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Arduino programozás segítség

HozzászólásSzerző: Robert » 2018. május 15. kedd, 11:55

Vagy pinMode(A1, INPUT);
http://www.tavir.hu - a gazda :)

Verjoz
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

HozzászólásSzerző: Verjoz » 2018. május 16. szerda, 7:21

Igen. Én is az utóbbival próbálkoztam.
Akkor viszont az elektromos bekötésben hibàzhattam.
A profi működik mert DI/O szabadon maradt átírtam arra a programot és úgy működik.

Verjoz
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

HozzászólásSzerző: Verjoz » 2018. május 16. szerda, 7:53

Csak megmutatom hogy is néz ki a code.
Már csak az a kérdés hogy a nyomogombos analógia hogy kotom be.

Kód: Egész kijelölése

/*jcb powershift transm. c.s.*/

#include "LiquidCrystal.h"

LiquidCrystal lcd(4,5,6,7,8,9);

byte gombok=5;




void setup() {



lcd.begin(16,2);
pinMode(A0,INPUT);//gomb+
pinMode(A1,INPUT);//gomb-
pinMode(A2,INPUT);//uzemi fek
pinMode(A3,INPUT);//kezi fek

pinMode(2,OUTPUT);//elorre irany
pinMode(3,OUTPUT);//hatra irany
pinMode(10,OUTPUT);//2 es fokozat
pinMode(11,OUTPUT);//3 as fokozat
pinMode(12,OUTPUT);//4 es fokozat
 
}

void loop() {
if(analogRead(A0)==HIGH){
delay(3);
gombok++;}
if(analogRead(A1)==HIGH){
delay(3);
gombok--;}
if(analogRead(A2)==HIGH){
delay(3);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
}
if(analogRead(A3)==HIGH){
delay(3);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("KEZIFEK BEHUZVA");
delay(1000);
lcd.clear();
delay(100);
}
gombok=constrain(gombok,1,9);

lcd.setCursor(0,0);
lcd.print("IRANY:");
lcd.setCursor(0,1);
lcd.print("FOKOZAT:");

switch (gombok){
case 5:
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
lcd.clear();
lcd.setCursor(7,0);
lcd.print("URES");
lcd.setCursor(0,1);
lcd.print("FOKOZAT: 0");
break;

case 4:
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
lcd.clear();
lcd.setCursor(7,0);
lcd.print("HATRA");
lcd.setCursor(0,1);
lcd.print("FOKOZAT: 1");
break;

case 3:
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
lcd.clear();
lcd.setCursor(7,0);
lcd.print("HATRA");
lcd.setCursor(0,1);
lcd.print("FOKOZAT: 2");
break;

case 2:
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
lcd.clear();
lcd.setCursor(7,0);
lcd.print("HATRA");
lcd.setCursor(0,1);
lcd.print("FOKOZAT: 3");
break;

case 1:
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
lcd.clear();
lcd.setCursor(7,0);
lcd.print("URES");
lcd.setCursor(0,1);
lcd.print("FOKOZAT: 4");
break;

case 6:
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
lcd.clear();
lcd.setCursor(7,0);
lcd.print("ELORRE");
lcd.setCursor(0,1);
lcd.print("FOKOZAT: 1");
break;

case 7:

digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
lcd.clear();
lcd.setCursor(7,0);
lcd.print("ELORRE");
lcd.setCursor(0,1);
lcd.print("FOKOZAT: 2");
break;

case 8:
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
lcd.clear();
lcd.setCursor(7,0);
lcd.print("ELORRE");
lcd.setCursor(0,1);
lcd.print("FOKOZAT: 3");
break;

case 9:

digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
lcd.clear();
lcd.setCursor(7,0);
lcd.print("ELORRE");
lcd.setCursor(0,1);
lcd.print("FOKOZAT: 4");
break;}
}

Avatar
csegebiga
Chipgyilok
Hozzászólások: 284
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Arduino programozás segítség

HozzászólásSzerző: csegebiga » 2018. május 16. szerda, 20:43

Tényleg elpazaroltál rengeteg lábat az lcd-re. nézz utána az iic-ld adapternek pl itt a webshopban. tápok + két D vezetékkel kész az lcd.

És szerinted a programod így helyesen működik?
mert szerintem
- a case1 nagyon el van másolva
azt írja, üres fokozat4, és itt a hátra fokozat4 kéne. de a vezérlés az előre fokozat4 vezérlése.

- mi értelme van a delay(3)nak?
- és a delay (100)-nak?
- a féket nem írja ki, csak a kéziféket. ez direkt van így?

- kiíratod az lcd fejlécet, majd szinte azonnal letörlöd, utána pozícióba írsz, mintha ott lenne az előbbi kiírás, majd kiírod az egész második sort.
elég lenne egyszer törölni a lcd-t, a loop ciklusban a fejléc kiírása előtt.

- nekem nagyon hiányzik a prell-védelem. azt hogy oldottad meg?

Avatar
csegebiga
Chipgyilok
Hozzászólások: 284
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Arduino programozás segítség

HozzászólásSzerző: csegebiga » 2018. május 16. szerda, 21:28

Kibírja a mechanikád azt, hogy a fékeket elengedve akár egyből négyes sebességgel induljon?
mert most nincs lekezelve a fokozatok üresbe tétele fékezéskor.
gombok=5;

Verjoz
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

HozzászólásSzerző: Verjoz » 2018. május 17. csütörtök, 7:26

A case 1 et masolaskor lett elrontva. Ide tényleg a hátra kiírás jön.
Köszi a kiírások kezelése észreveteleidet ezért jó ha egy nálam okosabb ember nézi àt.
A féket direkt nem iratok ki mert azt a kezelő úgy is tudja hogy nyomja a példát.
A sebességeket ilyenkor még nem akarom kapcsolattartó mert ha csak kismértékű a lassulás akkor ne váltson vissza fokozatot.
Sőt a rendszernek nem az a feladata hogy magától váltson. Ez nem automata váltó. Erőgép ről van szó ezért a mechanika bírja mert a gyártója is így működik.
A delayek:
A 3 As érték azért került bele. Mert a kísérletek során a kapcsoló fülek mechanikàja hosszú utat jár de a belsejében a kontakt csak az utolsó szekcióban zár. Így reagált a leggyorsabban a vezérlő a jelet.
1000 és 100 tesztelve nem volt. Elméletileg az azt csinálna hogy a kézifék behúzva kiírás villog.
A prellen is gondolkodom.... Csak valahogy nem áll össze. Mert nem értem teljesen....
Valahogy nem áll össze a kép hogy is vigyem kódban. A lényege az hogy ha figyelek egy bemenet és azon magas jelet várok ezek teljesülésekor csak akkor lépjen tovább ha bizonyos ideig fenn áll ez az állapot?
Tovabbà van még egyéb hiba is a kódban.
Ha én folyamatosan nyomom a gombot akkor végig pakolja a fokozatokat. Ezt is még meg kell oldanom.
Akkor biztonsági okokból most alkalmazhatatlan,
mert nem figyeli az álló és járó motor állapotát.
Ezért ha figyelmetlen a kezelő és sebesség ben van a kapcsoló valamint a kézifék nincs behúzva és úgy indítja be a motor egyszerre mozgásba jön a gép is.

Verjoz
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

HozzászólásSzerző: Verjoz » 2018. május 17. csütörtök, 8:50

Kijavitottam.
Meg a biztonsági dolgokat is megpróbálta M belevinni.
A gombok változó értéknövelő személyesen a secundumos várakozás szerintem arra jó hogy ha hosszabb an nyomom a gombot ne kapcsoljon végig. De ez csak tipp.

Kód: Egész kijelölése

/*jcb powershift transm. c.s.*/

#include "LiquidCrystal.h"

LiquidCrystal lcd(4,5,6,7,8,9);

byte gombok=5;



void setup() {



lcd.begin(16,2);
pinMode(A0,INPUT);//gomb+
pinMode(A1,INPUT);//gomb-
pinMode(A2,INPUT);//uzemi fek
pinMode(A3,INPUT);//kezi fek
pinMode(A4,INPUT);//motor uzem jel

pinMode(2,OUTPUT);//elorre irany
pinMode(3,OUTPUT);//hatra irany
pinMode(10,OUTPUT);//2 es fokozat
pinMode(11,OUTPUT);//3 as fokozat
pinMode(12,OUTPUT);//4 es fokozat
 
}

void loop() {
if(analogRead(A0)==HIGH){
delay(3);
gombok++;}
if(analogRead(A1)==HIGH){
delay(3);
gombok--;}
if(analogRead(A2)==HIGH){
delay(3);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
}
if(analogRead(A3)==HIGH){
delay(3);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("KEZIFEK BEHUZVA");
delay(1000);
lcd.clear();
delay(100);
}
if(gombok!=5 && analogRead(A4)==LOW){gombok=5;
lcd.setCursor(0,0);
lcd.print("ELINDULASHOZ");
lcd.setCursor(0,1);
lcd.print("NYOMJ FEKET");}
//ide lehet kotni motornak indito megszakitast is
/* pl:if(analogRead(A4)==LOW && analogRead(A2)==HIGH){digitalWite(x,HIGH);*/
//az x pin egy rellet vezerel ami a gepnek az indito jelet szakitja meg
// a motor uzemjelet akar az olajnyomas kapcsolorol is le tudom venni
//ha van olajnyomas akkor megy a motor(elmeletileg) :)

gombok=constrain(gombok,1,9);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("IRANY:");
lcd.setCursor(0,1);
lcd.print("FOKOZAT:");

switch (gombok){
case 5:
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
lcd.setCursor(7,0);
lcd.print("URES");
lcd.setCursor(9,1);
lcd.print("0");
break;

case 4:
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
lcd.setCursor(7,0);
lcd.print("HATRA");
lcd.setCursor(9,1);
lcd.print("1");
break;

case 3:
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
lcd.setCursor(7,0);
lcd.print("HATRA");
lcd.setCursor(9 1);
lcd.print("2");
break;

case 2:
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
lcd.setCursor(7,0);
lcd.print("HATRA");
lcd.setCursor(9,1);
lcd.print("3");
break;

case 1:
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
lcd.setCursor(7,0);
lcd.print("HATRA");
lcd.setCursor(9,1);
lcd.print("4");
break;

case 6:
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
lcd.setCursor(7,0);
lcd.print("ELORRE");
lcd.setCursor(9,1);
lcd.print("1");
break;

case 7:

digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
lcd.setCursor(7,0);
lcd.print("ELORRE");
lcd.setCursor(9,1);
lcd.print("2");
break;

case 8:
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
lcd.setCursor(7,0);
lcd.print("ELORRE");
lcd.setCursor(9,1);
lcd.print("3");
break;

case 9:
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
lcd.setCursor(7,0);
lcd.print("ELORRE");
lcd.setCursor(9,1);
lcd.print("4");
break;}
}

Verjoz
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

HozzászólásSzerző: Verjoz » 2018. május 17. csütörtök, 8:54

A tökömet a Google correktorba!
Azt akartam írni.
Az if eknel ha a gombok++ után egy delay ezer vagy nagyobb értékkel ha tovább is van nyomva a gomb nem lepeget tovább csak ha túlmegy a delayen.
Csak akkor ha gyorsan akarnak fokozatot léptetni az nem működik......

Verjoz
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

HozzászólásSzerző: Verjoz » 2018. május 17. csütörtök, 10:46

Előre is elnézést kérek ha úgy tűnik mintha hangosan gondolom.
Csak a következő villant be.
Magas állapotra csak egyet lépjen a változó erteke.
A gombák nem közvetlenül a változót mahinalom.
Hanem pulseIn el mérek.

Kód: Egész kijelölése

unsigned long gomb1=0;
gomb1=pulseIn(A0,HIGH)
majd feketében
if(gomb1>1)
{gombok++;}

A leírásban a reference az mondja ha nincs idő túllépés akkor alapértelmezetten egy sec.
Akkor lehet hogy ez kellene:

Kód: Egész kijelölése

if(gomb1=1){gombok++;}

De mi van ha én akarok idő túllépést állítani?
Mondjuk fél másodpercet.
Akkor:
gomb1=pulseIn (A0,HIGH,5000);. ??????
Ezt nem értem!
Jól gondolkodom egyáltalán?


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 2 vendég