Работа с кнопками. В помощь новичку.

mr.il
Offline
Зарегистрирован: 05.01.2013

Всем привет!

Народ, подскажите, лучше программно защищаться от дребезга или использовать кондер параллельно кнопке?

triada13
Offline
Зарегистрирован: 04.01.2013

Мое мнение, лучше сделать защиту от дребезга аппаратно, тогда для программы места больше будет.

mr.il
Offline
Зарегистрирован: 05.01.2013

Т.е. кондера параллельно кнопке достаточно? Или надо мастрячить как тут http://creatiff.realax.ru/?cat=spmikro&page=smikr23 ?

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Кондер рационален лишь в положительной логике.   Программная защита лучше всего. При том что я привел примеры программной защиты .

triada13
Offline
Зарегистрирован: 04.01.2013

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

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

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

А если куча кнопок - триггеры, обвязка.  Места на плате займут много и мороки прибавят.

mr.il
Offline
Зарегистрирован: 05.01.2013

Народ, привет!

Всё же, разъясните, для аппаратного подавления дребезга какую схему применять?

nik
Offline
Зарегистрирован: 02.05.2013

Всем привет!
изучая arduino наткнулся на проблему "дребезга кнопки". Написал не большой sketch на две тактовые кнопки и две led. Впрочем посмотрите здесь пожалуйста:

int flag=0;

int pin1=22;
int pin2=25;
int led1=28;
int led2=30;


void setup()
{
  pinMode(22,INPUT);
  pinMode(25,INPUT); 
  pinMode(28,OUTPUT);
  pinMode(30,OUTPUT);
}
void loop()
{
  if (digitalRead(22)==HIGH&&flag==0) 
  {
   digitalWrite(28,!digitalRead(28));
   flag=1;
  }
  
  if (digitalRead(22)==LOW&&flag==1)
  {
   flag=0;                                
  }
  
  
  if (digitalRead(25)==HIGH&&flag==0)
  {
   digitalWrite(30,!digitalRead(30));
   flag=2;
  }
  
  if (digitalRead(25)==LOW&&flag==2)                                       
  {
   flag=0;                                
  }
} 

На второй кнопке при быстрой перемене "включил-выключил" заметны сбои. Может кто-нибудь сможет объяснить почему так происходит. Заранее спасибо.

maksim
Offline
Зарегистрирован: 12.02.2012

Почему происходит что? дребезг? 
Дребезг контактов

nik
Offline
Зарегистрирован: 02.05.2013

Да дребезг я так думаю. При быстрой перемене включения кнопки"pin2" второй светодиод даёт сбои. Но ведь этого не должно быть потому как я использовал переменную flag или всё таки нужно использовать функцию delay

maksim
Offline
Зарегистрирован: 12.02.2012

В вашем примере нет антидребезга, delay() как один из вариантов устранения дребезга, посмотрите стандартный пример Debounce.

Snubist
Offline
Зарегистрирован: 18.02.2013

переменная flag не спасает от дребезга.

olegab
Offline
Зарегистрирован: 09.04.2013

nik пишет:

Всем привет!
изучая arduino наткнулся на проблему "дребезга кнопки". Написал не большой sketch на две тактовые кнопки и две led. Впрочем посмотрите здесь пожалуйста:

На второй кнопке при быстрой перемене "включил-выключил" заметны сбои. Может кто-нибудь сможет объяснить почему так происходит. Заранее спасибо.

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

примерно так нужно сделать:


#define DELAY_MS 50;

unsigned long ignoreInputs[2]={0,0};
int pin[2][2]={{22,25},{28,30}};


void setup()
{
  pinMode(pin[0][0],INPUT);
  pinMode(pin[0][1],INPUT); 
  pinMode(pin[1][0],OUTPUT);
  pinMode(pin[1][1],OUTPUT);
}
void loop()
{
  if (digitalRead(pin[0][0])==HIGH&& !ignoreInputs[0]) 
  {
   digitalWrite(pin[1][0],!digitalRead(pin[1][0]));
    ignoreInputs[0]=millis()+DELAY_MS;
  }
  if (digitalRead(pin[0][1])==HIGH&& !ignoreInputs[1]) 
  {
   digitalWrite(pin[1][1],!digitalRead(pin[1][1]));
    ignoreInputs[1]=millis()+DELAY_MS;
  }
  if(ignoreInputs[0]>=millis())ignoreInputs[0]=0;
  if(ignoreInputs[1]>=millis())ignoreInputs[1]=0;
  
} 

 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

