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
}

Exibições: 1316

Responder esta

Respostas a este tópico

//Eu faço só assim:

void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, !digitalRead(13));
delay(1000);
}

//abraços

Eduardo,  uma grande ideia cara.

  É isso que é incrivel na comunidade arduino,  troca de ideias, evolução,  compartilhamento.

  Realmente a inversão do estado de leitura deve provocar um belo blink,  no momento tô sem um arduino aqui pra testar, mas a ideia deve dar certo mesmo. e ainda economiza uma linha que é a linha da declaração da variavel booleana, visto que na sua ideia se inverte o estado.

  No meu dá mais algumas linhas pois coloquei o pino como uma variavel,  e no seu ele é fixo(13)  mas super valeu a ideia.

    Vou testar e parabens!

Valeu Weider, poderíamos iniciar um post sobre soluções de lógicas em códigos, vejo uma grande dificuldade de usuários ao fazer certas lógicas que são simples.

Mais também:

Me desculpa mais vejo muitos usuários que nunca estudaram lógica de programação e querem construir um código para controlar sua casa toda ou automatizar uma linha de produção. Acho que são péssimos profissionais e pessoas que não querem se dar o trabalho de estudar um pouco mais.

Um grande abraço!

Ola eduardo,

   Cara, realmente, muita gente que entra aqui quer pegar coisas prontas e não pesquisar e pensar,  mas fazer o que é o espirito da modernidade.

   Outro dia encontrei um amigo que tinha acabado de apresentar sua tese de mestrado em filosofia, algo como medicina em niestzche,  ele havia lido muito e tava bem introspectivo por aqueles dias,  dai quando tomamos uma cerveja eu o questionei: putz cara, depois de ler tanto você deve estar achando as pessoas meio burras né não?

   Ele me olhou e respondeu:  Weider, eu percebi que as pessoas não são burras, elas são vazias.

   Dai Globo, Veja e a grande midia se aproveita disso pra preencher esse espaço criando uma geração que acha que tudo que vem de fora especialmente dos EUA é perfeito, e que tudo aqui é lixo, inclusivo si mesmo, isso muito alem de politica.

    Estudar logica geral é uma coisa, eu estudei lógica voltada a informatica, lógica voltada a filosofia, lógica voltada a oratoria,  algoritimos,  fluxogramas, etc.  porem, algumas coisas vão alem disso.

    Um exemplo é sua ideia ai,  simples, eficiente, ericaz.

    Eu havia pensado nela, só que havia usado o comando NÃO como !=  e não somente como ! ,  dai não tinha dado certo.

     Ou seja a coisa vai alem de logica, tem conhecimento de sintaxe tambem.

     O arduino varia do C, e tem coisa que não se encontra nos livros de arduino, mas que se trouxermos do C para o arduino ele vai aceitar, por exemplo, se usa muito pouco DEFINE no arduino pra definir variaveis, se utiliza mais indicacao de tipo como int x;

    Nesse exato momento tô apanhando em relação ao tamanho maximo de dados dentro de uma matriz,  eu estou estudando os nrf24l01 transportando dados de sensores, só que pra cada dado captado eu quero mandar junto a hora, minuto e segundo, ate ai beleza, só que a ideia é colocar um modulo central que junte os dados de varios sensores e mande pra uma base unica, ai a coisa pega, pois as matrizes tem limitaçao de tamanho e ai o jeito ta sendo correr pra logica.

   Na teoria automatizar uma casa é facil e lindo,  achamos que é tao facil quanto acender um led no arduino,  mas na hora de botar a mão na massa ai lascou, tem que ter conhecimento de tanta coisa como controle de carga, comunicacao sem fio, leitura e interpretacao de dados, etc.

   Mas acho que se qualquer um chegasse no blink e tomasse pau, nao teria tezão de continuar, dai, que o blink é a magica que faz a vontade nascer.

  Não quero confrontar sua opinião, mas não que eu não queira me debruçar em uma apostila, eu até tentei ao iniciar minha automação. Primeiro que não tinha com quem tirar minhas dúvidas, e depois que na prática é que ocorrem as dificuldades, e com essas acredito aprender bem mais. Não quero me profissionalizar nisso, mas é uma diversão modificar a própria casa. Acredito que passei mais tempo estudando em fóruns e obtendo mais conhecimento do que apostilas com explicações em sua maioria que não explicam. Apostila melhor que esse fórum ainda não achei,

 

Fale Weider existe um modo sim, depois desse nó escrevendo código em assembly (eu acho???)

Valido somente para o Arduino UNO

void setup() {
PORTB |= _BV(PB5); // so para garantir um estado inicial
DDRB |= _BV(PB5); // configura o pino como saida.
}

void loop() {
PORTB ^= _BV(PB5); // faz toggle no pino 13
delay(500);
}

 ################################

Valido somente para o Arduino MEGA2560

void setup() {
PORTB |= _BV(PB7); // so para garantir um estado inicial
DDRB |= _BV(PB7); // configura o pino como saida.
}

void loop() {
PORTB ^= _BV(PB7); // faz toggle no pino 13
delay(500);
}

Essa é uma programação em AVR, estou escrevendo diretamente nos registradores, mas tenho o inconveniente da baixa portabilidade do código.

As funções criadas para o Arduino escondem muita coisa, mas também existem diversos switch case dentro das bibliotecas escritas para tratar o problema de portabilidade dos códigos.

Comparando o tamanho dos arquivos gerados, na IDE do Arduino 1.6.4

Meu código:

