그래서 Arduino를 위해 만든 신호등 코드가 있지만 가능한 한 효율적으로 만들려고 애 쓰고 있습니다. 코드를 복잡하게 만들지 않도록 최적화하려고하는 부분 만 보여줄 것입니다.루핑중인 주 기능을 일시 중지하도록이 코드를 어떻게 최적화 할 수 있습니까?
const int redLedPin=5;
const int yellowLedPin=6;
const int greenLedPin=4;
const int redLedPin1=10;
const int yellowLedPin1=9;
const int greenLedPin1=8;
const int blueLed=11;
const int button=3;
const int button2=2;
volatile int num = 0;
volatile int val = 0;
void setup() {
pinMode(redLedPin, OUTPUT);
pinMode(yellowLedPin , OUTPUT);
pinMode(greenLedPin, OUTPUT);
pinMode(redLedPin1, OUTPUT);
pinMode(yellowLedPin1 , OUTPUT);
pinMode(greenLedPin1, OUTPUT);
pinMode(blueLed,OUTPUT);
pinMode(button,INPUT_PULLUP);
pinMode(button,INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(button2), blink1, RISING);
attachInterrupt(digitalPinToInterrupt(button), cycle, RISING);
}
void loop() {
//runs when the button is pressed then ends after the while loop is
//executed once and resets the value of the button
while(val==1){
digitalWrite(greenLedPin, HIGH);
digitalWrite(redLedPin1,HIGH);
digitalWrite(redLedPin,LOW);
digitalWrite(blueLed,HIGH);
delay(4000);
digitalWrite(greenLedPin, LOW);
digitalWrite(redLedPin, HIGH);
for(int i=0; i<=4;i++)
{
digitalWrite(blueLed,LOW);
delay(500);
digitalWrite(blueLed,HIGH);
delay(500);
}
for(int i=0; i<=9;i++)
{
digitalWrite(blueLed,HIGH);
delay(100);
digitalWrite(blueLed,LOW);
delay(100);
}
digitalWrite(blueLed,HIGH);
delay(1000);
digitalWrite(blueLed,LOW);
val=!val;
}
//blinks three leds repeatedly till the button is pressed again
if(num){
digitalWrite(redLedPin, HIGH);
digitalWrite(yellowLedPin1,HIGH);
digitalWrite(blueLed, HIGH);
digitalWrite(redLedPin1, LOW);
delay(500);
digitalWrite(redLedPin, LOW);
digitalWrite(yellowLedPin1, LOW);
digitalWrite(blueLed,LOW);
delay(500);}
else{
changeLights();
}
}
// the main function that gets repeated throughout the code
void changeLights() {
digitalWrite(greenLedPin, HIGH);
digitalWrite(redLedPin1,HIGH);
digitalWrite(redLedPin,LOW);
delay(4000);
digitalWrite(yellowLedPin, HIGH);
digitalWrite(redLedPin1,HIGH);
digitalWrite(greenLedPin, LOW);
delay(2000);
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, HIGH);
delay(2000);
digitalWrite(greenLedPin1, HIGH);
digitalWrite(redLedPin1,LOW);
delay(4000);
digitalWrite(greenLedPin1, LOW);
digitalWrite(yellowLedPin1, HIGH);
delay(2000);
digitalWrite(redLedPin,HIGH);
digitalWrite(redLedPin1,HIGH);
digitalWrite(yellowLedPin1,LOW);
delay(2000);
}
void blink1()
{
num=!num;
}
void cycle()
{
val=!val;
}
버튼을 사용하여 루프를 실행하면 changeLights() 함수로 돌아갑니다. 내가하고 싶은 일은 언제나 버튼 중 하나를 누를 때마다 changeLights() 함수를 멈추고 버튼 코드를 실행할 때마다 멈추게하는 것입니다. 그래서 어떻게 최적화 할 것이므로 하나의 버튼 코드를 실행하기 위해 루프의 끝까지 기다려야합니다. 죄송합니다. 문제가 발생하면 코드 흐름을 더 좋게 만들고 싶습니다.
좋아,이 코드는 훌륭하지만 한가지 더 질문이 있습니다. 그래서 지속적으로 진행되는 버튼의 경우 루프에서 빠져 나옵니다. 나는 그 밖의 다른 것을 시도했지만 코드는 엉망이되었고 LED는 엉망이되기 시작했다. 버튼을 누를 때마다 다음에 0을 어떻게 설정합니까? – Rafael
@Rafael 버튼을 누르면이 변수가 토글 될 때 'int in_button_sequence = 0'과 같은 변수를 생성하는 것으로 생각합니다. 토글 링 한 후 다음과 같이하십시오. if (in_button_sequence) {state = 7} else {state = 0}' – linzwatt