2017-03-02 9 views
0

私はプロジェクトをやっています。私の仕事は、私が選択できる3つのモードを含む交通信号システムを作成することです。シリアル・モニターに1,2,3の番号を入力します。ブレッドボードに3つのプッシュボタンを追加することに決めたので、ボタンを使用して任意のモードを選択することができるまで、すべては問題ありませんでした。これまでのところ、Arduinoはシリアルモニタとプッシュボタンからの入力を同時に受け入れることができませんでした。私が正しい道にいるかどうか、私の目的を達成するかどうかはわかりません。私はこれに小さな案内が必要です、pls。ここに私の現在のコードは次のとおりです:シリアルモニタとプッシュボタンからの入力

//----------------------- Variables 
#define ECHOPIN 3 
#define TRIGPIN 2 
    char inVal; 
    String inString = ""; 
    const int red_led = 11; 
    const int yellow_led = 12; 
    const int green_led = 13; 
    const int on_delay= 2000, off_delay= 1000; //led delays 
    const int min_distance = 10; // Distance sensor min distance 
    const int The_buzzer = 4; 
    float real_distance; // Distance obtained from function 
    int ldrPin = A0; // LDR pin   
    unsigned int sensorValue = 0; 
    float voltage; 
    float light_amount; 
    int brightness = 600; // amount of light treshhold 
    int button_one = 5; 
    String ButtonOne; 


void setup() { 

    pinMode(red_led, OUTPUT); 
    pinMode(yellow_led, OUTPUT); 
    pinMode(green_led, OUTPUT); 
    pinMode(The_buzzer, OUTPUT); 
    Serial.begin(9600); 
    pinMode(ECHOPIN, INPUT); 
    pinMode(TRIGPIN, OUTPUT); 
    pinMode(button_one, INPUT); 
} 


void loop() { 


if (Serial.available()>0) 

distanceSensor(0); // distance sensor function 

{ 

    inVal=Serial.read(); 
    switch((inVal) | (ButtonOne == "HIGH")) 
{ 
    case '1': // ------------------------- Regular Mode 
    while (true) 
    { 
    red_light(); 
    yellow_light(); 
    green_light(); 
    yellow_light(); 
    } 
    break; 


case '2': // ------------------------ Pedestrian Mode 
while (true) 
{ 

real_distance = distanceSensor(0); 

if (real_distance < min_distance) 
{ 
    for (int a= 0; a < 10; a++) 
    { 
    tone(The_buzzer,1000); 
    delay(1000); 
    noTone(The_buzzer); 
    delay(1000); 
    digitalWrite(yellow_led, HIGH); 
    delay(100); 
    digitalWrite(yellow_led,LOW); 
    } 
} 

real_distance = distanceSensor(0); 

if (real_distance > min_distance) 
{ 
red_light(); 
yellow_light(); 
green_light(); 
yellow_light(); 
} 
} 
break; 


case '3': // --------------------------- NIGHT MODE 

while (true) 
{ 
light_amount = LDRSensor(0); 
real_distance = distanceSensor(0); 



if (light_amount > brightness) 
{ 
red_light(); 
yellow_light(); 
green_light(); 
yellow_light(); 
red_light(); 
delay(100); 
} 

if (light_amount < brightness || real_distance < min_distance) 
{ 

real_distance = distanceSensor(0); // distance sensor reading 

    if (real_distance > min_distance) 
    { 
    digitalWrite(green_led, LOW); 
    digitalWrite(red_led, HIGH); 
    } 

    if (real_distance < min_distance) 
    { 

    while(real_distance < min_distance && light_amount < brightness) 
    { //maybe change this 
    digitalWrite(red_led, LOW); 
    digitalWrite(green_led, HIGH); 
    real_distance = distanceSensor(0); 
    } 

    digitalWrite(green_led, LOW); 
    } 
    } 



} 
break; 

default: 
standby_mode(); // blinks all leds until 1,2 or 3 is selected 



} 
} 
} 

//--------------------------------------- FUNCTIONS ----------------------- 


//----------------------------------- Red light function 
void red_light() 
{ 
digitalWrite(red_led, HIGH); 
delay(on_delay); 
digitalWrite(red_led,LOW); 
} 

//---------------------------------- Yellow light function 
void yellow_light() 
{ 
digitalWrite(yellow_led, HIGH); 
delay(off_delay); 
digitalWrite(yellow_led,LOW); 
} 

//--------------------------------- Green light function 
void green_light() 
{ 
digitalWrite(green_led, HIGH); 
delay(on_delay); 
digitalWrite(green_led,LOW); 

} 

