Кнопки к аналоговому входу А7 (нано)
- Войдите на сайт для отправки комментариев
 
      Ср, 10/04/2019 - 14:55
          
      Был в теме про кнопки, от туда выгнали сюда, хотя там вопросы и ответы не только про кнопки, ну да ладно, попробуем здесь. В той теме про кнопки мне несколько раз тыкали что про аналоговый вход и кнопки там всё прописано (но видно старость не радость как говорится) я то что нужно не нашёл. Для управления реле одной кнопкой нужен такой код чтобы при нажатии реле вкл., а при повторном- откл. В наличии есть только А6 и А7 пины на Arduino NANO, все цифровые заняты. Возможно в принципе подключить кнопки к таким пинам?
          
резистором 10КОм к плюсу подтянуть
if (analogRead(A6) < 500) { // кнопка нажата }Для одной кнопки аналоговый вход не нужен))
#
Флаг неправильно обрабатываете. Вот Вы в 24 строке флаг подняли и тут же в 28 строке его сбросили. Конечно от него никакого толку.
#
Был в теме про кнопки, от туда выгнали сюда, хотя там вопросы и ответы не только про кнопки, ну да ладно, попробуем здесь. В той теме про кнопки мне несколько раз тыкали что про аналоговый вход и кнопки там всё прописано (но видно старость не радость как говорится) я то что нужно не нашёл. Для управления реле одной кнопкой нужен такой код чтобы при нажатии реле вкл., а при повторном- откл. В наличии есть только А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.. на сколько кнопок надо } } } //И не нужно мульена флагов и леса ифов.Спасибо за подсказку,и всё же не работает, когда кнопка не нажата сериал монитор нет ни чего и это хорошо, но когда нажимаешь 1, то пока нажата эта кнопка в сериал мониторе бежит 1, если 2 то двойка и это плохо.нужно чтобы это определилось только один раз. Нажал на 1 и отобразилась 1 один раз и всё
Спасибо за подсказку,и всё же не работает, когда кнопка не нажата сериал монитор нет ни чего и это хорошо, но когда нажимаешь 1, то пока нажата эта кнопка в сериал мониторе бежит 1, если 2 то двойка и это плохо.нужно чтобы это определилось только один раз. Нажал на 1 и отобразилась 1 один раз и всё
Приводите актуальный, реальный код, о котором речь.
ืืืnavernoe bydet xoroso polezno
https://robotdyn.com/button-keypad-4x4-module.html#custom-1
https://robotdyn.com/analog-out-adaptor-for-matrix-membrane-keypad.html#custom-1
ืืืnavernoe bydet xoroso polezno
https://robotdyn.com/button-keypad-4x4-module.html#custom-1
https://robotdyn.com/analog-out-adaptor-for-matrix-membrane-keypad.html#custom-1
Схема ни чего не меняет, в самом коде проблемы
Ведь написал как сделать, в чем проблема?
Смотрите, ответ #6 на этот вопрос. from bwn
#
https://www.elecrow.com/wiki/index.php?title=LCD_Keypad_Shield
ewas, что написано, то программа и делает. В цикле loop в 16-й строке скетча черным по белому написано - Если кнопка нажата, то вывести код кнопки в сериал. Т.е. выводимая в сериал информация связана исключительно с состоянием кнопки. Если я правильно угадываю Ваши хотелки, то Вам надо вывод в сериал осуществлять после строк 23 и 35. И там выводить состояние соответствующих пинов. Тогда Вы будете получать сообщения именно о том, что такой-то пин включился или выключился.
В том и дело что и напр. 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");
}
Не верю. Или Вы хотите сказать, что у Вас и реле на втором пине трещит как сумасшедшее? Ведь нет?
#
У меня вот вопрос: почему вы сразу за MQTT беретесь, если у вас даже с копками и светодиодами проблема?
#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), и так же без опции вкл.все реле, откл. все реле
слушайте, оставьте вы MQTT . Пока не решите проблему, что у вас в Сериал мониторе "бежит единица" - о MQTT даже не заикайтесь.
слушайте, оставьте вы MQTT . Пока не решите проблему, что у вас в Сериал мониторе "бежит единица" - о MQTT даже не заикайтесь.
Не, мыши плакали, кололись, но продолжали жрать кактус.))))
#
ewas, ответьте себе на два вопроса:
1) Как "на уровне" analogRead() определить, что нажата кнопка #3?
2) -"-"-"- отпущена кнопка #3?
ewas, ответьте себе на два вопроса:
1) Как "на уровне" analogRead() определить, что нажата кнопка #3?
2) -"-"-"- отпущена кнопка #3?
Ему, добрая девочка Роза, уже и ссылку нагуглила, но нет, будем свои флаги поглаживать.))))
#
Ну, если вы хотите отшучиваться про третью кнопку, бредить про два устройства, то я пас - ищите других помощников.
Ну, если вы хотите отшучиваться про третью кнопку, бредить про два устройства, то я пас - ищите других помощников.
Да тут только подколы, приколы какие то не понятные реплики, я стараюсь задать вопрос, думал, что меня не понимают или я не ясно как-то выражаюсь. Ответили бы сразу нет решения или совсем не отвечали. Как и ваш вопрос про третью кнопку, да фиг с ней с этой третей если и одна не работает так как надо, люди не посмотрев и не осознав что предлагают, потом обижаются что я внимания не обращаю на их ответы и ссылки. Да я уже проверял и эти коды и у меня образцов всяких есть но такого случая не было и в интернете тоже не могу найти, вот и обратился , думал тут знают что-то использовали. Ну рас нет так будем другое решение искать.
Ну что делать, если вы услышать не желаете. Алгоритм "как", я вам дал еще в #6, добрая strarbit, нагуглила вам ссылку, в которой есть функция нажатия пяти аналоговых кнопок. Вы хоть попробовали? Или не сумели понять и решили, что все казлы?
Для 16 кнопок на аналоговом входе, предупреждаю сразу, придется поискать кнопки, обычный ширпотреб сильно шумит. Кстати, в ветке "Проекты" программку запостили, считать такие делители.
Вам дали удочку, наживку, речку показали, чего еще не хватает?
Dear Sir, bwn, Thank you!
Have a nice day! Good Luck!
"добрая strarbit, нагуглила вам ссылку, в которой есть функция нажатия пяти аналоговых кнопок. Вы хоть попробовали? "
там стандартная "коробочная" версия аналоговой клавиры нажал на например "1" и побежали 111111111111111111111111111111111111...,
отпустил 000000000000000000000000000000000....,
нажал на "2" - 2222222222222222222222222.....
Может быть не там ищу решения, можно клавиатуру по I2C но она не работает на А6 и А7 пинах, основной код надо как-то переделать, что бы он не публиковал состояние с разу.
Если бы не вставали в позу кактуса и ответили, чем отличается состояние аналоговых входов в положении "кнопка нажата" и "кнопка не нажата" , то, скорее всего, уже бы не искали никаких I2C на A6/A7.
I2C A6/A7 нет. вход ADC аналог.
...
чем отличается состояние аналоговых входов в положении "кнопка нажата" и "кнопка не нажата" , то, скорее всего, уже бы не искали никаких I2C на A6/A7.
значение разное от ADC.
значение разное от ADC.
К топикстартеру понимание физического процесса должно придти. Иначе не решить ему задачи этой...
там стандартная "коробочная" версия аналоговой клавиры нажал на например "1" и побежали 111111111111111111111111111111111111...,
отпустил 000000000000000000000000000000000....,
Вы совсем идиот, что ли? Вам же выше дали пример с флагами , и который у вас успешно работал, давая одно значение на нажатие и одно на отпускание. Более того, принцип избавления от "1111111" вообще не зависит от типа клавиатуры - аналоговая, цифровая. на I2c... да на чем угодно! И обсосан в инете сотни, тысячи раз! да и нафига тут вообще искать какие-то примеры для такой элементарной задачки? Главная идея - ловите изменение состояния, а не само состояние! Если было 0, а стало 1 - посылаете в порт "1" ТОЛЬКО ОДИН РАЗ. ИЕсли было 1, а стало 0 - шлете в порт "0". А пока у вас читается с кнопки "1111111" или "000000" - ничего не шлете. ВОТ И ВСЕ!
Что тут можно обсуждать на протяжении десятков страниц? Если вы этого не понимаете - забросьте ардуину, это не ваше.
коллеги, по-моему это просто толстый троллинг, а вы ведетесь. Человеку уже по три раза все обьяснили, а он ни сном ни духом.
Да не понимаю, потому и обратился сюда. Задача оказалась не простая, что ловить и куда послать, и так понятно а как код нарисовать. Я не знаю и простите если это посчитали за тролинг.
И успехов вам.
Блин, ну что непонятного в том, что вам обьяснили выше? Прочитали значение с аналогового входа, определили по диапазону нажату кнопку, сравнили с результатом предыдущего чтения. Если такое же - ничего не делаем. если изменилось - выводим в Сериал. ВСЕ!!!!!!!
Вот вам для четырех кнопок на аналоговом входе А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; // запоминаем новое состояние }там стандартная "коробочная" версия аналоговой клавиры нажал на например "1" и побежали 111111111111111111111111111111111111...,
А взять "коробочную" и используя ее в качестве "key()", приделать к тому, что в #6? Не?
P/S Для дребезга, еще добавить три строчки и одну переменную.
Я смотрю - тут принудительное лечение началось. Этак и до карательного обучения программированию дойдёт...
Ну так очередной - "не форум, а тролльчатник". Достали пля. Башку включить не могут, а виноваты в этом все.((((
Dear Sir, bwn, Thank you!
Have a nice day! Good Luck!
))))))). В гости, померзнуть, приезжайте. От меня 30 минут до Петербурга.))))
От меня до Петербурга 4000 км, но померзнуть тоже можно. Вот прям щас и можно
блин, в снежки играть можно.
а у нас всё растаяло......
У нас почти лето, днем +12-14, ночью положительная. Хотел вчера батрака нанять, а телефоны молчят, не прилетели еще.((((
Dear Sir, bwn, Thank you!
Have a nice day! Good Luck!
))))))). В гости, померзнуть, приезжайте. От меня 30 минут до Петербурга.))))
Уважаемый господин bwn, Большое Спасибо/\ Извините, поздний ответ от меня.
Хорошее настроение для Вас! Удачи! Я не могу кушать интернациональная кухня. Господин, пожалуйста, приезжайте к нам праздновать Songkran новый год. Я люблю новый год. Пожалуйста, приезжайте в наш маленький рай в мире. Господин bwn удачи для Вас!
С наилучшими пожеланиями и Уважение искреннее.
Dear Sir, bwn, Thank you!
Have a nice day! Good Luck!
))))))). В гости, померзнуть, приезжайте. От меня 30 минут до Петербурга.))))
Уважаемый господин bwn, Большое Спасибо/\ Извините, поздний ответ от меня.
Хорошее настроение для Вас! Удачи! Я не могу кушать интернациональная кухня. Господин, пожалуйста, приезжайте к нам праздновать Songkran новый год. Я люблю новый год. Пожалуйста, приезжайте в наш маленький рай в мире. Господин bwn удачи для Вас!
С наилучшими пожеланиями и Уважение искреннее.
так вот кто оказывается господин )))
Спасибо. Я пока невыездной. Хороших Вам праздников.)))))
Dear Sir, bwn, Thank you!
Have a nice day! Good Luck!
))))))). В гости, померзнуть, приезжайте. От меня 30 минут до Петербурга.))))
Из серии "приезжайте к нам на Колыму").