Переход переменной через 0
- Войдите на сайт для отправки комментариев
Ср, 17/02/2016 - 19:20
Нужно сделать плавное заполнение ШИМ (как для светодиода)
Пишу примерно такой код:
byte i=0;
if(digitalWrite(pin)==HIGH){
i++;
analogWrite(otherPin , i );
}
else i--;
В итоге переменная i после значение 255 становится 0, а после 0 при уменьшении становится 255 и диод плавно мигает. Как от этого избавиться?
есть пример 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); }Да я видел, только он тоже меняет значение, а мне нужно, чтобы кнопку нажал, плавно стартануло и на нужном уровне(другая переменная) осталось, пока я ее держу. Потом после отпускания плавно погасло :)
Ну дык сравнивай первую переменную со второй через if. Когда первая достигнет значения второй, перестаёш инкрементировать первую.
byte brightness1 = 0; byte brightness2 = 150; // значение, на котором надо остановить byte fadeAmount = 5; void loop { if (brightness1 < brightness2) { analogWrite(led, brightness1); brightness1 + fadeAmount; } delay(30); }Ну дык сравнивай первую переменную со второй через if. Когда первая достигнет значения второй, перестаёш инкрементировать первую.
byte brightness1 = 0; byte brightness2 = 150; // значение, на котором надо остановить byte fadeAmount = 5; void loop { if (brightness1 < brightness2) { analogWrite(led, brightness1); brightness1 + fadeAmount; } delay(30); }приклей ему кнопку - иначе будет жаловаться, что работает без остановки.
Завтра на работе попробую. Делей никак нельзя. Она паразитирует радиомодуль
приклей ему кнопку - иначе будет жаловаться, что работает без остановки.
Та неохота было ещё кнопки писать...
Делей никак нельзя. Она паразитирует радиомодуль
Убрать не проблема, millis() же есть.
P.S. Налажал я что-то... В строке 07 надо так: if (brightness1 <= brightness2). Иначе остановится на 145, а не 150 (на один "шаг" меньше). И в строке 10 надо: brightness1 = brightness1 + fadeAmount;
Итак, рабочего цикла все-равно не получается :(
Вот код. Если убрать плавное торможение, то все работает, но вот последний блок все портит. Что не так?
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);Проблема оказалась в другом. Код исправил. Все стартует и останавливается, но вот значение spd прыгает с 252-255, соответственно есть перебои в выполнении условий и как результат, резкие скачки мотора. Как заложить предел?