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);
}
}
}
@user54017, 👍1
Обсуждение2 ответа
Это скетч по вашим требованиям:
// сопоставление контактов
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
Несколько вещей:
Вам необходимо явно установить для выходных контактов значение 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».
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
как ты подключил кнопку? он выдвигается вниз?, @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