Arduino для цикла

Я новичок в программировании Arduino. Это моя программа для 5 светодиодов и 1 кнопки. Светодиоды должны загораться до того, как я нажму кнопку. Но светодиоды запускаются сразу, даже без нажатия кнопки. Как это возможно?

int sw7=7;
int timer=500;
int start=0;
int stopp=100;
void setup()
{
  for (int opin=1;opin<6;opin++)
  {
    pinMode(opin,OUTPUT);
    pinMode(sw7,INPUT);
  }
}

void loop()
{
  if (digitalRead (sw7)==LOW)
  {
    while (start<=stopp);
  }
  {
    for (int opin=1;opin<=5;opin++)
    {
      digitalWrite(opin,HIGH);
      delay(timer);
      digitalWrite(opin,LOW);
     } 
  }
}

, 👍1

Обсуждение

как ты подключил кнопку? он выдвигается вниз?, @Juraj

Это большой переключатель галса. Одна ножка подключена к контакту 7 последовательно, другая ножка подключена к 5 В, а ножка рядом с ножкой, подключенной к контакту 7, подключена к земле. В программе нет ничего плохого? Спасибо., @user54017

Я выровнял ваш код. вы видите, что цикл for находится за пределами if для кнопки?, @Juraj

нет резистора? подключите его таким образом и используйте режим INPUT_PULLUP https://www.arduino.cc/en/Tutorial/InputPullupSerial, @Juraj

попробуйте поставить else между } {, @Gerben

@Юрай, есть резистор. Я думаю, что-то не так с кодом., @user54017

@Юрай, окей, я подключу. Я вернусь к вам, спасибо большое!, @user54017

@Гербен. недействительный цикл() { если (digitalRead (sw7) == НИЗКИЙ) { пока (старт<=стоп); } еще { для (int opin=1;opin<=5;opin++) { так?, @user54017

Как подключены светодиоды? +5 к аноду, катод к резистору, резистор к выводу? Если да, то они включаются с низким выходом и, вероятно, включаются сразу после команды pinMode. Попробуйте протестировать - добавьте заметную задержку после pinMode, посмотрите, будет ли она при включении. Если да, то установите высокий уровень выходов после pinMode, чтобы «инициализировать» их, и измените свой код, чтобы включить их с низким уровнем вместо высокого. Кроме того, использование INPUT_PULLUP на переключателе и тестирование низкого уровня вместо высокого не позволит входному сигналу переключателя плавать, когда он не нажат., @CrossRoads

почему ты запускаешь это 5 раз? pinMode(sw7,INPUT);, @jsotola

это одно и то же: «Светодиоды должны загораться до того, как я нажму кнопку». и «Светодиоды загораются немедленно»... я думаю, вам нужно отредактировать свой вопрос, @jsotola

Ваша строка while (start<=stopp); поместит ваш эскиз в бесконечный цикл. start всегда будет меньше stopp, поэтому этот цикл никогда не закончится, и ваша программа зависнет, как только она начнет выполнять этот цикл while., @Duncan C


2 ответа


0

Это скетч по вашим требованиям:

// сопоставление контактов
int pin_map[] = { 
  1,  // 0: светодиод на контакте 1
  2,  // 1: светодиод на контакте 2
  3,  // 2: светодиод на контакте 3
  4,  // 3: светодиод на контакте 4
  5,  // 4: светодиод на контакте 5
  7   // 5: кнопка (подтягивание)
};

int timeout_ms = 500;
int blink_ms = 100;

void setup()
{
  // установка контактов
  for (int opin = 0; opin < 5; opin++) pinMode(pin_map[opin], OUTPUT);
  pinMode(pin_map[5], INPUT_PULLUP);

  // ждем активации
  while (millis() < timeout_ms)
  {
    // активируем кнопкой (выкл.: подтягивание, вкл.: GND)
    if (digitalRead (pin_map[5]) == LOW) break;
  }
}


void loop()
{
  for (int opin = 0; opin < 5; opin++) 
  {
    // переключение светодиода
    int pin = pin_map[opin];
    pinMode(pin, !digitalRead(pin));
  }

  delay(blink_ms);
}

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

,

Размещение контактов светодиода и контактов переключателя в одном массиве кажется запутанным. Они делают разные вещи. Однако я вижу ценность в использовании массива для хранения назначений выводов светодиодов. Таким образом, вы можете использовать любые контакты для светодиодов, даже с прерывистыми номерами контактов., @Duncan C


2

Несколько вещей:

Вам необходимо явно установить для выходных контактов значение LOW в методе настройки.

Код для установки sw7 на ввод не должен находиться внутри цикла.

Вам, вероятно, следует подключить переключатель между sw7 и землей и использовать режим INPUT_PULLUP (в режиме INPUT_PULLUP линия подключается к +5 В через «подтягивающий резистор» так что на нем отображается ВЫСОКИЙ уровень, пока вы не нажмете кнопку, а затем отображается НИЗКИЙ. Если вы не используете входной подтягивающий или понижающий резистор, вход имеет тенденцию «плавать» и давать неверные показания.)

Вы говорите: «Светодиоды должны загораться до того, как я нажму кнопку. Но светодиоды загораются сразу, даже без нажатия кнопки».

Я не понимаю, что вы имеете в виду. Что именно вы хотите, чтобы произошло? Хотите, чтобы светодиоды горели постоянно, а затем гасли или мигали при нажатии кнопки?

Приведенный ниже код сначала отключит все светодиоды, а затем переключит их между выключением и миганием при каждом нажатии кнопки (без дребезга). Измените значение idleLEDState на HIGH, если вы хотите, чтобы светодиоды горели, когда они не мигают.

#define flashDelay 50 //Задержка между включением и выключением светодиодов
#define switchBounceDelay 100


uint8_t idleLEDState = LOW; //Изменить на ВЫСОКИЙ
                            //если вы хотите, чтобы светодиоды горели, когда не мигают
bool flashLEDs = false;
bool ledsOn = false; 
unsigned long nextFlashTime = 0;
unsigned long nextSwitchCheckTime = 0;

void setup() {
  pinMode(sw7, INPUT_PULLUP); //Подключаем переключатель между sw7 и землей
  for (int opin=1;opin<6;opin++)
  {
    pinMode(opin,OUTPUT);
    digitalWrite(opin, idleLEDState); 
  }
}

void loop() {

  //Если пришло время проверить переключатель, и он находится в НИЗКОМ положении, переключите мигающие светодиоды
  if (mills() > nextSwitchCheckTime && digitalRead(sw7) == LOW) {
    flashLEDs = !flashLEDs;
    nextSwitchCheckTime = millis() + switchBounceDelay;
  }

  if (!flashLEDs) {
    //ЕСЛИ нам не нужно мигать светодиодами, переведите их в состояние ожидания
    for (int opin=1;opin<6;opin++) {
        digitalWrite(opin, idleLEDState); 
     }
  } else if millis() > nextFlashTime {
    nextTime = millis() + flashDelay;
    ledsOn = !ledsOn;
    for (int opin=1;opin<6;opin++) {
        uint8_t newState = ledsOn ? HIGH : LOW;
        digitalWrite(opin, newState); 
     }
}

Я набрал приведенный выше код в редакторе Stack Exchange. Вероятно, оно содержит несколько опечаток. Пожалуйста, приложите некоторые усилия, чтобы исправить его и адаптировать под свои нужды, прежде чем писать ответ: «Ваш код не работает. Я получил ошибку XYZ».

,