2017-02-24 80 views
2

我想用arduino yun输出一台机器生成的部件数量到谷歌电子表格。通过我的设置,我可以将数据暂时输出到电子表格。但是,一段时间后,云停止工作。我用红色LED指示代码正在运行,我不能再看到端口列表中的arduino。重置32u4芯片会使LED重新亮起,表示代码正在运行,但该板仍然不出现在端口菜单中。Arduino yun几小时后停止工作

我已经在我们的车间进行过测试,它已经运行了7-12小时,没有任何问题。只有当我们把它带到生产车间时,我们才会开始遇到这些问题。有谁知道这个问题可能是什么?这里是代码的最相关的部分:

#include <elapsedMillis.h> 
#include <Process.h> 
#include <Bridge.h> 
#include "TimeLib.h" 

// On Arduino: 0 - 1023 maps to 0 - 5 voltsf 
#define VOLTAGE_MAX 5.0 
#define VOLTAGE_MAXCOUNTS 1023.0 

unsigned int buttonCount = 0; 
float voltage = 0; 
elapsedMillis timeSinceLastCycle = 0; 
elapsedMillis transmitData = 0; 
int pressFlag = 0; 
Process date; 
int hours, minutes, seconds; 
int lastSecond = -1; 
Process sendData; 

String printDate() { 

    // String currTime = String(hours) + ":" + String(minutes) + ":" + String(seconds); 

    if (lastSecond != seconds) { // if a second has passed 
    // print the time: 
    if (hours <= 9) { 
     Console.print("0"); // adjust for 0-9 
    } 
    Console.print(hours); 
    Console.print(":"); 
    if (minutes <= 9) { 
     Console.print("0"); // adjust for 0-9 
    } 
    Console.print(minutes); 
    Console.print(":"); 
    if (seconds <= 9) { 
     Console.print("0"); // adjust for 0-9 
    } 
    Console.println(seconds); 

    // restart the date process: 
    if (!date.running()) { 
     date.begin("date"); 
     date.addParameter("+%T"); 
     date.run(); 
    } 
    } 

    //if there's a result from the date process, parse it: 
    while (date.available() > 0) { 
    // get the result of the date process (should be hh:mm:ss): 
    String timeString = date.readString(); 

    // find the colons: 
    int firstColon = timeString.indexOf(":"); 
    int secondColon = timeString.lastIndexOf(":"); 

    // get the substrings for hour, minute second: 
    String hourString = timeString.substring(0, firstColon); 
    String minString = timeString.substring(firstColon + 1, secondColon); 
    String secString = timeString.substring(secondColon + 1); 


    // convert to ints,saving the previous second: 
    hours = hourString.toInt(); 
    minutes = minString.toInt(); 
    lastSecond = seconds;   // save to do a time comparison 
    seconds = secString.toInt(); 
    String currTime = hourString + ":" + minString + ":" + String(seconds); 
    return currTime; 
    } 
} 

void checkVoltage() { 

    int sensorValue = analogRead(A0); 
    voltage = sensorValue * (VOLTAGE_MAX/VOLTAGE_MAXCOUNTS); 

    Console.println(voltage); 
    delay(50); 
    if (voltage >= 4.9 && pressFlag == 0) { 

    Console.println("Delaying"); 
    sensorValue = analogRead(A0); 
    voltage = sensorValue * (VOLTAGE_MAX/VOLTAGE_MAXCOUNTS); 

    if (pressFlag == 0 && voltage >= 4.9) { 

     unsigned long int intCycleTime = timeSinceLastCycle; 
     timeSinceLastCycle = 0; 
     digitalWrite(LED_BUILTIN, LOW); // turn the LED on (HIGH is the voltage level) 

     printDate(); 
     String pressTime = printDate(); 

     Console.print("PressTime is "); 
     Console.println(pressTime); 

     buttonCount++; 
     Console.println(buttonCount); 

     pressFlag = 1; 



     String part1 = "curl -X POST -H \"Content-Type: application/json\" -d '{\"value1\":\""; 
     String timeString = pressTime; 
     Console.print(timeString + " seconds"); 
     String part2 = "\",\"value2\":\""; 
     String numParts = String(buttonCount); 
     String part3 = "\",\"value3\":\""; 
     String strCycleTime = String(intCycleTime/1000); // + " seconds"; 
     String part4 = "\"}' https://maker.ifttt.com/trigger/arduino2Request/with/key/gL8YmxeaUChOMJvmwpdXp -k"; 
     //curl -X POST -H "Content-Type: application/json" -d '{"value1":"1","value2":"2","value3":"3"}' https://maker.ifttt.com/trigger/arduino2Request/with/key/gL8YmxeaUChOMJvmwpdXp 

     String curlString = part1 + timeString + part2 + numParts + part3 + strCycleTime + part4; 

     // The curl string sends data to oue excel spreadhsheet using the IFTTT web service 

     sendData.runShellCommandAsynchronously(curlString); 

     elapsedMillis breakTimer = 0; 
     /*while(sendData.running()){ 

      if(breakTimer > 5*1000){ 
      break; 
      } 
     } */ 


     Console.print("Data Available: "); // A value of 32 indicates a successful transmission of data, 0 also works if run asynchronously. 
     Console.println(sendData.available()); 

     digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) 

    } 

    } 
    else if (voltage < 2.5) { 
    pressFlag = 0; 
    } 

} 

