26

Re: часы на gps модуле и семисегментных индикаторах

Опубликуйте последнюю версию скетча со всеми изменениями.

27

Re: часы на gps модуле и семисегментных индикаторах

#define SEG_A  2
#define SEG_B  3
#define SEG_C  4
#define SEG_D  5
#define SEG_E  6
#define SEG_F  7
#define SEG_G  8
#define SEG_DP 9

#define LED_0  A0
#define LED_1  A1
#define LED_2  A2
#define LED_3  A3

#define time_offset   18000  // смещение от UTC 1 час = 3600
#define KORR_T  -2.7   // DS18B20 коррекция температуры

#include <TinyGPS++.h>      // https://github.com/mikalhart/TinyGPSPlus/archive/refs/heads/master.zip
#include <TimeLib.h>        // https://github.com/PaulStoffregen/Time/archive/master.zip
#include <OneWire.h>        // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip             
 TinyGPSPlus gps;
 OneWire  ds(13); // Вход датчика 18b20

byte an,segm,a[4],i,dpp;
int br=1;
unsigned long times;
byte last_minute, Second, Minute, Hour, Day, Month;
int Year;
int timer;
bool w=1,w1;

void setup() {
  Serial.begin(9600);   
  cli();
  TCCR2A = 0;
  TCCR2B = 0;
  TCNT2 = 0;
  OCR2A = 155;
  TCCR2A |= (1 << WGM21);
  TCCR2B |= (1 << CS22) | (1 << CS21);
  TIMSK2 |= (1 << OCIE2A);
  sei();
  pinMode(SEG_A,OUTPUT);
  pinMode(SEG_B,OUTPUT);
  pinMode(SEG_C,OUTPUT);
  pinMode(SEG_D,OUTPUT);
  pinMode(SEG_E,OUTPUT);
  pinMode(SEG_F,OUTPUT);
  pinMode(SEG_G,OUTPUT);
  pinMode(SEG_DP,OUTPUT);
  pinMode(LED_0,OUTPUT);
  pinMode(LED_1,OUTPUT);
  pinMode(LED_2,OUTPUT);
  pinMode(LED_3,OUTPUT);
}

void loop() {
 
 while (Serial.available() > 0){ 
    if (gps.encode(Serial.read())){
      if (gps.time.isValid()){
        Minute = gps.time.minute();
        Second = gps.time.second();
        Hour   = gps.time.hour();
      }
      if (gps.date.isValid()){
        Day   = gps.date.day();
        Month = gps.date.month();
        Year  = gps.date.year();
      }}}
      
      if(last_minute != gps.time.minute()){
        last_minute = gps.time.minute();
        setTime(Hour, Minute, Second, Day, Month, Year);
        adjustTime(time_offset);
 }

if (millis() > 5000 && gps.charsProcessed() < 10){while(true);}

 if(Year==2000){
    a[0]=11;
    a[1]=11;
    a[2]=11;
    a[3]=11;
      }
 else{    
   timer=hour()*100+minute();
   if(second()>=55){timer = dsRead(0)*100; delay(200);}
  
    
    a[0]=timer/1000%10;
    a[1]=timer/100%10;
   if(second()>=55){a[2]=13;}else{a[2]=timer/10%10;}
   if(second()>=55){a[3]=12;}else{a[3]=timer%10;}
 }
}


ISR(TIMER2_COMPA_vect){
   switch (i) {
    case 0: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[0];segment();an = 0;ch(SEG_DP, 1);anod();break;
    case 1: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[1];segment();an = 1;ch(SEG_DP, dpp);anod();break;
    case 2: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[2];segment();an = 2;ch(SEG_DP, 1);anod();break;
    case 3: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[3];segment();an = 3;ch(SEG_DP, 1);anod();break;
  }
  i++;if (i > 3) {i = 0;}
  if(millis()-times<500){dpp=1;}
  if(millis()-times>=500 || (second()>=55)){dpp=0;}
  if(millis()-times>1000){times=millis();}
  }

