18-09-2016, 12:47
Witam.
Próbuję uruchomić zegar ustawiany za pomocą danych z GPS. Mój GPS to ublox NEO-6M-0-001.
Znalazłem takie coś https://www.electronicsblog.net/arduino-...-protocol/
kod po zmianach:
Serial begin mam 38400, z taką prędkością łączę się z gpsem za pomocą u-center
Gps łapie fixa
jednak na wyświetlaczu mam tylko initialising... i Wait for GPS ...
Oryginalny program miał problem przy kompilacji z wszystkimi liniami serial print np
Serial.print(0x0D,BYTE)
próbowałem
serial.write(0x0D)
i
serial.print(0x0D)
Proszę o pomoc w rozwiązaniu problemu
Próbuję uruchomić zegar ustawiany za pomocą danych z GPS. Mój GPS to ublox NEO-6M-0-001.
Znalazłem takie coś https://www.electronicsblog.net/arduino-...-protocol/
kod po zmianach:
Kod:
//For more info please visit http://www.electronicsblog.net
// Arduino GPS clock
#include <SoftwareSerial.h>
//#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
unsigned char incomingByte = 0;
unsigned char dot_count = 0;
unsigned int c=0;
boolean show=false;
unsigned int hour;
unsigned int minute;
unsigned int second;
unsigned int day;
unsigned int month;
unsigned int year;
unsigned int GPS_position_fix_indicator=0;
unsigned int GPS_sat_used;
unsigned char GGA_id[7]={
'$','G','P','G','G','A',','};
unsigned char ZDA_id[7]={
'$','G','P','Z','D','A',','};
unsigned char buffer[100];
#define BACKLIGHT_PIN 3
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7);
// LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void show_time_date(void) {
hour = (((int)buffer[0]&0x0F)*10)+((int)buffer[1]&0x0F);
minute = (((int)buffer[2]&0x0F)*10)+((int)buffer[3]&0x0F);
second = (((int)buffer[4]&0x0F)*10)+((int)buffer[5]&0x0F);
day = (((int)buffer[10]&0x0F)*10)+((int)buffer[11]&0x0F);
month = (((int)buffer[13]&0x0F)*10)+((int)buffer[14]&0x0F);
year = (((int)buffer[16]&0x0F)*1000)+(((int)buffer[17]&0x0F)*100)+(((int)buffer[18]&0x0F)*10)+(((int)buffer[17]&0x0F));
lcd.setCursor(0, 0);
lcd.print("UCT time ");
if (show||GPS_position_fix_indicator) { //blinking display
if (hour<10) lcd.print(' ');
lcd.print(hour);
lcd.print(":");
if (minute<10) lcd.print('0');
lcd.print(minute);
lcd.print(":");
if (second<10) lcd.print('0');
lcd.print(second); }
else lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Date ");
if (show||GPS_position_fix_indicator) { //blinking display
lcd.print(year);
lcd.print("-");
if (month<10) lcd.print('0');
lcd.print(month);
lcd.print("-");
if (day<10) lcd.print('0');
lcd.print(day);
}
else lcd.print(" ");
show=!show; //blinking display
}
void show_status (void) {
GPS_position_fix_indicator = (int)(buffer[36]&0x0F);
GPS_sat_used = (((int)buffer[38]&0x0F)*10)+((int)buffer[39]&0x0F);
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 2);
switch (GPS_position_fix_indicator) {
case 0: lcd.print("Wait for GPS fix");
for (int i=0;i<dot_count;i++) {
lcd.print(".");
}
lcd.setCursor(0,3);
lcd.print("Sat. used: ");
lcd.print(GPS_sat_used);
dot_count++;
if (dot_count >3) dot_count=0;
break;
case 1: lcd.print("GPS fix OK");
lcd.setCursor(0, 3);
lcd.print("Sat. used: ");
lcd.print(GPS_sat_used);
break;
case 2: lcd.print("DGPS fix OK");
lcd.setCursor(0, 3);
lcd.print("Sat. used: ");
lcd.print(GPS_sat_used);
break;
}
}
void fill_buffer (void) {
while (Serial.available()) {
buffer[c++] =Serial.read();
if (buffer [c]==0x0D) {Serial.flush();}
}
}
void setup() {
lcd.begin(20, 4);
lcd.setCursor(0,0);
lcd.print("Initialising...");
// Serial.begin(4800);
Serial.begin(38400);
//disable automatics messages
delay(10);
Serial.print("$PSRF103,00,00,00,01*24"); //GGA
Serial.print(0x0D);
Serial.print(0x0A);
delay(10);
Serial.print("$PSRF103,01,00,00,01*25"); //GLL
Serial.print(0x0D);
Serial.print(0x0A);
delay(10);
Serial.print("$PSRF103,02,00,00,01*26"); //GSA
Serial.print(0x0D);
Serial.print(0x0A);
delay(10);
Serial.print("$PSRF103,03,00,00,01*27"); //GSV
Serial.print(0x0D);
Serial.print(0x0A);
delay(10);
Serial.print("$PSRF103,04,00,00,01*20"); //RMC
Serial.print(0x0D);
Serial.print(0x0A);
delay(10);
Serial.print("$PSRF103,05,00,00,01*21"); //VTG
Serial.print(0x0D);
Serial.print(0x0A);
delay(10);
Serial.print("$PSRF103,06,00,00,01*22"); //MSS
Serial.print(0x0D);
Serial.print(0x0A);
delay(10);
Serial.print("$PSRF103,07,00,00,01*23"); ///////ZDA
Serial.print(0x0D);
Serial.print(0x0A);
delay(10);
/////////////////////////////////////////ZDA
Serial.print("$PSRF103,07,00,01,01*22");
Serial.print(0x0D);
Serial.print(0x0A);
delay(10);
////////////////////////////////////// GGA
Serial.print("$PSRF103,00,00,01,01*25");
Serial.print(0x0D);
Serial.print(0x0A);
delay(10);
lcd.setCursor(0,1);
lcd.print("Wait for GPS...");
}
void loop () {
c=0;
int valid_ZDA=7;
int valid_GGA=7;
boolean valid_msg=false;
if (Serial.available() > 20) {
for (int i=0;i<7;i++) {
incomingByte =Serial.read();
if (incomingByte==ZDA_id[i]) {
valid_ZDA--;
valid_msg=true;
}
if (incomingByte==GGA_id[i]) {
valid_GGA--;
valid_msg=true;
}
if(!valid_msg) {i=7;} // break from "if" loop
}
if (valid_ZDA==0) {
while (Serial.available()<25) {delay(10);}
fill_buffer();
show_time_date();
} /// (valid_ZDA==0) {
if (valid_GGA==0) {
while (Serial.available()<40) {delay(10);}
fill_buffer();
// show_status();
}
}
}
Serial begin mam 38400, z taką prędkością łączę się z gpsem za pomocą u-center
Gps łapie fixa
jednak na wyświetlaczu mam tylko initialising... i Wait for GPS ...
Oryginalny program miał problem przy kompilacji z wszystkimi liniami serial print np
Serial.print(0x0D,BYTE)
próbowałem
serial.write(0x0D)
i
serial.print(0x0D)
Proszę o pomoc w rozwiązaniu problemu