Проблема с контактами

Chorus
Offline
Зарегистрирован: 31.07.2012

 

Chorus
Offline
Зарегистрирован: 31.07.2012

 

 добрый день. сегодня стал облалателем Arduino Uno.

при проверке на стандартном примере Button обнаружилась проблема. Насколько я понял, один конец кнопкт надо вставить в 5v, другой в пин 2. но светодиод горел весьма избирательно, зачастую всегда. горел даже если во 2 пин вставить кусок незамкнутой проволоки. причём начинал светить корректно только если взять в руки в определённом положении. примечательно то, что реагирует даже на приближение руки.

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

можете что-нибудь посоветовать

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

 Могу вам посоветовать подтягивающий резистор. Вот видео для ознакомления и еще советую посмотреть все серии этого канала.

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

 И еще воспользоваться поиском по сайту и найти например вот эту тему.

Chorus
Offline
Зарегистрирован: 31.07.2012

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

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

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

Иногда можно :)

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

Для этого нужно, пину "ВКЛЮЧЕННОМУ НА ВХОД" сделать digitalWrite(PIN,HIGH);

И вы получите пин подключенный к питанию через резистор. А кнопку, соотвественно, нужно будет подключать одной ногой к пину, другой - к земле. Ну и при чтении, в этом случае помнить что "кнопка инвертированна". То есть digitalRead==1 означает что кнопка не нажата, а 0 - нажата.

Но... осторожно. При таком подключении, если вы, случайно, перед digitalWrite(PIN,HIGH); включите пин на OUTPUT, а потом нажмете кнопку - получите короткое замыкание между питанием и землей. С некислыми шансами выпалить ногу или весь камень.

Chorus
Offline
Зарегистрирован: 31.07.2012

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

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

Chorus пишет:
правильно-ли я понимаю, что, при желании, на ардуине можно сделать прошивку для атмеги, а потом её вытащить и впаять в желаемую схему?

Правильно понимаете. Вообщем-то "ардуина" это и есть атмега с  выведеными ногами. Для удобного подключения без пайки. Но по "сути" атмега=ардуина. 

А можно "не вытаскивать". Пусть живет дуинка :)  Ардуино скетч можно залить и в "атмегу на схеме". даже не вынимая/выпаивая ее (ну естественно, если у нее выведены ноги для программирования наружу). Для этого нужен программатор. Прорамматор можно сделать из ардуины. Аж пять проводков потребуется для этого :) . Как это сделать - воспользуйтесь поиском по сайту (или гуглом) на слово ArduinoISP.

Chorus
Offline
Зарегистрирован: 31.07.2012

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

" "ардуина" это и есть атмега с выведеными ногами. Для удобного подключения без пайки. "
Тогда я вообще не вижу проблемы :)

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

Chorus пишет:
Ну, я всё-таки, рассматриваю ардуину, как инструмент для прототипирования. Сделать рабочий вариант на ней, а потом уже спаять его из деталей. Ардуина-то у меня одна.  

Я изучал ардуину точно таким-же путем :)

Но пройдя его задумался: нужно "хорошо посчитать". Возможно "отлаживать" удобно на той дуине что есть, а вот "конечный" по деньгам может получится дешевле и аккуратней если взять что-то типа Arduino Mini или Pro Mini.

Особенно если смотреть не на оригинал, а китайские или местные клоны. Все-таки "заводское изготовление". Да и если "посчитать" поездки на базар за "мелочевкой которой нет под рукой", количество сломаных сверл, переведенного текстолита (тоже с первой попытки же не получится), паяльного инструмента хорошего....

вообщем нужно очень внимательно считать "дешевле самому или купить". Даже если "купить" чуть дороже, то ... если делаешь "один девайс в месяц" - можно и выкинуть лишний доллар-два :)

А сдругой стороны потом показать кому-то устройство и сказать "я сам сделал его с нуля" - тоже много стоит :)

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

Chorus
Offline
Зарегистрирован: 31.07.2012

