如何添加Interrupt();功能到arduino代码

时间:2016-12-18 23:03:56

标签: arduino arduino-uno

对于一个小型学校项目,我正在建立一个基于三个方向的交通灯系统模拟。系统的特殊之处在于它可以检测在红绿灯前等候的车辆。当检测到车辆时,给定方向将变为绿灯。为此,我使用霍尔效应传感器。 现在我被困在以下问题上了; Arduino停止检测传感器的状态,同时给某个方向一个绿灯。我已经读过有关Interrupt()函数的信息,可以同时执行某些任务,但没有设法在我的代码中实现它。

希望你们知道这样做的方法!

int sensorPin3 = 2;
int sensorPin2 = 3;
int sensorPin1 = 4;
int g1 = 11;
int y1 = 12;
int r1 = 13;
int g2 = 8;
int y2 = 9;
int r2 = 10;
int g3 = 5;
int y3 = 6;
int r3 = 7;
int counter = 0;
boolean sensorState1 = false;
boolean sensorState2 = false;
boolean sensorState3 = false;

void setup() 
{
  // setup serial - diagnostics - port
  Serial.begin(9600);
  pinMode(sensorPin1, INPUT);
  pinMode(sensorPin2, INPUT);
  pinMode(sensorPin3, INPUT);
  digitalWrite(sensorPin1, HIGH);
  digitalWrite(sensorPin2, HIGH);
  digitalWrite(sensorPin3, HIGH);
  pinMode(g1, OUTPUT);
  pinMode(y1, OUTPUT);
  pinMode(r1, OUTPUT);
  pinMode(g2, OUTPUT);
  pinMode(y2, OUTPUT);
  pinMode(r2, OUTPUT);
  pinMode(g3, OUTPUT);
  pinMode(y3, OUTPUT);
  pinMode(r3, OUTPUT);
}

void loop() 
{
  digitalWrite (r1, HIGH);
  digitalWrite (r2, HIGH);
  digitalWrite (r3, HIGH);
  if(magnetPresent(sensorPin1) && !sensorState1)
  {
    sensorState1 = true;
  }
  else if(!magnetPresent(sensorPin1) && sensorState1)
  {
    if(sensorState1 = false);
    Serial.println("detect1"); 
    richting1();   
  }
  if(magnetPresent(sensorPin2) && !sensorState2)
  {
    sensorState2 = true;
  }
  else if(!magnetPresent(sensorPin2) && sensorState2)
  {
    if (sensorState2 = false);
    Serial.println("detect2");
    richting2();
  }
  if(magnetPresent(sensorPin3) && !sensorState3)
  {
    sensorState3 = true;
  }
  else if(!magnetPresent(sensorPin3) && sensorState3)
  {
    if (sensorState3 = false);
    Serial.println("detect3");
    richting3();
  }
}

void printMessage(String message){
  counter++;

  Serial.print(counter);
  Serial.print(" ");
  Serial.println(message);
}

boolean magnetPresent(int pin){
  return digitalRead(pin) == LOW;
}

void richting1()
{
  digitalWrite (r1, HIGH);
  digitalWrite (r2, HIGH);
  digitalWrite (r3, HIGH);
  delay(2000);
  digitalWrite (r1, LOW);
  digitalWrite (r2, HIGH);
  digitalWrite (r3, HIGH);
  digitalWrite (g1, HIGH);
  delay(10000);
  digitalWrite (y1, HIGH);
  digitalWrite (r2, HIGH);
  digitalWrite (r3, HIGH);
  digitalWrite (g1, LOW);
  delay(2000);
  digitalWrite (y1, LOW);
  digitalWrite (r1, HIGH);
}

void richting2()
{
  digitalWrite (r1, HIGH);
  digitalWrite (r2, HIGH);
  digitalWrite (r3, HIGH);
  delay(2000);
  digitalWrite (r2, LOW); 
  digitalWrite (r1, HIGH);
  digitalWrite (r3, HIGH);
  digitalWrite (g2, HIGH);
  delay(10000);
  digitalWrite (y2, HIGH);
  digitalWrite (r1, HIGH);
  digitalWrite (r3, HIGH);
  digitalWrite (g2, LOW);
  delay(2000);
  digitalWrite (y2, LOW);
  digitalWrite (r2, HIGH);  
}

void richting3()
{
  digitalWrite (r1, HIGH);
  digitalWrite (r2, HIGH);
  digitalWrite (r3, HIGH);
  delay(2000);
  digitalWrite (r3, LOW);
  digitalWrite (y3, LOW);
  digitalWrite (r1, HIGH);
  digitalWrite (r2, HIGH);
  digitalWrite (g3, HIGH);
  delay(10000);
  digitalWrite (y3, HIGH);
  digitalWrite (r1, HIGH);
  digitalWrite (r2, HIGH);
  digitalWrite (g3, LOW);
  delay(2000);
  digitalWrite (y3, LOW);
  digitalWrite (r3, HIGH);
}

1 个答案:

答案 0 :(得分:0)

@NickGammon发表了关于中断以及如何使用它们的精彩帖子。它更完整,所以这里是链接:

https://arduino.stackexchange.com/questions/30968/how-do-interrupts-work-on-the-arduino-uno-and-similar-boards

这只是一个小小的意见,但对于红绿灯代码,我发现制作类似自定义延迟的东西要简单一些。看看这段代码,您希望能够理解它。再次,这是我的学校项目之一,我使用了模板,所以你可能会看到一些无用的废话!

MYVAR