void segment() {
  switch (segm) {
            //  A          B             C              D             E            F            G
    case 0: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 0
    case 1: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 1
    case 2: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 1); break; // 2
    case 3: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 1); break; // 3
    case 4: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 4
    case 5: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 5
    case 6: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 6
    case 7: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 7
    case 8: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 8
    case 9: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 9
   case 11: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 1); break; // -
   case 10: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // пусто
   case 12: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // C
   case 13: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; //градус
  }
}

void anod() {
  switch (an) {
    case 0: ch(LED_0, 0); ch(LED_1, 1); ch(LED_2, 1); ch(LED_3, 1); break;
    case 1: ch(LED_0, 1); ch(LED_1, 0); ch(LED_2, 1); ch(LED_3, 1); break;
    case 2: ch(LED_0, 1); ch(LED_1, 1); ch(LED_2, 0); ch(LED_3, 1); break;
    case 3: ch(LED_0, 1); ch(LED_1, 1); ch(LED_2, 1); ch(LED_3, 0); break;
   case 10: ch(LED_0, 1); ch(LED_1, 1); ch(LED_2, 1); ch(LED_3, 1); break;
  }
} 

float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  for (byte i=0; i<9; i++) data[i]=ds.read();
  int raw=(data[1]<<8)|data[0];
  float value = (float)raw *0.0625 + KORR_T; return value; // Расчет температуры и вывод
}

void ch(int pin, int logic){digitalWrite(pin, logic);}

28

Re: часы на gps модуле и семисегментных индикаторах

И еще иногда после показа температуры на один секунд выскакиваеть часы  на 5 часов разницей и потом правыльно показывает.

29

Re: часы на gps модуле и семисегментных индикаторах

У Вас отображение температуры 12*С, если минус делать то отрицательная температура будет показывать только до -9 градусов

30

Re: часы на gps модуле и семисегментных индикаторах

liman324 пишет:

У Вас отображение температуры 12*С, если минус делать то отрицательная температура будет показывать только до -9 градусов

Минусовой знак нету у меня,

31

Re: часы на gps модуле и семисегментных индикаторах

Попробуйте этот код

#define SEG_A  2
#define SEG_B  3
#define SEG_C  4
#define SEG_D  5
#define SEG_E  6
#define SEG_F  7
#define SEG_G  8
#define SEG_DP 9

#define LED_0  A0
#define LED_1  A1
#define LED_2  A2
#define LED_3  A3

#define time_offset   18000  // смещение от UTC 1 час = 3600
#define KORR_T  -2.7   // DS18B20 коррекция температуры

#include <TinyGPS++.h>      // https://github.com/mikalhart/TinyGPSPlus/archive/refs/heads/master.zip
#include <TimeLib.h>        // https://github.com/PaulStoffregen/Time/archive/master.zip
#include <OneWire.h>        // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip             
 TinyGPSPlus gps;
 OneWire  ds(13); // Вход датчика 18b20

byte an,segm,a[4],i,dpp;
int br=1;
unsigned long times;
byte last_minute, Second, Minute, Hour, Day, Month;
int Year;
int timer;
bool w=1,w1;

void setup() {
  Serial.begin(9600);   
  cli();
  TCCR2A = 0;
  TCCR2B = 0;
  TCNT2 = 0;
  OCR2A = 155;
  TCCR2A |= (1 << WGM21);
  TCCR2B |= (1 << CS22) | (1 << CS21);
  TIMSK2 |= (1 << OCIE2A);
  sei();
  pinMode(SEG_A,OUTPUT);
  pinMode(SEG_B,OUTPUT);
  pinMode(SEG_C,OUTPUT);
  pinMode(SEG_D,OUTPUT);
  pinMode(SEG_E,OUTPUT);
  pinMode(SEG_F,OUTPUT);
  pinMode(SEG_G,OUTPUT);
  pinMode(SEG_DP,OUTPUT);
  pinMode(LED_0,OUTPUT);
  pinMode(LED_1,OUTPUT);
  pinMode(LED_2,OUTPUT);
  pinMode(LED_3,OUTPUT);
}