flag не дает полной защиты от дребезга. Он нужен для того чтобы действие запрограмированое на нажатие кнопки не повторялось при удержании кнопки. 

Для защиты от дребезга введите временную задержку delay(10); или millis();.

nik
Offline
Зарегистрирован: 02.05.2013

Благодарю за  многочисленную помощь. А вот ещё кое-что сам нашёл, работает безукоризненно. Только надо библиотеку "Bounce" в ардуино импортировать. Вот новый скетч:

#include <Bounce.h>
#define BUTTON1 45
#define BUTTON2 47
#define LED1 41
#define LED2 43

int ledValue1 = LOW;
int ledValue2 = LOW;


Bounce bouncer1 = Bounce( BUTTON1, 45);
Bounce bouncer2 = Bounce( BUTTON2, 47);

void setup() {
  pinMode(BUTTON1,INPUT);
  pinMode(BUTTON2,INPUT);
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
}

void loop() {

   if ( bouncer1.update() ) {
     if ( bouncer1.read() == HIGH) {
       if ( ledValue1 == LOW ) {
         ledValue1 = HIGH;
       } else {
         ledValue1 = LOW;
       }
       digitalWrite(LED1,ledValue1);
     }
   }
   
   if ( bouncer2.update() ) {
     if ( bouncer2.read() == HIGH) {
       if ( ledValue2 == LOW ) {
         ledValue2 = HIGH;
       } else {
         ledValue2 = LOW;
       }
       digitalWrite(LED2,ledValue2);
     }
   }
   
}

 

the_wall
Offline
Зарегистрирован: 06.06.2013

Всем привет.

Имеется Arduino Uno R3, программы компелирую и гружу через Arduino 1.5.2

Вопрос. Почему фунция setup у меня вызывается постоянно?

Вот код примера

#include <LiquidCrystal.h>
LiquidCrystal lcd(10, 11, 5, 4, 3, 2);

const int buttonPin = 9; // номер входа, подключенный к кнопке

int buttonState = 0; // переменная для хранения состояния кнопки

void setup()
{
pinMode(buttonPin, INPUT);

}

void loop()
{
buttonState = digitalRead(buttonPin);

if (buttonState == LOW) {
lcd.begin(16, 2);
lcd.print("hello, world!");
}
else {
lcd.begin(16, 2);
lcd.print("hello, world33333!");
}

}

 

Т.е. на экране у меня через раные промежутки времени происходит как бы перезагрузка.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Возможно кнопка подключена неправильно (БЕЗ ПОДТЯЖКИ).

Так же нужно использовать оператор lcd.clear(); иначе у вас постоянно будут выводиться ваши 33333.

leshak
Offline
Зарегистрирован: 29.09.2011

the_wall пишет:

Вопрос. Почему фунция setup у меня вызывается постоянно?

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

the_wall пишет:

Т.е. на экране у меня через раные промежутки времени происходит как бы перезагрузка.

Перезагрузка может происходит по железным причинами (плохой кабель, глючный USB порт, где-то что-то коротит, слишком большая нагрузка), так и по софтовым (например у вас висит какая-то софтина, которая постоянно открывает COM-порт, а это вызывает ребут дуины). Или сами открывает сериал монитор и вызываете "перезагрузку".

 

the_wall
Offline
Зарегистрирован: 06.06.2013

Спасибо за ответы.

Даже если тупо вывести один текст, без кнопок, т.е. так

#include <LiquidCrystal.h>

LiquidCrystal lcd(10, 11, 5, 4, 3, 2);

void setup()
{
/* Инициализируем дисплей: 2 строки по 16 символов */
lcd.begin(16, 2);
/* Выводим на дисплей традиционную фразу (: */
lcd.print("hello, world!");
}

void loop()
{

}

То на экране через равне промежутки времени после "!" появляется типа курсор, который заполняет оставшиеся 3 клетки до конца строки. А так же начинает моргать тестовый диод. Хотя на его порт я ничего не подаю.

Если дописать так

 

void loop()
{
lcd.setCursor(0, 1);
/* Выводим на дисплей число секунд, прошедших с момента старта Arduino */
lcd.print(millis() / 1000);
}

 