Я заказывал с ебея у китайского производителя, весьма дёшево и очень хорошего качества, но шло полтора месяца. Альтернатива - заказывать у российских распростронителей за цену в три раза больше и ждать почти столько же меня не устраивала, поскольку, даже не предполагал, чего можно от ардуино ждать. Вот почему и возникают мысли о самостоятельной сборке. Да и интересно всегда было самому что-то создавать.
Думаю, время и опыт расставит всё по своим местам. :-)

дух
Offline
Зарегистрирован: 17.09.2012

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

так вот. пытаюсь сделать один проект. подключаю кнопку, и все отлично работает. разумеется не забываю про подтягивающий резистор(или стягивающий? путаю пока).  стоит подключить вторую кнопку, даже с резистором в 10кОм они начинают обе дребезжать. отключаю одну(любую) вторая работает нормально. вместе не хотят. 

подскажите пожалуйста, что я делаю не правильно?

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

 1. Никому здесь не известно как вы подключаете кнопки. Опишите или лучше нарисуйте схему.
 2. Как вы определяете, что они дребезжат?
 3. Покажите свой код.

magelan6274
Offline
Зарегистрирован: 04.09.2012

maksim пишет:

 1. Никому здесь не известно как вы подключаете кнопки. Опишите или лучше нарисуйте схему.
 2. Как вы определяете, что они дребезжат?
 3. Покажите свой код.

Здесь всё объясняется досконально http://www.youtube.com/v/LkR8rxzAo_A

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

magelan6274 пишет:

maksim пишет:

 1. Никому здесь не известно как вы подключаете кнопки. Опишите или лучше нарисуйте схему.
 2. Как вы определяете, что они дребезжат?
 3. Покажите свой код.

Здесь всё объясняется досконально http://www.youtube.com/v/LkR8rxzAo_A

А мне то вы об этом зачем пишите??? Тем более что я эту ссылку давал выше...

дух
Offline
Зарегистрирован: 17.09.2012

maksim пишет:

 1. Никому здесь не известно как вы подключаете кнопки. Опишите или лучше нарисуйте схему.
 2. Как вы определяете, что они дребезжат?
 3. Покажите свой код.

1. подключал кнопки как в вышеуказанном видео

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

3. если очень необходимо, завтра вечером выложу.

 

спасибо.

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

 На всякий случай - вот так правильно нужно вставлять код.

дух
Offline
Зарегистрирован: 17.09.2012

 вот код как и обещал.

#include <LiquidCrystal.h>//библиотека для работы с LCD
long previousMillis = 0;//переменная для хранения значений таймера

int sek=0;//значение секунд
int minut=54;//значение минут
int chas=18;//значение часов
int knopka=0;//значение кнопки
int curs=0;//значение курсора

LiquidCrystal lcd(12, 10, 5, 4, 3, 2);//инициализация портов

void setup()
{

  lcd.begin(16, 2);//инициализация дисплея
  pinMode(8,INPUT);//инициализация портов
  pinMode(7,INPUT);//инициализация портов
  pinMode(9,OUTPUT);//инициализация портов
  pinMode(13,OUTPUT);
  //Serial.begin(9600);

}

void loop()


