Arduino Nano 33 BLE получает текущее время с помощью RTC
У меня есть 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
@Riperoni, 👍0
Обсуждение1 ответ
Лучший ответ:
Собирался написать что-то более развернутое, но вкратце 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. против себя, все это применимо и к этому.
- Как создать таймер на 1 час с микроконтроллером ATtiny13A?
- Есть ли библиотека FreeRTOS для Arduino Nano 33 BLE?
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как справиться с rollover millis()?
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
если вы купите настенные часы, вставите в них батарейку и больше ничего не будете делать, то вы ожидаете, что будет показываться правильное время?, @jsotola
@jsotola не использует
rawtime = time(NULL); время (&rawtime);
действует как установка времени ? Или я неправильно интерпретирую эту строку кода?, @Riperoniоткуда взять текущее время/дату? ... https://duckduckgo.com/?q=jan+1st+1970&ia=web, @jsotola