То получается каждые 3 секнду обновляется экран и отсчет идет заново

Snubist
Offline
Зарегистрирован: 18.02.2013

Попробуй повесь пин ресет на +5в через резистор на 120 ом. И посмотри будет перезагружаться или нет

the_wall
Offline
Зарегистрирован: 06.06.2013

Snubist пишет:

Попробуй повесь пин ресет на +5в через резистор на 120 ом. И посмотри будет перезагружаться или нет

попробовал, ничего не меняется. 

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

 

Может проблема с самим ардуино?

Snubist
Offline
Зарегистрирован: 18.02.2013

the_wall пишет:

Может проблема с самим ардуино?

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

vasjn23
Offline
Зарегистрирован: 14.05.2013

Всем здравствстовать!

Я тут решил сделать себе однокнопочный диммер ( на звонковой кнопке без фиксации = тактовая кнопка) и завис на определении длительности кнопки. Я накидал скетч и он в принципе работает, но как обычно естьнесколько "НО":

int regim=1; 
int flag=0; 
int ledPin=9;
int swich=7;
int led=0;
int vall


void setup()   
{ 
  pinMode(ledPin, OUTPUT);
  pinMode(swich, INPUT_PULLUP);

} 

void loop() 

{ 

  if(digitalRead(swich)==LOW&&flag==0)//если кнопка нажата   
    // и перемення flag равна 0 , то ... 
  { 
    regim++;   
    flag=1; 

    //это нужно для того что бы с каждым нажатием кнопки 
    //происходило только одно действие 
    // плюс защита от "дребезга"  100% 

    if(regim>3)//ограничим количество режимов 
    { 
      regim=1;//так как мы используем только одну кнопку, 
      // то переключать режимы будем циклично 
    } 

  } 

  if(digitalRead(swich)==HIGH&&flag==1)//если кнопка НЕ нажата 
    //и переменная flag равна - 1 ,то ... 
  { 

    flag=0;//обнуляем переменную "knopka" 
  } 



  if(regim==1)//первый режим 
  { 
    if(digitalRead(swich)==LOW);
    led++;
    if (led >= 255) led=255;


  } 
  if(regim==2)//второй режим 
  { 
    if(digitalRead(swich)==LOW);
    led--;
    if (led<=10) led=0;

  } 
  if(digitalRead(swich)==LOW)
  { 
    analogWrite(ledPin, led);
    delay(30); 
  }

} 

По сути работа получается следующая

При коротком нажатии на кнопку - включается светодиод в минимальной яркости (диммер у меня на 12 вольт для СД ленты). При удержании кнопки - яркость растет до максимальной. При сделующейм нажатии с удержанием - яркость плавно снижается до "0". Если оставить како-то минимальный предел яркости, отпустив кнопку - допустим при 30% от общей - то 3-е нажатие (короткое или длинное без разницы) - отключит в "0". Если нажимать кнопку коротко - то включается светодиод на минимальной яркости, следующее нажатие включает на миксимальной яркости, третье нажатие гасит в "0". Собственно хочу получить немного другие характеристики:

при первом включении удержанием кнопки выстявляем яркость. Допустим 50%. При вртором нажатии и удержании с 50% двигаемся к "0". При следующем коротком нажатии на кнопку яркость плавно возрастает до предыдущего значения (50%). При последующем коротком нажатии яркость с предыдущего значения (50%) плавно уходит в "0". Понимаю, что где-то должен сохранять значения приращения переменной led, но сколько не преборал - она становиться константой, и регулировки не происходит. Как быть? 

Deuce
Offline
Зарегистрирован: 20.08.2013

Доброго всем дня. впервые столкнулся с ардуиной. думал, что смогу сам разобраться, но то ли мозгов не хватает, то ли программер из меня никакой. обращаюсь к знатокам: кто может написать код? я готов оплатить работу по его написанию. собственно нужно: две кнопки с общей массой. нужно что бы при однократном нажатии на каджую из кнопок подавался импульс на (как пример) контакт 1 и 2 (каждая из кнопок управляет "своим" контактом), а при удержании подавались импульсы по 0,5 секунды на контакты 3 и 4 соответственно. поясню: это управление громкостью и переключением треков на магнитоле двумя кнопками. короткое нажатие листание треков вперед и назад, а удержание - увеличение и уменьшение громкости. если кто может помочь - буду премного благодарен.

