Нужна помшь в написании прграммы

vadim-21
Offline
Зарегистрирован: 26.12.2014

Здравствуете ребят помогите пожалуйста с написанием кода программы требуется чтоб при нажатии на тактовую кнопку от одного до пяти раз активировался один выход ардуины при нажатии от 5 до 10 раз другой с отключением предыдущего но а свыше 10 раз все выхода отключались  и еше важно чтоб спустя минуту количество нажатии обнулялось, хочу с телефона упровлять обогревом на даче

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

vadim-21 пишет:

Здравствуете ребят помогите пожалуйста с написанием кода программы требуется чтоб при нажатии на тактовую кнопку от одного до пяти раз активировался один выход ардуины при нажатии от 5 до 10 раз другой с отключением предыдущего но а свыше 10 раз все выхода отключались  и еше важно чтоб спустя минуту количество нажатии обнулялось, хочу с телефона упровлять обогревом на даче

Так все таки от тактовой или с телефона?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

vadim-21 пишет:

Здравствуете ребят помогите пожалуйста с написанием кода программы требуется чтоб при нажатии на тактовую кнопку от одного до пяти раз активировался один выход ардуины при нажатии от 5 до 10 раз другой с отключением предыдущего но а свыше 10 раз все выхода отключались  и еше важно чтоб спустя минуту количество нажатии обнулялось, хочу с телефона упровлять обогревом на даче

Вы хотите "слушать" телефонную линию и управлять системой с помощью дискового телефона?  А что не так с тональным управлением?

vadim-21
Offline
Зарегистрирован: 26.12.2014

Поясню сейчас все работает так к телефону вместо вибры подключенно реле оно по сути эмулирует нажатие тактовой кнопки и в зависимости от количества гудков формируется количество нажатии. сейчас все работает без мк но я бы хотел иметь возможность и отключать дистанционно плюсом требуется еше один канал управления для обогрева будки собачки.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

vadim-21 пишет:

Поясню сейчас все работает так к телефону вместо вибры подключенно реле оно по сути эмулирует нажатие тактовой кнопки и в зависимости от количества гудков формируется количество нажатии. сейчас все работает без мк но я бы хотел иметь возможность и отключать дистанционно плюсом требуется еше один канал управления для обогрева будки собачки.

В зависимости от количества гудков вы хотите управлять системой отопления?

Не правильный подход. Если без наваротов (типа GSM-шилда) - то хотя бы тональное управление, с подтверждением.

vadim-21
Offline
Зарегистрирован: 26.12.2014

Ребят по существу, кто может помочь в написать простенькой программы с обозначенными выше условиями, оплата гарантируется.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Так вы бы на вопросы отвечали...

Простенькую программу написать могут многие. Но как угадать, что вам нужно?

vadim-21
Offline
Зарегистрирован: 26.12.2014

Все что сейчас мне  нужно это чтоб при нажатии на тактовую кнопку от одного до пяти раз активировался один выход ардуины при нажатии от 5 до 10 раз другой с отключением предыдущего но а свыше 10 раз все выхода отключались  и еше важно чтоб спустя минуту количество нажатии обнулялось, может мне кто с этим помочь нет???

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

Тёзка, напиши свою почту для связи

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

vadim-21 пишет:

Все что сейчас мне  нужно это чтоб при нажатии на тактовую кнопку от одного до пяти раз активировался один выход ардуины при нажатии от 5 до 10 раз другой с отключением предыдущего но а свыше 10 раз все выхода отключались  и еше важно чтоб спустя минуту количество нажатии обнулялось, может мне кто с этим помочь нет???

Поможем, конечно. Вам готовый скетч, или помочь разобраться?

Уточните частоту нажатий.

vadim-21
Offline
Зарегистрирован: 26.12.2014

Здравствуйте отсувовал некоторое время был в отпуске извените, потребность  в данной программе осталась, текст программы  можно выложить здесь или  теме о кнопках, желательно закоментирова каждую строчку чтоб сам понимать начал. ( частота нажатии примерно раз в две секунды) моя почта ""vys55@qip.ru"

Sanchogus
Offline
Зарегистрирован: 02.01.2015

vadim-21 пишет:

Здравствуйте отсувовал некоторое время был в отпуске извените, потребность  в данной программе осталась, текст программы  можно выложить здесь или  теме о кнопках, желательно закоментирова каждую строчку чтоб сам понимать начал. ( частота нажатии примерно раз в две секунды) моя почта ""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); //обнуляем выходы  
//и всё по новой
}

Правда не тестировал, так что могут быть некоторые косяки.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
// а если кто-то позвонит вам на дачу и приведёт в действие САМОЛИКВИДАЦИЮ ? :)
#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;
    }
}
//==================================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

режим каналов - триггерный , можно и забыть что включено что нет..... 

в строках #120.....139 - измените действия как вам удобнее , и переключатель можно убрать... сделать через ИФы - nGudok больше 1 меньше 5 - 1 канал , больше 5 меньше 10 - 2 канал....

если чё - спрашивайте :)

( если есть ошибки - просто подскажите :)      )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

реле - плохо.... дребезг контактов.... сами защитите пин 2 , а то на 1 вызывной импульс получите 5.....20 прерываний :(

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

или провода от вибры соедините с ардуиной - земля->земля , +>пин2

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

этот код - какзадача поставлена в начале....

добавляйте ИФы, меняйте в них колво импульсов, действия - настраивайте :)

#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;
    }
}
//==================================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ой, режим и начальное состояние пина 10 - не добавил.... строки ##12A , 12B добавьте как в ##11 , 12 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

исправил и добавил строку         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;
    }
}
//==================================================================

 

vadim-21
Offline
Зарегистрирован: 26.12.2014

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

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

спасибо, мне хватает :)