void loop() {
 
 while (Serial.available() > 0){ 
    if (gps.encode(Serial.read())){
      if (gps.time.isValid()){
        Minute = gps.time.minute();
        Second = gps.time.second();
        Hour   = gps.time.hour();
      }
      if (gps.date.isValid()){
        Day   = gps.date.day();
        Month = gps.date.month();
        Year  = gps.date.year();
      }}}
      
      if(last_minute != gps.time.minute()){
        last_minute = gps.time.minute();
        setTime(Hour, Minute, Second, Day, Month, Year);
        adjustTime(time_offset);
 }

if (millis() > 5000 && gps.charsProcessed() < 10){while(true);}

 if(Year==2000){
    a[0]=11;
    a[1]=11;
    a[2]=11;
    a[3]=11;
      }
 else{    
   timer=hour()*100+minute();
   if(second()>=55){timer = dsRead(0)*100; delay(200);}
    if(timer<0){timer=abs(timer); 
    a[0]=timer/1000%10;
    a[1]=timer/100%10;
    }
    else{
    a[0]=11;
    a[1]=timer/100%10;
    }
    
   if(second()>=55){a[2]=13;}else{a[2]=timer/10%10;}
   if(second()>=55){a[3]=12;}else{a[3]=timer%10;}
 }
}


ISR(TIMER2_COMPA_vect){
   switch (i) {
    case 0: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[0];segment();an = 0;ch(SEG_DP, 1);anod();break;
    case 1: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[1];segment();an = 1;ch(SEG_DP, dpp);anod();break;
    case 2: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[2];segment();an = 2;ch(SEG_DP, 1);anod();break;
    case 3: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[3];segment();an = 3;ch(SEG_DP, 1);anod();break;
  }
  i++;if (i > 3) {i = 0;}
  if(millis()-times<500){dpp=1;}
  if(millis()-times>=500 || (second()>=55)){dpp=0;}
  if(millis()-times>1000){times=millis();}
  }

void segment() {
  switch (segm) {
            //  A          B             C              D             E            F            G
    case 0: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 0
    case 1: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 1
    case 2: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 1); break; // 2
    case 3: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 1); break; // 3
    case 4: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 4
    case 5: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 5
    case 6: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 6
    case 7: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 7
    case 8: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 8
    case 9: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 9
   case 11: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 1); break; // -
   case 10: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // пусто
   case 12: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // C
   case 13: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; //градус
  }
}

void anod() {
  switch (an) {
    case 0: ch(LED_0, 0); ch(LED_1, 1); ch(LED_2, 1); ch(LED_3, 1); break;
    case 1: ch(LED_0, 1); ch(LED_1, 0); ch(LED_2, 1); ch(LED_3, 1); break;
    case 2: ch(LED_0, 1); ch(LED_1, 1); ch(LED_2, 0); ch(LED_3, 1); break;
    case 3: ch(LED_0, 1); ch(LED_1, 1); ch(LED_2, 1); ch(LED_3, 0); break;
   case 10: ch(LED_0, 1); ch(LED_1, 1); ch(LED_2, 1); ch(LED_3, 1); break;
  }
} 

float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  for (byte i=0; i<9; i++) data[i]=ds.read();
  int raw=(data[1]<<8)|data[0];
  float value = (float)raw *0.0625 + KORR_T; return value; // Расчет температуры и вывод
}

void ch(int pin, int logic){digitalWrite(pin, logic);}

32

Re: часы на gps модуле и семисегментных индикаторах

Попробуйте этот

Пробовал этот код. Первый разряд постоянно горит сегмент G, и на часах и на градусах. Кроме G нечего не горить в первом разряде

33

Re: часы на gps модуле и семисегментных индикаторах

