Здравствуйте! Коллеги, помогите разобраться. Есть такая сборка: 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"); } }
Спасибо Valera_gug за ссылку и идею. Но в описанной статье SD и GPRS в одном шилде, потому обращение к конкретному устройству зависит от состояния конкретного порта. У меня разные шилды. Есть еще идеи?
GPRS подключен rx на D10, tx на D9, pk на D2, st на D3. SD подключен MISO -> D12, MOSI -> D11, SCK -> D13, CS -> D4