Как перевести "восьмиричный" формат времени и даты в "нормальный"

Тема в разделе "Arduino & Shields", создана пользователем MaximJF, 5 апр 2016.

  1. MaximJF

    MaximJF Нуб

    Здравствуйте!
    Возникает сложность с форматом времени /даты с датчика 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);
    }
     
  2. Попробуйте записать вручную
    Код (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) );
    преобразована правильно.
     
    MaximJF нравится это.
  3. ostrov

    ostrov Гуру

    Уверены, что время в таймере установлено? Он когда новый или после смены батарейки выводит непойми что.
     
    MaximJF нравится это.
  4. MaximJF

    MaximJF Нуб

    Спасибо за ответы!
    Да, время верное! Через сериал порт выводит секунда-в-секунду.
    Попробовал! Запись текста верная.
    В сериал порт время пишет чётко.
    Код (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);
      }
    }
     
     
  5. Я имел ввиду сразу на SD myFile.println("10.46,14:53:22"); без преобразования запишите. Может myFile.println режет dataString ваш
     
  6. MaximJF

    MaximJF Нуб

    Спасибо за ответ!
    Вот такой код
    Код (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
     
  7. MaximJF

    MaximJF Нуб

    Поменял модуль часов, время на них не настроено:
    старый модуль пишет в карту:
    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
    Думается, либо ардуина, либо программа.
    Т.к. в сериал на монитор время корректно выводит,
    думаю, в коде ошибка.
     
  8. fogary

    fogary Гик

    А где у Вас в коде объект RTC и собственно чтение времени RTC.read(tm)?
    Здается, что Вы объявляете переменную tm, но ничего ей не присваиваете. По этому при чтении переменной лезет всякая чепуха.
     
    MaximJF нравится это.
  9. MaximJF

    MaximJF Нуб

    Пожалуйста-пожалуйста, помогите!!!
    Как это сделать? я туповат в этом вопросе...
     
  10. fogary

    fogary Гик

    Посмотрел библиотеку 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);
      }
    }
    Чисто из любопытства, почему Вы используете именно эту библиотеку, а, например, не эту?
     
    MaximJF нравится это.
  11. MaximJF

    MaximJF Нуб

    Fogary, спасибо!
    Только в понедельник смогу проверить, но Ваша версия очень похожа на правду.))
    Не знаю, как-то копипастил, в примерах программы она вроде используется. Раньше она меня не подводила!
    Не думаю, что библиотеки часов так уж прям разнятся между собой.
    Спасибо ещё раз!
     
  12. MaximJF

    MaximJF Нуб

    Всё заработало! Всем спасибо!