Вопрос по программе(Оператор If)

Hobigo
Offline
Зарегистрирован: 14.01.2013
#include <Servo.h> 
#include <Ultrasonic.h>
 #include <LiquidCrystal.h>
 LiquidCrystal lcd(10, 9, 3, 2, 1, 0);
  const int motor1APin = 7;   // H-bridge leg 1 
  const int motor2APin = 6;    // H-bridge leg 2 
  const int motor3APin = 5;   // H-bridge leg 1 
  const int motor4APin = 4;    // H-bridge leg 2 
  const int enablePin = 8;   // H-bridge enable pin
 
  const int Trig = 12; //Ultrasonic
  const int Echo = 13;
  
  Servo myservo;
  int knopka1 = A2;
int val=0;


  void setup()
  {
    pinMode(knopka1, INPUT);
    pinMode( enablePin, OUTPUT);
    pinMode( motor1APin, OUTPUT);
    pinMode( motor2APin, OUTPUT);
    pinMode( motor3APin, OUTPUT);
    pinMode( motor4APin, OUTPUT);
    pinMode(Trig, OUTPUT);
    pinMode(Echo, INPUT);
  digitalWrite(enablePin, HIGH);
    
    myservo.attach(11);
    lcd.begin(16, 2);
 lcd.print("Robot v.2.0");

    
  }
   unsigned int time_us=0;
  unsigned int distance_sm=0;
  unsigned int circle=0;
  unsigned int dist_f=0;
  unsigned int dist_l=0;
  unsigned int dist_r=0;
  unsigned int dist_45=0;
  unsigned int dist_135=0;
  unsigned int t=15;  
  


  void loop() 
{
    lcd.setCursor(0, 1);
 lcd.print("Programma 1");
     
  
   if (circle==0)
   {
    myservo.write(0);  
    dist_r=sonar();
    motion('w',0,45,t);
    dist_45=sonar();
    motion('w',45,90,t);
    dist_f=sonar();
    motion('w',90,135,t);
    dist_135=sonar();
    motion('w',135,180,t);
    dist_l=sonar();
   }
   circle++; 
   
   if(dist_f>=25)
   {
    a:
    motion('f',180,135,t);
    dist_135=sonar();
    front_motion(t);
    motion('f',135,90,t);  
    dist_f=sonar();
    front_motion(t);
    motion('f',90,45,t);
    dist_45=sonar();
    front_motion(t);
    motion('f',45,0,t);
    dist_r=sonar();
    front_motion(t);
    motion('f',0,45,t);
    dist_45=sonar();
    front_motion(t);
    motion('f',45,90,t);
    dist_f=sonar();
    front_motion(t);
    motion('f',90,135,t);
    dist_135=sonar();
    front_motion(t);
    motion('f',135,180,t);
    dist_l=sonar();
    front_motion(t);
    if (dist_f>=25)
    goto a;
    }
    
   else
  {
   if(dist_f<5)
   {
    motion_back(t);
    dist_f=sonar();
   } 

   if(dist_l>=dist_r || dist_135>dist_r)
   {
    motion('l',180,90,t);
    dist_f=sonar();
   }
   if(dist_l<dist_r)
   {
    motion('r',180,90,t);
    dist_f=sonar();
   }
  } 
   
 }
    
    
  int sonar()
  {
    digitalWrite(Trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(Trig, LOW);
    time_us=pulseIn(Echo, HIGH);
    distance_sm=time_us/58;
    return distance_sm;
  }  
     
    
  void forward ()
  {
    digitalWrite(motor1APin, HIGH);
    digitalWrite(motor2APin, LOW);
    digitalWrite(motor3APin, HIGH);
    digitalWrite(motor4APin, LOW);
  }
  
   void back ()
  {
    digitalWrite(motor1APin, LOW);
    digitalWrite(motor2APin, HIGH);
    digitalWrite(motor3APin, LOW);
    digitalWrite(motor4APin, HIGH);
  }
  
   void right ()
  {
    digitalWrite(motor1APin, LOW);
    digitalWrite(motor2APin, HIGH);
    digitalWrite(motor3APin, HIGH);
    digitalWrite(motor4APin, LOW);
  }
  
   void left ()
  {
    digitalWrite(motor1APin, HIGH);
    digitalWrite(motor2APin, LOW);
    digitalWrite(motor3APin, LOW);
    digitalWrite(motor4APin, HIGH);
  }
  
  void wait()
 {
  digitalWrite(motor1APin, LOW); 
  digitalWrite(motor2APin, LOW); 
  digitalWrite(motor3APin, LOW); 
  digitalWrite(motor4APin, LOW); 
 }
 
 void motion (char dimention, int prev_angle, int next_angle, int time)
 {
   int a;
   if(next_angle>=prev_angle)
   a=15;
   else
   a=-15; 
   
   if (dimention=='f')
    { 
     int i=prev_angle;
     while( i!=next_angle)
     { 
      i+=a;
      myservo.write(i);
      forward();
      delay(time);
     }
    }
    if (dimention=='l')
    { 
     int i=prev_angle;
     while( i!=next_angle)
     { 
      i+=a;
      myservo.write(i);
      left();
      delay(time);
     }
    }
    if (dimention=='r')
    { 
     int i=prev_angle;
     while( i!=next_angle )
     { 
      i+=a;
      myservo.write(i);
      right();
      delay(time);
     }
    }
    if (dimention=='b')
    { 
     int i=prev_angle;
     while( i!=next_angle )
     { 
      i+=a;
      myservo.write(i);
      back();
      delay(time);
     }
    }
    if (dimention=='w')
    {
     int i=prev_angle; 
     while( i!=next_angle )
     { 
       i+=a;
       myservo.write(i);
       wait();
       delay(time);
      }
    }
 
 }
 
void front_motion( int time )
{
  if(dist_45<=9)
  {
   left();
   delay(3*time);
  }
  if(dist_135<=9)
  {
    right();
    delay(3*time);
  } 
}

void motion_back( int time )
{
  motion('b',180,90,2*time);
   if(dist_l>=dist_r)
   {
     do
      {
       left();
       delay(time);
       dist_f=sonar();
       }while(dist_f<=20);
     } 
     
    if(dist_l<dist_r)
    {
     do
      {
       right();
       delay(time);
       dist_f=sonar();
      }while(dist_f<=20); 
}
}

   

Вот имеется программа. Написана для робота, все отлично работает и функционирует. Мне надо все что находитcя в цикле VOID LOOP() выполнялось при нажатии кнопки. Я заключаю все это в оператор IF и ничего не работает. Программа перестает понимать что такое sonar, front motion и все такие же функции. Помогите разобраться. Заранее спасибо!

vvadim
Offline
Зарегистрирован: 23.05.2012

1. http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

2.

#define button  2   
int inputMode = 1;

void setup() {
  pinMode(button, INPUT); 
}

void loop() {
   if(inputMode) {
  ваш код
}
if(digitalRead(button)==HIGH) inputMode=0;
if(digitalRead(button)==LOW) inputMode=1;
}

 

Hobigo
Offline
Зарегистрирован: 14.01.2013

 

Спасибо за быстрый ответ! 

Я попробовал вашу структуру программы, все равно вылетают те же самые ошибки. Есть еще какие нибудь предложения?

Hobigo
Offline
Зарегистрирован: 14.01.2013

Вот какие ошибки выскакивают.

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

гдето } не поставили - вот все и съехало. Используйте редактор который подсвечивает скобки например Notepad++

