#1 Re: Програмування Arduino » Проблема аппаратная или програмная? Неправильно считает время » 2024-05-13 17:26:49

У вас немає ніякого програмного придушення брязкіту контактів (debouncing). Якщо кнопка підʼєднана напряму і debouncing не реалізовано апаратно, то кожне натиснення генерує серію імпульсів.

Приклад, як можна реалізувати програмно:

static const byte buttonPin   { 2 };
static const byte debounce_ms { 20 };

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

static bool pressedPrev  { false };
static bool debounce     { false };
static unsigned long debounceStartTime;

static unsigned long lastPressTime;
static bool firstPress   { true };

void loop() {
  unsigned long now = millis();

  if (debounce && (now - debounceStartTime >= debounce_ms)) {
      debounce = false;
  }

  if (!debounce) {
    bool pressed = digitalRead(buttonPin) == LOW;
    if (pressed != pressedPrev) {
      debounceStartTime = now;
      pressedPrev = pressed;
      debounce = true;

      // тут обробляєте натиснення або відпускання як вам потрібно
      if (pressed) {
        if (!firstPress) {
          Serial.println((now - lastPressTime) / 1000);
        } else {
          firstPress = false;
        }
        lastPressTime = now;
      }

    }
  }
}

Оптимальне значення debounce_ms можна підібрати під конкретну кнопку, наскільки довго вона брязчить при натисканні та відпусканні. Зазвичай декілька мс достатньо.

Зверніть увагу, якщо між натисненнями пройде більше ніж 1193 години (≈49 діб), то результат буде некоректний через переповнення unsigned long.

#2 Re: Програмування Arduino » Шкала, що заливається » 2024-04-27 22:00:12

Для округлення до найближчого цілого можна так:

long map_round(long x, long in_max, long out_max)
{
  return (x * out_max + in_max / 2) / in_max;
}
...
int FuelLeve2 = map_round(avgVadc, 500, 62);
...

#3 Re: Програмування Arduino » Шкала, що заливається » 2024-04-27 21:04:09

Спробуйте

display.fillRect (100, 64-FuelLeve2, 18, FuelLeve2, 1);

Але у вашому коді є інші проблеми. Сама рамка при висоті 64 вже займає 2 пікселі, тому для шкали залишається 62 пікселя. А в Adafruit GFX є проблема з граничними значеннями: fillRect() малює прямокутник висотою в 1 піксель (лінію), навіть якщо висота дорівнює 0. Тобто для 0 і 1 зображення буде однаковим.

Для точнішого відображення FuelLeve2 потрібно мапити на діапазон [0..62] і не викликати fillRect() при значенні 0:

int FuelLeve2 = map(avgVadc, 0, 500, 0, 62);
if (FuelLeve2) {
  display.fillRect (100, 63-FuelLeve2, 18, FuelLeve2, 1);
}

Це якщо avgVadc приймає значення від 0 до 500 включно, і вас задовільняє округлення до найменшого цілого, що виконує map(). Якщо ж хочете відображати ненульовий рівень при невеликих значеннях avgVadc, або повний рівень при значеннях, трохи менших від 500, тоді потрібно змінити формулу для мапінгу.

Доречі, не обовʼязково малювати поверх вертикальних ліній рамки, має бути достатньо

display.fillRect (101, 63-FuelLeve2, 16, FuelLeve2, 1);

#4 Re: Апаратні питання » Драйвер для водяного насоса 12 вольт » 2024-04-17 23:48:55

Валентина пише:

