// Rakennetaan NMEA-VHW-lause
/*VHW Water Speed and Heading
1 2 3 4 5 6 7 8 9
| | | | | | | | |
$--VHW,x.x,T,x.x,M,x.x,N,x.x,K*hh
1) Degress True
2) T = True
3) Degrees Magnetic
4) M = Magnetic
5) Knots (speed of vessel relative to the water)
6) N = Knots
7) Kilometers (speed of vessel relative to the water)
8) K = Kilometres
9) Checksum*/
// Rakennetaan NMEA-MWV-lause
/*MWV Wind Speed and Angle
1 2 3 4 5
| | | | |
$--MWV,x.x,a,x.x,a*hh
1) Wind Angle, 0 to 360 degrees
2) Reference, R = Relative, T = True
3) Wind Speed
4) Wind Speed Units, K/M/N
5) Status, A = Data Valid
6) Checksum
...eli: "$--MWV,"
*/
int paikka;
int laskuri;
int nopeus;
int suunta;
String knots = "x";
String dataOK = "V";
String NMEAst;
String NMEAstring;
String checktavu;
float Nopeus_F = 0;
float Nopeus = 0;
float Nopeus_Test = 0;
String uusitavu ="";
String vanhatavu ="";
char dump;
//#include <SoftwareSerial.h>;// => adding SoftwareSerial library
//#define BTTX 9;// => BTTX (TXD) on digital 9
//#define BTRX 10;// => BTRX (RXD) on digital 10
//SoftwareSerial SerialGPS=SoftwareSerial(14, 10, 1);// => declare SerialBT function. 9 on input, siis se tulee GPSltä.
void setup() {
// put your setup code here, to run once:
//NMEAstring.reserve(1000);
//pinMode(14, INPUT);
//pinMode(9, OUTPUT); // Tone output
//pinMode(7, OUTPUT); // LED drive
Serial.begin(9600);
Serial1.begin(9600);
//SerialGPS.begin(9600);
Serial.print("KUKUKU");
}
void loop() {
// put your main code here, to run repeatedly:
//while (!(Serial1.available() > 0)) {;} // Jos ei ole dataa bufferissa, odotellaan
luku:
//while (!(Serial1.available() > 0)) {;} // Jos ei ole dataa bufferissa, odotellaan
uusitavu = char(Serial1.read()); // Luetaan tavu
NMEAstring = NMEAstring += uusitavu; // Ynnätään stringiin
checktavu = vanhatavu += uusitavu;
NMEAstring = "$Y123456789X"; // Debuggausrivi
checktavu = "X"; // Debuggausrivi. Kun X on saapunut, tiedetään että data on kokonaisuudessaan tullut
//Serial.println(checktavu);
//if (((uusitavu == "T") && (vanhatavu == "G"))) {goto etsi;} // Tarkistetaan oliko nuo peräkkäin. Jos oli, hypätään etsimään tietoja.
if (((checktavu == "X"))) {goto etsi;} // Koska on X, on data tullut
vanhatavu = uusitavu; // Tehdään uudesta vanha
//Serial.println(NMEAstring);
goto luku; // Kelataan sarjaportinlukulooppia
etsi:
Serial.println("Etsimässä");
//tone(8,50*16);
Serial.println(NMEAstring); // Printataan tutkittava stringi
paikka = NMEAstring.indexOf("$Y"); // Etsitään $Y jotta tiedetään missä suunta ja nopues ovat
suunta = NMEAstring.substring(paikka+2,paikka+5).toInt(); // Poimitaan tosituulen suuntatieto
Serial.println(suunta); // Printataan suuntatieto
nopeus = NMEAstring.substring(paikka+5, paikka+8).toInt(); // Poimitaan nopeustieto
Serial.println(nopeus); // Printataan nopeustieto
resetoidaan:
delay(400); // Annetaan sarjasiirron päättyä.
while (Serial1.available()) {dump = Serial1.read();} // Loppudataa ei tarvita joten dumpataan se
NMEAstring =""; // Nollataan kerättävä stringi ja luettavat tavut
uusitavu = ""; vanhatavu = "";
/*Serial.println(NMEAst);
//
//NMEAst =
"
$GLGSV,2,1,07,69,51,083,27,78,32,034,30,79,41,101,30,80,08,154,*66
$GLGSV,2,2,07,85,36,249,40,86,40,313,,87,03,002,*54
$GNGLL,6009.15350,N,02453.17195,E,142538.00,A,A*78
$GNRMC,142539.00,A,6009.15350,N,02453.17076,E,7.268,300.26,220822,,,A*72
";
//dataOK = "V";
//paikka = NMEAst.indexOf("GNRMC"); // Etsitään RMC
//dataOK = NMEAst.substring(paikka+16,paikka+17); // Etsitään validity-merkki
*/
// Jos data on validia...
//if (dataOK == "A")
// {
//
// knots = NMEAst.substring(paikka+45, paikka+50);
// Nopeus = knots.toFloat();
// Nopeus_F = 0.25 * Nopeus + 0.75 * Nopeus_F; //Lasketaan suodatettua nopeutta
//Nopeus_Test = Nopeus_F*0.75 + Nopeus*0.25;
//
// if (Nopeus_F*160 > 31)
// {tone(4,Nopeus_F*160);} // Ohjaa ääni
//else
// {noTone(4);}
// }
// else
// {
// }
// }
//int NMEA = 5;
//Serial.print(Nopeus_F*160);Serial.print(" ");Serial.print(paikka);Serial.print(" ");Serial.print(knots);Serial.print(" ");Serial.println((Nopeus_F));
//delay(500);
}