Содержание

Программирования на C++ в среде Arduino

Traffic lights example (модифицированная версия)

/*
 
 * Traffic lights example
 * 
 * Red light to pin 7
 * Yellow light to pin 6
 * Green light to pin 5
 * 
 * Pedestrian Red light to pin 4
 * Pedestrian Green light to pin 3
 * Pedestrian pushbutton pin 2 (it is connected to the GND, therefore internal PULLUP resistor must be ON)
 * 
 * Arduino IDE 1.6.12
 */
 
 // Pins
 int red = 7, yellow = 6, green = 5;
 int p_red = 4, p_green = 3;
 int button = 2;
 
 // System variables
 byte state = 0; // initial state
 
 unsigned long i = 1; // system counter
 unsigned int del = 100; // system delay legnth
 boolean flag = false;
 
void change_traffic_lights(uint8_t r,uint8_t y, uint8_t g){
    digitalWrite(red, r);
    digitalWrite(yellow, y);
    digitalWrite(green, g);
}
 
void change_pedastrian_lights(uint8_t r,uint8_t g){
    digitalWrite(p_red, r);
    digitalWrite(p_green, g);
}
 
void setup() {
  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(p_red, OUTPUT);
  pinMode(p_green, OUTPUT);
  pinMode(button, INPUT_PULLUP);
  Serial.begin(9600);
}
 
void loop() {
  // Check button
  if(digitalRead(button) == 0) {
    flag = true;
  }
  delay(del);
  switch(state){
    case 0:
      change_traffic_lights(0,0,1);
      change_pedastrian_lights(1,0);
      if(flag){
        if((i%30)==0){
          flag = false;
          Serial.print("case 0, state = 3 ");Serial.println(flag);        
          state = 3;
          i = 1;          
        }
      }
    break;
 
    case 1:
 
      change_traffic_lights(1,1,0);
      change_pedastrian_lights(1,0);
      if((i%30)==0){
        Serial.print("case 1, state = 0 ");Serial.println(flag);
        state = 0;
        flag = false;
        i = 1;
      }
    break;
 
    case 2:
 
      change_traffic_lights(1,0,0);
      change_pedastrian_lights(0,1);
      if((i%100)==0){
       Serial.print("case 2, state = 1 ");Serial.println(flag);
        state = 1;
        flag = false;
        i = 1;
      }
    break;
 
    case 3:
      change_traffic_lights(0,1,0);
      change_pedastrian_lights(1,0);
      if((i%20)==0){
        Serial.print("case 3, state = 2 ");Serial.println(flag);
        state = 2;
        flag = false;
        i = 1;
      }
    break;
    default:
    break;
  }
  i++;
 
}

Traffic lights example (без использования блокировочных функций delay())

/*
 
 * Traffic lights example
 * 
 * Red light to pin 7
 * Yellow light to pin 6
 * Green light to pin 5
 * 
 * Pedestrian Red light to pin 4
 * Pedestrian Green light to pin 3
 * Pedestrian pushbutton pin 2 (it is connected to the GND, therefore internal PULLUP resistor must be ON)
 * 
 * Arduino IDE 1.6.12
 */
 
 // Pins
 int red = 7, yellow = 6, green = 5;
 int p_red = 4, p_green = 3;
 int button_1 = 2;
 
 int butState_1 = HIGH;
 int butDelay = 10;
 int checkButton_1 = 0;
 uint32_t prevButt_time_1 = 0;
 uint32_t prevTraffic_time = 0;
 
 // System variables
 byte state = 0; // initial state
 
 unsigned long i = 1; // system counter
 unsigned int del = 100; // system delay legnth
 boolean flag = false;
 
void change_traffic_lights(uint8_t r,uint8_t y, uint8_t g){
    digitalWrite(red, r);
    digitalWrite(yellow, y);
    digitalWrite(green, g);
}
 
void change_pedastrian_lights(uint8_t r,uint8_t g){
    digitalWrite(p_red, r);
    digitalWrite(p_green, g);
}
 
uint8_t checkButton(){
  uint8_t newButtonState = digitalRead(button_1);
  if(newButtonState != butState_1){
    Serial.print("newButtonState  = "); Serial.println(newButtonState);
    return true;
  } else {
    return false;
  }
}
 
void setup() {
  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(p_red, OUTPUT);
  pinMode(p_green, OUTPUT);
  pinMode(button_1, INPUT_PULLUP);
  Serial.begin(9600);
}
 
void loop() {
  // Check button
 
 
  switch(state){
    case 0:
      change_traffic_lights(0,0,1);
      change_pedastrian_lights(1,0);
 
      if(checkButton()){
          prevTraffic_time = millis();  
          state = 5;    
          Serial.println("state = 0; ");
        }
    break;
    case 5:
      change_traffic_lights(0,0,1);
      change_pedastrian_lights(1,0);
      if(millis() - prevTraffic_time >= 3000){
        prevTraffic_time = millis();  
          state = 3;   
      Serial.println("state = 5; ");   
        }
    break;
    case 1:
 
      change_traffic_lights(1,1,0);
      change_pedastrian_lights(1,0);
      if(millis() - prevTraffic_time >= 3000){
        prevTraffic_time = millis();
 
          Serial.println("state = 1; ");      
          state = 0;      
        }
    break;
 
    case 2:
 
      change_traffic_lights(1,0,0);
      change_pedastrian_lights(0,1);
      if(millis() - prevTraffic_time >= 5000){
        prevTraffic_time = millis();
 
        Serial.println("state = 2; ");       
        state = 1;      
       }
    break;
 
    case 3:
      change_traffic_lights(0,1,0);
      change_pedastrian_lights(1,0);
      if(millis() - prevTraffic_time >= 2000){
        prevTraffic_time = millis();
 
        Serial.println("state = 3; ");        
        state = 2;      
      }
    break;
    default:
    break;
  }
}