Почему значение светодиодной ленты на потенциометре всегда равно 255?
Я новичок в Arduino, и это мой первый проект, над которым я работаю, и я действительно не понимаю, почему мой код не работает должным образом.
Светодиодная лента должна иметь возможность регулировать цвет с помощью одного потенциометра, который я могу вынуть, поэтому я не использую 3 потенциометра, а просто использую, который может регулировать все цвета. Затем, когда он перейдет в режим 4, он должен сохранить цвет и неоднократно мигать.
Я использую Arduino Uno, но как только мой проект будет завершен, я буду использовать Arduino Nano. Я не знаю, нужно ли мне менять код, но если понадобится, думаю, я смогу сделать это самостоятельно.
Я просто не знаю, почему моя светодиодная лента всегда не горит (255).
// устанавливаем номера контактов:
int ledPinR = 11; // номер контакта R светодиода
int ledPinG = 10; // номер контакта G светодиода
int ledPinB = 9; // номер контакта светодиода B
int buttonPin = 7; // номер контакта кнопки
int mode = 0; //изменить режим
int bluelev = 0; //сохраняем значение синего светодиода
int greenlev = 0; //сохраняем значение зеленого светодиода
int redlev = 0; // сохраняем значение красного светодиода
void setup() {
// инициализируем вывод светодиода как выход:
pinMode(ledPinR, OUTPUT);
pinMode(ledPinG, OUTPUT);
pinMode(ledPinB, OUTPUT);
//делаем светодиодную ленту белой при загрузке
digitalWrite(ledPinR, 0);
digitalWrite(ledPinG, 0);
digitalWrite(ledPinB, 0);
}
void loop() {
// при нажатии кнопки меняет значение режима на единицу
if (digitalRead(buttonPin) == LOW) {
++mode;
delay(500);
}
if (mode == 1) { //красная конфигурация
int adcValue; // Определить переменную для сохранения значения АЦП
// Преобразование аналогового порта A0 в цифровой и работа в качестве рабочего цикла ШИМ порта LEDPinR
adcValue = analogRead(A0);
analogWrite(ledPinR, map(adcValue, 0, 1023, 0, 255));
(redlev = ledPinR); // сохраняет уровень красного светодиода
}
if (mode == 2) { //зеленая конфигурация
int adcValue; // Определить переменную для сохранения значения АЦП
// Преобразование аналогового порта A1 в цифровой и работа в качестве рабочего цикла ШИМ порта LEDPinG
adcValue = analogRead(A1);
analogWrite(ledPinG, map(adcValue, 0, 1023, 0, 255));
(greenlev = ledPinG); // сохраняет уровень зеленого светодиода
}
if (mode == 3) { //Синяя конфигурация
int adcValue; // Определить переменную для сохранения значения АЦП
// Преобразование аналогового порта A2 в цифровой и работа в качестве рабочего цикла ШИМ порта LEDPinB
adcValue = analogRead(A2);
analogWrite(ledPinB, map(adcValue, 0, 1023, 0, 255));
(bluelev = ledPinB); // сохраняет уровень синего светодиода
}
if (mode == 4) {
digitalWrite(ledPinR, 255); // выключаем светодиод
digitalWrite(ledPinG, 255); // выключаем светодиод
digitalWrite(ledPinB, 255); // выключаем светодиод
digitalWrite(8, 0); // включаем светодиод
delay(1000); //ждём 1 секунду
digitalWrite(ledPinR, redlev); // включаем светодиод
digitalWrite(ledPinG, greenlev); // включаем светодиод
digitalWrite(ledPinB, bluelev); // включаем светодиод
digitalWrite(8, 225); // включаем светодиод
delay(1000); //ждём 1 секунду
}
if (mode == 5) {
mode -= 5; //устанавливает значение режима обратно в 0
}
}
Вот настройка.
Представьте, что светодиод RGB — это светодиодная лента, а потенциометры — это просто слоты, в которые можно вставить один из них, чтобы изменить цвет, когда я захочу. Поэтому, когда я не меняю цвета, я могу использовать потенциометр для других проектов и не тратить 3.
@user92341, 👍0
2 ответа
В вашем коде есть как минимум эти ошибки:
1. Вы не можете прочитать аналоговое значение, установленное на выводе.
Вы попробуйте это:
analogWrite(ledPinR, map(adcValue, 0, 1023, 0, 255));
(redlev = ledPinR); // сохраняет уровень красного светодиода
Вы правильно установили аналоговое значение на выводе красного светодиода. Но затем вы пытаетесь прочитать это обратно. Посмотрите на определение ledPinR
: это int
с фиксированным значением 11. Таким образом, redlev
всегда равен 11.
Примечание 1. Выход на самом деле не аналоговый, а с широтно-импульсной модуляцией.
Примечание 2. Во втором операторе скобки не нужны.
Вместо этого сохраните сопоставленное значение в redlev
:
redlev = map(adcValue, 0, 1023, 0, 255);
analogWrite(ledPinR, redlev);
Примечание 3. Используйте хорошие имена переменных, например redLevel
. Когда-нибудь или позже вы будете путать вещи из-за сокращенных названий.
2. Вы не повторяете аналоговую запись в режиме 4.
Вы написали это, что, видимо, неверно:
if (mode == 4) {
digitalWrite(ledPinR, 255); // выключаем светодиод
// другие утверждения...
delay(1000); //ждём 1 секунду
digitalWrite(ledPinR, redlev); // включаем светодиод
// другие утверждения...
delay(1000); //ждём 1 секунду
}
Вместо этого вам нужно следующее (если 255 действительно «выключено»):
if (mode == 4) {
analogWrite(ledPinR, 255); // выключаем светодиод
// другие утверждения...
delay(1000); //ждём 1 секунду
analogWrite(ledPinR, redlev); // включаем светодиод
// другие утверждения...
delay(1000); //ждём 1 секунду
}
Есть и другие проблемы, но это сделает вас шагом вперед. Самое главное, сохраняйте стиль отступов, я подчистил ваш исходный код в вопросе, чтобы сделать его читабельным.
Мой первый проект был таким же: установка цвета полоски с помощью одного потенциометра. Я использовал функцию getColorValue, которая возвращает структуру. Эта структура содержит значения для красного, зеленого и синего. Вот пример кода:
#define PIN_POTENTIOMETER A0
struct RGB
{
uint8_t red;
uint8_t green;
uint8_t blue;
} color;
RGB getColorValue(uint16_t inputValue);
void setup()
{
Serial.begin(9600);
pinMode(PIN_POTENTIOMETER, INPUT);
}
void loop()
{
uint16_t inputValue = analogRead(PIN_POTENTIOMETER);
color = getColorValue(inputValue);
Serial.print("R: ");
Serial.print(color.red);
Serial.print(" G: ");
Serial.print(color.green);
Serial.print(" B: ");
Serial.println(color.blue);
delay(100);
}
RGB getColorValue(uint16_t inputValue)
{
RGB color;
color.red = 0;
color.green = 0;
color.blue = 0;
map(inputValue, 0, 1023, 0, 255);
if (inputValue <= 42.5)
{
color.red = 255;
color.green = inputValue * 6;
color.blue = 0;
}
else if (inputValue <= 85)
{
color.red = 255 - (inputValue - 43) * 6;
color.green = 255;
color.blue = 0;
}
else if (inputValue <= 127.5)
{
color.red = 0;
color.green = 255;
color.blue = (inputValue - 85) * 6;
}
else if (inputValue <= 170)
{
color.red = 0;
color.green = 255 - (inputValue - 127.5) * 6;
color.blue = 255;
}
else if (inputValue <= 212.5)
{
color.red = (inputValue - 170) * 6;
color.green = 0;
color.blue = 255;
}
else if (inputValue <= 255)
{
color.red = 255;
color.green = 0;
color.blue = 255 - (inputValue - 212.5) * 6;
}
return color;
}
Если вам нужна дополнительная помощь, вы можете оставить комментарий здесь или связаться со мной напрямую, указав мою почту в биографии.
С уважением Дарио
analogWrite
и analogRead
не требуют pinMode
., @Juraj
@Юрай Юрай Ты прав, моя вина., @Dario.Casciato
большое спасибо, @user92341
- игнорирование изменений значения потенциометра
- Как эмулировать аналоговый потенциометр с помощью ШИМ
- ЖК-дисплей странные символы
- Как контролировать скорость двухпроводного вентилятора с помощью Arduino и только потенциометра?
- ЖК-дисплей не отображает текст
- Считанное значение не меняется при вращении потенциометра в Arduino?
- AnalogWrite не работает - при попытке контролировать скорость двигателя постоянного тока
- Почему моя «подсказка настроения» не работает?
большое спасибо, @user92341
Пожалуйста! Кстати, вы должны пометить ответ, который вам больше всего подходит, как «принятый», вместо того, чтобы комментировать «спасибо»..., @the busybee