Hukassa Arduinon tyyppimuunnosten kanssa

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;

char strValue[10];
int index = 0;

void setup() {
myservo.attach(9);
Serial.begin(9600);
}

void loop() {
if(Serial.available() > 0){
ch = Serial.read();
flag = 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;
	}
}

}[/code]

Pikaisen vilkaisun hajatelmat:

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 :stuck_out_tongue:)

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

Kiitti, tuo suurin jako-ongelma selvisi. Muutin i:n floatiksi ni, nyt toimii.

Pitää vielä ihmetellä tuota koodin yleistä siisteyttä ja tehokkuutta…

Suosittelisin mieluummin esim. jakamista 10.0:lla, tällöin jaetaan aina vakio-floatilla, jolloin kääntäjä voi tehdä magiaa.

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.