Работа с кнопками. В помощь новичку.

gonzales
Offline
Зарегистрирован: 13.07.2015

Доброе время суток!

Прошу помощи по кнопкам. 

У меня кнопка (обычный выключатель) подключена к ардуино на расстоянии 15м. При этом в выключенном состоянии выключателя идут наводки (мк то включит свет, то выключит). Подтягивающий резистр стоит правда на 4.7МОм. (лень было выпаивать, проверил на коротком хвосте - все работает)

Подскажите, необходимо уменьшить номинал резистора или на таком расстоянии это в принципе не воможно. Какой номинал посоветуете. Кабель использую КСПВ 4х0,5.

Заранее спасибо!

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Конечно, как минимум надо уменьшить номинал резистора, подбирать что-то из 4,7 кОм - 22 кОм. Резистор надеюсь возле ардуины стоит, а не возле кнопки?

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

чем меньше номинал резистора - тем больше помехоустойчивость , но и больше ток питания
номинал - не менее 5 V / 40 mA = 125 Om
т.е. - 150 Om .... 30 kOm

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

gonzales пишет:

Подтягивающий резистр стоит правда на 4.7МОм. (лень было выпаивать, проверил на коротком хвосте - все работает)

обычно хватает и встроенного в МК на 20 kOm.....
digitalWrite( pin , HIGH ) , если , конечно ,  он настроен как вход 

этот ТОЧНО будет на стороне МК :)

gonzales
Offline
Зарегистрирован: 13.07.2015

SU-27-16 пишет:

чем меньше номинал резистора - тем больше помехоустойчивость , но и больше ток питания
номинал - не менее 5 V / 40 mA = 125 Om
т.е. - 150 Om .... 30 kOm

поставил 510 Ом, теперь ситуация обратная, выключение кнопки отрабатывает правильно, а при включении свет моргает, как будто МК считает, что на входе пина LOW-сигнал. Попробую увеличить сопротивление

 

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

gonzales пишет:

SU-27-16 пишет:

чем меньше номинал резистора - тем больше помехоустойчивость , но и больше ток питания
номинал - не менее 5 V / 40 mA = 125 Om
т.е. - 150 Om .... 30 kOm

поставил 510 Ом, теперь ситуация обратная, выключение кнопки отрабатывает правильно, а при включении свет моргает, как будто МК считает, что на входе пина LOW-сигнал. Попробую увеличить сопротивление

 

я не рекомендовал , я предположил..... теория , блин....
опытным путём всё прояснится...

gonzales
Offline
Зарегистрирован: 13.07.2015

Хочу вставить свои пять копеек по работе с кнопками.

Ситуация такая, у меня проект освещения содержит диммер, соответственно в скетче используются прерывания (детектор нуля). При подключении кнопок и стандартном обращении в основном цикле 

buttonState1 = digitalRead(buttonPin1);

из-за частых прерываний иногда возникает еффект "дребезга", то есть неправильного определения состояния кнопки, что приводит к ложным срабатываниям МК (мигание света, преключение режимов). Все озвученные примеры не спасают от такого вида дребезга, так как расчитаны на простую задержку на время переходного периода при нажатии на кнопку.

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

void CheckButtons()
{
  
  buttonState1 = digitalRead(buttonPin1);

  if (sob>0){
    if (millis()-CurrentMillis1>500){
      if (sob==1 && buttonState1 == HIGH && prevState1==0){
        prevState1=buttonState1;
        CheckRC(15); //действия
      }
      else if (sob==2 && buttonState1 == LOW && prevState1==1){
        prevState1=buttonState1;
        CheckRC(13); //действия
      }
      sob=0;
    }
    
  }
  else {
    if (buttonState1 == HIGH && prevState1==0){
      sob=1;
      CurrentMillis1=millis();
    }
    else if (buttonState1 == LOW && prevState1==1){
      sob=2;
      CurrentMillis1=millis();
    }
  }  
}

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

Alexei39
Offline
Зарегистрирован: 26.03.2016

Доброго врямяни суток. Нужна помошь профисеоналов. Сам я только начал увлекаться программировованием микроконтролеров. 

Я составил схемку и стараюсь написат код чтоб она заработала как надо но пока струдом получаеться



int button = 0;
int crashload = 0;
int Up = 2;
int Down = 3;
void setup()
{
  pinMode(Up,  OUTPUT);
  pinMode(Down,  OUTPUT);
  pinMode(12, OUTPUT);
}
void loop()
{
   MSTART:
   {
  button = analogRead(A0); //считываем сигнал с кнопок
  crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
  if (crashload > 36) {goto MSTOP;}
  if (button > 690 && button < 700 ) {delay (100); goto AUTOUP;}//нажатие кнопки Up
  if (button > 785 && button < 795) {delay (100); goto AUTODOWN;} //нажатие кнопки Down
  if (button > 860 && button < 870 || button < 100) {goto MSTOP;}// Страховка от нажатия 2 кнопок 
  else goto MSTART; 
  }  
  AUTOUP:
  {
    delay (500); 
  for (int y=0; y<=60; y++)
    {
    for (int x=0; x<=500; x++)
      {
        digitalWrite(Up, HIGH);
        digitalWrite(Down, LOW);
         button = analogRead(A0); //считываем сигнал с кнопок
         crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
        if (button >785 && button <795) {delay (100); goto MSTOP;}
         if (button > 690 && button < 700 ){ goto UP;}
        if (crashload > 36) {goto MSTOP;} 
        
       }
     }
     goto MSTART;
  }
  return;  
  AUTODOWN:
 {
  delay(500);
  for (int y=0; y<=100; y++)
    {
    for (int x=0; x<=5000; x++)
      {
        digitalWrite(Up, LOW);
        digitalWrite(Down, HIGH);
        button = analogRead(A0); //считываем сигнал с кнопок
        crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
        if (button >785 && button <795) {delay (100); goto DOWN;}
        if (button > 690 && button < 700 ){delay (100); goto MSTOP;}
        if (crashload > 36) {goto MSTOP;} 
       
       }
     }
     goto MSTART;
  }
  UP:
   {
         button = analogRead(A0); //считываем сигнал с кнопок
        crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
      if (button > 690 && button < 700)
      {
      if (crashload > 36) {goto MSTOP;} 
    digitalWrite(Up, HIGH);
    digitalWrite(Down, LOW);
    goto UP;
       }
    else goto MSTOP;
    }  
  DOWN:
    {
        button = analogRead(A0); //считываем сигнал с кнопок
        crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
      if (button > 785 && button < 795)
      {
      if (crashload > 36) {goto MSTOP;} 
    digitalWrite(Up, LOW);
    digitalWrite(Down, HIGH);
    goto DOWN;
       }
    else goto MSTOP;
    }  
  MSTOP:
    {
    digitalWrite(Up, LOW);
    digitalWrite(Down, LOW);
    delay (1000);
    }
    goto MSTART;
     
   
}

 

Alexei39
Offline
Зарегистрирован: 26.03.2016

Алгоритм работы такой хотелось бы

Нажал-Отпустил  кнопку UP или Down мотор должен крутиться  10 секунд или пока не не сработает датчик тока.

Но в тот момент поа крутиться мотор при нажатие кнопки противоположного действия. Мотор должен остановиться, а принажатие кнопки того же напровления должен крутиться но только пока кнопка нажата или не сработает датчик тока.

Когда мотор стоит если нажать на кнопку и держать мотор должен крутиться только это промежуток времени.

 

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Alexei39 пишет:

Алгоритм работы такой хотелось бы...


Вы нарисуйте на бумаге блок-схему алгоритма. Так Вам легче будет программу составить. На блок-схеме логика видна гораздо лучше, чем в коде.

Alexei39
Offline
Зарегистрирован: 26.03.2016
long pMillis = 0;
int val = 0;
int button = 0;
int crashload = 0;
int Up = 2;
int Down = 3;
void setup()
{
  pinMode(Up,  OUTPUT);
  pinMode(Down,  OUTPUT);
  pinMode(12, OUTPUT);
}
void loop()
{
   MSTART:
   {
  button = analogRead(A0); //считываем сигнал с кнопок
  crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
  if (crashload > 36) {goto MSTOP;}
  if (button > 690 && button < 700 ) {delay (250); goto AUTOUP;}//нажатие кнопки Up
  if (button > 785 && button < 795) {delay (250); goto AUTODOWN;} //нажатие кнопки Down
  if (button > 860 && button < 870 || button < 100) {goto MSTOP;}// Страховка от нажатия 2 кнопок 
  else goto MSTOP; 
  }  
  AUTOUP:
 { 
  for (int y=0; y<=60; y++)
    {
    for (int x=0; x<=500; x++)
      {
         digitalWrite(Up, HIGH);
         digitalWrite(Down, LOW);
         button = analogRead(A0); //считываем сигнал с кнопок
         crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
        if (button >785 && button <795) {delay (250); goto MSTOP;}
         if (button > 690 && button < 700 ){delay (250); goto UP;}
        if (crashload > 36) {goto MSTOP;} 
        
       }
     }
     goto MSTART;
  }
  return;  
  AUTODOWN:
  { 
  for (int y=0; y<=100; y++)
    {
    for (int x=0; x<=5000; x++)
      {
        digitalWrite(Up, LOW);
        digitalWrite(Down, HIGH);
        button = analogRead(A0); //считываем сигнал с кнопок
        crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
        if (button >785 && button <795) {delay (250); goto DOWN;}
        if (button > 690 && button < 700 ){delay (250); goto MSTOP;}
        if (crashload > 36) {goto MSTOP;} 
        
       }
     }
     goto MSTART;
  }
  UP:
   {
        button = analogRead(A0); //считываем сигнал с кнопок
        crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
        digitalWrite(Up, HIGH);
        digitalWrite(Down, LOW);
      if (button > 690 && button < 700)
      {
      if (crashload > 36) {goto MSTOP;} 
    
    goto UP;
       }
    else goto MSTOP;
    }  
  DOWN:
    {
        button = analogRead(A0); //считываем сигнал с кнопок
        crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
        digitalWrite(Up, LOW);
        digitalWrite(Down, HIGH);
      if (button > 785 && button < 795)
      {
      if (crashload > 36) {goto MSTOP;} 
    
    goto DOWN;
       }
    else goto MSTOP;
    }  
  MSTOP:
    {
    digitalWrite(Up, LOW);
    digitalWrite(Down, LOW);
    }
    goto MSTART;
     
   
}

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

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

