помогите с циклом
Недавно я увлекся программированием и бью тревогу. Не могу понять как сделать зуммер. У меня есть два мигающих светодиода и два гаснущих. Сейчас планирую включить звук, а он не работает. Он мигает только один раз и останавливается. Я также хотел бы, чтобы два гаснущих светодиода гасли в разное время. Я не могу этого понять. Вот код. 8 — зуммер, красный и синий — затухающие светодиоды.
int blue = 6;
int red = 9;
int brightness = 0;
int fadeAmount = 500;
void setup() {
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(red, OUTPUT);
pinMode(blue, OUTPUT);
pinMode(8, OUTPUT);
}
void loop() {
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
delay(200);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
delay(200);
digitalWrite(8, LOW);
digitalWrite(8, HIGH);
delay(10);
analogWrite(red, brightness);
analogWrite(blue, brightness);
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
millis();
}
@jace, 👍0
4 ответа
Посмотрите здесь, о том, как можно использовать различные периферийные устройства неблокирующим образом. Следующий код взят из ссылки:
// Эти переменные хранят шаблон flash
// и текущее состояние светодиода
int ledPin1 = 12; // номер контакта светодиода
int ledState1 = LOW; //ledState используется для установки светодиода
unsigned long previousMillis1 = 0; // сохранит время последнего обновления светодиода
long OnTime1 = 250; // миллисекунды времени включения
long OffTime1 = 750; // миллисекунды времени простоя
int ledPin2 = 13; // номер контакта светодиода
int ledState2 = LOW; //ledState используется для установки светодиода
unsigned long previousMillis2 = 0; // сохранит время последнего обновления светодиода
long OnTime2 = 330; // миллисекунды времени включения
byte brightness = 0;
byte brigthnessInterval = 10;
void setup()
{
// устанавливаем цифровой вывод как выход:
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
}
void loop()
{
// проверяем, не пора ли изменить состояние светодиода
unsigned long currentMillis = millis();
if((ledState1 == HIGH) && (currentMillis - previousMillis1 >= OnTime1))
{
ledState1 = LOW; // Выключи
previousMillis1 = currentMillis; // Вспоминаем время
digitalWrite(ledPin1, ledState1); // Обновляем фактический светодиод
}
else if ((ledState1 == LOW) && (currentMillis - previousMillis1 >= OffTime1))
{
ledState1 = HIGH; // включаем его
previousMillis1 = currentMillis; // Вспоминаем время
digitalWrite(ledPin1, ledState1); // Обновляем фактический светодиод
}
if(currentMillis - previousMillis2 >= OnTime2)
{
previousMillis2 = currentMillis; // Вспоминаем время
if (brigthness <= 254) brigthness += brigthnessInterval;
if (brigthness == 255) brigthness = 0;
analogWrite(ledPin2, brigthness);
}
}
Здесь два светодиода управляются с разными интервалами, я изменил светодиод номер 2, чтобы он загорался с интервалом, указанным в OnTime2; Однако следите за количеством затухания, потому что у аналоговой записи 255 уровней, и вы сразу увеличили его до 500. Таким же образом вы можете добавить столько интервалов, сколько захотите, и выполнять задачи псевдопараллельно.
попробуйте проанализировать этот скетч звукового сигнала
const byte TONE_PIN = 4;
const int ALARM_BEEP_1 = 4186;
const int ALARM_BEEP_2 = 4699;
const int ALARM_TONE_LENGTH = 200;
const int ALARM_TONE_PAUSE = 800;
const int ALARM_TONE_REPEAT = 6;
void setup()
{
}
void loop()
{
alarmSound();
}
void alarmSound() {
static unsigned long next = millis();
static byte count = 0;
if (millis() > next) {
next += ALARM_TONE_LENGTH;
count++;
if (count == ALARM_TONE_REPEAT) {
next += ALARM_TONE_PAUSE;
count = 0;
}
tone(TONE_PIN, (count % 2) ? ALARM_BEEP_1 : ALARM_BEEP_2, ALARM_TONE_LENGTH);
}
}
"Недавно я начал заниматься программированием" Итак, начните здесь: https://en.wikipedia.org/wiki/Divide_and_conquer_algorithm
Чтобы применить такой принцип, начните с поиска подходящего «мигающего (ОДНОГО) светодиода» в примерах Arduino IDE. Нет реальной необходимости изобретать велосипед/код, когда вы только начинаете изучать программирование, если вы не просто «вырезаете и вставляете».
Вы можете мигать светодиодом, подключенным к контакту 13, без использования какого-либо дополнительного оборудования. Затем найдите пример, делающий то же самое без использования «задержки».
У большинства новичков возникают проблемы со скрытой основной функцией Arduino и навигацией по «циклу».
Как только вы освоите функцию цикла, вы можете добавить несколько «экземпляров» мигающих светодиодов, а затем объединить эти экземпляры в подходящую функцию.
Затем используйте тот же подход к зуммеру или любому другому устройству. Удачи.
Я предложил основы в своем ответе на ваш предыдущий вопрос: «Чтобы выровнять их по фазе, вам понадобится вторая переменная яркости (и, возможно, вторая величина затухания), а также тест на увеличение/уменьшение и ограничение. для каждого светодиода."
Проще говоря, вместо brightness
вам понадобятся redBrightness
и blueBrightness
, и инициализируйте их разными значениями. .
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
Например, инициализация их значениями «0» и «128» соответственно приведет к смещению фазы светодиодов на 180 градусов, или один будет затухать, а другой затухать, при условии, что вы используете один и тот же fadeAmount для обоих. Если вы используете
redFadeAmount
и blueFadeAmount
, вы также можете заставить их исчезать с разной скоростью.
- Мигните светодиодом 5 раз с помощью цикла for
- Плохое качество звука при использовании пьезоэлемента в TinkerCad
- Как повторить другое действие внутри цикла?
- Почему мой код обрабатывает звуковой датчик так, как будто он всегда ВЫСОКИЙ?
- Как Arduino может выполнять несколько действий параллельно, не мешая друг другу?
- Как можно иметь два мигающих светодиода и один гаснущий?
- Выход из цикла while с помощью ИК-пульта для neopixel
- Как сделать так, чтобы мой пьезо-зуммер гудел только один раз без повторения?
Я попробовал это, он сказал, что звук будильника не указан в области видимости, и я не могу понять, как это исправить., @jace
вы не можете скомпилировать его в Arduino IDE? что такое «звуковой сигнал»? функция называется «alarmSound», @Juraj