Arduino电梯

时间:2016-01-13 05:07:17

标签: arrays arduino

我已开始使用arduino编程三层电梯。到目前为止,我可以设法从每个楼层调用电梯并将汽车移向选定的楼层。现在我正在尝试将按下的按钮存储在一个阵列中,并按照呼叫顺序将电梯移动到选定的楼层。然而,汽车仅移动到一个楼层并停在那里并且不会继续到下一个选定楼层。这就是我所做的。

const int maxfloors = 3;

byte carcall_buttons[maxfloors] = {22,24,46};
byte floor_sensors[maxfloors] = {25,26,47};

int buttonstate[3];
int sensorstate[3];

boolean registered[3] = {false, false, false};


int lastbuttonstate0 = LOW;
int lastbuttonstate1 = LOW;
int lastbuttonstate2 = LOW;

int lastsensorstate0 = LOW;
int lastsensorstate1 = LOW;
int lastsensorstate2 = LOW;

const byte led1 = 27;
const byte led2 = 23;
const byte led3 = 48;

const int motor_up = 41;
const int motor_down = 42;
const int  En = 40;

enum state {down,stop};
state elevator_state;


void setup()
{
  for (int i = 0; i<maxfloors; i++)
  {
    pinMode (carcall_buttons[i], INPUT);
    pinMode (floor_sensors[i], INPUT);
  }

  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
  pinMode (led3, OUTPUT);

  pinMode(motor_up, OUTPUT);
  pinMode(motor_down, OUTPUT);
  pinMode(En, OUTPUT);

  Serial.begin (9600);
}

void loop()
{

  ReadButtons();
  ReadSensors();
  FloorSelection();

  static int elevator_state = stop;

   switch (elevator_state)
  {
    case down:

    if (registered[0] == true || registered[1] == true)
    {
      if (sensorstate[2] == LOW)
      {
      movedown();
      elevator_state = stop;
      }
    }

    break;

    case stop:

    if (registered[1] == true && sensorstate[1] == LOW)
    {
      motor_stop();
      registered[1] = false;

      for (int i=0;i<maxfloors;i++)
      {
        Serial.println (registered[i]);
      }

    }

    if (registered[0] == true && sensorstate[0] == LOW)
    {
      motor_stop();
      registered[0] = false;

      for (int i=0;i<maxfloors;i++)
      {
        Serial.println (registered[i]);
      }
    }

    break;
  }
}



void ReadButtons()
{   

  for (int i=0;i<maxfloors;i++)
  {
    buttonstate[i] = digitalRead (carcall_buttons[i]);
  }
}

void ReadSensors()
{   

  for (int i=0;i<maxfloors;i++)
  {
    sensorstate[i] = digitalRead (floor_sensors[i]);
  }
}

void FloorSelection()
{

  for (int i=0;i<maxfloors;i++)
  {
  if (buttonstate[0] != lastbuttonstate0)
  {
    if (buttonstate[0] == HIGH)
    {
    registered [0] = true;

    delay(100);
    Serial.println (registered [i]);
    }
  }

  if (buttonstate[1] != lastbuttonstate1)
  {
    if (buttonstate[1] == HIGH)
    {
    registered [1] = true;

    delay(100);
   Serial.println (registered [i]);
    }
  }

  if (buttonstate[2] != lastbuttonstate2)
  {
    if (buttonstate[2] == HIGH)
    {
    registered [2] = true;

    delay(100);
   Serial.println (registered [i]);
    }
  }
}
}

void motor_stop()
{

  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  Serial.println ("idle");

  digitalWrite(motor_up, LOW);
  digitalWrite(motor_down, LOW);
  digitalWrite(En, LOW);
} 

 void moveup()
{
  digitalWrite(led1, HIGH);
  digitalWrite(led2, LOW);
  Serial.println ("up");

  digitalWrite(motor_up, LOW);
  digitalWrite(motor_down, HIGH);
  digitalWrite(En, HIGH);
}


void movedown()
{
  digitalWrite(led1, LOW);
  digitalWrite(led2, HIGH);
  Serial.println ("down");

  digitalWrite(motor_up, LOW);
  digitalWrite(motor_down, HIGH);
  digitalWrite(En, HIGH);
} 

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的代码,您不会将所选楼层按照呼叫顺序存储到“数组”中。

您应该不断轮询按钮并按下按钮:

  1. 检查阵列的字节0。

  2. 如果它为0,请将地板存放在此处。

  3. 如果不是,请检查字节1(依此类推)

  4. 如果它可用(即== 0)且您的值与字节0不同,则将此处存储在此处。



  5. 您还应该轮询传感器值(以了解汽车的位置)和:

    1. 如果它在地板上,请检查它是否与阵列的第一个值相对应
    2. 如果是这样,停止汽车并将阵列的每个值向下移动1( array [0] = array [1]; array [1] = array [2]; array [2] = 0; 假设您只有三个值的历史记录)
    3. 请注意,您的历史记录可能比maxfloors常量长得多。在这种情况下,我建议在中进行 do {}以找到数组中的第一个可用点。

答案 1 :(得分:0)

我想我发现了你的问题,但我错了。函数中的数组和变量超出了switch语句的范围。至少,我认为这是问题所在。你应该真正使你的代码显示错误所需的最小代码,否则我们真的很难帮助你。我必须仔细阅读代码才能弄明白。我很确定你是否在函数参数中使用了引用传递,并在全局或主(循环)范围内声明数组,你的问题将得到解决。另外,除了void之外,你可以为函数使用不同的返回类型,比如int,但是你只能从函数中返回一个值,所以按引用传递最适合你的目的。请允许我通过引用来演示代码。它的编写方式,你的函数什么也不做,因为它们没有返回任何值,也没有修改任何现有的对象。此解决方案需要应用于修改或创建对象的所有函数以及switch语句。简而言之,在更大的范围内声明您的数组和变量,并通过引用传递以修改它们。我希望这可以帮助你。

int buttonstate[2];
int sensorstate[2];

void ReadButtons(&buttonstate)
{   

  for (int i=0;i<maxfloors;i++)
  {
    buttonstate[i] = digitalRead (carcall_buttons[i]);
  }
}

void ReadSensors(&sensorstate)
{   

  for (int i=0;i<maxfloors;i++)
  {
    sensorstate[i] = digitalRead (floor_sensors[i]);
  }
}