2013-07-22 147 views
0

我已經構建了一個arduino草圖,試圖對來自幾個傳感器的模擬值做幾個不同長度的窗口和一些簡單的計算(平均值/方差)。以前我有一個傳感器按照預期工作的相同代碼,但下面的代碼已經擴展了一些小的for循環,所以現在所有的傳感器都應該運行。arduino沒有打印到串行

我簡直無法得到任何東西來打印到串行 - 即使是兩個序列打印我放入安裝程序和啓動循環只是爲了調試 - 但代碼編譯和上傳沒有任何錯誤或警告。

對於包含整個草圖我很抱歉,我想不出如何分開顯示。

long int currentTime = 0; 
long int stopTime[2] = {0,0}; 
long int shortWindowTime = 0; 
int shortVal[2][40]; 
int reflexWindowStart = 0; 
int reflexWindowTime = 0; 
int reflexVal[2][500]; 
int mean[2] = {0,0}; 
unsigned int variance[2] = {0,0}; 
int lowVal[2] = {0,0}; 
int peakVal[2] = {0,0}; 
int lowIndex[2] = {0,0}; 
int peakIndex[2] = {0,0}; 
int stopIndex[2] = {0,0}; 
boolean stopped[2] = {false,false}; 

void setup(){ 
    Serial.begin(9600); 
    Serial.println("wtf?"); 
    for(int i=0;i<2;i++){ 
    for(int j=0;j<40;j++){ 
     shortVal[i][j] = 0; 
    } 
    for(int j=0;j<500;j++){ 
     reflexVal[i][j] = 1023; 
    } 
    } 

} 

void loop() { 

    Serial.println("wtf?"); 

    currentTime = micros(); 

    if(currentTime - shortWindowTime > 500){ 

    shortWindowTime = currentTime; 

    writeShortWindow(); 

    meanVariance(); 

    if(reflexWindowStart == 0){ 
     reflexWindow(); 
    } 
    reflexWindowStart++; 
    if(reflexWindowStart > 9){ 
     reflexWindowStart = 0; 
    } 
    } 
} 

void writeShortWindow(){ 
    for(int i=0;i<2;i++){ 
    for(int j=39; j>0; j--){ 
     shortVal[i][j] = shortVal[i][j-1]; 
    } 
    int ground = analogRead(A5); 
    shortVal[0][0] = analogRead(A1); 
    analogRead(A5); 
    shortVal[i][0] = analogRead(A2); 
    } 
} 

void meanVariance(){ 
    for(int i=0;i<2;i++){ 
    for(int j=0; j<39; j++){ 
     mean[i] = mean[i] + shortVal[i][j]; 
    }  
    mean[i] = mean[i]/40; 
    for(int j=0; j<39; j++){ 
     variance[i] = variance[i] + sq(mean[i] - shortVal[i][j]) ; 
    } 
    variance[i] = variance[i]/40; 
    } 
} 


void reflexWindow(){ 

    for(int i=0;i<2;i++){ 
     if(stopped[i] == true){ 
     if((millis() - stopTime[i] > 20) && (peakVal[i] - shortVal[i][0] > 20) && (variance[i] <= 1)){ 
      stopped[i] = false; 
      stopIndex[i] = 0; 
      Serial.println("................................NOTstopped"); 
     } 
     } 
    } 

    for(int i=0;i<2;i++){ 
    if(stopped[i] == false){ 

     lowVal[i] = 1023; 
     peakVal[i] = 0; 

     for(int j=stopIndex[i]; j>0; j--){ 
     reflexVal[i][j] = reflexVal[i][j-1]; 
      if(reflexVal[i][j] < lowVal[i]){ 
      lowVal[i] = reflexVal[i][j]; 
      lowIndex[i] = j; 
      } 
     } 

     reflexVal[i][0] = shortVal[i][0]; 



     for(int j=lowIndex[i]; j>=0; j--){ 
     if(reflexVal[i][j] > peakVal[i]){ 
      peakVal[i] = reflexVal[i][j]; 
     } 
     } 
    } 
    } 


    for(int i=0;i<2;i++){ 
    if(stopped[i] == false){ 
     if(peakVal[i] - lowVal[i] >= 50){ 
     Serial.print(i); 
     Serial.println("...................................stopped"); 
     stopTime[i] = millis(); 
     stopped[i] = true; 
     } 
    } 
    } 

    for(int i=0;i<2;i++){ 
    if(stopIndex[i] < 499){ 
     stopIndex[i]++; 
    } 
    } 

    Serial.print(shortVal[0][0]); 
    Serial.print(" ... "); 
    Serial.print(lowVal[0]); 
    Serial.print(" ... "); 
    Serial.print(peakVal[0]); 
    Serial.print(" ........ "); 
    Serial.print(shortVal[1][0]); 
    Serial.print(" ... "); 
    Serial.print(lowVal[1]); 
    Serial.print(" ... "); 
    Serial.println(peakVal[1]); 
} 
+0

你有沒有試過重置Arduino?我似乎記得我有類似的問題...串口控制檯有時會斷開連接,但它不會警告您...嘗試將程序重新上傳到電路板,然後連接電纜。 (我假設你使用USB連接?)我認爲這是我對我的做法。 – user3728501

+0

我已經嘗試通過USB上傳多次,當我運行任何其他素描時,我知道它已經打印並且運行得很好。歡呼雖然 – itsmrjack

+0

只是一個預感,但你可以嘗試移動(一些)你的代碼出了安裝程序?我不是專家,但我有一種預感,那就是設置,它只能初始化內存中的數據。如果你把循環讀取和寫入循環()是否有所作爲?我正在考慮在安裝過程中以串行方式串行導致問題。這可能是我說話的廢話。 (我認爲我們在uni上有一個fpga的問題,這種事情就是解決方案) – user3728501

回答

0

如果您有萊昂納多板,您很可能在設置功能中看不到Serial.print。
試着改變你的設置,以這個(注意額外的while循環等待串行)

void setup(){ 
    Serial.begin(9600); 
    while (!Serial); 
    Serial.println("wtf?"); 
    for(int i=0;i<2;i++){ 
    for(int j=0;j<40;j++){ 
     shortVal[i][j] = 0; 
    } 
    for(int j=0;j<500;j++){ 
     reflexVal[i][j] = 1023; 
    } 
    } 
} 

這背後的原因,你可以在萊昂納多http://arduino.cc/en/Guide/ArduinoLeonardo#toc3 Arduino的文檔,但在短期看是萊昂納多犯規復位串行端口打開串行流時。

+0

感謝你的建議,但我實際上在Uno上,反正這仍然不能解釋爲什麼在系統啓動時打印循環不運行。 – itsmrjack

+0

然後我猜你正在耗盡內存,這導致這很難調試錯誤,因爲沒有錯誤在編譯中顯示。嘗試將頂部所有變量的字節數加起來,看看是否是這種情況。有關內存的更多信息可以在這裏找到http://arduino.cc/en/Tutorial/Memory – sjunnesson

+0

我做了一個快速查看,只是這一行「int reflexVal [2] [500];」是增加2000個字節到其中Arduino Uno共有2048個SRAM。所以我認爲你的一些問題肯定與內存有關。 – sjunnesson