我想读取两个输入并将它们放在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
(为商品添加换行符)
答案 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个解决方案:
删除do{}while
循环,因为它是rendoundant,那样dataString
将在循环结束时被破坏,并在开头重新创建(空);
dataString = "";
在do{
和for
之间,不会破坏和重新创建变量,只是清除它的值。