2017-03-02 3 views
0

So mache ich ein Projekt. Meine Aufgabe besteht darin, ein Ampelsystem zu erstellen, das drei Modi enthält, aus denen ich auswählen kann, indem ich die Nummern 1,2 oder 3 in den seriellen Monitor eingib. Alles war in Ordnung, bis ich entschied, dem Steckbrett drei Drucktasten hinzuzufügen, damit ich auch jeden Modus über die Tasten auswählen kann. Bisher war ich nicht in der Lage, den Arduino Eingaben vom seriellen Monitor und den Drucktasten gleichzeitig annehmen zu lassen, ich weiß nicht, ob ich auf dem richtigen Weg bin oder nicht, um mein Ziel zu erreichen. Ich brauche nur eine kleine Anleitung dazu, bitte. Hier ist mein aktueller Code:Eingang vom seriellen Monitor und Druckknopf

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

Was ist das unerwartete 'distanceSensor (0); // distance sensor function 'am Anfang der Funktion' loop() 'zwischen' if (Serial.available()> 0) 'und dem Block' {...} '? –

+0

Es gibt keinen Code, der die "loop" -Funktion aufruft, daher müssen Sie möglicherweise mehr posten. Aber, AFAICT, sobald Sie eine 'Fall' innerhalb der 'switch' Anweisung eingeben, haben Sie eine Endlosschleife. (zB für 'case '1':', du machst 'while (true)' ohne Pause. Ebenso für die anderen 'while' Anweisungen für jeden' ​​case', also musst du die Dinge vielleicht etwas umstrukturieren, also hast du es _one_ 'while' und jeder' case' macht nur eine einzige Iteration, dh, verschiebe die Schleife aus dem Schalter/case –

+0

Die Lösung deines Problems ==> state-machine –

Antwort

0

Ich denke, Sie haben nicht den Weg arduino Skizzen funktioniert. Die loop() Funktion wird jedes Mal in einer kontinuierlichen Schleife aufgerufen (wie ein while(true)), also sollten Sie Ihre Logik nutzen, um diese Tatsache auszunutzen.

Sie verwenden Endlosschleifen innerhalb der loop()-Funktion (die bereits eine Endlosschleife ist), so dass Ihr Code in einer dieser Schleifen stecken bleibt und nie herauskommt, so dass er niemals den seriellen Puffer oder die GPIO-Pins lesen wird.

1

Wie ich in meiner Top-Kommentaren erwähnt, wenn Sie einen bestimmten case eingeben, können Sie es nie verlassen (dh die Dinge „stecken“)

Also, wie gesagt, eine einzige äußere Schleife und jede case tut gerade eins Iteration.

Beachten Sie auch, dass inVal nur geändert wird, wenn der serielle Port über Eingabedaten verfügt. Der Ansatz mit einer einzelnen Schleife ahmt die mehreren Schleifen nach, reagiert jedoch immer noch auf Änderungen der Eingabe.

Hier ist etwas, was ich denke, Sie näher an Ihre Absicht [der unentgeltlichen Stil Bereinigung verzeihen Sie bitte]:

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

Sie mein Herr hat gerade einen Platz in einem sehr speziellen Podest gewonnen.Ich überprüfte meinen Kabeljau e und deins, entdeckte die kleinen Fehler, die meine enthielt und korrigierte. Es sind immer diese minimalen Dinge. Danke für Ihre Unterstützung. @Craig –

+0

Gern geschehen. Nur neugierig. Wie hast du Dinge in deinem eigenen Code repariert? (d. h. wie ähnlich/verschieden zu meiner?) –

Verwandte Themen