Кнопки к аналоговому входу А7 (нано)

ewas
Offline
Зарегистрирован: 26.09.2016

Был в теме про кнопки, от туда выгнали сюда, хотя там вопросы и ответы не только про кнопки, ну да ладно, попробуем здесь. В той теме про кнопки мне несколько раз тыкали что про аналоговый вход и кнопки там всё прописано (но видно старость не радость как говорится) я то что нужно не нашёл. Для управления реле одной кнопкой нужен такой код чтобы при нажатии реле вкл., а при повторном- откл. В наличии есть только А6 и А7 пины на Arduino NANO, все цифровые заняты. Возможно в принципе подключить кнопки к таким пинам?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

резистором 10КОм к плюсу подтянуть

if (analogRead(A6) < 500) {
 // кнопка нажата
}

 

PRC
Offline
Зарегистрирован: 03.02.2019

Для одной кнопки аналоговый вход не нужен))

ewas
Offline
Зарегистрирован: 26.09.2016

#

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

Флаг неправильно обрабатываете. Вот Вы в 24 строке флаг подняли и тут же в 28 строке его сбросили. Конечно от него никакого толку.

 

ewas
Offline
Зарегистрирован: 26.09.2016

#

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

ewas пишет:

Был в теме про кнопки, от туда выгнали сюда, хотя там вопросы и ответы не только про кнопки, ну да ладно, попробуем здесь. В той теме про кнопки мне несколько раз тыкали что про аналоговый вход и кнопки там всё прописано (но видно старость не радость как говорится) я то что нужно не нашёл. Для управления реле одной кнопкой нужен такой код чтобы при нажатии реле вкл., а при повторном- откл. В наличии есть только А6 и А7 пины на Arduino NANO, все цифровые заняты. Возможно в принципе подключить кнопки к таким пинам?

Вы можете доказать, что про аналоговые кнопки там написано не все? Попробуйте.
Там нет вашего случая, но к кнопке это уже не относится. В тот момент, когда вы зафиксировали ее четкое значение, работа с кнопкой закончена, а начинается работа с этим значением. Именно поэтому та тема и закрыта, т.к. приходящие, подобно вам не понимают разницы, а действуют по принципу, если на чем то есть кнопка и что то не ладится, надо писать в тему про кнопки.
По делу - заведите еще одну переменную, oldButton и приравнивайте ее значение вновь полученному когда они различаются, и тогда же производите все нужные действия. Пока они равны, не делаете ничего. ИМХО.

P/S Как то так:

void setup() {
  // put your setup code here, to run once:

}

void loop() {

  static byte oldButton = 0;
  static byte button = 0;
  button = key();
  //Функция key() должна возвращать от 0 до сколько опознать сумеете
  //0 - все отпущены
  if (oldButton != button) {
    oldButton = button;
    switch (button) {
      case 0:
        break;
      case 1:
        digitalWrite(pin, !digitalRead(pin));
        break;
      case 2.. на сколько кнопок надо
    }
  }
}
//И не нужно мульена флагов и леса ифов.

 

ewas
Offline
Зарегистрирован: 26.09.2016

kalapanga пишет:
Флаг неправильно обрабатываете. Вот Вы в 24 строке флаг подняли и тут же в 28 строке его сбросили. Конечно от него никакого толку.

Спасибо за подсказку,и всё же не работает, когда кнопка не нажата сериал монитор нет ни чего и это хорошо, но когда нажимаешь 1, то пока нажата эта кнопка в сериал мониторе бежит 1, если 2 то двойка и это плохо.нужно чтобы это определилось только один раз. Нажал на 1 и отобразилась 1 один раз и всё

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

ewas пишет:

kalapanga пишет:
Флаг неправильно обрабатываете. Вот Вы в 24 строке флаг подняли и тут же в 28 строке его сбросили. Конечно от него никакого толку.

