Ви не увійшли.
перетворювач живлення B0505S
Тобто є якийсь 5-вольтовий БЖ. З нього 5 вольт ідуть на плату ESP32 на LDO регулятор. З регулятора 3.3 В ідуть на UART VCC плати з оптопарами.
З цього ж БЖ 5 вольт ідуть на DCDC VCC плати з оптопарами і живлять B0505S, так?
У B0505S за даташитом пульсації до 100 мВ, а частота перетворення всього 100 кГц. Невідомо, наскільки добре воно фільтрується.
Для чистоти експерименту я б заживив ізольовану сторону від окремого БЖ з лінійним регулятором.
Взагалі для діагностики в таких експериментах осцилограф дуже знадобився б.
А 5-вольтове живлення звідки берете? Воно добре стабілізоване?
перетворювач живлення B0505S
https://arduino.ua/prod3115-preobrazovatel-napryajeniya-b0505s-1w-dc-dc-5v-s-galvanicheskoi-razvyazkoi
Адміни форума, будь ласка, перенесіть пости про мастер шини з гальваничною розв'язкою в другий топік та починіть показ картинок.
Тут схема AOC812, VCC = 3.3V від ESP32
Ааа, це готова плата з оптопарами та DS2480B. Тепер зрозумів.
на вході Tx стояв 1,5к.
Ну, в теорії 1.5к там має бути достатньо. На фотографії погано видно, зі сторони DS2480B підтяжка 4.7к?
Може у самих оптопар CTR аномально низький. Якщо, наприклад, 50%, то низький рівень на вході DS2480B вже буде десь 1.7 В, а DS2480B за даташитом хоче не більше 0.8. Тоді так, або зменшувати резистор світлодіода, або збільшувати підтяжку 4.7к на виході оптопари.
З другою оптопарою те ж саме може бути. Там до світлодіода 2.4к?
А 5-вольтове живлення звідки берете? Воно добре стабілізоване?
після завантаження файла та відкриття посилання в окремому вікні отримую 404
Угу, в мене теж. Щось мабуть знову поламалось ![]()
Значить не вигрузили файл. В мене така само нога але не болить ![]()
Ну, на якийсь халявний хостінг закиньте.
Або я щось неправильно розумію, або оптопари у вас принципово неправильно підключені.
Покажіть схему, як у вас підключені оптопари між ESP32 та DS2480B.
На платі ESP32-C3 mini на виводах Tx, Rx зовнішніх підтяжек нема.


