Переход переменной через 0

Megawollt
Offline
Зарегистрирован: 06.12.2015

Нужно сделать плавное заполнение ШИМ (как для светодиода)

Пишу примерно такой код:



byte i=0;

if(digitalWrite(pin)==HIGH){

i++;

analogWrite(otherPin , i );

}

else i--;

В итоге переменная i после значение 255 становится 0, а после 0 при уменьшении становится 255 и диод плавно мигает. Как от этого избавиться?

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

есть пример FADE называется

/*
 Fade

 This example shows how to fade an LED on pin 9
 using the analogWrite() function.

 The analogWrite() function uses PWM, so if
 you want to change the pin you're using, be
 sure to use another PWM capable pin. On most
 Arduino, the PWM pins are identified with 
 a "~" sign, like ~3, ~5, ~6, ~9, ~10 and ~11.

 This example code is in the public domain.
 */

int led = 9;           // the PWM pin the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

// the setup routine runs once when you press reset:
void setup() {
  // declare pin 9 to be an output:
  pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  // set the brightness of pin 9:
  analogWrite(led, brightness);

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }
  // wait for 30 milliseconds to see the dimming effect
  delay(30);
}

 

Megawollt
Offline
Зарегистрирован: 06.12.2015

Да я видел, только он тоже меняет значение, а мне нужно, чтобы кнопку нажал, плавно стартануло и на нужном уровне(другая переменная) осталось, пока я ее держу. Потом после отпускания плавно погасло :)

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Ну дык сравнивай первую переменную со второй через if. Когда первая достигнет значения второй, перестаёш инкрементировать первую.

byte brightness1 = 0;
byte brightness2 = 150; // значение, на котором надо остановить
byte fadeAmount = 5;

void loop
{
  if (brightness1 < brightness2)
  {
    analogWrite(led, brightness1); 
    brightness1 + fadeAmount;
  }
  delay(30);
}

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Jeka_M пишет:

Ну дык сравнивай первую переменную со второй через if. Когда первая достигнет значения второй, перестаёш инкрементировать первую.

byte brightness1 = 0;
byte brightness2 = 150; // значение, на котором надо остановить
byte fadeAmount = 5;

void loop
{
  if (brightness1 < brightness2)
  {
    analogWrite(led, brightness1); 
    brightness1 + fadeAmount;
  }
  delay(30);
}

 

приклей ему кнопку - иначе будет жаловаться, что работает без остановки.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Завтра на работе попробую. Делей никак нельзя. Она паразитирует радиомодуль

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Клапауций 322 пишет:

приклей ему кнопку - иначе будет жаловаться, что работает без остановки.

Та неохота было ещё кнопки писать...

Megawollt пишет:

Делей никак нельзя. Она паразитирует радиомодуль

Убрать не проблема, millis() же есть.

P.S. Налажал я что-то... В строке 07 надо так:  if (brightness1 <= brightness2). Иначе остановится на 145, а не 150 (на один "шаг" меньше). И в строке 10 надо:  brightness1 = brightness1 + fadeAmount;

 
Megawollt
Offline
Зарегистрирован: 06.12.2015

Итак, рабочего цикла все-равно не получается :(

Вот код. Если убрать плавное торможение, то все работает, но вот последний блок все портит. Что не так?

int startTime = 10230;         //Переменная скорости разгона
int stopTime = 9500;         //Переменная скорости торможения
unsigned int val;              //Значение ШИМ

if(fwd == 111&&bwd != 222) {            //Движение вперед если приходит команда с пульта
if (val <= spd) {
  analogWrite(motPin,val); 
  val++;
  delayMicroseconds(startTime);
}
digitalWrite(directPin, HIGH);
}
else if(bwd == 222&& fwd != 111){       //Движение назад если приходит команда с пульта
if (val <= spd) {
 analogWrite(motPin,val); 
 val++;
 delayMicroseconds(startTime);
}
digitalWrite(directPin, LOW);
}
else {
if (val > 0) {
 val--;
 delayMicroseconds(startTime);
}
}
analogWrite(motPin,val); 

 

Megawollt
Offline
Зарегистрирован: 06.12.2015

Проблема оказалась в другом. Код исправил. Все стартует и останавливается, но вот значение spd прыгает с 252-255, соответственно есть перебои в выполнении условий и как результат, резкие скачки мотора. Как заложить предел?