Посмотрел - куча пробелов в именах функций.... вот вроде исправил

#include <Servo.h> 
#include <Ultrasonic.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(10, 9, 3, 2, 1, 0);
const int motor1APin = 7;   // H-bridge leg 1 
const int motor2APin = 6;    // H-bridge leg 2 
const int motor3APin = 5;   // H-bridge leg 1 
const int motor4APin = 4;    // H-bridge leg 2 
const int enablePin = 8;   // H-bridge enable pin

const int Trig = 12; //Ultrasonic
const int Echo = 13;

Servo myservo;
int knopka1 = A2;
int val=0;
unsigned int time_us=0;
unsigned int distance_sm=0;
unsigned int circle=0;
unsigned int dist_f=0;
unsigned int dist_l=0;
unsigned int dist_r=0;
unsigned int dist_45=0;
unsigned int dist_135=0;
unsigned int t=15;


void setup(){
	pinMode(knopka1, INPUT);
	pinMode( enablePin, OUTPUT);
	pinMode( motor1APin, OUTPUT);
	pinMode( motor2APin, OUTPUT);
	pinMode( motor3APin, OUTPUT);
	pinMode( motor4APin, OUTPUT);
	pinMode(Trig, OUTPUT);
	pinMode(Echo, INPUT);
	digitalWrite(enablePin, HIGH);
	
	myservo.attach(11);
	lcd.begin(16, 2);
	lcd.print("Robot v.2.0");
	
}