Спасибо за подсказку,и всё же не работает, когда кнопка не нажата сериал монитор нет ни чего и это хорошо, но когда нажимаешь 1, то пока нажата эта кнопка в сериал мониторе бежит 1, если 2 то двойка и это плохо.нужно чтобы это определилось только один раз. Нажал на 1 и отобразилась 1 один раз и всё

Приводите актуальный, реальный код, о котором речь.

strarbit
Offline
Зарегистрирован: 12.06.2016
ewas
Offline
Зарегистрирован: 26.09.2016


Схема ни чего не меняет, в самом коде проблемы

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

ewas пишет:
Схема ни чего не меняет, в самом коде проблемы

Ведь написал как сделать, в чем проблема?

strarbit
Offline
Зарегистрирован: 12.06.2016

Смотрите, ответ #6 на этот вопрос. from bwn 

ewas
Offline
Зарегистрирован: 26.09.2016

#

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

ewas, что написано, то программа и делает. В цикле loop в 16-й строке скетча черным по белому написано - Если кнопка нажата, то вывести код кнопки в сериал. Т.е. выводимая в сериал информация связана исключительно с состоянием кнопки. Если я правильно угадываю Ваши хотелки, то Вам надо вывод в сериал осуществлять после строк 23 и 35. И там выводить состояние соответствующих пинов. Тогда Вы будете получать сообщения именно о том, что такой-то пин включился или выключился.

ewas
Offline
Зарегистрирован: 26.09.2016

В том и дело что и напр. 23 строке "1" появляется с частотой исполнения кода и всё идёт по циклу, и если публиковать состояние в MQTT сервер, то это не работает, вернее криво работает, и dely тут не помощник.

//--- button 1 ---------

if (key==1 &&flag1==0)
{
digitalWrite(2,!digitalRead(2));
flag1=1;
client.publish("Relay_1","1");
}
if (key==0 &&flag1==1)
{
flag1=0;
client.publish("Relay_1","0");
}

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

ewas пишет:
В том и дело что и напр. 23 строке "1" появляется с частотой исполнения кода и всё идёт по циклу, и если публиковать состояние в MQTT сервер, то это не работает, вернее криво работает, и dely тут не помощник.

Не верю. Или Вы хотите сказать, что у Вас и реле на втором пине трещит как сумасшедшее? Ведь нет?

ewas
Offline
Зарегистрирован: 26.09.2016

#

sadman41
Offline
Зарегистрирован: 19.10.2016

У меня вот вопрос: почему вы сразу за MQTT беретесь, если у вас даже с копками и светодиодами проблема?

ewas
Offline
Зарегистрирован: 26.09.2016
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

int Relay1 = 2;
int Relay2 = 3;

int Relay1set = LOW;             
int Relay2set = LOW;

//---------------Buttons set------------------------------------
#define NUM_KEYS 2
int  adc_key_val[NUM_KEYS] = {30, 200};
int flag1=0;
int flag2=0;
//-------------NETWORK--------------------------------------------------------------------------------------------------------
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE };  
IPAddress ip(192,168,1,61);
byte server[] = { 192, 168, 1, 140 };

void callback(char* topic, byte* payload, unsigned int length) {

  char receivedChar = (char)payload[0];
   
  Serial.print("  Message arrived [");
  Serial.print(topic);
  Serial.print("]");
  Serial.print(" => ");
  Serial.println(receivedChar);

// Set specific virtual switches on basis of specific incoming messages -

 if ((String(topic)== "PowerPanel/Relay1")&&(receivedChar == '1')) {
    Relay1set = HIGH;
  }
  if ((String(topic)== "PowerPanel/Relay1")&&(receivedChar == '0')) {
    Relay1set = LOW;
  }
  if ((String(topic)== "PowerPanel/Relay2")&&(receivedChar == '1')) {
    Relay2set = HIGH;
  }
  if ((String(topic)== "PowerPanel/Relay2")&&(receivedChar == '0')) {
    Relay2set = LOW;
  }
  
  // Set digital pin states according to virtual switch settings
   
  digitalWrite(Relay1,Relay1set);
  digitalWrite(Relay2,Relay2set);
}
EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);
void reconnect(){

 // Loop until we're reconnected
  while (!client.connected()) {
    Serial.println(" Attempting MQTT connection...");
 // Attempt to connect
    if (client.connect("arduinoPowerPanel")) {
        Serial.println("connected");
        } else {
          Serial.print("failed, rc=");
          Serial.print(client.state());
          Serial.println(" try again in 5 seconds");
          delay(5000);
        }    
  }
}

