Область действия объекта RtcDateTime при объявлении вне функции

Я пытаюсь объединить 2 образца Arduino, чтобы иметь возможность использовать модуль DS3231 RTC с простым веб-сервером ESP8266 WiFi.

Моя библиотека RTC такова: https://github.com/Makuna/Rtc/wiki

В целом, код to работает нормально (у меня есть ответы веб-сервера на вызовы моего браузера, и я думаю, что код DS3231 RTC также работает). Но когда я пытаюсь использовать переменную из объекта RTC в функции веб-сервера, я ничего не получаю.

Я думал, что объявление объекта «сейчас» вне какой-либо функции (Setup() или Loop()) сделает его глобальным, и когда я обновлю его в функции Loop(), используя

now = Rtc.GetDateTime();

Он будет доступен и для других функций, но все, что я получаю, это "0", когда я пытаюсь напечатать его.

Мой код здесь: Часть определений:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

/* This block is for I2C protocol for DS3231 module (for normal hardware wire use below) */
#include <Wire.h> // здесь должно быть указано, чтобы ссылки на объектные файлы библиотеки Arduino работали
#include <RtcDS3231.h>
RtcDS3231<TwoWire> Rtc(Wire);
/* The above block is for I2C protocol and DS3231 module  (for normal hardware wire use above) */

ESP8266WebServer server(80);
RtcDateTime now;

Мой loop():

void loop(void) {
  now = Rtc.GetDateTime();
  Serial.println(now.Minute());
  server.handleClient();
  delay(500);

}

И все, что я получаю, это напечатанный "0".

Мы будем признательны за любую помощь!

, 👍0

Обсуждение

И ваш код выводит правильные минуты, если вы переместите объявление now в функцию loop()?, @chrisl

Что вы получите, если удалите код веб-сервера WiFi?, @Edgar Bonet

Обновление: большое спасибо за то, что все заглянули в него. Я только что пытался его отладить и обнаружил, что по странной причине - мой модуль DS3231 перестал работать (забыл время, а также не продвигался вперед, даже после сброса программы). Что сработало, так это отключить его от питания и вынуть аккумулятор. Теперь все работает нормально, и область действия переменной тоже хорошая. Должен ли я удалить свой вопрос сейчас? или оставить так? Большое спасибо еще раз! Я очень ценю это!, @Offer


1 ответ


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

2

Как было предложено более "местными" друзьями здесь - я "Отвечаю на мой вопрос", чтобы прояснить ситуацию.

После проверки и отладки я обнаружил загадочное поведение, которое произошло с моим модулем DS3231. Вероятно, ошибочный инициализирующий набор вызовов - заставил его перестать работать - не получать обновления времени и вообще не считать время. (Заморозить на 01.01.2000, 00:00:00).

Отключив его от источника питания и вытащив аккумулятор, он вернулся к нормальному поведению, смог получать обновления времени и отвечать на звонки из библиотеки.

Когда эта часть была решена, все остальное прошло так же легко, как и должно быть.

Пример кода, который я разместил в своем вопросе (объявление объекта «сейчас» вне функций setup() и loop()), сделал этот объект глобальным, поэтому другая функция (веб-сервер) может считывать его текущее значение и использовать его внутри.

Спасибо всем, кто рассмотрел мою проблему и помог, Это был отличный урок о том, как не принимать ничего за «известное» без перепроверки.

,