Težava z IF stavkom

Arduino je pojav za katerega bi težko rekli, da opisuje samo HW ali samo SW, zato mu tu namenajm poseben prostor.

Moderator: tilz0R

Težava z IF stavkom

OdgovorNapisal/-a FilipN » 14 Apr 2018, 22:20

Lep pozdrav!
Začel sem z novim projektom na RC letalu in sicer z napeljavo lučk. Sem že skoraj zaključil vendar se mi je ustavilo pri programu. Težava se mi je pojavila v IF stavku, v katerem bi rad z napetostima (napetosti merim na led switch -u, ki spremeni signal s sprejemnika v različne kombinacije 0 / 5V) primerjal z neko številko npr.: prva napetost mora biti manjša od 0,5V ,druga pa večja od 4,5V. S tem bi rad spreminjal program lučk z daljinca glede na to v katerem delu leta bom. Če mi kdo zna kako pomagati, bom seveda vesel rešitve tega problema. V priponki sem dodal še program, da si ga lahko ogledate.
Priponke
RC_Piper_Cub_J-3.txt
(2.15 KiB) Prenešeno 10 krat
LP Filip
FilipN
 
Prispevkov: 14
Pridružen: 01 Sep 2017, 14:42
Kraj: Vodice 1217
Zahvalil se je: 10 krat
Prejel zahvalo: 0 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 0

Re: Težava z IF stavkom

OdgovorNapisal/-a 1tilen » 14 Apr 2018, 22:32

Glede iz napisanega nevem točno kje je problem...imaš probleme z različnimi napetostmi? Ti v kakšnem primeru kaj deluje kot bi moralo? Nisem pa popolnoma prepričan glede tvojih pretvorb iz ADC podatka v napetost. Načeloma če imaš na ADCju 5 V - torej prebrana vrednost 1023 bo tvoj program to napetost prebral kot 5.2V zaradi faktorja 1.04. Sicer pa glede na to, sta tvoja pogoja zgolj 0.5V in 4.5V v if stavkih primerjaš direktno ADC vrednosti.
Npr:
Koda: Izberi vse
 if((senzor1 < 102 )&& (senzor2 > 921))


Bi pa neglede rekel, da dodaj še dodatne oklepaje za posamezne pogoje, kot sem jaz napisal zgoraj v primeru...pa neglede, če delaš z napetostmi ali direktno ADC vrednostmi.

Lp
----
Tilen - S54B
Uporabniški avatar
1tilen
 
Prispevkov: 131
Pridružen: 18 Jan 2015, 01:12
Kraj: Sežana - JN65WQ
Zahvalil se je: 53 krat
Prejel zahvalo: 71 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 10

Re: Težava z IF stavkom

OdgovorNapisal/-a forest70 » 15 Apr 2018, 00:35

FilipN je napisal/-a:Lep pozdrav!
Začel sem z novim projektom na RC letalu in sicer z napeljavo lučk. Sem že skoraj zaključil vendar se mi je ustavilo pri programu. Težava se mi je pojavila v IF stavku, v katerem bi rad z napetostima (napetosti merim na led switch -u, ki spremeni signal s sprejemnika v različne kombinacije 0 / 5V) primerjal z neko številko npr.: prva napetost mora biti manjša od 0,5V ,druga pa večja od 4,5V. S tem bi rad spreminjal program lučk z daljinca glede na to v katerem delu leta bom. Če mi kdo zna kako pomagati, bom seveda vesel rešitve tega problema. V priponki sem dodal še program, da si ga lahko ogledate.

