Нужна помшь в написании прграммы
- Войдите на сайт для отправки комментариев
Пнд, 29/12/2014 - 10:03
Здравствуете ребят помогите пожалуйста с написанием кода программы требуется чтоб при нажатии на тактовую кнопку от одного до пяти раз активировался один выход ардуины при нажатии от 5 до 10 раз другой с отключением предыдущего но а свыше 10 раз все выхода отключались и еше важно чтоб спустя минуту количество нажатии обнулялось, хочу с телефона упровлять обогревом на даче
Здравствуете ребят помогите пожалуйста с написанием кода программы требуется чтоб при нажатии на тактовую кнопку от одного до пяти раз активировался один выход ардуины при нажатии от 5 до 10 раз другой с отключением предыдущего но а свыше 10 раз все выхода отключались и еше важно чтоб спустя минуту количество нажатии обнулялось, хочу с телефона упровлять обогревом на даче
Так все таки от тактовой или с телефона?
Здравствуете ребят помогите пожалуйста с написанием кода программы требуется чтоб при нажатии на тактовую кнопку от одного до пяти раз активировался один выход ардуины при нажатии от 5 до 10 раз другой с отключением предыдущего но а свыше 10 раз все выхода отключались и еше важно чтоб спустя минуту количество нажатии обнулялось, хочу с телефона упровлять обогревом на даче
Вы хотите "слушать" телефонную линию и управлять системой с помощью дискового телефона? А что не так с тональным управлением?
Поясню сейчас все работает так к телефону вместо вибры подключенно реле оно по сути эмулирует нажатие тактовой кнопки и в зависимости от количества гудков формируется количество нажатии. сейчас все работает без мк но я бы хотел иметь возможность и отключать дистанционно плюсом требуется еше один канал управления для обогрева будки собачки.
Поясню сейчас все работает так к телефону вместо вибры подключенно реле оно по сути эмулирует нажатие тактовой кнопки и в зависимости от количества гудков формируется количество нажатии. сейчас все работает без мк но я бы хотел иметь возможность и отключать дистанционно плюсом требуется еше один канал управления для обогрева будки собачки.
В зависимости от количества гудков вы хотите управлять системой отопления?
Не правильный подход. Если без наваротов (типа GSM-шилда) - то хотя бы тональное управление, с подтверждением.
Ребят по существу, кто может помочь в написать простенькой программы с обозначенными выше условиями, оплата гарантируется.
Так вы бы на вопросы отвечали...
Простенькую программу написать могут многие. Но как угадать, что вам нужно?
Все что сейчас мне нужно это чтоб при нажатии на тактовую кнопку от одного до пяти раз активировался один выход ардуины при нажатии от 5 до 10 раз другой с отключением предыдущего но а свыше 10 раз все выхода отключались и еше важно чтоб спустя минуту количество нажатии обнулялось, может мне кто с этим помочь нет???
Тёзка, напиши свою почту для связи
Все что сейчас мне нужно это чтоб при нажатии на тактовую кнопку от одного до пяти раз активировался один выход ардуины при нажатии от 5 до 10 раз другой с отключением предыдущего но а свыше 10 раз все выхода отключались и еше важно чтоб спустя минуту количество нажатии обнулялось, может мне кто с этим помочь нет???
Поможем, конечно. Вам готовый скетч, или помочь разобраться?
Уточните частоту нажатий.
Здравствуйте отсувовал некоторое время был в отпуске извените, потребность в данной программе осталась, текст программы можно выложить здесь или теме о кнопках, желательно закоментирова каждую строчку чтоб сам понимать начал. ( частота нажатии примерно раз в две секунды) моя почта ""vys55@qip.ru"
Здравствуйте отсувовал некоторое время был в отпуске извените, потребность в данной программе осталась, текст программы можно выложить здесь или теме о кнопках, желательно закоментирова каждую строчку чтоб сам понимать начал. ( частота нажатии примерно раз в две секунды) моя почта ""vys55@qip.ru"
Ну как-то так
01
#define BUT_PIN 5 //пин кнопки
02
#define OUT1_PIN 6 //пин выхода 1
03
#define OUT2_PIN 7 //пин выхода 2
04
#define TIMER_T 2000 //время в течении которого не реагирует на повторное нажатие/удержание кнопки, ms 1000 мс = 1 сек
05
06
void
setup
()
07
{
08
pinMode(BUT_PIN, INPUT);
09
pinMode(OUT1_PIN, OUTPUT);
10
pinMode(OUT2_PIN, OUTPUT);
11
}
12
13
unsigned
int
count = 0;
//счетчик нажатий
14
unsigned
long
time = 0;
//таймер для отсчета одиной минуты (может быть неадекватное поведение при переполнении таймера)
15
unsigned
long
time_dop = 0;
//доп таймер от переполнения, не факт что поможет. Просто есть проблема переполнения millis() через 50 дней
16
//кстати для оффтопа - может есть код на asm чтобы принудительно таймер ардуины сбросить? он же как регистр идет?
17
18
void
loop
()
19
{
20
if
(digitalRead(BUT_PIN))
//если нажали кнопку, то входим в цикл, длящийся минуту
21
{
22
count = count + 1;
23
24
////////////////////////////////////////////////
25
//чуть ниже попытка защиты от случая переполнения таймера, ибо millis()
26
//ибо оно использует Unsigned long для хранения положительных целых чисел в диапазоне от 0 до 4,294,967,295
27
//при приближении к этому значению получим до несколько увеличенную длительностьцикла, но не равную 50 дням)
28
time_dop = millis();
29
if
(time_dop >= 4294900000) time_dop = 0;
30
////////////////////////////////////////////////
31
32
time = time_dop+60000;
//фиксируем время относительно которого будем считать минуту во время нажатия + 60 секунд
33
34
delay(TIMER_T);
//время после нажатия, в течении которого нет реакции на кнопку
35
36
while
(millis() <= time)
//пока текущее время меньше рассчетного крутимся в цикле
37
{
38
if
(count <= 5)
//если счетчик до 5
39
{
40
digitalWrite(OUT1_PIN,HIGH);
//вкл первый
41
digitalWrite(OUT2_PIN,LOW);
//выкл второй
42
}
43
44
if
(count >5 && count <= 10)
//если счетчик от 6 до 10
45
{
46
digitalWrite(OUT1_PIN,LOW);
//выкл первый
47
digitalWrite(OUT2_PIN,HIGH);
//вкл второй
48
}
49
50
if
(count > 10)
51
{
52
break
;
//выходим из цикла принудительно, т.к. счетчик был переполнен
53
}
54
if
(digitalRead(BUT_PIN))
//если идут дальнейшие нажатия кнопки
55
{
56
count = count + 1;
//если нажата кнопка, то увеличить счетчик
57
delay(TIMER_T);
//подождать перед следующей проверкой кнопки на нажатие
58
}
59
}
60
}
61
//ниже пойдут действия, если цикл завершился из-за прохождения одной минуты, либо от принудительного прерывания цикла
62
count = 0;
//обнуляем счетчик
63
digitalWrite(OUT1_PIN,LOW);
//обнуляем выходы
64
digitalWrite(OUT2_PIN,LOW);
//обнуляем выходы
65
//и всё по новой
66
}
Правда не тестировал, так что могут быть некоторые косяки.
001
// а если кто-то позвонит вам на дачу и приведёт в действие САМОЛИКВИДАЦИЮ ? :)
002
#define can1 8 // управление каналами
003
#define can2 9
004
#define can3 10
005
#define can4 11
006
#define can5 12
007
#define can6 13
008
boolean statusCan1 = 0;
// для триггерного режима управления каналом
009
boolean statusCan2 = 0;
010
boolean statusCan3 = 0;
011
boolean statusCan4 = 0;
012
boolean statusCan5 = 0;
013
volatile
byte
nGudok = 0;
// количество гудков
014
volatile boolean start = 0;
// признак начала пакета гудков
015
//==================================================================
016
void
setup
()
017
{
018
pinMode( can1 , OUTPUT );
// пин выходной
019
digitalWrite( can1 , LOW );
// пин в LOW , ВЫКЛ
020
pinMode( can2 , OUTPUT );
021
digitalWrite( can2 , LOW );
022
pinMode( can3 , OUTPUT );
023
digitalWrite( can3 , LOW );
024
pinMode( can4 , OUTPUT );
025
digitalWrite( can4 , LOW );
026
// и все остальные каналы
027
pinMode( 2 , INPUT );
// от реле на прерывание
028
digitalWrite( 2 , HIGH );
// подтяжка пина , реле на землю
029
attachInterrupt( 0 , isRout , CHANGE );
// разрешить прерывания на пине 2
030
}
031
//==================================================================
032
// обработчик прерываний по импульсам от реле ( от АТС т.е. )
033
void
isRout()
034
{
035
if
( nGudok == 0 ) start = 1;
// начало пакета
036
nGudok++;
// суммируем гудки
037
}
038
//==================================================================
039
void
loop
()
040
{
041
if
( start )
// если пакет начался
042
{
043
delay( 30000 );
// ждём , но импульсы суммируются
044
// время ожидания зависит от максимального желаемого колва вызывающих гудков
045
// 30 сек - это импульсов 13...17 зависит от АТС
046
start = 0;
047
}
048
if
( nGudok )
049
{
050
switch
( nGudok )
051
{
052
case
2 :
// если один импульс ( два фронта )
053
digitalWrite( can1 , ! statusCan1 );
// изменить состояние канала 1
054
case
4 :
// если 2 импульс ( 4 фронта )
055
digitalWrite( can2 , ! statusCan2 );
// изменить состояние канала 2
056
// и все остальные каналы
057
// case 12 :
058
// digitalWrite( can6 , ! statusCan6 );
059
case
14 :
// если 7 импульс ( 14 фронта )
060
{
// выключить все каналы
061
digitalWrite( can1 , LOW );
062
digitalWrite( can2 , LOW );
063
digitalWrite( can3 , LOW );
064
digitalWrite( can4 , LOW );
065
// и все остальные каналы
066
}
067
}
068
nGudok = 0;
069
}
070
}
071
//==================================================================// а если кто-то позвонит вам на дачу и приведёт в действие САМОЛИКВИДАЦИЮ ? :)
072
#define can1 8 // управление каналами
073
#define can2 9
074
#define can3 10
075
#define can4 11
076
#define can5 12
077
#define can6 13
078
boolean statusCan1 = 0;
// для триггерного режима управления каналом
079
boolean statusCan2 = 0;
080
boolean statusCan3 = 0;
081
boolean statusCan4 = 0;
082
boolean statusCan5 = 0;
083
volatile
byte
nGudok = 0;
// количество гудков
084
volatile boolean start = 0;
// признак начала пакета гудков
085
//==================================================================
086
void
setup
()
087
{
088
pinMode( can1 , OUTPUT );
// пин выходной
089
digitalWrite( can1 , LOW );
// пин в LOW , ВЫКЛ
090
pinMode( can2 , OUTPUT );
091
digitalWrite( can2 , LOW );
092
pinMode( can3 , OUTPUT );
093
digitalWrite( can3 , LOW );
094
pinMode( can4 , OUTPUT );
095
digitalWrite( can4 , LOW );
096
// и все остальные каналы
097
pinMode( 2 , INPUT );
// от реле на прерывание
098
digitalWrite( 2 , HIGH );
// подтяжка пина , реле на землю
099
attachInterrupt( 0 , isRout , CHANGE );
// разрешить прерывания на пине 2
100
}
101
//==================================================================
102
// обработчик прерываний по импульсам от реле ( от АТС т.е. )
103
void
isRout()
104
{
105
if
( nGudok == 0 ) start = 1;
// начало пакета
106
nGudok++;
// суммируем гудки
107
}
108
//==================================================================
109
void
loop
()
110
{
111
if
( start )
// если пакет начался
112
{
113
delay( 30000 );
// ждём , но импульсы суммируются
114
// время ожидания зависит от максимального желаемого колва вызывающих гудков
115
// 30 сек - это импульсов 13...17 зависит от АТС
116
start = 0;
117
}
118
if
( nGudok )
119
{
120
switch
( nGudok )
121
{
122
case
2 :
// если один импульс ( два фронта )
123
digitalWrite( can1 , ! statusCan1 );
// изменить состояние канала 1
124
case
4 :
// если 2 импульс ( 4 фронта )
125
digitalWrite( can2 , ! statusCan2 );
// изменить состояние канала 2
126
// и все остальные каналы
127
// case 12 :
128
// digitalWrite( can6 , ! statusCan6 );
129
case
14 :
// если 7 импульс ( 14 фронта )
130
{
// выключить все каналы
131
digitalWrite( can1 , LOW );
132
digitalWrite( can2 , LOW );
133
digitalWrite( can3 , LOW );
134
digitalWrite( can4 , LOW );
135
// и все остальные каналы
136
}
137
}
138
nGudok = 0;
139
}
140
}
141
//==================================================================
режим каналов - триггерный , можно и забыть что включено что нет.....
в строках #120.....139 - измените действия как вам удобнее , и переключатель можно убрать... сделать через ИФы - nGudok больше 1 меньше 5 - 1 канал , больше 5 меньше 10 - 2 канал....
если чё - спрашивайте :)
( если есть ошибки - просто подскажите :) )
реле - плохо.... дребезг контактов.... сами защитите пин 2 , а то на 1 вызывной импульс получите 5.....20 прерываний :(
или провода от вибры соедините с ардуиной - земля->земля , +>пин2
этот код - какзадача поставлена в начале....
добавляйте ИФы, меняйте в них колво импульсов, действия - настраивайте :)
01
#define can1 8 // канал 1
02
#define can2 9 // канал 2
03
volatile
byte
nGudok = 0;
// количество гудков
04
volatile boolean start = 0;
// признак начала пакета гудков
05
//==================================================================
06
void
setup
()
07
{
08
pinMode( can1 , OUTPUT );
// пин выходной
09
digitalWrite( can1 , LOW );
// пин в LOW , ВЫКЛ
10
pinMode( can2 , OUTPUT );
11
digitalWrite( can2 , LOW );
12
pinMode( 2 , INPUT );
// от реле на прерывание
13
digitalWrite( 2 , HIGH );
// подтяжка пина , реле на землю
14
attachInterrupt( 0 , isRout , CHANGE );
// разрешить прерывания на пине 2
15
}
16
//==================================================================
17
// обработчик прерываний по импульсам от реле ( от АТС т.е. )
18
void
isRout()
19
{
20
if
( nGudok == 0 ) start = 1;
// начало пакета
21
nGudok++;
// суммируем гудки
22
}
23
//==================================================================
24
void
loop
()
25
{
26
if
( start )
// если пакет начался
27
{
28
delay( 60000 );
// ждём , но импульсы суммируются
29
// время ожидания зависит от максимального желаемого колва вызывающих гудков
30
// 30 сек - это импульсов 13...17 зависит от АТС
31
}
32
if
( nGudok )
33
{
34
if
( ( nGudok >= 1 ) && ( nGudok < 5 ) )
35
{
36
digitalWrite( can1 , HIGH );
37
}
38
if
( ( nGudok >= 5 ) && ( nGudok < 10 ) )
39
{
40
digitalWrite( can1 , LOW );
41
digitalWrite( can2 , HIGH );
42
}
43
if
( nGudok >= 10 )
44
{
45
digitalWrite( can1 , LOW );
46
digitalWrite( can2 , LOW );
47
}
48
nGudok = 0;
49
start = 0;
50
}
51
}
52
//==================================================================
..... и с учётом собачки :)
01
#define can1 8 // канал 1
02
#define can2 9 // канал 2
03
#define can3 10 // собакодом
04
volatile
byte
nGudok = 0;
// количество гудков
05
volatile boolean start = 0;
// признак начала пакета гудков
06
//==================================================================
07
void
setup
()
08
{
09
pinMode( can1 , OUTPUT );
// пин выходной
10
digitalWrite( can1 , LOW );
// пин в LOW , ВЫКЛ
11
pinMode( can2 , OUTPUT );
12
digitalWrite( can2 , LOW );
13
pinMode( 2 , INPUT );
// от реле на прерывание
14
digitalWrite( 2 , HIGH );
// подтяжка пина , реле на землю
15
attachInterrupt( 0 , isRout , CHANGE );
// разрешить прерывания на пине 2
16
}
17
//==================================================================
18
// обработчик прерываний по импульсам от реле ( от АТС т.е. )
19
void
isRout()
20
{
21
if
( nGudok == 0 ) start = 1;
// начало пакета
22
nGudok++;
// суммируем гудки
23
}
24
//==================================================================
25
void
loop
()
26
{
27
if
( start )
// если пакет начался
28
{
29
delay( 60000 );
// ждём , но импульсы суммируются
30
// время ожидания зависит от максимального желаемого колва вызывающих гудков
31
// 30 сек - это импульсов 13...17 зависит от АТС
32
}
33
if
( nGudok )
34
{
35
if
( ( nGudok >= 1 ) && ( nGudok < 5 ) )
36
{
37
digitalWrite( can1 , HIGH );
38
}
39
if
( ( nGudok >= 5 ) && ( nGudok < 10 ) )
40
{
41
digitalWrite( can1 , LOW );
42
digitalWrite( can2 , HIGH );
43
}
44
if
( ( nGudok >= 10 ) && ( nGudok < 15 ) )
45
{
46
digitalWrite( can3 , HIGH );
47
}
48
if
( nGudok >= 15 )
49
{
50
digitalWrite( can1 , LOW );
51
digitalWrite( can2 , LOW );
52
digitalWrite( can3 , LOW );
53
}
54
nGudok = 0;
55
start = 0;
56
}
57
}
58
//==================================================================
ой, режим и начальное состояние пина 10 - не добавил.... строки ##12A , 12B добавьте как в ##11 , 12
исправил и добавил строку nGudok = nGudok / 2 ; ниже анализ по импульсам , а не по фронтам
01
#define can1 8 // канал 1
02
#define can2 9 // канал 2
03
#define can3 10 // собакодом
04
volatile
byte
nGudok = 0;
// количество гудков
05
volatile boolean start = 0;
// признак начала пакета гудков
06
//==================================================================
07
void
setup
()
08
{
09
pinMode( can1 , OUTPUT );
// пин выходной
10
digitalWrite( can1 , LOW );
// пин в LOW , ВЫКЛ
11
pinMode( can2 , OUTPUT );
12
digitalWrite( can2 , LOW );
13
pinMode( can3 , OUTPUT );
14
digitalWrite( can3 , LOW );
15
pinMode( 2 , INPUT );
// от реле на прерывание
16
digitalWrite( 2 , HIGH );
// подтяжка пина , реле на землю
17
attachInterrupt( 0 , isRout , CHANGE );
// разрешить прерывания на пине 2
18
}
19
//==================================================================
20
// обработчик прерываний по импульсам от реле ( от АТС т.е. )
21
void
isRout()
22
{
23
if
( nGudok == 0 ) start = 1;
// начало пакета
24
nGudok++;
// суммируем гудки
25
}
26
//==================================================================
27
void
loop
()
28
{
29
if
( start )
// если пакет начался
30
{
31
delay( 60000 );
// ждём , но импульсы суммируются
32
// время ожидания зависит от максимального желаемого колва вызывающих гудков
33
// 30 сек - это импульсов 13...17 зависит от АТС
34
}
35
if
( nGudok )
36
{
37
nGudok = nGudok / 2 ;
38
if
( ( nGudok >= 1 ) && ( nGudok < 5 ) )
39
{
40
digitalWrite( can1 , HIGH );
41
}
42
if
( ( nGudok >= 5 ) && ( nGudok < 10 ) )
43
{
44
digitalWrite( can1 , LOW );
45
digitalWrite( can2 , HIGH );
46
}
47
if
( ( nGudok >= 10 ) && ( nGudok < 15 ) )
48
{
49
digitalWrite( can3 , HIGH );
50
}
51
if
( nGudok >= 15 )
52
{
53
digitalWrite( can1 , LOW );
54
digitalWrite( can2 , LOW );
55
digitalWrite( can3 , LOW );
56
}
57
nGudok = 0;
58
start = 0;
59
}
60
}
61
//==================================================================
Ох как резко сдвинулось дело, буду пробовать код спасибо за оказываемую мне помощь, я в этом еше новичок и только начинаю осваивать ардуино. По поводу случайных звонков в телефоне есть возможность выставлять вибро только на определенные группы контактов а так как во всей телефонной книге всеголишь один контакт да еше и в нужной группе то вероятность случайного звонка исключена, от дребезга контактов хорошо помогает конденсатор, кстати в машине стоит нечто подобное удаленная блокировка двигателя только с одного номера - моего уже 3 года отлично работает))))) и еше в знак благодарности могу пополнить счет сотового телефона отзвавшимся людям.
спасибо, мне хватает :)