помогите с циклом

Недавно я увлекся программированием и бью тревогу. Не могу понять как сделать зуммер. У меня есть два мигающих светодиода и два гаснущих. Сейчас планирую включить звук, а он не работает. Он мигает только один раз и останавливается. Я также хотел бы, чтобы два гаснущих светодиода гасли в разное время. Я не могу этого понять. Вот код. 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();
}

, 👍0


4 ответа


1

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

// Эти переменные хранят шаблон 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. Таким же образом вы можете добавить столько интервалов, сколько захотите, и выполнять задачи псевдопараллельно.

,

0

попробуйте проанализировать этот скетч звукового сигнала

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);
  }
}
,

Я попробовал это, он сказал, что звук будильника не указан в области видимости, и я не могу понять, как это исправить., @jace

вы не можете скомпилировать его в Arduino IDE? что такое «звуковой сигнал»? функция называется «alarmSound», @Juraj


-1

"Недавно я начал заниматься программированием" Итак, начните здесь: https://en.wikipedia.org/wiki/Divide_and_conquer_algorithm

Чтобы применить такой принцип, начните с поиска подходящего «мигающего (ОДНОГО) светодиода» в примерах Arduino IDE. Нет реальной необходимости изобретать велосипед/код, когда вы только начинаете изучать программирование, если вы не просто «вырезаете и вставляете».

Вы можете мигать светодиодом, подключенным к контакту 13, без использования какого-либо дополнительного оборудования. Затем найдите пример, делающий то же самое без использования «задержки».

У большинства новичков возникают проблемы со скрытой основной функцией Arduino и навигацией по «циклу».

Как только вы освоите функцию цикла, вы можете добавить несколько «экземпляров» мигающих светодиодов, а затем объединить эти экземпляры в подходящую функцию.

Затем используйте тот же подход к зуммеру или любому другому устройству. Удачи.

,

0

Я предложил основы в своем ответе на ваш предыдущий вопрос: «Чтобы выровнять их по фазе, вам понадобится вторая переменная яркости (и, возможно, вторая величина затухания), а также тест на увеличение/уменьшение и ограничение. для каждого светодиода."

Проще говоря, вместо brightness вам понадобятся redBrightness и blueBrightness, и инициализируйте их разными значениями. .

   brightness = brightness + fadeAmount;

if (brightness <= 0 || brightness >= 255) {
  fadeAmount = -fadeAmount;
}

Например, инициализация их значениями «0» и «128» соответственно приведет к смещению фазы светодиодов на 180 градусов, или один будет затухать, а другой затухать, при условии, что вы используете один и тот же fadeAmount для обоих. Если вы используете redFadeAmount и blueFadeAmount, вы также можете заставить их исчезать с разной скоростью.

,