2016-01-13 34 views
1

我已經開始用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); 
} 

回答

0

如果我正確理解了您的代碼,那麼您不會將選定的樓層存儲到「按呼叫順序排列的數組」中。

你應該不斷查詢鍵,當按下一個:你的陣列的

  1. 校驗字節0。

  2. 如果它是0,請在此處存放地板。

  3. 如果不是的話,校驗字節1(等)

  4. 如果它是可用的(即== 0),你的價值是從0字節不同,那麼存儲地板這裏。



你也應該輪詢傳感器值(知道在哪裏的車)和:

  1. 如果是在地板上,檢查它是否對應於第一值的array
  2. 如果是這樣,請停下汽車並將陣列的每個值減1(array [0] = array [1]; array [1] = array [2]; array [2] = 0;假設你只有三個值的歷史記錄)

請注意,您的歷史記錄可能比maxfloors常數長得多。在這種情況下,我建議做一個do {},而找到數組中的第一個可用點。

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]); 
    } 
}