Новичок, первый скетч,вопросы

ElectroMAN
Offline
Зарегистрирован: 14.09.2016

Доброго времени суток.

Весной узнал об ардуино..Очень заинтересовало.

Купил на АЛИ стартовый набор,изучаю...

Пытаюсь изобрести первый скетч.

Задача - при определенном количестве нажатий на кнопку включать сетодиод.

Скетч кое как "собрал" без ошибок ( Я про verify) Но он не работает.

Подскажите в чём проблема пожалуйста.

 

int switchPin = 10;
int  ledPin = 13;
int clicks = 0;

void setup() 
{                
  pinMode(switchPin, INPUT);
  pinMode(ledPin, OUTPUT);     
}

void loop() 
{
  if (digitalRead(switchPin) == HIGH)
  clicks == (clicks + 1);
  delay (50);
  if (clicks == 10)
  digitalWrite(ledPin, HIGH);
  delay(500);
  digitalWrite(switchPin, LOW);

}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

почитайте

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...

там по кнопкам много чего полезного узнаете

ElectroMAN
Offline
Зарегистрирован: 14.09.2016

читал, помогло кое в чём...

Но дальше дело не идёт

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

clicks = (clicks + 1);

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

clicks++;

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Jeka_M пишет:

clicks++;

и, как он с этого поймёт, где начудил?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Согласен, но он там много где начудил. Например забыл расставить фигурные скобки после if и обнулить clicks после потухания светодиода.

ElectroMAN, с таким кодом светодиод загорится только один раз на 0,5 сек после нажатия и удержания кнопки около 5 сек. Без удержания кнопки Вы не поймаете момент опроса кнопки контроллером. Потому что, когда выполняется delay() контроллер ничего не делает, опрос кнопки не происходит.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Jeka_M пишет:

Согласен, но он там много где начудил. Например забыл расставить фигурные скобки после if и обнулить clicks после потухания светодиода.

фигня - пусть ресетом тушит светодиод.

a5021
Offline
Зарегистрирован: 07.07.2013

Да ладно вам глумиться. Нет бы помочь.

Попробуйте прогнать вот этот код:

int switchPin = 10;
int ledPin = 13;
int clicks = 0;

void setup()
{                
  pinMode(switchPin, INPUT);
  pinMode(ledPin, OUTPUT);     
}

void loop()
{
  if (digitalRead(switchPin) == HIGH) { // после if лучше ставить фигурную скобку,
                                        // даже если в блоке будет только одно действие
                                        
    // clicks == (clicks + 1);          // двойное равно (==) применяется внутри if,
                                        // но не для операции присваивания.
                                        // круглые скобки в данном случае тоже не нужны.
                                        // в конечном итоге это действие может выглядеть так:
    // clicks = clicks + 1;
                                        // или так:
    // clicks++;                        // что одно и тоже
                                        // но лучше, если оно будет выглядеть так:
    if (++clicks == 10) {               // сначала clicks увеличивается на единицу,
                                        // а потом проверяется, равно ли оно 10
                                        // если равно, производим основное действо:
      digitalWrite(ledPin, HIGH);       // зажигаем диод
      delay(500);                       // светим 0.5с
      digitalWrite(ledPin, LOW);        // гасим диод.

                                        // в предыдущем коде, вместо гашения
                                        // почему-то опускали в LOW ногу с кнопкой

      clicks = 0;                       // обнуляем счетчик, иначе
                                        // после след. 10 нажатий
                                        // опять сюда не попадем

        
    }
    while (digitalRead(switchPin) != LOW) { // ждем отпускания кнопки
      // крутимся в пустом цикле,
      // пока кнопка не будет отжата.
      // если она была отжата в то время,
      // пока выполнялся delay(500) выше,
      // то цикл будет пропущен сходу
    }
    delay(30);                         // еще 30мс на антидребезг
  }
}

Я его не проверял, просто записал свои соображения в коментариях.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

a5021 пишет:

Да ладно вам глумиться. Нет бы помочь.

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

a5021 пишет:

Я его не проверял, просто записал свои соображения в коментариях.

а, его никто не будет проверять - пользоваться этим будет невозможно, делаи ТС выбесят.

*если желается хардкора без делаев и с аппаратным фильтром дребезга - ставим конденсатор 0.1 мкФ параллельно кнопке. вполне себе рабочая балалайка #61 - юзалась по всякому и сбоях замечена не была.