и есть ещё теоретический вопрос: у меня ардуино уно. я хочу на нем реализовать вышеуказанный функционал и, так как я ещё и экран прикупил, хочу вывести на экран температуру воздуха и вольтаж бортовой сети. вопрос: получится ли реализовать все эти три функции одновременно, на одном ардуино?

leshak
Offline
Зарегистрирован: 29.09.2011

Deuce пишет:

обращаюсь к знатокам: кто может написать код? я готов оплатить работу по его написанию.

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

Deuce пишет:

и есть ещё теоретический вопрос: у меня ардуино уно. я хочу на нем реализовать вышеуказанный функционал и, так как я ещё и экран прикупил, хочу вывести на экран температуру воздуха и вольтаж бортовой сети. вопрос: получится ли реализовать все эти три функции одновременно, на одном ардуино?

Да.

Deuce
Offline
Зарегистрирован: 20.08.2013

leshak...... благодарю.

sp34
Offline
Зарегистрирован: 05.03.2013
     if(sensor>=450&&sensor<=890&&key>85&&key<95)// - если нажата кнопка Up
     {
       val_Up++;// - прибавляем к переменной единицу при каждой смене цикла.
     }
     else// - если не нажата...
     {
       val_Up=0;// - приравниваем значение к нулю.
     }
     if(val_Up>=10&&sensor>=450&&sensor<=890) // - если достигаем значения 10 циклов или более то ...
     {
       flag_Auto_Up=0;// - выкл авто режима Up
       flag_Auto_Down=0;// - выкл авто режима Down
       digitalWrite(11,HIGH);// - двигатель UP
       digitalWrite(12,LOW);
       Serial.print(" Up ");
       val_Up=0; // - присваиваем ноль для следующих нажатий
     }
 
     // - лимит верхний
     if(sensor>=891&&sensor<=1024&&key>85&&key<95)
     {
       digitalWrite(11,LOW);// - стоп
       digitalWrite(12,LOW);// - стоп
     }

Ребята ! подскажите , не нашел похожих примеров в поисковике .

Имеем вот такой кусок кода , работает он так - при удержании аналоговой кнопки в течении 10 циклов LOOP включается двигатель и вращается пока не отпустим кноку.

Хотелось-бы добавить в этот код не используя delay и библиотек servo такую функцию как "микро шаг" данного двигателя при кратковременном нажатии на эту же кнопку ( до 10 циклолв LOOP ) и получить такой алгоритм:

Удерживаем кнопку более 2-х циклов но до 10-и - код отработает digitalWrite(11,HIGH) на периуд (микро шаг) который я ему задам - допустим 0.5сек и встанет до следуещего нажатия кнопки на периуд не более 10 циклов , если удерживать более 10 циклов исполняется код указанный выше .

 

demon969
Offline
Зарегистрирован: 24.04.2012

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

// плюс защита от "дребезга" 100% - почему?

digitalWrite(13,!digitalRead(13));
       flag=1;
        //это нужно для того что бы с каждым нажатием кнопки
        //происходило только одно действие
        // плюс защита от "дребезга"  100%

         

 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Инвертация состояния выхода это просто действие. Вместо него может быть все что угодно. В примерах я инвертирую состояние светодиода (вкл или выкл) просто для наглядности. С фильтрацией дребезга кнопки это никик не связано (за исключением приведенной вами переменной flag).

maksim
Offline
Зарегистрирован: 12.02.2012

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

demon969
Offline
Зарегистрирован: 24.04.2012

Эту тему я прочитал всю, но не смог понять как помогает от дребезга?

digitalWrite(13,!digitalRead(13));
       flag=1;

 

maksim
Offline
Зарегистрирован: 12.02.2012

Никак это от дребезга не помогает

Что не ясно из этой фразы?

demon969
Offline
Зарегистрирован: 24.04.2012

Спокойнее.

Вот как написал создатель поста

digitalWrite(13,!digitalRead(13));
       flag=1;
        //это нужно для того что бы с каждым нажатием кнопки
        //происходило только одно действие
        // плюс защита от "дребезга"  100%

Я про переменную flag вообще то имел ввиду в последнем посте своем.

maksim
Offline
Зарегистрирован: 12.02.2012

Я спокоен, вы поконкретнее вопросы задавайте, а не один и тот же вопрос.