#define SEG_A  2
#define SEG_B  3
#define SEG_C  4
#define SEG_D  5
#define SEG_E  6
#define SEG_F  7
#define SEG_G  8
#define SEG_DP 9

#define LED_0  A0
#define LED_1  A1
#define LED_2  A2
#define LED_3  A3

#define time_offset   18000  // смещение от UTC 1 час = 3600
#define KORR_T  -2.7   // DS18B20 коррекция температуры

#include <TinyGPS++.h>      // https://github.com/mikalhart/TinyGPSPlus/archive/refs/heads/master.zip
#include <TimeLib.h>        // https://github.com/PaulStoffregen/Time/archive/master.zip
#include <OneWire.h>        // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip             
 TinyGPSPlus gps;
 OneWire  ds(13); // Вход датчика 18b20

byte an,segm,a[4],i,dpp;
int br=1;
unsigned long times;
byte last_minute, Second, Minute, Hour, Day, Month;
int Year;
int timer;
bool w=1,w1;
bool minus;


void setup() {
  Serial.begin(9600);   
  cli();
  TCCR2A = 0;
  TCCR2B = 0;
  TCNT2 = 0;
  OCR2A = 155;
  TCCR2A |= (1 << WGM21);
  TCCR2B |= (1 << CS22) | (1 << CS21);
  TIMSK2 |= (1 << OCIE2A);
  sei();
  pinMode(SEG_A,OUTPUT);
  pinMode(SEG_B,OUTPUT);
  pinMode(SEG_C,OUTPUT);
  pinMode(SEG_D,OUTPUT);
  pinMode(SEG_E,OUTPUT);
  pinMode(SEG_F,OUTPUT);
  pinMode(SEG_G,OUTPUT);
  pinMode(SEG_DP,OUTPUT);
  pinMode(LED_0,OUTPUT);
  pinMode(LED_1,OUTPUT);
  pinMode(LED_2,OUTPUT);
  pinMode(LED_3,OUTPUT);
}

void loop() {
 
 while (Serial.available() > 0){ 
    if (gps.encode(Serial.read())){
      if (gps.time.isValid()){
        Minute = gps.time.minute();
        Second = gps.time.second();
        Hour   = gps.time.hour();
      }
      if (gps.date.isValid()){
        Day   = gps.date.day();
        Month = gps.date.month();
        Year  = gps.date.year();
      }}}
      
      if(last_minute != gps.time.minute()){
        last_minute = gps.time.minute();
        setTime(Hour, Minute, Second, Day, Month, Year);
        adjustTime(time_offset);
 }

if (millis() > 5000 && gps.charsProcessed() < 10){while(true);}

 if(Year==2000){
    a[0]=11;
    a[1]=11;
    a[2]=11;
    a[3]=11;
      }
 else{    
   timer=hour()*100+minute();  
   if(second()>=55){timer = dsRead(0)*100; delay(200);
     if(timer<0){timer=abs(timer); minus=1;}else {minus=0;}
     if(minus==1){a[0]=11;}else{a[0]=timer/1000%10;}
     a[1]=timer/100%10;
     a[2]=13;
     a[3]=12;
   }
   else{
    a[0]=timer/1000%10;
    a[1]=timer/100%10;
    a[2]=timer/10%10;
    a[3]=timer%10;

 }}
}


ISR(TIMER2_COMPA_vect){
   switch (i) {
    case 0: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[0];segment();an = 0;ch(SEG_DP, 1);anod();break;
    case 1: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[1];segment();an = 1;ch(SEG_DP, dpp);anod();break;
    case 2: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[2];segment();an = 2;ch(SEG_DP, 1);anod();break;
    case 3: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[3];segment();an = 3;ch(SEG_DP, 1);anod();break;
  }
  i++;if (i > 3) {i = 0;}
  if(millis()-times<500){dpp=1;}
  if(millis()-times>=500 || (second()>=55)){dpp=0;}
  if(millis()-times>1000){times=millis();}
  }