Можливо проблема в БЖ, яким я намагаюсь заживити відразу ключ і контролер. Не можу розібратись (.

Який у вас БЖ? ESP8266 живиться 3.3 В, як їх отримуєте з 12 В? Покажіть схему підключення.
Може бути таке, що насос намагається стартувати, напруга живлення просаджується і контроллер іде в ребут. Впевніться, що живлення контроллера в нормі і він не рестартує.
Дивіться осциллографом, що там відбувається на шині живлення і на затворі транзистора, коли "не працює".
Також гріється і не працює, якщо подавати постійно одиницю (100% заповнення), чи тільки при ШІМ? Яка частота і який коефіцієнт заповнення?
Доречі, на схемі ключа немає підтягуючого резистора в землю. Рекомендую поставити кілоом 10, бо коли вихід контроллера в високоімпедансному стані, ключ ловить шуми космоса і може відкриватись коли захоче.

#5 Re: Апаратні питання » Драйвер для водяного насоса 12 вольт » 2024-04-17 21:30:56

Може проблема не в ключі? Сам насос працює при подачі живлення напряму? Якщо замкнути вхід ключа на землю, транзистор гріється? (насос при цьому працювати не має). А якщо на вхід ключа подати постійні 3.3 В?

#6 Re: Апаратні питання » Драйвер для водяного насоса 12 вольт » 2024-04-17 20:23:25

Валентина пише:

Подскажите, пожалуйста, как модернизировать схему для работы с более мощным насосом.

Поставити радіатор? При керуючій напрузі навіть 5В опір у відкритому стані 28 мОм. При струмі 6.5 А потрібно розсіювати більше 1Вт, для TO-220 без радіатора це важко.

#7 Re: Різне » Перезагрузка девайсу по інтервалам » 2024-04-16 11:38:11

Vitalion96 пише:

Чи краще керувати звичайним польовим транзистором на пряму?

У вас же струм тільки в одному напрямку тече, від джерела живлення до девайса? Тоді одного транзистора буде достатньо. Тільки дивіться, щоб напруга відкриття транзистора була достатньою для ваших умов (графік Gate-to-Source Voltage  / Drain Current в даташиті, і параметр Gate-source threshold voltage).

#8 Re: Різне » Перезагрузка девайсу по інтервалам » 2024-04-15 20:02:08

NE555 обмежений по номіналам резисторів, при низьковольтному живленні там не більше кількох мегаом. Тобто для кількох годин потрібно буде конденсатор на кілька десятків тисяч мкФ. А у них струм протікання уже суттєвий. Тобто можна, але будь-який дешевий мікроконтроллер справиться з такою задачею краще. Або навіть на таймері c005 можна зробити.
В якості ключа - mosfet, P-канальним простіше керувати живленням. Якщо падіння напруги не критичне, то можна і біполярник.

#9 Re: Апаратні питання » Джойстик,..... дефект? » 2024-04-11 08:51:31

vvr пише:

Звичайний джойстік з потенціометрами та кнопкою.

Так, але потенціометри зʼєднані паралельно:
pots.png
При ідеальних потенціометрах залежність еквівалентного опору між точками A і B від положення повзунка має квадратичний характер:
graph.png
Невеликий розкид параметрів призводить до відʼємної залежності у близьких до верхнього положеннях.
Тому потрібно подавати живлення і зчитувати напругу. Тоді теоретично залежність має лінійний характер.

#10 Re: Апаратні питання » Джойстик,..... дефект? » 2024-04-10 12:46:17

Потрібно не опір вимірювати, а подавати живлення +5В і вимірювати напругу. Наскільки розумію, там щось інше ніж звичайні потенціометри.

#11 Re: Програмування Arduino » ZMCT103C + EmonLib допоможіть з нелінейною характеристикою » 2024-04-07 09:05:14

khalimon пише:

Буду дивитись в напрямку програмної правки

Яка може бути програмна правка, коли вихід операційного підсилювача упирається в напругу живлення?

khalimon пише:

або шукати інше апаратне рішення...

Ви готовий модуль підключаєте? Замініть шунт 100 Ом на менший. Або зменшіть коефіцієнт підсилення першого каскада, збільшивши вхідний резистор або зменшивши резистор у зворотньому звʼязку.
Ще можна підняти напругу живлення, але можуть бути нюанси. Яка схема у модуля? На виході є розвʼязуючий конденатор, як тут? Тоді на стороні ардуіно також має якось задаватись середня точка, наприклад, резистивним дільником.

#12 Re: Програмування Arduino » Генератор частоти з регулюванням шім » 2024-04-05 12:37:37

Дійсно, в режимах, де ICRn використовується як TOP, він не оновлюється автоматично. Тоді так, на одному 16-бітному таймері можна зробити два канала з довільною частотою. Для FastPWM це режим 14.

#13 Re: Програмування Arduino » Генератор частоти з регулюванням шім » 2024-04-05 02:40:14

GmmC пише:

можливо одночасно буде реалізувати також шім по двух чи одному каналу?

На одному таймері з довільною частотою два канала не вийде: у таймера два регістра-компаратора, і один із них використовується або як один із каналів ШІМ, або для керування частотою.

Є наступні варіанти:

1) Один таймер, два канала, фіксований набір частот. Для 16-бітного таймера максимальна частота 16 МГц / 65536 ≈ 244 Гц, решта нижчі. Для 8-бітного 62500 Гц, 7812.5 Гц і т.д, тобто 16 МГц / 256 і дільниками 1, 8, 64, 256, 1024 для TC0. Для TC2 також доступні дільники 32 і 128.