void setup(){
  //
  Serial.begin(9600);
  pinMode(2, OUTPUT); 
  pinMode(3, OUTPUT);  
  Ethernet.begin(mac);
  //
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
  
  //
    if (client.connect("arduinoPowerPanel")) {           
    Serial.println("connected");
    //client.subscribe("Relay");
    client.publish("PowerPanel/Relay1", '1');
    client.subscribe("PowerPanel/Relay1");
    client.publish("PowerPanel/Relay2", '1');
    client.subscribe("PowerPanel/Relay2");
  }
}
void loop(){
//----------------------------------------------
  int key = get_key(A7);
  if(key) Serial.println(key, DEC);

//--- button 1 ---------

 if (key==1 &&flag1==0)        
     { 
       digitalWrite(Relay1,!digitalRead(Relay1));
       client.publish("PowerPanel/Relay1", "1"); 
       flag1=1; 
     }     
if (key==0 &&flag1==1)
      {  
        flag1=0;
       client.publish("PowerPanel/Relay1", "0");
      }
//--- button 2 ---------

 if (key==2 &&flag2==0)        
     { 
       digitalWrite(Relay2,!digitalRead(Relay2));
       client.publish("PowerPanel/Relay2", "1"); 
       flag2=1; 
     }     
if (key==0 &&flag1==1)
      {  
        Flag2=0;
       client.publish("PowerPanel/Relay2", "0");
      }
//------------------------------------------------  
   if (!client.connected()) {
       reconnect();
      }
  client.loop();  
}
byte get_key(int key_pin)
{
  if(analogRead(key_pin) < adc_key_val[NUM_KEYS-1])
  {
    byte k[3];
    for(byte i = 0; i < 3; i++)
    {
      delay(10);
      k[i] = 0;
      for(byte j = 0; j < NUM_KEYS; j++)
      { 
        if(analogRead(key_pin) < adc_key_val[j]) 
        {
          k[i] = j + 1;
          break;
        }
      }
    }
    if((k[0] > 0) && (k[0] == k[1]) && (k[0] == k[2]) && (k[1] == k[2])) return k[0];
  }
  return 0;
}

вот тут уменьшенный код на 2 реле (должно быть 16), и так же без опции вкл.все реле, откл. все реле

 

b707
Offline
Зарегистрирован: 26.05.2017

ewas пишет:
вот тут уменьшенный код на 2 реле (должно быть 16), и так же без опции вкл.все реле, откл. все реле

слушайте, оставьте вы MQTT . Пока не решите проблему, что у вас в Сериал мониторе "бежит единица" - о MQTT даже не заикайтесь.

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

b707 пишет:

слушайте, оставьте вы MQTT . Пока не решите проблему, что у вас в Сериал мониторе "бежит единица" - о MQTT даже не заикайтесь.

Не, мыши плакали, кололись, но продолжали жрать кактус.))))

ewas
Offline
Зарегистрирован: 26.09.2016

#

sadman41
Offline
Зарегистрирован: 19.10.2016

ewas, ответьте себе на два вопроса:

1) Как "на уровне" analogRead() определить, что нажата кнопка #3?
2) -"-"-"- отпущена кнопка #3?

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

sadman41 пишет:

ewas, ответьте себе на два вопроса:

1) Как "на уровне" analogRead() определить, что нажата кнопка #3?
2) -"-"-"- отпущена кнопка #3?

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

ewas
Offline
Зарегистрирован: 26.09.2016

#

sadman41
Offline
Зарегистрирован: 19.10.2016

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

