Упрощение программы
- Войдите на сайт для отправки комментариев
Ср, 12/03/2014 - 20:47
Здраствуйте, помогите пожалуста. Можно ли как нибуть упростить программу.
//motorПравый
int dir1PinA = 8; //Серый
int dir2PinA = 7; //Белый
int speedA = 3;
//motorЛевый
int dir1PinB = 4; //Чёрный
int dir2PinB = 2; //Коричневый
int speedB = 5;
//Sensors//
int outputPin = 6;//подключил к ШИМ Ультрозвуковой датчик
int inputPin = 9;// Echo
int distance;
//Random//
int TimeDelay = 0;
int napravlenie = 0;
int povorot = 0;
void setup(){
Serial.begin(9600);
pinMode(dir1PinA, OUTPUT);
pinMode(dir2PinA, OUTPUT);
pinMode(dir1PinB, OUTPUT);
pinMode(dir2PinB, OUTPUT);
pinMode(inputPin, INPUT); //УЗ-датчик
pinMode(outputPin, OUTPUT); //УЗ-датчик
}
void loop(){
//sensor//
digitalWrite(outputPin, LOW);
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);
delayMicroseconds(10);
digitalWrite(outputPin, LOW);
int distance = pulseIn(inputPin, HIGH);
distance= distance/58;
Serial.print(distance);
Serial.print("cm");
Serial.println(" ");
// действи на значение sensor
if(distance < 25){ //едем назад
digitalWrite(dir1PinA,HIGH);
digitalWrite(dir2PinA,LOW);
digitalWrite(dir1PinB,HIGH);
digitalWrite(dir2PinB,LOW);
analogWrite(speedA, 100);
analogWrite(speedB, 100);
TimeDelay=random(500, 3500);
delay(TimeDelay);
} else if(distance > 25){ //иначе едем куда хотим
napravlenie=random(1, 4);
if(napravlenie == 1){ //поворачиваем направо
digitalWrite(dir1PinA, HIGH);
digitalWrite(dir2PinA, LOW);
digitalWrite(dir1PinB, LOW);
digitalWrite(dir2PinB, HIGH);
analogWrite(speedA, 100);
analogWrite(speedB, 100);
TimeDelay=random(500, 3500);
delay(TimeDelay);
} else if(napravlenie == 2){ //поворачиваем налево
digitalWrite(dir1PinA,LOW);
digitalWrite(dir2PinA,HIGH);
digitalWrite(dir1PinB,HIGH);
digitalWrite(dir2PinB,LOW);
analogWrite(speedA, 100);
analogWrite(speedB, 100);
TimeDelay=random(500, 3500);
delay(TimeDelay);
} else if(napravlenie == 3){ //едем Вперед
digitalWrite(dir1PinA,LOW);
digitalWrite(dir2PinA,HIGH);
digitalWrite(dir1PinB,LOW);
digitalWrite(dir2PinB,HIGH);
analogWrite(speedA, 100);
analogWrite(speedB, 100);
TimeDelay=random(500, 3500);
delay(TimeDelay);
} else { //стоп
digitalWrite(dir1PinA,LOW);
digitalWrite(dir2PinA,LOW);
digitalWrite(dir1PinB,LOW);
digitalWrite(dir2PinB,LOW);
analogWrite(speedA, 0);
analogWrite(speedB, 0);
TimeDelay=random(500, 3500);
delay(TimeDelay);
}
if(napravlenie == 0) {
napravlenie=random(1, 4);
} else {
napravlenie = 0;
}
}
}
Можно. Зачем? http://ru.wikipedia.org/wiki/Рефакторинг
вижу много схожих последовательностей, немножко никогда неиспользуемых строк (12, 16, 89-93), избыточность типов переменных.
//motorПравый #define dir1PinA 8 //Серый #define dir2PinA 7 //Белый #define speedA 3 //motorЛевый #define dir1PinB 4 //Чёрный #define dir2PinB 2 //Коричневый #define speedB 5 //Sensors// #define outputPin 6 //подключил к ШИМ Ультрозвуковой датчик #define inputPin 9 //Echo //Random// #define TimeDelay random(500, 3500) void setup() { Serial.begin(9600); pinMode(dir1PinA, OUTPUT); pinMode(dir2PinA, OUTPUT); pinMode(dir1PinB, OUTPUT); pinMode(dir2PinB, OUTPUT); pinMode(inputPin, INPUT); //УЗ-датчик pinMode(outputPin, OUTPUT); //УЗ-датчик } void loop() { //sensor// digitalWrite(outputPin, LOW); delayMicroseconds(2); digitalWrite(outputPin, HIGH); delayMicroseconds(10); digitalWrite(outputPin, LOW); int distance = (pulseIn(inputPin, HIGH))/58; Serial.print(distance); Serial.print(" cm"); Serial.println(" "); // действи на значение sensor if(distance < 25) travel(HIGH,LOW,HIGH,LOW,100); //едем назад else { //иначе едем куда хотим byte napravlenie = random(1, 4); switch (napravlenie) { case 1: travel(HIGH,LOW,LOW,HIGH,100); //поворачиваем направо case 2: travel(LOW,HIGH,HIGH,LOW,100); //поворачиваем налево case 3: travel(LOW,HIGH,LOW,HIGH,100); //едем Вперед case 4: travel(LOW,LOW,LOW,LOW,0); //стоп } } } void travel(bool zadRight, bool perRight, bool zadLeft, bool perLeft, byte speedRL) { digitalWrite(dir1PinA, zadRight); digitalWrite(dir2PinA, perRight); digitalWrite(dir1PinB, zadLeft); digitalWrite(dir2PinB, perLeft); analogWrite(speedA, speedRL); analogWrite(speedB, speedRL); delay(TimeDelay); }работает все классно, спасибо большое
а работать будет точно так же, потому что код после компилятора не изменился, изменилось только его визуальное представление :)
P.S. условие "case 4:..." никогда не сработает, потому что согласно описанию: "random(min, max) - Случайное число между min и max-1."
можно как нибуть добавить многозадачность для измерения растояния УЗ-датчиком спомощью LeOS
подробно как он работает написано здесь http://cyber-place.ru/showthread.php?t=358
Не совсем многозадачность, но "как бы параллельное" выполнение нескольких повторяющихся с различной периодичностью действий обеспечивает - тыц.