//------------------------------ --- Distance sensor function 
float distanceSensor(int x) 
{ 
digitalWrite(TRIGPIN, LOW); 
delayMicroseconds(2); 
digitalWrite(TRIGPIN,HIGH); 
delayMicroseconds(10); 
digitalWrite(TRIGPIN,LOW); 
float distance = pulseIn(ECHOPIN, HIGH); 
distance = distance/58; 
Serial.print(distance); 
Serial.println("cm"); 
delay(200); 

float distance_reading = distance; 

return distance_reading; 
} 

//------------------------------------- LDR sensor function 

float LDRSensor(int h) 
{ 
    sensorValue = analogRead(ldrPin);  
    voltage = sensorValue * (5000.0/1024.0); 
    Serial.print("Sensor Output: "); 
    Serial.println(sensorValue); 
    Serial.print("Voltage (mv): "); 
    Serial.println(voltage); 
    Serial.println(); 
    delay(5000); 
    return sensorValue; 
} 


//------------------------------------- Buzzer Function 

void buzzer(unsigned char delayms) 
{ 
    analogWrite(The_buzzer, 20); 
    delay(delayms); 
    analogWrite(The_buzzer, 0); 
    delay(delayms); 

} 

// ------------------------------------- Standby Mode 

void standby_mode() 
{ 
    for (int a= 10; a < 14; a++) 
    { 
    digitalWrite(a,HIGH); 
    } 

    delay(off_delay); 

    for (int b=10; b < 14; b++) 
    { 
    digitalWrite(b,LOW); 
    } 
    delay(off_delay); 

} 
+0

;:ここ

は、私は近いあなたの意図にあなたを取得だと思う何か[無償スタイルのクリーンアップをご容赦ください]であります'' if(Serial.available()> 0) 'とブロック' {...} 'との間の' loop() '関数の先頭にある// distance sensor function? –

+0