goto замени на функции, а то сейчас вой поднимут, как за применение расово неверных операторов.

Примерно так:

long pMillis = 0;
int val = 0;
int button = 0;
int crashload = 0;
int Up = 2;
int Down = 3;

void setup()
{
  pinMode(Up,  OUTPUT);
  pinMode(Down,  OUTPUT);
  pinMode(12, OUTPUT);
}

void loop()
{
  button = analogRead(A0); //считываем сигнал с кнопок
  crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
  if (crashload > 36) mstop();
  if (button > 690 && button < 700 ) {delay (250); autoUp();}//нажатие кнопки Up
  if (button > 785 && button < 795) {delay (250); autoDown();} //нажатие кнопки Down
  if (button > 860 && button < 870 || button < 100) {mStop();}// Страховка от нажатия 2 кнопок 
  else mStop(); 
}


void autoUp()
{
  for (int y=0; y<=60; y++)
    {
    for (int x=0; x<=500; x++)
      {
         digitalWrite(Up, HIGH);
         digitalWrite(Down, LOW);
         button = analogRead(A0); //считываем сигнал с кнопок
         crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
        if (button >785 && button <795) {delay (250); mStop();}
         if (button > 690 && button < 700 ){delay (250); up();}
        if (crashload > 36) {mStop();}
       }
     }
}

void autoDown()
  {
  for (int y=0; y<=100; y++)
    {
    for (int x=0; x<=5000; x++)
      {
        digitalWrite(Up, LOW);
        digitalWrite(Down, HIGH);
        button = analogRead(A0); //считываем сигнал с кнопок
        crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
        if (button >785 && button <795) {delay (250); down();}
        if (button > 690 && button < 700 ){delay (250); mStop();}
        if (crashload > 36) {mStop();} 
        
       }
     }
     goto MSTART;
  }
  
void up()
   {
        button = analogRead(A0); //считываем сигнал с кнопок
        crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
        digitalWrite(Up, HIGH);
        digitalWrite(Down, LOW);
      if (button > 690 && button < 700)
      {
      if (crashload > 36) {mStop();}     
    up();
       }
    else mStop();
    }  
    
void down()
    {
      button = analogRead(A0); //считываем сигнал с кнопок
      crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
      digitalWrite(Up, LOW);
      digitalWrite(Down, HIGH);
      if (button > 785 && button < 795)
      {
      if (crashload > 36) {mStop();}    
      down();
      }
    else mStop();
    } 
   
void mStop() 
    {
    digitalWrite(Up, LOW);
    digitalWrite(Down, LOW);
    } 

 

Alexei39
Offline
Зарегистрирован: 26.03.2016

Уважаемый Tomasina.

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

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
#define UP_PIN      2
#define DOWN_PIN    3
#define BUTTON_PIN  A0
#define SENSOR_PIN  A1
long pMillis =      0;
int val =           0;
int button =        0;
int crashload =     0;

void setup()
{
  pinMode(UP_PIN,  OUTPUT);
  pinMode(DOWN_PIN,  OUTPUT);
  pinMode(12, OUTPUT);       // это что такое? Нигде не используется
}

void loop()
{
  button = analogRead(BUTTON_PIN); //считываем сигнал с кнопок
  crashload = analogRead(SENSOR_PIN); //считываем сигнал превышения тока двигателем
  if (crashload > 36) mStop();
  if (button > 690 && button < 700) {delay (250); autoUp();}   //нажатие кнопки Up
  if (button > 785 && button < 795) {delay (250); autoDown();} //нажатие кнопки Down
  if (button > 860 && button < 870 || button < 100) {mStop();} // Страховка от нажатия 2 кнопок 
  else mStop(); 
}


void autoUp()
{
  for (int y=0; y<=60; y++)
    {
    for (int x=0; x<=500; x++)
      {
         digitalWrite(UP_PIN, HIGH);
         digitalWrite(DOWN_PIN, LOW);
         button = analogRead(A0); //считываем сигнал с кнопок
         crashload = analogRead(SENSOR_PIN); //считываем сигнал превышения тока двигателем
        if (button >785 && button <795) {delay (250); mStop();}
         if (button > 690 && button < 700 ){delay (250); up();}
        if (crashload > 36) {mStop();}
       }
     }
}

void autoDown()
  {
  for (int y=0; y<=100; y++)
    {
    for (int x=0; x<=5000; x++)
      {
        digitalWrite(UP_PIN, LOW);
        digitalWrite(DOWN_PIN, HIGH);
        button = analogRead(BUTTON_PIN); //считываем сигнал с кнопок
        crashload = analogRead(SENSOR_PIN); //считываем сигнал превышения тока двигателем
        if (button >785 && button <795) {delay (250); down();}
        if (button > 690 && button < 700 ){delay (250); mStop();}
        if (crashload > 36) {mStop();} 
        
       }
     }
  }
  
void up()
   {
        button = analogRead(BUTTON_PIN); //считываем сигнал с кнопок
        crashload = analogRead(SENSOR_PIN); //считываем сигнал превышения тока двигателем
        digitalWrite(UP_PIN, HIGH);
        digitalWrite(DOWN_PIN, LOW);
      if (button > 690 && button < 700)
      {
      if (crashload > 36) {mStop();}     
    up();
       }
    else mStop();
    }  
    
void down()
    {
      button = analogRead(BUTTON_PIN); //считываем сигнал с кнопок
      crashload = analogRead(SENSOR_PIN); //считываем сигнал превышения тока двигателем
      digitalWrite(UP_PIN, LOW);
      digitalWrite(DOWN_PIN, HIGH);
      if (button > 785 && button < 795) { if (crashload > 36) {mStop();}    
      down();
      }
    else mStop();
    } 
   
void mStop() 
    {
    digitalWrite(UP_PIN, LOW);
    digitalWrite(DOWN_PIN, LOW);
    } 

 

mustD1e
Offline
Зарегистрирован: 08.01.2015
Думаю кому-то будет интересно, а может кто то даже и библиотеку запилит...
Мой вариант управление аналоговыми кнопками.
Имеет 4 вида нажатия, точнее 3 ))) одиночное, залипание и повтор, ну и просто отключение.
Без delay()
 
// ----------------------------------------------------------------------------------------------
//            __                                       __                 ___         __
//           /\ \                                     /\ \              /'___`\     /'__`\
//       __  \ \ \____          _ __    __     __     \_\ \      __  __/\_\ /\ \   /\ \/\ \
//     /'__`\ \ \ '__`\        /\`'__\/'__`\ /'__`\   /'_` \    /\ \/\ \/_/// /__  \ \ \ \ \
//    /\ \L\.\_\ \ \L\ \       \ \ \//\  __//\ \L\.\_/\ \L\ \   \ \ \_/ | // /_\ \__\ \ \_\ \
//    \ \__/.\_\\ \_,__/        \ \_\\ \____\ \__/.\_\ \___,_\   \ \___/ /\______/\_\\ \____/
//     \/__/\/_/ \/___/   _______\/_/ \/____/\/__/\/_/\/__,_ /    \/__/  \/_____/\/_/ \/___/
//                       /\______\
//                       \/______/
//
// info: ab_read v2.0 by mustD1e 01.04.2016
// e-mail: mustD1e.rus32@gmail.com
// ----------------------------------------------------------------------------------------------
// ab_read() - Основная функция. Вызывается один раз, вначале цикла loop().
// ab_setKey(byte id, short val, byte type) - Установка параметров кнопки. Вызывается один раз для каждый кнопки в секции setup().
// ab_setType(byte id, byte type) - Установка типа кнопки. Можно вызвать в любом месте.
// ab_getState(byte id) - Возвращает значение кнопки (true - нажата / false - отжата). Можно вызвать в любом месте.
// ----------------------------------------------------------------------------------------------
// Секция настроек
// ----------------------------------------------------------------------------------------------

#define ab_pin              0     // Пин для чтения
#define ab_minVal           0     // Минимальный порог чтения
#define ab_maxVal           1000  // Максимальный порог чтения
#define ab_debounceDelay    80    // Задержка дребезга
#define ab_amount           5     // Количество кнопок (максимум 256)
#define ab_tolerance        15    // Отклонение значений (KeyVal +- ab_tolerance)
#define ab_slowRepeats      3     // Количество медленных повторов (только ab_typeRepeat)
#define ab_slowRepeatDelay  500   // Задержка для медленных повторов (только ab_typeRepeat)
#define ab_fastRepeatDelay  250   // Задержка для быстрых повторов (только ab_typeRepeat)

#define ab_typeDisabled     0     // Тип: Отключена
#define ab_typeSingle       1     // Тип: Одиночное нажатие
#define ab_typeAlways       2     // Тип: Залипание
#define ab_typeRepeat       3     // Тип: Повторение

// ПРИМЕР! Условное обозначение клавиш (можно использовать любые имена)
#define ab_btnUp            0     // Вверх
#define ab_btnDown          1     // Вниз
#define ab_btnLeft          2     // Влево
#define ab_btnRight         3     // Вправо
#define ab_btnEnter         4     // Ввод

// ----------------------------------------------------------------------------------------------
// Секция переменных
// ----------------------------------------------------------------------------------------------
typedef struct {
  short minVal, maxVal;
  byte type;
  bool state;
} ab_struct;
ab_struct ab_key[ab_amount];
unsigned long ab_timer, ab_repeatDelay;
unsigned int ab_repeats;
bool ab_debounced, ab_singlePressed;
byte ab_lastKey;

