Arduino Uno GPRS-shield и SD-shield

Тема в разделе "Arduino & Shields", создана пользователем Pereval, 19 сен 2016.

  1. Pereval

    Pereval Нуб

    Здравствуйте!
    Коллеги, помогите разобраться. Есть такая сборка: Arduino Uno, Gprs шилд от амперки (http://amperka.ru/product/arduino-gprs-shield), SD шилд (http://arduino-kit.ru/catalog/id/modul-mini-sd---micro-sd-card), два датчика температуры (http://amperka.ru/product/sealed-temperature-sensor-ds18b20) и GPS модуль (http://arduino-kit.ru/catalog/id/modul-gps-vk16e). Суть сей конструкции в следующем: собирать данные температуры, текущего времени с GPRS шилда и GPS координаты с GPS шилда, записывать их в виде строки определенного формата в файл на СД-карту, а потом этот файл по GPRS отправлять на фтп. Столкнулся со следующей проблемой, если включается GPRS-шилд, то выдается ошибка открытия файла для записи данных. Если шилд не включать, то все пишется без проблем, т.е. если работает одно, то перестает работать другое. Не пойму почему. Посоветуйте, в чем проблема. Спасибо!


    Код (C++):
    #include <SoftwareSerial.h>
    #include <TinyGPS.h>
    #include <SD.h>


    #define ONE_WIRE_BUS_1 5      //определяем порт одного датчика
    #define ONE_WIRE_BUS_2 6      //определяем порт другого датчика
    OneWire oneWire_1(ONE_WIRE_BUS_1);
    OneWire oneWire_2(ONE_WIRE_BUS_2);
    DallasTemperature sensor_1(&oneWire_1);
    DallasTemperature sensor_2(&oneWire_2);
    GPRS gprs (2, 3, 9, 10);      // создаём объект класса GPRS. По умолчанию скорость общения с ним 9600 бод, с помощью него будем давать команды GPRS шилду
    #define fileName "A_01_001.log"
    #define SD_SS_PIN 4
    #define ID "A_01_001"    //идентификатор устройства

    TinyGPS gps;
    char timeBuffer[46];  // буфер GPRS Serial, нужен для получения времени с шилда

    SoftwareSerial nss(7, 8);            // GPS
    float sens1, sens2; //переменные для хранения значений температуры с каждого сенсора
    String timeNow = "";
    float flat, flon, fkmph;
    bool marker1 = false;
    bool marker2 = false;



    void setup() {
    sensor_1.begin();
    sensor_2.begin();
      nss.begin(9600);
      Serial.begin(9600);

      // Baudrate is 9600

      while (!Serial) {
         // ждём пока не откроется монитор последовательного порта для того, чтобы отследить все события в программе
         }

    setupLogFile();



    }

    void loop()
    {
      Serial.print("Zapros temp...");
      sensor_1.requestTemperatures();
      sensor_2.requestTemperatures();
      Serial.println(" Ok");

      Serial.print("Sensor 1: ");
      Serial.println(sensor_1.getTempCByIndex(0));
      sens1 = sensor_1.getTempCByIndex(0);

      Serial.print("Sensor 2: ");
      Serial.println(sensor_2.getTempCByIndex(0));
      sens2 = sensor_2.getTempCByIndex(0);



      gpsdump(gps);
      logData();
      GPRSread();

    }


    void gpsdump(TinyGPS &gps) {
       fkmph = gps.f_speed_kmph(); // speed in km/hr
      float falt = gps.f_altitude(); // +/- altitude in meters
      unsigned long age;
      gps.f_get_position(&flat, &flon, &age);
    }

    void GPRSread()
    {
    // if (!Serial)
    // {
    //   Serial.begin(9600);
    // }
    //  clear_timeBuffer();
    timeNow = "";
    // if (!marker2)
    //  {
        gprs.powerUpDown();
      Serial.println("Initializing GPRS ...");
       while (!gprs.init()) // проверяем, есть ли связь с GPRS-устройством
       {
          // если связи нет, ждём 1 секунду и выводим сообщение об ошибке; процесс повторяется в цикле, пока не появится ответ от GPRS-устройства
         delay(1000);
        Serial.print("Init error\r\n");
       }
        Serial.println("Init ok");  // вывод об удачной инициализации GPRS Shield
    //   marker2 = true;
        gprs.getDateTime(timeBuffer);

        for (int i = 0; i < 17; i++)
        {
          timeNow  += timeBuffer[i];
        }
        Serial.println(timeNow);
        gprs.disconnect();
        Serial.println("OK");
       gprs.powerOff();
    //  Serial.close();
       Serial.begin(9600);
    //   marker2 = false;
    //  }
    //  else
    //  {
       
    //    gprs.getDateTime(timeBuffer);

    //    for (int i = 0; i < 17; i++)
    //    {
    //      timeNow  += timeBuffer[i];
    //    }
         
       
        // деактивируем интерфейс GPRS
    //    gprs.disconnect();
    //   Serial.println("OK");
    //    gprs.powerOff();
    //    marker2 = false;
    //  }
    }

    void clear_timeBuffer()
    {
      for (int t = 0; t < 46; t++) {
        // очищаем буфер,
        // присваивая всем индексам массива значение 0
        timeBuffer[t] = 0;
      }
    }


    void setupLogFile()
    {
      // Ищем и инициализируем SD карту - без нее работать не будет!!!
    Serial.print("Initializing SD card...\r\n");
    pinMode (SD_SS_PIN, OUTPUT);
    while (!SD.begin(SD_SS_PIN)) {
        Serial.println("initialization failed!");
        Serial.println("Card failed, or not present");
        delay(10000);
      }
      Serial.println("initialization done.");
    }

    void logData()
    {
       if (SD.exists(fileName))
      { Serial.println("File exist");
      } else
      {Serial.println("File not found");}
     
    File logFile = SD.open(fileName, FILE_WRITE);

      // if the file opened okay, write to it:
       if (logFile) {
       Serial.println("Writing to log");
          logFile.print("ID=");
        logFile.print(ID);
           logFile.print(", ");
          logFile.print("Time=");
            logFile.print(timeNow);
          logFile.print(", ");
            logFile.print("lat=");
         logFile.print(flat, 4); // latitude
         logFile.print(", ");
         logFile.print("lon=");
         logFile.print(flon, 4); // longitude
         logFile.print(", ");
         logFile.print("speed=");
        logFile.print(fkmph); // KMS
          logFile.print(", ");
          logFile.print("sens1=");
          logFile.print(sens1);
          logFile.print(", ");
           logFile.print("sens2=");
           logFile.print(sens2);
          logFile.print("#");
          logFile.println(" ");
         logFile.close();
          Serial.println("Done");
        } else {
      // if the file didn't open, print an error:
        Serial.println("Error opening log file");
       }

    }
     
     
  2. Valera_gug

    Valera_gug Нерд

    Привет.
    Смотри в эту сторону
    https://www.arduino.cc/en/Main/ArduinoEthernetShield
     
  3. Pereval

    Pereval Нуб

    Спасибо Valera_gug за ссылку и идею. Но в описанной статье SD и GPRS в одном шилде, потому обращение к конкретному устройству зависит от состояния конкретного порта. У меня разные шилды. Есть еще идеи?
     
  4. nkYellOw

    nkYellOw Нерд

    скрин подключения давай
     
    Последнее редактирование: 21 сен 2016
  5. Pereval

    Pereval Нуб

    GPRS подключен rx на D10, tx на D9, pk на D2, st на D3. SD подключен MISO -> D12, MOSI -> D11, SCK -> D13, CS -> D4