2014-01-14 79 views
5

我想要一個小的BMP085晴雨表項目啓動和運行。我希望能夠在不同的操作模式(MODE_PRESSURE和MODE_ALT)之間切換。我有MODE_PRESSUREMODE_ALT定義爲const intArduino:如果比較參數

const int MODE_PRESSURE = 1; // display pressure and temp 
const int MODE_ALT  = 2; // display altitude relative to sea level 
int mode;      // stores the current mode 

void setup { 
    mode = MODE_PRESSURE; 
} 

void loop { 

    // Read mode button and set mode accordingly 
    int buttonPressed = readButtons(); 

    switch(buttonPressed) { 
    case BTN_MODE: 
     if(mode == MODE_PRESSURE) { mode = MODE_ALT; } 
     if(mode == MODE_ALT) { mode = MODE_PRESSURE; } 
     Serial.println(mode); // <<-- always prints 1 ?! 
     break; 
    } 
} 

當按下模式按鈕時,我想切換當前模式。但我卡在if(mode == MODE_PRESSURE)。這種說法莫名其妙地從來沒有評估爲真......?

我不是很流利的C,有什麼我失蹤?我能否比較const intint變量?

P.S .:我也嘗試#define MODE_PRESSURE和MODE_ALT,和const byte,但似乎沒有任何工作。

回答

4

添加else如下:

if(mode == MODE_PRESSURE) 
     mode = MODE_ALT; 
    else if(mode == MODE_ALT) # although not need but keep if here also 
     mode = MODE_PRESSURE; 

你可以使用嵌套開關:

switch(mode){ 
    case MODE_PRESSURE: mode = MODE_ALT; 
      break; 

    case MODE_ALT: mode = MODE_PRESSURE; 
      break; 
} 
+0

Aaahhhhgggrr,當然。我一定是在睡覺!謝謝,今晚將再次在家時試試。 – Elmer

+1

@Elmer考慮一下,如果你已經把if語句的主體放在它自己的一行上,並且適當的縮進,你是否會寫這個bug。 – Lundin

+0

@Lundin我以前在其中有多行,但嘗試了各種各樣的東西。這只是那些睡眠有所幫助的日子(夜晚)之一。一個好,你贏了一些,你鬆了一些:) – Elmer

0

你的第一個ifmodeMODE_ALT。這將迫使第二個if永遠是true

添加else到第二個測試:

else if(mode == MODE_ALT) ... 
4

你每次重置模式回壓。改變你的if語句來

if (mode == MODE_PRESSURE) 
    mode = MODE_ALT; 
else 
    mode = MODE_PRESSURE: 

或者,如果你想要一個襯墊要麼

mode = mode == MODE_PRESSURE ? MODE_ALT: MODE_PRESSURE; 

mode = MODE_PRESSURE + MODE_ALT - mode; 
+0

杯確實更好的答案和好建議。 –

+0

對於單行選擇+1,但考慮使用xor:'0x03^mode'(如果'mode!= 1 &&模式返回'0'!= 2') –

+0

是 - 這對於一個襯裏來說總是有問題:當這個值不是指定的兩個中的一個時。有很多方法可以在兩個值之間切換,一些非常昂貴,例如mode = 2/mode。 – cup

0

你缺少 「其他」 兩項IFS之間。試着將你的代碼放在腦海中,你會看到如果第一個如果是真的,第二個也是真的,並設置MODE_PRESSURE。

1

原因是當模式等於PRESSURE時,您將模式分配給ALT。但是你沒有使用任何break語句,所以它會在第二個條件中再次將模式設置爲PRESSURE。

這裏是樣品溶液代碼:

#include <stdio.h> 

const int BTN_MODE = 0; 
const int MODE_PRESSURE = 1; // display pressure and temp 
const int MODE_ALT = 2; // display altitude relative to sea level 
int mode; // stores the current mode 

void setup() 
{ 
    mode = MODE_PRESSURE; 
} 

void loop() 
{ 

    // Read mode button and set mode accordingly 
    // int buttonPressed = readButtons(); 
    int buttonPressed = BTN_MODE; 

    switch (buttonPressed) 
    { 
     case 0: 
      if (mode == MODE_PRESSURE) 
      { 
       mode = MODE_ALT; 
       break; 
      } 
      if (mode == MODE_ALT) 
      { 
       mode = MODE_PRESSURE; 
       break; 
      } 
      //Serial.println(mode); // <<-- always prints 1 ?! 
      break; 
    } 
    printf(" The mode value is : %d\n", mode); 
} 

void main() 
{ 
    setup(); 
    loop(); 
}