#include <SPI.
h>
#include <SD.h>
#include <SoftwareSerial.h>
const int chipSelect = 10;
SoftwareSerial gpsSerial(4, 3); // RX, TX pentru modul GPS (RX pe D4)
const int analogPin = A0;
const unsigned long interval = 30000;
unsigned long previousMillis = 0;
File logFile;
float voltageToDbm(float voltage) {
return 33.636 * voltage - 139.18;
}
bool parseGPGGA(String nmea, String &timeStr, String &lat, String &lon) {
if (!nmea.startsWith("$GPGGA")) return false;
int idx = 0;
int lastIdx = 0;
int field = 0;
String fields[15];
while ((idx = nmea.indexOf(',', lastIdx)) != -1) {
fields[field++] = nmea.substring(lastIdx, idx);
lastIdx = idx + 1;
}
if (field > 5) {
timeStr = fields[1];
lat = fields[2];
lon = fields[4];
return true;
}
return false;
}
void setup() {
Serial.begin(9600);
gpsSerial.begin(4800);
pinMode(chipSelect, OUTPUT);
if (!SD.begin(chipSelect)) {
Serial.println("Card failed or not present");
while (1);
}
Serial.println("Card initialized.");
logFile = SD.open("log.csv", FILE_WRITE);
if (logFile) {
logFile.println("Time,Latitude,Longitude,Signal_dBm");
logFile.close();
}
}
void loop() {
if (millis() - previousMillis >= interval) {
previousMillis = millis();
String nmea = "";
while (gpsSerial.available()) {
char c = gpsSerial.read();
if (c == '\n') break;
nmea += c;
}
String timeStr, lat, lon;
if (parseGPGGA(nmea, timeStr, lat, lon)) {
int adcVal = analogRead(analogPin);
float voltage = adcVal * (3.0 / 1023.0);
float dbm = voltageToDbm(voltage);
logFile = SD.open("log.csv", FILE_WRITE);
if (logFile) {
logFile.print(timeStr);
logFile.print(",");
logFile.print(lat);
logFile.print(",");
logFile.print(lon);
logFile.print(",");
logFile.println(dbm, 1);
logFile.close();
}
Serial.print("Time: "); Serial.print(timeStr);
Serial.print(" Lat: "); Serial.print(lat);
Serial.print(" Lon: "); Serial.print(lon);
Serial.print(" dBm: "); Serial.println(dbm, 1);
}
}
}