ewas
Offline
Зарегистрирован: 26.09.2016

sadman41 пишет:

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

Да тут только подколы, приколы какие то не понятные реплики, я стараюсь задать вопрос, думал, что меня не понимают или я не ясно как-то выражаюсь. Ответили бы сразу нет решения или совсем не отвечали. Как и ваш вопрос про третью кнопку, да фиг с ней с этой третей если и одна не работает так как надо, люди не посмотрев и не осознав что предлагают, потом обижаются что я внимания не обращаю на их ответы и ссылки. Да я уже проверял и эти коды и у меня образцов всяких есть но такого случая не было и в интернете тоже не могу найти, вот и обратился , думал тут знают что-то использовали. Ну рас нет так будем другое решение искать.

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

ewas пишет:

Ну что делать, если вы услышать не желаете. Алгоритм "как", я вам дал еще в #6, добрая strarbit, нагуглила вам ссылку, в которой есть функция нажатия пяти аналоговых кнопок. Вы хоть попробовали? Или не сумели понять и решили, что все казлы?
Для 16 кнопок на аналоговом входе, предупреждаю сразу, придется поискать кнопки, обычный ширпотреб сильно шумит. Кстати, в ветке "Проекты" программку запостили, считать такие делители.
Вам дали удочку, наживку, речку показали, чего еще не хватает?

strarbit
Offline
Зарегистрирован: 12.06.2016

Dear Sir, bwn, Thank you!
Have a nice day! Good Luck!

ewas
Offline
Зарегистрирован: 26.09.2016

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

 

там стандартная "коробочная" версия аналоговой клавиры нажал на например "1" и побежали 111111111111111111111111111111111111...,

отпустил 000000000000000000000000000000000....,

нажал на "2" - 2222222222222222222222222.....

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Если бы не вставали в позу кактуса и ответили, чем отличается состояние аналоговых входов в положении "кнопка нажата" и "кнопка не нажата" , то, скорее всего, уже бы не искали никаких I2C на A6/A7.

strarbit
Offline
Зарегистрирован: 12.06.2016

I2C A6/A7 нет. вход ADC аналог.

strarbit
Offline
Зарегистрирован: 12.06.2016

sadman41 пишет:

...

чем отличается состояние аналоговых входов в положении "кнопка нажата" и "кнопка не нажата" , то, скорее всего, уже бы не искали никаких I2C на A6/A7.


значение разное  от ADC.

sadman41
Offline
Зарегистрирован: 19.10.2016

strarbit пишет:

значение разное  от ADC.

К топикстартеру понимание физического процесса должно придти. Иначе не решить ему задачи этой...

b707
Offline
Зарегистрирован: 26.05.2017

ewas пишет:

там стандартная "коробочная" версия аналоговой клавиры нажал на например "1" и побежали 111111111111111111111111111111111111...,

отпустил 000000000000000000000000000000000....,

Вы совсем идиот, что ли? Вам же выше дали пример с флагами , и который у вас успешно работал, давая одно значение на нажатие и одно на отпускание.  Более того, принцип избавления от "1111111" вообще не зависит от типа клавиатуры - аналоговая, цифровая. на I2c... да на чем угодно! И обсосан в инете сотни, тысячи раз! да и нафига тут вообще искать какие-то примеры для такой элементарной задачки? Главная идея - ловите изменение состояния, а не само состояние! Если было 0, а стало 1 - посылаете в порт "1" ТОЛЬКО ОДИН РАЗ. ИЕсли было 1, а стало 0 - шлете в порт "0". А пока у вас читается с кнопки "1111111" или "000000" - ничего не шлете. ВОТ И ВСЕ!

Что тут можно обсуждать на протяжении десятков страниц? Если вы этого не понимаете - забросьте ардуину, это не ваше.

b707
Offline
Зарегистрирован: 26.05.2017

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

ewas
Offline
Зарегистрирован: 26.09.2016

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

b707
Offline
Зарегистрирован: 26.05.2017

