Kokeilin tehdä systeemiä, jossa arduino kääntää servoa kymmenen eri asennon välillä. Asentotieto saadaan bluetoothilla serial datana.
Olen kuitenkin ihan hukassa tyyppimuunnosten kanssa. Ei tuo sarjadata tulee ilmeisesti stringinä, enkä saanut sitä numeeriseksi kuin tuollaisella kauhealla switch-casella.
Sitten yritän laskea tuota arvoa mihin servo tulisi kääntää. Se saa kuitenkin arvokseen aina 50. Ilmeisesti tuo jakolasku kusee jälleen intin floatiksi tai jotain…
Osaisiko joku jeesata miten koodista saisi siistin, mutta ennen kaikkea toimivan?
[code]#
include <Servo.h>
Servo myservo;
int ch;
int i;
int flag = 0;
int minpos = 50;
int maxpos = 110;
int pos = 0;
switch(ch) {
case '1':
i = 1;
break;
case '2':
i = 2;
break;
case '3':
i = 3;
break;
case '4':
i = 4;
break;
case '5':
i = 5;
break;
case '6':
i = 6;
break;
case '7':
i = 7;
break;
case '8':
i = 8;
break;
case '9':
i = 9;
break;
case '0':
i = 10;
break;
}
if (ch >= '1' && ch <= '9') {
pos = ((maxpos-minpos)*(i/10))+minpos;
myservo.write(pos);
if(flag == 0){
Serial.println("Servo position: ");
Serial.println(pos);
flag = 1;
}
}
Asetat servon arvoa joka loopin kierroksella, etkä vain silloin kun on uutta dataa. Eli vähän siirtelet aaltosulkuja… Tällöin poistuu myös tuon flag-muuttujan asettamisen tarve, servon asentoa säädetään vain, kun on tarvetta sitä muuttaa (ja samalla lähetellään myös serialiin dataa).
Myöskin muuttujan i voisi alustaa esim. arvoon -1 sekä alussa että sarjaporttidataa vastaanottaessa. Tällöin voisit vertailla integer-muuttujaan (käytännössä “if (i != -1) { aseta servo }”). char-tyypin muuttujan vertailu muulla kuin == on aina epävarmaa (ja myöskin hyvin pelottavaa )
Varsinainen ongelma lienee tässä: Lisäksi jos jaat intin intillä, tulokseksi tulee int. Eli kohta “(i/10)” on aina 0 (tai 1).
//Edit: Sinänsä tuossa switchin käytössä vertailuun ei ole mitään pahaa, toki kannattaa tutustua esim. tähän ratkaisuun: stackoverflow.com/a/868508
char fromSerial = lue();
if(fromSerial <0x30||fromSerial >0x39){
virhe();
}else{
fromSerial -= 0x30;
//bla bla bla
}
Tuon jälkeen fromSerialissa ‘0’ vastaa 0 arvoa ja ‘9’ 9 arvoa. Jos tykkää, että käyttää tuhannen kellojaksoa floatin kanssa leikkimiseen niin ihan vapaasti.