Sketch uses 622 bytes (1%) of program storage space. Maximum is 32,256 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2,039 bytes for local variables. Maximum is 2,048 bytes.

O seu código:

Sketch uses 1,048 bytes (3%) of program storage space. Maximum is 32,256 bytes.
Global variables use 12 bytes (0%) of dynamic memory, leaving 2,036 bytes for local variables. Maximum is 2,048 bytes.

Talvez o meu código possa ficar menor, seu eu compilar fora da IDE do Arduino.

Até mais

Legal este tópico...

Eu sempre me perguntei por que não tem uma função Arduino Nativa  "delay sem delay"...

Será que é possível?  transformar o exemplo BlinkWithoutDelay em uma função.... Acho que o tone faz algo assim... mas já vi que ele conflita com outras bibliotecas...

Algo como um brink que não fica parado... algo do tipo:

ledPin=13;

void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {

blinkSemDelay(1000,ledPin );

} 

nesse caso se usa threads, a programação fica grande mesmo, porém com ótimo fluxo

http://nossosrobos.blogspot.com.br/2014/06/arduino-threads.html

aqui tem um exemplo

Também é possível utilizar a interrupção por estouro do timer ou Clear Timer on Compare (CTC) Mode.

No caso, toda vez que ocorrer uma interrupção, será executado a rotina de interrupção, através da função ISR()

Não pesquisei se o Arduino implementa isso nativamente.

Galera,

   Antes de mais nada, eu adoro esse forum, adoro a comunidade arduino, adoro vocês,  eu venho de uma geração que conhecimento técnico era caixa preta,  lembro como quase fui lixado quando na época que edição de jogos em PS1, PS2 e por ai vai era restrito a um clero,  eu escrevi A BIBLIA DA EDIÇÃO, e liberei de graça, kkk ,  foi um frisson,  obvio que meu nick na epoca sumiu da net,  mas tempos depois amigos que contaram que o manual que criei foi traduzido pela comunidade para varias linguas como, espanhol, ingles, frances, japonês e outras, puta orgulho,  mas deixei muita gente puta,  hoje chegou aqui e a galera troca os mais profundos detalhes sem constrangimento, de forma aberta e honesta,  sinceramente, isso aqui é o paraiso, vocês não sabem quanto.

Voltando a falar do topico,

   Bem, pra mim ninguem até agora bateu o codigo do Eduardo Silva.

   retirando as linhas obrigatorias, dos void.

   retirando as semi obrigatorias de indicação I/O do pino.

   O cara conseguiu resumir o codigo a 2 linhas.

   AO FLAVIO HERNAN,

    Cara, lembro que aqui a ideia não é criar o codigo mais leve, isso obviamente o assembly ganha de lavada,  a ideia é criar o codigo mais produtivo,  aquele que você tem guardado pra usar sempre, de forma simples.

    Foi o que aconteceu com o codigo do eduardo silva ai em cima,  eu tenho alguns pequenos codigos fixos,  ao qual nos meus tempos antigos chamavamos de templates,  que vira e mexe sempre vou lá e busco pra colocar nos novos codigos,  bem, o que antes eram meu BLINK TESTE MINIMO, agora não é mais o que eu tinha,  agora é esse que ele propos.

   Na minha humilde visão, o ponto fortissimo do arduino se chama PRODUTIVIDADE,  ou seja, o que se levaria um tempo enorme com linguagens menos produtivas, com o arduino e suas bibliotecas se faz rapidinho,  obvio que por isso se paga um preço,  mas ai vem a questão do que você deseja.

  AO PEDROSO,

    Pedrosão, adorei sua ideia, vamos fazer um lobby e pedir aos produtores do arduino pra incluir sua ideia que por sinal ficou fantastica.

Valeu pessoal,

Eduardo,

Eu vi estes vídeos, são muito bons e bem didáticos, mas demorei para precisar (porque só agora fiz meu primeiro scketch com mais de 1000 linhas), mas a solução do video ainda não é o que eu gostaria... pensei num comando simples para iniciantes...

Flavio, neste ponto ai, não deu prá mim... mas vou pesquisar mais dobre isso...

Wender, obrigado pelo comentário positivo e pela constante ajuda para o pessoal daqui... me motivou a trabalhar melhor na ideia... cheguei nisso aqui : 

void loop() {

delayWdelay(150,0); // executa a próxima função a cada 150 millis, "0" é uma posição desta função para no looping não confundir com os outros tempos


if (marcador[0]==LOW) {digitalWrite(13, estado[0]);} // altera o status do led de acordo com a função acima

delayWdelay(800,1);  // executa a próxima função a cada 800 millis, "1" é uma posição desta função.

if (marcador[1]==LOW){
Serial.println(analogRead(A1));); // imprime na serial a leitura de A1 a cada 800 milllis

}

void delayWdelay(int tempo, int pos){

if (marcador[pos]==LOW){
tempo_inicio[pos]=millis();
marcador[pos]=HIGH;
}
if (millis()-tempo_inicio[pos]>=tempo){
marcador[pos]=LOW;
lastestado[pos]=estado[pos];
estado[pos]=!estado[pos];

}
}

MAS eu queria uma coisa assim (mesma esquema de uso com chaves "{  }" do "FOR"):


void loop() {

delayWdelay(150,0)

            {

              digitalWrite(13, !digitalRead(13)); //posição 0 (ou primeira função que aparece, a cada 150 millis executa o que tem dentro da chave

             }  

        delayWdelay(800,1)

       {

       Serial.println(analogRead(A1)); posição 1 (ou primeira função que aparece, a cada 800 millis executa o que tem dentro da chave)

       }

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço