Упрощение программы

RubanZ
Offline
Зарегистрирован: 12.03.2014

Здраствуйте, помогите пожалуста. Можно ли как нибуть упростить программу.
 

//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;
    }
} 
} 

 

toc
Offline
Зарегистрирован: 09.02.2013
Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

вижу много схожих последовательностей, немножко никогда неиспользуемых строк (12, 16, 89-93), избыточность типов переменных.

Исходный код: Размер скетча в двоичном коде: 6 668 байт (из 258 048 байт максимум)
После оптимизации: Размер скетча в двоичном коде: 6 362 байт (из 258 048 байт максимум)
//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. если все-таки остаться на связке if...else, то экономим еще 64 байта, но теряем в читабельности кода.
 
 
 
RubanZ
Offline
Зарегистрирован: 12.03.2014

работает все классно, спасибо большое

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а работать будет точно так же, потому что код после компилятора не изменился, изменилось только его визуальное представление :)

P.S. условие "case 4:..." никогда не сработает, потому что согласно описанию: "random(min, max) Случайное число между min и max-1."

RubanZ
Offline
Зарегистрирован: 12.03.2014

можно как нибуть добавить многозадачность для измерения растояния УЗ-датчиком спомощью LeOS

подробно как он работает написано здесь http://cyber-place.ru/showthread.php?t=358

step962
Offline
Зарегистрирован: 23.05.2011

Не совсем многозадачность, но "как бы параллельное" выполнение нескольких повторяющихся с различной периодичностью действий обеспечивает - тыц.