Кнопки к аналоговому входу А7 (нано)
- Войдите на сайт для отправки комментариев
Ср, 10/04/2019 - 14:55
Был в теме про кнопки, от туда выгнали сюда, хотя там вопросы и ответы не только про кнопки, ну да ладно, попробуем здесь. В той теме про кнопки мне несколько раз тыкали что про аналоговый вход и кнопки там всё прописано (но видно старость не радость как говорится) я то что нужно не нашёл. Для управления реле одной кнопкой нужен такой код чтобы при нажатии реле вкл., а при повторном- откл. В наличии есть только А6 и А7 пины на Arduino NANO, все цифровые заняты. Возможно в принципе подключить кнопки к таким пинам?
резистором 10КОм к плюсу подтянуть
1
if
(analogRead(A6) < 500) {
2
// кнопка нажата
3
}
Для одной кнопки аналоговый вход не нужен))
#
Флаг неправильно обрабатываете. Вот Вы в 24 строке флаг подняли и тут же в 28 строке его сбросили. Конечно от него никакого толку.
#
Был в теме про кнопки, от туда выгнали сюда, хотя там вопросы и ответы не только про кнопки, ну да ладно, попробуем здесь. В той теме про кнопки мне несколько раз тыкали что про аналоговый вход и кнопки там всё прописано (но видно старость не радость как говорится) я то что нужно не нашёл. Для управления реле одной кнопкой нужен такой код чтобы при нажатии реле вкл., а при повторном- откл. В наличии есть только А6 и А7 пины на Arduino NANO, все цифровые заняты. Возможно в принципе подключить кнопки к таким пинам?
Вы можете доказать, что про аналоговые кнопки там написано не все? Попробуйте.
Там нет вашего случая, но к кнопке это уже не относится. В тот момент, когда вы зафиксировали ее четкое значение, работа с кнопкой закончена, а начинается работа с этим значением. Именно поэтому та тема и закрыта, т.к. приходящие, подобно вам не понимают разницы, а действуют по принципу, если на чем то есть кнопка и что то не ладится, надо писать в тему про кнопки.
По делу - заведите еще одну переменную, oldButton и приравнивайте ее значение вновь полученному когда они различаются, и тогда же производите все нужные действия. Пока они равны, не делаете ничего. ИМХО.
P/S Как то так:
01
void
setup
() {
02
// put your setup code here, to run once:
03
04
}
05
06
void
loop
() {
07
08
static
byte
oldButton = 0;
09
static
byte
button = 0;
10
button = key();
11
//Функция key() должна возвращать от 0 до сколько опознать сумеете
12
//0 - все отпущены
13
if
(oldButton != button) {
14
oldButton = button;
15
switch
(button) {
16
case
0:
17
break
;
18
case
1:
19
digitalWrite(pin, !digitalRead(pin));
20
break
;
21
case
2.. на сколько кнопок надо
22
}
23
}
24
}
25
//И не нужно мульена флагов и леса ифов.
Спасибо за подсказку,и всё же не работает, когда кнопка не нажата сериал монитор нет ни чего и это хорошо, но когда нажимаешь 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 беретесь, если у вас даже с копками и светодиодами проблема?
001
#include <SPI.h>
002
#include <Ethernet.h>
003
#include <PubSubClient.h>
004
005
int
Relay1 = 2;
006
int
Relay2 = 3;
007
008
int
Relay1set = LOW;
009
int
Relay2set = LOW;
010
011
//---------------Buttons set------------------------------------
012
#define NUM_KEYS 2
013
int
adc_key_val[NUM_KEYS] = {30, 200};
014
int
flag1=0;
015
int
flag2=0;
016
//-------------NETWORK--------------------------------------------------------------------------------------------------------
017
byte
mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE };
018
IPAddress ip(192,168,1,61);
019
byte
server[] = { 192, 168, 1, 140 };
020
021
void
callback(
char
* topic,
byte
* payload, unsigned
int
length) {
022
023
char
receivedChar = (
char
)payload[0];
024
025
Serial
.print(
" Message arrived ["
);
026
Serial
.print(topic);
027
Serial
.print(
"]"
);
028
Serial
.print(
" => "
);
029
Serial
.println(receivedChar);
030
031
// Set specific virtual switches on basis of specific incoming messages -
032
033
if
((String(topic)==
"PowerPanel/Relay1"
)&&(receivedChar ==
'1'
)) {
034
Relay1set = HIGH;
035
}
036
if
((String(topic)==
"PowerPanel/Relay1"
)&&(receivedChar ==
'0'
)) {
037
Relay1set = LOW;
038
}
039
if
((String(topic)==
"PowerPanel/Relay2"
)&&(receivedChar ==
'1'
)) {
040
Relay2set = HIGH;
041
}
042
if
((String(topic)==
"PowerPanel/Relay2"
)&&(receivedChar ==
'0'
)) {
043
Relay2set = LOW;
044
}
045
046
// Set digital pin states according to virtual switch settings
047
048
digitalWrite(Relay1,Relay1set);
049
digitalWrite(Relay2,Relay2set);
050
}
051
EthernetClient ethClient;
052
PubSubClient client(server, 1883, callback, ethClient);
053
void
reconnect(){
054
055
// Loop until we're reconnected
056
while
(!client.connected()) {
057
Serial
.println(
" Attempting MQTT connection..."
);
058
// Attempt to connect
059
if
(client.connect(
"arduinoPowerPanel"
)) {
060
Serial
.println(
"connected"
);
061
}
else
{
062
Serial
.print(
"failed, rc="
);
063
Serial
.print(client.state());
064
Serial
.println(
" try again in 5 seconds"
);
065
delay(5000);
066
}
067
}
068
}
069
070
void
setup
(){
071
//
072
Serial
.begin(9600);
073
pinMode(2, OUTPUT);
074
pinMode(3, OUTPUT);
075
Ethernet.begin(mac);
076
//
077
pinMode(Relay1, OUTPUT);
078
pinMode(Relay2, OUTPUT);
079
080
//
081
if
(client.connect(
"arduinoPowerPanel"
)) {
082
Serial
.println(
"connected"
);
083
//client.subscribe("Relay");
084
client.publish(
"PowerPanel/Relay1"
,
'1'
);
085
client.subscribe(
"PowerPanel/Relay1"
);
086
client.publish(
"PowerPanel/Relay2"
,
'1'
);
087
client.subscribe(
"PowerPanel/Relay2"
);
088
}
089
}
090
void
loop
(){
091
//----------------------------------------------
092
int
key = get_key(A7);
093
if
(key)
Serial
.println(key, DEC);
094
095
//--- button 1 ---------
096
097
if
(key==1 &&flag1==0)
098
{
099
digitalWrite(Relay1,!digitalRead(Relay1));
100
client.publish(
"PowerPanel/Relay1"
,
"1"
);
101
flag1=1;
102
}
103
if
(key==0 &&flag1==1)
104
{
105
flag1=0;
106
client.publish(
"PowerPanel/Relay1"
,
"0"
);
107
}
108
//--- button 2 ---------
109
110
if
(key==2 &&flag2==0)
111
{
112
digitalWrite(Relay2,!digitalRead(Relay2));
113
client.publish(
"PowerPanel/Relay2"
,
"1"
);
114
flag2=1;
115
}
116
if
(key==0 &&flag1==1)
117
{
118
Flag2=0;
119
client.publish(
"PowerPanel/Relay2"
,
"0"
);
120
}
121
//------------------------------------------------
122
if
(!client.connected()) {
123
reconnect();
124
}
125
client.
loop
();
126
}
127
byte
get_key(
int
key_pin)
128
{
129
if
(analogRead(key_pin) < adc_key_val[NUM_KEYS-1])
130
{
131
byte
k[3];
132
for
(
byte
i = 0; i < 3; i++)
133
{
134
delay(10);
135
k[i] = 0;
136
for
(
byte
j = 0; j < NUM_KEYS; j++)
137
{
138
if
(analogRead(key_pin) < adc_key_val[j])
139
{
140
k[i] = j + 1;
141
break
;
142
}
143
}
144
}
145
if
((k[0] > 0) && (k[0] == k[1]) && (k[0] == k[2]) && (k[1] == k[2]))
return
k[0];
146
}
147
return
0;
148
}
вот тут уменьшенный код на 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 без учета дребезга (код не компилировал, могут быть незначительные опечатки)
01
byte
butt;
02
byte
prev_butt;
03
int
x = analogRead(A7);
04
05
if
(x < 256) butt = 1;
06
else
if
(x < 512) butt =2;
07
else
if
(x < 768) butt =3;
08
else
butt = 4;
09
10
if
(butt != prev_butt) {
// если состояние кнопок изменилось
11
Serial
.print(butt);
// печатаем номер нажатой кнопки ОДИН РАЗ
12
prev_butt = butt;
// запоминаем новое состояние
13
}
там стандартная "коробочная" версия аналоговой клавиры нажал на например "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 минут до Петербурга.))))
Из серии "приезжайте к нам на Колыму").