ewas пишет:
Да не понимаю, потому и обратился сюда. Задача оказалась не простая, что ловить и куда послать, и так понятно а как код нарисовать. .

Блин, ну что непонятного в том, что вам обьяснили выше? Прочитали значение с аналогового входа, определили по диапазону нажату кнопку, сравнили с результатом предыдущего чтения. Если такое же - ничего не делаем. если изменилось - выводим в Сериал. ВСЕ!!!!!!!

Вот вам для четырех кнопок на аналоговом входе А7 без учета дребезга (код не компилировал, могут быть незначительные опечатки)

 

byte butt;
byte prev_butt;
int x = analogRead(A7);

if (x < 256) butt = 1;
else if (x < 512) butt =2;
else if (x < 768) butt =3;
else  butt = 4;

if (butt != prev_butt) {  // если состояние кнопок изменилось
Serial.print(butt);       // печатаем номер нажатой кнопки ОДИН РАЗ
prev_butt = butt;       // запоминаем новое состояние
}

 

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

ewas пишет:

там стандартная "коробочная" версия аналоговой клавиры нажал на например "1" и побежали 111111111111111111111111111111111111...,

А взять "коробочную" и используя ее в качестве "key()", приделать к тому, что в #6? Не?

P/S Для дребезга, еще добавить три строчки и одну переменную.

sadman41
Offline
Зарегистрирован: 19.10.2016

Я смотрю - тут принудительное лечение началось. Этак и до карательного обучения программированию дойдёт...

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

Ну так очередной - "не форум, а тролльчатник". Достали пля. Башку включить не могут, а виноваты в этом все.((((

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

strarbit пишет:

Dear Sir, bwn, Thank you!
Have a nice day! Good Luck!

))))))). В гости, померзнуть, приезжайте. От меня 30 минут до Петербурга.))))

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

От меня до Петербурга 4000 км, но померзнуть тоже можно. Вот прям щас и можно

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

блин, в снежки играть можно.
а у нас всё растаяло......

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

У нас почти лето, днем +12-14, ночью положительная. Хотел вчера батрака нанять, а телефоны молчят, не прилетели еще.((((

strarbit
Offline
Зарегистрирован: 12.06.2016

bwn пишет:

strarbit пишет:

Dear Sir, bwn, Thank you!
Have a nice day! Good Luck!

))))))). В гости, померзнуть, приезжайте. От меня 30 минут до Петербурга.))))

Уважаемый господин bwn, Большое Спасибо/\ Извините, поздний ответ от меня.
Хорошее настроение  для Вас! Удачи! Я не могу кушать интернациональная кухня. Господин, пожалуйста, приезжайте к нам праздновать Songkran новый год. Я люблю новый год. Пожалуйста, приезжайте в наш маленький рай в мире.  Господин bwn удачи для Вас!
С наилучшими пожеланиями и Уважение искреннее.  
 

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

strarbit пишет:

bwn пишет:

strarbit пишет:

Dear Sir, bwn, Thank you!
Have a nice day! Good Luck!

))))))). В гости, померзнуть, приезжайте. От меня 30 минут до Петербурга.))))

Уважаемый господин bwn, Большое Спасибо/\ Извините, поздний ответ от меня.
Хорошее настроение  для Вас! Удачи! Я не могу кушать интернациональная кухня. Господин, пожалуйста, приезжайте к нам праздновать Songkran новый год. Я люблю новый год. Пожалуйста, приезжайте в наш маленький рай в мире.  Господин bwn удачи для Вас!
С наилучшими пожеланиями и Уважение искреннее.  

так вот кто оказывается господин )))
 

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

strarbit пишет:

Спасибо. Я пока невыездной. Хороших Вам праздников.)))))

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

bwn пишет:

strarbit пишет:

Dear Sir, bwn, Thank you!
Have a nice day! Good Luck!

))))))). В гости, померзнуть, приезжайте. От меня 30 минут до Петербурга.))))

Из серии "приезжайте к нам на Колыму").