Как сделать так, чтобы код повторялся неопределенное количество раз - PullRequest
0 голосов
/ 09 декабря 2018

В качестве школьного проекта у меня есть сенсорный датчик в виде переключателя включения / выключения, подключенного к arduino. При касании, когда он запускает подключенные двигатели, сервопривод и ультразвуковой датчик. Затем при повторном касании датчика ониМоя проблема в том, что я не могу заставить сервопривод и ультразвуковой аппарат повторить процесс поворота и вычисления расстояния более одного раза, и я не могу использовать цикл, так как я не могу знать, как долго будет работать схема, и если ясделать после нажатия кнопки во второй раз, мне придется ждать, пока количество циклов, которые я вставил, чтобы закончить, прежде чем все также останавливается.

Вот код на данный момент:

 #include <Servo.h>
    Servo servo; 
    int pos = 0;
    const int trigPin = 4;
    const int echoPin = 5; 
    long duration;
    int distance; 


    #define TouchSensor 13 
    int relay = 2; 
     // motor one
    int enA = 10;
    int in1 = 6;
    int in2 = 7;
    // motor two
    int enB = 5;
    int in3 = 8;
    int in4 = 9;

    boolean currentState = LOW;
    boolean lastState = LOW;
    boolean RelayState = LOW;

    void setup() {
      Serial.begin(9600);
      pinMode(enA, OUTPUT);  
      pinMode(enB, OUTPUT);  
      pinMode(in1, OUTPUT);
      pinMode(in2, OUTPUT);
      pinMode(in3, OUTPUT);
      pinMode(in4, OUTPUT);
      pinMode(TouchSensor, INPUT);
      servo.attach(3);
      pinMode(trigPin, OUTPUT); 
      pinMode(echoPin, INPUT);
    }

    void loop() {
      currentState = digitalRead(TouchSensor);
        if (currentState == HIGH && lastState == LOW){
        Serial.println("pressed");
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);  
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);

        servo.write(40);
     digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance= duration*0.034/2;
    Serial.print("Distance: ");
    Serial.println(distance);
     delay(500);
     servo.write(80);
     digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance= duration*0.034/2;
    Serial.print("Distance: ");
    Serial.println(distance);
     delay(500);
     servo.write(120);
     digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance= duration*0.034/2;
    Serial.print("Distance: ");
    Serial.println(distance);
     delay(500);
     servo.write(160);
     digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance= duration*0.034/2;
    Serial.print("Distance: ");
    Serial.println(distance);
    delay(500);

      delay(1);

        if (RelayState == HIGH){
          digitalWrite(relay, LOW);
          RelayState = LOW;
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);  
        digitalWrite(in3, LOW);
        digitalWrite(in4, LOW); 
        } else {
          digitalWrite(relay, HIGH);
          RelayState = HIGH;
        }
      }
      lastState = currentState;
    }

Заранее спасибо.Извините за любые ошибки, английский не мой родной язык.

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Вам действительно следует подумать о том, чтобы сделать ваш код немного легче для чтения.Это было довольно трудно следовать.Даже не сервис написания кода, я чувствую, что должен сделать его более читабельным в качестве примера.Функциональность должна быть такой же, исключая добавленный цикл для этого состояния.Конечно, я не могу попробовать это здесь.Это не идеально, но я уже некоторое время переписывал это, так что, надеюсь, вы что-то из этого получите.ура.

#include <Servo.h>


/*
   Here I have added couple of definitions,
   like max servo position and speed of sound.
   Good rule is to name definitions in capital letters.
 */

#define TOUCHSENSOR 13
#define STEPSIZE 40
#define SPEED_OF_SOUND 0.034
#define MAX_SERVO_POS 160
const int trigPin = 4;
const int echoPin = 5;

int relay = 2;

/*
   its good to name variables so they indicate usage if possible,
   Here I have renamed motor PIN variables and enable pins.
   Not only for others but you will also eventually forget.
 */
int enableMotorOne = 10;
int motorOneTerminalOne = 6;
int motorOneTerminalTwo = 7;
// motor two
int enableMotorTwo = 5;
int motorTwoTerminalOne = 8;
int motorTwoTerminalTwo = 9;

boolean currentState = LOW;
boolean lastState = LOW;
boolean relayState = LOW;

Servo servo;

void setup() {
        Serial.begin(9600);
        pinMode(enableMotorOne, OUTPUT);
        pinMode(motorOneTerminalOne, OUTPUT);
        pinMode(motorOneTerminalTwo, OUTPUT);

        pinMode(enableMotorTwo, OUTPUT);
        pinMode(motorTwoTerminalOne, OUTPUT);
        pinMode(motorTwoTerminalTwo, OUTPUT);

        pinMode(TOUCHSENSOR, INPUT);
        servo.attach(3);
        pinMode(trigPin, OUTPUT);
        pinMode(echoPin, INPUT);
}


void getDistance()
{
        /*
           Whole function for getting distance from ultrasonic sensor is moved Here
           usage in older implementation was repetitive and unnecessary
         */

        long duration;
        int distance;

        digitalWrite(trigPin, LOW);
        delayMicroseconds(2);
        digitalWrite(trigPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(trigPin, LOW);

        duration = pulseIn(echoPin, HIGH);
        distance= duration*(SPEED_OF_SOUND/2);
        Serial.print("Distance: ");
        Serial.println(distance);
}

void scanState()
{
        Serial.println("pressed");
        digitalWrite(motorOneTerminalOne, LOW);
        digitalWrite(motorOneTerminalTwo, HIGH);
        digitalWrite(motorTwoTerminalOne, HIGH);
        digitalWrite(motorTwoTerminalTwo, LOW);

        while(currentState == HIGH && lastState == LOW)
        {
                /*
                   I think this is what you were asking, to loop this functionality
                   until state pins change state.
                 */

                for (size_t servoPos = 40; servoPos <= MAX_SERVO_POS; servoPos+=STEPSIZE) {
                        /*
                           This code in for loop here should do kinda 
                           same as you old code rows 
                           48-91. Please get familiar.
                         */
                        servo.write(servoPos);
                        getDistance();
                        delay(500);
                }

                if (relayState == HIGH) {
                        digitalWrite(relay, LOW);
                        relayState = LOW;
                        digitalWrite(motorOneTerminalOne, LOW);
                        digitalWrite(motorOneTerminalTwo, LOW);
                        digitalWrite(motorTwoTerminalOne, LOW);
                        digitalWrite(motorTwoTerminalTwo, LOW);
                } else {
                        digitalWrite(relay, HIGH);
                        relayState = HIGH;
                }
        }
        delay(1);
}

void loop() {

        /*
           This is your new loop function, much easier to understand what is
           going on..
         */
        currentState = digitalRead(TOUCHSENSOR);
        if (currentState == HIGH && lastState == LOW) {
                scanState();
        }
        lastState = currentState;
}
0 голосов
/ 09 декабря 2018

В C ++, как и в большинстве других языков, можно выйти из цикла с помощью оператора break, поэтому вы можете сделать что-то вроде этого:

// A loop condition that will never terminate on its own
while(true)
{
  // Exit the loop when the sensor is triggered again
  if (sensorPressed()) {
    break;
  }

  // Otherwise, continue doing whatever is needed
}

// After the break, execution will resume here

Обратите внимание, что вы будетеВероятно, также потребуется еще один цикл, чтобы убедиться, что датчик не продолжает считывать данные, сработавшие до входа в основной цикл.

...