2) Два таймера, по одному на кожний канал. Для точного налаштування фази їх потрібно буде синхронізувати, наприклад, задаючи різні початкові значення TCCNT.

3) Таймер в режимі лічильника, з вимкненим Compare Output. Програмно опитувати TCCNT в циклі і відповідно смикати GPIO. Звернути увагу на можливі ґлітчі при взаємодії з UI та зміні параметрів.

4) Взагалі без таймерів, генерувати затримки програмно, смикати GPIO. Для досягнення хорошої точності прийдеться вираховувати час виконання окремих інструкцій. Сумістити це з UI - той ще челендж.

#14 Re: Програмування Arduino » Генератор частоти з регулюванням шім » 2024-04-02 01:50:42

Частота 32 кГц при тактовій 16 МГц доступна точно: це рівно 500 тіків. Наступна досяжна нижча частота буде при дільнику 501: [16e3/501] = 31936 Гц. Якщо округлювати задану користувачем частоту до найближчої досяжної, то відносна похибка виходить ≈ 0.1%. У китайських модулів заявлено 2%  smile

Якщо така точність задовільняє, то можна обійтись FastPWM режимом 16-бітного таймера.
Для нижчих частот вмикати апаратний дільник таймера (prescaler), щоб не переповнювався 16-бітний лічильник. Розрахувати діапазони для зміни дільника, щоб зберегти баланс між похибкою по частоті і по коефіцієнту заповнення.

Також для 100% заповнення (або для 0% в інверсному режимі) вимикати керування піном по таймеру і виставляти відповідне значення через GPIO.

Доречі, на деяких платах ардуіно зустрічаються Atmega328PB (хоча марковані як 328P). У них є два додаткових 16-бітних таймера з окремим прескалером (а також додаткові UART, SPI, I2C).

#15 Re: Програмування Arduino » Генератор частоти з регулюванням шім » 2024-03-31 19:10:37

Honey пише:

Частоту і коефіцієнт заповнення ШІМ на AVR не вийде встановлювати абсолютно довільно

Для невиликих частот можна генерувати ШІМ програмно з раціональним дільником, в певних межах точності.
Питання в тому, чи хоче ТС розібратись сам, чи чекає на готове рішення.

#16 Re: Програмування Arduino » Допоможіть будь ласка початківцю. » 2024-03-31 18:57:58

wsx пише:

Або якщо просто додати в масив якийсь перший байт та останній, які не співпадають з основними. А в приймачеві розділити по байтах та брати інформаційні після першого "кодового" і останній для перевірки.
Так проканає?

Serial передає потік даних (stream), сам по собі він безперервний. Ви хочете передавати датаграми, тобто окремі посилки з початком і кінцем.
Є два основних метода:

1. Відокремлювати початок посилки по часу. На передавачі слати дані з певною затримкою між датаграмами (у вас уже є пауза 50 мс). На приймачі, якщо даних не було довше певного періоду, вважати нові дані початком посилки.

2. Відокремлювати початок (та/або кінець) посилки певним маркером. На приймачі сканувати потік на наявність цього маркера. Майте на увазі, що у загальному випадку всередині датаграми також можуть зустрітись дані, які співпадають зі значенням маркера. Щоб уникнути хибної синхронізації бажано додати контрольну суму, хоча б CRC8. При неспівпадінні контрольної суми або маркера кінця посилки не відкидати всі данні, що надійшли, а продовжити сканування з наступного символа після маркера. Правильне рішення цієї задачі не таке просте, як здається на перший погляд.

Кожен метод має свої переваги і недоліки. Можна використовувати і обидва методи одночасно.

#17 Re: Програмування Arduino » Допоможіть будь ласка початківцю. » 2024-03-31 10:35:09

А це:

Serial.write(buff[2]);

