Область действия объекта 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".
Мы будем признательны за любую помощь!
@Offer, 👍0
Обсуждение1 ответ
Лучший ответ:
Как было предложено более "местными" друзьями здесь - я "Отвечаю на мой вопрос", чтобы прояснить ситуацию.
После проверки и отладки я обнаружил загадочное поведение, которое произошло с моим модулем DS3231. Вероятно, ошибочный инициализирующий набор вызовов - заставил его перестать работать - не получать обновления времени и вообще не считать время. (Заморозить на 01.01.2000, 00:00:00).
Отключив его от источника питания и вытащив аккумулятор, он вернулся к нормальному поведению, смог получать обновления времени и отвечать на звонки из библиотеки.
Когда эта часть была решена, все остальное прошло так же легко, как и должно быть.
Пример кода, который я разместил в своем вопросе (объявление объекта «сейчас» вне функций setup() и loop()), сделал этот объект глобальным, поэтому другая функция (веб-сервер) может считывать его текущее значение и использовать его внутри.
Спасибо всем, кто рассмотрел мою проблему и помог, Это был отличный урок о том, как не принимать ничего за «известное» без перепроверки.
- RtcDateTime' не называет тип
- Как написать неблокирующий код, для опроса датчика на 100 Гц
- Объявление глобальных переменных в отдельном файле: конфликт компилятора
- Как объявить массив переменного размера (глобально)
- Как получить тип данных переменной?
- устаревшее преобразование из строковой константы в 'char*'
- Преобразование в Unix Timestamp и обратно
- Как запрограммировать ардуино на чистом C/C++?
И ваш код выводит правильные минуты, если вы переместите объявление
now
в функциюloop()
?, @chrislЧто вы получите, если удалите код веб-сервера WiFi?, @Edgar Bonet
Обновление: большое спасибо за то, что все заглянули в него. Я только что пытался его отладить и обнаружил, что по странной причине - мой модуль DS3231 перестал работать (забыл время, а также не продвигался вперед, даже после сброса программы). Что сработало, так это отключить его от питания и вынуть аккумулятор. Теперь все работает нормально, и область действия переменной тоже хорошая. Должен ли я удалить свой вопрос сейчас? или оставить так? Большое спасибо еще раз! Я очень ценю это!, @Offer