E ai pessoal todos bem?
Estou fazendo um controle de um motor DC via pwm com o ESP32 via bluetooth. 

Incremento o pwm a cada 10millisegundos.

O meu problema é que com o delay trava todo código, e o Millis() não funciona dentro do for.

====================================

for (int i= pwm_atual; i < pwm; i++)
{

 Serial.println(pwm_atual);
 ledcWrite(0, i); 
 pwm_atual = i;

 delay(10);      
}

====================================

Exibições: 687

Responder esta

Respostas a este tópico

Boa noite YBN,

não entendi bem sua dificuldade.

Quem trava o processamento no seu caso é o "for".

RV

Boa noite RV.
Também, mas se não ter o delay(), vai ser tão rápido que não vou perceber, e preciso desse incremento "suave".
Meu pwm é de 10bits. 0 a 1023. caso eu for de 0 até 1023 vai levar 10,23seg. São 10,23seg que não vou poder mandar outros comandos e esse é um problema.

Tentei usar o Millis() porém não funcionou.

então, pq não exclui o "for" e o "dela" e usa apenas o millis() com um "if" ?

Testa este skecth e veja se atende sua necessidade.

RV

YBN.ino

Eu uso essa função no lugar de delay:

void hold(const unsigned int &ms) {
unsigned long m = millis();
while (millis() - m < ms) {
yield();
}
}

Aí ao invés de  colocar:

delay(500);

basta colocar:

hold(500);

Agradeço desde ja a todos me responderam.
Estou deixando uma skecth, acredito que vão entender melhor minha dificuldade. 

Bluetooth_FOR__.ino
Imaginem um carrinho controlado via bluetooth, e eu acelero e desacelero através do pwm. De 0 a 1023 preciso que a aceleração seja suave.  Exemplos:

Exemplo IDEAL: O carrinho está parado. Mando um comando pwm de '800'. Ele começa a acelerar de forma suave porém no meio do caminho preciso inverter o sentido do motor e mando o comando "S", que vai desacelerar até '0' também de forma suave até o carrinho parar. Neste exemplo o processador interrompe o que estava fazendo para ler o comando que entrou via bluetooth para executar.

Exemplo com DELAY()  & FOR()- Acredito que seja óbvio, o processador vai ficar travado no for() com delay dentro e não vai ler o comando vindo por bluetooth.

Como fazer o exemplo IDEAL??

Yuri, eu não olhei seu código pois, pela sua descrição, é um problema muito simples. Eu lhe indico fortemente a pesquisar e entender a função "millis()". É uma função básica e simples mas que, por muitas vezes, se torna obrigatória.

unsigned long tempo;

int controle = 0; // joystick

int pwm = 0; // o valor do seu pwm

int aguardo = 100; // análise feita a cada 100 millisecond

setup(){tempo = millis();}

loop(){

if (millis() - tempo >= aguardo){

tempo = millis(); 

if (controle > 0) {pwm++;}

elseif (controle == 0){ if(pwm>0) {pwm--;} elseif(pwm<0){pwm++;}}

elseif (controle < 0){pwm--;}

}}

O RV postou um código semelhante. Se não entender o meu código e/ou o dele, recomendo você da uma pausa no seu desenvolvimento, ler um pouco sobre a função que citei, e depois continuar. Apesar de parecer que você irá perder tempo, mas na verdade você irá economizar tempo. Pois sem esse conhecimento, você irá enfrentar uma tonelada de problemas.

Boa tarde YBN,

pelo programa que você postou, verifiquei que seu problema é outro.

Vc nunca sai do valor 0 em pwm_atual.

Se quiser  me chame no chat.

RV

Boa tarde YBN,

testa este programa ai e conta o resultado.

RV

Bluetooth_FOR__.ino

Resolvido... Esse programa deu certo.
Só que agora para tudo que eu precisar adicionar como acender um led, vou ter que criar mais flag.
Vou deixar aqui uma atualização do seu RV.

Meus sinceros agradecimentos!
Teste_RV.ino

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço