// библиотеки для работы с датчиком 18B20 #include #include // библиотека для работы с SPI #include // библиотека для работы с SD-картами #include // библиотека для работы I²C #include // библиотека для работы с модулями IMU #include // библиотека для работы с GPS устройством #include // библиотека для работы с GPRS устройством #include // serial-порт к которому подключён GPS-модуль #define GPS_SERIAL Serial1 // serial-порт к которому подключён GPRS-модуль #define GPRS_SERIAL Serial3 // пин подключения CS microSD-карты #define SD_CS_PIN 10 // пин подключения датчика 18B20 #define TEMP_18B20_PIN A1 // задаём размер массива для времени #define MAX_SIZE_MASS 16 // интервал времени записи данных на SD-карту #define INTERVAL_SD 1000 // интервал времени передачи данных через СМС #define INTERVAL_SMS 600000 // номер на который будем отправлять сообщение #define PHONE_NUMBER "+74959379992" // создадаём объект для работы с библиотекой OneWire OneWire oneWire(TEMP_18B20_PIN); // создадаём объект для работы с библиотекой DallasTemperature DallasTemperature sensor18B20(&oneWire); // создаём объект для работы с барометром Barometer barometer; // создаём объект класса GPS и передаём в него объект Serial1 GPS gps(GPS_SERIAL); // создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(GPRS_SERIAL); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(GPRS_SERIAL, 2, 3); // массив для хранения текущего времени char strTime[MAX_SIZE_MASS]; // массив для хранения текущей даты char strDate[MAX_SIZE_MASS]; // массив для хранения широты в градусах, минутах и секундах char latitudeBase60[MAX_SIZE_MASS]; // массив для хранения долготы в градусах, минутах и секундах char longitudeBase60[MAX_SIZE_MASS]; // запоминаем текущее время long startMillisSD = millis(); // запоминаем текущее время long startMillisSMS = millis(); // данные модулей для записи на карту SD String dataStringSD = ""; // данные модулей для отправки СМС String dataStringSMS = ""; // переменные для хранения данных с датчиков и модулей float temperature18B20; float temperatureBarometer; float pressureBarometer; float altitudeBarometer; String timeGPS; String dateGPS; String altitudeGPS; String latitudeBase60GPS; String longitudeBase60GPS; void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(115200); // выводим сообщение в Serial-порт о поиске карты памяти Serial.println("Initializing SD card..."); // если microSD-карта не была обнаружена if (!SD.begin(SD_CS_PIN)) { // выводим сообщение об ошибке Serial.println("Card failed, or not present"); } else { Serial.println("Card initialized"); } // начало работы с датчиком DS18B20 sensor18B20.begin(); // установим разрешение датчика sensor18B20.setResolution(12); // выводим сообщение об удачной инициализации Serial.println("18B20 is OK"); // инициализация барометра barometer.begin(); // выводим сообщение об удачной инициализации Serial.println("LPS331 is OK"); // открываем Serial-соединение с GPS-модулем GPS_SERIAL.begin(115200); // выводим сообщение об удачной инициализации Serial.println("GPS is OK"); // открываем Serial-соединение с GPRS Shield GPRS_SERIAL.begin(115200); // включаем GPRS-шилд gprs.powerOn(); delay(1000); if (!gprs.begin()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке; Serial.print("GPRS Begin error\r\n"); } // вывод об удачной инициализации GPRS Shield Serial.println("GPRS is OK"); } void loop() { // считываем данные с модулей и датчиков getTemperature18B20(); getDataBarometer(); getDataGPS(); // собираем пакет данных для записи на SD-карту dataStringSD = dateGPS; dataStringSD += "\t"; dataStringSD += timeGPS; dataStringSD += "\t"; dataStringSD += latitudeBase60GPS; dataStringSD += "\t"; dataStringSD += longitudeBase60GPS; dataStringSD += "\t"; dataStringSD += temperature18B20; dataStringSD += "\t"; dataStringSD += temperatureBarometer; dataStringSD += "\t"; dataStringSD += pressureBarometer; dataStringSD += "\t"; dataStringSD += altitudeBarometer; dataStringSD += "\t"; dataStringSD += altitudeGPS; dataStringSD += "\t"; // собираем пакет данных для СМС dataStringSMS = dateGPS; dataStringSMS += " "; dataStringSMS += timeGPS; dataStringSMS += " "; dataStringSMS += latitudeBase60GPS; dataStringSMS += " "; dataStringSMS += longitudeBase60GPS; dataStringSMS += " "; dataStringSMS += temperature18B20; dataStringSMS += " "; dataStringSMS += temperatureBarometer; dataStringSMS += " "; dataStringSMS += pressureBarometer; dataStringSMS += " "; dataStringSMS += altitudeBarometer; dataStringSMS += " "; dataStringSMS += altitudeGPS; dataStringSMS += " "; if (millis() - startMillisSD > INTERVAL_SD) { // сохраняем данные с модулей на карту памяти saveSD(); // запоминаем текущее время startMillisSD = millis(); } if (millis() - startMillisSMS > INTERVAL_SMS) { // отправляем данные СМС сообщениям sendSMS(); // запоминаем текущее время startMillisSMS = millis(); } } // функция считывания данных с GPS-модуля в глобальные переменные void getDataGPS() { // если пришли данные с GPS-модуля if (gps.available()) { // считываем данные и парсим gps.readParsing(); // проверяем состояние GPS-модуля switch(gps.getState()) { // всё OK case GPS_OK: gps.getTime(strTime, MAX_SIZE_MASS); gps.getDate(strDate, MAX_SIZE_MASS); gps.getLatitudeBase60(latitudeBase60, MAX_SIZE_MASS); gps.getLongitudeBase60(longitudeBase60, MAX_SIZE_MASS); timeGPS = (String)strDate; dateGPS = (String)strDate; latitudeBase60GPS = (String)latitudeBase60; longitudeBase60GPS = (String)longitudeBase60; altitudeGPS = gps.getAltitude(); break; // ошибка данных case GPS_ERROR_DATA: dateGPS = "Error"; timeGPS = "Error"; latitudeBase60GPS = "Error"; longitudeBase60GPS = "Error"; altitudeGPS = "Error"; break; // нет соединение со спутниками case GPS_ERROR_SAT: dateGPS = "No Sat"; timeGPS = "No Sat"; latitudeBase60GPS = "No Sat"; longitudeBase60GPS = "No Sat"; altitudeGPS = "No Sat"; break; } } } // функция считывания данных с барометра в глобальные переменные void getDataBarometer() { temperatureBarometer = barometer.readTemperatureC(); pressureBarometer = barometer.readPressureMillibars(); altitudeBarometer = barometer.pressureToAltitudeMeters(pressureBarometer); } // функция считывания данных с датчика 18B20 в глобальную переменную void getTemperature18B20() { // считываем данные с цифрового термометра 18B20 sensor18B20.requestTemperatures(); temperature18B20 = sensor18B20.getTempCByIndex(0); } // функция записи данных с модулей на SD-карту void saveSD() { // создаём файл для записи File dataFile = SD.open("datalog.txt", FILE_WRITE); // если файл доступен для записи if (dataFile) { // сохраняем данные dataFile.println(dataStringSD); Serial.println(dataStringSD); // закрываем файл dataFile.close(); // выводим сообщение об удачной записи Serial.println("Save OK"); } else { // если файл не доступен // выводим сообщение об ошибке Serial.println("Error opening file"); } } // функция отправки данные с модулей СМС сообщением void sendSMS() { char dataSMS[128] = ""; dataStringSMS.toCharArray(dataSMS, 128); gprs.sendSMS(PHONE_NUMBER, dataSMS); Serial.println("SMS sent OK"); }