#include TinyGPS gps; //crea oggetto "gps" agganciato alla lobreria // Definizione dello schema di accensione dei LED Segmenti: // 0 = LED acceso, 1 = LED spento, in questo ordine: aaaaa // Pin Arduino : 6, 7, 8, 9,10,11,12 f b // Segmenti display: a, b, f, g, c ,d ,e f b const boolean segment_pattern[17][7] = { // ggggg { 0,0,0,1,0,0,0 }, // = 0 e c { 1,0,1,1,0,1,1 }, // = 1 e c { 0,0,1,0,1,0,0 }, // = 2 ddddd dp { 0,0,1,0,0,0,1 }, // = 3 { 1,0,0,0,0,1,1 }, // = 4 { 0,1,0,0,0,0,1 }, // = 5 { 0,1,0,0,0,0,0 }, // = 6 { 0,0,1,1,0,1,1 }, // = 7 { 0,0,0,0,0,0,0 }, // = 8 { 0,0,0,0,0,0,1 }, // = 9 { 1,1,1,1,1,1,1 }, // = null { 1,1,1,0,1,1,1 }, // = '-' { 0,0,0,0,1,1,0 }, // = P { 0,1,0,0,1,0,0 }, // = E { 0,1,0,1,1,0,0 }, // = C { 1,0,0,1,0,0,0 }, // = U { 1,0,0,0,0,1,0 } // = H }; boolean dot[3] = { 1,1,1}; //punti decimali boolean nmea_ok = 0; boolean newdata = 0; byte patt1; byte patt2; byte patt3; byte disp_page = 1; unsigned int w_altitude = 0; unsigned int w_course = 0; unsigned int w_speed = 0; unsigned int data2d = 0; unsigned long start; void setup() { pinMode(6, OUTPUT); //a pinMode(7, OUTPUT); //b pinMode(8, OUTPUT); //f pinMode(9, OUTPUT); //g pinMode(10, OUTPUT);//c pinMode(11, OUTPUT);//d pinMode(12, OUTPUT);//e pinMode(5, OUTPUT); //dp pinMode(2, OUTPUT); //anodo 1 pinMode(3, OUTPUT); //anodo 2 pinMode(4, OUTPUT); //anodo 3 pinMode(A0, OUTPUT);//LED1 pinMode(A1, OUTPUT);//LED2 pinMode(A2, INPUT); //SW1 pinMode(A3, INPUT); //SW2 Serial.begin(9600); //Imposta la velocità della seriale } void digitWrite(byte digit, byte digit_pattern) { digitalWrite(5 - digit, 0); //active on control pin = LOW for (byte segment = 0; segment < 7; segment++) { digitalWrite(segment + 6, segment_pattern[digit_pattern][segment]); digitalWrite(5, dot[digit-1]); } start = millis(); do { if (Serial.available()) nmea_ok = gps.encode(Serial.read()); if (nmea_ok) newdata = 1; } while (millis() - start < 5); // Delay digitalWrite(5-digit, 1); } void display_int(unsigned int data){ patt3 = data%10; data /= 10; patt2 = data%10; patt1 = data/10; if (patt1 == 0) patt1 = 10; //soppressione zero digitWrite(3, patt3); digitWrite(2, patt2); digitWrite(1, patt1); } void check_sw() { if (digitalRead(A2)) { dot[0] =1; dot[1] =1; dot[2] =1; disp_page++; if (disp_page > 3) disp_page = 1; switch (disp_page) { case 1: // speed for (byte i = 0;i < 150; ++i) { digitWrite(1, 5); digitWrite(2, 12); // S P E digitWrite(3, 13); } break; case 2: // course for (byte i = 0;i < 150; ++i) { digitWrite(1, 14); digitWrite(2, 0); // C O U digitWrite(3, 15); } break; case 3: // altitude for (byte i = 0;i < 150; ++i) { digitWrite(1, 16); digitWrite(2, 13); // H E I digitWrite(3, 1); } break; } } } void loop() { check_sw(); if (newdata) { w_course = int(gps.f_course()); w_speed = int(gps.f_speed_kmph()* 10); w_altitude = int(gps.f_altitude()); switch (disp_page) { case 1: // speed if (w_speed < 1000) dot[1] = 0; else { dot[1] = 1; w_speed /=10; } data2d = w_speed%1000; break; case 2: // course data2d = w_course%1000; break; case 3: // altitude if (w_altitude > 999) { dot[0] = 0; w_altitude /= 10; } else dot[0] = 1; data2d = w_altitude%1000; break; } newdata = 0; } display_int(data2d); }