Arduino数据记录奇怪的形状

时间:2014-01-31 23:31:09

标签: logging arduino sd-card

我想读取两个输入并将它们放在SD卡上然后如果满足条件就会发推特。 问题是经过一些迭代我得到奇怪的形状而不是数字,程序冻结。 值得一提的是,arduino远离光源,因此通过屏蔽线连接以抑制噪声。

任何人都面临同样的问题?

我尝试将电阻的一条腿连接到5V,另一条连接到A0和 对A1也一样,我在SD上写它们没有任何问题;如果不 连接它产生随机数,也可以正常工作!。

值得说明的最后一行while (1>0)是由于需要不断推文。

源代码

#include <SPI.h> 
#include <WiFi.h>
#include <Twitter.h>
#include <SD.h>

File myFile;
char ssid[] = "...";  
char pass[] = "...";  

Twitter twitter("..."); 

int PV;
int LDR;

char tweetText[140];

int status = WL_IDLE_STATUS;
WiFiServer server(80);

void setup() {
    Serial.begin(9600);
    pinMode(10, OUTPUT);
    pinMode(0,INPUT);
    while ( status != WL_CONNECTED) { 
        Serial.print("Attempting to connect to SSID: ");
        Serial.println(ssid);
        status = WiFi.begin(ssid, pass);
        if (!SD.begin(4)) 
        {
            Serial.println("Card failed, or not present");
            return;
        }
        Serial.println("card initialized.");
        delay(10000);
    }
}

void tweet(char msg[]) {
    Serial.println("Connecting to Twitter");
    if(twitter.post(msg))
    {
        int status = twitter.wait(&Serial);
        if (status==200){
            Serial.println("Successful");
        } else {
            Serial.println("Tweet failed.");
            Serial.println(status);
        }
    } else {
        Serial.println("Connection to Twitter failed");
        Serial.println("20 Seconds timeout started");
        delay(20000);
    }
} 

void loop() {
    String dataString="";
    // read PV voltage from A0 and A1 then append to the string
    do {
        for (int analogPin=0; analogPin<2; analogPin++) {
            PV = analogRead(0);
            LDR= analogRead(1);
            int sensor=analogRead(analogPin);
            dataString += String(sensor);
            if (analogPin<1){
                dataString += ",";
            }
        }

        File dataFile = SD.open("datalog.txt", FILE_WRITE);
        if (dataFile) {
            dataFile.println(dataString);
            dataFile.close();
            Serial.println(dataString);
        } else {
            Serial.println("error opening datalog.txt");
        }

        if(PV>=1023) {
            Serial.println(PV);
            sprintf(tweetText,"A0>5volts and reads: %d. @MeghdadiAli." , PV, LDR);
            delay(50000);
            tweet(tweetText);
            Serial.println("A0>5volts");
        } else {
            Serial.println(PV);
            sprintf(tweetText,"A0<5volts and reads: %d. @MeghdadiAli.", PV, LDR);
            delay(50000);
            tweet(tweetText);
            Serial.println("A0 is not 5volts");
        }
    } while(1>0);
}

预期输出

它应该在每次迭代时写入A0和A1的数量,然后将其写在SD上写入的先前数据旁边

获得输出

这是我上次得到的:

1023,1011, 1023,1011,1023,1008, 1023,1011023,1008,1023r 1023,
1011023,1008023r 1023r ´z #þ½.D" " _DATALOG TXT 1023,997 - 23,
1011023 ë 10r 1023,997 - 23,1011023 ë 10r

(为商品添加换行符)

1 个答案:

答案 0 :(得分:1)

你正在do{}while内创建一个loop()循环,因为它们执行相同的操作没有任何意义,事实上,如果你查看temp文件夹中创建的.cpp(激活“详细编译) “从菜单中,你会发现类似的东西;

int main(){
  setup();
  while(1){
    loop();
  }
}

BUT

String dataString="";只被调用一次,然后dataString只被修改为ADDING char,所以它会一直增长,直到它溢出并对你的ram做坏事。

事实上,如果你看一下SD文件,你应该找到

read1,
read1, read1, read2,
read1, read1, read2, read1, read1, read2, read3,

等等

有2个解决方案:

  1. 删除do{}while循环,因为它是rendoundant,那样dataString将在循环结束时被破坏,并在开头重新创建(空);

    < / LI>
  2. dataString = "";do{for之间,不会破坏和重新创建变量,只是清除它的值。