Помогите разобраться с часами реального времени

SVD
Offline
Зарегистрирован: 05.04.2018

Суть такая. 

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

В чем причина? 

[code]
#include <Wire.h> // библиотека для работы I²C
#include "TroykaRTC.h"// библиотека для работы с часами реального времени
#include <SPI.h> // библиотека для работы с SPI
#include <SD.h> // библиотека для работы с SD-картами
#include <iarduino_DHT.h>
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x3f,16,2);
iarduino_DHT sensor(2);
 
#define SD_CS_PIN  7
#define LEN_TIME 12 // размер массива для времени
#define LEN_DATE 12 // размер массива для даты
#define LEN_DOW 12 // размер массива для дня недели
 
RTC clock; // создаём объект для работы с часами реального времени
 
char time[LEN_TIME]; // массив для хранения текущего времени
char date[LEN_DATE]; // массив для хранения текущей даты
char weekDay[LEN_DOW]; // массив для хранения текущего дня недели
 
String dataString = "";
  
void setup()
{
  Serial.begin(9600);   // открываем последовательный порт
  clock.begin();   // инициализация часов
  // clock.set(10,25,45,27,07,2005,THURSDAY);  // метод установки времени и даты в модуль вручную   
  clock.set(__TIMESTAMP__);   // метод установки времени и даты автоматически при компиляции
  // закоментируйте оба метода clock.set();   // что бы время менялось при прошивки или сбросе питания
  Serial.println("Initializing SD card...");
  // если microSD-карта не была обнаружена
  if (!SD.begin(SD_CS_PIN)) {
    // выводим сообщение об ошибке
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  } else {
    Serial.println("Card initialized.");
  }
}
  
