Использование задержки (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);
}
@Jakey, 👍0
Обсуждение3 ответа
Здесь вам не нужен оператор 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
Я думаю, вам нужно что-то вроде этого, с флагом, чтобы вы не перезапускали постоянно ШИМ на выводе 8 и не делали выходной сигнал нестабильным:
void loop(){
if (analogRead(A0)<512 && halfLevel9 == 0){
analogWrite (9, 128);
halfLevel9 = 1; // флаг, сообщающий, что он установлен
}
else {
analogWrite (9, withWhat?);
halfLevel9 = 0;
}
// используем мигание без задержки, чтобы определить, прошла ли 1 секунда
{
// записываем все, что поступает на ЖК-дисплей
}
// делаем другие дела, пока проходит 1 секунда
}
На ШИМ, запущенный с помощью analogWrite
, не будет влиять delay
, поскольку функция AnalogWrite только устанавливает регистры и запускает ШИМ. Генератор ШИМ независим от ЦП микроконтроллеров AVR. Например, на esp8266 ШИМ генерируется с использованием прерываний, и на него также не влияет функция delay
. Чтобы остановить ШИМ, вы должны вызвать AnalogWrite со значением 0 или изменить режим вывода.
- Какие контакты LCD, если таковые имеются, требуют ШИМ?
- Печать string and integer LCD
- Установите частоту ШИМ на 25 кГц.
- Какова частота PWM-выхода на Arduino
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Как отобразить символ º на ЖК-дисплее?
- Генерация частоты ШИМ выше 125 кГц с помощью Arduino Uno
у тебя нет прогресса. вы всегда спрашиваете вариацию одного и того же. изучите пример BlinkWithoutDelay, @Juraj
Вы не поняли вопроса. Я не прошу готовый код, я прошу объяснения, как это сделать., @Jakey
прочитайте этот пост.... это один из ваших.... https://arduinoprosto.ru/q/56061/refreshing-lcd-with-различная-частота-чем-выход, @jsotola