void loop(){
	lcd.setCursor(0, 1);
	lcd.print("Programma 1");
	
	if (circle==0){
		myservo.write(0);  
		dist_r=sonar();
		motion('w',0,45,t);
		dist_45=sonar();
		motion('w',45,90,t);
		dist_f=sonar();
		motion('w',90,135,t);
		dist_135=sonar();
		motion('w',135,180,t);
		dist_l=sonar();
	}
	circle++; 
	
	if(dist_f>=25){
		a:
		motion('f',180,135,t);
		dist_135=sonar();
		front_motion(t);
		motion('f',135,90,t);  
		dist_f=sonar();
		front_motion(t);
		motion('f',90,45,t);
		dist_45=sonar();
		front_motion(t);
		motion('f',45,0,t);
		dist_r=sonar();
		front_motion(t);
		motion('f',0,45,t);
		dist_45=sonar();
		front_motion(t);
		motion('f',45,90,t);
		dist_f=sonar();
		front_motion(t);
		motion('f',90,135,t);
		dist_135=sonar();
		front_motion(t);
		motion('f',135,180,t);
		dist_l=sonar();
		front_motion(t);
		if (dist_f>=25)
			goto a;
	}else{
		if(dist_f<5){
			motion_back(t);
			dist_f=sonar();
		} 
		if(dist_l>=dist_r || dist_135>dist_r){
			motion('l',180,90,t);
			dist_f=sonar();
		}
		if(dist_l<dist_r){
			motion('r',180,90,t);
			dist_f=sonar();
		}
	} 
}

int sonar(){
	digitalWrite(Trig, HIGH);
	delayMicroseconds(10);
	digitalWrite(Trig, LOW);
	time_us=pulseIn(Echo, HIGH);
	distance_sm=time_us/58;
	return distance_sm;
}

void forward(){
	digitalWrite(motor1APin, HIGH);
	digitalWrite(motor2APin, LOW);
	digitalWrite(motor3APin, HIGH);
	digitalWrite(motor4APin, LOW);
}

void back(){
	digitalWrite(motor1APin, LOW);
	digitalWrite(motor2APin, HIGH);
	digitalWrite(motor3APin, LOW);
	digitalWrite(motor4APin, HIGH);
}

void right(){
	digitalWrite(motor1APin, LOW);
	digitalWrite(motor2APin, HIGH);
	digitalWrite(motor3APin, HIGH);
	digitalWrite(motor4APin, LOW);
}

void left(){
	digitalWrite(motor1APin, HIGH);
	digitalWrite(motor2APin, LOW);
	digitalWrite(motor3APin, LOW);
	digitalWrite(motor4APin, HIGH);
}

void wait(){
	digitalWrite(motor1APin, LOW); 
	digitalWrite(motor2APin, LOW); 
	digitalWrite(motor3APin, LOW); 
	digitalWrite(motor4APin, LOW); 
}

void motion(char dimention, int prev_angle, int next_angle, int time){
	int a;
	if(next_angle>=prev_angle)
		a=15;
	else
		a=-15; 
	
	if (dimention=='f'){ 
		int i=prev_angle;
		while( i!=next_angle){ 
			i+=a;
			myservo.write(i);
			forward();
			delay(time);
		}
	}
	if (dimention=='l'){ 
		int i=prev_angle;
		while( i!=next_angle){ 
			i+=a;
			myservo.write(i);
			left();
			delay(time);
		}
	}
	if (dimention=='r'){ 
		int i=prev_angle;
		while( i!=next_angle ){ 
			i+=a;
			myservo.write(i);
			right();
			delay(time);
		}
	}
	if (dimention=='b'){ 
		int i=prev_angle;
		while( i!=next_angle ){ 
			i+=a;
			myservo.write(i);
			back();
			delay(time);
		}
	}
	if (dimention=='w'){
		int i=prev_angle; 
		while( i!=next_angle ){ 
			i+=a;
			myservo.write(i);
			wait();
			delay(time);
		}
	}
}

void front_motion(int time){
	if(dist_45<=9){
		left();
		delay(3*time);
	}
	if(dist_135<=9){
		right();
		delay(3*time);
	}
}

void motion_back(int time){
	motion('b',180,90,2*time);
	if(dist_l>=dist_r){
		do{
			left();
			delay(time);
			dist_f=sonar();
		}while(dist_f<=20);
	} 
	if(dist_l<dist_r){
		do{
			right();
			delay(time);
			dist_f=sonar();
		}while(dist_f<=20); 
	}
}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

Ну я же не корректировал вашу программу, я просто идею озвучил.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

vvadim пишет:

Ну я же не корректировал вашу программу, я просто идею озвучил.

а вы коварный... немогли переработать его программу? как же так? что за люди нынче пошли.. ты им вопрос, а они тебе только намеки и идеи в ответ, заместо того что бы написать для тебя уже рабочий код..

