Arduino Färddator, problem...
Postat: 10 december 2018, 13:48:34
Hej
Har försökt mig på att göra en färddator till båten
Jag använder mig av en flödesmätare som ger 2500 pulser/Liter
En Gps som lämnar RMC
En Arduino uno
Har lyckats få in och presentera farten (knots)
Får in och kan presentera flödet per timme
Problemet är att jag vill kunna visa förbrukningen per Nautiskmil alltså dela flödet per
timme med farten. Nån vänlig själ som kan hjälpa mig i rätt riktning?
Har markerat i koden med rött i de delar jag tror problemet ligger.
/*Delar av kod lånad från http://www.lawicel.se/kod/arduino/GpsLcd1.ino
Exempel På RMC från GPS "$GPRMC,094510.000,A,5609.6095,N,01335.7731,E,0.03,88.49,120913,,,,A*57"
Flödesmätaren ger 2500 pulser per liter */
#include <FreqMeasure.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
char buffer[120];
//
byte CommaPos[20];
//
byte bufferPos = 0;
byte bufferStat = 0;
char datavalid[2];
char knots[8];
byte CountCommas(void) {
byte tmp;
byte NoOfCommas = 0;
for (tmp = 0; tmp < bufferPos; tmp++) {
if (buffer[tmp] == ',') {
CommaPos[NoOfCommas++] = tmp;
}
}
return NoOfCommas;
}
void extract(char *buf1, char *buf2, byte item) {
byte tmp;
for (tmp = 1; tmp < (CommaPos[item + 1] - CommaPos[item]); tmp++) {
buf1[tmp - 1] = buf2[CommaPos[item] + tmp];
}
buf1[tmp] = 0;
}
byte parseNMEA(void)
{
byte comma = 0;
byte tmp = 0;
byte NoOfCommas;
NoOfCommas = CountCommas();
if (buffer[0] == 'G' && buffer[1] == 'P') {
if (buffer[2] == 'R' && buffer[3] == 'M' && buffer[4] == 'C' ) { // $GPRMC
if (NoOfCommas == 13) {
extract(datavalid, buffer, 1);
if (datavalid[0] == 'A') {
extract(knots, buffer, 6);
}
else {
return 0;
}
}
}
}
return 1;
}
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(7, 1);
lcd.print("L/Nm");
FreqMeasure.begin();
}
double sum = 0;
int count = 0;
void loop()
{
char c;
byte result;
if (bufferStat < 2) {
if (Serial.available()) {
c = Serial.read();
if (c == '$') {
bufferStat = 1;
bufferPos = 0;
}
else if (bufferStat == 1) {
if (c == '*') {
buffer[bufferPos] = 0;
bufferStat = 2;
Serial.println(buffer);
}
else if (bufferPos < 120) {
buffer[bufferPos++] = c;
}
else {
bufferPos = 0;
bufferStat = 0;
}
}
}
}
else {
result = parseNMEA();
lcd.setCursor(0, 1);
lcd.print("Kn");
lcd.print(knots);
bufferStat = 0;
}
{
delayMicroseconds(50);
if (FreqMeasure.available()) {
sum = sum +
FreqMeasure.read(); //2500 pp/l * 3600 =L/h
count = count + 1;
if (count > 30) {
float LNm = FreqMeasure.countToFrequency(sum / count / 3600 * 2500 ); // Egentligen ska det vara Freq*3600/2500 men det funkar inte att skriva så??
lcd.setCursor(11, 1); // vill Dividera detta med farten in (knots) för att få ut det som L/distans(Nm)
lcd.print(LNm);
Serial.println(LNm);
sum = 0;
count = 0;
}
}
}
}
Har försökt mig på att göra en färddator till båten
Jag använder mig av en flödesmätare som ger 2500 pulser/Liter
En Gps som lämnar RMC
En Arduino uno
Har lyckats få in och presentera farten (knots)
Får in och kan presentera flödet per timme
Problemet är att jag vill kunna visa förbrukningen per Nautiskmil alltså dela flödet per
timme med farten. Nån vänlig själ som kan hjälpa mig i rätt riktning?
Har markerat i koden med rött i de delar jag tror problemet ligger.
/*Delar av kod lånad från http://www.lawicel.se/kod/arduino/GpsLcd1.ino
Exempel På RMC från GPS "$GPRMC,094510.000,A,5609.6095,N,01335.7731,E,0.03,88.49,120913,,,,A*57"
Flödesmätaren ger 2500 pulser per liter */
#include <FreqMeasure.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
char buffer[120];
//
byte CommaPos[20];
//
byte bufferPos = 0;
byte bufferStat = 0;
char datavalid[2];
char knots[8];
byte CountCommas(void) {
byte tmp;
byte NoOfCommas = 0;
for (tmp = 0; tmp < bufferPos; tmp++) {
if (buffer[tmp] == ',') {
CommaPos[NoOfCommas++] = tmp;
}
}
return NoOfCommas;
}
void extract(char *buf1, char *buf2, byte item) {
byte tmp;
for (tmp = 1; tmp < (CommaPos[item + 1] - CommaPos[item]); tmp++) {
buf1[tmp - 1] = buf2[CommaPos[item] + tmp];
}
buf1[tmp] = 0;
}
byte parseNMEA(void)
{
byte comma = 0;
byte tmp = 0;
byte NoOfCommas;
NoOfCommas = CountCommas();
if (buffer[0] == 'G' && buffer[1] == 'P') {
if (buffer[2] == 'R' && buffer[3] == 'M' && buffer[4] == 'C' ) { // $GPRMC
if (NoOfCommas == 13) {
extract(datavalid, buffer, 1);
if (datavalid[0] == 'A') {
extract(knots, buffer, 6);
}
else {
return 0;
}
}
}
}
return 1;
}
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(7, 1);
lcd.print("L/Nm");
FreqMeasure.begin();
}
double sum = 0;
int count = 0;
void loop()
{
char c;
byte result;
if (bufferStat < 2) {
if (Serial.available()) {
c = Serial.read();
if (c == '$') {
bufferStat = 1;
bufferPos = 0;
}
else if (bufferStat == 1) {
if (c == '*') {
buffer[bufferPos] = 0;
bufferStat = 2;
Serial.println(buffer);
}
else if (bufferPos < 120) {
buffer[bufferPos++] = c;
}
else {
bufferPos = 0;
bufferStat = 0;
}
}
}
}
else {
result = parseNMEA();
lcd.setCursor(0, 1);
lcd.print("Kn");
lcd.print(knots);
bufferStat = 0;
}
{
delayMicroseconds(50);
if (FreqMeasure.available()) {
sum = sum +
FreqMeasure.read(); //2500 pp/l * 3600 =L/h
count = count + 1;
if (count > 30) {
float LNm = FreqMeasure.countToFrequency(sum / count / 3600 * 2500 ); // Egentligen ska det vara Freq*3600/2500 men det funkar inte att skriva så??
lcd.setCursor(11, 1); // vill Dividera detta med farten in (knots) för att få ut det som L/distans(Nm)
lcd.print(LNm);
Serial.println(LNm);
sum = 0;
count = 0;
}
}
}
}