Видеоуроки по Arduino #2.2. Кнопки, PWM / ШИМ, функции
Vložit
- čas přidán 13. 04. 2011
- Следующий урок - • Видеоуроки по Arduino ...
Джереми рассказывает о том как подключать кнопки к Arduino, зачем нужен breadboard, как использовать широтно-импульсную модуляцию сигналов (ШИМ или PWM) и о том как создавать собственные функции в среде программирования Arduino
Начало - • Видеоуроки по Arduino ...
Скетч для Arduino - jeremyblum.com/wp-content/uplo...
Список деталей:
• Arduino Uno - amperka.ru/product/arduino-uno...
• USB-кабель - amperka.ru/product/usb-cable?u...
• Breadboard - amperka.ru/collection/breadboa...
• Светодиоды - amperka.ru/product/led-5mm?utm...
• Резисторы - amperka.ru/product/resistor?ut...
• Кнопка тактовая - amperka.ru/product/tactile-but...
• Набор перемычек - amperka.ru/product/jumper-wire...
• Мультиметр - amperka.ru/product/multimeter?...
ПО для Arduino - arduino.cc/en/Main/Software
Оригинал -
• Tutorial 02 for Arduin...
Автор - Jeremy Blum / @sciguy14
Перевод - AmperkaRu / @amperkaruofficial
Материалы переведены и опубликованы с разрешения автора - Věda a technologie
Довольно сумбурно объясняет. Понятно, что ему всё это понятно (извините за тавтологию), но для тех, кто впервые увидел Ардуино это совсем непонятно. Хотя в первой серии он сказал, что эти уроки подойдут и таким людям. Но хорошо, что даёт толчок на более глубокое изучение написания программ.
P.S. Амперка, спасибо вам за перевод и за вашу WIKI.
Можешь посоветовать какой-нибудь ресурс по Ардуино для новичка?
@Московцов Иван )))))) понятно ему....
перевод-отстой. могли бы и переозвучить
После данного видеоурока и главы 2.8 его книги, бооольшая часть людей начинающих изучение arduino - закончили изучение arduino!
3 ролика и мозг закипел
2 :D
а я ещё огурчиком держусь, но думаю скоро к вам присоединюсь)
Роман Леонидович Я начал читать его книгу, но она сложна и разбита на непонятно и что и как. Плохо объясняет.
Тоже самое! 3 ролик и на этом хватит!
значит хорошо. каша варится.
очказавр просто выносит мозг множественными вводами буленов! Смотрел раз 15, но так и не понял что он там с чем сравнивает.
Nikita Degterev согласен, слишком завидно для начинающих.
Если разрабатываете сложный для Вас проект и нет понимания логики работы, то нарисуйте для себя блок-схему на бумаге. По началу это Вам поможет, без иронии и сарказма. Со временем логика работы скетча начнет приходить сразу при постановке задачи.
@@ByteSmart к сожалению он сам себе в слух обьясняет, ничего не донес до меня я так и не понял что да где
я уже 11 год смотрю и так и не понял
я не понял логику автора видео, поэтому сделал по своему, всё работает чётко :)
int ledpin = 13;
int switchpin = 1;
boolean kip = false;
void setup()
{
pinMode(ledpin, OUTPUT);
pinMode(switchpin, INPUT);
}
void loop()
{
if (digitalRead(switchpin) == HIGH)
{
delay(200);
kip = !kip;
}
digitalWrite(ledpin, kip);
}
У вас, к сожалению, если нажатие кнопки продлится более 200 мс результат будет случайным
***** xD, "дикости" называются "функциональная парадигма программирования".
И, да, у него вызов функции с проверкой и установкой значения. А loop вызывается всегда. Если подержать кнопочку, будет лажа, а именно раз в 0.2 секунды будет меняться состояние светодиода.
Так вот же идеальный вариант антидребезга
if (digitalRead(swichPin) == HIGH && lastButton == 0)
{
delay(250);
ledOn = !ledOn;
}
lastButton = digitalRead(swichPin);
digitalWrite(ledPin, ledOn);
}
Тоже самое, только присутствует все тот же lastButton который при зажатой кнопке не дает переключать ledOn по кругу
int led1 = 4;
int switch1 = 3;
boolean lastButton = LOW;
boolean ledOn = LOW;
void setup()
{
pinMode(led1, OUTPUT);
pinMode(switch1, INPUT);
}
void loop()
{
if (digitalRead(switch1) == HIGH && lastButton == LOW)
{
ledOn = !ledOn;
lastButton = HIGH;
}
else
{
lastButton = digitalRead(switch1);
}
digitalWrite(led1, ledOn);
delay(5);
}
а у меня так и все работает очень хорошо
Да, я тоже. Согласен что так проще.
После завершения видеоурока - решил сделать плавное разгорание и затухание во время нажатия кнопки)) Понравилось
Очень сложно понять, потому что он старается уложить в каждый урок по максимуму материала. Вообще это и хорошо.
Спасибоо! Благодаря Вам, разобрался в непонятных мне вопросах!
Вам спасибо! Рады, что оказались полезны
)))) ахах
спасибо за перевод, очень хороший материал и все понятно)
Я вскипел и опух от этого урока ...
Пойду отдохну
int switchPin=8;
int ledPin=12;
boolean lastButton = LOW; // последнее состояние кнопки
boolean currentButton = LOW; // текущее состояние кнопки
boolean ledOn = false; // состояние св.диода при включении false-true
void setup()
{
pinMode(switchPin, INPUT); // пин подачи для управления св.диода
pinMode(ledPin, OUTPUT); // выход на св.диод
}
boolean debounce(boolean last)
{
boolean current = digitalRead(switchPin);
if (last != current) // если текущее и предыдущее состояния кнопки не совпадают
{
current = digitalRead(switchPin); // прочтать из switchPin и присвоить current
}
delay(1000); // задержка на дребезг контактов св.диода 1сек
return current;
}
void loop()
{
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{
ledOn = !ledOn;
}
lastButton = currentButton;
digitalWrite(ledPin, ledOn);
}
всё понятно
Джереми объясняет местами сумбурно, но на самом деле, в конечном итоге, новички материал понимают. По крайней мере становится понятно в какую сторону копать для более подробного изучения вопроса.
Почему в переводе Пэ-Вэ-Эм, а не ШИМ - вопрос хороший. Ответ: так сложилось. На момент перевода это казалось хорошей идеей, т.к. большинство материалов типа «Arduino + что-то» было на английском и не хотелось вырывать человека из контекста.
Переводили бы сейчас - наверное сделали б чуть иначе.
Как узнать какая частота ШИМ и при необходимости поменять?
Не как не могу понять зачем нужна строчка в конце - lastButton=currentButton ? И какое значение lastButton будет при втором прогоне программы после однократного нажатия кнопки (то что мы присвоили в конце программы или то что в начале программы прописано в глобальных переменных)?
Что значит скормить функции last?
Написал похожий пример на основе данного видео: Лампочка меняет состояние в момент отпускания кнопки.
int button = 8;
int led = 13;
boolean buttonWasDown = false;
boolean currentButton = false;
void setup()
{
pinMode(led, OUTPUT);
pinMode(button, INPUT);
}
void loop()
{
if (currentButton != digitalRead(button))
{
delay(5);
currentButton = digitalRead(button);
}
if (currentButton == true) buttonWasDown = true;
else
{
if (buttonWasDown == true)
{
digitalWrite(led, !digitalRead(led));
buttonWasDown = false;
}
}
}
Надо 87 раз посмотреть, чтобы все было норм
Смотрю 3 видео подряд! Ребята, Вы ничему тут не научитесь....
в части, где автор расказывал про функцию boolean, стабилизация одной кнопки со светодиодом. А как сделать тоже самое для двух кнопок и двух светодиодов? я копировал и вставлял эти функции, но появилась ошибка redifinition of boolen, что можно с этим сделать?
+kentforthable нельзя объявлять функцию повторно, её лишь можно повторно использовать. Здесь нужны навыки программирования
+Сергей Куренчук имя переменых не могут совподать
+Berl Lancman к чему ты это?
А не проще для яркости использовать long byte? Или такого типа данных нет?
а где исходники можно найти?
Я так понял debounce() всегда возвращает LOW?
Первую часть (стабилизацию кнопки) я сделал без функций:
void setup ()
{
pinMode(switchPin, INPUT); // пин switchPin (8) назначили на вход
pinMode(LedPin, OUTPUT); // пин LedPin (13) назначили на выход
}
//--------------------------------------------------------------------------------
void loop ()
{
currentButton = digitalRead(switchPin);
if ( currentButton != lastButton)
{
delay (5);
currentButton = digitalRead(switchPin);
}
if (currentButton == HIGH && lastButton == LOW)
{
ledOn = !ledOn;
}
lastButton = currentButton;
digitalWrite (LedPin, ledOn);
}
все работает, мозг не закипает.
твой код проще и нагляднее, спасибо
Исходники есть под оригинальным видео Джереми. Он ведь сам во время видео пальцем вниз показывает, когда говорит о них.
Исходники программ? Ссылка на них есть на странице вики: wiki.amperka.ru/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%83%D1%80%D0%BE%D0%BA%D0%B8:2-%D0%BA%D0%BD%D0%BE%D0%BF%D0%BA%D0%B8-pwm-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8
Я писал программу паралельно с Джереми вот какую ошибку выдает
sketch_mar26a.ino: In function 'void loop()':
sketch_mar26a:27: error: 'currentButton' was not declared in this scope
По поводу последней части урока (когда загорается и тухнет постепенно) подключил все как на видео через резисторы сначала 10КОм, 220Ом, 1КОм. Спалил 10 лампочек, подключил напрямую - все работает. В чем может быть причина?
+Сергей Иванов Та же херня, через резистор (какого сопротивления в ролике кстати не сказано, но обычно 220 Ом для светодиодов берут) не загорается лампочка.
А еще у меня в выключенном состоянии кнопка == HIGH, а в нажатом наоборот == LOW. Где-то читал до этого, что кнопки бывают правильные, как в ролике и обратные, как у меня.
+videokolya сорри ступил, у меня оказывается + и - были перепутаны которые от ардуины к бредборду идут :) Отсюда и состояния кнопки перепутаны и светодиод на бредборде не горел. Отсюда вывод: всегда применяйте проводы "правильных" цветов для +/-, а не как я за неимением других взял красный и коричневый и перепутал их.
Это пи*дец! - явно это не для новичков!
Это то же самое если я начну объяснять обычному рядовому пользователю как проверить транзистор, конденсатор, и т.д. тому подобное....
Прикольно, у меня обратная ситуация. Я его пониманию нормально, а с транзисторами, кондесаторами и тому подобным ни фига не понимаю...
@@ByteSmart , просто Александры по схемотехнике, а ты по программированию.
Он нормально объяснил.
Но новичок это то же относительно. Для когото первый раз видеть, а для кого то первый раз для новой платформы/языка
У,меня такой вопрос можно ли вытащить ик дальномер из мышки если он вообще там есть(я про то что снизу светит), скорее всего я задал тупой вопрос но все же ответьте, а если и нельзя(что скорее всего так и будет) то подскажите можно ли его самому сделать нежели покупать, или все же будет купить дешевле
там нет дальномера =(
покупай
***** Вот неплохой ролик от Discovery о работе оптических лазерных мышей: czcams.com/video/HhJFpbDi6g4/video.html , там немного другой принцип используется. Проще всего, пожалуй, все-таки приобрести готовый модуль.
А Вы не могли бы свой код выложить ещё раз? Я разобрался, но хотелось бы увидеть более элегантное решение.
Тут есть нюанс того что все новички не знают того что когда функция берет значение переменной lastButton он просто копирует значение и никак не меняет изначальное значение, и в функции main в условии if lastButton будет == low, и обязательно сработает условие if а затем в переменную lastButton присвоится снова low потому что после дебаунсинга кнопка уже не нажата, и так по кругу сработает условие if так как lastButton == low при следующей итерации, ищите в гугле что такое итерация, и поймете, а переменная ledOn просто каждый раз инвертируется, то устанавливаясь в состояние true то в false.
Если что, спрашивайте, чем смогу тем помогу, помогу понять, так как программисты об о многом умалчивают (типа ещё рано для таких познаний, нифига не рано, нужно всю информацию давать с полна, чтобы понятно было полностью, профессионально)чтобы программирование казалось чем-то непостижимым.
Доброго времени . Поможите разобраться? Chervjk4@mail.ru
Почему так сложно? Почему нельзя сделать так:
if (digitalRead(switchPin) == HIGH){
delay(10);
if (digitalRead(switchPin) == HIGH){
// пишем то, что должно произойти
}
}
Попробовал твой вариант. Две нововости: 1.работает. 2.но ху.во!.
Делай выводы!
Не понял, два одинаковых выражения должны работать по разному ? 😲
Здравствуйте!
У нас прописаны переменные lastButton и currentButton.
Почему в функции debounce прописываются переменные просто last и current без Button?
Это некие правила упрощённого написания или это совсем другие переменные?
в функции loop существует строка:
currentButton = debounce(lastButton);
это значит что внутри функции debouce - last принимает значение lastButton-которая является глобальной переменной. Т.е когда в скобках после функции пишется какая-то переменная, она будет принимать значение которое будет заданно функции каждый раз когда будут вызывать эту функцию. Суть в том что функция многоразовая и может иметь каждый раз разные значения
Неплохо, даже пример создания и работы функции сюда впихнул. Только вот не догнал: при написании функции debounce входной аргумент last. А он его нигде не объявлял... Хотя потом он использовал на входе lastButton, но из-за last почему он ошибку не выдал?
kombadt так last это аргумент функции, его не нужно объявлять. Переменная last используется только внутри этой функции и содержит значение, которое передали этой функции
Джереми крутой чувак, но мне не всегда нравится как он пишет код, весь антидребезг можно реализовать этим минимумом простого и понятного кода.
int inputPin = 5;
int ledPin = 13;
int ledValue = LOW;
void setup()
{
pinMode(inputPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop()
{
if (digitalRead(inputPin) == HIGH)
{
ledValue = ! ledValue;
digitalWrite(ledPin, ledValue);
delay(500);
}
}
Как раз его код учитывает всё, в отличие от твоего. На твоём коде при удержании кнопки нажатой лампочка будет постоянно включаться/выключаться.
Не знаю что учитывает код Джереми но явно не все. Точь в точь повторенный пример с кнопкой явно показывает что его код учитывает не все. Та же проблема что и у вас выше в комменте. Нажал кнопку при задержке в 1000 милисек. светодиод горит снова, отпускание он тухнет и снова горит. Думал может я чего гоню. Но результат на лицо, у него в коде где то есть проблема. А вот код от Никиты Варфоломеева как раз подошел и делает все то же что и на видео.
Geo graph, учи матчасть. Элементарно, пауза нужна, что-бы успеть отжать кнопку. Если ты ее не отжимаешь за 500 мс, то на входе остается +5V и условие срабатывает. Если отжимаешь, то на входе опять LOW и условие пропускается.
Речь шла о вкл/вкл кнопки, а не о работе программы при удержании кнопки. Мой кусок кода делает это. Напиши свой лучший код.
Andrew Saharov у тебя с самого начала неверное мышление, ты когда-нибудь видел заводское рабочее устройство, на котором нужно "успеть отжать" кнопку, иначе оно будет работать неверно? Твой код использует костыли
Ты зря вскипаешь. Мы же изучаем ардуино а не проектируем заводские устройства. Давай я открою тебе секрет, что никому и в голову не придет делать на ардуино заводские устройства. Изначально ардуино это образовательная платформа.
Это был простой и ясный пример для школьников, который показывает как работает задержка, условие и прочие базовые операции. А поскольку это начало учебного курса мы не касаемся функций методов и библиотек, с помощью которых можно все "по-заводскому" сделать, но школьник ничего не поймёт.
Новички не понимают...
Если есть вопросы, пишите в комментах, на форуме или в соц. сетях. Будем рады вам помочь!
У меня так скейч и не запустился
Истину глаголите. Может быть я и полный нуб, но эту серию перескочил. Дебоунс, шмебоунс.
уже есть нано. 4 собрал и получился датчик, екранировал и все гуд
да если нет начальных навыков вообще ничего не понятно . сам прошел все с азов электроники триггеры счетчики и только потом перешел к программированию на си++ . хорошо что когда увидел эти уроки уже был опыт . поэтому быстро учение пошло на ардуино
не работает ссылка добавте в описание
Подскажите как сделать, чтоб поднесли ключ - замок открылся, еще раз поднесли -= замок закрылся. Вот код:
#include
#include
#include
const byte saveKey = 2; // вход для кнопки обнуления
const byte statusLed = 13;
const byte doorPin = 3;
OneWire ds(8);
Servo servo;
byte addr[8];
byte allKey; // всего ключей
// функция сверяет два адреса (два массива)
boolean addrTest(byte addr1[8], byte addr2[8]){
for(int i = 0; i < 8; i++) {
if (addr1[i] != addr2[i]) return 0;
}
return 1;
}
void error(){
while(1){
digitalWrite(statusLed, !digitalRead(statusLed));
delay(300);
}
}//
boolean keyTest(){ // возвращает 1 если ключ есть в еепром
byte addrTemp[8];
for (int i = 0; i < allKey; i++){
for(int y = 0; y < 8; y++) addrTemp[y] = EEPROM.read((i = 63) error(); // если места нет
while (!ds.search(addr)) ds.reset_search(); // ждем ключ
if ( OneWire::crc8( addr, 7) != addr[7]) error();
if (keyTest()) error(); // если нашли ключ в еепром.
for(int i = 0; i < 8; i++) EEPROM.write((allKey
вскармливать значение))
или вот такое на управление 1 светодиодом без дребезга на 2 кнопках :
int switchPin=8;
int switchPin1=7;
int ledPin=12;
boolean lastButton = LOW; // последнее состояние кнопки
boolean lastButton1 = LOW; // последнее состояние кнопки
boolean currentButton = LOW; // текущее состояние кнопки
boolean currentButton1 = LOW; // текущее состояние кнопки
int ledLevel = 100; // яркость от 0 до 255 уровня
void setup()
{
pinMode(switchPin, INPUT); // пин подачи для управления св.диода plus
pinMode(switchPin1, INPUT); // пин подачи для управления св.диода minus
pinMode(ledPin, OUTPUT); // выход на св.диод
}
boolean debounce(boolean last)
{
boolean current = digitalRead(switchPin);
if (last != current) // если текущее и предыдущее состояния кнопки не совпадают
{
current = digitalRead(switchPin); // прочтать из switchPin и присвоить current
}
delay(100); // задержка на дребезг контактов св.диода 0.1сек
return current;
}
boolean debounce1(boolean last1)
{
boolean current1 = digitalRead(switchPin1);
if (last1 != current1) // если текущее и предыдущее состояния кнопки не совпадают
{
current1 = digitalRead(switchPin1); // прочтать из switchPin1 и присвоить current1
}
delay(100); // задержка на дребезг контактов св.диода 0.1сек
return current1;
}
void loop()
{
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{
ledLevel = ledLevel + 25; // добавить к яркости 25 единиц
}
lastButton = currentButton;
if (ledLevel > 255) ledLevel = 255;
currentButton1 = debounce1(lastButton1);
if (lastButton1 == LOW && currentButton1 == HIGH)
{
ledLevel = ledLevel - 25; // отнять яркость на 25 единиц
}
lastButton1 = currentButton1;
if (ledLevel < 0 ) ledLevel = 0;
analogWrite(ledPin, ledLevel);
}
Лол, на 3 минуте стал выбиваться из смысла, почитал коменты, понял, что всё нормально)
Здравствуйте
Скажите,нельзя ли открыть список всех доступных аргументов при программировании?
Ну хотя бы по первой букве ,если вы понимаете о чем я)
Их можно найти здесь: arduino.cc/en/Reference/HomePage
ставьте sublime text + stino и будет вам счастье
Народ подскажите как можно сделать так, чтобы при ШИМе после достижения 255 светодиод начал также постепенно падать до 0.
timiusis если значениеЯроксти = 255 то значениеЯркости = значениеЯркости - 51; как то так. но нужно еще написать что делать когда значение = 0.
+timiusis
int switchPin = 8;
int ledPin = 11;
boolean lastButton = LOW;
boolean currentButton = LOW;
int ledLevel = 0;
int ledShift = 51;
void setup()
{
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
}
boolean debounce(boolean last)
{
boolean current = digitalRead(switchPin);
if(last != current)
{
delay(5);
current = digitalRead(switchPin);
}
return current;
}
void loop()
{
currentButton = debounce(lastButton);
if(lastButton == LOW && currentButton == HIGH)
{
ledLevel = ledLevel + ledShift;
if(ledLevel > 255-51 || ledLevel
почему при подключении к 13 пину не использовали резистор?
На этом пине уже есть резистор. И к нему подключен светодиод, который расположен на самой плате
Rebeata u menea choto ne rabotaet kak nado. Posle zagruzki sketcha Geremi u menea diod postoianno migaet. poproboval s sketchom Mylbor i toje samoe ne mogu poneat v chom problema. Help !!!!!
Потому что таймер для PWM восьмибитный как и сам микроконтроллер. 2^8 = 256
чего не написать delay(100)?
Действительно, не очень понятно, но если подумать, то всё становится очевидным. Хотя больше предпочитаю true original AtMega.
int switchPin = 9;
int ledPin = 13;
//булины могут принимать не только true и false, а также и 1 или 0, LOW или HIGH
boolean lastButton = LOW;
boolean ledOn = LOW;
void setup() {
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
//вот тут иф'ы; когда нажал
if (digitalRead(switchPin) == HIGH && lastButton == LOW)
{
ledOn = !ledOn;
lastButton = HIGH;
delay(100);
}
else
{
lastButton = !digitalRead(ledOn);
delay(100);
}
digitalWrite(ledPin, ledOn);
}
ребята чо делать , выбивает вот такую фразу:
exit status 1
redefinition of 'void setup()'
на скетч из этого видео
Обратится в техподдержку - amperka.ru/page/contacts
Arduino можно на C# программировать?
нет
Можно, гуглим arduino c#. Вот ссылка еще: forum.amperka.ru/threads/c-приложения-для-управления-arduino-из-под-windows.13708/
не понимаю всё повторил несколько раз всё равно пишет ошибку
exit status 1
'current' was not declared in this scope
в чём дело?
это значит что...
current was not declare in this scope
переменной current у тебя нет.
и где её найти ?
igor98588 так код свой посмотри.Ты не объявил переменную.
спасибо посмотрю
boolean current = digitalRead(switchPin); Кто нибудь знает почему он присваивает значение булевой переменной значение 1 или 0? или я чего не понимаю, разве там не должно быть TRUE FALSE?
boolean может быть как TRUE/FALSE, так и 1/0
Егор Смирнов false это 0. Все что не 0 это true. В том числе и 1:-)
Ага, спасибо! Я уже дошел))
Если я все данные манипуляции произведу с ардуино нано я её не спалю!? т.о. подам питания 5 вальт от БП
что такое boolean last и boolean current? мы ведь не присвоили значение переменной last = HIGH или LOW
"boolean" это служебное слово обозначающее тип данных. Все что идет после "boolean" это имя переменной. Если мы не поставили после имени "= число " то значение по умолчанию присваивается " ноль " (либо ЛОЖ).
... А если поставить скобки после объявленной переменной то получится функция
-Объявили переменную с именем last: boolean last;
-Создали функцию с именем last: boolean last (...) { };
PS. хотя я не программист и мог где-то ошибиться.
заказал себе ардуино уно для интереса что то строить на этой платформе, решил посмотреть как что писать, этот видос для меня как для человека непонимающим как писать программу это просто пиздец, информации 0, почему какие команды нужно писать вообще нифига непонятно, таким же макаром можно залить принципиальную схему и прошивку на файлообменник и понимай как хочешь, от видоса ну реально пользы ничерта
Ну и как успехи спустя 7 месяцев?
Чувак по сложному пути пошел!Нужно было в конце цикла IF,перед else поставить задержку delay(400).Она бы все эти дребезжания отфильтровала
Александр Меньшиков
if это не цикл а условный оператор🙈
Ставить задержку в обще нельзя. Поскольку это останавливает весь микроконтроллер. И в случаи если будет еще cигнал или информация на порт, то процессор ничего не зафиксирует. Этот код нужно писать не через delay(), а через millis()
Неужели нет функции pause? почему мучиться с кодом так пришлось?
Подскажите пожалуйста, где есть весь список функций?
Динар Гарипов arduino.ru/Reference здесь можете глянуть
Дальше этого цикла программа не пройдет. А если нужно еще кучу штук подключить?
Зачем он пишет код стабилизации в setup, это же выполняется единожды, одноразовая стабилизация или что???
7:00 *Судя по всему 255 не является ограничением, то есть является, но для светодиода все, что больше 255 = 255. Иначе такой вид проверки выдал бы ошибку переполнения. А такую проверку нужно было поставить по логике в первом условии*
if (lastButton == LOW && currentButton == HIGH)
{
if(ledLevel >255) ledLevel=0;
ledLevel+=51;
}
Или я чего-то не допонимаю, ни разу не кодил под адруино, только собираюсь.
comPlushki Смотри, мы на самом деле сначала проверяем больше ли число, чем 255. Если нет, то передаем его функции. Иначе передаем 0. Ты прав. Если бы мы передали функции число > 255 это вызвало бы ошибку.
comPlushki 255 ты получаешь только после инкремента в цикле. начальное значение = 0. то есть 0 51 102 153 204 255, потом идет проверка, если последний инкремент дал больше 255 то мы скидываем в ноль. и в функцию на следующем шаге влетает ноль, то есть вместо переполнения мы даем диоду ноль. 255 это ограничение для функции write. Саму переменную типа инт мы можем увеличивать еще довольно долго. А где мы будем делать проверку , в данном случае не важно, главное чтоб перед тем как подать сигнал с ноги контроллера.
+comPlushki мне вот ещё интересно, а чего просто ">", а не ">=". Мы же если 5 раз прибавляем к 0 51 вроде 255 получаем.
+comPlushki Выходит Вы не получите состояние, когда кнопка выключена.
+comPlushki Тут на самом деле не важна проверка текущей яркости светодиода. Объясню почему:
Переменная яркости светодиода имеет тип int - это целочисленный тип данных размером в 4 байта (32 бита). Если мы передаем функции analogWrite переменную типа int и при этом компилятор не ругается (т. е. не выдается ошибка во время компиляции программы), то никаких ошибок быть не может и не нужно проверять величину переменной яркости светодиода. И даже обнулять переменную не нужно, т. к. если ШИМ вывода микроконтроллера может принимать значения от 0 до 255, значит регистр микроконтроллера, который отвечает за ШИМ, является однобайтовым, т. е. в него могут "влезть" значения не более байта (в десятичной от 0 до 255 или в шестнадцатеричной от 00 до FF). Можно сделать таблицу, в которой будет видно, что первый байт 32-битной переменной будет обнуляться "самостоятельно":
00 00 00 00 = 0
00 00 00 33 = 51
...
00 00 00 FF = 255
00 00 01 00 = 256 (и 0 для первого байта!)
...
FF FF FF FF = -1 (или 4292967295 для беззнакового числа, или 255 для первого байта)
00 00 00 00 = 0
Как видно, первый байт всегда будет обнуляться при переполнении, если не берется во внимание остальные три байта 32-битной переменной.
есть ли разница между boolean и bool?
Vlad Cheater
да есть!
M V, какая?
Vlad Cheater
разница между bool и boolean - "ean"
M V логично
Vlad Cheater
сорри. приколося я. не знаю есть ли разница. По функциям по крайней мере одно и тоже. может быть что boolean это врэппэр класс от bool? 🙈
у меня не сохраняются команды на него
Педагог из Моиши, как пуля из, глины, на втором уроке навалил обрывки информации и надеется, что мы "поняли большую часть". Когда человек теряет понимание, ему становится не интересно. Другие серии получше, там меньше информации, и больше объяснения и примеров, и легче понять. Есть один парень который по неизвестным причинам забросил канал(Cool Easy Diy Electronic) и больше не обучает, но видео оставшиеся на канале, просто не имеют себе равных. Всё объяснение построено на аналогиях, и усваивается просто прекрасно.
Логически понятно что он делает и хочет получить. А вот что и от куда и почему так называется и зачем туда пишется нихрена не понятно.
Да этот заучка заграничный еще больше в тупик заведет чем научит начинающих. Гнать таких учителей нужно, их полные школы, потом дети уроки прогуливают т.к. не интересно и непонятно.
А не проще и понятнее следующее
int Led=13, Button=8;
boolean val = LOW, old_val = LOW, state = LOW;
void setup() {
pinMode(Led, OUTPUT);
pinMode(Button, INPUT);
}
void loop(){
val = digitalRead(Button);
delay(5);
if ((val == HIGH)&&(old_val == LOW))
{
state = !state;
}
digitalWrite(Led, state);
old_val = val;
}
Не могу разобраться,диод моргает сам по себе* на китайском * а кнопкой либо ВЫКЛ либо фиксируется в ВКЛ,как это работает
arduino.ru/Tutorial/DigitalPins
Почему 256 значений можно установить?
ограничение (8 бит)
@@abandoned7501 это получается что для любой регулировки чего либо доступно 255 значений?
В схемотехнике я нуль. Что-то не пойму, он второй резистор тоже на 10кОм втыкает? У меня что-то сколько ни жму, все одним цветом. Но на 6-й раз обнуляется и перестает светиться. Потом тоже одинаково
А, все, понял. analogWrite вместо digital не указал. Поставил на 10кОМ, работает, но бледно, правда
Поменял на 220 Ом, нормально
Объясните кто. Эту логику нужно понять или просто запомнить её как данность в этом месте кода? %%%
int может принимать любое значение??
Да что ты говоришь!
Программы на Питоне одобряют!
Все понятно, но усложнено сильно, зачему столько булов он использует?
boolean debounce( boolean last) ? что это за хрень не понятноя ????????????кто доступно сможет обьяснить?
Изучай азы программирования, никто тебе это не обьяснит в комментариях. Странно вообще браться за ардуино не зная основ программирования
функция, "устраняющая" дребезг контактов
Я не силен в программировании на С, но рискну предположить, что данная строка означает следующее:
- boolean - тип значения, которое должна вернуть функция (TRUE или FALSE)
- debounce - имя функции, имя может быть любым, какое Вам угодно, главное, чтоб латинскими буквами и начиналось с буквы
- last - имя переменной, которая передается внутрь функции при вызове этой самой функции, имя переменной так же может быть любым, как и имя функции.
- boolean (который перед last) - тип переменной
Если функция не должна возвращать ни чего, то перед названием функции пишем void, если что-то возвращает, то тип возвращаемого значения (int, boolean, или какой-то другой тип, которые используются в ардуино)
Если унифицировать данную строку, то получится так:
тип_возвращаемого_значения имя_функции(тип_переменной имя_переменной)
тут использован хереновый код. Если мы дополнительно добавим еще один светодиод в код, что бы он мигал, то программа перестает работать. Или любую другую задержку. Этот код сключительно только для мигания светодиода.
Alexandr Sergeevich спасибо большое.по началу тяжело бы ло понять логику самого алгоритма. Сильно запутана была
как Sr Android Developer скажу что этот Jeremy не умеет писать код - вообще! я плохо знаю схемотехнику (такие уж преподы в универе были) но эта серия пока помогает. Без боли смотреть как он кодит очень трудно :(
Если у него для антидребезга столько кода уходит, страшно подумать что там дальше за программы будут)
У меня светодиод не меняет цвет при нажатии кнопки, всегда горит одинаково. Хотя логика вроде правильная, так как когда нажимаешь 5 раз он гаснет. Кто то знает почему яркость не меняется?
Коля Васин не правильно написал, не меняет яркость
Коля Васин а от digital поміняв на analog в кінці відео, переглянь ...
в сетапе не хватает чего то. всю дорогу списываю профессионал по списыванию перепесал точь в точь не компелирует
Да точно для новичков котории до того нечего незнали и непонимали а щас вобще откинеца. По прошче чуваки по прошче.
Очень много булевых флагов. От половины можно было избавиться.
Как бы стоит понимать, что эти инструкции для людей, которые вообще не понимают в программировании.
Амперка, он говорит ДеБаунс, зачем вы переводите его ДеБаунс в свой ДеБоунс? :D Помогаете ему запутывать?
0:12 чаво каво как !? Всмысле шо за !? Ааааааа мои мозги …
Амперка, если вы сами будете делать обучение или уже сделали ОЧЕНЬ НУЖНО ЧТОБЫ СНАЧАЛА БЫЛ СДЕЛАН ГРАФИЧЕСКИЙ АЛГОРИТМ иначе голова пухнет от попытки понять, что пытается сделать лектор.
Мы только переводили эти уроки, поэтому менять видеоряд было несколько не в нашей компетенции. Но на будущее - учтём пожелание.
ОЗУ на Ардуине не гигабайты же, а он использует INT для диапазона 0-255. Понимаю, что для такого маленького скетча это не чувствительно, но давайте придерживаться хорошего стиля. char, где же ты?
Неужели нельзя просто поставить задержку?
)
Да, ваш код поприятнее и почище выглядит
Новичкам это не осилить Не знаю почему видео считается для начинающих. В первом видео ни слова, о том что надо знать язык программирования.
Дебаунсинг (устранение дребезга контактов) покрасивее дано в стандартных примерах. Смотрим ФАЙЛ - ПРИМЕРЫ - DIGITAL - DEBOUNCE
Джереми может и прошарен как программер, но как Учитель никакой.
Это точно, эту часть с дебонсом не понял =(
Офигенно поспал
Джереми, похоже сам с собой разговаривает и самому себе объясняет. Он в теме. И ему то понятно и получилось.
Ясно, что цель была потушить дребезг контакта кнопки и менять скважность сигнала ШИМ. Но вот как он это сделал, логика процесса, вообще не понятна. И слишком быстро. Что, куда, откуда, к чему, и почему?.. Короче, не совсем для начинающих.
это для новичков? интересно. это какой у них там уровень образования. откуда я должен знать про булеан функции? и т п
+Павел Иванов в школе про это говорят вроде. ну не про конкретно функции. А про булеву математику. Там както так вроде было. Да и если на информатике не в контру играли, то тоже мелькало. А если была контра, и Вам не было интересно про функции, может и сейчас Вам это не нужно?
+Павел Иванов мы сейчас проходим. 9 класс. Говорили, что boolean имеет 2 значения: 0 или 1. Ничего сложного
В принципе, информация действительно для новичков, и любой, знакомый с программированием "на уровне присваиваний", не встретит здесь ничего заумного. Но выцепить логику хода мыслей автора из плотной речи очень сложно. Хотя это простительно - далеко не каждый автор с глубокими техническими познаниями имеет ещё и хорошую педагогическую подготовку. Хорошо, хоть такой есть. А уж что кодинг кривой - так улавливаем суть сами и кодим лучше! У Джона Мортона в книжке по AVR ошибки специально наставлены. "Чтоб карась не дремал". Так что напрягаем мозги и - в путь!
Да херня это все.Там все понятно же.Код читаешь и все.
Что вообще в arduino забыли люди которые не знают
а) основ программирования
б)основ схемотехники?
Нет, не проще. Вы удалили часть его кода, но зачем-то оставили задержку 5мсек, после которой нет повторного считывания. Абсурд.
delay(1000); // задержка на дребезг контактов св.диода 1сек - нельзя вносить в цикл
кому интересно :
github.com/sciguy14/Exploring-Arduino?files=1
на гитхабе есть код
Да... Тяжелый случай. Реально, чем так учиться, то лучше пива выпить. Алекс Гивер намного понятнее всё дает.
Ну, почему абсурд? Достаточно всего лишь добавить одну строчку с этим самым недостающим повторным считыванием и приведённый Романом код станет вполне работоспособным.
Я вот тоже сижу и пытаюсь понять логику Джереми. Почему он написал код именно так, а не иначе.. Может потому что он мыслит, как электрик, а не программист..
ledlevel = (ledlevel + 51) % 255; // так лучше !
с кодом все понятно а вот в схеме я ничерта не понял.
А что имеенно осталось непонятным?
Друзья, я школьник в этом деле, не ругайте громко. Прошу помочь разобраться в этом коде:
boolean debounce(boolean last)
{
boolean current = digitalRead(switchPin);
if (last != current)
{
delay(5);
current = digitalRead(switchPin);
}
Он берет буля от debounce, которая внутри функции получает значение от last. Ниже идет сравнение last со значением на кнопке. Но мне не понятно, что на данный момент находится в last. Он ее определил, но нигде не указал, какое значение она имеет (low или hight). Или под last подразумевается lastButton? Спасибо
Максим Рыболовлев
На самом деле если ты не разбираешься, что происходит в этих строчках, я бы посоветовал заняться программированием хотя бы на начинающем уровне пусть даже на Turbo Pascal. Потому что это только самое начало для Arduino и дальше будет только сложнее.
Ну а вообще я тебе попробую объяснить, здесь создается функция, которая должна возвращать логическое значение (истина или ложь) после своего выполнения. Для этого вначале перед названием функции debounce у тебя стоит boolean, дальше в скобках у тебя говорится, что передается внутрь функции (boolean last). Т.е. если ты дальше в программе будешь вызывать эту функцию по имени, ты должен будешь в скобках передать логическую переменную, а внутри функции она будет называться last. Вот отсюда у тебя и берется last внутри функции.
Переменная current как раз возвращает значение. Т.е. строка current = digitalRead(switchPin); Говорит о том, что он получил логическое значение от кнопки нажата она сейчас или отжата.
Сама функция вызывается через имя, т.е. дальше по коду в строке
currentButton = debounce(lastButton);
Поскольку мы передаем в функцию переменную lastButton, то она внутри функции превращается в переменную last. А так как функция возвращает значение через переменную current, то это значение сохраняется currentButton, потому что использовался знак присвоения = .
ЗЫ Мне кажется я еще больше вас запутал, потому что такие вещи должны объясняться поэтапно :) , а не таким валом и с такой скоростью как это делает автор.
нет не запутал, спасибо большое, более чем ясно)
+Максим Рыболовлев Last это значение, которое ты передаешь , когда объявляешь функцию. В коде ты передаешь lastButton , и оно превращается в Last
так lastButton передается в void loop после if (last !=current), а код вроде выполняется сверху вниз