Как сохранить работу одной функции до тех пор, пока переменная не будет завершена?
Цель кода - переключиться с одного светодиода на другой, если 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 не почувствует достаточно сильное снижение уровня освещенности.
@Zoe Melck, 👍0
Обсуждение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.
Смотрите Эту статью для получения дополнительной информации.
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Нужен ли подтягивающий/понижающий резистор для цепи светодиода кнопки?
- Мигните светодиодом 5 раз с помощью цикла for
у вас есть два логина? ... вы опубликовали свой вопрос как
Зои Мелк
и отредактировали вопрос какЗои
.... пожалуйста, нажмите кнопкуОтметить
внизу вашего вопроса и нажмитевмешательство модератора
и запрос на объединение ваших учетных записей, @jsotolaМне кажется, что Зои и Зои Мелк - это один и тот же человек. Я предлагаю вам последовать предложению, сделанному jsotola., @Nick Gammon
Описание того, что должна делать программа, очень запутанное. Я подозреваю, что это может быть не очень ясно в вашем сознании, и, если вам удастся объяснить это ясной и точной прозой, возможно, вы уже на полпути к написанию хорошего кода., @Edgar Bonet