спроба доступа за межі масива buff. Це невизначена поведінка.
Почитайте основи про масиви в C (у C++ також використовуються C-шні масиви).

#19 Re: Різне » шим регулятор на ардуіно » 2024-03-21 19:04:56

Пришвидшити закривання можна просто прибравши резистор із кола затвора. Але тоді зросте струм керування на високих частотах, також може з'явитись "дзвін". Для запобігання цьому і ставлять резистор, а щоб він не впливав на закривання, шунтують його діодом. Також в мостових схемах важливо закривати один транзистор швидше ніж відкривається інший, щоб запобігти наскрізному струму.
А в тій схемі де діод "навпаки", транзистор часом не зворотньої провідності?

#20 Re: Різне » шим регулятор на ардуіно » 2024-03-21 10:03:55

Може залежати від різних факторів, у тому числі особливостей виходу схеми управління. Якщо немає необхідності обмежувати струм що втікає у вихід управління, то діод із затвора. Якщо немає необхідності обмежувати струм що витікає з виходу, то навпаки.

#21 Re: Різне » шим регулятор на ардуіно » 2024-03-20 20:42:48

Коли транзистор повністю відкритий (у стані насичення), напруга коллектор-еміттер складає приблизно менше одного вольта (залежить від струму і температури), а не 250 вольт.

#22 Re: Апаратні питання » І знову вольтметр » 2024-03-20 12:28:00

Shaman2 пише:

Але коли ми припаркувались і не виключили задню передачу, а зразу виключили запалення статус передачі зник, нажати кнопку щоб виключити аварійку немає кому

Хм, для вимкнення запалення ключ повертається з положення ON в положення ACC. Можна знімати напругу з лінії, яка підключена тільки в положенні ON, але не в ACC.

#23 Re: Програмування Arduino » Нужна помощь начинающему!!! 3-х режимный фонарик » 2024-03-20 10:07:51

Васятко пише:
dimich пише:

Цікавості починаються через 24 або 49 діб, при знаковому або беззнаковому переповненні лічильника,

Ще один адепт секти Свідків Переповнення Великого Міліс?

"якщо код кривий" пропустили? Звісно, при нормально написаному коді переповнення ні до яких збоїв не призводить.

#24 Re: Апаратні питання » І знову вольтметр » 2024-03-20 08:41:29

Shaman2 пише:

Йде обробка сигналів з кан-шини, потрібно корректно завершити запрограмовані процедури у разі вимикання двигуна.

Цікаво. А нема якихось більш-менш стандартизованих індикаторів роботи двигуна? Наприклад від датчика положення колінвала? Той же OBD-II зчитує оберти, можливо з тієї ж самої CAN. Я не спеціаліст в автоелектроніці, просто розмірковую.
Або "хардварний" сигнал, напруга з генератора чи щось подібне.

Shaman2 пише:

Ще обдумую такий вариант

Здається, такий метод буде більш надійним, аніж вимір напруги в мережі.

#25 Re: Програмування Arduino » Нужна помощь начинающему!!! 3-х режимный фонарик » 2024-03-20 04:53:15

просто зайшов пише:

вообще millis(); очень неудобная функция для 8ми битных микроконтроллеров ,  мало того что не точная, так еще и занимает кучу времени на обработку 32-х битной математики.

Так вся ця ардуіна - навчальний проект для початківців. Яка там ефективність чи оптимізація...
Що може бути простіше "кількість мілісекунд від початку роботи"? Цікавості починаються через 24 або 49 діб, при знаковому або беззнаковому переповненні лічильника, якщо код кривий smile

Щодо точності - у них є компенсація лічильника, яка ціла для 8 і 16 МГц, тобто довгострокова точність відповідає кварцу. Але джиттер.

просто зайшов пише:

Что мешало разрабам добавить для пользователей глобальный флаг в обработчик прерывания по таймеру0 не понятно...
Хотя это решается включением прерывания по совпадению TIMER0_COMPA_vect .

На AVRках замість флага можна читати молодший байт timer0_overflow_count, якщо трошки похуліганити:

extern volatile unsigned long timer0_overflow_count;
static inline uint8_t overflows() {
  return *reinterpret_cast<volatile uint8_t *>(&timer0_overflow_count);
}

Ну а там, де потрібна оптимізація за швидкодією або розміром, то бібліотеці ардуіно взагалі не місце.

Підвал форуму