{
  //Serial.println(curs);
  //delay(500);
  if (millis() - previousMillis >500) 
  {  
    previousMillis = millis();  //запучкаем таймер
    digitalWrite(13, !digitalRead(13));//меняем значение порта каждые 0.5секунд




    if(digitalRead(13)==HIGH)//если 13 нога лог1 то...
    {
      sek++;//переменная секунда + 1
      lcd.clear(); //обновление дисплея




      //вывод символов на дисплей//
      lcd.setCursor(2, 0);
      lcd.print(":");//выводим символ ":"между часами и минутами
      lcd.setCursor(5, 0);
      lcd.print(":");//выводим символ ":"между  минутами и секундами
    }

    if(digitalRead(13)==LOW)
    {
      //через каждые 0.5 секунд меняем символ ":" на "."
      lcd.setCursor(5, 0);
      lcd.print(" ");
      lcd.setCursor(2, 0);
      lcd.print(" ");
    }

    if(sek>59)//если переменная секунда больше 59 ...
    {
      sek=0;//сбрасываем ее на 0
      minut++;//пишем +1 в переменную минута
    }


    if(minut>59)//если переменная минута больше 59 ...
    {
      minut=0;//сбрасываем ее на 0
      chas++;//пишем +1 в переменную час
    }




    if(chas>23)//если переменная час больше 23 ...
    {
      chas=0;//сбрасываем ее на 0

    }



    //вывод символов на дисплей//

    lcd.setCursor(0, 0);//выводим значение часов в строку - 1
    //столбец -4 
    if (chas < 10){
      lcd.print(" ");  
      lcd.print(chas);//количество часов
    }
    else lcd.print(chas);


    lcd.setCursor(3, 0);//выводим значение часов в строку - 1
    //столбец -7 
    if (minut < 10){
      lcd.print("0");  
      lcd.print(minut);//количество минут
    }
    else lcd.print(minut);

    lcd.setCursor(6, 0);//выводим значение часов в строку - 1
    //столбец -10 
    if (sek < 10){
      lcd.print("0");
      lcd.print(sek);//количество секунд
    }
    else lcd.print(sek);

  } 


  //установка времени//
  //кнопка//



  if(digitalRead(8)==HIGH&&knopka==0)//если кнопка нажата 
    // и перемення "knopka" равна 0 , то ...
  {
    minut++;//пишем + 1 в переменную минута
    sek=0;//пишем 0 в переменную секунда
    knopka++;//пишем 1 в переменную кнопка
    //это нужно для того что бы с каждым нажатием кнопки
    //происходило только одно действие
    // плюс защита от "дребезга"



    //с каждым нажатием кнопки обновляем значения на дисплее//
    lcd.setCursor(0, 0);
    lcd.print(chas);
    if(minut < 10){
      lcd.setCursor(4, 0);
      lcd.print(minut);
    }
    else {
      lcd.setCursor(3, 0);
      lcd.print(minut);
    }

    lcd.setCursor(6, 0);
    lcd.print(sek);
  }

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

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

  if(digitalRead(7)==HIGH)//если кнопка нажата 
    // и перемення "knopka" равна 0 , то ...
  {
    curs++;
    if (curs > 7){
      curs = 0;
    }  

  }

  if (curs = 1){
    lcd.setCursor(1,0);
    lcd.print(chas);
    delay(500);
    lcd.print(" ");
    lcd.print(" ");
    delay(500);
  } 

  /* 
   //выводим надпись "CHASI." в строку - 0 
   lcd.setCursor(5, 0);
   lcd.print("CHASI.");
   
   */
}


 

дух
Offline
Зарегистрирован: 17.09.2012

 исходник был взять здесь, и доработан маленько.

 

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

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

теперь я с помощью

Serial.println(curs);
delay(500);

отслеживаю нажатия кнопки. когда одна работает хватает однократного нажатия. при включении первой кнопки, они обе начинают "дребезжать". 

дух
Offline
Зарегистрирован: 17.09.2012

 вот, кстати, фото подключения

 

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

 Вы наверное так и не поняли понятие слова "дребезжать". Дребезг - это когда при одном нажатии на кнопку происходит несколько срабатываний. У вас же как я и предпологал понатыканы задержки (строки: 29, 167, 170). Уберите или сделайте меньше delay(), чтобы кноки работали нормально суммарно задержки не должны превышать 200 млс.

дух
Offline
Зарегистрирован: 17.09.2012

 возможно вы правы. нет.. скорее вы правы..

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

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

 ИЛи плохо видно или правый резистор у вас подключен одной ногой в землю, а другой "в космос". 

Если я прав, то правая кнопка у вас не имеет подтяжки, и "дребезжать" может даже от простого поднесения руки.

дух
Offline
Зарегистрирован: 17.09.2012

сорри за оффтоп. дабы не плодить темы. 

 

дух пишет:

 впоследствии хочу прикрутить вместо нее колесико)) пока не знаю как называется

наверное называется энкодер? (как ручка громкости на автомагнитоле.)

дух
Offline
Зарегистрирован: 17.09.2012

leshak пишет:

 ИЛи плохо видно или правый резистор у вас подключен одной ногой в землю, а другой "в космос". 

