Sewuraavassa esimerkissä ohjelman toiminta on jaettu osiin, jotta ohjelman luettavuus olisi parempi. Yleensä eri loogiset toiminnot kannattaa jakaa omiin funktioihinsa.
Code Block |
---|
#pragma config(Sensor, S4, RGB, sensorCOLORFULL) #pragma config(Sensor, S2, kosketus1, sensorTouch) //*!!Code automatically generated by 'ROBOTC' configuration wizard !!*// //esitellaan funktio, jolla kysellaan halusta ajella robotilla int OnkoRobottiStartattuKosketusanturista(); void RobotinAjo(); //paaohjelma, jonka nimi on aina main task main() { ClearTimer(T1); while(1)//ikuinen silmukka alkaa tasta { //wait1Msec(1);//odotellaan vahan aikaa, talla ei taida olla mitaan merkitysta if(1==OnkoRobottiStartattuKosketusanturista())//testataan koko ajan kayttajan halua ajaa robottia { RobotinAjo(); } else//tanne tullaan kun flipflop==0 ja pysaytetaan robotti, eli jos painetaan toisen kerran kosketusanturia { motor[motorC] = 0; motor[motorB] = 0; } }//ikuinen silmukka loppuu tahan } void RobotinAjo() { static bool viimeksiAjettiinValkoisellaAlueella; static bool viimeksiAjettiinMustallaAlueella; static int askel;//10 = aja suoraan, 21 = kaanny teipin paassa, staattiset muuttujat alustuvat ohjelman käynnistyessä automaattisesti nolliksi //siksi askeleet alkavat nollasta eivätkä ykkosesta if(askel==0) { if(SensorValue(RGB)== 6) //WHITECOLOR) valkoinen havaittu, yritetaan takaisin mustalle { if(viimeksiAjettiinMustallaAlueella==true) { ClearTimer(T1); } viimeksiAjettiinMustallaAlueella=false;//nollataan toisen suunnan laskuri viimeksiAjettiinValkoisellaAlueella=true; motor[motorC] = 0; motor[motorB] = 80; } if(SensorValue(RGB) == 1) //BLACKCOLOR) musta havaittu, yritetaan takaisin valkoiselle { if(viimeksiAjettiinValkoisellaAlueella==true) { ClearTimer(T1); } viimeksiAjettiinValkoisellaAlueella=false;//nollataan toisen suunnan laskuri viimeksiAjettiinMustallaAlueella=true; motor[motorC] = 80; motor[motorB] = 0; } //testataan: paattyiko teippi eli jos maaraaikaan mennessa ei loytynyt teipin paa niin vaihdetaan askeleelle kaksi eli kaannytaan takaisin if(time1[T1]>500) { viimeksiAjettiinValkoisellaAlueella=false; viimeksiAjettiinMustallaAlueella=false; askel=1; motor[motorC] = -40; motor[motorB] = 40;//moottori peruuttaa } } if(askel==1)//kaannytaan paikoillaan ympari { if(SensorValue(RGB) == 1) //BLACKCOLOR) tultiinko takaisin mustalle alueella { askel=0;//kun musta teippi loytyi niin vaihdetaan takaisin askeleelle yksi ClearTimer(T1); // nollataan ajastin seuraavaa suoraan ajoa varten } } } //Talla funktiolla tutkitqaan takimmaisen kosketusanturin toimintaa //joka toisella panalluksella funktio palauttaa nollan ja robotin pitaisi pysahtya int OnkoRobottiStartattuKosketusanturista() { static int flipflop;//esitellaan muuttuja staattisena, jotta se muistaa edellisen kerran tilansa static int flipAskel;//0=odotellaan napin painallusta 1=nappi painettu alas 2=nappi paastetty ylos 3=nappi toisen kerran alas int kosketus2Value=0; kosketus2Value = SensorValue(kosketus1); if(kosketus2Value==1&&flipAskel==0)//eka painallus alas { flipflop=1; flipAskel=1; } if(kosketus2Value==0&&flipflop==1)//eka paasto { flipAskel=2; } if(kosketus2Value==1&&flipAskel==2)//toka kerta alas { flipflop=0; flipAskel=3; } if(kosketus2Value==0&&flipAskel==3)//toka kerta ylos { flipAskel=0; } return flipflop; } |