Ви не увійшли.
Також я б рекомендував почати з інтерпретатора типу MicroPython. З ардуінівською недо-C++ легко отримати хибні уявлення про програмування, потім буде нелегко перевчатися.
Рано.
Чому це? Від конкретної дитини залежить. У 8 років я вже ZX Spectrum на бейсіку програмував.
Можна все. Питання в тому, що для цього потрібно зробити і скільки це займе часу.
один проект на базі esp8266
Проект в чому, Arduino IDE, PlatformIO, чи може якась кастомна система збірки? Який фреймворк використовується? Arduino Core, RTOS SDK, Non-OS SDK?
перевесті на esp32
Це називається "портувати". Щоб відповісти на ваше питання, потрібно знати:
Чи використовує код напряму якісь специфічні для ESP8266 властивості, які в ESP32 працюють по-іншому або відсутні?
Якщо використовуються сторонні бібліотеки, чи підтримують вони ESP32?
Але тоді цей програмований модуль не потрібен. Звичайний модуль з реле плюс Arduino або будь-який інший контролер. Якщо потрібна привʼязка до реального часу, то ще плюс модуль RTC.
Ще додати відтворення звукового фрагмента: "Обережно, двері зачиняються. Наступна станція ..." (жартую )
У вас дуже цікава схема, як я зрозумів поріг включення лампи на панелі регулюється підстроювальним резистором?
Це умовно, щоб показати принцип. Якщо потрібна можливість регулювати поріг, то можна і підстроювальний. Якщо порогові значення струму відомі заздалегідь, то краще дільник на звичайних резисторах, так надійніше.
4 лампи 21/5вт, на задні габарити/стопи
Задні габарити та стопи хіба не окремо? Питав, щоб оцінити, яка потрібна точнісь для розрізнення "працюють всі" від "одна згоріла". А це залежить від кількості ламп, що підʼєднані до однієї лінії, в якій вимірюється струм.
Ідея із захистом така: Ардуїно через транзистор розмикає "нормально замкнуте реле", через яке йде +12 на пряму до ламп, якщо ардуїно виходить з ладу, то транзистор закривається і контакт на реле замикає 12в на пряму з ліхтарями.
Так ардуїно може "вийти з ладу" і залишити пін в будь-якому стані, в тому числі тримаючи транзистор відкритим.
Взагалі, ні ардуіно, ні будь-яка інша схема не повинна керувати лампами, тільки аналізувати струм.
Рідний блок тому доказ, що щось перегоріло і ні стопів ні габаритів, добре що поворотники поза цією схемою, і немає жодного "аварійного режиму", тільки паяльник із собою возити.
Щось там у вас дуже дивне відбулося. Якщо в тойотівському блоці такий же принцип як в тому вазівському, то він не керує самими лампами. Струм ламп тільки проходить через шунти (оті дротяні "перемички" на фото мабуть вони і є). Тобто щоб перестало працювати все, потрібно щоб одночасно згоріли всі шунти або доріжки до них. Ну, ще чисто теоретично, один із входів могло би коротнути на масу і згорів би запобіжник.
Хоча, не виключаю, що там якийсь зовсім інший принцип, і ті мікросхеми дійсно керують лампами.
На жаль з компараторами ще не мав справи та не знаю як вони працюють
Якщо дуже умовно і приблизно, то так:
while (true) {
if (analogRead(pinInPos) < analogRead(pinInNeg)) {
digitalWrite(pinOut, LOW);
} else {
#ifdef OPEN_DRAIN_OUTPUT
pinMode(pinOut, INPUT);
#else
digitalWrite(pinOut, HIGH);
#endif
}
}
У корчах типу ВАЗ є такий самий блок, 4452.3747
Ось. ASXP194P (УР1101ХП34).
Датчики струму на шунтах, компаратори, логіка для холодного тесту та таймер затримки.
Зверніть увагу на наявність захисту від високовольтних викидів по живленню.
Так то воно так
а потім виясниться, що там 2 групи ламп, кожна заживлена через свій запобіжник, і треба ще датчик і якусь логіку допаяти
Так отож, спочатку треба схему бачити, що звідки куди йде, а потім уже щось вигадувати.
В одноразових саморобках економити 100 грн немає особливого смислу.
Та не в економії справа. Якщо просто вимірювати напругу з датчика відносно напруги живлення ардуіни чи його внутрішнього опорника, воно не працюватиме як задумано. Щоб працювало, потрібно вимірювати відносно напруги бортового живлення. Але тоді виходить, що ардуіна лише виконує роль компаратора і потребує такої ж самої обвʼязки. Тоді чому не взяти просто компаратор?
Ну якщо хочеться, щоб при перегорянні лампочки індикатор блимав, програвалась мелодія та відсилалось повідомлення у вайбер, то можна і ардуіно. Але щоб воно виконувало свою основну функцію не гірше за звичайний компаратор, вихід датчика потрібно міряти відносно бортового живлення, про що я і писав.
Не зовсім зрозуміло, що там у автора за ідея з "захистом" та реле, що та від чого захищати.
Не проблема насправді.
Та хто ж каже, що проблема. Проблема зʼявиться, якщо перемудрити.
В древній тойоті це ж працювало.
Але ж без ардуіни Не думаю, що там якась цифра була. Там взагалі, мабуть, на кожну лампу свій "датчик", інакше навіщо виносити окремий блок в багажник?
Навряд чи там потрібне щось складніше за таку схему (малював умовно):
Тут U1, R1, C3 - сам датчик ACS712 (EDIT: забув, що ACS712 на датчику Холла, шунт не потрібен).
Q1 буде потрібен і в схемі з ардуіною, якщо індикаторна лампа 12-вольтова. Якщо світлодіод, то тут не потрібен.
Тобто замість ардуіни - компаратор, 7805, три резистори і пара кондьорів. Сумарно менше 20 грн.
А якщо замість ACS712 взяти ZTCT1009 або щось подібне, то і 7805 не буде потрібна.
Датчик струму, мабуть, краще підходить для визначення чи жива лампа.
Я ж так розумію, там дві або чотири лампи в паралель. Щоб розрізнити "всі живі" від "одна згоріла", потрібно умовно вимірювати опір з точністю 1/N. А опір - це відношення напруги до струму. Якщо напруга фіксована, достатньо виміряти тільки струм. Але ж напруга не фіксована. Тому при вимірюванні абсолютного значення струму необхідна така точність, щоб дозволяла відрізняти "всі живі" при мінімальному значенні напруги від "одна згоріла" при максимальному. Або вимірювати відносний струм. Датчик і так видає напругу, пропорційну струму. ЇЇ достатньо порівнювати з напругою, пропорціїною напрузі бортової мережі. Тоді абсолютне значення напруги бортової мережі не має значення.
просто пропустити 12в через 2 датчики струму
По скільки там у вас ламп в паралель на кожній лінії? Майте на увазі, що при 12 В і при 14.5 В струм відрізнятиметься на 20%. Ще й розбіжність опорів у різних ламп. Якщо так уже хочеться застосувати ардуіну, то подавайте бортову напругу через дільник на Vref та міряйте відносно Vref. Взагалі у атмеги і аналоговий компаратор є, можна було б його застосувати замість АЦП. Але чому б тоді просто не застосувати окремий дискретний компаратор із живленням напряму від бортової мережі, і не заморочуватись із різницею вольтажів? Ардуіна там зовсім не потрібна.
Хочу зробити новий блок на основі ардуїно
Я би спочатку продумав метод, як контролювати цілісність ламп. Подивився б, як це реалізовано в існуючих системах. Тільки після цього вирішував, за якою схемою та на якій елементній базі робити.
був варіант зробити так, щоб ардуїно зчитувала опір всіх ламп в робочій системі
Не дуже зрозуміло, що значить "зчитувала опір всіх ламп"? Ви хочете відключати лампи від бортової системи, подавати тестову напругу та вимірювати струм? Чи вимірювати струм за наявності напруги увімкнення?
і якщо раптом ардуїно вийде з ладу і не керуватиме
За яким критерієм збираєтесь визначати, що ардуїно вийшло з ладу?
Що скажете щодо цієї ідеї?
Якось занадто кучеряво. Вам як мінімум доведеться узгоджувати бортову напругу 12-14.5 В з напругою I/O ардуіно. Причому для ланцюгів габаритів та стопів окремо.
Тут мало би бути достатньо вимикати індикаторну лампу, коли струм в ланцюгу ламп перевищує пороговий. Тобто датчик струму (шунт?), компаратор та транзистор.
Встигає за 1 мс
ESP32 капєц швидка штука
Та справа ж не у швидкодії процесора. Записати кілька байтів у регістри - це і на atmega займає мікросекунди. А фактичний запис байта в EEPROM - 3.4 мс (1.8 мс, якщо без стирання).
Тут же важливий проміжок часу між виникненням зовнішньої події (падіння напруги нижче заданного рівня) і завершенням запису на фізичному рівні. А він залежить від купи різних факторів.
Якщо для моніторингу використовується компаратор, який генерує переривання - це одне (я не в курсі, чи є такий в ESP32). Якщо періодично читається АЦП - це інше. Впливатиме, з якою частотою йде опитування, чи задіяно паралельно інші канали, чи виконуються інші задачі, які пріорітети у задач (якщо це RTOS).
ESP32 пише на зовнішню флешку, підʼєднану по SPI. Впливатиме, чи будуть в черзі інші SPI транзакції, чи встигла флешка закінчити попередню операцію. У типової XM25QH32C запис сторінки - 0.5 мс, але якщо для запису потрібно стерти сектор - це вже 50 мс.
Кінцевик один (не хочеться жмута проводів)
А, тепер зрозумів.
Як варіант - сам датчик на рухомій частині, а магніти в крайніх стаціонарних положеннях.
Ще варіант без кінцевика - моніторити струм двигуна. Але може знадобитись фрікцион. Бо якщо момент у двигуна великий, та ще й червʼячна передача, то поки система зреагує на зростання струму, може встигнути щось поламати.
Зберігати положення приводу непогано було б.
Це, мабуть, потрібно краще розуміти логіку роботи системи. Бо як розумію на даний момент, є два положення: вікно відчинене, вікно зачинене. Відчиняється або зачиняється в залежності від поточної температури? Яке тут положення приводу?
Якщо на старті алгоритм потребує, щоб система була в детермінованому стані, то можна привести її в початковий стан безумовно, наприклад, вікно закрите. А далі нехай працює алгоритм.
Є ще дивна ідея зберігання в retain message в mqtt
Ще ідеї, щоб зберігати при кожній зміні, а не тільки при зникненні живлення: якщо раптом надумаєте ставити RTC з батарейкою, то зазвичай там є кілька десятків байтів CMOS-памʼяті. Або зберігати в зовнішню FRAM
PS: соррі, не розумію, jokeR та jokeer (Гість) - це одна і та ж особа, чи ні.
Тому придумав такий лайфхак - комутацію релюшками робити з відключеною напругою, а напругу подавати окремим ключем з невеликою затримкою.
Це стандартна практика при механічній комутації силових ліній. Ніяких розмикань під струмом, ніяких замикань під напругою. Розмикання під струмом тільки в разі аварійного відключення.
В критичних застосуваннях ще й тест на залипання контактів. Але для вашого проекту це, мабуть, зайве
Була ідея ловити пропадання напруги живлення, і, поки є енергія в конденсаторах, зберігати налаштування програми на флешку.. Але завади від мотора досить інтенсивні, багато false positive.. Поки не придумав рішення.
Дуже приблизна оцінка порядку величин: ESP32 в активному режимі споживає біля 20 мА (а вона скоріш за все буде в активному, бо потрібно читати ADC і писати на флешку). Ємності 3000 мкФ після діода при падінні напруги з 5 В (не з 12, бо LM7805 зʼїдає 7 вольт) до 3 В (берем як мінімум для ESP32) має вистачити десь на 300 мс. Теоретично можна встигнути. Але це дуже оптимістична оцінка. Якщо працює вайфай, споживання ESP32 може бути в 3-4 рази більше. Якщо замкенене реле, це ще +30 мА.
12 вольт іде з мережевого БЖ? Я б запропонував детектити наявність напруги AC мережі. Баластний конденсатор + 814 оптопара (або 817 паралельно з діодом). Тоді в запасі вся ємність БЖ, в тому числі й високовольтна.
А взагалі, моя особиста думка, автоматичне збереження налаштувань - це зайве. Кнопка чи пункт меню "зберегти" - простіше, надійніше та зрозуміліше. Звісно, в деяких випадках аварійне збереження поточного стану системи необхідне, але не для користувацьких налаштувань.
Спеціалісти середніх років ведуть себе як ВИ. замість направити та пояснити - насміхаються.
Та де ж ви побачили насміхання? Вибачаюсь, якщо когось образив мимоволі. В жодному разі не мав на увазі нікого з учасників. Я скоріше "жаліюся" на загальну тенденцію в IT, бо теж наболіло.
Треба вчити людей, пояснювати та направляти.
Саме цим і намагаюсь займатись тут на форумі. Комусь може здатись парадоксом, але як розробник, я хотів би бачити [майбутніх] колег по цеху кваліфікованими. А як користувач продукції, так тим більше.
Краще пояснюйте новачкам як правильно робити замість "бидло коментарів"
Це молоді спеціалісти завжди знають, як треба правильно робити. Старі та досвідчені добре знають, як НЕ треба робити
Щоб пояснити як правильно, потрібно спрочатку зрозуміти, що людина взагалі хоче отримати.
Та і як пояснювати, не вказуючи на поточні помилки?
Щоб щось писати в резюме, досить просто вміти писати.
Нє, ну це трохи інше. Казкарі-фантасти зазвичай відсіюються на першому ж етапі співбесіди.
Гірше, коли людина наче б то і шарить, але щиро впевнена, що так можна і потрібно писати, бо, наприклад, так пишуть у бібліотеках для ардуіни.
А піонер, який приварив до мікроскопа трубу і забив шуруп у бетон, може вважати, що розбирається у мікроскопах, металопрокаті, електрозварюванні, бетоні і фітнесі
Не бачу в тому нічого позорного
Та воно-то наче так, для самого піонера. Складно людям, яким доводиться працювати з таким або його "продуктом".
Просто подумал что на форуме может кто то имеет такие наработки .....
Ви сподіваєтесь, що у когось завалялись готові прошивки для ардуіно, одна з яких вимірює два параметра саме таким способом як у вас, передає їх по радіоканалу саме за допомогою nRF24, а друга приймає та відображає саме на такий як у вас дисплей у потрібному вам форматі?
Звʼязок по nRF24 - приклади в бібліотеці для nRF24.
Відображення символів на дисплей - приклади в бібліотеці для дисплея.
Вимірювання струму та напруги - залежить від того, чим будете міряти.
В якому форматі передавати дані - у якомось бінарному стандартизованому, у самописному, чи просто готовим текстом - вирішувати тільки вам. Найпростіший для вашої задачі варіант (з моєї субʼєктивної точки зору) - передавати готовий текст - я вже запропонував.
Но я так понимаю что должно быть прописана фунция обработки получаемых с датчика сигналов ?
Так, на передавачі. Наприклад, наміряли 13.6 В, 18.2 А. Передавач формує строку: "\002U: 13.6 V\nI: 18.2 A\003" і відсилає її.
Тут для прикладу застосовано символи керування ASCII:
'\002' - STX, start of text
'\003' - ETX, end of text
'n' ('\012') - LF, line feed
Приймач отримує цей потік байтів і обробляє символи керування.
Коли приймає '\002' - встановлює поточну позицію для виводу на початок екрана: row=0, col=0.
Коли приймає '\003' - очищає екран від поточної позиції до кінця екрана.
Коли приймає 'n' - переміщує поточну позицію на початок наступного рядка: row=row+1, col=0.
Інші ASCII символи просто виводить на екран у поточну позицію (row, col) та зсуває її на наступну: col=col+1.
Як організувати звʼязок - залежить від потрібної дальності та надійності. Можна взагалі взяти пару так званих "бездротових подовжувачів UART" на 433 МГц і передавати/приймати як через звичайний UART.
Можна приймати і по NRF24, але виводити не на окремий дисплей, а в смартфон через USB-UART конвертор.
Звісно, можна передавати і не готовий потік символів для відображення, а "сирі" дані, і обробляти їх уже на приймачі. Але тоді потрібно розробляти хоч і примітивний, але протокол передачі. А там і до protobuf чи efficient XML interchange недалеко. Воно вам треба?
Взагалі, розбийте задачу на окремі підзадачі:
1. Звʼязок
2. Формат даних (протокол)
3. Відображення інформації
і вирішуйте їх окремо.
Вам просто отримувати значення струму та напруги в реальному часі?
Я би зробив уніфікований приймач, який отримує довільний потік символів та відображає його на дисплей. Типу read-only термінал. А передавач на кораблику нехай передає дані у вигляді готового потоку символів для відображення.
До речі, ліба Adafruit_SSD1306 всередині на ifdef
Не дуже розумію, що значить "всередині на ifdef". Застосовуються директиви препроцесора для умовної компіляції? Так це нормально, так забезпечується кросплатформенність. Тим більше, коли фреймворк не надає інших засобів. Та й ліби від Adafruit - теж далеко не взірець хорошого коду.
Я погано уявляю смисл саморобки з 2 різними, але дисплеями
Для саморобки можна хоч в коді самої "бібліотеки" цвяхами прибити те що потрібно тут і зараз. Головне, не тягнути такі методи в продакшн. Ардуіно як навчальна платформа мала би сприяти грамотному підходу до розробки ПЗ, але ж там інша мета. Піонери купляють модулі, бо "все просто і зрозуміло", а більше і не треба. Потім ці піонери пишуть в резюме "я знаю кунг-фу".
А щодо define/ifdef - на цьому весь Arduino core побудований, і нічого, працює якось
Так отож, що "якось". В core умовна компіляція в основному для різних цільових платформ, які взаємовиключні при збірці.
Поблимати світлодіодом та намалювати прямокутник на єдиному дисплеї - це ще ок. А коли потрібно більше одного інстанса з різними параметрами?
В будь яку функцію Ctrl click - і зразу видно, як воно побудоване всередині, що буде білдитись, що ні.
Де, в Platform IO? Так з шаблонами те ж саме, навести курсор на ідентифікатор, і спливає підказка, з якими параметрами клас інстанційовано. А в імплементації самого класу по-хорошому не має бути ніяких драбин з if ... else if ... else.
Мені здається, що шаблони придумані для чогось іншого.
Так, для узагальнення алгоритмів та відвʼязки від конкретних типів.
Мали би бути окремі класи з імплементацією для SSD1306 та SSH1106, а також для SPI та I2C, які надають абстрактні інтерфейси. Той самий поліморфізм, тільки гарантовано під час компіляції.
ifdef це просто, і зразу видно, що відбувається.
Це просто, поки у вас один макрос з булевим значенням (defined / not defined). Якщо їх два, то кількість комбінацій уже чотири.
Крім того, добре, якщо автори фреймворку встановили конвенцію про іменування макросів, а автори коду її притримуються. Бо коли у вас зʼявляється дві бібліотеки з однаково названими макросами, то привіт.
Вже не кажу про бідолашних користувачів Arduino IDE, де нема штатного способа визначити макрос опціями компілятора.
У макросів є свої застосування, але не для поліморфізму в C++.
А в те що там написано у Гувера, треба спеціально врюхувати.
Звісно, якщо параметри шаблона використовуються тільки для розгалуження в if'ах, а їх значення визначаються тими ж макросами