flag-  это флаг, к устранению дребезга тоже имеет косвенное отношение, я бы даже сказал - никакого.

У автора 100%ного антидребезга последний отсутствует по причине этого куска:

if(digitalRead(swich)==LOW)
  { 
    analogWrite(ledPin, led);
    delay(30); 
  }

а именно - по причине задержки.

demon969
Offline
Зарегистрирован: 24.04.2012

Вот и про тоже. собрал схемку, попробывал пример в котором этот кусок кода приведен, с коментариями про 100% отсутствие дребезга, но дребезг присутствует, вот и все. Ок я все понял, спасибо.

Илья73
Offline
Зарегистрирован: 06.09.2013

Помогите разобраться.Все работает вроде нормально, но не до конца :)

Есть кнопка и светодиод.При нажатии на кнопку загорается светодиод на 10 пине и начинает работать сенсор света на реле, реле на 8 пине.Кнопка и сенсор считывается аналоговыми входами.При повторном нажатии на кнопку светодиод гаснет, и отключается сенсор света – не реагирует.

 Таким образом имеем простой выключатель сенсора света с индикацией на светодиод.Но проблема в том что когда темно и реле HIGH (включено) нажатием на кнопку реле не отключается. А отключается только когда станет светло.

Или я не в том направлении двигаюсь?

#define ePin 10  // желый светодиод
 int knop=0;     //кнопка
 int x =0;       
 int sensor=0;   // свето сенсор
 #define rPin 8  // реле 
void setup()
 {
  pinMode(ePin,1);
  pinMode(rPin,1); 
 }
void loop()
{
  sensor=analogRead(1);
  knop = analogRead(0);
  if(knop>675&&knop<690&&x==0)
  {  
    digitalWrite(10,!digitalRead(10));
    x=1;
  }
    if(knop<675&&x==1)
  {
     x=0; 
  }
   if(sensor<500&&digitalRead(10)==1)digitalWrite(8,1);
   else if (sensor>550)digitalWrite(8,0);
   delay(10);
}

 

maksim
Offline
Зарегистрирован: 12.02.2012
   if(sensor<500||digitalRead(10)==1)digitalWrite(8,1);
   else if (sensor>550||digitalRead(10)==0)digitalWrite(8,0);

 

Илья73
Offline
Зарегистрирован: 06.09.2013

maksim спасибо. Но к сожалению при таком варианте при нажатии кнопки включается светодиод и реле вместе, и при повторном нажатии ни как не реагирует вообще(

 

maksim
Offline
Зарегистрирован: 12.02.2012

Так вы опишите алгоритм работы - что хотите.

Илья73
Offline
Зарегистрирован: 06.09.2013

Нажали кнопку  - включили сенсор. О  том что активен сенсор сигнализирует светодиод.

Нажали кнопку еще раз - отключили сенсор. Диод погас.

Все работает, но при активном сенсоре когда сработало реле на свет и в этот момент нажать на кнопку что бы отключить сенсор, диод гаснет а реле продолжает держать. пока снова не подам свет.

А хотелось бы что бы отрубалось как "рубильником"

maksim
Offline
Зарегистрирован: 12.02.2012
if(digitalRead(10)==1)
{
  if(sensor<500)digitalWrite(8,1);
  else if (sensor>550)digitalWrite(8,0);
}
else digitalWrite(8,0);

 

Илья73
Offline
Зарегистрирован: 06.09.2013

Код работает точно так же как который я выложил сначала, но проблема не решилась.

При затемненном сенсоре отключение кнопкой не работает, пока не подам свет.  Я над этим вчера весь вечер сидел, менял значения и так и по всякому.... Так и не решил проблему, возможно нужно как то изменить сектор кнопки, может какую перменную ввести в кнопку чтобы читать её уже в сенсоре. Посижу еще попробую разные варианты...

maksim
Offline
Зарегистрирован: 12.02.2012

Что у вас за реле? Модуль реле с инвертированным входом? О таких вещах надо писать в первую очередь.

if(digitalRead(10)==1)
{
  if(sensor<500)digitalWrite(8,1);
  else if (sensor>550)digitalWrite(8,0);
}
else digitalWrite(8,1);

 

Илья73
Offline
Зарегистрирован: 06.09.2013

модуль с тремя ногами (реле, диод, транзистор с резистором и светодиод)...., сейчас поставлю вместо реле светик.

Поставил светодиод, реагирует точно так же как и реле.

Вставил ваш код, поставил реле обратно. При загрузке просто включилось реле и кнопка глючить стала  :) значит не инвертирован

