Помогите с кодом

kioka
Offline
Зарегистрирован: 27.05.2019

Всем привет. Подскажите как изменить данный код. Нужно что бы при нажатии и удерживании button1 в течении 2 сек, загорался и горел STATE_LED3, при повторном нажатии и удерживании   button1,  STATE_LED3 должен отключиться.

#define STATE_LED1 3
#define STATE_LED2 4
#define STATE_LED3 2

int val = 0;
int button1 = 0;
int button2 = 0;
int button3 = 0;

void setup   (  ) 
{
    pinMode(STATE_LED1, OUTPUT);
    pinMode(STATE_LED2, OUTPUT);
    pinMode(STATE_LED3, OUTPUT);
}

void loop     (  ) 
{ val = analogRead(A3)>>2;
  
    if(val>212) button1=button2=button3=0;
    else {
   
        if(val>149) button3=1;
        else {
          
            if(val>115) button2=1;
            else button1=1; }
      
} 
 if(button2==1) digitalWrite(STATE_LED1,HIGH);
 else digitalWrite(STATE_LED1,LOW); 
 if(button3==1) digitalWrite(STATE_LED2,HIGH);
 else digitalWrite(STATE_LED2,LOW);
 if(button1==1) digitalWrite(STATE_LED3,HIGH);
 else digitalWrite(STATE_LED3,LOW); 
}

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

kioka пишет:

Подскажите как изменить данный код.

Очень просто - зайти в раздел "Ищу исполнителя", договориться о цене и тебе его изменят.

bwn
Offline
Зарегистрирован: 25.08.2014

kioka пишет:

Подскажите как изменить данный код. 

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

Читаем блинк без делей.

kioka
Offline
Зарегистрирован: 27.05.2019

Пытаюсь разобраться с азами. Начал с простого, пытаюсь сделать так что бы светодиод STATE_LED1 2, при нажатии  button2 загорался, а при повторномнажатии гас. Так вот он при первом нажатии он загараеться, но потом продолжает гореть, почему?

#define STATE_LED1 2
#define STATE_LED2 3
#define STATE_LED3 4

int val = 0;
int button1 = 0;
int button2 = 0;
int button3 = 0;


void setup(  ) 
{
    pinMode(STATE_LED1, OUTPUT);
    pinMode(STATE_LED2, OUTPUT);
    pinMode(STATE_LED3, OUTPUT);
}

void loop(  ) 
{
   button1=button2=button3=0;
   val = analogRead(A3)>>2;
  
    if(val>212) button1=button2=button3=0;
    else {
   
        if(val>149) button3=1;
        else {
          
            if(val>115) button2=1;
            else button1=1; }
      
} if(button2==1) digitalWrite(2, !digitalRead (2));
if(button3==1) digitalWrite(STATE_LED2,HIGH);
else digitalWrite(STATE_LED2,LOW);
if(button1==1) digitalWrite(STATE_LED3,HIGH);
else digitalWrite(STATE_LED3,LOW); }

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

kioka пишет:

почему?

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

ну, вот что у тебя написано в строках 23-30. Ты сам-то читал? Давай вместе почитаем.

Строка 23: если val > 212 то что-то сделать
Строка 24 "ИНАЧЕ", (т.е. в том случае, когда val <=122) сделать ...
Строка 25 если val > 149 то что-то сделать.

А теперь перечитай это внимательно. Бреда не видишь? В строку 25 мы попадаем ТОЛЬКО когд val<=122. А в ней проверяем а не больше ли она случайно, чем 149!

Т.е. выражение "button3=1;" из строки 25 будет выполнять в том случае, когда одновременно верно и то, что val<=122, и то, что val>149!!! Ты можешь сказать, при таком таком значенни val эти условия одномвременно будут верными? Хоть один пример привести можешь?

Дальше всё также точно ... сам разбирай.

kioka
Offline
Зарегистрирован: 27.05.2019

Так в чем ошибка? если val больше 212, но меньше 149, то button3=1. Я не спорю, может это бред, но в этой части он работает, и кнопки определяються верно. Проблема со светодиодом, или я что все же не понимаю?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

