Arduino - усовершенствованные часы.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Добрый день!

Сделал логгер на UNO+DHT22+DS1307+LCD16x2. (Планирую добавить еще Ethernet shild с micro SD) для хранения и передачи данных.

Сейчас часы показывают время с 1-м числом вот так 9:5:3, а хотелось бы 09:05:03. Ну и заменить секунды миганием ":" . А так же дату в формате 12.04.13, а сейчас кажет так: 12.4.2013.  Что то эта задача (на первый взгляд простая) поставила меня в тупик. Может кто разжует? Спасибо!

 

Кстати Скетч выложу, вдруг кому пригодиться:

 

#include <LiquidCrystal.h>
#include "DHT.h"
#include "Arduino.h"
#include <Wire.h>
#include <DS1307.h>
#define DHTPIN 9
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
 void setup() {
 lcd.begin(16, 2);
 dht.begin();
 }

 void loop() {
 float h = dht.readHumidity();
 float t = dht.readTemperature();
  lcd.setCursor(0, 0);
  lcd.print("T=");
  lcd.print(t);
  lcd.print ("C");
  lcd.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
  lcd.print(":");
  lcd.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
  lcd.print(":");
  lcd.print(RTC.get(DS1307_SEC,false));
  lcd.setCursor(0, 1);
  lcd.print("H=");
  lcd.print(h);
  lcd.print("%  ");
  lcd.print(RTC.get(DS1307_DATE,false));//read date
  lcd.print("/");
  lcd.print(RTC.get(DS1307_MTH,false));//read month
 
 }

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Мне тоже лень искать примерны и обсуждения по форуму, но как-то так.

if (Data < 10) {

print "0" Data;

} else {

print Data;

}

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Andrey_Y_Ostanovsky пишет:

Мне тоже лень искать примерны и обсуждения по форуму, но как-то так.

if (Data < 10) {

print "0" Data;

} else {

print Data;

}

 

спасибо!

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

ingener.solovyev пишет:

Andrey_Y_Ostanovsky пишет:

Мне тоже лень искать примерны и обсуждения по форуму, но как-то так.

if (Data < 10) {

print "0" Data;

} else {

print Data;

}

 

спасибо!

А по миганию : вместо секунд можете направить на путь истинный?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

ingener.solovyev пишет:

А по миганию : вместо секунд можете направить на путь истинный?

Выводить двоеточие через раз, например, переприсваивая переменной символ двоеточия и пробела :)

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Последний глупый вопрос на сегодня, как округлить число с сотых до десятых для вывода на экран?

maksim
Offline
Зарегистрирован: 12.02.2012

 lcd.print(t, 1);

Looka
Offline
Зарегистрирован: 24.04.2012

В каждом цикле loop() мерить температуру (да и выводить на экран) не рационально с точки зрения расходывания процесорного времени. Конечно это не принципиально если задача ограниченная - только мерить и только вывести.
Но если будетет добавлять функционал  или количество датчиков, проблема может быть уже щественной.

В этом смысле не желательно в каждом цикле loop()  использовать функции с dalay().   Более красивое решение - измерять не в каждом цикле, а через определенное время, скажем раз  в 5 или 10 секунд, тоже самое с выводом.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Учту, думаю еще релюшку докинуть, пару кнопок и Ethernet shild.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Новая проблема. При отключении основного питания часы DS1307 начинают сильно отставать. Батарейка новая. М.б. не заряжена? Она зарежается при включении устройства к центральному питанию? Или ее надо отдельно заряжать?

 

Сейчас скетч выглядит уже так:

#include <LiquidCrystal.h>
#include "DHT.h"
#include "Arduino.h"
#include <Wire.h>
#include <DS1307.h>
#define DHTPIN 9
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
 void setup() {
 lcd.begin(16, 2);
 dht.begin();
 }

 void loop() {
 float h = dht.readHumidity();
 float t = dht.readTemperature();
  lcd.setCursor(0, 0);
  lcd.print("T=");
  lcd.print(t, 1);
  lcd.print ("C ");
  lcd.print("H=");
  lcd.print(h, 1);
  lcd.print("% ");
  lcd.setCursor(0, 1);
  lcd.print(" ");
  if (RTC.get(DS1307_HR,true) < 10) {
     lcd.print ("0");
     lcd.print (RTC.get(DS1307_HR,true));
      } else {
        lcd.print (RTC.get(DS1307_HR,true));
  }
  lcd.print(":");
  if (RTC.get(DS1307_MIN,false) < 10) {
     lcd.print ("0");
     lcd.print (RTC.get(DS1307_MIN,false));
      } else {
        lcd.print (RTC.get(DS1307_MIN,false));
  }
  lcd.print(":");
  if (RTC.get(DS1307_SEC,false) < 10) {
     lcd.print ("0");
     lcd.print (RTC.get(DS1307_SEC,false));
      } else {
        lcd.print (RTC.get(DS1307_SEC,false));
      }
  lcd.print(" ");
  if (RTC.get(DS1307_DATE,false) < 10) {
     lcd.print ("0");
     lcd.print (RTC.get(DS1307_DATE,false));
      } else {
        lcd.print (RTC.get(DS1307_DATE,false));
      }
  lcd.print(".");
  if (RTC.get(DS1307_MTH,false) < 10) {
     lcd.print ("0");
     lcd.print (RTC.get(DS1307_MTH,false));
      } else {
        lcd.print (RTC.get(DS1307_MTH,false));
      }
   }

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

ingener.solovyev пишет:

Новая проблема. При отключении основного питания часы DS1307 начинают сильно отставать. Батарейка новая. М.б. не заряжена? Она зарежается при включении устройства к центральному питанию? Или ее надо отдельно заряжать?

Вы решили по всем граблям пройти самостоятельно? :)

http://arduino.ru/forum/programmirovanie/chasy-ds1307-ne-idut-i-ne-ustan...

http://arduino.ru/forum/programmirovanie/ds1307-pokazyvayut-strannoe-vre...

Литиевые батарейки CR-2032 - одноразовые, их заряжать не надо...

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

 

Так как те кто решил проблему в теме по ссылке отписались и здесь, выложу схему своего модуля сюда.

http://photo.reborn.ru/?sectionid=602&a=watch_photo&pic=eb4c59c4b9652b9aeed53e61b9919844-00036609&location=3 ( не смог выложить на данный форум).

Что где нужно обрезать чтоб часы шли и без питания на UNO? Батарейку уже менял. Как только вытаскиваю питание, часы встают, питание подаю, идут с того момента как я отключил контроллер от сети.

А ну и зачем нужен DS еще разжуйте плз.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

ingener.solovyev пишет:

Что где нужно обрезать чтоб часы шли и без питания на UNO? Батарейку уже менял. Как только вытаскиваю питание, часы встают, питание подаю, идут с того момента как я отключил контроллер от сети.

Меняйте еще, ничего резать не надо - у Вас уже R7 нету. У меня такая же плата, сменил пару батареек, пока попалась рабочая. Но у меня просто было куплено два десятка CR2032 пару лет назад, поэтому не все выжили...

ingener.solovyev пишет:

А ну и зачем нужен DS еще разжуйте плз.

http://arduino.ru/forum/apparatnye-voprosy/speshat-chasy-ds1307

1-wire с цифровым термометром DS18B20.

А еще вот тут, в нижней части схемы, показана резисторная "подтяжка" i2c к линии +5В. Возможно, тоже пригодится...

http://arduino.ru/sites/default/files/u4613/1.jpg