ШИМ-управление, как остановить мерцание светодиода?

Необходимо управлять яркостью светодиода с помощью кнопок и потенциометра. Кнопка А: Увеличение

Кнопка B: уменьшить/уменьшить

Потенциометр: увеличение и уменьшение

Однако это должно происходить в одной цепи и результаты должны отображаться на ЖК-дисплее.

Если я сделаю это отдельно, то есть кнопки без потенциометра и наоборот, я выиграю в тот момент, когда объединим их. У меня мерцает при работе с кнопками из-за потенциометра.

Альтернативные исследования:https://www.instructables.com/id/Smooth-Potentiometer-Input/

Код ниже

#include <LiquidCrystal.h>
#include <Wire.h>
// ---------------------------------------------------------------- ------------

int LED1          = 9;
int ButtonLeft    = 8;
int ButtonRight   = 7;
int brightness    = 0;

// ---------------------------------------------------------------- ------------
byte buttonState1     = 0;
byte lastButtonState1 = 0;

byte buttonState2     = 0;
byte lastButtonState2 = 0;

unsigned long switchMillis;

// ---------------------------------------------------------------- ------------

int potValue1 = 0;
int potValue2 = 0;
int potPin= A0;
int readValue;
int writeValue;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// ---------------------------------------------------------------- ------------
void setup() {

  lcd.begin(16, 2);
  pinMode (potPin, INPUT);
  pinMode(LED1,OUTPUT);
  pinMode(ButtonLeft,INPUT);
  pinMode(ButtonRight,  INPUT);
  lcd.clear ();
}

// ---------------------------------------------------------------- ------------
void loop(){

    if (millis() - switchMillis >= 5)
  {
    switchMillis = millis();
    checkSwitches();
  }

   readValue = analogRead(potPin);  
   writeValue = (255./1023.) * readValue;
   analogWrite(LED1, writeValue);

    potValue1 = analogRead(potPin) / 10;
    potValue2 = potValue1 / 1.02;

    lcd.setCursor(0,0);
    lcd.print("Potent=");
    lcd.print(potValue1);
    lcd.print("%");
    delay(100);
    lcd.print(" ");
    delay(1);
}

void checkSwitches() {

    analogWrite(LED1, brightness);
    delay(10); 

  buttonState1 = digitalRead(ButtonLeft);

  if(buttonState1 == HIGH){ 
    brightness--;
    if(brightness < 0){
      brightness = 0;
    }
  }

  buttonState2 = digitalRead(ButtonRight);

  if(buttonState2 == HIGH){
    brightness++;
    if(brightness > 255){
      brightness = 255;
    }
  }

 lcd.setCursor (0,1);
 lcd.print ("Brightness=");
 lcd.print (brightness);
 lcd.print ("   ");
}

, 👍0

Обсуждение

Это похоже на то, как если бы два игрока играли в одиночную игру, оба нажимали кнопки на одном и том же контроллере. Конечно, игровой персонаж делает странные движения. PS, я думаю, здесь более уместно было бы использовать поворотный энкодер., @Gerben


1 ответ


3

Ваш код не имеет особого смысла.

Вы устанавливаете для светодиода два разных значения яркости, которые не имеют ничего общего друг с другом: яркость горшка и яркость кнопок. Вы регулируете светодиод с помощью переключателей только раз в 5 мс. Таким образом, светодиод будет мигать между двумя разными значениями яркости.

Что вы от него хотите? Как вы хотите управлять яркостью на основе входных данных как от потенциометра, так и от переключателей? (Какова связь между кнопками и горшком? Должен ли ввод кнопки изменять максимальное/минимальное значение потенциометра вверх и вниз? Должно ли удерживать кнопку нажатой изменять яркость на 1 значение за определенную единицу времени? Скажем, 2 увеличения/уменьшения в секунду?)

Опишите пользовательский интерфейс, которого вы хотите добиться, а затем подумайте, как это сделать в коде.

,

«Опишите пользовательский интерфейс, которого вы хотите достичь, а затем подумайте, как бы вы это сделали в коде». +1., @VE7JRO

Привет, Дункан, мерцание возникает только при добавлении горшка, если я запустил код без горшка, все работает соответственно. Это мой второй код, я мог бы представить вам первый, но проблема все равно возникает. Даже если я удалил раздел switchMillis в коде. Еще до того, как мне сказали, Arduino не мог понять, что делать, потому что у меня не было состояний кнопок, но я добавил их, но безуспешно. Суть в том, что мне нужно управлять яркостью светодиода с помощью потенциометра и кнопок, каждую из которых я могу делать по отдельности, но я не знаю, как сделать все это в одном и том же коде., @Boi G

@BoiG, можешь ли ты описать нам, как именно взаимодействуют кнопки и горшок? Если я уменьшу банк, а затем воспользуюсь кнопкой увеличения, что *должно* произойти? Если я потом увеличу банк? Что, если я нажимаю кнопку на максимуме, а затем поднимаю горшок? Потом отступить? Непонятно, чего вы на самом деле пытаетесь достичь., @RubberDuck

Вы пытаетесь что-то построить и не имеете четкого представления о том, что это такое. Вам необходимо четко и детально определить, что вы хотите сделать, а затем продумать, как добиться этого в коде. Мы не сможем вам помочь, если вы не будете четко представлять себе, как вы хотите, чтобы вела себя ваша программа., @Duncan C