Часы DS1302 (перескакивают секунды)

IDis
Offline
Зарегистрирован: 14.04.2016

Суть проблемы:

При отображении времени LCD 1602а

1: при отображении минут не отображается ноль перед числом,  то есть время имеет вид 15:6:48 а надо что бы часы выглядили так:15:06:48

2: Секунды глючат. Идет такой ряд: 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 09, 19, 29, 39, 49, 59, 69, 79, 89, 99, 10, 11, 12, 13...50

в сериал мониторе секунды отображаются нормально, а на дисплей... такая засада.

 

///ВВВВААААЖЖЖЖНО!!!! 3 и 4 пин тут настроены для питания что бы при включении платы в ардуино не нужно было бы провода тянуть.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <stdio.h>
#include <DS1302.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); 

namespace {
      const int kCePin   = 7;  // RST подключаем часы
      const int kIoPin   = 6;  // DAT подключаем часы
      const int kSclkPin = 5;  // CLK подключаем часы
      DS1302 rtc(kCePin, kIoPin, kSclkPin);

String dayAsString(const Time::Day day) {
    switch (day) {
    case Time::kSunday: return "Sunday";
    case Time::kMonday: return "Monday";
    case Time::kTuesday: return "Tuesday";
    case Time::kWednesday: return "Wednesday";
    case Time::kThursday: return "Thursday";
    case Time::kFriday: return "Friday";
    case Time::kSaturday: return "Saturday";
  }
  return "(unknown day)";
}
void printTime() {
          Time t = rtc.time();
     const String day = dayAsString(t.day);
     char buf[50];
  snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d",
           day.c_str(),
           t.yr, t.mon, t.date,
           t.hr, t.min, t.sec);
   Serial.println(buf);
   Serial.println(t.sec);
   lcd.setCursor(7, 0);
   lcd.print(t.hr);
   lcd.print(":");
   lcd.print(t.min);
   lcd.print(":");
   lcd.print(t.sec);
}
}  



void setup() {
lcd.begin();
Serial.begin(9600);
pinMode (4, OUTPUT); //// тут настраивается питание
pinMode (3, OUTPUT);
digitalWrite (4,LOW);
digitalWrite (3,HIGH);

  rtc.writeProtect(false); // после установки времени закоменировать
  rtc.halt(false); // после установки времени закоменировать
  Time t(2016, 4, 14, 18, 2, 50, Time::kSunday); // после установки времени закоменировать
  rtc.time(t); // после установки времени закоменировать
}
void loop() {
  printTime();
  delay(1000);
}

 

IDis
Offline
Зарегистрирован: 14.04.2016
partizan86
Offline
Зарегистрирован: 21.01.2014
///ВВВВААААЖЖЖЖНО!!!! 3 и 4 пин тут настроены для питания что бы при включении платы в ардуино не нужно было бы провода тянуть.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <stdio.h>
#include <DS1302.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); 

namespace {
      const int kCePin   = 7;  // RST подключаем часы
      const int kIoPin   = 6;  // DAT подключаем часы
      const int kSclkPin = 5;  // CLK подключаем часы
      DS1302 rtc(kCePin, kIoPin, kSclkPin);

String dayAsString(const Time::Day day) {
    switch (day) {
    case Time::kSunday: return "Sunday";
    case Time::kMonday: return "Monday";
    case Time::kTuesday: return "Tuesday";
    case Time::kWednesday: return "Wednesday";
    case Time::kThursday: return "Thursday";
    case Time::kFriday: return "Friday";
    case Time::kSaturday: return "Saturday";
  }
  return "(unknown day)";
}
void printTime() {
          Time t = rtc.time();
     const String day = dayAsString(t.day);
     char buf[50];
  snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d",
           day.c_str(),
           t.yr, t.mon, t.date,
           t.hr, t.min, t.sec);
   Serial.println(buf);
   Serial.println(t.sec);
   lcd.setCursor(7, 0);
   if (t.hr < 10) lcd.print("0")
   lcd.print(t.hr);
   lcd.print(":");
   if (t.min < 10) lcd.print("0")
   lcd.print(t.min);
   lcd.print(":");
   if (t.sec < 10) lcd.print("0")
   lcd.print(t.sec);
}
}  



void setup() {
lcd.begin();
Serial.begin(9600);
pinMode (4, OUTPUT); //// тут настраивается питание
pinMode (3, OUTPUT);
digitalWrite (4,LOW);
digitalWrite (3,HIGH);

  rtc.writeProtect(false); // после установки времени закоменировать
  rtc.halt(false); // после установки времени закоменировать
  Time t(2016, 4, 14, 18, 2, 50, Time::kSunday); // после установки времени закоменировать
  rtc.time(t); // после установки времени закоменировать
}
void loop() {
  printTime();
  delay(1000);
}

Вот как-то так...

IDis
Offline
Зарегистрирован: 14.04.2016

Спасибо за идею. Надо было еще добавить else и все заработало. и глюк исчез с секундами.

рабочий код

///ВВВВААААЖЖЖЖНО!!!! 3 и 4 пин тут настроены для питания что бы при включении платы в ардуино не нужно было бы провода тянуть.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <stdio.h>
#include <DS1302.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // Для экрана 16х2 (двухстрочный)