після завантаження файла та відкриття посилання в окремому вікні отримую 404
https://forum.arduino.ua/img/members/4236/schematic_AOC812_upd.png
Тут схема AOC812, VCC = 3.3V від ESP32, на вході Tx стояв 1,5к.
https://github.com/honechko/DS2480/blob/main/Docs/schematic.png
На самому мастері по входу Tx якраз і стоїть послідовний 1,5к, який я замінив на 220 Ом, бо інших не знайшов.
Послідовно зі входом? А підтяжка скільки?
Замінив 1,5к на 220 Ом (3 к на 5В стороні не чіпав).
???
Або я щось неправильно розумію, або оптопари у вас принципово неправильно підключені.
Покажіть схему, як у вас підключені оптопари між ESP32 та DS2480B.
офтоп - а як прикріпити фотку?
Якщо фотка вже лежить десь на загальнодоступному ресурсі, то за допомогою тега img.
Якщо фотка на компі, то при редагуванні тиснете внизу "Завантаження". Відкривається діалог, завантажуєте фотку і копіюєте її URL. Далі вставляєте в повідомлення так само за допомогою тега img.
Оффтоп. Це:
if (txByte == 0xE3) { Serial1.write(0xE3); Serial1.write(0xE3); } else { Serial1.write(txByte); }
можна спростити до
if (txByte == 0xE3) {
Serial1.write(txByte);
}
Serial1.write(txByte);як прикріпити фотку?
Через Завантаження ![]()
Welcome to 2000 ![]()
Підкажіть по розширювачю портів - при перезапусу по живленню він в EEPROM пише дефолтний конфіг?
Я до чого, мені треба сформувати свою робочу конфігурацію портів, датчиків, порогів і кожен раз ії оновлювати якщо є POR або флагі тривог?
В EEPROM нічого не записується, після ресету стан всієї пам'яті скидується до дефолтних значень. Щоб визначити, що був ресет, потрібно при ініціалізації, коли робите налаштування портів, скинути прапорець POR і потім, якщо він раптом встановився, повторювати ініціалізацію, включаючи скидання POR.
Опитувати по черзі всі пристрої на предмет POR - це довго, для цього передбачено інший механізм: якщо хоч один прапорець тривоги пристрою встановлено, то пристрій буде відгукуватись на AlarmSearch (команда 0xEC замість звичайної Search 0xF0) і потім вже можна вичитувати з кожного такого пристрою, які конкретно тривоги встановлено і їх обробляти.
В бібліотеці для ардуіно це виклик ow.search(addr, false); з другим аргументом false, ось тут є приклад такого алгоритму.
Не так. 0xE3 - вихід з режиму даних, якщо в режимі даних чіп отримав цей байт, то він переходить в режим "перевірки", якщо наступний байт, назвем його X, не дорівнює 0xE3, то чіп переходить в режим команд і виконує команду X, якщо ж X дорівнює 0xE3 (тобто прийшло підряд 0xE3,0xE3), то чіп повертається в режим даних і вважає, що прийняв лише один байт 0xE3.
Тобто слати треба 0xE3,0xE3, а повернеться лише один 0xE3.
Взагалі кажучи, те що надсилається в режимі команд чіпу, транслюється ним в шину 1-wire і якщо на шині до цього було адресовано один чи кілька слейв-пристроїв, то вони можуть біти 1 на шині заміняти на біти 0, майстер це читає і повертає в уарт. Тобто "ехо" працює тоді, коли слейв-пристрої не були адресовані і вони тихо сидять на шині.
Дякую за уточнення, я робив тест з відключенною 1W шиною.
Підкажіть по розширювачю портів - при перезапусу по живленню він в EEPROM пише дефолтний конфіг?
Я до чого, мені треба сформувати свою робочу конфігурацію портів, датчиків, порогів і кожен раз ії оновлювати якщо є POR або флагі тривог?
Може у вас від ESP32 TX через якийсь послідовний резистор, або десь велика паразитна ємність.
...
Ну, запрацювало, то й добре. Лише майте на увазі, якщо у вас працює лише на максимумі, при постійній інтенсивній передачі через кілька років кристал деградує, і може перестати працювати.
На платі ESP32-C3 mini зовнішніх резисторів на пінах Tx, Rx немає, ні підтяжки ні послідовно.
На самому мастері по входу Tx якраз і стоїть послідовний 1,5к, який я замінив на 220 Ом, бо інших не знайшов.
Можливо Ви праві і його треба взяти трохи більшим, наприклад 330-470.
офтоп - а як прикріпити фотку?
для того, щоб фронти на виході PC817 не завалювались на ії LED треба дати десь 10 mA.
10 mA - це в районі максимума CTR. І то, максимум може бути від 5 до 15 мА, в залежності від виробника та версії.
Ось PC817S, 0x55 на 9600 бод,
TX: CP2102 3.3 В, резистор 2.2 кОм,
RX: CH341A 5 В, резистор в колекторі 2.2 кОм:
Два трансивера взяв навмисне, щоб були різні тайм референс. Все на макетці зі жмутом проводів.
Може у вас від ESP32 TX через якийсь послідовний резистор, або десь велика паразитна ємність.
Тест від Honey пройшов зразу же, а з 1,5 к були помилки
Ну, запрацювало, то й добре. Лише майте на увазі, якщо у вас працює лише на максимумі, при постійній інтенсивній передачі через кілька років кристал деградує, і може перестати працювати.
// Якщо ми дублювали 0xE3, чип теж поверне його двічі, вичитаємо другий байт
Не так. 0xE3 - вихід з режиму даних, якщо в режимі даних чіп отримав цей байт, то він переходить в режим "перевірки", якщо наступний байт, назвем його X, не дорівнює 0xE3, то чіп переходить в режим команд і виконує команду X, якщо ж X дорівнює 0xE3 (тобто прийшло підряд 0xE3,0xE3), то чіп повертається в режим даних і вважає, що прийняв лише один байт 0xE3.
Тобто слати треба 0xE3,0xE3, а повернеться лише один 0xE3.
Взагалі кажучи, те що надсилається в режимі команд чіпу, транслюється ним в шину 1-wire і якщо на шині до цього було адресовано один чи кілька слейв-пристроїв, то вони можуть біти 1 на шині заміняти на біти 0, майстер це читає і повертає в уарт. Тобто "ехо" працює тоді, коли слейв-пристрої не були адресовані і вони тихо сидять на шині.
Повторю тут (вам я в пошті писав), може кому знадобиться: щоб протестувати в Майстері шини ланцюжок UART TX -> PC817 -> DS2480B -> PC817 -> UART RX потрібно перевести DS2480B в режим даних (подати в UART TX байт 0xE1), після цього DS2480B буде повторювати на виході все що в нього надходить (в UART TX відправляєм довільний байт, з UART RX прочитаєм цей же байт, єдине, що байт 0xE3 в UART TX треба відправляти як 0xE3,0xE3 (подвоювати)).
Дякую за допомогу!
Це дало змогу швидко протестувати оптопари з 3,3 вольтовим ESP32-C3 mini і уникнути помилок на етапі зв'язку з DS2480B.
Покажіть ваші розрахунки.
1.5 кОм при 3.3 В дасть струм порядка 1 - 1.5 мА. Навіть при коефіцієнті передачі струму 50% цього має бути достатньо.
Який у вас резистор в колекторі вихода оптопари?
Розрахунок простий, для того, щоб фронти на виході PC817 не завалювались на ії LED треба дати десь 10 mA.
До того ж ніззя перевантажити порт ESP32-C3 і 10 mA теж норм.
3,3V живлення - 1,2V падіння на LED = 2,1/10 = 210 Ом.
Замінив 1,5к на 220 Ом (3 к на 5В стороні не чіпав).
Тест від Honey пройшов зразу же, а з 1,5 к були помилки, осцілограф даже не включав:
#include <Arduino.h>
#define RX_PIN 20
#define TX_PIN 21
void setup() {
Serial.begin(115200);
while (!Serial) { delay(10); }
// Запуск зв'язку з мостом
Serial1.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN);
delay(200);
Serial.println("n==================================================");
Serial.println("=== Test оптопар HONEY UART-ЕХО ESP32-C3 mini <--> AOC812(DS2480B) ===");
Serial.println("==================================================");
// 1. Очищуємо буфер
while (Serial1.available()) Serial1.read();
// 2. Переводимо DS2480B в режим даних (Data Mode = 0xE1)
Serial.println("[ INIT ] Переводимо чип у режим даних (0xE1)...");
Serial1.write(0xE1);
Serial1.flush();
delay(10);
// Вичищаємо ехо самого байта 0xE1, яке повернув чип
while (Serial1.available()) Serial1.read();
Serial.println("[ RUN ] Старт циклічного стрес-тесту лінії TX/RX...");
}
unsigned long totalBytes = 0;
unsigned long errorBytes = 0;
void loop() {
// Генеруємо випадковий байт для перевірки (від 0x00 до 0xFF)
uint8_t txByte = random(0, 256);
// Особливе правило від виробника: якщо шлемо 0xE3 (Command Mode),
// його треба продублювати два рази підряд, щоб чип не вийшов з режиму даних!
if (txByte == 0xE3) {
Serial1.write(0xE3);
Serial1.write(0xE3);
} else {
Serial1.write(txByte);
}
Serial1.flush();
// Чекаємо на відповідь від ізольованої зони
unsigned long start = millis();
while ((Serial1.available() == 0) && (millis() - start < 50)) { delayMicroseconds(10); }
if (Serial1.available()) {
uint8_t rxByte = Serial1.read();
totalBytes++;
// Якщо ми дублювали 0xE3, чип теж поверне його двічі, вичитаємо другий байт
if (txByte == 0xE3 && Serial1.available()) {
Serial1.read();
}
if (rxByte != txByte) {
errorBytes++;
Serial.printf("⚠️ [ПОМИЛКА] Надіслано: 0x%02X | Отримано: 0x%02X | Збоїв: %lu/%lun",
txByte, rxByte, errorBytes, totalBytes);
}
} else {
errorBytes++;
Serial.printf("? [ТАЙМАУТ] Чип не повернув ехо для: 0x%02X | Збоїв: %lu/%lun",
txByte, errorBytes, totalBytes);
}
// Кожні 500 байтів виводимо проміжний звіт цілісності
if (totalBytes % 500 == 0) {
float errorRate = ((float)errorBytes / totalBytes) * 100.0;
Serial.printf("? [СТАТИСТИКА] Оброблено байтів: %lu | Помилок: %lu (%.2f%%)n",
totalBytes, errorBytes, errorRate);
}
delay(5); // Невелика пауза між байтами
}Тобто з модулем розширення портів це ніяк не повʼязано. Мабуть, варто було би створити окрему тему в "Апаратних питаннях".
По факту модуль розширення портів не винен.
Але ж непонятно було де затик, бо ROM ID екстендера і 2-х DS12B20, включаючи їх температуру на шині 1Wire читалися, щось з портів екстендера читалось, а записати налаштування портів не вдавалось.
Тільки там з HCPL-2300
480 UAH
По богатому ![]()
PC817 - 5 UAH
Час вмик/вимк Ton/Toff, µs: 18/18 µs. Повинно вистачити для 9600. Але няп треба зарядити струм не 5мА, а 20.
Взагалі їх як грязі трохи є в наявності в магазинах, і швидших, і недорогих.
Зробив ехо тести на 9600 від ESP32 3,3V через PС817 до DS2480B
Тобто з модулем розширення портів це ніяк не повʼязано. Мабуть, варто було би створити окрему тему в "Апаратних питаннях".
Як саме ви проводили цей тест? Покажіть схему підключення.
В даташиті DS2480B на сторінці 27 є приклади підключення до UART з опторозвʼязкою. Тільки там з HCPL-2300.
Вхідний резистор 1,5к для Tx оптопари великий. Розрахунки показують, що він повинен бути 220-330 Ом, щоб впевнено працював світлодіод оптопари.
Покажіть ваші розрахунки.
1.5 кОм при 3.3 В дасть струм порядка 1 - 1.5 мА. Навіть при коефіцієнті передачі струму 50% цього має бути достатньо.
Який у вас резистор в колекторі вихода оптопари?
Думаю знайшлося вузьке місце в ланцюжку, із за цього і не зміг налаштувати розширювач портів в кінці 1wire лінії.
При сумнівах дивіться осцилографом, що там на виході з оптопари.
на якій частоті робить ATtiny13A ~= DS2450 (зчитати фьюзи неможливо)
Ця частота вам нічим не допоможе, важливо що таймінги протокола 1-wire виконуються, а допуски в протоколі величезні, навіть якщо частота ATtiny13A трохи попливе.
50 м кабеля це досить багато
Особисто тестував на 300м (бухта езернет кабелю 305м), причому в режимі паразитного живлення (один свій DS2450), і на двох провідниках з однієї пари, і на двох провідниках з різних пар - все працювало, DS2480B - потужна штука.
ехо тести
Повторю тут (вам я в пошті писав), може кому знадобиться: щоб протестувати в Майстері шини ланцюжок UART TX -> PC817 -> DS2480B -> PC817 -> UART RX потрібно перевести DS2480B в режим даних (подати в UART TX байт 0xE1), після цього DS2480B буде повторювати на виході все що в нього надходить (в UART TX відправляєм довільний байт, з UART RX прочитаєм цей же байт, єдине, що байт 0xE3 в UART TX треба відправляти як 0xE3,0xE3 (подвоювати)).