maksim
Offline
Зарегистрирован: 12.02.2012

Тогда с примером из #144 поста все должно работать, если на 10 выводе логический 0 то и на 8 выводе будет тоже 0.

Илья73
Offline
Зарегистрирован: 06.09.2013

Кстати вот так все работает отлично!

Но!  тогда отсутствует переход от (зуммерения) Логики вообще не могу понять - почему?

#define ePin 10  // желый светодиод
 int knop=0;     //кнопка
 int x =0;       
 int sensor=0;   // свето сенсор
 #define rPin 8  // реле 
void setup()
 {
  pinMode(ePin,1);
  pinMode(rPin,1); 
 }
void loop()
{
  sensor=analogRead(1);
  knop = analogRead(0);
  if(knop>675&&knop<690&&x==0)
  {  
    digitalWrite(10,!digitalRead(10));
    x=1;
  }
    if(knop<675&&x==1)
  {
     x=0; 
  }
    if(sensor<500&&digitalRead(10)==1)digitalWrite(8,1);
    else  digitalWrite(8,0);

   delay(10);
}

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

Не стабильно работает... Буду искать другой подход.

Илья73
Offline
Зарегистрирован: 06.09.2013

Максим, все заработало правильно как в посте 144. Сегодня все разобрал и собрал заново. Или проводки на макетке не контачили  или мой мозг к вечеру перегрелся. Скорее второе )

Спасибо)

leshak
Offline
Зарегистрирован: 29.09.2011

По поводу аналоговых кнопок награфоманил в блоге

Леший в мире Ардуины: Читаем аналоговые кнопки. Часть 1

Раздел "железная составляющая" - в принципе описывает то же самое что и nestandart в сообщении #1 . Причем, как мне кажется у него более внятно "разжеванно". Но может и мое кто-нибудь поймет :).

Остальное - альтернатива подходу приведенному maksim в сообщении #5 .

Главное отличие - я старался "спрятать" различие в работе с цифровыми и "аналоговыми кнопками". Что-бы базовые примеры из стартового поста было попроще адаптировать под аналоговые кнопки. Или "смешивать" в одном скетче аналоговые и цифровые кнопки.

Ну и, с таким подходом, мне кажется можно будет и одновременное нажатие нескольких кнопок ловить.  Просто намерять какое значение дает комбинация и объявить ее "еще одним псевдо-цифровым пином".

 

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

Интересно и доходчиво. Уверен что многим пригодится. Жду библиотеку по кнопкам!

jane Jack
Offline
Зарегистрирован: 08.10.2013

Здрасти всем. На днях приобрел атот чудо контролер и пока пытаюсь разобраться с языком. помогите пожалуста прикрутить кнопочку к моему железу

#define led 12


// переменная, которая будет содержать символ, полученный через последовательный порт
int ricevuto = ' '; 

void setup() {
   Serial.begin(9600);     // открывает последовательный порт на скорости 9600 бит / с
   pinMode(led, OUTPUT);  // определяет pin на которой подключен led как выход
  }

void loop() {
   if (Serial.available() > 0) { // если последовательный буфер содержит данные
      ricevuto = Serial.read(); // присваиваем переменной значение из буфера последовательного порта
      switch (ricevuto){  
         case '0':
            digitalWrite(led,LOW); // если я получаю 0 выключить светодиод led
            Serial.print(0);
            break;
         case '1':
            digitalWrite(led,HIGH); // если я получаю 1 включить светодиод led
            Serial.print(1);
            break;
        
       }}}

и вот эта кнопочка:

#define led 12

void setup() 
{

pinMode(12,OUTPUT);//конфигурируем пин как выход ( к нему подключен светодиод)
digitalWrite(31,HIGH);//включаем внутренний pull-up резистор
}

void loop() 
{
  
  
    digitalWrite(12,!digitalRead(31));//устанавливаем значение выхода 12 противоположное 
   //входу 31 . Т.е. когда на входе LOW (есть сигнал) на выходу устанавливаем HIGH
 
  
 
}

Все исходники и моя пока в черновом варианте красяфка" окно интерфейса" лежат в архиве здесь:http://yadi.sk/d/u4-U-r0dAg5Yz