// ----------------------------------------------------------------------------------------------
// Секция функций
// ----------------------------------------------------------------------------------------------
void ab_read() {
  if (ab_key[ab_lastKey].type == ab_typeSingle && ab_key[ab_lastKey].state == true) {
    ab_key[ab_lastKey].state = false;
  }
  if (ab_key[ab_lastKey].type == ab_typeRepeat && ab_key[ab_lastKey].state == true) {
    ab_key[ab_lastKey].state = false;
  }

  if (analogRead(ab_pin) < ab_minVal || analogRead(ab_pin) > ab_maxVal) {
    if (ab_key[ab_lastKey].type == ab_typeAlways && ab_key[ab_lastKey].state == true) {
      ab_key[ab_lastKey].state = false;
    }
    ab_timer = millis();
    ab_debounced = false;
    ab_singlePressed = false;
    ab_repeatDelay = 0;
    ab_repeats = 0;
  } else if (millis() - ab_timer >= ab_debounceDelay) {
    if (!ab_debounced) {
      for (ab_lastKey = 0; ab_lastKey < ab_amount; ab_lastKey++) {
        if (analogRead(ab_pin) >= ab_key[ab_lastKey].minVal && analogRead(ab_pin) <= ab_key[ab_lastKey].maxVal) {
          ab_debounced = true;
          break;
        }
      }
    } else {
      if (ab_key[ab_lastKey].type == ab_typeSingle && !ab_singlePressed) {
        ab_key[ab_lastKey].state = true;
        ab_singlePressed = true;
      }
      if (ab_key[ab_lastKey].type == ab_typeAlways) {
        ab_key[ab_lastKey].state = true;
      }
      if (ab_key[ab_lastKey].type == ab_typeRepeat) {
        if (millis() - ab_timer >= ab_debounceDelay + ab_repeatDelay) {
          ab_key[ab_lastKey].state = true;
          ab_repeats = ab_repeats + 1;
          if (ab_repeats >= ab_slowRepeats) {
            ab_repeatDelay = ab_repeatDelay + ab_fastRepeatDelay;
          } else {
            ab_repeatDelay = ab_repeatDelay + ab_slowRepeatDelay;
          }
        }
      }
    }
  }
}

void ab_setKey(byte id, short val, byte type) {
  if (val - ab_tolerance <= 0) {
    ab_key[id].minVal = 0;
  } else {
    ab_key[id].minVal = val - ab_tolerance;
  }

  if (val + ab_tolerance >= 1023) {
    ab_key[id].maxVal = 1023;
  } else {
    ab_key[id].maxVal = val + ab_tolerance;
  }
  ab_key[id].type = type;
}

void ab_setType(byte id, byte type) {
  ab_key[id].type = type;
}

bool ab_getState(byte id) {
  return ab_key[id].state;
}
// ----------------------------------------------------------------------------------------------
// Конец
// ----------------------------------------------------------------------------------------------

void setup() {
  Serial.begin(9600);
  ab_setKey(ab_btnUp, 145, 1);
  ab_setKey(ab_btnDown, 330, 1);
  ab_setKey(ab_btnLeft, 0, 2);
  ab_setKey(ab_btnRight, 505, 3);
  ab_setKey(ab_btnEnter, 740, 0);
}

void loop() {
  ab_read();
  if (ab_getState(ab_btnUp) == true) {
    Serial.println("UP IS PRESSED");
  }
  if (ab_getState(ab_btnDown) == true) {
    Serial.println("DOWN IS PRESSED");
  }
  if (ab_getState(ab_btnLeft) == true) {
    Serial.println("LEFT IS PRESSED");
  }
  if (ab_getState(ab_btnRight) == true) {
    Serial.println("RIGHT IS PRESSED");
  }
  if (ab_getState(ab_btnEnter) == true) {
    Serial.println("ENTER IS PRESSED");
  }
}

 

 

Alexei39
Offline
Зарегистрирован: 26.03.2016

Народ только не пинайте. 

Прошу о помоши. Не как не могу понять почему когда я написал код так:

int button = 0;
int crashload = 0;
int Up = 2;
int Down = 3;
void setup()
{
  pinMode(Up,  OUTPUT);
  pinMode(Down,  OUTPUT);
  pinMode(12, OUTPUT);
}
void loop()
{
   MSTART:
   {
  button = analogRead(A0); //считываем сигнал с кнопок
  crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
  if (crashload > 36) {goto MSTOP;}
  if (button > 690 && button < 700 ) {delay (250); goto AUTOUP;}//нажатие кнопки Up
  if (button > 785 && button < 795) {delay (250); goto AUTODOWN;} //нажатие кнопки Down
  if (button > 860 && button < 870 || button < 100) {goto MSTOP;}// Страховка от нажатия 2 кнопок 
  else goto MSTOP; 
  }  
  AUTOUP:
 { 
  for (int y=0; y<=10; y++)
    {
    for (int x=0; x<=3000; x++)
      {
         digitalWrite(Up, HIGH);
         digitalWrite(Down, LOW);
         button = analogRead(A0); //считываем сигнал с кнопок
         crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
        if (button >785 && button <795) {delay (250); goto MSTOP;}
         if (button > 690 && button < 700 ){delay (250); goto UP;}
        if (crashload > 36) {goto MSTOP;} 
        
       }
     }
     goto MSTART;
  }
  AUTODOWN:
  { 
  for (int y=0; y<=10; y++)
    {
    for (int x=0; x<=3000; x++)
      {
        digitalWrite(Up, LOW);
        digitalWrite(Down, HIGH);
        button = analogRead(A0); //считываем сигнал с кнопок
        crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
        if (button >785 && button <795) {delay (250); goto DOWN;}
        if (button > 690 && button < 700 ){delay (250); goto MSTOP;}
        if (crashload > 36) {goto MSTOP;} 
        
       }
     }
     goto MSTART;
  }
  UP:
   {
        button = analogRead(A0); //считываем сигнал с кнопок
        crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
        digitalWrite(Up, HIGH);
        digitalWrite(Down, LOW);
      if (button > 690 && button < 700)
      {
      if (crashload > 36) {goto MSTOP;} 
    
    goto UP;
       }
    else goto MSTOP;
    }  
  DOWN:
    {
        button = analogRead(A0); //считываем сигнал с кнопок
        crashload = analogRead(A1); //считываем сигнал превышения тока двигателем
        digitalWrite(Up, LOW);
        digitalWrite(Down, HIGH);
      if (button > 785 && button < 795)
      {
      if (crashload > 36) {goto MSTOP;} 
    
    goto DOWN;
       }
    else goto MSTOP;
    }  
  MSTOP:
    {
    digitalWrite(Up, LOW);
    digitalWrite(Down, LOW);
    }
    goto MSTART;
     
   
}

У меня все работало, но Tomasina  меня поправи и сказал что писать нужно так

#define UP_PIN      2
#define DOWN_PIN    3
#define BUTTON_PIN  A0
#define SENSOR_PIN  A1
int button =        0;
int crashload =     0;



void autoUp()
{
  for(int y=0; y<=10; y++)
  {
     for (int x=0; x<=2500; x++)
      {
        digitalWrite(UP_PIN, HIGH);
        digitalWrite(DOWN_PIN, LOW);
        button = analogRead(A0); //считываем сигнал с кнопок
        crashload = analogRead(SENSOR_PIN); //считываем сигнал превышения тока двигателем
        if (button >785 && button <795) {delay (250); mStop();}
        if (button > 690 && button < 700 ){delay (250); up();}
        if (crashload > 670) {mStop();}
       
       }
  }    
}

void autoDown()
  {
  for (int y=0; y<=10; y++)
    {
    for (int x=0; x<=2500; x++)
      {
        digitalWrite(UP_PIN, LOW);
        digitalWrite(DOWN_PIN, HIGH);
        button = analogRead(BUTTON_PIN); //считываем сигнал с кнопок
        crashload = analogRead(SENSOR_PIN); //считываем сигнал превышения тока двигателем
        if (button >785 && button <795) {delay (250); down();}
        if (button > 690 && button < 700 ){delay (250); mStop();}
        if (crashload > 670) {mStop();} 
        
       }
     }
  }
  
void up()
   {
        button = analogRead(BUTTON_PIN); //считываем сигнал с кнопок
        crashload = analogRead(SENSOR_PIN); //считываем сигнал превышения тока двигателем
        digitalWrite(UP_PIN, HIGH);
        digitalWrite(DOWN_PIN, LOW);
      if (button > 690 && button < 700)
      {
      if (crashload > 670) {mStop();}     
    up();
       }
    else mStop();
    }  
    
void down()
    {
      button = analogRead(BUTTON_PIN); //считываем сигнал с кнопок
      crashload = analogRead(SENSOR_PIN); //считываем сигнал превышения тока двигателем
      digitalWrite(UP_PIN, LOW);
      digitalWrite(DOWN_PIN, HIGH);
      if (button > 785 && button < 795) { if (crashload > 670) {mStop();}    
      down();
      }
    else mStop();
    } 
   
void mStop() 
    {
    digitalWrite(UP_PIN, LOW);
    digitalWrite(DOWN_PIN, LOW);

    } 
    void setup()
{
  pinMode(UP_PIN,  OUTPUT);
  pinMode(DOWN_PIN,  OUTPUT);
 }

void loop()
{
  button = analogRead(BUTTON_PIN); //считываем сигнал с кнопок
  crashload = analogRead(SENSOR_PIN); //считываем сигнал превышения тока двигателем
  if (crashload > 670) mStop();
  if (button > 690 && button < 700) {delay (250); autoUp();}   //нажатие кнопки Up
  if (button > 785 && button < 795) {delay (250); autoDown();} //нажатие кнопки Down
  if (button > 860 && button < 870 || button < 100) {mStop();} // Страховка от нажатия 2 кнопок 
  else mStop(); 
}

и теперь работает это все на половину.

Тоесть при нажатие кнопок UP и DOWN переход происходит на autoUP и autoDown . И в этих функциях происходит только цикл по for , а не одно if не выполняеться кроме crashload  на выходе светодиод моргает пока держишь кнопку и длиться чикл.

Буду рад любым разьяснениям. Сам только учусь програмировать. А учитель у меня только один это ИНТЕРНЕТ.

Так что люди добрые помогите навичку.

Alexei39
Offline
Зарегистрирован: 26.03.2016

Ура разобрался надо было всего лиш одну строчку дописать

void mStop() 
    {
    digitalWrite(UP_PIN, LOW);
    digitalWrite(DOWN_PIN, LOW);
    loop(); вот эту строку добавил и все заработало
    } 
Ardfun
Offline
Зарегистрирован: 22.05.2016

Здравствуйте, подскажите пожалуйста каким образом сделать переключение экрана не просто по нажатию кнопки а чтоб переключение осуществлялось после удерживания кнопки не меньше 1 секунды (для избежания ложного переключения при просто нажатии) ???



  if (digitalRead(nextPin)== HIGH)
  {
  m++;//увеличиваем переменную уровня меню
  previousMillis = currentMillis;
    if (m>6)//если уровень больше 3
  {
  m=0;// то вернуться к началу
  }
    }

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Может так понятней:

boolean f_nextPin = 0;
unsigned long previousMillis = 0;
const int nextPin = 7;
int m = 0;
void setup()
{
  pinMode(nextPin, INPUT);
}


