// библиотеки для работы с датчиком 18B20 #include #include // библиотека для работы с аналоговым термометром (Troyka-модуль) #include // библиотека для работы с SPI #include // библиотека для работы с SD-картами #include // библиотека для работы I²C #include // библиотека для работы с модулями IMU #include // библиотека для работы с GPS устройством #include // serial-порт к которому подключён GPS-модуль #define GPS_SERIAL Serial1 // serial-порт к которому подключён RS485 #define RS485_SERIAL Serial2 #define RS485_PIN_MASTER 22 // пин подключения CS microSD-карты #define SD_CS_PIN A5 // пин подключения State Volt #define VOLT_PIN A0 // пин подключения датчика 18B20 #define TEMP_18B20_PIN A1 // пин подключения датчика TMP36 #define TEMP_TMP36_PIN A2 // задаём размер массива для времени #define MAX_SIZE_MASS 16 // интервал времени записи данных на карту #define INTERVAL 10000 // создадаём объект для работы с библиотекой OneWire OneWire oneWire(TEMP_18B20_PIN); // создадаём объект для работы с библиотекой DallasTemperature DallasTemperature sensor18B20(&oneWire); // создаём объект для работы с аналоговым термометром // и передаём ему номер пина выходного сигнала TroykaThermometer sensorTMP36(TEMP_TMP36_PIN); // создаём объект для работы с барометром Barometer barometer; // создаём объект класса GPS и передаём в него объект Serial1 GPS gps(GPS_SERIAL); // массив для хранения текущего времени char strTime[MAX_SIZE_MASS]; // массив для хранения текущей даты char strDate[MAX_SIZE_MASS]; // запоминаем текущее время long startMillis = millis(); // данные модулей для записи String dataString = ""; String dataStringRS485 = ""; float temperature18B20; float temperatureTMP36; float temperatureBarometer; float pressureBarometer; float altitudeBarometer; String timeGPS; String dateGPS; String altitudeGPS; float voltPowerShield; int i = 0; 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"); // don't do anything more: return; } else { Serial.println("Card initialized"); } // начало работы с датчиком DS18B20 sensor18B20.begin(); // установим разрешение датчика sensor18B20.setResolution(12); // выводим сообщение об удачной инициализации Serial.println("18B20 is OK"); // выводим сообщение об удачной инициализации Serial.println("TMP36 is OK"); // инициализация барометра barometer.begin(); // выводим сообщение об удачной инициализации Serial.println("LPS331 is OK"); // открываем Serial-соединение с GPS-модулем GPS_SERIAL.begin(115200); // выводим сообщение об удачной инициализации Serial.println("GPS is OK"); // открываем Serial-соединение с GPS-модулем RS485_SERIAL.begin(115200); // подаём высокий уровень на пин направление // значит устройство будет передавать данные pinMode(RS485_PIN_MASTER, OUTPUT); digitalWrite(RS485_PIN_MASTER, LOW); // выводим сообщение об удачной инициализации Serial.println("GPS is OK"); } void loop() { getTemperature18B20(); getTemperatureTMP36(); getDataBarometer(); getDataGPS(); getVoltState(); dataString = dateGPS; dataString += "\t"; dataString += timeGPS; dataString += "\t"; dataString += temperatureTMP36; dataString += "\t"; dataString += temperature18B20; dataString += "\t"; dataString += temperatureBarometer; dataString += "\t"; dataString += pressureBarometer; dataString += "\t"; dataString += altitudeBarometer; dataString += "\t"; dataString += altitudeGPS; dataString += "\t"; dataString += voltPowerShield; dataString += "\t"; if (millis() - startMillis > INTERVAL) { readDataRS485(); dataString += "|\t"; dataString += dataStringRS485; // сохраняем данные с модулей на карту памяти saveSD(); // запоминаем текущее время startMillis = millis(); } } void readDataRS485() { dataStringRS485 = ""; RS485_SERIAL.flush(); // если появились данные с модуля RS-485 if (RS485_SERIAL.available() > 0) { while (RS485_SERIAL.available() > 0) { // считываем данные char c = RS485_SERIAL.read(); dataStringRS485 += c; } } else { dataStringRS485 = "No Data from RS485"; } } void getVoltState() { int sensorValue = analogRead(VOLT_PIN); voltPowerShield = sensorValue * (5.0 / 1023.0); } void getDataGPS() { String timeGPSString; String dateGPSString; // если пришли данные с 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); timeGPSString = (String)strTime; timeGPS = timeGPSString; dateGPSString = (String)strDate; dateGPS = dateGPSString; altitudeGPS = gps.getAltitude(); break; // ошибка данных case GPS_ERROR_DATA: //Serial.println("GPS error data"); dateGPS = "Error"; timeGPS = "Error"; altitudeGPS = "Error"; break; // нет соединение со спутниками case GPS_ERROR_SAT: //Serial.println("GPS no connect to satellites!!!"); dateGPS = "No Sat"; timeGPS = "No Sat"; altitudeGPS = "No Sat"; break; } } } void getDataBarometer() { temperatureBarometer = barometer.readTemperatureC(); pressureBarometer = barometer.readPressureMillibars(); altitudeBarometer = barometer.pressureToAltitudeMeters(pressureBarometer); } void getTemperature18B20() { // считываем данные с цифрового термометра 18B20 sensor18B20.requestTemperatures(); temperature18B20 = sensor18B20.getTempCByIndex(0); } void getTemperatureTMP36() { // считываем данные с аналогового термометра TMP36 sensorTMP36.read(); temperatureTMP36 = sensorTMP36.getTemperatureC(); } void saveSD() { // создаём файл для записи File dataFile = SD.open("datalog.txt", FILE_WRITE); // если файл доступен для записи if (dataFile) { // сохраняем данные dataFile.println(dataString); Serial.print(dataString); // закрываем файл dataFile.close(); // выводим сообщение об удачной записи Serial.println("Save OK"); } else { // если файл не доступен Serial.println("Error opening datalog.txt"); } }