void segment() {
  switch (segm) {
            //  A          B             C              D             E            F            G
    case 0: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 0
    case 1: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 1
    case 2: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 1); break; // 2
    case 3: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 1); break; // 3
    case 4: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 4
    case 5: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 5
    case 6: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 6
    case 7: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 7
    case 8: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 8
    case 9: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 9
   case 11: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 1); break; // -
   case 10: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // пусто
   case 12: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // C
   case 13: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; //градус
  }
}

void anod() {
  switch (an) {
    case 0: ch(LED_0, 0); ch(LED_1, 1); ch(LED_2, 1); ch(LED_3, 1); break;
    case 1: ch(LED_0, 1); ch(LED_1, 0); ch(LED_2, 1); ch(LED_3, 1); break;
    case 2: ch(LED_0, 1); ch(LED_1, 1); ch(LED_2, 0); ch(LED_3, 1); break;
    case 3: ch(LED_0, 1); ch(LED_1, 1); ch(LED_2, 1); ch(LED_3, 0); break;
   case 10: ch(LED_0, 1); ch(LED_1, 1); ch(LED_2, 1); ch(LED_3, 1); break;
  }
} 

float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  for (byte i=0; i<9; i++) data[i]=ds.read();
  int raw=(data[1]<<8)|data[0];
  float value = (float)raw *0.0625 + KORR_T; return value; // Расчет температуры и вывод
}

void ch(int pin, int logic){digitalWrite(pin, logic);}

34

Re: часы на gps модуле и семисегментных индикаторах

Этот код заработало. Минусовой знак появился. Спасибо уважаемый за Ваш помощ. Только после показа температуры на один секунд показывает другое время и потом показывает правильное время.

35

Re: часы на gps модуле и семисегментных индикаторах

Этот код заработало. Минусовой знак появился. Спасибо уважаемый за Ваш помощ. Только после показа температуры на один секунд показывает другое время и потом показывает правильное время.

36

Re: часы на gps модуле и семисегментных индикаторах

Не факт что поможет, но вдруг

#define SEG_A  2
#define SEG_B  3
#define SEG_C  4
#define SEG_D  5
#define SEG_E  6
#define SEG_F  7
#define SEG_G  8
#define SEG_DP 9

#define LED_0  A0
#define LED_1  A1
#define LED_2  A2
#define LED_3  A3

#define time_offset   18000  // смещение от UTC 1 час = 3600
#define KORR_T  -2.7   // DS18B20 коррекция температуры

#include <TinyGPS++.h>      // https://github.com/mikalhart/TinyGPSPlus/archive/refs/heads/master.zip
#include <TimeLib.h>        // https://github.com/PaulStoffregen/Time/archive/master.zip
#include <OneWire.h>        // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip             
 TinyGPSPlus gps;
 OneWire  ds(13); // Вход датчика 18b20

byte an,segm,a[4],i,dpp;
int br=1;
unsigned long times;
byte last_minute, Second, Minute, Hour, Day, Month;
int Year;
int timer;
bool w=1,w1;
bool minus;


void setup() {
  Serial.begin(9600);   
  cli();
  TCCR2A = 0;
  TCCR2B = 0;
  TCNT2 = 0;
  OCR2A = 155;
  TCCR2A |= (1 << WGM21);
  TCCR2B |= (1 << CS22) | (1 << CS21);
  TIMSK2 |= (1 << OCIE2A);
  sei();
  pinMode(SEG_A,OUTPUT);
  pinMode(SEG_B,OUTPUT);
  pinMode(SEG_C,OUTPUT);
  pinMode(SEG_D,OUTPUT);
  pinMode(SEG_E,OUTPUT);
  pinMode(SEG_F,OUTPUT);
  pinMode(SEG_G,OUTPUT);
  pinMode(SEG_DP,OUTPUT);
  pinMode(LED_0,OUTPUT);
  pinMode(LED_1,OUTPUT);
  pinMode(LED_2,OUTPUT);
  pinMode(LED_3,OUTPUT);
}

