Досвід вивчення Arduino
Доброго вам дня!
Продовжую розповідати вам про свій досвід знайомства із мікроконтролерами на прикладі Arduino. Раніше я розповів, як керувати світлодіодом за допомогою тактової кнопки. Завдання було наступне: натиснули кнопку світлодіод загорівся, відпустили — погас. Проте, практично частіше стоїть завдання зафіксувати дію кнопки, тобто. Якщо описати алгоритм людською мовою, то вийде наступне: якщо кнопка натискалася і світлодіод горить, то погасити світлодіод, якщо кнопка натискалася і світлодіод не горить, то запалити світлодіод.


if (умова) // тут знаходяться команди, які виконуються, якщо умова виконується (тобто не дорівнює нулю)> else // тут знаходяться команди, які виконуються, якщо умова не виконується (тобто дорівнює нулю)>на прикладі мого скетчу це виглядає так :if (0 == onOff)// якщо світлодіод не горить, …onOff = 1; digitalWrite(13, HIGH);// …то запалюємо його, …> else// … інакше …onOff = 0; digitalWrite(13, LOW);/ / … гасимо>
Завантажуємо скетч в Arduino і пробуємо натискати кнопку. Іноді все працює правильно. Іноді світлодіод ледь помітно моргне і згасне. Іноді нічого не відбувається. Чому така різниця в результаті, при виконанні однієї програми? Начебто робимо все правильно ... Виною тому явище, в електроніці зване "брязкотом контактів".


Для реалізації такої затримки в порожній цикл очікування відпускання кнопки я додав команду затримкиdelay(1)(цифрадужках-це тривалість затримки в мілісекундах (1/1000 секунди)). Також у циклі з'явився лічильникcycle++. Цей запис програмісти називають інкрементом. При кожному виконанні команди зміннаcycleзбільшується на одиницю. Цей рядок можна записати так:cycle = cycle + 1. Жодної помилки не буде. Завантажую доповнений скетч до Arduino і перевіряю. Тепер все працює чітко. Задача виконана.
Тисніть кнопки) Для Вас це клацання мишею, а для мене привід продовжувати ділитися своїми напрацюваннями.
Всім Світу та правильних рішень! До побачення.
Коментарі 20
А яке Arduino? наприклад, на Nano на цих висновках ШІМ отримати штатними коштами не вдасться.
Штатно ШІМ працює на висновках 3,5,6,9,10,11 висновків.
Я помилився – просто забув. Адже торік пробував командою analogWrite(RED, brightness(100)); на #define RED 3 . r Це означає ті висновки, що позначені DIGITAL (PWM) -як в UNO? Тото не міг зрозуміти -осцилограф не фіксує ШІМ нижче шпаруватості 120 на аналоговому виході А1. поки що для мене головне питання щодо фіксації сигналу натиснутої кнопки. Дякую за науку!
Так. Що в Нано, що в Уно один і той самий камінь стоїть.
Увечері Вам скетч накидаю. На роботі Arduino IDE не встановлено.
А яке Arduino? наприклад, на Nano на цих висновках ШІМ отримати штатними коштами не вдасться.
Штатно ШІМ працює на висновках 3,5,6,9,10,11 висновків.
Щойно перевірив на УНО — все так! Будь-яку шпаруватість відпрацьовує на 3 виході. Дякую!
byte RED = 9, // вихід синього каналу - пін 9 BLUE = 10, // вихід червоного каналу - пін 10 button1 = 5, // вхід першої кнопки - пін 5 button2 = 6, // вхід другої кнопки - пін 6 button3 = 7, // вхідтретьої кнопки — пін 7 buttonstate = 0, b = 0, r = 0; RED, OUTPUT); pinMode(BLUE, OUTPUT); pinMode(button1, INPUT); pinMode(button2, INPUT); pinMode(button3, INPUT); >
void loop() // put your main code here, to run repeatedly:
while (!buttonstate) < // очікуємо натискання кнопки або комбінації кнопок buttonstate = digitalRead(button1) * 1 + digitalRead(button2) * 2 + digitalRead(button3) * 4; > switch (buttonstate) case 1: b = 255; r = 255; break; // якщо натиснута кнопка 1, червоний і синій по 100% case 2: b = 82; r = 255; break; // якщо натиснута кнопка 2, синій 30% і червоний 100% case 4: b = 255; r = 0; break; // якщо натиснута кнопка 3, синій 100% і червоний 0% while (buttonstate = digitalRead (button1) * 1 + digitalRead (button2) * 2 + digitalRead (button3) * 4); // чекаємо відпускання натиснутої комбінації analogWrite(RED, r); // включаємо червоний канал analogWrite(BLUE, b); // включаємо синій канал >
Здорово і оригінально! Мені ще потрібно зрозуміти сам запис, адже я не знайомий окремими командами. але суть розумію так: кожній кнопці свої параметри шпаруватості цей рядок зовсім незрозуміла: while (buttonstate = digitalRead (button1) * 1 + digitalRead (button2) * 2 + digitalRead (button3) * 4); Буду розбиратися. Величезне спасибі!
У попередньому циклі ми вирахували, яке поєднання кнопок було натиснуто. Записали його в змінну аледержаву. А в цьому циклі ми порівнюємо поточний стан із запам'ятованим. Як тільки воно зміниться, вважаємо, що кнопку відпустили.
Щойно перевірив на УНО — все так! Будь-яку шпаруватість відпрацьовує на 3 виході. Дякую!
Я сьогодні зберу прототип наново. У тому, що вийде я навіть не сумніваюся.зрозумів, що пара switch і case – це умова. А можна було використовувати if. else?