Здравствуйте! Возникает сложность с форматом времени /даты с датчика ds3231. Помогите разобраться: 1. при чтении в серийном мониторе через стандартный скейтч - всё корректно: Ok, Time = 10:43:20, Date (D/M/Y) = 4/4/2016 2. при записи в файл на SD карту - время/дата превращаются в какие-то цифры "восьмеричного" вида: 95.27,253:251:237 95.27- дата, 253:251:237 - время, Кусок кода записи в файл: Код (C++): String dataString = (String(tm.Day) + "." + String(tm.Month) + "," + String(tm.Hour) + ":" + String(tm.Minute) + ":" + String(tm.Second) ); myFile = SD.open("SOLAR.csv", FILE_WRITE); // if the file opened okay, write to it: if (myFile) { myFile.println(dataString); myFile.close(); Код для вывода в сериал - стандартный из программы Код (C++): #include <Wire.h> #include <Time.h> #include <DS1307RTC.h> void setup() { Serial.begin(9600); while (!Serial) ; // wait for serial delay(200); Serial.println("DS1307RTC Read Test"); Serial.println("-------------------"); } void loop() { tmElements_t tm; if (RTC.read(tm)) { Serial.print("Ok, Time = "); print2digits(tm.Hour); Serial.write(':'); print2digits(tm.Minute); Serial.write(':'); print2digits(tm.Second); Serial.print(", Date (D/M/Y) = "); Serial.print(tm.Day); Serial.write('/'); Serial.print(tm.Month); Serial.write('/'); Serial.print(tmYearToCalendar(tm.Year)); Serial.println(); } else { if (RTC.chipPresent()) { Serial.println("The DS1307 is stopped. Please run the SetTime"); Serial.println("example to initialize the time and begin running."); Serial.println(); } else { Serial.println("DS1307 read error! Please check the circuitry."); Serial.println(); } delay(9000); } delay(1000); } void print2digits(int number) { if (number >= 0 && number < 10) { Serial.write('0'); } Serial.print(number); }
Попробуйте записать вручную Код (C++): myFile.println("10.46,14:53:22"); Т.к. строчка Код (C++): String dataString = (String(tm.Day) + "." + String(tm.Month) + "," + String(tm.Hour) + ":" + String(tm.Minute) + ":" + String(tm.Second) ); преобразована правильно.
Уверены, что время в таймере установлено? Он когда новый или после смены батарейки выводит непойми что.
Спасибо за ответы! Да, время верное! Через сериал порт выводит секунда-в-секунду. Попробовал! Запись текста верная. В сериал порт время пишет чётко. Код (C++): Serial.print(tm.Day); Данные с датчика температуры в файл на SD пишет чётко. Может библиотеку не ту гружу иль ещё что? Модуль часов ds3231 AT24C32 IIC Код (C++): #include <SPI.h> #include <SD.h> File myFile; #include <Wire.h>[/SIZE] #include <Time.h> #include <DS1307RTC.h> #include "DHT.h" #define DHTPIN 7 // what pin we're connected to #define DHTTYPE DHT11 // DHT 22 (AM2302) DHT dht(DHTPIN, DHTTYPE); int BUZZER = 6; int analogPin = 0; void setup() { dht.begin(); pinMode(10, OUTPUT);[/SIZE] pinMode(BUZZER, OUTPUT); if (!SD.begin(10)) { ///Serial.println("initialization failed!"); return; } } void loop() { tone(BUZZER, 3900, 1); delay (100); tone(BUZZER, 3900, 1); delay (1500); tmElements_t tm; int h = dht.readHumidity(); int t = dht.readTemperature(); // читаем данные с датчика и делим на коэффициент int sensor = analogRead(analogPin) / 2.515; String dataString = (String(tm.Day) + "." + String(tm.Month) + "," + String(tm.Hour) + ":" + String(tm.Minute) + ":" + String(tm.Second) + "," + String(t) + "," + String(h) + "," + String(sensor)); myFile = SD.open("HLEBNAYA.csv", FILE_WRITE); // if the file opened okay, write to it: if (myFile) { /// Serial.print("Writing to HLEBNAYA.csv..."); myFile.println(dataString); myFile.close(); tone(BUZZER, 3900, 1); delay (1500); } }
Я имел ввиду сразу на SD myFile.println("10.46,14:53:22"); без преобразования запишите. Может myFile.println режет dataString ваш
Спасибо за ответ! Вот такой код Код (C++): void loop() { myFile = SD.open("SOLAR.csv", FILE_WRITE); // if the file opened okay, write to it: if (myFile) { /// Serial.print("Writing to .csv..."); myFile.println("10.46,14:53:22"); myFile.close(); tone(BUZZER, 3900, 1); delay (1500); } } чётко пишет в файл: 10.46,14:53:22 10.46,14:53:22 10.46,14:53:22
Поменял модуль часов, время на них не настроено: старый модуль пишет в карту: 127.180,95:157:255,21,22,141 127.180,95:157:255,21,22,109 новый модуль пишет в карту: 127.180,95:157:253,21,22,159 127.180,95:157:253,21,22,148 Кароч, модуль часов исключаю и эти цифры явно не завязаны на модуль вообще. Поставил новый sd модуль, пишет хаос опять: 134.1,95:157:255,21,22,173 134.1,95:157:255,22,22,162 134.1,95:157:255,21,22,155 Думается, либо ардуина, либо программа. Т.к. в сериал на монитор время корректно выводит, думаю, в коде ошибка.
А где у Вас в коде объект RTC и собственно чтение времени RTC.read(tm)? Здается, что Вы объявляете переменную tm, но ничего ей не присваиваете. По этому при чтении переменной лезет всякая чепуха.
Посмотрел библиотеку DS1307RTC. Оказалось, что объект RTC объявлен в прямо в ней как внешняя переменная. Так что с этим - понятно. Все что Вам нужно, это добавить в код строчку чтения времени из модуля RTC. Примерно так: Код (C++): void loop() { tone(BUZZER, 3900, 1); delay (100); tone(BUZZER, 3900, 1); delay (1500); tmElements_t tm; int h = dht.readHumidity(); int t = dht.readTemperature(); // читаем данные с датчика и делим на коэффициент int sensor = analogRead(analogPin) / 2.515; // читаем время из RTC RTC.read(tm); String dataString = (String(tm.Day) + "." + String(tm.Month) + "," + String(tm.Hour) + ":" + String(tm.Minute) + ":" + String(tm.Second) + "," + String(t) + "," + String(h) + "," + String(sensor)); myFile = SD.open("HLEBNAYA.csv", FILE_WRITE); // if the file opened okay, write to it: if (myFile) { /// Serial.print("Writing to HLEBNAYA.csv..."); myFile.println(dataString); myFile.close(); tone(BUZZER, 3900, 1); delay (1500); } } Чисто из любопытства, почему Вы используете именно эту библиотеку, а, например, не эту?
Fogary, спасибо! Только в понедельник смогу проверить, но Ваша версия очень похожа на правду.)) Не знаю, как-то копипастил, в примерах программы она вроде используется. Раньше она меня не подводила! Не думаю, что библиотеки часов так уж прям разнятся между собой. Спасибо ещё раз!