void setup() { 

    Bridge.begin(); 
    Console.begin(); 
    pinMode(LED_BUILTIN, OUTPUT); 
    digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) 

    // run an initial date process. Should return: 
    // hh:mm:ss : 
    if (!date.running()) { 
    date.begin("date"); 
    date.addParameter("+%T"); 
    date.run(); 
    } 
} 

void loop() { 

    checkVoltage(); 

    if ((timeSinceLastCycle > 300000) && (transmitData > 300000)) { // If 5 minutes have elapsed without a part being produced, output that the arduino is transmitting even if not part is available 
    sendData.runShellCommand("curl -X POST -H \"Content-Type: application/json\" -d '{\"value1\":\"1\",\"value2\":\"Arduino Transmitting\"}' https://maker.ifttt.com/trigger/transmitData/with/key/gKRo-zSur5rj6rD5rviCaV2RHI5g56Dy0Vc0S_XJ-oO -k"); 
    transmitData = 0; 
    } 
} 

更新:我增加了一系列的打印语句到checkVoltage功能。上面的代码已经更新,以反映这一点。我发现它尝试异步使用sendData.runShellCommand时会挂起。输出类似于

1.58 
1.54 
5.00 
Delaying 
PressTime is n" -d 
3 

可能的网络连接切割出试图runShellCommand导致此问题的时候?

+0

的事情之一,我可以看到出问题随着时间的推移'buttonCount'溢出。无论如何,代码是不完整的。 –

+0

问题是,在溢出成为问题之前,它会失败一段时间。另外,我并不关心buttonCount的确切值,因为我的数据处理脚本只检查是否有数字并自己重新输入条目。这可以防止计算机在短时间内掉电并且该值重置为0时出现错误计数。我已更新代码以包含完整的代码。 – MacMixer13

+0

由于之前我有过打印语句,因此存在一些明显的差距,特别是在printDate函数中。我带他们出去希望缩小代码将解决我的问题,但没有运气 – MacMixer13

回答

1

因此,在遵循user3629249的解决方案之后,此问题似乎已解决。现在已经有了多周的无错误运行时间。 user3629249,如果你想重新发布你的建议作为答案,我会接受它。感谢user3629249和Patrick Trentin的帮助!

我的更新ProcessDate功能现在包含:

if(date.available() >0){ 
    while (date.available() > 0) { 
    // get the result of the date process (should be hh:mm:ss): 
    String timeString = date.readString(); 

    // find the colons: 
    int firstColon = timeString.indexOf(":"); 
    int secondColon = timeString.lastIndexOf(":"); 

    // get the substrings for hour, minute second: 
    String hourString = timeString.substring(0, firstColon); 
    String minString = timeString.substring(firstColon + 1, secondColon); 
    String secString = timeString.substring(secondColon + 1); 


    // convert to ints,saving the previous second: 
    lastSecond = seconds;   // save to do a time comparison 
    lastMinute = minutes; 
    lastHour = hours; 
    hours = hourString.toInt(); 
    minutes = minString.toInt(); 
    seconds = secString.toInt(); 
    String currTime = hourString + ":" + minString + ":" + String(seconds); 
    return currTime; 
} 
else{ 
     String currTime = ""; // If there is no result from the date process, return nothing. Should not happen. 
     return currTime; 
     } 
    }