2017-03-02 42 views
0

所以我正在做一個項目。我的任務是創建一個包含三種模式的交通信號燈系統,我可以通過向串行監視器輸入數字1,2或3來選擇。一切都還好,直到我決定向麪包板添加三個按鈕,所以我也可以通過按鈕選擇任何模式。到目前爲止,我一直無法讓Arduino同時接受來自串行監視器和按鈕的輸入,我不知道我是否在正確的道路上,還是不想實現我的目標。我只需要一個小指導,請。這是我目前的代碼:串行監視器和按鈕輸入

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

那是什麼意外的'distanceSensor(0); //在'if(Serial.available()> 0)'和塊'{...}'之間的'loop()'函數的開始處使用//距離傳感器函數? –

+0

沒有調用你的'loop'函數的代碼,所以你可能需要發佈更多。但是,AFAICT,一旦你在'switch'語句中輸入'case',你就會有一個無限循環。 (例如'case'1':',while(true)'while'break'),對於每個case的while語句也是如此,所以你可能需要重構一些東西,所以你有_one_'while'和每個'case'只做一次迭代,即將循環移動到開關/外殼的外部 –

+0

問題的解決方案==>狀態機 –

回答

0

我想你沒有得到arduino草圖的工作方式。每次在連續循環中調用loop()函數(如while(true)),所以您應該讓自己的邏輯充分利用這一事實。

您在loop()函數中使用了無限循環(這已經是一個無限循環),因此您的代碼會停留在這些循環中的一個循環中,永遠不會跳出,因此它將永遠不會讀取串行緩衝區或GPIO引腳。

1

正如我在上面的評論中提到,一旦你進入一個給定的case,你永遠不會離開它(即事情變得「卡住」)

所以,我說,有一個外循環,每個case只是做一個迭代。

此外,請注意,如果串行端口具有可用的輸入數據,則僅在inVal中進行更改。所以,單循環方法模仿多個循環,但仍然響應輸入的變化。

這裏是我覺得讓你更接近你的意圖的東西[請原諒無償風格清理]:

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

我的先生剛剛在一個非常特殊的基座上獲得了一席之地,我回顧了我的鱈魚e和你的,發現了我所包含和糾正的小錯誤。這總是那麼簡單的事情。感謝您的支持。 @克雷格 –

+0

不客氣。只是好奇。你是如何在自己的代碼中修復的? (即與我的相似/不同?) –