void loop() {
 
 while (Serial.available() > 0){ 
    if (gps.encode(Serial.read())){
      if (gps.time.isValid()){
        Minute = gps.time.minute();
        Second = gps.time.second();
        Hour   = gps.time.hour();
      }
      if (gps.date.isValid()){
        Day   = gps.date.day();
        Month = gps.date.month();
        Year  = gps.date.year();
      }}}
      
      if(last_minute != gps.time.minute()){
        last_minute = gps.time.minute();
        setTime(Hour, Minute, Second, Day, Month, Year);
        adjustTime(time_offset);
 }

   hour();
   minute(); 

if (millis() > 5000 && gps.charsProcessed() < 10){while(true);}

 if(Year==2000){
    a[0]=11;
    a[1]=11;
    a[2]=11;
    a[3]=11;
      }
 else{    
   timer=hour()*100+minute();  
   if(second()>=55){timer = dsRead(0)*100; delay(200);
     if(timer<0){timer=abs(timer); minus=1;}else {minus=0;}
     if(minus==1){a[0]=11;}else{a[0]=timer/1000%10;}
     a[1]=timer/100%10;
     a[2]=13;
     a[3]=12;
   }
   else{
    a[0]=timer/1000%10;
    a[1]=timer/100%10;
    a[2]=timer/10%10;
    a[3]=timer%10;
 }}
}


ISR(TIMER2_COMPA_vect){
   switch (i) {
    case 0: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[0];segment();an = 0;ch(SEG_DP, 1);anod();break;
    case 1: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[1];segment();an = 1;ch(SEG_DP, dpp);anod();break;
    case 2: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[2];segment();an = 2;ch(SEG_DP, 1);anod();break;
    case 3: segm = 10; segment();an = 10;anod();delayMicroseconds(br);segm = a[3];segment();an = 3;ch(SEG_DP, 1);anod();break;
  }
  i++;if (i > 3) {i = 0;}
  if(millis()-times<500){dpp=1;}
  if(millis()-times>=500 || (second()>=55)){dpp=0;}
  if(millis()-times>1000){times=millis();}
  }

void segment() {
  switch (segm) {
            //  A          B             C              D             E            F            G
    case 0: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 0
    case 1: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 1
    case 2: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 1); break; // 2
    case 3: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 1); break; // 3
    case 4: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 4
    case 5: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 5
    case 6: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 6
    case 7: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 7
    case 8: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 8
    case 9: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 9
   case 11: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 1); break; // -
   case 10: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // пусто
   case 12: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // C
   case 13: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; //градус
  }
}

void anod() {
  switch (an) {
    case 0: ch(LED_0, 0); ch(LED_1, 1); ch(LED_2, 1); ch(LED_3, 1); break;
    case 1: ch(LED_0, 1); ch(LED_1, 0); ch(LED_2, 1); ch(LED_3, 1); break;
    case 2: ch(LED_0, 1); ch(LED_1, 1); ch(LED_2, 0); ch(LED_3, 1); break;
    case 3: ch(LED_0, 1); ch(LED_1, 1); ch(LED_2, 1); ch(LED_3, 0); break;
   case 10: ch(LED_0, 1); ch(LED_1, 1); ch(LED_2, 1); ch(LED_3, 1); break;
  }
} 

float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  for (byte i=0; i<9; i++) data[i]=ds.read();
  int raw=(data[1]<<8)|data[0];
  float value = (float)raw *0.0625 + KORR_T; return value; // Расчет температуры и вывод
}

void ch(int pin, int logic){digitalWrite(pin, logic);}

37

Re: часы на gps модуле и семисегментных индикаторах

Здравствуйте уважаемый. С этим кодом часы часто выходить не правильные показания. По этому прощил предушую скейч.

38

Re: часы на gps модуле и семисегментных индикаторах

Тогда просто добавьте паузу после loop(){

для стабилизации работы модуля

delay(10);