Если я прав, то правая кнопка у вас не имеет подтяжки, и "дребезжать" может даже от простого поднесения руки.

плохо видно. попробуйте посмотреть полноразмерное фото. там хоть и плохо очень, но видно))

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

leshak пишет:

 ИЛи плохо видно или правый резистор у вас подключен одной ногой в землю, а другой "в космос". 

Если я прав, то правая кнопка у вас не имеет подтяжки, и "дребезжать" может даже от простого поднесения руки.

Да, кстати, у вас резистор не туда воткнут.

Хотя да, просто плохо видно.

дух
Offline
Зарегистрирован: 17.09.2012

 вот другое фото

 

 

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

 

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

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

дух пишет:

leshak пишет:

 ИЛи плохо видно или правый резистор у вас подключен одной ногой в землю, а другой "в космос". 

Если я прав, то правая кнопка у вас не имеет подтяжки, и "дребезжать" может даже от простого поднесения руки.

плохо видно. попробуйте посмотреть полноразмерное фото. там хоть и плохо очень, но видно))

Посмотрел. На полноразмерной вижу то же самое. Но четче. Резистор воткнут в 59-тую колонку. А больше в ней ничего нет. То есть воткнут "в никуда". Предполагаю что вы промахнулись мимо 58-мой (туда куда синий провод идет).

 

дух
Offline
Зарегистрирован: 17.09.2012

maksim пишет:

 суммарно задержки не должны превышать 200 млс.

я так понимаю, имеются в виду задержки именно на нажатие кнопок? ведь я не могу уменьшить задержки на отображение цифр.

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

дух пишет:

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

Тоже разглядел. Тогда с этим все впорядке (если резисторы нормально воткнулись ;)  

 

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

 В строках 138-141 что-то "подозрительное". Перепроверте (а лучше обейте отступами что куда вкладывается, что-бы видней было). Возможно там или  138-мая лишняя, или вокруг 140-141 потеряли фигурные скобки.

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

дух пишет:

maksim пишет:

 суммарно задержки не должны превышать 200 млс.

я так понимаю, имеются в виду задержки именно на нажатие кнопок? ведь я не могу уменьшить задержки на отображение цифр.

Сумарно во всей функции loop().

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

leshak пишет:

 В строках 138-141 что-то "подозрительное". Перепроверте (а лучше обейте отступами что куда вкладывается, что-бы видней было). Возможно там или  138-мая лишняя, или вокруг 140-141 потеряли фигурные скобки.

Добавлю. Нажмите Ctrl+T и код отформатируется автоматически.

дух
Offline
Зарегистрирован: 17.09.2012

maksim пишет:

Сумарно во всей функции loop().

 

понял спасибо.

дух
Offline
Зарегистрирован: 17.09.2012

leshak пишет:

 В строках 138-141 что-то "подозрительное". Перепроверте (а лучше обейте отступами что куда вкладывается, что-бы видней было). Возможно там или  138-мая лишняя, или вокруг 140-141 потеряли фигурные скобки.

отредактировал в предыдущем сообщении. действительно наблюдался глюк)). спасибо.

дух
Offline
Зарегистрирован: 17.09.2012

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

 

дух
Offline
Зарегистрирован: 17.09.2012

 еще вопрос. 

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

magelan6274
Offline
Зарегистрирован: 04.09.2012

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

дух
Offline
Зарегистрирован: 17.09.2012

 еще вопрос.

все нажатия всех кнопок считаются. knopka1++, knopka2++ и т.д.

как проверить, что если на протяжении какого-то времени ни одна кнопка не нажималась, то все счетчики сбросить в ноль?

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

 Заводите глобальную переменную, например

unsigned long time_wait = millis();

Затем где-нибудь в loop:

if(digitalRead(7) || digitalRead(8)){
    time_wait = millis() + 500; // Здесь задаете время, которое нужно ждать
  }
  else if(millis() > time_wait){
    // Здесь делаете что вам нужно по прохождении времени.
  }

 

дух
Offline
Зарегистрирован: 17.09.2012

 спасибо.