Arduino Nano 33 BLE получает текущее время с помощью RTC

arduino-ide time arduino-nano-ble

У меня есть arduino NANO 33 BLE, и я пытаюсь получить текущее время и дата. Согласно документации, Arduino имеет микроконтроллер nRF52840, который поставляется с Таймер 24 RTC Перечислен в скандинавская документация. Однако я точно не знаю, как его использовать для получения текущего времени; Основываясь на документации MbedOS для Time, я написал код для печати из текущего времени и даты в сочетании с чтением данных:

#include "mbed.h"
#include <Time.h> 
#include <RTClib.h>


time_t rawtime; 
struct tm *info; 

void setup() {
  Serial.begin(9600); 
}

//resistor val = 100K

void loop() {
  rawtime = time(NULL); 
  time(&rawtime); 
  info = localtime(&rawtime);
  int val = analogRead(A1);
  Serial.print(val);
  Serial.print('-');
  Serial.print(asctime(info) );
  delay(5);   
  }

Однако он просто распечатывает это:

XX–четверг, 1 января, 00:08:30 1970 г.

Где XX — правильные данные датчика. Почему время не текущее, а начало эпохи Unix? Этот код был запущен в настольной среде Arduino IDE в Win10

, 👍0

Обсуждение

если вы купите настенные часы, вставите в них батарейку и больше ничего не будете делать, то вы ожидаете, что будет показываться правильное время?, @jsotola

@jsotola не использует rawtime = time(NULL); время (&rawtime); действует как установка времени ? Или я неправильно интерпретирую эту строку кода?, @Riperoni

откуда взять текущее время/дату? ... https://duckduckgo.com/?q=jan+1st+1970&ia=web, @jsotola


1 ответ


Лучший ответ:

0

Собирался написать что-то более развернутое, но вкратце RTC в NRF52840 - это не "часы" так много, как асинхронный таймер/счетчик. Например, вы можете запустить его из источника часов, который не связан с системными часами, которые отсчитывают время вашего кода, и он может (или не может) продолжать считать, когда вы находитесь в спящем режиме. Итак, вы можете использовать этот async. таймер/счетчик в качестве строительного блока при построении того, что составляет приближение к часам реального времени (например, DS3231). Nordic, mbed, Arduino или libc/time.h не предполагают, что вы можете использовать его таким образом, а RTCLib.h сам занимается доступом к определенным моделирует микросхемы внешних часов реального времени без прямого подключения к time.h. Таким образом, нет ничего, что могло бы поддержать ваш конкретный вариант использования в каждой из этих вещей.

Поэтому вы можете попытаться создать из него функциональность часов реального времени. Но если вы похожи на большинство пользователей Arduino, вам, вероятно, лучше приобрести DS3231 или что-то подобное. Вы, вероятно, получите более точный учет времени, резервное питание от батареи и т. д., чем если бы вы создали эту функцию самостоятельно из счетчика NRF52.

Если у вас есть потребность или сильное желание использовать <time.h>, это обычно можно сделать, завершив его реализацию каким-либо задокументированным способом, специфичным для реализации. По сути, вы должны получить поля времени из чего-то вроде DS3231, а затем использовать это, чтобы установить, что составляет переменную time_t, которая поддерживает time(), а затем регулярно вызывать вызвать какую-то функцию опережения времени из процедуры прерывания на основе прямоугольного сигнала на выходе DS3231 (или чего-то еще). Если вы действительно хотите использовать async. против себя, все это применимо и к этому.

,