void loop() {
  if (digitalRead(nextPin) == HIGH && f_nextPin == 0)
  {
    previousMillis = millis();
    f_nextPin = 1;
  }
  else f_nextPin = 0;
  
  if (f_nextPin == 1 && millis() - previousMillis >= 1000)
  {
    m++;//увеличиваем переменную уровня меню
    if (m > 6) //если уровень больше 3
    {
      m = 0; // то вернуться к началу

    }
     f_nextPin = 0;
   }
}

 

Ardfun
Offline
Зарегистрирован: 22.05.2016

Благодарю:) но что то не разобрался еще или в коде ошибка.

вот кстати такой масив  работает у меня для включение освещения? но для переключения режимов экрана не могу интегрировать.

void loop() 

 { 
      if(digitalRead(knopka)==HIGH)//если кнопка нажата больше 1 секунды
      { 
         if (millis() - previousMillis >=1000)    
     { 
        previousMillis = millis();     
        val++; 
     } 
     } 
     else 
     { 
       val=0; 
     } 
        
     if(val>=5) 
     { 
       digitalWrite(led,!digitalRead(led));
       val=0; 
     } 
        

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Прокоментировал, проверил все работает

boolean f_nextPin = 0; //фЛАГ кнопки
unsigned long previousMillis = 0;
#define nextPin 7//Порт подключения кнопки
int m = 0;
void setup()
{
  pinMode(nextPin, INPUT);
}


void loop() {
  if (digitalRead(nextPin) == HIGH && f_nextPin == 0)//Фиксируем нажатие и запоминаем время
  {
    previousMillis = millis();
    f_nextPin = 1;
  }
  else if (digitalRead(nextPin) == LOW) { //Если отпустили кнопку - сбрасуем флаг
  f_nextPin = 0;
  }
  if (f_nextPin == 1 && millis() - previousMillis >= 1000)//Проверяем  нажата ли кнопка и прошла ли секунда
  {
    m++;//увеличиваем переменную уровня меню
    f_nextPin = 0;// и сбрасуем флаг
    
   if (m > 3) //если уровень больше 3
    {
      m = 0; // то вернуться к началу

    }

   }
}

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012
M@X's
Offline
Зарегистрирован: 14.07.2016

Здравствуйте. Хочу сделать так, чтобы по нажатию кнопки мелодия заиграла циклично, а после повторного нажатия - прекратила играть. С возможностью переделать в дальнейшем в следующие действия: нажал первый раз кнопку - заиграла первая мелодия циклично, нажал второй раз кнопку - вторая мелодия циклично, нажал третий раз - все остановилось. Arduino начал только изучать, и вообще, программирование только в школе изучал. Но почитав неделю форумы, собрал скетч из разных постов:

#include "pitches.h"
int regim=1; 
int flag=0; 
int melody[] = {NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_D4, NOTE_F4, NOTE_DS4, NOTE_C4, 0, NOTE_DS3, NOTE_G3, NOTE_C4, NOTE_D4, 0, NOTE_G3, NOTE_B3, NOTE_D4, NOTE_DS4, 0, NOTE_G3, NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_D4, NOTE_F4, NOTE_DS4, NOTE_C4, 0, NOTE_DS3, NOTE_G3, NOTE_C4, NOTE_D4, 0, NOTE_G3, NOTE_DS4, NOTE_D4, NOTE_C4};
int noteDurations[] = {8, 8, 8, 8, 8, 8, 8, 8, 4, 8, 8, 8, 8, 4, 8, 8, 8, 8, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, 8, 8, 8, 4, 8, 8, 8, 8, 4};
long previousMillis = 0;
void play(int melody[],int noteDurations[],int msize, int slow)
{
      for (int thisNote = 0; thisNote < msize; thisNote++) 
      {
      int noteDuration = 1000 / noteDurations[thisNote];
      tone(9, melody[thisNote], noteDuration);
      int pauseBetweenNotes = noteDuration * slow;
      delay(pauseBetweenNotes);
      noTone(9);
      }
}
 void setup()   
{ 
 pinMode(9,OUTPUT);    
} 
 void loop() 
{ 
     if(digitalRead(14)==HIGH&&flag==0)//если кнопка нажата  и перемення flag равна 0 , то ...  
     { 
     if (millis() -previousMillis >100) //то ждем 100мс для     
        {
         previousMillis = millis();  
         regim++; 
         flag=1; 
         }
         if(regim>2)//ограничим количество режимов 
        { 
          regim=1;//так как мы используем только одну кнопку, то переключать режимы будем циклично 
        }  
     } 
       
      if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата и переменная flag равна - 1 ,то ... 
     { 
      if (millis() -previousMillis >100) //то ждем 100мс для     
     {
      previousMillis = millis();        //отсечки дребезга контактов
      flag=0;//обнуляем переменную "knopka" 
     } 
     }
     if(regim==1)//первый режим 
    { 
      noTone(9); 
    } 
    if(regim==2)//второй режим 
    { 
     play(melody, noteDurations, 40, 2.9); 
     } 
} 

 Но в итоге получается, что нажимаю кнопку - мелодия играет, второй раз нажимаю - она не останавливается. Если нажимать кнопку многократно, то в какой-то момент она срабатывает и мелодия останавливается, но только когда доиграет до последней ноты. Подскажите, как сделать так, чтобы после повторного нажатия мелодия останавливалась сразу или сразу играла вторая мелодия? 

С миганием светодиодов все отлично отрабатывает, а с проигрыванием музыки переключение режимов тупит.

Не может ли это быть связано с тем, что пока выполняется tone(), сигнал с кнопки не читается, а если нажатие попадает в интервал между повторами, то мелодия играет еще раз и отключается?

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

M@X's

Давйте посмотрим Ваш код: Когда regim==2 прграма из void loop() переходит в функцию void play() а там работает цыкл for () и пока он не закончит назад в void loop() программа не вернется, следовательно Ваше нажатие кнопок обрабатываться не будет.

Что делать? В даном случае кнопку можно поцепить на прерывание а в for () каждый раз проверять не изменился ли regim и если да то выйти из цыкла.
M@X's
Offline
Зарегистрирован: 14.07.2016

Добрый день. Прочитал про прерывания, после этого избавился от переменных в функции play(), повесли кнопку на pin2 для внешнего прерывания. Установил проверку в цикл for(), но самое лучшее, чего я добился, это прерывание цикла for () и запуск его с начала. Мне нужно, чтобы при нажатии кнопки прерывался не только цикл, а еще и функция play() и программа переходила в regim=1. Подскажите нубу, что мне еще дописать надо или строки поменять? Может нужно использовать оператор goto?

#include "pitches.h"
const int Pin_tone = 9; // номер порта зуммера
const byte COUNT_NOTES = 40; // Колличество нот
int regim=1;
int flag=0;
long previousMillis = 0;
//частоты ноты
int frequences[COUNT_NOTES] = {
 NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_D4, NOTE_F4, NOTE_DS4, NOTE_C4, 0, NOTE_DS3, NOTE_G3, NOTE_C4, NOTE_D4, 0, NOTE_G3, NOTE_B3, NOTE_D4, NOTE_DS4, 0, NOTE_G3, NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_D4, NOTE_F4, NOTE_DS4, NOTE_C4, 0, NOTE_DS3, NOTE_G3, NOTE_C4, NOTE_D4, 0, NOTE_G3, NOTE_DS4, NOTE_D4, NOTE_C4};
//длительность нот
int durations[COUNT_NOTES] = {
 125, 125, 125, 125, 125, 125, 125, 125, 250, 125, 125, 125, 
 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 125, 
 125, 125, 125, 125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 250
};
void setup() {
  attachInterrupt(0, play, HIGH);
}
 void play()
{
  interrupts ();
        for (int i = 0; i <= COUNT_NOTES; i++  ) { // Цикл от 0 до количества нот
 if (regim!=2)
 {break;}
 else {
       tone(9, frequences[i], durations [i]);
          delay(durations[i] * 2);  // Дауза для заданой ноты
       noTone(Pin_tone); // Останавливаем звук
  }
   }
}
void loop() {
     if(digitalRead(2)==HIGH&&flag==0)//если кнопка нажата  и перемення flag равна 0 , то ... 
     {
     if (millis() -previousMillis >100) //то ждем 100мс для    
        {
         previousMillis = millis(); 
         regim++;
         flag=1;
         }
         if(regim>2)//ограничим количество режимов
        {
         regim=1;//так как мы используем только одну кнопку, то переключать режимы будем циклично
        } 
     }
     if(digitalRead(2)==LOW&&flag==1)//если кнопка НЕ нажата и переменная flag равна - 1 ,то ...
     {
      if (millis() -previousMillis >100) //то ждем 100мс для    
     {
      previousMillis = millis();        //отсечки дребезга контактов
      flag=0;//обнуляем переменную "knopka"
     }
     }
     if(regim==1)//первый режим
    {
     noTone(9);
    }
    if(regim==2)//второй режим
    {
    play();
    }
   }
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

В прерывании Вы должны выполнить только regim++; Все остальное в других функциях, антидребезг-апаратно. Вы же читали что прерывание должно быть как можно короче а Вы туда мелодию поставили!

M@X's
Offline
Зарегистрирован: 14.07.2016

vosara

Спасибо большое за помощь, все получилось. Разобрался как привязать прерывание на другие выходы. Теперь все работает на выходе А0. По поводу антидребизга. Будет ли иметь смысл припаивать конденсаторы на плату с такими кнопками? Arduino будет вместо разрушенного "паука".

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Если есть проблемы ставте програмный антидребезг, примерно так: В прерывании пишем 

if (flag_kn == 0)
{
regim++;
flag_kn=1;
}
//Тогда дребезга не будет

//А в лооп, если кнопка отпущена
void loop() flag_kn=0;

 

Ardfun
Offline
Зарегистрирован: 22.05.2016

Здравствуйте, вот

 ///////////////////////////////////////////////////////////////////// 1
if (digitalRead(nextPin) == HIGH)                                                                                                                                               
 {
servo.write(60);
     digitalWrite(led1, HIGH);
}
         
///////////////////////////////////////////////////////////////////////// 2

 else if (digitalRead(prevPin) == HIGH)                                                                        
  {
servo.write(70;
     digitalWrite(led2, HIGH);
 }  
 
///////////////////////////////////////////////////////////////////////////  3
 else if (digitalRead(upPin) == HIGH)                                                                   
    {   
servo.write(80);         
               digitalWrite(led3, HIGH);
     } 

 Подскажите почему у меня при переключении режима когда серва меняет угол светодиод предидущего режима не гаснет а горит???

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Потому что Вы включаете следующий, но не выключаете предыдущий: digitalWrite(ledХ, LOW);

Luziy
Offline
Зарегистрирован: 16.10.2016

Добрый день.

У меня такая задача:

2 кнопки и 2 индикатора (светодиоды или реле не важно). При включении индикаторы выключены. При нажатии одной из кнопок в течении определенного времени (в коде это 600 циклов) соответствующий кнопке индикатор начинает мигать сначало медленнее, потом быстрее и еще быстрее (3 степени, от 0 до 200, от 200 до 400, и от 400 до 600), и по достижении установленного времени кнопка загорается и горит, даже при отпущенной кнопке. Если кнопку отпустить раньше времени- индикатор гаснет. Дальнейшее воздействие возможно только на другую кнопку, и там все аналогично, только если первый индикатор уже горит, то при нажатии на вторую кнопку он гаснет. Если "недодержать" вторую кнопку- загорается обратно. Чтото на подобие шахматных часов получается, только с удержанием.

Код прилагаю, но с ним чтото (я так подозреваю многое) не так :( Прошу помощи, это мой первый, полностью самописный код... Раньше только переделывал/ дописывал имеющийся под свои задачи. 

const int buttonGreen = 4;     // Задаем зеленую кнопку
const int buttonRed = 3;       // Задаем красную кнопку
const int ledGreen =  12;      // Задаем зеленый диод
const int ledRed =  13;        // Задаем красный диод
int FlagGreen = 1;             //Задаем зеленый флаг
int FlagRed = 0;               //Задаем красный флаг
int Timer = 0;                 //Задаем таймер
int FlagTimer = 0;                 //Задаем таймер
int Timer2 = 0;                 //Задаем таймер 2
int FlagTimer2 = 0;                 //Задаем таймер
int buttonStateGreen = 0;       // Считываем состояние зеленой кнопки
int buttonStateRed = 0;         // Считываем состояние красной кнопки

void setup() {
  // Инициализируем контакты под диоды как выходы:
  pinMode(ledGreen, OUTPUT);
  pinMode(ledRed, OUTPUT);
  Serial.begin(9600);
  // Инициализируем контакты под кнопки как входы:
  pinMode(buttonGreen, INPUT);
  pinMode(buttonRed, INPUT);
}

void loop() {

  // Считываем состояние кнопок:
  buttonStateGreen = digitalRead(buttonGreen);
  buttonStateRed = digitalRead(buttonRed);

  // Мониторим все
  Serial.print(buttonStateGreen);
  Serial.print(" ");
  Serial.print(buttonStateRed);
  Serial.print(" | ");
  Serial.print(Timer);
  Serial.print(" ");
  Serial.print(Timer2);
  Serial.print(" | ");
  Serial.print(FlagTimer);
  Serial.print(" ");
  Serial.print(FlagTimer2);
  Serial.print(" ");
  Serial.print(FlagGreen);
  Serial.print(" ");
  Serial.println(FlagRed);

  // Проверяем статус зеленой кнопки.
  if (FlagGreen == 0 && buttonStateGreen == LOW) {  // Если кнопка нажата (Инвертируем, т.к. кнопка у меня на размыкание) И если зеленый диод не горит
    FlagTimer = 1;
    FlagTimer2 = 1;
    if (FlagTimer >= 1)    {
      Timer ++;
    }
    else {
      Timer = 0;
    }
    if (FlagTimer2 >= 1)    {
      Timer2 ++;
    }
    else {
      Timer2 = 0;
    }

    if (Timer2 >= 600) {
      FlagTimer = 0;
      FlagTimer2 = 0;
      if (FlagTimer >= 1)    {
        Timer ++;
      }
      else {
        Timer = 0;
      }
      if (FlagTimer2 >= 1)    {
        Timer2 ++;
      }
      else {
        Timer2 = 0;
      }
      FlagGreen = 1;
      FlagRed = 0;
    }
    else if (Timer2 >= 400) {
      if (Timer2 == 25) {
        if (ledGreen == LOW) {
          digitalWrite(ledGreen, HIGH);
          Timer2 = 25;
        }
        else {
          digitalWrite(ledGreen, LOW);
          Timer2 = 0;
        }
      }
    }
    else if (Timer2 >= 200) {
      if (Timer2 == 50) {
        if (ledGreen == LOW) {
          digitalWrite(ledGreen, HIGH);
          Timer2 = 0;
        }
        else {
          digitalWrite(ledGreen, LOW);
          Timer2 = 0;
        }
      }
    }
    else if (Timer2 >= 0) {
      if (Timer2 == 100) {
        if (ledGreen == LOW) {
          digitalWrite(ledGreen, HIGH);
          Timer2 = 0;
        }
        else {
          digitalWrite(ledGreen, LOW);
          Timer2 = 0;
        }
      }
    }
  }
  else if (buttonStateGreen == HIGH) {
    FlagTimer = 0;
    FlagTimer2 = 0;
    if (FlagTimer >= 1)    {
      Timer ++;
    }
    else {
      Timer = 0;
    }
    if (FlagTimer2 >= 1)    {
      Timer2 ++;
    }
    else {
      Timer2 = 0;
    }
  }

  // Проверяем статус красной кнопки кнопки.
  if (FlagRed == 0 && buttonStateRed == LOW) {  // И если зеленый диод не горит Если кнопка нажата (Инвертируем, т.к. кнопка у меня на размыкание)
    FlagTimer = 1;
    FlagTimer2 = 1;
    if (Timer2 >= 600) {
      FlagTimer = 0;
      FlagTimer2 = 0;
      if (FlagTimer >= 1)    {
        Timer ++;
      }
      else {
        Timer = 0;
      }
      if (FlagTimer2 >= 1)    {
        Timer2 ++;
      }
      else {
        Timer2 = 0;
      }
      FlagGreen = 0;
      FlagRed = 1;
    }
    else if (Timer2 >= 400) {
      if (Timer2 == 25) {
        if (ledRed == LOW) {
          digitalWrite(ledRed, HIGH);
          Timer2 = 25;
        }
        else {
          digitalWrite(ledRed, LOW);
          Timer2 = 0;
        }
      }
    }
    else if (Timer2 >= 200) {
      if (Timer2 == 50) {
        if (ledRed == LOW) {
          digitalWrite(ledRed, HIGH);
          Timer2 = 0;
        }
        else {
          digitalWrite(ledRed, LOW);
          Timer2 = 0;
        }
      }
    }
    else if (Timer2 >= 0) {
      if (Timer2 == 100) {
        if (ledRed == LOW) {
          digitalWrite(ledRed, HIGH);
          Timer2 = 0;
        }
        else {
          digitalWrite(ledRed, LOW);
          Timer2 = 0;
        }
      }
    }
  }
  else if (buttonStateRed == HIGH) {
    FlagTimer = 0;
    FlagTimer2 = 0;
    if (FlagTimer >= 1)    {
      Timer ++;
    }
    else {
      Timer = 0;
    }
    if (FlagTimer2 >= 1)    {
      Timer2 ++;
    }
    else {
      Timer2 = 0;
    }
  }

  //Управление светодиодами с помощью флагов
  if (FlagGreen == 0)  {
    digitalWrite(ledGreen, LOW);
  }
  else if (FlagGreen == 1)  {
    digitalWrite(ledGreen, HIGH);
  }
  if (FlagRed == 0)  {
    digitalWrite(ledRed, LOW);
  }
  else if (FlagRed == 1)  {
    digitalWrite(ledRed, HIGH);
  }

  delay (1);
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Luziy Мой код.

/* шахматные часы
#1 кнопка  1  -> A1(btn1_pin) 0  нажата / 1 нет
          GND -> GND
#2 кнопка  2  -> A2(btn2_pin) 0  нажата / 1 нет
          GND -> GND
#3 светодиод 1-> 12(led1_pin) 0 горит / 1 нет
          Ucc -> Ucc
#4 светодиод 2-> 11(led2_pin) 0 горит / 1 нет
          Ucc -> Ucc
*/
//#1
const int btn1_pin = A1;
uint8_t btn1, btn1_old; //нажатие кнопки
//#2
const int btn2_pin = A2;
uint8_t btn2, btn2_old; //нажатие кнопки
//#3
const int led1_pin = 12;
uint8_t led1; //  0 горит / 1 нет
uint8_t led1_value;// 0 не горит 1 мигает медлено 2 мигает быстрее 4 мигает еще быстрее 5 всегда горит
//#4
const int led2_pin = 11;
uint8_t led2; //  0 горит / 1 нет
uint8_t led2_value;// 0 не горит 1 мигает медлено 2 мигает быстрее 4 мигает еще быстрее 5 всегда горит
//#5
uint8_t match = 0;
/* 0 - led1 и led2 погашены ;1-нажата кнопка btn1;2 - led1 медлено мигает и led2 погашен ;
3 - led1 средне мигает и led2 погашен;4 - led1 быстро мигает и led2 погашен;5 - led1 горит и led2 погашен;
6-нажата кнопка btn2;7 - led2 медлено мигает и led1 погашен;8 - led2 средне мигает и led1 погашен;
9 - led2 быстро мигает и led1 погашен;10 - led2 горит и led1 погашен;
*/

void setup() {
  //#1
  pinMode(btn1_pin, INPUT_PULLUP);
  //#2
  pinMode(btn2_pin, INPUT_PULLUP);
  //#3
  pinMode(led1_pin, OUTPUT);
  digitalWrite(led1_pin, led1 = 1); // погасить светодиод
  led1_value = 0; // светодиод погашен и не мигает
  //#4
  pinMode(led2_pin, OUTPUT);
  digitalWrite(led2_pin, led2 = 1); // погасить светодиод
  led2_value = 0; // светодиод погашен и не мигает
  //#5
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  static uint32_t future5 = 0 ;
  // #1 кнопка 1
  static uint32_t future1 = 0 ;
  if (MILLIS >= future1)   {
    future1 = MILLIS + 200 ;
    btn1_old = btn1;
    btn1 = digitalRead(btn1_pin);
    if (btn1_old && !btn1) { // если кнопка только что нажалась
      match = 1;
      future5 = MILLIS ;
    }
  }
  // #2 кнопка 2
  static uint32_t future2 = 0 ;
  if (MILLIS >= future2)   {
    future2 = MILLIS + 200 ;
    btn2_old = btn2;
    btn2 = digitalRead(btn2_pin);
    if (btn2_old && !btn2) { // если кнопка только что нажалась
      match = 6;
      future5 = MILLIS ;
    }
  }
  //#3 светодиод 1
  static uint32_t future3 = 0 ;
  if (MILLIS >= future3)   {
    switch (led1_value) {
      case 0:
        future3 = MILLIS + 200 ;
        digitalWrite(led1_pin, led1 = 1); // погасить светодиод
        break;
      case 1:
        future3 = MILLIS + 400 ;
        digitalWrite(led1_pin, led1 = !led1); // перелючить светодиод
        break;
      case 2:
        future3 = MILLIS + 200 ;
        digitalWrite(led1_pin, led1 = !led1); // перелючить светодиод
        break;
      case 3:
        future3 = MILLIS + 100 ;
        digitalWrite(led1_pin, led1 = !led1); // перелючить светодиод
        break;
      case 4:
        future3 = MILLIS + 200 ;
        digitalWrite(led1_pin, led1 = 0); // всегда горит
        break;
    }
  }
  //#4 светодиод 2
  static uint32_t future4 = 0 ;
  if (MILLIS >= future4)   {
    switch (led2_value) {
      case 0:
        future4 = MILLIS + 200 ;
        digitalWrite(led2_pin, led2 = 1); // погасить светодиод
        break;
      case 1:
        future4 = MILLIS + 400 ;
        digitalWrite(led2_pin, led2 = !led2); // перелючить светодиод
        break;
      case 2:
        future4 = MILLIS + 200 ;
        digitalWrite(led2_pin, led2 = !led2); // перелючить светодиод
        break;
      case 3:
        future4 = MILLIS + 100 ;
        digitalWrite(led2_pin, led2 = !led2); // перелючить светодиод
        break;
      case 4:
        future4 = MILLIS + 200 ;
        digitalWrite(led2_pin, led2 = 0); // всегда горит
        break;
    }
  }
  //#5
  // static uint32_t future5 = 0 ; перенесено в начало
  if (MILLIS >= future5)   {
    switch (match) {
      case 0: //0 - led1 и led2 погашены
        future5 = MILLIS + 200 ;
        break;

      case 1://нажата кнопка btn1
        future5 = MILLIS + 5000 ;
        match = 2;
        led1_value = 1;
        led2_value = 0;
        break;
      case 2://led1 медлено мигает и led2 погашен
        future5 = MILLIS + 5000 ;
        match = 3;
        led1_value = 2;
        break;
      case 3://led1 средне мигает и led2 погашен
        future5 = MILLIS + 5000 ;
        match = 4;
        led1_value = 3;
        break;
      case 4://led1 быстро мигает и led2 погашен
        future5 = MILLIS + 5000 ;
        match = 5;
        led1_value = 4;
        break;
      case 5://led1 горит и led2 погашен
        future5 = MILLIS + 5000 ;
        break;

      case 6://нажата кнопка btn2
        future5 = MILLIS + 5000 ;
        match = 7;
        led2_value = 1;
        led1_value = 0;
        break;
      case 7://led2 медлено мигает и led1 погашен
        future5 = MILLIS + 5000 ;
        match = 8;
        led2_value = 2;
        break;
      case 8://led2 средне мигает и led1 погашен
        future5 = MILLIS + 5000 ;
        match = 9;
        led2_value = 3;
        break;
      case 9://led2 быстро мигает и led1 погашен
        future5 = MILLIS + 5000 ;
        match = 10;
        led2_value = 4;
        break;
      case 10://led2 горит и led1 погашен
        future5 = MILLIS + 5000 ;
        break;
    }
  }
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Luziy пишет:

Всем спасибо, сам разобрался.

Хорошо что разобрались!!! Ноя всетаки я покажу Вам свой код по решению Вашей задачи, озвученой в первом посте, так как я его все равно уже написал  


#define buttonGreen 4     // Задаем зеленую кнопку
#define buttonRed 3       // Задаем красную кнопку
#define ledGreen 12      // Задаем зеленый диод
#define ledRed 13        // Задаем красный диод
bool FlagGreen = 0;             //Задаем зеленый флаг
bool FlagGreen2 = 0;
bool FlagRed = 0;               //Задаем красный флаг
bool FlagRed2 = 0;
int Timer = 300;                 //Задаем таймер
bool buttonStateGreen = 0;       // Считываем состояние зеленой кнопки
bool buttonStateRed = 0;         // Считываем состояние красной кнопки

//функция паузы или дребезга, с разным временем опроса

unsigned long currentPause[5];   //массив данных. Количество элементов - количеству таймеров
bool fl_pause[5];//массив данных. Количество элементов - количеству таймеров

boolean my_pausa(unsigned long time, byte nomer)   //функция таймер, time-время задержки, nomer-номер таймера
{
  bool x = 0;
  if (fl_pause[nomer] == 0)currentPause[nomer] = millis(), fl_pause[nomer] = 1;
  if (millis() - currentPause[nomer] >= time) x = 1, fl_pause[nomer] = 0;
  return x;
}

//Функция сброса
void sbros() {
  fl_pause[0] = 0;
  fl_pause[3] = 0;
  Timer = 300;
}

void setup() {
  // Инициализируем контакты под диоды как выходы:
  pinMode(ledGreen, OUTPUT);
  pinMode(ledRed, OUTPUT);
  // Инициализируем контакты под кнопки как входы:
  pinMode(buttonGreen, INPUT_PULLUP); //  пин, как вход + подтягивающий резистор
  pinMode(buttonRed, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop () {
  //////////////

  ///////////////
  //Проверяем кнопку Green
  if (digitalRead(buttonGreen) == 0) {
    if (FlagGreen == 0) fl_pause[1] = 0, FlagGreen = 1;
    if (!buttonStateGreen) buttonStateGreen = my_pausa (5, 1); // Отправляем в Функцию дребезга
  }

  if (digitalRead(buttonGreen) == 1) {
    if (FlagGreen == 1) fl_pause[1] = 0, FlagGreen = 0;
    if (buttonStateGreen)buttonStateGreen = !my_pausa (5, 1); // Отправляем в Функцию дребезга
  }
  //Проверяем кнопку Red
  if (digitalRead(buttonRed) == 0) {
    if (FlagRed == 0) fl_pause[2] = 0, FlagRed = 1;
    if (!buttonStateRed) buttonStateRed = my_pausa (5, 2); // Отправляем в Функцию дребезга
  }

  if (digitalRead(buttonRed) == 1) {
    if (FlagRed == 1) fl_pause[2] = 0, FlagRed = 0;
    if (buttonStateRed)buttonStateRed = !my_pausa (5, 2); // Отправляем в Функцию дребезга
  }
  //////Обработка ЗЕЛЕНОГО кода
  if (FlagGreen2 == 0) {
    if (buttonStateGreen) {
      if (FlagRed2)digitalWrite(ledRed, LOW);
      if (!my_pausa(3000, 0)) {
        if (my_pausa(Timer, 3)) digitalWrite(ledGreen, !digitalRead(ledGreen));
        if (my_pausa(1000, 4))Timer -= 50;
      }
      else {
        sbros();
        digitalWrite(ledGreen, HIGH);
        FlagGreen2 = 1;
        FlagRed2 = 0;
      }
    }
    else {
      digitalWrite(ledGreen, LOW);
      if (FlagRed2)digitalWrite(ledRed, HIGH);
    }
    if (!buttonStateGreen && !buttonStateRed) sbros();
  }

  //////Обработка КРАСНОГО кода
  if (FlagRed2 == 0) {
    if (buttonStateRed) {
      if (FlagGreen2)digitalWrite(ledGreen, LOW);
      if (!my_pausa(3000, 0)) {
        if (my_pausa(Timer, 3)) digitalWrite(ledRed, !digitalRead(ledRed));
        if (my_pausa(1000, 4))Timer -= 50;
      }
      else {
        sbros();
        digitalWrite(ledRed, HIGH);
        FlagRed2 = 1;
        FlagGreen2 = 0;
      }
    }
    else {
      digitalWrite(ledRed, LOW);
      if (FlagGreen2)digitalWrite(ledGreen, HIGH);
    }
    if (!buttonStateGreen && !buttonStateRed) sbros();
  }
}

 

ROTOR001
Offline
Зарегистрирован: 21.10.2016

Прошу помощи в написании программы, умные люди посоветовали, но я всю голову сломал как это должно выглядеть

Во внешнемм прерывании attachinterrupt инкрементируешь ++ переменную счётчика, в главном цикле проверяешь значение, если значение больше или равно нужному количеству, записываешь на вход реле еденицу, в противном случае записываешь 0

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ROTOR001 Смотри на этот код. А потом, как скультор убкри лишнее.

http://arduino.ru/forum/programmirovanie/takhometr-na-arduino-pro-mini-o...

ROTOR001
Offline
Зарегистрирован: 21.10.2016
 #include <Wire.h>
unsigned long lastflash;
int RPM;
  void setup() {
  Serial.begin(9600); //открыть порт
  attachInterrupt(0, sens, ); //подключить прерывание на 2 пин при повышении сигнала
  pinMode(3, OUTPUT); //3 пин как выход
  digitalWrite(3, HIGH); //подать 5 вольт на 3 пин
  }
  void sens() {
  RPM = 60 / ((float)(micros() - lastflash) / 1000000); //расчет
  lastflash = micros(); //запомнить время последнего оборота
  }
  void loop() {
  if ((micros() - lastflash) > 1000000) { //если сигнала нет больше секунды
  RPM = 0; //считаем что RPM 0
  }

  сенсор sens в моём случае датчик холла я так понял цеплять на 2 пин? и я не вижу переменной счётчика, куда тут её вставлять?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Я этот код говорил 

/*
#1 датчик Холла    Ucc ->  Ucc   можно на прямую к +5В подключить
                   Sens-> 2  (Sens_pin)
                   GND -> GND
#2 I2C LCD1602      GND -> GND
                    +5V -> +5V
                    SDA -> A4(SDA)
                    SCL -> A5(SCL)
#3 кнопка 1            -> 3 (Btn1_pin) 0-нажата/ 1 нет  кнопка Select показ редактирование
                   GND -> GND
   кнопка 2            -> 4 (Btn2_pin) + 20
                   GND -> GND
   кнопка 3            -> 5 (Btn3_pin)  -20
                   GND -> GND

*/
//#1
volatile unsigned long count;// счетчик оборотов
unsigned long RPM = 0; // обороты в минуту
unsigned long RPM_max  = 7500;// максим величина оборотов которые можно отобразить.
uint16_t RPM_max_min  = 1000;// максим величина оборотов до которых можно опустится.

void sens() {   // функция в прерывании
  count++;
}
//#2 дисплей
const int time_update2 = 500; // обновление дисплея в миллисекундах
uint8_t mode_edit = 0; // установка режимов отображение 0 показавать обороты/ 1 показывать какие максим обороты можно поставить
uint16_t RPM_step = RPM_max / 16; // максим величина на количество знакомест в LCD
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей
uint8_t sign_0[8] = {   0,    0,    0,    0,    0,    0,    0};
uint8_t sign_1[8] = {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10};
uint8_t sign_2[8] = {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18};
uint8_t sign_3[8] = {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C};
uint8_t sign_4[8] = {0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E};
uint8_t sign_5[8] = {0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F};

//#3 кнопки
const int Btn1_pin = 3; // пин ноги кнопка 1
uint8_t   Btn1, Btn1_old; // состояние кнопики новое и старое
const int Btn2_pin = 4; // пин ноги кнопка 2
uint8_t   Btn2, Btn2_old; // состояние кнопики новое и старое
const int Btn3_pin = 5; // пин ноги кнопка 3
uint8_t   Btn3, Btn3_old; // состояние кнопики новое и старое


void setup() {
  //#1
  attachInterrupt(0, sens, RISING); //подключить прерывание на 2 пин при повышении сигнала
  //#2
  lcd.init()             ;
  lcd.backlight()        ; // Включаем подсветку дисплея
  lcd.createChar(0, sign_0);// создаем символ и записываем его в память LCD
  lcd.createChar(1, sign_1);
  lcd.createChar(2, sign_2);
  lcd.createChar(3, sign_3);
  lcd.createChar(4, sign_4);
  lcd.createChar(5, sign_5);
  //#3
  pinMode(Btn1_pin, INPUT_PULLUP); //инициализировать кнопку 1
  Btn1 = digitalRead(Btn1_pin);
  pinMode(Btn2_pin, INPUT_PULLUP); //инициализировать кнопку 2
  Btn2 = digitalRead(Btn2_pin);
  pinMode(Btn3_pin, INPUT_PULLUP); //инициализировать кнопку 3
  Btn3 = digitalRead(Btn3_pin);
}
void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1
  //#2 0,500 секунды дисплей
  static uint32_t future2 = 0 ;
  if (MILLIS >= future2) {
    future2 = MILLIS + time_update2 ;
    RPM = (unsigned long)count * 60000 / time_update2; // обороты в минуту
    count = 0; //сбросить счетчик
    lcd.clear();
    switch (mode_edit) {
      case 0:
        lcd.print("RPM: ");
        lcd.print(RPM);
        lcd.print("  ob/m.");
        lcd.setCursor(0, 1);
        for (int i = 1; i <= RPM / RPM_step; i++)
          lcd.write(byte(5));
        lcd.write(byte(RPM % RPM_step) * 5 / RPM_step);
        break;
      case 1:  
        lcd.print("Edit RPMmax");
        lcd.setCursor(0, 1);
        lcd.print(RPM_max);
        lcd.print(" ob/m");
        break;
    }
  }
  //#3 0,200 секунды кнопки
  static uint32_t future3 = 0 ;
  if (MILLIS >= future3) {
    future3 = MILLIS + 200 ;
    Btn1_old = Btn1;
    Btn1 = digitalRead(Btn1_pin);
    Btn2_old = Btn2;
    Btn2 = digitalRead(Btn2_pin);
    Btn3_old = Btn3;
    Btn3 = digitalRead(Btn3_pin);
    if (Btn1_old && ! Btn1) { // если нажата кнопка select старое состояние 1 новое состояние 0, значит кнопка нажата только что
      mode_edit = !mode_edit;
    }
    if (mode_edit && Btn2_old && ! Btn2) { // если нажата кнопка +20 в режиме редактирования
      RPM_max  = RPM_max + 20;
      RPM_step = RPM_max / 16;
    }
    if (mode_edit && Btn3_old && ! Btn3) { // если нажата кнопка -20 в режиме редактирования
      RPM_max  = RPM_max - 20;
      if (RPM_max < RPM_max_min ) RPM_max = RPM_max_min ;
      RPM_step = RPM_max / 16;
    }
  }
}

А вот код счетчиком 

void sens() {   // функция в прерывании
  count++;
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А вот как снимаются показания


  //#2 0,500 секунды дисплей
  static uint32_t future2 = 0 ;
  if (MILLIS >= future2) {
    future2 = MILLIS + time_update2 ;
    RPM = (unsigned long)count * 60000 / time_update2; // обороты в минуту
    count = 0; //сбросить счетчик
  }
  

 

gzp13
Offline
Зарегистрирован: 06.04.2015
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
const int buttonPin = 3;     // the number of the pushbutton pin
const int ledPin =  13; 
int buttonState = 0;  
int flag=0; 
void setup()
{
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  pinMode(13, OUTPUT);
  lcd.init();                      // initialize the lcd 
  lcd.clear();
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0,0);
 
  
}


    void loop()
{
    if(digitalRead(3)==HIGH&&flag==0)
  {
    lcd.clear();
    lcd.print("altitude");
    digitalWrite(13,!digitalRead(13)); 
    flag=1;
   }
  

    if(digitalRead(3)==LOW&&flag==1)//
   {
    lcd.clear();
    lcd.print("time");
    flag=0;
   }
}



Здравствуйте, я начинающий) Собираю простую метеостанцию, так вот, хочу на дисплее 1602 на одной страничке выводить информацию о температуре, давлении,  на другой странице высоту, на третьей время. С выводом информации на первую страницу проблем не возникло, а вот как создать вторую страницу и последующую ума не приложу, два дня бьюсь и все бестолку((( Вообщем задача такая, после включения выводится первая страничка с информацией о погоде(у меня это страница altitude для примера), при нажатии на кнопку должна загрузиться вторая страница( у меня она называется TIME) и остаться на экране до следующего нажатия на кнопку, с которой у меня возникли проблемы. Помогите. Нужно кусок кода который я не соображу как написать как я понимаю вставить в свой скетч.Как я понимаю это элементарно, но у меня не получается...Замечу что светодиод на 13 пине работает как положено, при нажимании и отпускании загорается, при повторном нажимпнии и отпускании-тухнет.А вот страничка altitude при нажатии включается, а при отпускании не сохраняется а переключается на страницу time и так бесконечно.

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

По настройке не проверял но по экранам попробуйте так

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
const int buttonPin = 3;     // the number of the pushbutton pin
const int ledPin =  13;
int buttonState = 0;
bool flag = 0;
int ekran = 1;

void setup()
{
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  pinMode(13, OUTPUT);
  lcd.init();                      // initialize the lcd
  lcd.clear();
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0, 0);
}


void loop()
{
  if (digitalRead(3) == HIGH && flag == 0)
  {
    ekran ++;
    if (ekran >= 3)ekran = 1;
    flag = 1;
    digitalWrite(13, !digitalRead(13));
  }

  if (digitalRead(3) == LOW && flag == 1) //
  {
    flag = 0;
  }

  if (ekran == 1)
  {
    lcd.clear();
    lcd.print("altitude");
  }

  if (ekran == 2)
  {
    lcd.clear();
    lcd.print("time");
  }

  if (ekran == 3)
  {
    lcd.clear();
    lcd.print("?????");
  }
}

 

gzp13
Offline
Зарегистрирован: 06.04.2015
#include <OneWire.h>
#include <Adafruit_BMP085.h>
#include "DHT.h"
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 Adafruit_BMP085 bmp;
#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT11 


DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27,16,2);
const int buttonPin = 3;     // the number of the pushbutton pin
const int ledPin =  13;
int buttonState = 0;
bool flag = 0;
int ekran = 1;

void setup(void) {
   sensors.begin(); 
          Serial.begin(9600);
       lcd.init();                      // initialize the lcd
  lcd.clear();
  lcd.begin(16, 2);
   lcd.backlight();
  //lcd.print("Reading sensors");
    dht.begin();
   if (!bmp.begin()) {
  Serial.println("Could not find a valid BMP085 sensor, check wiring!");
  while (1) {}
  }
}


void loop() 
{
  sensors.requestTemperatures(); 
    float humidity;
   humidity = dht.readHumidity()+10.0f; 
     char humF[6]; 
      dtostrf(humidity, 2, 0, humF);
     
   //Printing Temperature
   if (digitalRead(3) == HIGH && flag == 0)
  {
    //lcd.clear();
  lcd.print("T:"); 
 lcd.print(bmp.readTemperature());
 lcd.print((char)223);
 lcd.print("C ");
 lcd.print("H: ");
 lcd.print(humF);
 lcd.print("%");
 lcd.setCursor(0,1);
 lcd.print("P: "); 
 lcd.print(bmp.readPressure()/133.3);
 lcd.print(" mmHg ");
    ekran ++;
    if (ekran >= 4)ekran = 1;
    flag = 1;
  }
if (digitalRead(3) == LOW && flag == 1) //
  {
     flag = 0;
  }
      
  if (ekran == 1)
  {       //вывод метеоинформации
  lcd.clear();
  lcd.print("T:"); 
 lcd.print(bmp.readTemperature());
 lcd.print((char)223);
 lcd.print("C ");
 lcd.print("H:");
 lcd.print(sensors.getTempCByIndex(0));
 lcd.print("%");
 lcd.setCursor(0,1);
 lcd.print("P: "); 
 lcd.print(bmp.readPressure()/133.3);
 lcd.print(" mmHg ");
  }
  
  
  
  if (ekran == 2)
  {                     //вывод температуры наружного воздуха
    lcd.clear();
    lcd.print("OUT TEMP ");
    lcd.print(sensors.getTempCByIndex(0));
    lcd.print((char)223);
    lcd.print("C "); 
    
  
  
  }

  if (ekran == 3)
  {                    //вывод влажности
    lcd.clear();
    lcd.print("Humidity");
    lcd.print(humF);
 lcd.print("%"); 
  }

  

 //Serial.print("Altitude = ");
   //Serial.print(bmp.readAltitude());
    //Serial.println(" meters");

    //Serial.print("Pressure at sealevel (calculated) = ");
    //Serial.print(bmp.readSealevelPressure()/133.3);
    //Serial.println(" mm");

    //Serial.print("Temperature = ");
    //Serial.print(bmp.readTemperature());
    //Serial.println(" *C");
    
    //Serial.print("Pressure = ");
    //Serial.print(bmp.readPressure()/133.3);
    //Serial.println(" Pa");

  
    //delay(500);
  }

Vosara , спасибо, помогли, кое что получилось, но вот переключение страниц идет с задержкой, я так понимаю пока опросятся датчики,пока выполнятся другие команды. А мне надо чтобы переключение было моментальным, потому что хочу сделать задержеку опроса датчиков с помощью DELAY хотя бы минуту, зачем их опрашивать каждые 5 секунд, для погоды это ведь не актуально. Наверно надо делать переключение страниц с помощью оператора SWITCH, или еще как,может кто подскажет. Код прилагаю.

Sigla
Sigla аватар
Offline
Зарегистрирован: 11.11.2016

Привет всем, извините за глупый вопрос Я толко начинаю в ARDUINO, как ето эделать на две кнопки и два LED?

"Алгоритм такой. Нажали кнопку – загорелся светодиод, удерживаем кнопку – ничего не происходит (светодиод горит). Отпустили кнопку – светодиод горит.
Для того чтобы погасить светодиод нужно повторно нажать кнопку.
Т.е. нажали – горит, отпустили, нажали – не горит."

int flag=0; 

void setup()    
{ 
       
    pinMode(13, OUTPUT);         
      
        
} 

void loop() 

{ 
        
     if(digitalRead(14)==HIGH&&flag==0)//если кнопка нажата    
     // и перемення flag равна 0 , то ... 
     { 
           
       digitalWrite(13,!digitalRead(13)); 
       flag=1; 
        //это нужно для того что бы с каждым нажатием кнопки 
        //происходило только одно действие 
        // плюс защита от "дребезга"  100% 
        
     } 
        
      if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
     { 
           
        flag=0;//обнуляем переменную flag 
     } 
} 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Sigla Код такой . Но не для начинающего.

/*
#1 кнопка 1 -> 2 (btn1_pin) 0 нажата / 1 нет
            -> GND
  светодиод 1 -> 3 (led1_pin) 0 горит / 1 нет
             ->Ucc
#2 кнопка 2 -> 4 (btn1_pin) 0 нажата / 1 нет
            -> GND
  светодиод 2 -> 5 (led1_pin) 0 горит / 1 нет
             ->Ucc
*/
// #1
const int btn1_pin = 2; // нога кнопки 1
uint8_t btn1 = 0xFF; // сoстояние кнопки 1
const int led1_pin = 3; // светодиода 1
uint8_t led1 ; // сoстояние светодиода 1
// #2
const int btn2_pin = 4; // нога кнопки 2
uint8_t btn2 = 0xFF; // сoстояние кнопки 2
const int led2_pin = 5; // светодиода 2
uint8_t led2 ; // сoстояние светодиода 2

void setup() {
  //#1
  pinMode(btn1_pin, INPUT_PULLUP);   // инициализировать
  btn1 = btn1 << 1 | digitalRead(btn1_pin);
  pinMode(led1_pin, OUTPUT);   // инициализировать светодиод
  digitalWrite(led1_pin, led1 = 1); // и погасить
  //#2
  pinMode(btn2_pin, INPUT_PULLUP);   // инициализировать
  btn2 = btn2 << 1 | digitalRead(btn1_pin);
  pinMode(led2_pin, OUTPUT);   // инициализировать светодиод
  digitalWrite(led2_pin, led2 = 1); // и погасить
}

void loop() {
  //#1
  static uint32_t past_1 = 0 ;
  if (millis() - past_1 >= 200) { // если прошло 200 миллисек
    past_1 = millis() ;
    btn1 = btn1 << 1 | digitalRead(btn1_pin);
    if  ((btn1 & 3) == 2) digitalWrite(led1_pin, led1 = ! led1);
  }
  //#2
  static uint32_t past_2 = 0 ;
  if (millis() - past_2 >= 200) { // если прошло 200 миллисек
    past_2 = millis() ;
    btn2 = btn2 << 1 | digitalRead(btn2_pin);
    if  ((btn2 & 3) == 2) digitalWrite(led2_pin, led2 = ! led2);
  }
}

 

Sigla
Sigla аватар
Offline
Зарегистрирован: 11.11.2016

Что не так? :(

хотелось чтобы включилось реле и лед мигал.

/* Генерация меандра на Pin 9 
 * с периодом 1 сек.
 */

# define period 1000                // период меандра в миллисекундах

void setup() {
  pinMode(9, OUTPUT);// LED
  pinMode(10, OUTPUT);// Relay
  pinMode(2, INPUT); // Кнопка
  Serial.begin(115200);
  }
   
  void loop() {
 if (digitalRead(2)==1)
{
  digitalWrite(9, 1);
    Serial.println(1);
    delay(period/2);
    digitalWrite(9, 0);
    Serial.println(0);
    delay(period/2);
}
else if (digitalRead(2)==1)
{ 
 digitalWrite(10, 1);
}
 else
{
 
 digitalWrite(9, 0);
 digitalWrite(10, 0);
 }
 
 }

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Могу дать код для продвинутых.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/*
#1  светодиод  -> 2 (led_pin) 0 горит / 1 нет
               ->Ucc
         реле  -> 3 (relay_pin) 1 вкл / 0 откл
               ->GND
#2 кнопка      -> 4 (btn_pin) 0 нажата / 1 нет
               -> GND
*/
// #1
const int led_pin = 2; // нога светодиода
uint8_t led ; // сoстояние светодиода
const int relay_pin = 3; // нога реле
uint8_t relay ; // сoстояние реле
// #2
const int btn_pin = 4; // нога кнопки
uint8_t btn = 0xFF; // сoстояние кнопки

void setup() {
  //#1
  pinMode(led_pin, OUTPUT);   // инициализировать светодиод
  digitalWrite(led_pin, led = 1); // и погасить
  pinMode(relay_pin, OUTPUT);   // инициализировать реле
  digitalWrite(relay_pin, relay = 0); // и выключить
  //#2
  pinMode(btn_pin, INPUT_PULLUP);   // инициализировать
  btn = btn << 1 | digitalRead(btn_pin);
}

void loop() {
  //#1 отработка мигания
  static uint32_t past_1 = 0 ;
  if (millis() - past_1 >= 500) { // если прошло 500 миллисек
    past_1 = millis() ;
    if (relay)    // если реле вкл
      digitalWrite(led_pin, led = ! led);// то светодиод переключить
  }
  //#2 отработка кнопки
  static uint32_t past_2 = 0 ;
  if (millis() - past_2 >= 200) { // если прошло 200 миллисек
    past_2 = millis() ;
    btn = btn << 1 | digitalRead(btn_pin);
    if  ((btn & 3) == 2) { // если только что нажали кнопку
      if (relay)   { // если реле вкл
        digitalWrite(relay_pin, relay = 0); // и выключить реле
        digitalWrite(led_pin, led = 1); // и погасить светодиод
      }
      else // иначе
        digitalWrite(relay_pin, relay = 1); // и включить реле
    }
  }
}

 

Sigla
Sigla аватар
Offline
Зарегистрирован: 11.11.2016

qwone пишет:

/*
#1  светодиод  -> 2 (led_pin) 0 горит / 1 нет
               ->Ucc
         реле  -> 3 (relay_pin) 1 вкл / 0 откл
               ->GND
#2 кнопка      -> 4 (btn_pin) 0 нажата / 1 нет
               -> GND
*/
// #1
const int led_pin = 2; // нога светодиода
uint8_t led ; // сoстояние светодиода
const int relay_pin = 3; // нога реле
uint8_t relay ; // сoстояние реле
// #2
const int btn_pin = 4; // нога кнопки
uint8_t btn = 0xFF; // сoстояние кнопки

void setup() {
  //#1
  pinMode(led_pin, OUTPUT);   // инициализировать светодиод
  digitalWrite(led_pin, led = 1); // и погасить
  pinMode(relay_pin, OUTPUT);   // инициализировать реле
  digitalWrite(relay_pin, relay = 0); // и выключить
  //#2
  pinMode(btn_pin, INPUT_PULLUP);   // инициализировать
  btn = btn << 1 | digitalRead(btn_pin);
}

void loop() {
  //#1 отработка мигания
  static uint32_t past_1 = 0 ;
  if (millis() - past_1 >= 500) { // если прошло 500 миллисек
    past_1 = millis() ;
    if (relay)    // если реле вкл
      digitalWrite(led_pin, led = ! led);// то светодиод переключить
  }
  //#2 отработка кнопки
  static uint32_t past_2 = 0 ;
  if (millis() - past_2 >= 200) { // если прошло 200 миллисек
    past_2 = millis() ;
    btn = btn << 1 | digitalRead(btn_pin);
    if  ((btn & 3) == 2) { // если только что нажали кнопку
      if (relay)   { // если реле вкл
        digitalWrite(relay_pin, relay = 0); // и выключить реле
        digitalWrite(led_pin, led = 1); // и погасить светодиод
      }
      else // иначе
        digitalWrite(relay_pin, relay = 1); // и включить реле
    }
  }
}

 

Спасибо!  Вы профессионал ...

kras2009
Offline
Зарегистрирован: 18.09.2016

Нужно простой код. Есть кнопка нажали сработало реле. отпустили реле выключилось. Сколько держим столько реле и включено.

код мой ниже, но не всегда правильно работает. Заранее спасибо за помощь.

int PauseButtonPress () { //функция читает аналог с кнопки пауза. если нажата то включает реле

int r2=analogRead(wheelPin1);
scd2 = 0;
 Serial.println("currButton r2=");
 Serial.println(r2);
digitalWrite(nRelayDrive, HIGH); // отключаем реле
while (analogRead(wheelPin1) > knop[2]- knop_delta && analogRead(wheelPin1)< knop[2] + knop_delta ){digitalWrite(nRelayDrive, LOW);}
       
digitalWrite(nRelayDrive, HIGH); 
delay(5);   
    return (0);        
              }

 

Sigla
Sigla аватар
Offline
Зарегистрирован: 11.11.2016


// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
void loop() {
 digitalWrite(ledPin, digitalRead(buttonPin)); // И ВСЕ!!!
}

ПС: Sigla Хороший индийский код у вас.