namespace {
      const int kCePin   = 7;  // RST подключаем часы
      const int kIoPin   = 6;  // DAT подключаем часы
      const int kSclkPin = 5;  // CLK подключаем часы
      DS1302 rtc(kCePin, kIoPin, kSclkPin);

String dayAsString(const Time::Day day) {
    switch (day) {
    case Time::kSunday: return "Sunday";
    case Time::kMonday: return "Monday";
    case Time::kTuesday: return "Tuesday";
    case Time::kWednesday: return "Wednesday";
    case Time::kThursday: return "Thursday";
    case Time::kFriday: return "Friday";
    case Time::kSaturday: return "Saturday";
  }
  return "(unknown day)";
}
void printTime() {
          Time t = rtc.time();
     const String day = dayAsString(t.day);
     char buf[50];
  snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d",
           day.c_str(),
           t.yr, t.mon, t.date,
           t.hr, t.min, t.sec);
  Serial.println(buf);
  Serial.println(t.sec);
   
   lcd.setCursor(7, 0);
   
   if (t.hr < 10) {lcd.print("0");
        lcd.print(t.hr);}
   else lcd.print(t.hr);
        lcd.print(":");
 
   if (t.min < 10) {lcd.print("0");
       lcd.print(t.min);}
  else lcd.print(t.min);
       lcd.print(":");
  
   if (t.sec < 10){ lcd.print("0");
       lcd.print(t.sec);}
  else lcd.print(t.sec);
}
}  



void setup() {
lcd.begin();
Serial.begin(9600);
pinMode (4, OUTPUT); //// тут настраивается питание
pinMode (3, OUTPUT);
digitalWrite (4,LOW);
digitalWrite (3,HIGH);

  rtc.writeProtect(false); // после установки времени закоменировать
  rtc.halt(false); // после установки времени закоменировать
  Time t(2016, 4, 14, 18, 2, 50, Time::kSunday); // после установки времени закоменировать
  rtc.time(t); // после установки времени закоменировать
}
void loop() {
  printTime();
  delay(1000);
}

 

IDis
Offline
Зарегистрирован: 14.04.2016

вдруг кому пригодиться: Метеостанция на ардуино уно.

Показывает: Атмосферное давление, время, температуру окружающей среды, влажность, высота над уровнем моря.

https://youtu.be/S8M23IYgzgk

датчик давления BMP180: VIN-+5В  GND-земля  SLC- А5  SDA-А4

датчик влажности DHT11: VCC - +5В  DATA-13   GND-земля

часы RTC модуль (микросхема DS1302): VCC- +5В GND- земля CLK-7 DAT-8 RST-9


#include <Wire.h>
#include <BMP085.h>
#include <LiquidCrystal.h>
#include "DHT.h"
#define DHTPIN 13     // датчик влажности подключаем к 13 пину
#define DHTTYPE DHT11   
DHT dht(DHTPIN, DHTTYPE);
#include <stdio.h>
#include <DS1302.h>    



BMP085 dps = BMP085();   // барометр
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // инициализируем LCD, указывая управляющие контакты

long Temperature = 0, Pressure = 0, Altitude = 0;


namespace {
      DS1302 rtc(9, 8, 7); // подключаем часы

void printTime() {
          Time t = rtc.time();
     char buf[50];
  snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d",
            t.yr, t.mon, t.date, t.hr, t.min, t.sec);
 
    
   lcd.setCursor(7, 0); //часы
   
   if (t.hr < 10) {lcd.print("0");
        lcd.print(t.hr);}
   else lcd.print(t.hr);
        lcd.print(":");
 
   if (t.min < 10) {lcd.print("0");
       lcd.print(t.min);}
  else lcd.print(t.min);
       lcd.print(":");
  
   if (t.sec < 10){ lcd.print("0");
       lcd.print(t.sec);}
  else lcd.print(t.sec);
}
} 


void setup(void) {

  
  dht.begin();
  lcd.begin(16, 2);
  lcd.clear();  
  Wire.begin();
  delay(1000);
  dps.init(MODE_STANDARD, 3200, true);
//dps.init();

  rtc.writeProtect(false); // после установки времени закоменировать
  rtc.halt(false); // после установки времени закоменировать
  Time t(2016, 4, 14, 21, 6, 20, Time::kSunday); // после установки времени закоменировать
  rtc.time(t); // после установки времени закоменировать

}         
 
void loop(void) {
for (int j=0; j<5000; j=j+1000) //  Обновление часов каждую секунду обновленние данных с датчиков каждые 5 секунд.
{
printTime();
  delay(1000);
}
  
  dps.getPressure(&Pressure);
  dps.getTemperature(&Temperature);
  dps.getAltitude(&Altitude); 

  lcd.setCursor(0, 0);  
  lcd.print(Pressure/133.3, 1); // 1 - показать десятые без сотых.
  lcd.setCursor(1, 1);
  lcd.print(Temperature*0.1, 1); //температура
  lcd.setCursor(11, 1);// расположение данных о высоте
  lcd.print(Altitude/100.0, 1);
  lcd.print("m   ");
 //влажность
  float h = dht.readHumidity();

  lcd.setCursor(7, 1); // расположение числа
  lcd.print(h,0);// 0 - не показывать десятичные знаки
  lcd.print("%");


}