Как получить текущую дату

Как получить текущую дату, месяц и год. Я использовал RTC, NTPClient, но это не сработало. Это дает вывод по умолчанию 1970 года. Что я могу сделать, чтобы исправить это.

time_t now = time(nullptr);
struct tm* newtime = localtime(&now);
String tmpNow = "";
tmpNow += String(newtime->tm_year + 1900);
tmpNow += "-";
tmpNow += String(newtime->tm_mon + 1);
tmpNow += "-";
tmpNow += String(newtime->tm_mday);
tmpNow += " ";

, 👍0

Обсуждение

Я не думаю, что Arduino знает, какая сейчас дата. Чтобы использовать NTPClient, вам нужно каким-то образом подключить Arduino к Интернету, чтобы дату можно было загрузить с NTPServer., @Filip Franik

Он уже подключен к интернету, @Shivani Dongre

Тогда у вас, вероятно, где-то есть ошибка. Разместите свой код здесь, чтобы мы могли проверить, что не так. Используйте кнопку «код», чтобы отформатировать его в читаемом виде., @Filip Franik

Из какой библиотеки вы получаете функцию «localtime»? Я не могу найти его ни в одной из библиотек, на которые вы ссылались выше., @Filip Franik


1 ответ


4

пример использования NTPClient доступен в проектах. гитхаб

#include <NTPClient.h>
// меняем следующую строку для использования с другой платой/щитом
#include <ESP8266WiFi.h>
//#включить <WiFi.h> // для экрана WiFi
//#включить <WiFi101.h> // для шилда WiFi 101 или MKR1000
#include <WiFiUdp.h>

const char *ssid     = "<SSID>";
const char *password = "<PASSWORD>";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);

void setup(){
  Serial.begin(115200);

  WiFi.begin(ssid, password);

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  timeClient.begin();
}

void loop() {
  timeClient.update();

  Serial.println(timeClient.getFormattedTime());

  delay(1000);
}

Из того, что я обнаружил, TimeRTC требует внешнего устройства DS1307RTC для отслеживания времени, как показано в видео здесь и с его помощью мы должны получить реальное время, как показано в примере

#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>  // базовая библиотека DS1307, которая возвращает время как time_t

void setup()  {
  Serial.begin(9600);
  while (!Serial) ; // ждем, пока откроется последовательный монитор Arduino
  setSyncProvider(RTC.get);   // функция для получения времени из RTC
  if(timeStatus()!= timeSet) 
     Serial.println("Unable to sync with the RTC");
  else
     Serial.println("RTC has set the system time");      
}

void loop()
{
  if (timeStatus() == timeSet) {
    digitalClockDisplay();
  } else {
    Serial.println("The time has not been set.  Please run the Time");
    Serial.println("TimeRTCSet example, or DS1307RTC SetTime example.");
    Serial.println();
    delay(4000);
  }
  delay(1000);
}

void digitalClockDisplay(){
  // цифровые часы отображающие время
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits){
  // служебная функция для отображения цифровых часов: печатает предшествующее двоеточие и начальный 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

Если, насколько я понимаю из вашего кода, вы на самом деле не используете ни RTP, ни NTP. Вы только создаете объект Time без значений и читаете его значения по умолчанию.

Посмотрите еще несколько примеров здесь

,

используя RTC, он выдает результат, например -jan 8 2013 . Как получить текущую дату и год, @Shivani Dongre

@ShivaniDongre Вы на 100% уверены, что DS1307RTC имеет правильную настройку даты? Обновление даты зависит от батареи. Если в какой-то момент батарея была удалена, дата сбрасывается до значения по умолчанию, а затем вставка новой батареи заставляет считать время с первого января., @Filip Franik