void loop()
{
  int check; // переменная состояния датчика
  int temperature;  // переменная покозания температуры
  int humidity; // переменная показания влажности
  dataString = "";
  // мониторинг ошибок
  // считывание данных с датчика DHT11
  check = sensor.read();
    clock.read();   // запрашиваем данные с часов
  clock.getTimeStamp(time, date, weekDay);   // сохраняем текущее время, дату и день недели в переменные
  Serial.print(time); // выводим в serial порт текущее время, дату и день недели
  Serial.print("\t"); // выводим в serial порт текущее время, дату и день недели
  Serial.print(date); // выводим в serial порт текущее время, дату и день недели
  Serial.print("\t"); // выводим в serial порт текущее время, дату и день недели
  Serial.println(weekDay); // выводим в serial порт текущее время, дату и день недели
  switch (check) {
    case DHT_OK: // всё OK
      temperature = sensor.tem; // считываем показания влажности и температуры
      humidity = sensor.hum;
      dataString += String(time);       // формируем строку с результатами показаний датчика
      dataString += "\t"; // ставим знак табуляции
      dataString += String(temperature);
      dataString += "\t";
      dataString += String(humidity);
      dataString += "\r";
 
      Serial.print(dataString);     // выводим результаты в serial-порт
     
      saveSD();      // сохраняем на microSD
      break;
    case DHT_ERROR_CHECKSUM:    // ошибка контрольной суммы
      Serial.println("Checksum error");
      break;
    default:     // неизвестная ошибка
      Serial.println("Unknown error");
      break;
  }
  lcd.init();  //включение дисплея 
  lcd.backlight();   //включение подсветки
  lcd.setCursor(8, 1); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
  lcd.print(time);//выводим сообщение
  lcd.setCursor(7, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
  lcd.print(temperature);//выводим сообщение
  lcd.setCursor(9, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
  lcd.print(" C");//выводим сообщение
  lcd.setCursor(12, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
  lcd.print(humidity);//выводим сообщение
  lcd.setCursor(14, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
  lcd.print(" %");//выводим сообщение
  lcd.setCursor(7, 1); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
  lcd.print("S");//выводим сообщение
  delay(1000);  // ждём одну секунду
}
void saveSD()
{
  File dataFile = SD.open("sdv.txt", FILE_WRITE);  // создаём файл для записи
  if (dataFile) {   // если файл доступен для записи
    dataFile.println(dataString);     // сохраняем данные
    dataFile.close();    // закрываем файл
    Serial.println("Save OK");    // выводим сообщение об удачной записи
  } else {
    Serial.println("Error opening sdv.txt");    // если файл не доступен
  }
}
[/code]
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Не знаю, что у Вас за модуль, но среди китайских попадаются такие, в которых вроде как предусмотена цепь заряда аккумулятора, а реально стоит не аккумулятор, а обычная батарейка. Нужно выпаять все, относящееся к цепи заряда, а на освободившееся место поставить перемычку.

JasKo
Offline
Зарегистрирован: 21.11.2015
Вот эту строчку 
 clock.set(__TIMESTAMP__);   // метод установки времени и даты автоматически при компиляции

нужно закоментировать.

 

SVD
Offline
Зарегистрирован: 05.04.2018

Часы реального времени RTC (Real Time Clock) — модуль на базе чипа DS1307 с автономным питанием от батарейки-таблетки. Используйте его для получения текущей секунды, минуты, часа, дня недели месяца и года.

SVD
Offline
Зарегистрирован: 05.04.2018

Извиняюсь за не грамотность. "Закоментировать" это что значит? 

sadman41
Offline
Зарегистрирован: 19.10.2016
SVD
Offline
Зарегистрирован: 05.04.2018

А подскажите пожалуйста. Как изменить выше приведенный код так, что бы запись на SD производилась каждые 15 секунд?

Спасибо.

ven-til
Offline
Зарегистрирован: 13.02.2018

SVD пишет:

А подскажите пожалуйста. Как изменить выше приведенный код так, что бы запись на SD производилась каждые 15 секунд?

Спасибо.

BlinkWithoutDelay

SVD
Offline
Зарегистрирован: 05.04.2018

Не переходит по ссылке.

ven-til
Offline
Зарегистрирован: 13.02.2018
SVD
Offline
Зарегистрирован: 05.04.2018

Подскажите еще пожалуйста. На LCD 1602 на этом коде, что вначале темы, часы обновляется как-то рывками секунды обновляются каждые 3 секунды, а не плавно каждую секунду. 

SVD
Offline
Зарегистрирован: 05.04.2018
[code]
#include <Wire.h> // библиотека для работы I²C
#include "TroykaRTC.h"// библиотека для работы с часами реального времени
#include <SPI.h> // библиотека для работы с SPI
#include <SD.h> // библиотека для работы с SD-картами
#include <iarduino_DHT.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3f,16,2);
iarduino_DHT sensor(2);

#define SD_CS_PIN  7
#define LEN_TIME 12 // размер массива для времени
#define LEN_DATE 12 // размер массива для даты
#define LEN_DOW 12 // размер массива для дня недели

RTC clock; // создаём объект для работы с часами реального времени

char time[LEN_TIME]; // массив для хранения текущего времени
char date[LEN_DATE]; // массив для хранения текущей даты
char weekDay[LEN_DOW]; // массив для хранения текущего дня недели

String dataString = "";
  
void setup()
{
  Serial.begin(9600);   // открываем последовательный порт
  clock.begin();   // инициализация часов
  // clock.set(10,25,45,27,07,2005,THURSDAY);  // метод установки времени и даты в модуль вручную   
  //clock.set(__TIMESTAMP__);   // метод установки времени и даты автоматически при компиляции
  // закоментируйте оба метода clock.set();   // что бы время менялось при прошивки или сбросе питания
  Serial.println("Initializing SD card...");
  // если microSD-карта не была обнаружена
  if (!SD.begin(SD_CS_PIN)) {
    // выводим сообщение об ошибке
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  } else {
    Serial.println("Card initialized.");
  }
}
  
void loop()
{
  int check; // переменная состояния датчика
  int temperature;  // переменная покозания температуры
  int humidity; // переменная показания влажности
  dataString = "";
  // мониторинг ошибок
  // считывание данных с датчика DHT11
  check = sensor.read();
    clock.read();   // запрашиваем данные с часов
  clock.getTimeStamp(time, date, weekDay);   // сохраняем текущее время, дату и день недели в переменные
  Serial.print(time); // выводим в serial порт текущее время, дату и день недели
  Serial.print("\t"); // выводим в serial порт текущее время, дату и день недели
  Serial.print(date); // выводим в serial порт текущее время, дату и день недели
  Serial.print("\t"); // выводим в serial порт текущее время, дату и день недели
  Serial.println(weekDay); // выводим в serial порт текущее время, дату и день недели
  switch (check) {
    case DHT_OK: // всё OK
      temperature = sensor.tem; // считываем показания влажности и температуры
      humidity = sensor.hum;
      dataString += String(time);       // формируем строку с результатами показаний датчика
      dataString += "\t"; // ставим знак табуляции
      dataString += String(temperature);
      dataString += "\t";
      dataString += String(humidity);
      dataString += "\r";
 
      Serial.print(dataString);     // выводим результаты в serial-порт
     
      saveSD();      // сохраняем на microSD
      break;
    case DHT_ERROR_CHECKSUM:    // ошибка контрольной суммы
      Serial.println("Checksum error");
      break;
    default:     // неизвестная ошибка
      Serial.println("Unknown error");
      break;
  }
  lcd.init();  //включение дисплея 
  lcd.backlight();   //включение подсветки
  lcd.print("27 C"); //выводим сообщение
  lcd.setCursor(0, 1); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
  lcd.print("37 bar");//выводим сообщение
  lcd.setCursor(8, 1); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
  lcd.print(time);//выводим сообщение
  lcd.setCursor(7, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
  lcd.print(temperature);//выводим сообщение
  lcd.setCursor(9, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
  lcd.print(" C");//выводим сообщение
  lcd.setCursor(12, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
  lcd.print(humidity);//выводим сообщение
  lcd.setCursor(14, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
  lcd.print(" %");//выводим сообщение
  lcd.setCursor(7, 1); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
  lcd.print("S");//выводим сообщение
  delay(1000);  // ждём одну секунду
}
void saveSD()
{
  File dataFile = SD.open("sdv.txt", FILE_WRITE);  // создаём файл для записи
  if (dataFile) {   // если файл доступен для записи
    dataFile.println(dataString);     // сохраняем данные
    dataFile.close();    // закрываем файл
    Serial.println("Save OK");    // выводим сообщение об удачной записи
  } else {
    Serial.println("Error opening sdv.txt");    // если файл не доступен
  }
}
[/code]

Покажите пожалуйста, как нужно  код изменить, чтобы на сд каждые 15 секунд записывалось, а не каждое считывание информации с датчика. 

П.С. Извиняюсь за нубские вопросы!)

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

SVD пишет:

Покажите пожалуйста, как нужно  код изменить, чтобы на сд каждые 15 секунд записывалось, а не каждое считывание информации с датчика.

П.С. Извиняюсь за нубские вопросы!)

Как то так 

uint32_t milTime;//Переменная для фиксации времени

void setup(){

}  

void loop(){

switch (check) {
    case DHT_OK: // всё OK
      temperature = sensor.tem; // считываем показания влажности и температуры
      humidity = sensor.hum;
      dataString += String(time);       // формируем строку с результатами показаний датчика
      dataString += "\t"; // ставим знак табуляции
      dataString += String(temperature);
      dataString += "\t";
      dataString += String(humidity);
      dataString += "\r";
 
      Serial.print(dataString);     // выводим результаты в serial-порт
///////////
     if (millis() - milTime >= 15000)
      {
       milTime = millis();
       saveSD();      // сохраняем на microSD 
      }
///////////
      break;
    case DHT_ERROR_CHECKSUM:    // ошибка контрольной суммы
      Serial.println("Checksum error");
      break;
    default:     // неизвестная ошибка
      Serial.println("Unknown error");
      break;
  }
}

 

SVD
Offline
Зарегистрирован: 05.04.2018

vosara пишет:

SVD пишет:

Покажите пожалуйста, как нужно  код изменить, чтобы на сд каждые 15 секунд записывалось, а не каждое считывание информации с датчика.

П.С. Извиняюсь за нубские вопросы!)

Как то так 

uint32_t milTime;//Переменная для фиксации времени

void setup(){

}  

void loop(){

switch (check) {
    case DHT_OK: // всё OK
      temperature = sensor.tem; // считываем показания влажности и температуры
      humidity = sensor.hum;
      dataString += String(time);       // формируем строку с результатами показаний датчика
      dataString += "\t"; // ставим знак табуляции
      dataString += String(temperature);
      dataString += "\t";
      dataString += String(humidity);
      dataString += "\r";
 
      Serial.print(dataString);     // выводим результаты в serial-порт
///////////
     if (millis() - milTime >= 15000)
      {
       milTime = millis();
       saveSD();      // сохраняем на microSD 
      }
///////////
      break;
    case DHT_ERROR_CHECKSUM:    // ошибка контрольной суммы
      Serial.println("Checksum error");
      break;
    default:     // неизвестная ошибка
      Serial.println("Unknown error");
      break;
  }
}

 

Неа. С таким кодом также, сохранение происходит каждое считывание данных с датчика.