0

基本的に、私は次のようなスマートウェイターの作成を含むArduinoUnoプロジェクトを作成しています。

  1. 基本的なArduinoシャーシの上にガラスホルダーがあります。センサーは次のようになります。
    • 両側に1つずつ、4つの赤外線センサー
    • 2つのラインセンサー、1つは左と1つは右
    • 光センサー、カップホルダー1つ
  2. また、次のようになります。
    • 2つのサーボモーター、1つは左右
    • カップの状態を示す1つのLED
  3. そうなる:
    • HOPの床にテープで貼り付けられる黒い線に沿って移動します
    • 四方八方の人を感知し、身近な体を感知すると一時停止します
    • ガラスが持ち上げられたことを感知すると、無期限に停止します
    • ガラスの動きを感知しない場合は15秒後に再開するか、ガラスを下ろすと再開します
    • ガラスを置くと、LEDが緑色から赤色に変わります
    • ロボットは、充填ステーションに到達するまで、すべての障害物を無視して移動し続けます
    • フィラーがガラスに置き換わり、Arduinoハードリセットボタンを押すガソリンスタンドで停止します

私のコードは次のとおりです。

#include <Servo.h>
int redLED = 5;
int yellowLED = 6;
int greenLED = 7;
int cup1 = 0;
int picked = 1;
int lineright = 0;
int lineleft = 0;
int sensorright = 0;
int sensorleft = 0;
int sensorfront = 0;
int sensorback = 0;
int sensorpinright = 1;
int sensorpinleft = 2;
int sensorpinfront = 3;
int sensorpinback = 4;
Servo servoright;
Servo servoleft;
void setup ()
{
  servoright.attach (9);
  servoleft.attach (10);
  pinMode (redLED, OUTPUT);
  pinMode (greenLED, OUTPUT);
  pinMode (greenLED, OUTPUT);
}
void loop()
{
   sensorright = digitalRead (sensorpinright);
   sensorleft = digitalRead (sensorpinleft);
   sensorfront = digitalRead (sensorpinfront);
   sensorback = digitalRead (sensorpinback);
   lineleft = analogRead (1);
   lineright = analogRead (2);
   cup1 = analogRead (3);
 if (sensorright < 0 && sensorleft < 0 && sensorfront < 0 && sensorback < 0)
  {
    digitalWrite (led1, GREEN);
    startfresh:
    if (lineleft < 800)
    {
      servoleft.write (180);
      servoright.write (180);
    }
    else
    {
      if (lineright < 800)
      {
        servoright.write (0);
        servoleft.write (0);
      }
      else
      {
        servoright.write (0);
        servoleft.write (180);
      }
    }
  }
  else
  {
    for (int i=0;i<5;i++)
    {
      servoright.write (93);
      servoleft.write (93);
      if (picked < 1)
      {
        while (cup1<500)
        {
          digitalWrite (yellowLED, HIGH);
          picked = 1;
        }
      }
      else
      {
        digitalWrite (yellowLED, LOW);
        digitalWrite (redLED, HIGH);
        goto startfresh;
      }
      delay (2000)
    }
  }
}

私が自分のコードでやりたいのはgoto、最後に関数を避けることです。しかし、2つの機能だけの制限でこれを再構築する方法を見つけることができません。この場合、goto機能は問題ないように見えますが、よくわかりません。これを再構築する簡単な方法はありますか?

4

1 に答える 1

0

startfresh を関数にする

 if (sensorright < 0 && sensorleft < 0 && sensorfront < 0 && sensorback < 0)
  {
    digitalWrite (led1, GREEN);
    startfresh();
  }
  else
  {
    for (int i=0;i<5;i++)
    {
      servoright.write (93);
      servoleft.write (93);
      if (picked < 1)
      {
        while (cup1<500)
        {
          digitalWrite (yellowLED, HIGH);
          picked = 1;
        }
        delay (2000);
      }
      else
      {
        digitalWrite (yellowLED, LOW);
        digitalWrite (redLED, HIGH);
        startfresh();
      }
    }
  }
}

void startfresh() {
  if (lineleft < 800)
  {
    servoleft.write (180);
    servoright.write (180);
  }
  else
  {
    if (lineright < 800)
    {
      servoright.write (0);
      servoleft.write (0);
    }
    else
    {
      servoright.write (0);
      servoleft.write (180);
    }
  }
}
于 2013-02-19T19:43:48.873 に答える