Koda: Izberi vse
if(napetost1 < 0,5 && napetost2 < 0,5){

Ne uporabljaj vejic za decimalno ampak piko !!!
Tako:
Koda: Izberi vse
if(napetost1 < 0.5 && napetost2 < 0.5){

Poleg tega, po ne potrebnem meritve ki so tipa int, spreminjaš v float, saj lahko primerjaš v int obliki kot ti je predlagal 1tilen.
If you pay in bananas, you got monkeys.
Uporabniški avatar
forest70
 
Prispevkov: 1373
Pridružen: 14 Jan 2015, 01:11
Kraj: Koper
Zahvalil se je: 293 krat
Prejel zahvalo: 296 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 110

Re: Težava z IF stavkom

OdgovorNapisal/-a forest70 » 15 Apr 2018, 00:44

Pa še to:
Koda: Izberi vse
pinMode(A1,INPUT);
pinMode(A2,INPUT);
//.
//.
//.
//.
int senzor1 = analogRead(A1);
int senzor2 = analogRead(A2);

Odloči se, kaj boš počel z A1 in A2 analogno ali digitalno, ker oboje hkrati ne gre.
If you pay in bananas, you got monkeys.
Uporabniški avatar
forest70
 
Prispevkov: 1373
Pridružen: 14 Jan 2015, 01:11
Kraj: Koper
Zahvalil se je: 293 krat
Prejel zahvalo: 296 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 110

Re: Težava z IF stavkom

OdgovorNapisal/-a FilipN » 15 Apr 2018, 12:56

hvala za vse nasvete. najprej sem odpravil napako iz , v . in deluje. hvala še enkrat forest70
LP Filip
FilipN
 
Prispevkov: 14
Pridružen: 01 Sep 2017, 14:42
Kraj: Vodice 1217
Zahvalil se je: 10 krat
Prejel zahvalo: 0 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 0

Re: Težava z IF stavkom

OdgovorNapisal/-a forest70 » 15 Apr 2018, 13:50

FilipN je napisal/-a:hvala za vse nasvete. najprej sem odpravil napako iz , v . in deluje. hvala še enkrat forest70

Pa še to bi ti priporočal:
deklariraj spremenljivke vse na enem mestu!
Koda: Izberi vse
void loop() {
 int senzor1;
 int senzor2;
//Lahko tudi tako:
 int senzor1, senzor2;
float napetost1;
float napetost2;

senzor1 = analogRead(A1);
napetost1 = senzor1 * (5.0 / 1023.0)*1.04;
senzor2 = analogRead(A2);
napetost2 = senzor2 * (5.0 / 1023.0)*1.04;
// itd....
}


Če jih deklariraš na začetku datoteke (ni v funkciji), so to globalne spremenljivke.
Če jih deklariraš v funkciji, so pa lokalne.
Kadar deklariraš spremenljivko in veš, da gre od recimo 0 pa do 65536 (pozitivno) deklariraj tako:
Koda: Izberi vse
unsigned int senzor1;

Kaj sem s tem dobil? Ja to 65533 je pozitivna številka
Če pa je deklarirana kot int pa -3, velika razlika ko primerjaš številke med sabo.
Pri 16 bitni sremenljivki tipa int vse kar je več kot 0x7fff ali decimalno 32766, so negativne številke.
podobno je z char:
unsigned char bbb; //od 0 do 255
char bbb; // od -128 do 127
If you pay in bananas, you got monkeys.
Uporabniški avatar
forest70
 
Prispevkov: 1373
Pridružen: 14 Jan 2015, 01:11
Kraj: Koper
Zahvalil se je: 293 krat
Prejel zahvalo: 296 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 110

Re: Težava z IF stavkom

OdgovorNapisal/-a tilz0R » 15 Apr 2018, 22:40

forest70 je napisal/-a:Kadar deklariraš spremenljivko in veš, da gre od recimo 0 pa do 65536 (pozitivno) deklariraj tako:
Koda: Izberi vse
unsigned int senzor1;

Kaj sem s tem dobil? Ja to 65533 je pozitivna številka
Če pa je deklarirana kot int pa -3, velika razlika ko primerjaš številke med sabo.
Pri 16 bitni sremenljivki tipa int vse kar je več kot 0x7fff ali decimalno 32766, so negativne številke.
podobno je z char:
unsigned char bbb; //od 0 do 255
char bbb; // od -128 do 127


Nikoli, ampak res nikoli, ne deklariraš spremenljivke z "int", "unsigned int" ali še slabše, "char".

V večini embedded prevajalnikov "char" NI signed in če narediš char a; ima ta a vrednosti od 0 do 255. Poleg tega NI nujno, da je char 8-biten, lahko je tudi 16.
Ker ima tudi int različne vrednosti in če bi rad kodo, ki bo delala na Arduino UNO in Arduino DUE isto (kar pričakuješ glede na Arduino), uporabljaš stdint.h knjižnico.

Koda: Izberi vse
uint16_t senzor
int8_t bbb;
signed char bbb; //To je tudi opcija.
"Words come easy, when they're true!"
Robbie Williams, Gary Barlow
Moj nickname je tilz[NULA]R.
Uporabniški avatar
tilz0R
 
Prispevkov: 1324
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 179 krat
Prejel zahvalo: 322 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Težava z IF stavkom

OdgovorNapisal/-a VolkD » 15 Apr 2018, 23:44

Ja, večina ljudi se ob programiranju enega mikrokontrolerja fokusira na rezultat. Torej na to, da zadeva deluje. Mnogo njih, hobisti mislim, da nikoli, pa niti pomisli ne na to, da bi fokus mogoče lahko razširili na to, da stvar dela tudi še na kakem drugem mikrokontrolerju.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 24432
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 4524 krat
Prejel zahvalo: 3335 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255


Vrni se na Arduino

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost