我已开始使用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);
}
答案 0 :(得分:0)
如果我正确理解您的代码,您不会将所选楼层按照呼叫顺序存储到“数组”中。
您应该不断轮询按钮并按下按钮:
检查阵列的字节0。
如果它为0,请将地板存放在此处。
如果不是,请检查字节1(依此类推)
如果它可用(即== 0)且您的值与字节0不同,则将此处存储在此处。
您还应该轮询传感器值(以了解汽车的位置)和:
请注意,您的历史记录可能比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]);
}
}