Помогите пожалуйста

Тема в разделе "Arduino & Shields", создана пользователем Супчик, 16 мар 2018.

  1. Супчик

    Супчик Нуб

    Имеется шилд в5100, плохо читает флеш после замены карты с 8 гб на 16гб, использую библиотеку сд.фат, стандартные примеры так же не работает ошибка инициализации, хотя при создании папки mkdir все создается, а вот при попытке записать файл выдает ошибку, что не удалось открыть файл
     
  2. b707

    b707 Гуру

    выкладывайте код
     
  3. Супчик

    Супчик Нуб

    Код (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;
     
     
  4. Супчик

    Супчик Нуб

    Код (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();
    }
     
  5. Супчик

    Супчик Нуб

    Но даже стандартный код не работает, точнее как то через раз, состав оборудования шилд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
    }
     
     
  6. fogary

    fogary Гик

    Сама-то карта исправна? Другую карту пробовали?
     
  7. Супчик

    Супчик Нуб

    c переменным успехом запускается стандартный скетч, раз через раз, карта исправна, на компьютере определяется файлы хранит,бенчы проходит
     
  8. Супчик

    Супчик Нуб

    Бенчмарк ардуиновский тоже проходит, проблема возникает тогда,когда после проверки моего скетча, я загружаю кардИнфо или бенч, он не работает пока не переставить юсб
     
  9. ELITE

    ELITE Гик

    у меня такое было с прямым подключением - всё дело в напряжении
    если ардуина 5В а Сд 3.3В, при этом надо делитель ставить на МОСИ и СС , а на МИСО не надо
    и всё заработало стабильно
     
  10. Супчик

    Супчик Нуб

    Все же походу дело в скетче, где только не пойму, так как при загрузке только стандартных скечтей вроде все стабильно