Olá galera,
Dificilmente fazemos alguma coisa em arduino sem fazer um teste blink pra ver se ta tudo ok.
Bem, eu sai pensando em como diminuir o codigo do blink ao minimo.
Esse é o meu blink minimo.
Se alguem tiver um jeito de diminuir mais, fala ai.
int pin1=13; //Define pino do led a piscar
boolean liga=0; // define uma variavel como boleana 0 ou 1
void setup() {
pinMode(pin1, OUTPUT);} // indica que o pino e uma saida
void loop() {
digitalWrite(pin1,liga=!liga); // inverte o estado do pino a cada passagem pela linha
delay(500); // defino o tempo entre piscadas
}
Tags:
Pedrosão,
Cara, valeu pelas palavras de carinho e incentivo.
Você falou que esta começando a fazer sketchs com mais de mil linhas, bem, talvez você já tenha visto, mas recomendo dar uma olhadinha de novo nesse tutorial que criei a algum tempo:
Weider,
Na verdade já tinha visto esse tutorial na época que vc postou e comecei a usar sempre os conhecimentos dele para os códigos...
mais de 200 linhas sem aquelas dicas, fica uma confusão... (lição aprendida!) valeu!
Retire a variavel booleana...
int pin1=13; //Define pino do led a piscar
void setup() {
pinMode(pin1, OUTPUT);} // indica que o pino e uma saida
void loop() {
digitalWrite(pin1,!digitalRead(pin1)); // inverte o estado do pino a cada passagem pela linha
delay(500); // defino o tempo entre piscadas
}
Olá pessoal criei uma função capaz de resolver esse problema do blink sem delay, testem e digam como se comporta.
Antes de mais nada essa é uma versão pré-alfa-beta-gamma . Ainda não teste muito bem, pode ter alguns bugs.
https://github.com/memristor/Arduino_Blink_Whitout_Delay
o código exemplo fica assim
#include <DigitalToggle.h>
#define LED13 13
void setup() {
pinMode(LED13, OUTPUT);
}
void loop(){
digitalToggleDelay(100, LED13);
}
muito legal Flávio,
estou testando aqui, e está funcionando perfeitamente. Testei inclusive com dois leds piscando com tempos diferentes e foi blz.
Apos as ultimas conversas, pensei em uma outra coisa, e gostaria de saber se é possível criar uma biblioteca que possa usar { }. como o comando "for" ou "if".
Se puder, pensei em criar uma função/comando que pode ser usada para threads.
o uso seria assim: (3 exemplos abaixo)
void loop(){
threads(1000,1) // executa o que tem dentro da chave a cada 1000 millis - Thread 01
{
ler sensor 1,
}
threads(700,2) // executa o que tem dentro da chave a cada 700 millis - Thread 02
{
acende a luz do alerta 2
}
threads(200) // executa o que tem dentro da chave a cada 200 millis - Thread 03
{
ler sensor 2;
Se sensor 2 >20 executa um comando....
}
desculpe a falta de organização, mas isso é possivel? existe?
Pedroso,
Não existe (pelo menos que eu saiba) mas dá para implementar. Eu vou precisar fazer isso e vou utilizar o Timer1.
O que tenho em mente é implementar uma interrupção por tempo a cada "n" milisegundos e fazer o tempo das threads na forma de múltiplos destas interrupções;
Utilizando o seu exemplo, poderia ser implementado da forma de uma interrupção a cada 100milisegundos, nesse caso a thread1 seria executada a cada 10 interrupções, a thread2 a cada 7 interrupções e a thread 3 a cada 2 interrupções.
Eu já testei esse modelo com duas funções - uma a cada 200milisegundos e a outra a cada 50 intervalos, ou seja, a cada 10segundos. E funcionou bem, mas pretendo implementar na forma de biblioteca.
Se der certo, posto aqui em mais alguns dias.... tô meio atarefado com outras coisas, mas se alguém pegou a idéia, não é dificil. O Timer1 é o melhor, por ser 16bits.
O bacana seria se tivessemos vários registradores de 16 bits, mas tendo um só dá prá quebrar o galho desse jeito. Acho... vou testar
Olá Pedroso.
É mais ou menos isso que vc queria ?
#define BOOM 250000 //define ciclo de interrupção a cada 250000 microseg (1/4seg)
#define LED1 6
#define LED2 7
void setup()
//cria TicTacBoom e define função userCall1 a cada 2 ciclos de 1/4seg
TicTacBoom ticBoom = TicTacBoom(BOOM, 2, userCall1);
//adiciona nova função userCall2 a cada 3 ciclos
ticBoom.add (3, userCall2);
}
void userCall1(){
digitalToggle(LED1);
}
void userCall2(){
digitalToggle(LED2);
}
Exemplo completo e a biblioteca criada no arquivo anexo.
A classe TicTacBoom está definida para aceitar até 5 ciclos e respectivas userCall(); pode ser modificado à vontade, só modificar a linha:
#define TICTAC_SIZE 5
pelo valor desejado.
Observe que a função já utiliza a biblioteca criada pelo nosso colega Flavio (thanks brother).
Bom, para mim está funcionando direitinho.
Note também que a classe não utiliza delay() nem millis(), funciona com interrupções atarvés da biblioteca nativa do Arduino Timer1.
Ou seja, conforme poderá ver, no exemplo acima, que troca o estado do pino 6 a cada 2 ciclos de 1/4seg (1/2seg) e do pino 7 a cada 3 ciclos, não é utilizado a função loop().
Dessa forma é possivel deixar os dois leds "piscando" e fazer o código desejado em loop().
Seu comentário é bem vindo.
Esqueci de anexar. Segue.
Sensacional Flavio ! Muito boa !!
Como eu preciso implementar um código com 3 ou 4 threads e o Timer1 é um só, vou ver se dá para utilizar sua biblioteca, se não eu uso por interrupção mesmo.
Depois aviso.
ha ha ha, legal, a coisa tá rendendo, tá dando frutos... muito legal...
Muito boa sua modificação Flavio.
Por favor tire-me uma dúvida. Não entendi o código abaixo:
#if defined(ARDUINO) && ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
// #include <inttypes.h>
Pretendo utilizar sua biblioteca - talvez precise fazer umas modificações, depois posto aqui.
Valeu !
Olá, espero que tenha gostado da ideia da biblioteca, ainda está em construção.
Esse trecho de código é apenas para manter compatibilidade com versões da IDE que usam Arduino.h ou WProgram.h
O ultimo include está comentado e não está sendo utilizado, esqueci de apagar.
Como mostra no site.
https://www.arduino.cc/en/Main/ReleaseNotes
Até mais
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por