#########, как у тебя яблок может быть больше 5, но меньше 3. Это скока?

bwn
Offline
Зарегистрирован: 25.08.2014

kioka пишет:

Так в чем ошибка? если val больше 212, но меньше 149, то button3=1. Я не спорю, может это бред, но в этой части он работает, и кнопки определяються верно. Проблема со светодиодом, или я что все же не понимаю?

А нехер все в одну кучу наваливать. Примерно так:

byte key() {
  ........................
  if (val < 150) {return 1;}
  if (val < 200) {return 2;}
  --------------------
  --------------------
  return 0;
}

void loop {
  static byte oldButton = 0;
  byte button = key();
  if (oldButton != button) {
    oldButton = button;
  if (button == 1) {digitalWrite (LED1, !digitalRead(LED1);}
  if (button == 2) {digitalWrite (LED2, !digitalRead(LED2);}
  ........................
  .......................
  }
}

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Ворота пишет:

Строка 23: если val > 212 то что-то сделать

Строка 24 "ИНАЧЕ", (т.е. в том случае, когда val <=122) сделать ...
Строка 25 если val > 149 то что-то сделать.

Не 122, а 212 же.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:
... как у тебя яблок может быть больше 5, но меньше 3. Это скока?

семь, только они не его )))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

kioka пишет:

Так в чем ошибка? если val больше 212, но меньше 149

В том то и дело, что у тебя наоборот - меньше 212 и при этом больше 149 (смотри в код до тех пор пока не увидишь это!)

kioka пишет:

может это бред, но в этой части он работает

Или ты нам показал не тот код, который "работает", или твоё заявление о том, что он работает - тоже бред. Никакое число не может быть одновременно меньше 212 и больше 149. Никакое.

kioka пишет:

Проблема со светодиодом

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

kioka
Offline
Зарегистрирован: 27.05.2019

Про голову вы погорячились, особенно с такими расуждениями "Никакое число не может быть одновременно меньше 212 и больше 149. Никакое! Намекну к примеру 150 подходит

kioka
Offline
Зарегистрирован: 27.05.2019

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

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Блин, действительно, ьам же 212, а мне что-то 122 вклинилось. Это я идиот - признаю.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ворота пишет:

Блин, действительно, ьам же 212, а мне что-то 122 вклинилось. Это я идиот - признаю.


это не идиот, это полтинник разменял, психика перестраивает восприятие (думаю у Литвака читал, не уверен)

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Одно другому не мешает.

GVS
GVS аватар
Offline
Зарегистрирован: 26.04.2018

Извините за любопытство, а как понять строку

val = analogRead(A3)>>2;

