Код для попеременного выгорания двух лампочек
Я написал этот код
const int A = 3;
const int B = 5;
void setup() {
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
}
void loop() {
for(int i=1;i<=255;i++)
{
int j =255-i;
analogWrite(A,i);
analogWrite(B,j);
delay(100);
}
for(int i=255;i>0;i--)
{
int j =255-i;
analogWrite(B,j);
analogWrite(A,i);
delay(100);
}
}
Это правильный код? Если да, то можно ли его каким-либо образом изменить, чтобы сделать его лучше?
@Bhavya Budhia, 👍1
Обсуждение1 ответ
Лучший ответ:
Чтобы два цикла были более симметричными, пусть первый цикл проходит от 0 до 254: [0 .. 255), а второй цикл — от 255 до 1: [255 .. 0), поэтому обе итерации имеют по 255 значений каждая. .
Кроме того, в программировании довольно часто включается начальный элемент, а не конечный элемент (как в приведенных выше значениях: [start_element .. end_element).
Кроме того, для простой формулы (255 - i) я бы не использовал формулу. А чтобы было понятнее, задайте константы для значений min/max (0,255) и задержки.
Что вы получаете:
const int A = 3;
const int B = 5;
const int MIN_INTENSITY = 0;
const int MAX_INTENSITY = 255;
const int DELAY_TIME = 100;
void setup() {
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
}
void loop()
{
for(int i = MIN_INTENSITY; i < MAX_INTENSITY ; i++)
{
analogWrite(A, i);
analogWrite(B, MAX_INTENSITY - i);
delay(DELAY_TIME);
}
for(int i = MAX_INTENSITY ; i > MIN_INTENSITY; i--)
{
analogWrite(B, MAX_INTENSITY - i);
analogWrite(A, i);
delay(DELAY_TIME);
}
}
Создав функцию и используя аргументы для значений переменных, а также придумав несколько лучших имен для констант и переменных, вы получите следующее:
const int LED_1_PIN = 3;
const int LED_2_PIN = 5;
const int MIN_INTENSITY = 0;
const int MAX_INTENSITY = 255;
const int DELAY_TIME = 100;
void setup()
{
pinMode(LED_1_PIN, OUTPUT);
pinMode(LED_2_PIN, OUTPUT);
}
void loop()
{
fade(MIN_INTENSITY, MAX_INTENSITY, 1);
fade(MAX_INTENSITY, MIN_INTENSITY, -1);
}
void fade(int startIntensity, int endIntensity, int stepValue)
{
for(int intensity = startIntensity; intensity < endIntensity; intensity += stepValue)
{
analogWrite(LED_1_PIN, intensity);
analogWrite(LED_2_PIN, MAX_INTENSITY - intensity);
delay(DELAY_TIME);
}
}
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Объяснение кода MPU6050
- Как я могу прервать задержку() при нажатии кнопки?
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Как установить управляющий регистр в модуле RTC DS3231 для Arduino UNO R3?
- Как повторить другое действие внутри цикла?
- Клиент веб-сокета Arduino CC3000
Если не считать небольшой асимметрии, я не вижу проблемы (i меняется от 1 до 255, а j — от 0 до 254). Почему? Это не работает?, @st2000
Выбранные вами контакты должны работать на большинстве плат Arduino. Но задавая подобные вопросы, вам следует указать, какой тип платы Arduino вы используете., @st2000
Дайте определение «лучше». В вашем коде используется «задержка», что нормально, если вашему коду больше нечего делать, но совершенно неприемлемо, если ваш код будет использоваться в контексте другого кода. Это то, что вы хотите/нужно сделать «лучше» или нет?, @AnT
В зависимости от того, какого эффекта вы хотите добиться, вы можете добавить гамма-коррекцию., @Gerben