Boas a todos,

tenho uma dúvida num sketch para substituir Delay por Millis.

Quero accionar um relé durante 20 segundos sem bloquear o resto das operações.

O comando é enviado via BLYNK. O arduino lê a instrução e acciona o relé para ON durante 20 segundos. Após os 20 segundos passa para OFF.

Deixo um pouco do sketch para poderem ajudar.

Obrigado

ModuloEstores.ino

Exibições: 708

Responder esta

Respostas a este tópico

Boa noite Sr. MV, (se não gosta que te chame pelas iniciais, avise),

   gostaria muito de te ajudar, mas para isto recomendo as seguintes ações:


1. Remova seu sketch da área de texto do seu tópico;

2. Clique em : " Arquivos "  e depois anexe o arquivo  com o seu sketch completo;


3. Leia http://labdegaragem.com/forum/topics/sugest-o-de-como-postar


4. Comente as linhas do seu sketch. Assim fica mais fácil entender o que vc quer fazer

     com cada linha e facilita a ajuda.

Mas fique 'a vontade caso não queira seguir minhas recomendações.

RV

Boa noite Mário, 

Tenho certeza que o amigo Rui, vai ajudá-lo. 

Mas fique atento, a Raspberry Pi lançou o novo Raspberry Pico que possui um controlador de I/O. 

E todos esses tipos de desafios, serão fácilmente resolvidos com as maquinas de estado internas! 

https://www.seeedstudio.com/blog/2021/01/25/programmable-io-with-ra...

Ainda é dificil fazer a programação dele. Mas brevemente, creio que o processo será facilitado. 

https://labdegaragem.com/profiles/blogs/rp2040-primeiro-microcontro...

Aguardem meus tutoriais. 

Abraços. 

Estude o artigo do link abaixo, é bem detalhado e didático, mostrando como fazer dois LEDs piscarem em tempos diferentes em duas tarefas executadas simultaneamente.
https://www.filipeflop.com/blog/subtituindo-delay-por-millis-no-ard...

Lá no link tem um exemplo de piscar dois LEDs em tempos diferentes, separados em duas tarefas em paralelo sem que uma interfira na outra. Tenho certeza que estudando esse exemplo vai ajudá-lo a aplicar os conceitos e resolver o seu caso.

/*
 * Exemplo de código usando millis()
 */
// Inicia variáveis de tempo
unsigned long millisTarefa1 = millis();
unsigned long millisTarefa2 = millis();
 
// Iniciação
void setup(){
  // Inicia comunicação na porta serial
  Serial.begin(9600);
  // Define pinos dos leds como saída
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}
// Laço perpétuo
void loop(){
  // Executa tarefa 1
  tarefa1();
  // Executa tarefa 2
  tarefa2();
}
 
void tarefa1(){
  // Verifica se já passou 200 milisegundos
  if((millis() - millisTarefa1) < 200){
    // Acende o led do pino 7
    digitalWrite(7, HIGH);
  }else{
    // Apaga o led do pino 7
    digitalWrite(7, LOW);
  }
  // Verifica se já passou 400 milisegundos
  if((millis() - millisTarefa1) > 400){
    millisTarefa1 = millis();
  }
}
 
void tarefa2(){
  // Verifica se já passou 1000 milisegundos
  if((millis() - millisTarefa2) < 1000){
    // Acende o led do pino 8
    digitalWrite(8, HIGH);
  }else{
    // Apaga o led do pino 8
    digitalWrite(8, LOW);
  }
  // Verifica se já passou 2000 milisegundos
  if((millis() - millisTarefa2) > 2000){
    millisTarefa2 = millis();
  }
}

Muito obrigado pela resposta.

Irei estudar o exemplo e depois direi como correu.

Valeu

Ventura

Bom dia MV,

agradeço sua atenção ao remover o sketch da área de texto.

Como muitos amigos aqui não entenderam ainda a razão desta minha solicitação,

vou reenfatizar os motivos:

1. Primeiro e principal:   

    Ao postar o sketch caracteres são pedidos e provocam erros de compilação:

     EX:  escreva na área de texto uma linha com o "comando de shift bits e veja o resultado:

  id = abc 6;    Ao escrever eu coloquei um duplo " <" entre abc e 6, que desapareceu.

2. Toda identição do sketch é perdida;

3. A pagina do tópico fica muito extenso e muitas vezes "chato" de ser lido.

RV mineirin

Olá.

Essa questão é bastante recorrente.

A resposta está aih, mas queria comentar a filosofia por trás.

Existem ao menos 3 formas de vc fazer uma lista de tarefas, que pode ser um programa.

