Нужна помшь в написании прграммы
- Войдите на сайт для отправки комментариев
Пнд, 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"
Ну как-то так
#define BUT_PIN 5 //пин кнопки #define OUT1_PIN 6 //пин выхода 1 #define OUT2_PIN 7 //пин выхода 2 #define TIMER_T 2000 //время в течении которого не реагирует на повторное нажатие/удержание кнопки, ms 1000 мс = 1 сек void setup() { pinMode(BUT_PIN, INPUT); pinMode(OUT1_PIN, OUTPUT); pinMode(OUT2_PIN, OUTPUT); } unsigned int count = 0; //счетчик нажатий unsigned long time = 0; //таймер для отсчета одиной минуты (может быть неадекватное поведение при переполнении таймера) unsigned long time_dop = 0; //доп таймер от переполнения, не факт что поможет. Просто есть проблема переполнения millis() через 50 дней //кстати для оффтопа - может есть код на asm чтобы принудительно таймер ардуины сбросить? он же как регистр идет? void loop() { if (digitalRead(BUT_PIN)) //если нажали кнопку, то входим в цикл, длящийся минуту { count = count + 1; //////////////////////////////////////////////// //чуть ниже попытка защиты от случая переполнения таймера, ибо millis() //ибо оно использует Unsigned long для хранения положительных целых чисел в диапазоне от 0 до 4,294,967,295 //при приближении к этому значению получим до несколько увеличенную длительностьцикла, но не равную 50 дням) time_dop = millis(); if (time_dop >= 4294900000) time_dop = 0; //////////////////////////////////////////////// time = time_dop+60000; //фиксируем время относительно которого будем считать минуту во время нажатия + 60 секунд delay(TIMER_T); //время после нажатия, в течении которого нет реакции на кнопку while (millis() <= time) //пока текущее время меньше рассчетного крутимся в цикле { if (count <= 5) //если счетчик до 5 { digitalWrite(OUT1_PIN,HIGH); //вкл первый digitalWrite(OUT2_PIN,LOW); //выкл второй } if (count >5 && count <= 10) //если счетчик от 6 до 10 { digitalWrite(OUT1_PIN,LOW); //выкл первый digitalWrite(OUT2_PIN,HIGH); //вкл второй } if (count > 10) { break; //выходим из цикла принудительно, т.к. счетчик был переполнен } if (digitalRead(BUT_PIN)) //если идут дальнейшие нажатия кнопки { count = count + 1; //если нажата кнопка, то увеличить счетчик delay(TIMER_T); //подождать перед следующей проверкой кнопки на нажатие } } } //ниже пойдут действия, если цикл завершился из-за прохождения одной минуты, либо от принудительного прерывания цикла count = 0; //обнуляем счетчик digitalWrite(OUT1_PIN,LOW); //обнуляем выходы digitalWrite(OUT2_PIN,LOW); //обнуляем выходы //и всё по новой }Правда не тестировал, так что могут быть некоторые косяки.
// а если кто-то позвонит вам на дачу и приведёт в действие САМОЛИКВИДАЦИЮ ? :) #define can1 8 // управление каналами #define can2 9 #define can3 10 #define can4 11 #define can5 12 #define can6 13 boolean statusCan1 = 0; // для триггерного режима управления каналом boolean statusCan2 = 0; boolean statusCan3 = 0; boolean statusCan4 = 0; boolean statusCan5 = 0; volatile byte nGudok = 0; // количество гудков volatile boolean start = 0; // признак начала пакета гудков //================================================================== void setup() { pinMode( can1 , OUTPUT ); // пин выходной digitalWrite( can1 , LOW ); // пин в LOW , ВЫКЛ pinMode( can2 , OUTPUT ); digitalWrite( can2 , LOW ); pinMode( can3 , OUTPUT ); digitalWrite( can3 , LOW ); pinMode( can4 , OUTPUT ); digitalWrite( can4 , LOW ); // и все остальные каналы pinMode( 2 , INPUT ); // от реле на прерывание digitalWrite( 2 , HIGH ); // подтяжка пина , реле на землю attachInterrupt( 0 , isRout , CHANGE ); // разрешить прерывания на пине 2 } //================================================================== // обработчик прерываний по импульсам от реле ( от АТС т.е. ) void isRout() { if ( nGudok == 0 ) start = 1; // начало пакета nGudok++; // суммируем гудки } //================================================================== void loop() { if ( start ) // если пакет начался { delay( 30000 ); // ждём , но импульсы суммируются // время ожидания зависит от максимального желаемого колва вызывающих гудков // 30 сек - это импульсов 13...17 зависит от АТС start = 0; } if ( nGudok ) { switch ( nGudok ) { case 2 : // если один импульс ( два фронта ) digitalWrite( can1 , ! statusCan1 ); // изменить состояние канала 1 case 4 : // если 2 импульс ( 4 фронта ) digitalWrite( can2 , ! statusCan2 ); // изменить состояние канала 2 // и все остальные каналы // case 12 : // digitalWrite( can6 , ! statusCan6 ); case 14 : // если 7 импульс ( 14 фронта ) { // выключить все каналы digitalWrite( can1 , LOW ); digitalWrite( can2 , LOW ); digitalWrite( can3 , LOW ); digitalWrite( can4 , LOW ); // и все остальные каналы } } nGudok = 0; } } //==================================================================// а если кто-то позвонит вам на дачу и приведёт в действие САМОЛИКВИДАЦИЮ ? :) #define can1 8 // управление каналами #define can2 9 #define can3 10 #define can4 11 #define can5 12 #define can6 13 boolean statusCan1 = 0; // для триггерного режима управления каналом boolean statusCan2 = 0; boolean statusCan3 = 0; boolean statusCan4 = 0; boolean statusCan5 = 0; volatile byte nGudok = 0; // количество гудков volatile boolean start = 0; // признак начала пакета гудков //================================================================== void setup() { pinMode( can1 , OUTPUT ); // пин выходной digitalWrite( can1 , LOW ); // пин в LOW , ВЫКЛ pinMode( can2 , OUTPUT ); digitalWrite( can2 , LOW ); pinMode( can3 , OUTPUT ); digitalWrite( can3 , LOW ); pinMode( can4 , OUTPUT ); digitalWrite( can4 , LOW ); // и все остальные каналы pinMode( 2 , INPUT ); // от реле на прерывание digitalWrite( 2 , HIGH ); // подтяжка пина , реле на землю attachInterrupt( 0 , isRout , CHANGE ); // разрешить прерывания на пине 2 } //================================================================== // обработчик прерываний по импульсам от реле ( от АТС т.е. ) void isRout() { if ( nGudok == 0 ) start = 1; // начало пакета nGudok++; // суммируем гудки } //================================================================== void loop() { if ( start ) // если пакет начался { delay( 30000 ); // ждём , но импульсы суммируются // время ожидания зависит от максимального желаемого колва вызывающих гудков // 30 сек - это импульсов 13...17 зависит от АТС start = 0; } if ( nGudok ) { switch ( nGudok ) { case 2 : // если один импульс ( два фронта ) digitalWrite( can1 , ! statusCan1 ); // изменить состояние канала 1 case 4 : // если 2 импульс ( 4 фронта ) digitalWrite( can2 , ! statusCan2 ); // изменить состояние канала 2 // и все остальные каналы // case 12 : // digitalWrite( can6 , ! statusCan6 ); case 14 : // если 7 импульс ( 14 фронта ) { // выключить все каналы digitalWrite( can1 , LOW ); digitalWrite( can2 , LOW ); digitalWrite( can3 , LOW ); digitalWrite( can4 , LOW ); // и все остальные каналы } } nGudok = 0; } } //==================================================================режим каналов - триггерный , можно и забыть что включено что нет.....
в строках #120.....139 - измените действия как вам удобнее , и переключатель можно убрать... сделать через ИФы - nGudok больше 1 меньше 5 - 1 канал , больше 5 меньше 10 - 2 канал....
если чё - спрашивайте :)
( если есть ошибки - просто подскажите :) )
реле - плохо.... дребезг контактов.... сами защитите пин 2 , а то на 1 вызывной импульс получите 5.....20 прерываний :(
или провода от вибры соедините с ардуиной - земля->земля , +>пин2
этот код - какзадача поставлена в начале....
добавляйте ИФы, меняйте в них колво импульсов, действия - настраивайте :)
#define can1 8 // канал 1 #define can2 9 // канал 2 volatile byte nGudok = 0; // количество гудков volatile boolean start = 0; // признак начала пакета гудков //================================================================== void setup() { pinMode( can1 , OUTPUT ); // пин выходной digitalWrite( can1 , LOW ); // пин в LOW , ВЫКЛ pinMode( can2 , OUTPUT ); digitalWrite( can2 , LOW ); pinMode( 2 , INPUT ); // от реле на прерывание digitalWrite( 2 , HIGH ); // подтяжка пина , реле на землю attachInterrupt( 0 , isRout , CHANGE ); // разрешить прерывания на пине 2 } //================================================================== // обработчик прерываний по импульсам от реле ( от АТС т.е. ) void isRout() { if ( nGudok == 0 ) start = 1; // начало пакета nGudok++; // суммируем гудки } //================================================================== void loop() { if ( start ) // если пакет начался { delay( 60000 ); // ждём , но импульсы суммируются // время ожидания зависит от максимального желаемого колва вызывающих гудков // 30 сек - это импульсов 13...17 зависит от АТС } if ( nGudok ) { if ( ( nGudok >= 1 ) && ( nGudok < 5 ) ) { digitalWrite( can1 , HIGH ); } if ( ( nGudok >= 5 ) && ( nGudok < 10 ) ) { digitalWrite( can1 , LOW ); digitalWrite( can2 , HIGH ); } if ( nGudok >= 10 ) { digitalWrite( can1 , LOW ); digitalWrite( can2 , LOW ); } nGudok = 0; start = 0; } } //==================================================================..... и с учётом собачки :)
#define can1 8 // канал 1 #define can2 9 // канал 2 #define can3 10 // собакодом volatile byte nGudok = 0; // количество гудков volatile boolean start = 0; // признак начала пакета гудков //================================================================== void setup() { pinMode( can1 , OUTPUT ); // пин выходной digitalWrite( can1 , LOW ); // пин в LOW , ВЫКЛ pinMode( can2 , OUTPUT ); digitalWrite( can2 , LOW ); pinMode( 2 , INPUT ); // от реле на прерывание digitalWrite( 2 , HIGH ); // подтяжка пина , реле на землю attachInterrupt( 0 , isRout , CHANGE ); // разрешить прерывания на пине 2 } //================================================================== // обработчик прерываний по импульсам от реле ( от АТС т.е. ) void isRout() { if ( nGudok == 0 ) start = 1; // начало пакета nGudok++; // суммируем гудки } //================================================================== void loop() { if ( start ) // если пакет начался { delay( 60000 ); // ждём , но импульсы суммируются // время ожидания зависит от максимального желаемого колва вызывающих гудков // 30 сек - это импульсов 13...17 зависит от АТС } if ( nGudok ) { if ( ( nGudok >= 1 ) && ( nGudok < 5 ) ) { digitalWrite( can1 , HIGH ); } if ( ( nGudok >= 5 ) && ( nGudok < 10 ) ) { digitalWrite( can1 , LOW ); digitalWrite( can2 , HIGH ); } if ( ( nGudok >= 10 ) && ( nGudok < 15 ) ) { digitalWrite( can3 , HIGH ); } if ( nGudok >= 15 ) { digitalWrite( can1 , LOW ); digitalWrite( can2 , LOW ); digitalWrite( can3 , LOW ); } nGudok = 0; start = 0; } } //==================================================================ой, режим и начальное состояние пина 10 - не добавил.... строки ##12A , 12B добавьте как в ##11 , 12
исправил и добавил строку nGudok = nGudok / 2 ; ниже анализ по импульсам , а не по фронтам
#define can1 8 // канал 1 #define can2 9 // канал 2 #define can3 10 // собакодом volatile byte nGudok = 0; // количество гудков volatile boolean start = 0; // признак начала пакета гудков //================================================================== void setup() { pinMode( can1 , OUTPUT ); // пин выходной digitalWrite( can1 , LOW ); // пин в LOW , ВЫКЛ pinMode( can2 , OUTPUT ); digitalWrite( can2 , LOW ); pinMode( can3 , OUTPUT ); digitalWrite( can3 , LOW ); pinMode( 2 , INPUT ); // от реле на прерывание digitalWrite( 2 , HIGH ); // подтяжка пина , реле на землю attachInterrupt( 0 , isRout , CHANGE ); // разрешить прерывания на пине 2 } //================================================================== // обработчик прерываний по импульсам от реле ( от АТС т.е. ) void isRout() { if ( nGudok == 0 ) start = 1; // начало пакета nGudok++; // суммируем гудки } //================================================================== void loop() { if ( start ) // если пакет начался { delay( 60000 ); // ждём , но импульсы суммируются // время ожидания зависит от максимального желаемого колва вызывающих гудков // 30 сек - это импульсов 13...17 зависит от АТС } if ( nGudok ) { nGudok = nGudok / 2 ; if ( ( nGudok >= 1 ) && ( nGudok < 5 ) ) { digitalWrite( can1 , HIGH ); } if ( ( nGudok >= 5 ) && ( nGudok < 10 ) ) { digitalWrite( can1 , LOW ); digitalWrite( can2 , HIGH ); } if ( ( nGudok >= 10 ) && ( nGudok < 15 ) ) { digitalWrite( can3 , HIGH ); } if ( nGudok >= 15 ) { digitalWrite( can1 , LOW ); digitalWrite( can2 , LOW ); digitalWrite( can3 , LOW ); } nGudok = 0; start = 0; } } //==================================================================Ох как резко сдвинулось дело, буду пробовать код спасибо за оказываемую мне помощь, я в этом еше новичок и только начинаю осваивать ардуино. По поводу случайных звонков в телефоне есть возможность выставлять вибро только на определенные группы контактов а так как во всей телефонной книге всеголишь один контакт да еше и в нужной группе то вероятность случайного звонка исключена, от дребезга контактов хорошо помогает конденсатор, кстати в машине стоит нечто подобное удаленная блокировка двигателя только с одного номера - моего уже 3 года отлично работает))))) и еше в знак благодарности могу пополнить счет сотового телефона отзвавшимся людям.
спасибо, мне хватает :)