Использование задержки (1000); без влияния на аналогЗапись?

Итак, я пытаюсь прочитать напряжение на аналоговом контакте A0 и выполнить «регулировку», где, если напряжение будет ниже 2,5 В (аналоговое значение 512), то выходной контакт 9 должен использоваться как ШИМ. с рабочим циклом 50% ( AnalogWrite(ledPin, 128); ), если напряжение снова не поднимется выше 2,5 В.

Где/как мне следует использовать указанную строку ( AnalogWrite(ledPin, 128); в предложении IF, чтобы она использовалась непрерывно, пока не будет достигнут предел?

PS: Я просто хочу обновить ЖК-дисплей с частотой 1 Гц, пока ШИМ работает независимо от задержки (1000). Как это вообще возможно?

Как я могу это сделать?

#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

const int numRows = 2;
const int numCols = 16;

void setup() {
  lcd.begin(numCols, numRows);
}

void loop() {

    int sensorValue = analogRead(A0);
    float voltage = sensorValue * (5.0 / 1023.0);
        lcd.setCursor(0, 0);
        lcd.write(voltage);

        delay(1000);
}

, 👍0

Обсуждение

у тебя нет прогресса. вы всегда спрашиваете вариацию одного и того же. изучите пример BlinkWithoutDelay, @Juraj

Вы не поняли вопроса. Я не прошу готовый код, я прошу объяснения, как это сделать., @Jakey

прочитайте этот пост.... это один из ваших.... https://arduinoprosto.ru/q/56061/refreshing-lcd-with-различная-частота-чем-выход, @jsotola


3 ответа


0

Здесь вам не нужен оператор if. Вы можете просто постоянно проводить измерения и действовать соответственно.

О delay(1000):

Использование delay() считается плохой практикой программирования, особенно в течение длительных периодов времени, поскольку это просто занято ожиданием. В реальной жизни вы не будете просто сидеть, сложа руки, пока задача не будет выполнена. В промежуточное время вы бы сделали что-нибудь еще. Здесь вы можете достичь этого, используя неблокирующий код, как в примере BlinkWithoutDelay Arduino IDE.

О ШИМ:

ШИМ обрабатывается не программным обеспечением, а аппаратным обеспечением. В комплект поставки Atmega на Arduino входит специальное оборудование ШИМ, которое будет управлять выводом ШИМ, чтобы ЦП мог выполнять другие задачи.

,

Хорошо, но есть ли тогда строка, которая ОБНОВИТ состояние, отображаемое на ЖК-дисплее? Я не могу понять эту часть работы., @Jakey

OP опубликовал вопрос здесь ...https://arduinoprosto.ru/q/56061/refreshing-lcd-with-different-frequency-than-output .... было рассмотрено использование delay() ..... похоже, что OP не способен учиться на опыте, @jsotola


0

Я думаю, вам нужно что-то вроде этого, с флагом, чтобы вы не перезапускали постоянно ШИМ на выводе 8 и не делали выходной сигнал нестабильным:

void loop(){
if (analogRead(A0)<512  && halfLevel9 == 0){
analogWrite (9, 128);
halfLevel9 = 1; // флаг, сообщающий, что он установлен
}
else {
analogWrite (9, withWhat?);
halfLevel9 = 0;
}
// используем мигание без задержки, чтобы определить, прошла ли 1 секунда
{
// записываем все, что поступает на ЖК-дисплей
}
// делаем другие дела, пока проходит 1 секунда
}
,

2

На ШИМ, запущенный с помощью analogWrite, не будет влиять delay, поскольку функция AnalogWrite только устанавливает регистры и запускает ШИМ. Генератор ШИМ независим от ЦП микроконтроллеров AVR. Например, на esp8266 ШИМ генерируется с использованием прерываний, и на него также не влияет функция delay. Чтобы остановить ШИМ, вы должны вызвать AnalogWrite со значением 0 или изменить режим вывода.

,