完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在 arduino 论坛上发布了这个,但我想也许这里有人可以提供帮助。我正在从事一个涉及数据收集的学校项目。我们每分钟采集 12,000 个样本,并将这些数据导出到一个 csv 文件中,该文件存储在我们的 arduino 附带的 SD 卡数据记录器屏蔽上。这部分工作完美,但是,在收集这些数据之后,我们需要通过 wifi 将它发送到某个东西(不管是什么,可以是服务器、网页等)。目前要做到这一点,我们有一个可以工作的 arduino/ESP8266 设置,可以逐行读取 SD 卡文件并将其发送到 thingspeak。然而,Thingspeak 非常慢(每 15 秒 1 个数据点),以我们的数据速率,发送一分钟的数据需要 20 天。 我们尝试过: - 使用 json 发送批量数据(一次最多只能获取 7 个样本) - 发送一个包含多个条目的字符串并在发送后对其进行解析(遇到 Arduino 的内存限制问题,只能使字符串这么长) 有没有人对如何提高数据发送速度有任何建议?有可能吗?非常感谢! #include #include #define errorHalt(msg) {Serial.println(F(msg)); while(1);} #define RX 2 #define TX 3 String AP = "[因隐私原因删除]"; // 改变我 String PASS = ""; // CHANGE ME String API = "[因隐私原因删除]"; // 改变我 String HOST = "api.thingspeak.com"; 字符串字段=“字段1”; int countTrueCommand; int 计数时间命令; 布尔值 = false; 字符串 valSensor = ""; const int cs = 10; 软件序列号 esp8266(RX, TX); void setup() { Serial.begin(9600); esp8266.开始(9600); sendCommand("AT",5,"OK"); sendCommand("AT+CWMODE=1",5,"OK"); sendCommand("AT+CWJAP=""+ AP +"",""+ PASS +""",20,"OK"); 引脚模式(10,输出); // 查看卡是否存在 if (!SD.begin(cs)) { Serial.println("Card 初始化失败,或不存在"); 返回; 文件 myfile = SD.open("ADC~4BE3.CSV"); Serial.println("打开"); // 如果文件可用,读取文件 if (myfile) { myfile.seek(0); size_t n; // 带分隔符的返回字段的长度。 字符 str[20];// 必须包含带分隔符和零字节的最长字段。 整数计数=0; while (myfile.available()) { // 读取文件并打印字段。 while (true) { n = readField(&myfile, str, sizeof(str), ",n"); // 如果出错或在 EOF 时完成。 如果(n == 0)中断; // 打印定界符的类型。 如果 (str[n-1] == ',' || str[n-1] == 'n') { // Serial.print(str[n-1] == ',' ? F("comma: ") : F("endl: ")); // 删除分隔符。 海峡 [n-1] = 0; 计数++; } else { // 在eof处,太长,或者读取错误。太长是错误的。 Serial.print(myfile.available() ? F("error: ") : F("eof: ")); } // 打印字段。 如果 ((count%2)==0){ Serial.println(str); valSensor =海峡; String getData = "GET /update?api_key="+ API +"&"+ field +"="+String(str); sendCommand("AT+CIPMUX=1",5,"OK"); sendCommand("AT+CIPSTART=0,"TCP",""+ HOST +"","+ PORT,15," esp8266.println(getData);延迟(15000);countTrueCommand++; sendCommand("AT+CIPCLOSE=0",5,"OK"); } } } myfile.close(); Serial.write("关闭"); } } void loop() { } int getSensorData(){ return random(1000); // 替换为 SD 卡文件 } void sendCommand(String command, int maxtime, char readReplay[]) { Serial.print(countTrueCommand); Serial.print(". 在命令 => "); 串行打印(命令); 序列号.print(" "); while(countTimeCommand < (maxTime*1)) { esp8266.println(command);//at+cipsend if(esp8266. { 找到 = 真; 休息; } countTimeCommand++; } if(found == true) { Serial.println("OYI"); countTrueCommand++; countTimeCommand = 0; } if(found == false) { Serial.println("失败"); countTrueCommand = 0; countTimeCommand = 0; } 发现 = 假; } size_t readField(File* file, char* str, size_t size, char* delim) { char ch; size_t n = 0; while ((n + 1) < size && file->read(&ch, 1) == 1) { // 删除 CR。 如果(ch == 'r'){ 继续; str[n++] = ch; 如果 (strchr(delim, ch)) { 中断; } } str[n] = ' |