1) Com delay(), que seria vc mandar fazer uma coisa, esperar parado, mandar fazer outra coisa, esperar parado, etc. É o jeito mais simples, as vezes suficiente e funcional, as vezes limitante. 

Exemplo clássico: Pisca pisca de arvore de natal. Só tem que piscar...

2) Por millis() que é um contador de milisegundos. Imagine um relogio que conta minutos (mais fácil de pensar) e vc está no minuto 2000, quer que algo aconteça em 10 minutos, só anotar quando será isso (agora+10) e ficar verificando o relogio, quando der 2010 vc para. Igual na sua casa. 2:10, quero assar o pão de queijo por 20 minutos, mentalizo "até 20:30". Só que em milisegundos.

3) Por interrupção.

   Vc pode programar uma interrupção de tempo, na frequencia que quiser, dentro dos limites (tem um minimo e máximo) veja mais em: https://labdegaragem.com/profiles/blogs/tutorial-executando-fun-es-...

   Assim por ex vc programa uma interrupção por segundo. Nessa interrupção incrementa um contador.

   Com isso fica fácil de fazer uma sequencia "zera cronometro"+"aguarde 20 segundos".

   Eu gosto dessa solução por ser polida, mas é otima para tempos maiores. Para coisas bobas como o tempo de um processo rápido considero exagerado.

   Ela permite ainda que vc inclua comandos de leitura do teclado na interrupção. Melhor ainda se a interrupção for de, por ex, 0,1s. Nessas alem de incrementar o contador de décimos de segundo vc le as teclas, por ex "pause" e "stop". setando flags (variaveis).

   E em todas as paradas para esperar alguma coisa inclui o tratamento dessas teclas. 

Quando a coisa complica vc pode usar uma maquina de estado. Vc coloca um indice nas coisas, digo: Dá nome (numero) as tarefas e cria uma ordenação.

 Exemplo clássico: 

Maquina de lavar. Tem as tarefas encher, bater e esvaziar. Mas tem que encher até ficar cheia, bater até um tempo, ou o usuário apertar um botão, esvaziar até ficar vazia. Ou seja: interage com os sensores, o usuário, temporiza, etc, tudo ao mesmo tempo.

  Algo como: 

0= parado

1= enchendo

2= batendo.

3= esvaziando (no exemplo eliminei umas partes).

0 vai pra 1 por botão.

1 vai pra 2 por sensor de nivel

2 vai pra 3 por cronometragem

3 vai pra 0 por sensor.

Tudo muda se o usuário apertar um botão.

Aih entra a questão de "cronometrar". Isso só se faz por interrupção de tempo (meu método preferido) ou por millis() (mais simples).

No caso da leitura do teclado por interrupção fica interessante pq vc pode criar o estado "pausa", que priemiro memoriza o estado anterior, para motores e fecha valvulas e aguarda o botão pause pra retornar ao estado anterior.

  

Ótimo resumo postado pelo Eduardo.

Adiciono mais algumas informações para registro e uso futuro deste post nas próximas perguntas similares do assunto.

Adiciono uma solução típica de sistemas embarcados usada profissionalmente que também está disponível para o ambiente de desenvolvimento do Arduino: Free RTOS - que é um sistema de tempo real, permitindo facilmente criar tarefas isoladas que são executadas no seu tempo e que podem se comunicar por meio de filas de mensagens ou usar os chamados semáforos e/ou Mutexs para sincronização e/ou controle acesso a periféricos.

Um site com tutorial de referência: https://www.filipeflop.com/blog/tasks-no-freertos/

Outra opção é usar a biblioteca Arduino TaskScheduler que permite escalonar tarefas ao longo do tempo sem se a complexidade do FreeRTOS.

Referências em Inglês:

https://www.arduino.cc/reference/en/libraries/taskscheduler/

https://github.com/arkhipenko/TaskScheduler

Olá a todos.

Desde já obrigado pelas respostas.

Já consegui resolver o problema.

Agora não entendo é uma coisa (deve ser o Bicho da Fruta ): 

  Quando dou a ordem no Blynk para actuar o 1º ou o 2º Relé, funciona bem durante o tempo que eu defini mas, só funciona se tiver as instruções Serial.begin e Serial.println.

Também notei que se alterar  o Serial de 4800 para outro valor (115200 por ex), sem mexer no tempo definido, o tempo real de actuação do relé, varia muito. 

Também notei que ao fim de cerca de 20 segundos quando o Relé está ON, a placa se desconecta da net. Não que seja grande problema mas, se precisar de actuar o relé durante 40 segundos, já poderá ter consequências.

Deixo Sketch para poderem utilizar porque está a funcionar bem.

Obrigado

Ventura

Modulo_Estores.ino

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço