Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Нужна помощь RTC DS3231 by jarzebski + Node MCU v3

Тема в разделе "Общие вопросы по esp8266", создана пользователем Vypra, 1 фев 2019.

  1. Vypra

    Vypra Новичок

    Сообщения:
    49
    Симпатии:
    0
    Пользовал библиотеку RTC DS3231 by jarzebski на Ардуине. Мне очень она нравится по причине вывода разных форматов даты и особенно удобных будильников.
    Попытался использовать с Node MCU v3.
    подключаем SCL - D1(GPIO5) // SDA - D2(GPIO4)
    С питанием вопросов нет.
    Скетч компилится, но после запуска вылетает ошибка rst cause: 2, boot mode: (1,6). Node MCU не стартует.
    Опытным путем убирал часть кода в скетче и выяснил, что Node MCU не нравится строчка clock.begin(); в void setup(). Если часы не стартонуть, остальная часть скетча с разными датчиками работает. Значит трабл в этой библиотеке.
    Кто пользовался этой библиотекой с Node MCU v3? Как запустить?
     
  2. Юрий Ботов

    Юрий Ботов Moderator Команда форума

    Сообщения:
    994
    Симпатии:
    169
    А у вас ds3231 случаем не от 5 вольт запитан?
     
  3. Vypra

    Vypra Новичок

    Сообщения:
    49
    Симпатии:
    0
    Да, от 5В. Через делитель на Node MCU для выравнивания уровня. Земля общая.
     
  4. nikolz

    nikolz Гуру

    Сообщения:
    3.276
    Симпатии:
    363
    запитайте от 3.3 и уберите делители
     
  5. enjoynering

    enjoynering Авторитетный участник сообщества

    Сообщения:
    412
    Симпатии:
    45
    если не поможет попробуйте исправленный драйвер для i2c - enjoyneering/ESP8266-I2C-Driver

    p.s. не очень понятно зачем на esp8266 использовать внешний rtc. можно ведь по wifi брать время с ntp сервера, а при потере сигнала использовать внутренний millis()
     
  6. nikolz

    nikolz Гуру

    Сообщения:
    3.276
    Симпатии:
    363
    полагаю есть как минимум три причины:
    1) для более точной привязки по времени по сравнению с RTC ESP. По wiFi вы получите точность привязки не лучше 0.1 сек. Привязка точнее требует реализацию ФАПЧ
    2) для автономной работы без доступа в интернет
    3) для организации более экономичного режима sleep ESP
     
  7. Vypra

    Vypra Новичок

    Сообщения:
    49
    Симпатии:
    0
    Бинго! Все 3 пункта. )))) Аппарат будет работать без доступа к интернету, но нужны будильники. WiFi нужен для RemoteXY чтоб мобильно со смарта смотреть датчики и некоторые настройки. На Ардуине памяти не хватило под все, поэтому перехожу на ESP.
    Кстати, от 3,3В завелось. Странно, но с другими библиотеками и через делитель работало.
     
  8. Vypra

    Vypra Новичок

    Сообщения:
    49
    Симпатии:
    0
    Еще вопрос.
    RTC по идее может выводить Node MCU из режима DeepSleep. Хочеться SQW заточить на пин RST и при срабатывания будильника в RTC перезагружать Node MCU .
    В даташите находил, что SQW RTC можно загнать в режим прерывания INTCN=1, он будет выдавать импульс при совпадении текущего времени и будильника. SQW пока выдает меандр. Как програмно сконфигурировать INTCN=1?
     
  9. nikolz

    nikolz Гуру

    Сообщения:
    3.276
    Симпатии:
    363
    Active-Low Interrupt or Square-Wave Output. This open-drain pin requires an external pullup resistor. It may be left open if not used. This multifunction pin is determined by the state of the INTCN bit in the Control Register (0Eh). When INTCN is set to logic 0, this pin outputs a square wave and its frequency is determined by RS2 and RS1 bits. When INTCN is set to logic 1, then a match between the timekeeping registers and either of the alarm registers activates the INT/SQW pin (if the alarm is enabled). Because the INTCN bit is set to logic 1 when power is first applied, the pin defaults to an interrupt output with alarms disabled.
    -------------
    Активно-низкий выход прерывания или прямоугольной волны.
    Этот вывод с открытым стоком требует внешнего подтягивающего резистора. Он остается открытым, если не используются.
    Этот многофункциональный пин определен Положением бита INTEN в регистре управления (0Eh).
    Когда INTCN установлено к логике 0, этот пин выводит наружу прямоугольная волна частота определена RS2 и RS 1 бит.
    Когда INTCN установлен в логику 1, то совпадение регистров хронометража с регистрами сигналов тревоги активируют вывод INT/SQW (если сигнал тревоги включен).
    бит INTCN установлен в 1 по умолчанию.
     
  10. Vypra

    Vypra Новичок

    Сообщения:
    49
    Симпатии:
    0
    Ага. Спасибо. Значит можно. Может я где-то протупил. Не думаю что китайский RTC как-то был изменен. Теперь нужно погуглить как организовать просыпание через SQW .
     
  11. Vypra

    Vypra Новичок

    Сообщения:
    49
    Симпатии:
    0
    Друзья, теперь прошу помощи.
    Перебрал много информации, но не нашел аналога реализации задуманного.
    Про то, как работает RTC нашел хорошую статью здесь.
    Задача - установить время будильника на RTC с NodeMCU, загнать NodeMCU в DeepSleep, разбудить NodeMCU по будильнику с RTC.
    Что удалось собрать:
    1. Если не задавать частоту прямоугольных импульсов на выходе SQW RTC, то по будильнику на этом выходе будет высокий сигнал. SQW нужно подтянуть к земле.
    2. NodeMCU можно разбудить, подав на пин RST низкий уровень сигнала. Т.е. кратковременно соединить с землей. Во избежание выгорания RST нужно подключить через сопротивление 470 ом.

    Подтвердите правильно ли я понял.
    И еще, как инвертировать высокий уровень с SQW RTC по будильнику на низкий RST? Транзистор? Кто может помочь со схемой подключения?
     
  12. nikolz

    nikolz Гуру

    Сообщения:
    3.276
    Симпатии:
    363
    1) выгорать ничего не будет.
    2) Вы уверены, что пробуждение от DS3231 имеет смысл? Можете обосновать?
     
  13. Vypra

    Vypra Новичок

    Сообщения:
    49
    Симпатии:
    0
    Да. Мое устройство должно пробуждаться раз в 4-5 часов, отправлять данные и уходить в deepsleep. Если период больше получаса, реализация выхода из deepsleep на NodeMCU штука как по мне плохая. Нужно периодами выходить/уходить в deepsleep, и если в какой-то период совпадут звезды - отправить данные. А так - установил будильник, проснулись, поработали, уснули.
    И еще, поскольку устройство будет установлено далеко, что-то внешнее в виде RTC будет перезагружать систему если NodeMCU сбойнет. Перезагрузка еще у меня будет по звонку на SIM800 на крайний случай (но это пока в планах, я не знаю как, но знаю, что можно).
     
  14. enjoynering

    enjoynering Авторитетный участник сообщества

    Сообщения:
    412
    Симпатии:
    45
    а как же это?

     
  15. nikolz

    nikolz Гуру

    Сообщения:
    3.276
    Симпатии:
    363
    без доступа к интернету - очевидно что работа будет в локальной сети.
     
  16. enjoynering

    enjoynering Авторитетный участник сообщества

    Сообщения:
    412
    Симпатии:
    45
    Теперь понятно. Но стало непонятно зачем отправлять. Логируй на флешку и потом по remoteXY. Неужели там больше 3мег текста наберется за 4 часа или даже за неделю?
     
  17. nikolz

    nikolz Гуру

    Сообщения:
    3.276
    Симпатии:
    363
    Много может быть причин. В основном это бывает надо если надо как-то реагировать.
    Например - сигнализатор пожара. Если все на флешку, то узнаете, когда приедут пожарники.
     
  18. Vypra

    Vypra Новичок

    Сообщения:
    49
    Симпатии:
    0
    Парни, в чем суть спора? ))) Мне нужно дистанционно мониторить датчики через SIM800 (СМС, емейл) с определенной периодичностью, но когда я буду возле аппарата - заходить через RemoteXY и смотреть на том же смарте показания датчиков. Как минимум это удобно. Еще через RemoteXY настраиваются номер телефона, периодичность отправки данных, емейл адреса, явки, пароли... ))) Все написано и уже со вчера работает. Но вопрос открыт - будильник.
     
  19. Vypra

    Vypra Новичок

    Сообщения:
    49
    Симпатии:
    0
    Вчера было время поиграться с будильником. Ну собственно я не ошибся. Если не заливать скетч, по умолчанию RTC генерирует меандр.
    [​IMG]
     
  20. Vypra

    Vypra Новичок

    Сообщения:
    49
    Симпатии:
    0
    Я залил скетч с примера библиотеки и понаблюдал за работой.
    Код (Text):
    1. /*
    2.   DS3231: Real-Time Clock. Simple example
    3.   Read more: www.jarzebski.pl/arduino/komponenty/zegar-czasu-rzeczywistego-rtc-ds3231.html
    4.   GIT: https://github.com/jarzebski/Arduino-DS3231
    5.   Web: http://www.jarzebski.pl
    6.   (c) 2014 by Korneliusz Jarzebski
    7.  
    8. *****************************************************************************
    9. *
    10. * Автор Перевода: Обушенков Алексей Андреевич  
    11. * Группа в ВК https://vk.com/engineer24
    12. * Канал на YouTube https://www.youtube.com/channel/UCih0Gcl9IEdkR8deDJCiodg
    13. * Инженерка Engineering room
    14. *
    15. *****************************************************************************
    16. * Модули в составе проекта:
    17. *  ESP8266 - 12E WIFI RobotDyn (3.68 $) https://goo.gl/k6TRUz
    18. *  ESP8266 - 12E WIFI GREAT WALL (3.44 $) https://goo.gl/DcqYMg
    19. * Модуль часов реального времени:
    20. *  DS3231 Модуль RTC (1.95 $) https://goo.gl/3jMusY
    21. *  RTC DS3231 (часы реального времени)RobotDyn + аккумулятор (2.90 $) https://goo.gl/gGMRak
    22. */
    23.  
    24. // Модуль DS3231 имеет напряжения питания 3,3В и 5В
    25. // Батарейка типа CR2032
    26. // подключается по I2C:
    27. // Плата ESP-12E подключаем SCL - D1(GPIO5) // SDA - D2(GPIO4)
    28. // Плата Arduino UNO (NANO) SCL - А5 // SDA - А4
    29.  
    30. #include <Wire.h>
    31. #include <DS3231.h>
    32.  
    33. DS3231 clock;   // Создаем экземпляр класса DS3231 с именем clock
    34. RTCDateTime dt; // Создаем структуру (объявленна в библиотеке) типа RTCDateTime с именем dt
    35. RTCAlarmTime Alarm1; // Создаем структуру (объявленна в библиотеке) типа RTCDateTime с именем Alarm1
    36. volatile boolean isAlarm = false; // Переменная для хранения сработал ли будильник
    37. boolean alarmState = false; // Переменная для состояния будильника
    38.  
    39. #define alarmLED 16 // Номер вывода D0 (ESP8266)
    40. #define PIN_SQW 14  // Номер вывода D5 прерывание (ESP8266)
    41.  
    42. int interval = 2; // Задаем интервал (В данном случае это 2 минуты, но то же самое может быть и для часов)
    43. int count = 0;    // Переменная которая хранит значение для будильника (в данном случае минуты)
    44.  
    45. // Функция для прерывания
    46. void alarmFunction()
    47. {
    48.   Serial.println("*** Interrupt ***");
    49.   isAlarm = true;
    50. }
    51.  
    52. void setup()
    53. {
    54. // Setup LED Pin
    55.   pinMode(alarmLED, OUTPUT);
    56.   digitalWrite(alarmLED, HIGH); // задаем состояние светодиода
    57. //
    58.  
    59.  
    60.   Serial.begin(9600);
    61.  
    62.   // Initialize DS3231
    63.   Serial.println("Initialize DS3231");
    64.   clock.begin();
    65.   clock.enableOutput(false);        // Определяем назначение вывода SQW (INT) для генерации прерываний при сработке будильников
    66.  
    67.   // Disarm alarms and clear alarms for this example, because alarms is battery backed.
    68.   // Under normal conditions, the settings should be reset after power and restart microcontroller
    69.   // Отключить сигналы тревоги и сбросить аварийные сигналы для этого примера, так как сигналы тревоги поддерживаются батареей
    70.   // В нормальных условиях настройки должны быть сброшены после включения питания и перезапуска микроконтроллера
    71.   clock.armAlarm1(false);
    72.   clock.armAlarm2(false);
    73.   clock.clearAlarm1();
    74.   clock.clearAlarm2();
    75.  
    76.   // Задаем время, например вручную
    77.   // Manual (Year, Month, Day, Hour, Minute, Second)
    78.   clock.setDateTime(2014, 4, 25, 0, 0, 0);
    79.  
    80.   // Задаем будильник 1 - Каждую 0-ю секунду в каждой минуте
    81.   // Set Alarm1 - Every 10s in each minute
    82.   // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
    83.   //clock.setAlarm1 (0, 0, 0, 10, DS3231_MATCH_S);
    84.  
    85.   count+=interval;
    86.   clock.setAlarm2 (0, 0, count, DS3231_MATCH_M);
    87.  
    88.   // Attach Interrput 0. In Arduino UNO connect DS3231 INT to Arduino Pin 2 (Для Arduino)
    89.   // Прикрепляем прерывание 0. Для Arduino UNO это PIN2
    90.   //pinMode(2, INPUT_PULLUP);
    91.   //attachInterrupt(0, alarmFunction, FALLING);
    92.  
    93.   // Прикрепляем прерывание Для ESP8266 это D5 (gpio 14)
    94.   // У ESP8266 Прерывания могут быть назначены на любые контакты кроме GPIO16.
    95.   pinMode(PIN_SQW, INPUT_PULLUP);
    96.   //pinMode(PIN_SQW, INPUT);
    97.   attachInterrupt(digitalPinToInterrupt(PIN_SQW), alarmFunction, FALLING);
    98.  
    99.  
    100. }
    101.  
    102. void loop()
    103. {
    104.   dt = clock.getDateTime(); // Считываем в структуру dt дату и время из модуля DS3231
    105.   Alarm1 = clock.getAlarm1();
    106.  
    107.   // Есть еще примеры вывода времени в примере из библиотеки DS3231_dateformat
    108.   Serial.println(clock.dateFormat("d-m-Y H:i:s - l", dt)); // Выводим время в Сериал Монитор
    109.  
    110.   if (isAlarm) // это то же самое если написать if (isAlarm == true)
    111.   {
    112.      
    113.       Serial.println("Alarm: " + String(clock.dateFormat("d-m-Y H:i:s - l", Alarm1)));     // Выводим настройки будильника                              
    114.       Serial.println();
    115.     digitalWrite(alarmLED, alarmState); // задаем состояние светодиода
    116.     alarmState = !alarmState; // инвертируем значение состояния
    117.     isAlarm = false;
    118.     clock.clearAlarm1();  //  Сбросить Аварийный сигнал с Будильника 1 RTC
    119.     clock.clearAlarm2();  //  Сбросить Аварийный сигнал с Будильника 2 RTC
    120.     count+=interval;
    121.     if (count >= 60){count-=60;}
    122.     clock.setAlarm2 (0, 0, count, DS3231_MATCH_M);
    123.    
    124.   }
    125.  
    126.   delay(1000); // Ждет секунду
    127. }
    В момент включения NodeMCU с несработавшим будильником сигнал высокий. Я напрямую соединил с RST.
    [​IMG]

    Когда будильник срабатывает, сигнал становится низким и NodeMCU вырубается.
    [​IMG]

    Но после сработки сигнал снова не становится высоким, поэтому NodeMCU не включается. Как сделать, чтоб будильник сработал на секунду и снова сигнал стал высоким?
     

Поделиться этой страницей