Имеется шилд в5100, плохо читает флеш после замены карты с 8 гб на 16гб, использую библиотеку сд.фат, стандартные примеры так же не работает ошибка инициализации, хотя при создании папки mkdir все создается, а вот при попытке записать файл выдает ошибку, что не удалось открыть файл
Код (C++): #include <SPI.h> #include <SD.h> #include "EmonLib.h" // библиотека для работы I²C #include <Wire.h> #include <Ethernet.h> #include "TroykaRTC.h" #define FTPWRITE EnergyMonitor emon[3]; //SdFat SD; #define SD_CS_PIN 4 #define led 2 RTC clock; #define LEN_TIME 12 #define LEN_DATE 12 #define LEN_DOW 12 // массив для хранения текущего времени char time[LEN_TIME]; // массив для хранения текущей даты char date[LEN_DATE]; // массив для хранения текущего дня недели char weekDay[LEN_DOW]; char *month[12] = {"jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"}; byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 }; // change to your network settings IPAddress ip( 192, 168, 19, 25 ); IPAddress gateway( 192, 168, 19, 199 ); IPAddress subnet( 255, 255, 255, 0 ); // change to your server IPAddress server( 192, 168, 19, 151 ); EthernetClient client; EthernetClient dclient; char outCount; const uint8_t PIN_direction_TX_RX = 10; int d,h,m,s,j,per1,per2,per3=0,chet=0,choose=0; uint16_t download=0,download1=0; char temp1[20],DateChanged[16],SensWater1[50],buf[16],outBuf[128],leak[50]; char timerD[100][16]; String dataString = "",CritErrorVOLT = "",CritErrorAMP = "",TempString = "",WaterString ="",WaterLeak =""; void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // выводим сообщение в Serial-порт о поиске карты памяти Serial.println("Initializing SD card..."); // если microSD-карта не была обнаружена if (!SD.begin(4)) { // выводим сообщение об ошибке Serial.println("Card failed, or not present"); // don't do anything more: return; } else { Serial.println("Card initialized."); } SD.mkdir("met"); clock.begin(); clock.set(__TIMESTAMP__); Ethernet.begin(mac, ip, gateway, gateway, subnet); pinMode(PIN_direction_TX_RX, OUTPUT); // устанавливаем режим работы вывода PIN_direction_TX_RX, как "выход" digitalWrite(PIN_direction_TX_RX, LOW); // устанавливаем уровень логического «0» на выводе PIN_direction_TX_RX (переводим модуль в режим приёма данных) pinMode(7,OUTPUT); emon[0].voltage(3, 255, 1.0); // Voltage: pin, calib, phasecal, line phase. emon[0].current(0, 90); // Current: pin, calib. emon[1].voltage(4, 258, 1.0); // Voltage: pin, calib, phasecal, line phase. emon[1].current(1, 100); // Current: pin, calib. emon[2].voltage(5, 256, 1.0); // Voltage: pin, calib, phasecal, line phase. emon[2].current(2, 100); // Current: pin, calib. } void loop() { int IRMS[3]; int voltage[3]; clock.read(); // сохраняем текущее время, дату и день недели в переменные clock.getTimeStamp(time, date, weekDay); char s[16]; strcpy(s, "15.11.2014");//data если часы установлены) // выводим в serial порт текущее время, дату и день недели download++; download1++; Serial.println(download); Serial.println(s); for(int i=0;i<3;i++) { // perform measurements emon[i].calcVI(20,100); // 2 h.c. for buffering + 14 h.c. for measuring IRMS[i]=emon[i].Irms; //extract Vrms into Variable voltage[i]= emon[i].Vrms; // convert and pack data } digitalWrite(PIN_direction_TX_RX, HIGH);//Термопары delay(1); Serial.println('R'); delay(10); digitalWrite(PIN_direction_TX_RX, LOW); int i=0; if(Serial.available()){delay(100); while( Serial.available() && i< 21) {temp1[i++] = Serial.read();} temp1[i++]='\0';} if(i>0) { digitalWrite(PIN_direction_TX_RX, LOW); // читаем данные с порт delay(10); // Выводим что приняли с других устройств } digitalWrite(PIN_direction_TX_RX, HIGH);//Утечки delay(1); Serial.println('L'); delay(10); digitalWrite(PIN_direction_TX_RX, LOW); int k=0; if(Serial.available()){delay(100); while( Serial.available() && k< 21) {leak[k++] = Serial.read();} leak[k++]='\0';} if(k>0) { digitalWrite(PIN_direction_TX_RX, LOW); // читаем данные с порт delay(10); // Выводим что приняли с других устройств } digitalWrite(PIN_direction_TX_RX, HIGH);// Датчики воды delay(1); Serial.println('A'); delay(10); digitalWrite(PIN_direction_TX_RX, LOW); int j=0; if(Serial.available()){delay(100); while( Serial.available() && j< 51) {SensWater1[i++] = Serial.read();} SensWater1[i++]='\0';} if(i>0) { digitalWrite(PIN_direction_TX_RX, LOW); // читаем данные с порта delay(10); // Выводим что приняли с других устройств } dataString = String(time); dataString += " "; dataString += String(date); dataString += " "; dataString += String(voltage[0]); dataString += " "; dataString += String(voltage[1]); dataString += " "; dataString += String(voltage[2]); dataString += " "; dataString += String(abs(IRMS[0])); dataString += " "; dataString += String(abs(IRMS[1])); dataString += " "; dataString += String(abs(IRMS[2])); WaterString = String(time); WaterString += " "; WaterString += String(date); WaterString += " "; WaterString += String(SensWater1); TempString = String(time); TempString += " "; TempString += String(date); TempString += " "; TempString += " 5555reft"; //TempString += temp1; sprintf(buf, "%s%c%c%s%s%c%s" ,"metropolis/",s[0],s[1], month[atoi(&s[3])-1], &s[8],'P',".txt"); //P-power electro choose=1; Serial.println(buf); Serial.println(dataString); delay(10); saveSD(); if(download>30)// установка времени передачи файла { if(doFTP()) { Serial.println(F("FTP OK")); download=0; } else Serial.println(F("FTP FAIL")); } choose=2; Serial.println(TempString); sprintf(buf, "%s%c%c%s%s%c%s" ,"metropolis/", s[0],s[1], month[atoi(&s[3])-1], &s[8],'R',".txt"); //R-refrigerators delay(10); saveSD(); if(download1>60)// установка времени передачи файла { if(doFTP()) { Serial.println(F("FTP OK")); download1=0; } else Serial.println(F("FTP FAIL")); } delay(560); } void saveSD() { /* if(strcmp(DateChanged,buf)==0) { chet++; digitalWrite(PIN_direction_TX_RX, HIGH); delay(1); Serial.println('D'); удаление с показаний счетчика delay(10); digitalWrite(PIN_direction_TX_RX, LOW); //77169 } */ //s адресует день, &s[3] - начало месяца, &s[8] - начало последних цифр года //strcpy(DateChanged,buf); // создаём файл для записи File dataFile = SD.open(buf, FILE_WRITE); // если файл доступен для записи if (dataFile) { // сохраняем данные if(choose==1) { dataFile.println(dataString); dataFile.close(); } else if(choose==2) { dataFile.println(TempString); dataFile.close(); } else if(choose==3) { dataFile.println(CritErrorVOLT); dataFile.close(); } else if(choose==4) { dataFile.println(CritErrorAMP); dataFile.close(); } else if(choose==5) { dataFile.println(leak); dataFile.close(); } } else { // если файл не доступен Serial.print("Error opening "); Serial.println(buf); } } File fh; byte doFTP() { #ifdef FTPWRITE fh = SD.open(buf,FILE_READ); #else SD.remove(buf); fh = SD.open(buf,FILE_WRITE); #endif if(!fh) { Serial.println(F("SD open fail")); return 0; } #ifndef FTPWRITE if(!fh.seek(0)) { Serial.println(F("Rewind fail")); fh.close(); return 0; } #endif Serial.println(F("SD opened")); if (client.connect(server,21)) { Serial.println(F("Command connected")); } else { fh.close(); Serial.println(F("Command connection failed")); return 0; } if(!eRcv()) return 0; client.println(F("USER anonymous")); if(!eRcv()) return 0; client.println(F("PASS powerknf@gmail.ru")); if(!eRcv()) return 0; client.println(F("SYST")); if(!eRcv()) return 0; client.println(F("Type I")); if(!eRcv()) return 0;
Код (C++): client.println(F("PASV")); if(!eRcv()) return 0; char *tStr = strtok(outBuf,"(,"); int array_pasv[6]; for ( int i = 0; i < 6; i++) { tStr = strtok(NULL,"(,"); array_pasv[i] = atoi(tStr); if(tStr == NULL) { Serial.println(F("Bad PASV Answer")); } } unsigned int hiPort,loPort; hiPort = array_pasv[4] << 8; loPort = array_pasv[5] & 255; Serial.print(F("Data port: ")); hiPort = hiPort | loPort; Serial.println(hiPort); if (dclient.connect(server,hiPort)) { Serial.println(F("Data connected")); } else { Serial.println(F("Data connection failed")); client.stop(); fh.close(); return 0; } #ifdef FTPWRITE client.print(F("STOR ")); client.println(buf); #else client.print(F("RETR ")); client.println(buf); #endif if(!eRcv()) { dclient.stop(); return 0; } #ifdef FTPWRITE Serial.println(F("Writing")); byte clientBuf[64]; int clientCount = 0; while(fh.available()) { clientBuf[clientCount] = fh.read(); clientCount++; if(clientCount > 63) { dclient.write(clientBuf,64); clientCount = 0; } } if(clientCount > 0) dclient.write(clientBuf,clientCount); #endif dclient.stop(); Serial.println(F("Data disconnected")); if(!eRcv()) return 0; client.println(F("QUIT")); if(!eRcv()) return 0; client.stop(); Serial.println(F("Command disconnected")); fh.close(); Serial.println(F("SD closed")); return 1; } byte eRcv() { byte respCode; byte thisByte; while(!client.available()) delay(1); respCode = client.peek(); outCount = 0; while(client.available()) { thisByte = client.read(); Serial.write(thisByte); if(outCount < 127) { outBuf[outCount] = thisByte; outCount++; outBuf[outCount] = 0; } } if(respCode >= '4') { efail(); return 0; } return 1; } void efail() { byte thisByte = 0; client.println(F("QUIT")); while(!client.available()) delay(1); while(client.available()) { thisByte = client.read(); Serial.write(thisByte); } client.stop(); Serial.println(F("Command disconnected")); fh.close(); Serial.println(F("SD closed")); } void readSD() { fh = SD.open(buf,FILE_READ); if(!fh) { Serial.println(F("SD open fail")); return; } while(fh.available()) { Serial.write(fh.read()); } fh.close(); }
Но даже стандартный код не работает, точнее как то через раз, состав оборудования шилд5100 и мега2560 Код (C++): /* SD card read/write This example shows how to read and write data to and from an SD card file The circuit: * SD card attached to SPI bus as follows: ** MOSI - pin 11 ** MISO - pin 12 ** CLK - pin 13 ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN) created Nov 2010 by David A. Mellis modified 9 Apr 2012 by Tom Igoe This example code is in the public domain. */ #include <SPI.h> #include <SD.h> File myFile; void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.print("Initializing SD card..."); if (!SD.begin(4)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); // open the file. note that only one file can be open at a time, // so you have to close this one before opening another. myFile = SD.open("test.txt", FILE_WRITE); // if the file opened okay, write to it: if (myFile) { Serial.print("Writing to test.txt..."); myFile.println("testing 1, 2, 3."); // close the file: myFile.close(); Serial.println("done."); } else { // if the file didn't open, print an error: Serial.println("error opening test.txt"); } // re-open the file for reading: myFile = SD.open("test.txt"); if (myFile) { Serial.println("test.txt:"); // read from the file until there's nothing else in it: while (myFile.available()) { Serial.write(myFile.read()); } // close the file: myFile.close(); } else { // if the file didn't open, print an error: Serial.println("error opening test.txt"); } } void loop() { // nothing happens after setup }
c переменным успехом запускается стандартный скетч, раз через раз, карта исправна, на компьютере определяется файлы хранит,бенчы проходит
Бенчмарк ардуиновский тоже проходит, проблема возникает тогда,когда после проверки моего скетча, я загружаю кардИнфо или бенч, он не работает пока не переставить юсб
у меня такое было с прямым подключением - всё дело в напряжении если ардуина 5В а Сд 3.3В, при этом надо делитель ставить на МОСИ и СС , а на МИСО не надо и всё заработало стабильно
Все же походу дело в скетче, где только не пойму, так как при загрузке только стандартных скечтей вроде все стабильно