Dúvida sobre portas PWM

Estou tentando escrever um programa que acenda dois leds, da seguinte maneira:
enquanto um vai acendendo gradualmente o outro vai apagando, porém não estou conseguindo o resultado desejado.
o primeiro led termina de acender para depois o outro apagar, mas eu quero que seja simultâneo, vocês podem me ajudar?
Segue o código que escrevi.

#define ledverm 11
#define ledaz 9
#define minimo 0
#define maximo 255
#define tmp 100
void setup() {
pinMode(ledaz,OUTPUT);
}
void loop() {
for(int i=minimo;i<maximo;i++)
{
analogWrite(ledverm,i);
delay(tmp);
}
for(int i=maximo;i>minimo;i–)
{
analogWrite(ledverm,i);
delay(tmp);
}
for(int i=minimo;i<maximo;i++)
{
analogWrite(ledaz,i);
delay(tmp);
}
for(int i=maximo;i>minimo;i–)
{
analogWrite(ledaz,i);
delay(tmp);
}

}

Desde já agradeço.

Ok
Vou tentar resolver.
Obrigado!

Olá D20, seja bem-vindo ao Fórum Fazedores!

O seu código está parcialmente correto, em tese, não há nada para ajustar em questões técnicas (como valores de PWM), o que ocorre é que você ignora um princípio básico de programação: O programa executa sequencialmente, ele precisa terminar um bloco de código, para só então iniciar a execução de um outro bloco de código.

Partindo dessa premissa, é impossível que o seu programa, do jeito que está, apague o led vermelho e acenda o led azul simultaneamente, pois ele precisa terminar o segundo bloco for que apaga o led vermelho, para só então acender o led azul no terceiro bloco de código.

Eu fiz uma alteração no seu código, tentando condensar os dois blocos for centrais para executarem de forma sincronizada e talvez isso resolva, pois eu não testei o código, mas sabendo qual a sua falha, mesmo que minha alteração não resolva, você já está encaminhado para resolver sozinho.

    #define red_led 11
    #define blue_led 9
    #define min 0
    #define max 255
    #define tmp 100

    void setup() {
        pinMode(red_led, OUTPUT);
        pinMode(blue_led, OUTPUT);
    }

    void loop() {
        for(int i = min; i < max; i++) {
            analogWrite(red_led, i);
            delay(tmp);
        }

    	int a = max;
    	int b = min;
    	while (a > min && b < max) {
            analogWrite(red_led, a);
            analogWrite(blue_led, b);
    		a--; b++;
            delay(tmp)
    	}

        for(int i = max; i > min; i–-) {
            analogWrite(blue_led, i);
            delay(tmp);
        }
    }
1 curtida

Obrigado Sandro!
Acho que dessa forma resolve o meu problema. Foi mesmo, meio que esqueci que os blocos de comandos são executados passo a passo kkk
Valeu pela ajuda

Através de sua contribuição, mudei alguns detalhes e escrevi o código da seguinte maneira:

#define ledverm 11
#define ledaz 9
#define minimo 0
#define maximo 255
#define tmp 100
void setup() {
pinMode(ledaz,OUTPUT);
pinMode(ledverm,OUTPUT);
}
void loop() {
int a=minimo;
int b=maximo;
while(a<maximo && b>minimo)
{
analogWrite(ledverm,a);
analogWrite(ledaz,b);
a++;
b–;
}
while(a<maximo && b>minimo)
{
analogWrite(ledverm,b);
analogWrite(ledaz,a);
b–;
a++;
}
}

Porém estou fazendo os testes no Tinkercard, e lá dá impressão que os leds acendem e permanecem ligados indefinidamente, ou seja, não consegui perceber mudança na luminosidade. Não sei se ainda é erro na programação ou se com o material real iria funcionar.
mas continuarei tentando aqui!

Cole o link do seu projeto no Tinkercad que eu dou uma olhada.

Bom dia!
Ok, daqui a pouquinho mando o link.

Essa é a imagem do meu projeto, é um circuito bem simples. Não mandei o link porque acho que precisaria do login.

O caso é que ainda não consegui o efeito desejado com aquela programação que te mandei ontem, tenho a impressão de que os leds ficam acesos indefinidamente.

Ah sim kkk.
não repare que mudei a cor dos leds, fiz isso porque pensei que a cor poderia estar influenciando na percepção da mudança de luminosidade.

Minha solução, não fiz muitas alterações: https://www.tinkercad.com/things/i42sodXELGe

const int red_led = 5;
const int blue_led = 6;
const int min = 0;
const int max = 255;
const int timer = 5;

void setup() {
	pinMode(red_led, OUTPUT);
	pinMode(blue_led, OUTPUT);
}

void loop() {
	for(int i = min; i < max; i++) {
		analogWrite(red_led, i);
		delay(timer);
    }

    int a = max;
    int b = min;
    while (a > min && b < max) {
        analogWrite(red_led, a);
        analogWrite(blue_led, b);
        a--;
      	b++;
        delay(timer);
    }

    for (int i = max; i > min; i--) {
    	  analogWrite(blue_led, i);
    	  delay(timer);
    }
}

Finalmente consegui o que queria, e reparando esse código que eu coloquei acima percebi que não utilizei o “delay”. Talvez esse fosse o problema kk.
Obrigado pelas contribuições!!