Как сохранить работу одной функции до тех пор, пока переменная не будет завершена?

Цель кода - переключиться с одного светодиода на другой, если LDR обнаруживает определенный уровень освещенности в течение заданного времени. В настоящее время, поскольку я не могу ждать 5 минут для завершения одного цикла, каждый светодиод должен гореть в течение 1000 мс. На одном этапе кода светодиоды не горят. Светодиоды не должны включаться до тех пор, пока LDR не обнаружит отсутствие света, а затем уровни освещения, необходимые для перезапуска кода.

Вот этот код;

const int buzzer=3;
const int ldr = A4; 

void setup () {
    Serial.begin(9600);
    pinMode(13, OUTPUT);
    pinMode(12, OUTPUT);
    pinMode(buzzer, OUTPUT);
    pinMode(ldr, INPUT);
}

void loop() {
    int ldrStatus = analogRead(ldr);  

    if (ldrStatus >= 300) { 
        digitalWrite(13, HIGH); 
        delay(1000);
    } else {
        noTone(buzzer); 
        digitalWrite(13, LOW); 
        digitalWrite(12, LOW);
    }

    if (ldrStatus >= 300) {
        digitalWrite(13, LOW);
        digitalWrite(12, HIGH);
        tone(buzzer, 100, 30);
        delay(1000);
        tone(buzzer, 100);
        digitalWrite(12, LOW);
        digitalWrite(13, LOW);
    } else {
        noTone(buzzer);
        digitalWrite(13, LOW);
        digitalWrite(12, LOW);
    }
}

Я понял, что цель моего кода неясна. Что происходит, так это то, что один светодиод включается, когда LDR распознает свет. Если индикатор продолжает гореть, то один раз прозвучит звуковой сигнал, и светодиод сменит цвет на светодиод другого цвета. Если LDR продолжит обнаруживать свет, то все светодиоды погаснут, а звуковой сигнал будет звучать непрерывно. Единственная проблема заключается в том, что код не останавливается до тех пор, пока LDR не почувствует достаточно сильное снижение уровня освещенности.

, 👍0

Обсуждение

у вас есть два логина? ... вы опубликовали свой вопрос как Зои Мелк и отредактировали вопрос как Зои .... пожалуйста, нажмите кнопку Отметить внизу вашего вопроса и нажмите вмешательство модератора и запрос на объединение ваших учетных записей, @jsotola

Мне кажется, что Зои и Зои Мелк - это один и тот же человек. Я предлагаю вам последовать предложению, сделанному jsotola., @Nick Gammon

Описание того, что должна делать программа, очень запутанное. Я подозреваю, что это может быть не очень ясно в вашем сознании, и, если вам удастся объяснить это ясной и точной прозой, возможно, вы уже на полпути к написанию хорошего кода., @Edgar Bonet


1 ответ


Лучший ответ:

1

У вас есть пара проблем в вашем коде.

Аналоговые входы универсальны и (большинство) могут использоваться в качестве цифровых входов. Вы объявляете PIN LDR как цифровой контакт с помощью pinmode(ldr, ВВОД). Полностью удалите эту строку. Для справки см. Документацию по аналоговому чтению.

Во-вторых, у вас есть два одинаковых оператора if.

if (ldrStatus>=300) {
  digitalWrite(13, HIGH); 

и

if (ldrStatus>=300) {
  digitalWrite(13, LOW); 

Я подозреваю, что один из них должен быть знаком меньше, чем < .

Оба светодиода выключены, потому что он выполняет этот раздел кода:

}else{   
  noTone (buzzer);
  digitalWrite (13, LOW);
  digitalWrite (12, LOW);

}

Я предлагаю вам добавить строки Serial.println() (документация здесь) в ваш код для отладки. Особенно полезно было бы добавить его в операторы if и else, а также добавить Serial.println(ldrStatus) следующим образом:

int ldrStatus=analogRead(ldr);  
Serial.println(ldrStatus);
if (ldrStatus>=300) {

Обратитесь к этому документу о том, как открыть последовательный монитор в программном обеспечении Arduino (IDE).

Бонусная подсказка:
Вы можете автоматически отформатировать свой код, используя ctrl + T. Смотрите Эту статью для получения дополнительной информации.

,