Не совместимость мини кодов морганием светодиодов.

vic163-163
Offline
Зарегистрирован: 06.03.2018

Добрый день.

 Была поставлена задача при долгом удержании кнопки (например 5 сек, в реальности больше) включить Led1 и одновременно моргнуть Led2 - 1 сек. При отпускании кнопки и повторном нажатии все повторяется. Есть два небольших подходящих скетча. Каждый из которых в железе работает нормально. Но при объединении в один, не работает скетч. Не моргают светодиоды.

#define IN1 A2        // Определяем номер вывода к которому подключёна кнопка
#define Led1  11
#define Led2  9

int valBut = 0;                         // Задаем переменную, для счетчика
unsigned long PsoTime = 0;              // Зададим начальное значение для счетчика
unsigned long TimePush = 5000;                 // Время нажатия на кнопку
int Led1Pin = LOW;                         // устанавливаем начальное состояние светодиода
int flag = 0;

void setup()
{
  pinMode(IN1, INPUT);
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
}

void loop() {
  //---------срабатывание Led1------------------
  if (digitalRead(IN1) == LOW) digitalWrite(Led1, LOW);
  if (digitalRead(IN1) == HIGH)                      // если кнопка нажата
  { //
    if (millis() - PsoTime  >=  1)                // начинаем считать время нажатия используется как множитель для TimePush
    { //
      PsoTime = millis();                    //
      valBut++;                                     // с каждой миллисекундой увеличиваем значение valBut
    }
  }
  else                                                  // если кнопку отпустили, то valBut становится равным 0
  { // это необходимо для защиты от срабатывания при частых
    valBut = 0;                                      // многократных нажатиях
  }
  if (valBut >= TimePush)                              // как толькозначение valBut становится равным TimtPush
  { //
    digitalWrite(Led1, Led1Pin = ! Led1Pin);         // то инвертируем состояние Led1
  }

  //---------срабатывание Led2------------------
  if (digitalRead(Led1) == HIGH && flag == 0)
  {
    digitalWrite(Led2, !digitalRead(Led2));
    flag = 1;
  }
  if (digitalRead(Led1) == LOW && flag == 1)
  {
    flag = 0;
  }
  delay(1000);
  digitalWrite(Led2, LOW);
}

Решил сделать две независимые кнопки. Первая часть Led1 не работает, вторая часть Led2 работает.

Если записать в arduino отдельными частями, каждая отдельно работает. Модуль Arduino Nano.

Если не трудно объясните что за ерунда с несовместимостью частей скетча морганиями светодиодов.

Спасибо.

#define IN1 A2        // Определяем номер вывода к которому подключёна кнопка
#define IN2 A3
#define Led1  11
#define Led2  9

int valBut = 0;                                  // Задаем переменную, для счетчика
unsigned long PsoTime = 0;              // Зададим начальное значение для счетчика
unsigned long TimePush = 5000;                 // Время нажатия на кнопку
int Led1Pin = LOW;                         // устанавливаем начальное состояние светодиода
int flag = 0;

void setup()
{
  pinMode(IN1, INPUT);
  pinMode(IN2, INPUT);
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
}

void loop() {

  //---------срабатывание Led1------------------
  if (digitalRead(IN1) == LOW) digitalWrite(Led1, LOW);
  if (digitalRead(IN1) == HIGH)                      // если кнопка нажата
  { //
    if (millis() - PsoTime  >=  1)                // начинаем считать время нажатия
    { //
      PsoTime = millis();                    
      valBut++;                                     // с каждой миллисекундой увеличиваем значение valBut
    }
  }
  else                                                  // если кнопку отпустили, то valBut становится равным 0
  {                                                   // это необходимо для защиты от срабатывания при частых
    valBut = 0;                                      // многократных нажатиях
  }

  if (valBut >= TimePush)                              // как толькозначение valBut становится равным TimtPush
  { //
    digitalWrite(Led1, Led1Pin = ! Led1Pin);         // то инвертируем состояние Led1
  }
 


  //---------срабатывание Led2------------------
  if (digitalRead(IN2) == HIGH && flag == 0)
  {
    digitalWrite(Led2, !digitalRead(Led2));
    flag = 1;
  }
  if (digitalRead(IN2) == LOW && flag == 1)
  {
    flag = 0;
  }
  delay(1000);
  digitalWrite(Led2, LOW); 
 
}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Уважаемый, рассмотрим 1 вариант. Начиная со строки 38 - бред. Вам надо мигнуть, так мигайте в if после 35 строки - там уже все проверено.

Да и почему просто не написать

36  digitalWite(Led2, HIGH);
 
37   delay(1000);
38   digitalWrite(Led2, LOW);

 

К чему такие сложности?

 

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

vic163-163 пишет:
Если не трудно объясните что за ерунда с несовместимостью частей скетча морганиями светодиодов.
Пока вы не научитесь писать без delay() , то у Вас всегда будет несовместимость с Ардуиной.

ПС:#5

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Малость ошибся

20 строка: if (digitalRead(IN1) == LOW) {

digitalWrite(Led1, LOW);

flag=0;

}

и 36 строка:

 

if(!flag) digitalWite(Led2, HIGH);

flag=1

и т.д.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mykaida пишет:

Начиная со строки 38 - бред. 

Почему только с 38-ой?

А 23-я (в превом коде, вот втором она - 26-ая) чем хуже?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ЕвгенийП пишет:

Почему только с 38-ой?

А 23-я (в превом коде, вот втором она - 26-ая) чем хуже?

Тут я принял за эстетство :)

Хотя проще по новой написать, чем ЭТО править