сволочи какие, а не люди.. гы гы

Клапауций
Offline
Зарегистрирован: 10.02.2013

я бы просто тумблер на питание халабуды поставил - зачем такие косяки с ифами из-за одной кнопки?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций пишет:

я бы просто тумблер на питание халабуды поставил - зачем такие косяки с ифами из-за одной кнопки?

и полчаса ждать пока оно загрузится? это не наш вариант :)

Клапауций
Offline
Зарегистрирован: 10.02.2013

Puhlyaviy пишет:

и полчаса ждать пока оно загрузится? это не наш вариант :)

ускорь свою дуино - сотри загрузчик!

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций пишет:

ускорь свою дуино - сотри загрузчик!

в моей версии это технически не возможно.. оно там живет на уровне изготовления чипа :)

Клапауций
Offline
Зарегистрирован: 10.02.2013

Puhlyaviy пишет:

в моей версии это технически не возможно.. оно там живет на уровне изготовления чипа :)

это в какой это из атмел нельзя отключить загрузочную область?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций пишет:

это в какой это из атмел нельзя отключить загрузочную область?

из которой делают DUE

Hobigo
Offline
Зарегистрирован: 14.01.2013

Нет, я не хотел чтобы вы мне код редактировали, хотел просто помощи, хотяя.... если вы не против то тогда можно))

Проверил все скобки - все правильно. Я не спец в программировании, но мне кажется что проблемма не  в правильности написании программы а просто в неполадках с самими функциями и операторами. Пните в ту сторону, где можно почитать про другие алгоритмы опроса кнопок, может это можно как-нибудь сделать в void setup() а все основные алгоритмы будут в loop(). Вообщем гуру ардуины, помощь все еще требуется)

Клапауций
Offline
Зарегистрирован: 10.02.2013

Hobigo пишет:

Нет, я не хотел чтобы вы мне код редактировали, хотел просто помощи, хотяя.... если вы не против то тогда можно))

Проверил все скобки - все правильно. Я не спец в программировании, но мне кажется что проблемма не  в правильности написании программы а просто в неполадках с самими функциями и операторами. Пните в ту сторону, где можно почитать про другие алгоритмы опроса кнопок, может это можно как-нибудь сделать в void setup() а все основные алгоритмы будут в loop(). Вообщем гуру ардуины, помощь все еще требуется)

void setup() - выполняется один раз и переходит в цикл void loop()

алгоритм опроса кнопок - digitalRead()

вывод - для постоянного опроса кнопок нужно пользовать void loop()

*исходя из выше сказанного думаем над алгоритмом работы девайса - просто словами опишите, что должно происходить, не ломая логику причинноследсвенных связей.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Hobigo пишет:

Проверил все скобки - все правильно. Я не спец в программировании, но мне кажется что проблемма не  в правильности написании программы а просто в неполадках с самими функциями и операторами. 

Во во, я согласен про неполадки с оператором.. только это неполадки с оператором который в кресле сидит :)

со скобками все правильно а глупый интерпретатор все равно на них ругается? вот же ж котина.

Клапауций
Offline
Зарегистрирован: 10.02.2013

Puhlyaviy пишет:

Во во, я согласен про неполадки с оператором.. только это неполадки с оператором который в кресле сидит :)

со скобками все правильно а глупый интерпретатор все равно на них ругается? вот же ж котина.

я щитаю, что энто происки путинской гэбни - долгоиграющий проект, вышедший на финишную прямую, по облваниванию населения.

*почему вся водка названиями на *ff?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций пишет:

*почему вся водка названиями на *ff?

гыыы напомнил один анекдот, переводить лень. в принципе и так понятно

Teacher is explaining biology to her 4th grade students. She says, "Human beings are the only animals that stutter."
A little girl raises her hand and says, "I had a kitty-cat who stuttered."
The teacher, knowing how precious some of these stories could become, asked the girl to describe the incident.
"Well," the little girl began, "I was in the back yard with my kitty and the rottweiler that lives next door got a running start and before we knew it, he jumped over the fence into our yard!"
That must've been scary," says the teacher.
"It sure was," says the little girl. "My kitty raised his back, went 'Fffff, Fffff, Fffff'"
"And before he could say 'Fuck!' the rottweiler ate him!"
Hobigo
Offline
Зарегистрирован: 14.01.2013

И без вас разабрался господа умники. Всем спасибо за помощ! 

Клапауций
Offline
Зарегистрирован: 10.02.2013

Hobigo пишет:

И без вас разабрался господа умники. Всем спасибо за помощ! 

печалька - без нас разобрались, и чего нам теперь делать?