a5021
Offline
Зарегистрирован: 07.07.2013

Там тех дилеев и нет считай. Сложно представить, что оно кого-то может подвинуть к нервному припадку.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

a5021 пишет:

Там тех дилеев и нет считай. Сложно представить, что оно кого-то может подвинуть к нервному припадку.

то я невнимательно посмотрел - думал, что следующее нажатие через полсекунды

SmartRnd
Offline
Зарегистрирован: 13.09.2016

a5021 пишет:

Попробуйте прогнать вот этот код:

+1 к карме. Всё чётенько и понятно.

Даже не задумывался о существовании такой конструкции:

if (++clicks == 10) { 

Для начинающего проще

clicks = clicks + 1;
if (clicks == 10) {

 

a5021
Offline
Зарегистрирован: 07.07.2013

Клапауций 232 пишет:
если желается хардкора без делаев и с аппаратным фильтром дребезга - ставим конденсатор 0.1 мкФ параллельно кнопке. вполне себе рабочая балалайка #61 - юзалась по всякому и сбоях замечена не была.

Тоже, как с кнопкой повезет. Встречается такая трясучка, что и 0.1мкф не помогает. Лично мне нравится стопудовый алгоритм дибаунса из "Debouncing guide", где состояние кнопки тупо запихивается в переменную через сдвиг:

byte key_state = 0;
byte prev_key_state = 0;

...
// ==================================
key_state <<= 1;
If (Pin == HIGH) {
  if ((++key_state == 0xFF) && (prev_key_state != 0xFF)) {
    // кнопка нажата -- сюда попадаем только 1 раз 
  }
} else if ((key_state = 0) && (prev_key_state != 0)) {
    // кнопка отпущена -- сюда попадаем только 1 раз
  }
}
prev_key_state = key_state;
// ==================================

Блок отчеркнутый линиями выполняется с постоянной переодичностью, например по переполнению нулевого таймера. тогда восемь бит key_state станут иметь одинаковое значение только после того, как 8/490 секунд кнопка пребывает в одном и том же состоянии, т.е. дребезг прекратился 16мс тому назад.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

a5021 пишет:

Тоже, как с кнопкой повезет. Встречается такая трясучка, что и 0.1мкф не помогает.

ну, и какие проблемы? если у тебя не кнопка, а генератор шума, то ставь 10 мкФ. :D

a5021
Offline
Зарегистрирован: 07.07.2013

Да лучше сделать так, чтобы вообще никакой кондер был не нужен. Алгоритм приведенный выше это позволяет.

И прошу прощения, код в сообщении #13 содержит досадную опечатку (писал его прямо здесь)

строка 11 должна выглядеть так:

} else if ((key_state == 0) && (prev_key_state != 0)) {

В первом условии был пропущен "=".

ElectroMAN
Offline
Зарегистрирован: 14.09.2016

Ого.

Не ожидал такого кроличества помощи.

ВСЕМ спасибо, вечером опробую.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

a5021 пишет:

Да лучше сделать так, чтобы вообще никакой кондер был не нужен. Алгоритм приведенный выше это позволяет.

что позволяет? у тебя же кнопка шумит постоянно, а не 16мс, которые конденсатор 0,1 мкФ нормально фильтрует.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

SmartRnd пишет:

Даже не задумывался о существовании такой конструкции:

if (++clicks == 10) 

Чтобы не писать длинное clicks = clicks +1, придумали инкремент. Есть префиксная форма (++clicks) и постфиксная форма (clicks++). Ну и такой же декремент.

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

а еще перфиксный и постфиксный вариант работают по разному =)

if (++clicks == 10) <- 10 нажатий

if (clicks++ == 10) <- 11 нажатий

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Ну предполагалось, что интересующиеся сами почитают в чём между ними разница, поэтому не стал подробно расписывать. Даже в википедии всё написано.

ElectroMAN
Offline
Зарегистрирован: 14.09.2016

Код из сообщения №8 "прогнал"  на столе. Всё отлично работает. Спасибо

 

 

 

 

 

Теперь хочу внедрить ещё две кнопки, для регулировки времени включения сетодиода....

буду пробовавть сам.

ROTOR001
Offline
Зарегистрирован: 21.10.2016

