Читает дату с DS3231 не правильно
- Войдите на сайт для отправки комментариев
Сб, 24/02/2018 - 09:06
Ребята, подскажите кто знает - при синхронизации с GPS иногда в модуль часов записывается не правильно дата. Год 2000, а месяц и дата нулевые. При этом время (часы и минуты) всегда верные. Читается из DS3231 в этом случае: 31 декабря 95 года. А иногда синхронизация проходит нормально - с правильной записью года, дня и месяца. Как получается что данные с GPS (прошедшие проверку if (gps.encode(c))) косячат при "вынимании" из них даты?...
Проект в самом начале, это далеко не законченный вариант кода, модули привинчиваю по очереди.
#include <DS1307RTC.h>
#include <DS3231.h>
#include <Time.h>
#include <TinyGPS.h>
#include <SPI.h>
#include <Ethernet2.h>
#include <SD.h>
// ------------------------- сеть ---------------------------------
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 177);
EthernetServer server(80);
// ------------------------- часы ---------------------------------
DS3231 Clock;
TinyGPS gps;
void getgps(TinyGPS &gps);
bool newdata = false;
bool Century = false;
bool h12;
bool PM;
bool rzr = false; // флаг Разрешения Записи Регистратора, - только после GPS синхронизации!
int Y;
//int Mpr;
//int Dpr;
byte m, s, h, d, M;
int msri = 0; // старший разряд минут
int mmri = 0; // младший разряд минут
int hsri = 0; // старший разряд часов
int hmri = 0; // младший разряд часов
unsigned long mln = 10000; // переменная задержки для первой синхронизации с GPS (1 минута)
unsigned long sinhr; // переменная в мсек задающ. период синхронизации
unsigned long start; // переменная в мсек задающ. цикл считывания данных gps
unsigned long decim; // переменная в мсек задающ. период децимальных точек
unsigned long registr; // переменная в мсек задающ. период записи регистратора (5 мин)
unsigned long treg = 10000; // период записи регистратора 5 мин
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
SD.begin(22);
setSyncProvider(RTC.get); // библиотечная команда извлечения данных из модуля часов
// ------------------------------------------ GPS для часов ------------------------------------------
Ethernet.begin(mac, ip);
server.begin();
Serial.println(Ethernet.localIP());
sinhr = millis();
decim = millis();
registr = millis();
pinMode(23, OUTPUT); // CS для W5500
pinMode(22, OUTPUT); // CS SD-карты
pinMode(24, OUTPUT); // CS модуля NRF24
digitalWrite(24, HIGH);
}
// ==========================================================================================================================================================================
// ===================================================================== L O O P ============================================================================================
void loop() {
// --------------------------------------- часы ----------------------------------------
Y = 2000 + Clock.getYear(); // получение года из модуля часов DS3231
M = Clock.getMonth(Century); // получение месяца из модуля часов DS3231
d = Clock.getDate(); // получение дня из модуля часов DS3231
h = Clock.getHour(h12, PM); // получение часов из модуля часов DS3231
m = Clock.getMinute(); // получение минут из модуля часов DS3231
msri = m / 10; // вычисление единиц и десятков минут и часов
mmri = m - ((m / 10) * 10);
hsri = h / 10;
hmri = h - ((h / 10) * 10);
// ------------------------------------- Cеть ------------------------------------------
EthernetClient client = server.available(); //слушаем входящего клиента
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println("Refresh: 2"); // refresh the page automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.println(sensorReading);
client.println("<br />");
}
delay(1); // дали время браузеру на приём данных
client.stop(); // закрыли соединение
//---------------------------- работа GPS модуля ---------------------------------------
//Serial.println(mln);
if (millis() - sinhr > mln) { // таймер для синхронизации на сутки (86400000)
newdata = false;
start = millis();
while (millis() - start < 2000)
{
if (Serial1.available())
{
char c = Serial1.read(); // чтение массива, переданного NEO-6M
Serial.print(c); // вывести на печать массив из NEO-6M
if (gps.encode(c)) // проверка данных на правильность
{
newdata = true;
break; // остановить цикл при нормальной декодировке
}
}
}
if (newdata)
{
getgps(gps); // при нормальной декодеровке уходим на выполнение getgps(TinyGPS &gps)
}
}
// -------------------------- SD карта ---------------------------------------------
if ((millis() - registr) > treg) { // таймер для записи регистратора на 5 мин
if (Y != 2095) {
if (rzr == true) {
SD.begin(22);
String logStringData = ""; // формирование строки с данными
String p; // переменная для минут меньше 10, чтобы минуты были с нулём
if (m < 10) {
p = "0" + String(m);
}
else {
p = String(m);
}
// формируем строку с данными, в начале - время записи, потом инфа
logStringData = String(h) + ":" + p + " > " + "полезная информация\r\nопять полезная инфа\r\n"; // для примера с переводом строки ( \r\n )
String DirectName = String(Y) + "/" + String(M); // Создаём имя папки из месяца и года
SD.mkdir(DirectName);
// Открываем файл, но помним, что одновременно можно работать только с одним файлом.
// Если файла с таким именем не будет, ардуино создаст его.
String logStringName = DirectName + "/" + String(d) + ".txt"; // формируем текстовый файл на один день максимум 12 знаков в названии файла
Serial.println (logStringName);
File dataFile = SD.open(logStringName, FILE_WRITE);
// Если все хорошо, то записываем строку:
if (dataFile) {
dataFile.println(logStringData); // в файл записываем строку данных с переводом строки
dataFile.close(); // закрываем файл
// здесь надо будет вывести индикацию удачной записи в Nextion в виде зелёного кружка
Serial.println(logStringData);
}
// Если все плохо, то рисуем красный кружок на Nextion
else {
// рисуем красный кружок в Nextion
Serial.println("error opening");
}
mln = 56400; // постоянная на синхронизацию по GPS (сутки)
registr = millis();
}
}
}
} // конец loop
// ----------------- подпрограмма вывода данных из gps и синхронизации модуля часов (раз в сутки)-----
void getgps(TinyGPS & gps)
{
int year;
byte month, day, hour, minute, second, hundredths;
// вынимание данных из массива, полученного из модуля gps
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
//Mpr = month; // промежуточная перем. для разрешения записи SD (с GPS есть правильная дата)
//Dpr = day; // промежуточная перем. для разрешения записи SD (с GPS есть правильная дата)
hour = hour + 5; // переделка час. пояса
if (hour > 23) // избежание 25, 26 часов на дисплее
{
hour = hour - 24;
}
rzr = true; // разрешение на работу регистратора (исп. данные GPS для записи в регистратор)
// - непосредственно синхронизация -
setTime(hour, minute, second, day, month, year); // устанавливаем: часы, минуты, секунды (и день, месяц, год)
RTC.set(now()); // применяем значение
sinhr = millis();
//Serial.print(" есть синхр ");
}