Ви не увійшли.
Тут схема 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 (подвоювати)).
Зробив ехо тести на 9600 від ESP32 3,3V через PС817 до DS2480B - багато помилок.
Вхідний резистор 1,5к для Tx оптопари великий. Розрахунки показують, що він повинен бути 220-330 Ом, щоб впевнено працював світлодіод оптопари.
Думаю знайшлося вузьке місце в ланцюжку, із за цього і не зміг налаштувати розширювач портів в кінці 1wire лінії.
Як змусити працювати розширювач портів через гальваничну розв'язку ?
Між чим і чим ви хочете гальванічну розвʼязку?
Вважаючи, що
ШІ каже, що або PC817 повільні для 9600
то поки складається враження, що між ESP32 та DS2480B. Тоді до чого тут розширювач портів?
9600 бод через PC817 у мене пролазили без жодних проблем.