Расшифруйте пожалуйста (((

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Считать значение c канала А3 АЦП сдвинув его на 2 бита вправо (то есть превратить 10 бит в 8 бит отбросив 2 младших бита) и поместить это в val

nik182
Offline
Зарегистрирован: 04.05.2015

Или поделить на 4. Из 1024 сделать 256. Один из способов уменьшить шум АЦП, если ненужна точность. 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

kioka, раз уж я облажался, давай я внимательнее посмотрю на твоё чудо.

Только уговор, девочек-гимназисток здесь нет (надеюсь, ты не девочка-гимназистка), потому не надувай губки и не обижайся на каждое слово. Будь поироничнее. Ну, проблемы с головой – что обидного-то? Если бы у тебя их не было, то код бы работал. Так что воспринимай всё адекватно и не дуйся.

Итак, если у тебя возникла проблема, то первое, что ты должен сделать (всегда, а не только в данном случае) – выбросить нахер из кода ВСЁ, что не имеет отношения к проблеме и отлаживать маленький код, показывающий проблему, а не портянку, в которой что только и на что только не влияет.

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

#define STATE_LED1 2

void setup(void) {
  pinMode(STATE_LED1, OUTPUT);
}

void loop(void) {
	const int val = analogRead(A3) >> 2;
	const bool button2 = val <= 212 && val > 115;
	if (button2) digitalWrite(STATE_LED1, !digitalRead (STATE_LED1));
}

Теперь смотри на этот код.

Твой loop будет выполняться примерно 10 тыс. раз в секунду. Стало быть, если ты нажал кнопку и держишь её, то светодиод будет переключаться туда-сюда с частотой примерно 10 кГц. При отпускании кнопки от останется в случайном состоянии, в зависимости от того, когда ты эту кнопку отпустил.

Это понятно?

По уму нужно помнить текущее состояние кнопки и инвертировать светодиод не когда она просто нажата, а когда её состояние сменилось с "не нажата" на "нажата".

Это первая часть марлезонского балета. Есть ещё и вторая, но давай сначала ты подтвердишь, что ты это понял.

GVS
GVS аватар
Offline
Зарегистрирован: 26.04.2018

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

val = analogRead(A3) >> 2

Я как то для определения времени нажатия кнопки привык пользоваться

pulseIn(Botton2,LOW) < 2000

Ну или отслеживанием millis() на изменение состояния входа...

bwn
Offline
Зарегистрирован: 25.08.2014

Ворота пишет:

Теперь смотри на этот код.

Твой loop будет выполняться примерно 10 тыс. раз в секунду. Стало быть, если ты нажал кнопку и держишь её, то светодиод будет переключаться туда-сюда с частотой примерно 10 кГц. При отпускании кнопки от останется в случайном состоянии, в зависимости от того, когда ты эту кнопку отпустил.

Это понятно?

По уму нужно помнить текущее состояние кнопки и инвертировать светодиод не когда она просто нажата, а когда её состояние сменилось с "не нажата" на "нажата".

Это первая часть марлезонского балета. Есть ещё и вторая, но давай сначала ты подтвердишь, что ты это понял.

Владимир, так я ему триггер еще в #8 написал. Ток он, походу, не читает.((((

kioka
Offline
Зарегистрирован: 27.05.2019

Ворота пишет:

Это первая часть марлезонского балета. Есть ещё и вторая, но давай сначала ты подтвердишь, что ты это понял.

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

kioka
Offline
Зарегистрирован: 27.05.2019

bwn пишет:

ак я ему триггер еще в #8 написал. Ток он, походу, не читает.((((

Читаю, но пока мало, что понимаю. Купил ардуино, вот теперь играюсь этой игрушкой. Результат не очень, скачивать готовые скетчи, не интересно, хочу хоть поверхностно уметь, что то понимать и изменять.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Хотел, и даже начал, писать очередную отповедь новичкам, на тему того, что Ардуино - игрушка для програмистов и первые шаги нужно делать на своем компе, читая КиР и программируя printf("Hello World!\n"); И не трахать мозги дурацкими вопросами.

Если последнее - всегда верно, то в первом я засомневался. А може и правильно, что многие чайники начинают интересоваться програмированием именно из-за Ардуино? В том смысле, что проводочки, диодики, моторчики и сенсоры - вот они - живые и интересные, а "Хелло Ворлд"  на экране - не так радует, как жужжащий насосик! ;)))

Короче я решил становиться добрее... может это просто похмелье? ;))

Green
Offline
Зарегистрирован: 01.10.2015

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

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

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

GVS
GVS аватар
Offline
Зарегистрирован: 26.04.2018

Ворота пишет:

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

Вона оно как!!! А я то уж изпереживался весь... Все думаю как он длительность нажатия в 2с на аналоговом входе ловит???

kioka
Offline
Зарегистрирован: 27.05.2019

Ворота пишет:

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

Именно так. Но резистивная схема, мне не важна. Это был какой то урок, а потом мне стало интересно эту схему изменить. Теперь вот задумался, может начать с Helo word! :)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

kioka пишет:

Теперь вот задумался, может начать с Helo word! :)

Если ты не шутишь, то и правда так надо. Есть полно онлайн ИДЕ, так что даже компилятор на комп не надо ставить. Скачай КиР, читай и решай примеры. Можно не до конца, первые главы хоть прочти и прорешай.

1. КиР - это "Язык програмирования С" Керниган и Ричи. Вот так и набирай в поиске. Есть в 100500 мест - честно, официвльно и без пиратства. Есть ссылка и на форуме - в первом сообщении "Песочницы".

2. Online IDE вот по этим словам и ищи. Их сотни. Выбери, что понравится.