Всем доброго дня, это мой первый опыт работы с Ардуино и задачу мне сразу глобальную поставили, хотя для кого то это мелочь

 

необходимо проектирование и
изготовление устройства на фотоэлементах, которое позволяет отсчитывать количество
прохождений "флажка".
Данное устройство будет использоваться в подъемнике для маломобильных групп
граждан.
На подъемном устройстве имеется 2 лебедки (суммарной мощностью около 1,5 кВт)
соединенные валом, устройство предполагается расположить между этими лебедками
таким образом, чтобы оно отсчитывало количество оборотов данного вала.
Грузоподъемность подъемника - 250 кг., скорость вращения вала около 1500 об/мин,
временной диапазон составляет около 2-х минут, таким образом речь об отсчете, примерно,
3000 оборотов.
Важная составляющая - наличие кнопки, задающей начальное значение (нулевое), т.е.
основа применения, состоит в том, чтобы в процессе эксплуатации подъемного
оборудования можно было в ручном режиме поднять (опустить) платформу до
определенной отметки, после чего задать нулевое значение устройства, после чего
изменить высоту (в большую или меньшую сторону) и так же зафиксировать параметр
(фактическое количество оборотов вала), после чего подъемник, при помощи данного
устройства должен осуществлять остановки на высотах, заданных в ручном режиме
(исходя из отсчитанного количества оборотов)
Я сразу решил заменить фотоэлемент на датчик Холла, в нашем радиомагазине нашёл датчик с цифровым выходом и на руках
подарок жены стартовый набор с ардуино Мега, схему электронику я соберу без проблем подскажите где найти скетч
для работы с таким датчиком холла

Araris
Offline
Зарегистрирован: 09.11.2012

ROTOR001 пишет:

подскажите где найти скетч для работы с таким датчиком холла

То есть Вы перерыли весь Интернет и так и не нашли ни одного примера работы Ардуино с датчиком Холла ?

Мне сложно в это поверить.

P.S. Респект и уважение Вашей жене.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Скорее ROTOR001 получил подготовку разведчика. Если даже его будут пытать об изделии ,которое он предложил , ничего не скажет. Потому что он представление не имеет как это устройство работает.

 Скорее мотором надо управлять, причем по часовой, против часовой и стоп. Так что надо два пина (Motop_plus_pin), (Motop_minus_pin). Так же 4 (четыре) кнопки . Первая ВВЕРХ (btm_Up_pin), вторая ВНИЗ(btm_DOWN_pin). Это если инвалид будет управлять платфомой. Верх - платформа поехала ввех, Вниз - платформа поехала вниз. Ну и конечно Кнопка фиксации позиции 1 верхнее положение и кнопка фиксации позиции 2 (нижнее положение). То есть нажимая и удерживая кнопку ПОЗИЦИЯ 1 или ПОЗИЦИЯ 2 кнопками ВВЕРХ и ВНИЗ можно установить нужную позицию положения. Вопрос в другом. Как не сделать верхнюю позицию внизу, и на оборот. Такой защиты от дурака. Или же та позиция что выше верхняя и подымать надо нажав ВВЕPX.

ПС: ROTOR001 не нашел, только потому что не знал что искать.

ROTOR001
Offline
Зарегистрирован: 21.10.2016

qwone пишет:

ПС: ROTOR001 не нашел, только потому что не знал что искать.

в точку по другому и не скажешь, это первый опыт работы с ардуино образование на уровне ламповых телевизоров, сейчас неплохо бы понять как ардуино обрабатывает еденичку с датчика хола и хотя бы заставить светить светодиод при поднесении магнита, что для этого прописывать

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

 Вы бы еще спросили, как работает микропереключатель. Датчик Хола это +5В, земля и сигнальный 0 или 1 . Подключаете к ардуине как кнопку.

http://amperka.ru/product/troyka-hall-sensor  там правда его как аналоговый подключили.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

ROTOR001 пишет:

сейчас неплохо бы понять как ардуино обрабатывает еденичку с датчика хола и хотя бы заставить светить светодиод при поднесении магнита, что для этого прописывать

Состояние пина считывается через digitalRead(). Дальше выполняем нужные действия по условию if(), if()..else

Единичка считывается как HIGH, ноль LOW.

ROTOR001
Offline
Зарегистрирован: 21.10.2016

Спасибо Жека М это то что я хотел услышать, буду сидеть учиться