ESP32 RTC часы с внешним кварцем
HTML-код
- Опубликовано: 29 сен 2024
- Радикальное увеличение точности RTC часов ESP32 с помощью внешнего кварца на 32768 Гц.
Код проекта из видео: github.com/Moo...
Ролик про настройку бота для Telegram: • Простейший Telegram BO...
PS: на все свои вопросы пытайтесь найти ответы самостоятельно! Гугл вам в помощь!
Спасибо большое! Очень полезная информация!
Alex Morozov, спасибо за идею, очень интересно. Я правильно понял, если нам нужно подкрутить настройки ESP в Arduino, мы просто добавляем espidf к фреймворкам, правим в нём настройки и они применяются к фреймворку Arduino? Всё гениальное просто! Интересно, если поменять местами espidf и Arduino в строке framework, будет работать? т.е. настойки берутся из последнего фреймворка?
У Arduino нет изменяемых настроек кроме настроек самого проекта, но это другое. Так что от перемены мест "слагаемых" "сумма" явно не изменится.
А что, так можно было? Пошёл копать!
Я бы наверное вышел из ситуации просто тупо каждый раз синхронизируя время
Может ли esp32-s стартовать из deep sleep по внешнему сигналу (появление внешнего напряжения питания) или использовать небольшой интервал sleep? Какое потребление esp32-s в глубоком сне?
Можно и от "цифрового" сигнала проснуться и от "аналогового" (напряжения), степень возни только различная. А сколько потребляет в глубоком сне именно ваша плата - мерять вам, потому что все платы разные.
Если LDO не прожорливый и USB-UART моста нет, то можно рассчитывать примерно на 30 мкА. Но и это сильно зависит от обвязки и пр. На типовой плате скорее ближе к 100 мкА.
А для esp8266 можно два фреймворка использовать?)) Что бы freertos на Ардуино заработал
А зачем? Если есть куча свободного времени, то наверное можно перенести дурино-фреймворк для esp8266 на rtos-sdk, но вот снова "зачем"?...
Спасибо! Очень интересная информация о возможности использовать два фремверка в одном проекте!
Лайк!
Реально интересно и полезно. Впрочем, как всегда.
А нельза просто подстроить время как коррекция в часах? При старте с интернетом отсенхронизировать. Записать в епром коррекци. И у меня идея с часами модуль времени еормаоьный сделать все на есп добавить батарейку и как только нет питания то контролео в сон и наинает работать часы на ulp . Вроде ничего сложного нет...
А зачем ULP? RTC счетчик и так сам прекрасно тикает в глубоком сне. Да и частота кварца ULP ядра такая же "точная", как и RTC.
Учитывая непредсказуемость температурного дрифта, никакой постоянной компенсации точности RTC добиться без использования внешнего точного кварца невозможно.
Вопрос к вам, задумался о теме и ваше видео попало под горячую руку)) Скажите довелось ли вам работать с Pi Pico RP2040? У него есть RTC внутренний, хотел заюзать эти часы, не могу разобраться какая в итоге точность будет, даташит либо читать не умею либо не вижу информации. Может есть опыт расскажите стоит или нет?
Опыта нет. Если у RTC часов на плате свой кварц на низкую частоту (32768 Гц), то точность будет высокая, если тактируется от основного кварца через делитель, то точность будет хуже. Насколько - надо проверять.
@@alexmorozov73 вы меня прям расстроили, я уже хотел схему рисовать без внешних часов. МК тактируется от 12мгц кварца. Придется тестирование делать
Вы молодец ).
Хотелось лайки в течении всего видео ставить.
Сделай видео как в IDE включить будеш в топе ещё долго подсказки boards.txt esp32.menu.CPUFreq.ext=External Quartz
esp32.menu.CPUFreq.ext.build.f_cpu=32768L
esp32.menu.CPUFreq.32=32.768kHz
esp32.menu.CPUFreq.32.build.f_cpu=32768L
А причем здесь CPUFreq? Это частота основных ядер, а не источник тактирования RTC.
Так что делай видео сам, будешЬ в топе еще долго :)
@@alexmorozov73 menu.QuartzFreq=Quartz Frequency
menu.RTC_CLOCK_SOURCE=RTC Clock Source
esp32.build.extra_flags=-DQUARTZ_FREQ={build.quartz_freq}
esp32.menu.QuartzFreq.disabled=Disabled
esp32.menu.QuartzFreq.disabled.build.quartz_freq=
esp32.menu.QuartzFreq.32k=32.768kHz
esp32.menu.QuartzFreq.32k.build.quartz_freq=32768L
esp32.menu.RTC_CLOCK_SOURCE.Internal_RC=Internal RC oscillator
esp32.menu.RTC_CLOCK_SOURCE.Internal_RC.build.define=CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC
esp32.menu.RTC_CLOCK_SOURCE.External_crystal=External crystal oscillator
esp32.menu.RTC_CLOCK_SOURCE.External_crystal.build.define=CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL так может поближе
И что это даст? Ничего, что дурино-фреймворк уже откомпилирован с конкретными параметрами и повлиять на них можно только пересборкой фреймворка?
@@alexmorozov73 Понял спосибо пош устанавливать Я думал не так всё плохо..просто минюшки добавить ну может кто прочтёт и в обновления уже с этими будет добавьтmenu.QuartzFreq=Quartz Frequency
esp32.menu.QuartzFreq=Quartz Frequency
esp32.menu.QuartzFreq.disabled=Disabled
esp32.menu.QuartzFreq.disabled.build.define=CONFIG_QUARTZ_FREQ_DISABLED
esp32.menu.QuartzFreq.32k=32.768kHz
esp32.menu.QuartzFreq.32k.build.define=CONFIG_QUARTZ_FREQ_32768
menu.RTCCLOCKSOURCE=RTC Clock Source
esp32.menu.RTCCLOCKSOURCE.int_rc=Internal 150kHz RC oscillator
esp32.menu.RTCCLOCKSOURCE.int_rc.build.define=CONFIG_ESP32_RTC_CLK_SRC_INT_RC
esp32.menu.RTCCLOCKSOURCE.ext_crys=External 32kHz crystal
esp32.menu.RTCCLOCKSOURCE.ext_crys.build.define=CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS
esp32.menu.RTCCLOCKSOURCE.ext_osc=External 32kHz oscillator at 32K_XN pin
esp32.menu.RTCCLOCKSOURCE.ext_osc.build.define=CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC
esp32.menu.RTCCLOCKSOURCE.int_8md=Internal 8.5MHz oscillator, divided by 256 (~33kHz)
esp32.menu.RTCCLOCKSOURCE.int_8md.build.define=CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256
menu.RTCCalCycles=RTC CalCycles
esp32.menu.RTCCalCycles.disabled=Disabled (0)
esp32.menu.RTCCalCycles.disabled.build.define=CONFIG_ESP32_RTC_CLK_CAL_CYCLES=0
esp32.menu.RTCCalCycles.rc_1024=RC Oscillator (1024 cycles)
esp32.menu.RTCCalCycles.rc_1024.build.define=CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024
esp32.menu.RTCCalCycles.crys_3000=Crystal Oscillator (3000 cycles)
esp32.menu.RTCCalCycles.crys_3000.build.define=CONFIG_ESP32_RTC_CLK_CAL_CYCLES=3000
menu.XtalCalRetry=XTAL Calibration Retry
esp32.menu.XtalCalRetry.default=Default (1)
esp32.menu.XtalCalRetry.default.build.define=CONFIG_ESP32_RTC_XTAL_CAL_RETRY=1
esp32.menu.XtalCalRetry.higher=Higher (3)
esp32.menu.XtalCalRetry.higher.build.define=CONFIG_ESP32_RTC_XTAL_CAL_RETRY=3
menu.BootstrapCycles=Bootstrap Cycles for External 32kHz Crystal
esp32.menu.BootstrapCycles.disabled=Disabled (0)
esp32.menu.BootstrapCycles.disabled.build.define=CONFIG_ESP32_RTC_XTAL_BOOTSTRAP_CYCLES=0
esp32.menu.BootstrapCycles.default=Default (150)
esp32.menu.BootstrapCycles.default.build.define=CONFIG_ESP32_RTC_XTAL_BOOTSTRAP_CYCLES=150
menu.XtalFreq=Main XTAL Frequency
esp32.menu.XtalFreq.auto=Autodetect
esp32.menu.XtalFreq.auto.build.define=CONFIG_ESP32_XTAL_FREQ_AUTO=1
esp32.menu.XtalFreq.26=26 MHz
esp32.menu.XtalFreq.26.build.define=CONFIG_ESP32_XTAL_FREQ_26=1
esp32.menu.XtalFreq.40=40 MHz
esp32.menu.XtalFreq.40.build.define=CONFIG_ESP32_XTAL_FREQ_40=1
menu.BasicRom=Basic ROM
esp32.menu.BasicRom.disabled=Disable
esp32.menu.BasicRom.disabled.build.define=CONFIG_ESP32_DISABLE_BASIC_ROM=1
esp32.menu.BasicRom.enabled=Enable
esp32.menu.BasicRom.enabled.build.define=CONFIG_ESP32_DISABLE_BASIC_ROM=0
Резонатор кварцевый X321532768KGD2SI / 32.768 kHz, 20ppm, 12.5pF, 3.2x1.5 С таким не заработало, купил кварц и два конденсатора вот не понятно резистор нужна или нет кусок переделал а группу шлет static bool teleSend(uint32_t rtcTime, uint32_t ntpTime) {
WiFiClientSecure *tcp;
HTTPClient *https;
bool result = false;
tcp = new WiFiClientSecure();
if (tcp) {
tcp->setInsecure();
https = new HTTPClient();
if (https) {
char msg[256];
String answer;
int64_t chat_id = TELE_CHAT;
// Если TELE_CHAT равен 0, выходим из функции, не отправляя сообщение
if (TELE_CHAT == 0) {
Serial.println("TELE_CHAT is zero, not sending a message!");
delete https;
delete tcp;
return false;
}
if (TELE_CHAT < 0) {
chat_id = TELE_CHAT; // Заменяем chat_id значением TELE_CHAT, если оно отрицательное
}
// Для положительного значения TELE_CHAT оставляем chat_id без изменений
snprintf(msg, sizeof(msg), "api.telegram.org/bot%s/", TELE_KEY);
Serial.print("Connecting to Telegram BOT API... ");
if (https->begin(*tcp, msg)) {
Serial.println("OK");
https->addHeader("Content-Type", "application/json");
https->addHeader("Connection", "close");
if (teleMsgId)
sprintf(msg, "{\"method\":\"editMessageText\",\"chat_id\":\"%" PRId64 "\",\"message_id\":%d", chat_id, teleMsgId);
else
sprintf(msg, "{\"method\":\"sendMessage\",\"chat_id\":\"%" PRId64 "\"", chat_id);
sprintf(&msg[strlen(msg)], ",\"text\":\"RTC time: %u
NTP time: %u
Sleep duration: %u sec.\"}",
rtcTime, ntpTime, sleepDuration / 1000);
Serial.print("Sending BOT message ");
result = https->POST(msg) == 200;
if (result)
Serial.println("OK");
else
Serial.println("FAIL!");
answer = https->getString();
if (result) {
if (getMessageId(answer.c_str())) {
Serial.printf("Message Id: %d
", teleMsgId);
}
} else {
if (teleMsgId) {
sprintf(msg, "{\"method\":\"sendMessage\",\"chat_id\":\"%" PRId64 "\",\"text\":\"RTC time: %u
NTP time: %u
Sleep duration: %u sec.\"}", chat_id, rtcTime, ntpTime, sleepDuration / 1000);
Serial.print("Resending BOT message ");
result = https->POST(msg) == 200;
if (result)
Serial.println("OK");
else
Serial.println("FAIL!");
answer = https->getString();
if (result) {
if (getMessageId(answer.c_str())) {
Serial.printf("Message Id: %d
", teleMsgId);
}
}
}
}
https->end();
} else
Serial.println("FAIL!");
delete https;
}
delete tcp;
}
return result;
}
Пойду перекурю после увиденного