'loop'関数を呼び出すコードはありませんので、もっと投稿する必要があります。しかし、AFAICTは、 'switch'ステートメントの中に' case 'を入力すると無限ループになります。 (例: 'case '1':'の場合はwhile(true) 'を実行し、' case'の他の 'while'文も同様に再構成する必要があります。スイッチ/ケース –

+0

あなたの問題の解決==>ステート・マシンの外でループを移動する、あるwhile'各 'case'はただ1回の反復を行います。_one_'。 –

答えて

0

私はあなたがarduinoスケッチの仕組みを得られなかったと思います。 loop()関数は毎回連続ループ(while(true)など)で呼び出されるため、ロジックでこの事実を利用するようにしてください。

loop()関数内で無限ループを使用しています(これは既に無限ループです)ので、コードがこれらのループの1つに詰まり、決して脱出しないため、シリアルバッファまたはGPIOピンを読み取ることはありません。

1

あなたが与えられたcaseに入ると、私は、私の上のコメントで述べたように、あなたは私が言ったように、

ので(つまり、物事が「スタック」を取得)、単一の外部ループを持って、それを離れることはない、とそれぞれcaseただ一つ繰り返しです。

また、シリアルポートは、入力データが利用可能である場合は、以下、inValのみ変更されますので注意してください。したがって、単一ループのアプローチは複数のループを模倣しますが、依然として入力の変化に応答します。予期せぬ `distanceSensor(0)ということである何

//----------------------- Variables 
#define ECHOPIN 3 
#define TRIGPIN 2 
char inVal; 
String inString = ""; 
const int red_led = 11; 
const int yellow_led = 12; 
const int green_led = 13; 
const int on_delay = 2000, 
    off_delay = 1000;     // led delays 
const int min_distance = 10;   // Distance sensor min distance 
const int The_buzzer = 4; 
float real_distance;     // Distance obtained from function 
int ldrPin = A0;      // LDR pin 
unsigned int sensorValue = 0; 
float voltage; 
float light_amount; 
int brightness = 600;     // amount of light treshhold 
int button_one = 5; 
String ButtonOne; 

void 
setup() 
{ 

    pinMode(red_led, OUTPUT); 
    pinMode(yellow_led, OUTPUT); 
    pinMode(green_led, OUTPUT); 
    pinMode(The_buzzer, OUTPUT); 
    Serial.begin(9600); 
    pinMode(ECHOPIN, INPUT); 
    pinMode(TRIGPIN, OUTPUT); 
    pinMode(button_one, INPUT); 
} 

void 
loop() 
{ 

    // distance sensor function 
    if (Serial.available() > 0) 
     distanceSensor(0); 

    while (1) { 
     if (Serial.available() > 0) 
      inVal = Serial.read(); 

     switch ((inVal) | (ButtonOne == "HIGH")) { 
     case '1': // Regular Mode 
      red_light(); 
      yellow_light(); 
      green_light(); 
      yellow_light(); 
      break; 

     case '2': // Pedestrian Mode 
      real_distance = distanceSensor(0); 

      if (real_distance < min_distance) { 
       for (int a = 0; a < 10; a++) { 
        tone(The_buzzer, 1000); 
        delay(1000); 
        noTone(The_buzzer); 
        delay(1000); 
        digitalWrite(yellow_led, HIGH); 
        delay(100); 
        digitalWrite(yellow_led, LOW); 
       } 
      } 

      real_distance = distanceSensor(0); 

      if (real_distance > min_distance) { 
       red_light(); 
       yellow_light(); 
       green_light(); 
       yellow_light(); 
      } 
      break; 

     case '3': // NIGHT MODE 
      light_amount = LDRSensor(0); 
      real_distance = distanceSensor(0); 

      if (light_amount > brightness) { 
       red_light(); 
       yellow_light(); 
       green_light(); 
       yellow_light(); 
       red_light(); 
       delay(100); 
      } 

      if (light_amount < brightness || real_distance < min_distance) { 

       real_distance = distanceSensor(0); // distance sensor reading 

       if (real_distance > min_distance) { 
        digitalWrite(green_led, LOW); 
        digitalWrite(red_led, HIGH); 
       } 

       if (real_distance < min_distance) { 

        while (real_distance < min_distance && light_amount < brightness) { // maybe change this 
         digitalWrite(red_led, LOW); 
         digitalWrite(green_led, HIGH); 
         real_distance = distanceSensor(0); 
        } 

        digitalWrite(green_led, LOW); 
       } 
      } 
      break; 

     default: // blinks all leds until 1,2 or 3 is selected 
      standby_mode(); 
      break; 
     } 
    } 
} 

//--------------------------------------- FUNCTIONS ----------------------- 

//----------------------------------- Red light function 
void 
red_light() 
{ 
    digitalWrite(red_led, HIGH); 
    delay(on_delay); 
    digitalWrite(red_led, LOW); 
} 

//---------------------------------- Yellow light function 
void 
yellow_light() 
{ 
    digitalWrite(yellow_led, HIGH); 
    delay(off_delay); 
    digitalWrite(yellow_led, LOW); 
} 

//--------------------------------- Green light function 
void 
green_light() 
{ 
    digitalWrite(green_led, HIGH); 
    delay(on_delay); 
    digitalWrite(green_led, LOW); 

} 

//------------------------------ --- Distance sensor function 
float 
distanceSensor(int x) 
{ 

    digitalWrite(TRIGPIN, LOW); 
    delayMicroseconds(2); 
    digitalWrite(TRIGPIN, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(TRIGPIN, LOW); 
    float distance = pulseIn(ECHOPIN, HIGH); 

    distance = distance/58; 
    Serial.print(distance); 
    Serial.println("cm"); 
    delay(200); 

    float distance_reading = distance; 

    return distance_reading; 
} 

//------------------------------------- LDR sensor function 

float 
LDRSensor(int h) 
{ 

    sensorValue = analogRead(ldrPin); 
    voltage = sensorValue * (5000.0/1024.0); 
    Serial.print("Sensor Output: "); 
    Serial.println(sensorValue); 
    Serial.print("Voltage (mv): "); 
    Serial.println(voltage); 
    Serial.println(); 
    delay(5000); 

    return sensorValue; 
} 

//------------------------------------- Buzzer Function 

void 
buzzer(unsigned char delayms) 
{ 

    analogWrite(The_buzzer, 20); 
    delay(delayms); 
    analogWrite(The_buzzer, 0); 
    delay(delayms); 
} 

// ------------------------------------- Standby Mode 

void 
standby_mode() 
{ 

    for (int a = 10; a < 14; a++) { 
     digitalWrite(a, HIGH); 
    } 

    delay(off_delay); 

    for (int b = 10; b < 14; b++) { 
     digitalWrite(b, LOW); 
    } 
    delay(off_delay); 
} 
+0

私の先生は非常に特別な台座でちょうどスポットを得ました。私とあなたのものは、私の中に含まれ、修正された小さな間違いを見つけました。それは常にその最小限のものです。ご協力ありがとうございます。 @Craig –

+0

あなたは大歓迎です。ちょっと興味があるんだけど。どのようにあなた自身のコードで物事を修正しましたか? (つまり、私とどれほど似ている/違う?) –

関連する問題