Часы DS1302 (перескакивают секунды)
- Войдите на сайт для отправки комментариев
Чт, 14/04/2016 - 17:55
Суть проблемы:
При отображении времени 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);
}
https://youtu.be/Nrc6CrsPvdE
///ВВВВААААЖЖЖЖНО!!!! 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); }Вот как-то так...
Спасибо за идею. Надо было еще добавить 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); }вдруг кому пригодиться: Метеостанция на ардуино уно.
Показывает: Атмосферное давление, время, температуру окружающей среды, влажность, высота над уровнем моря.
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("%"); }