execultar um tarefa so mente uma vez

Boa noite amigos!!! Amigo gostaria que o arduino rota-se um protocolo somente um vez após ser ligado, ou seja que não fica-se rodando junto com o loop… Se puderem me ajudar. Desde agora muito obrigado!!!

Coloque o código na função setup() e deixe o loop() vazio.

Olá vagner,

A forma mais simples é como nosso amigo luisilva falou, ou seja, você coloca todo o codigo dentro do setup, e ai ele só é executado uma vez.

Uma segunda forma é colocar dentro do void loop mesmo, porem, com uma condicional , tipo.. if(vez=1)... isso lhe dará a liberdade de saber se realmente deseja rodar apenas uma vez, ou se desejar outras é só acrescentar valor ao conter.

Tentarei hoje mesmo… eu acho que colocar no setup não vai adiantar por que o programa tem outras funcões que vão precisar ficar rodando no loop. eu já tentei colocar um parte no setup e outro no loop e não deu certo. A funcão no setup não rodou. mais quando eu coloco no loop fica rodado toda hora sem parar. Obrigado amigos!!!

Voce tem que criar uma Funcao e chama la a qualquer momento no programa.
veja o link
http://arduino.cc/en/Reference/FunctionDeclaration.

vagner:
Tentarei hoje mesmo... eu acho que colocar no setup não vai adiantar por que o programa tem outras funcões que vão precisar ficar rodando no loop. eu já tentei colocar um parte no setup e outro no loop e não deu certo. A funcão no setup não rodou. mais quando eu coloco no loop fica rodado toda hora sem parar. Obrigado amigos!!!!

Ajudava imenso se colocasse aqui o código. Se colocar o código dentro do setup() ele só é executado uma vez. Se colocar o código dentro da função loop() esse código é executado ciclicamente ("loop"quer dizer ciclo em Inglês). Se diz que quando coloca o código dentro do loop() ele é executado mas quando coloca o código dentro do setup() ele não é executado, isso não tem nada a ver com o local onde o código está a ser executado mas deve ser um problema com o próprio código (por exemplo alguma variável que quando o setup() é chamado ainda não está definida, ou não tem o valor certo,etc.).

Se o programa tem uma parte que só deve ser executada uma vez e outra que deve ser executada várias vezes, isso quer dizer que deve colocar a 1ª parte dentro do setup() e a segunda dentro do loop().

Penso também que a ideia do WeiderAju é estupidez, até porque o que ele sugere irá sempre ser executado:

WeiderAju:
Uma segunda forma é colocar dentro do void loop mesmo, porem, com uma condicional , tipo.. if(vez=1)... isso lhe dará a liberdade de saber se realmente deseja rodar apenas uma vez, ou se desejar outras é só acrescentar valor ao conter.

Se em vez do que ele escreveu se fizer:

if (vez != 1) {
vez = 1;
// colocar aqui o código que quer executar penas uma vez
}

talvez funcione um pouco melhor.

luisilva:
Penso também que a ideia do WeiderAju é estupidez, até porque o que ele sugere irá sempre ser executado:
Se em vez do que ele escreveu se fizer:

if (vez != 1) {

vez = 1;
// colocar aqui o código que quer executar penas uma vez
}



talvez funcione um pouco melhor.

Eh pá, desculpa lá... mas não achas que é um bocado ridículo chamares estupidez ao outro post? Sim, estava bastante incompleto, mas nunca te esqueceu um =??? Leste sequer ao menos o que é sugerido em vez de olhares apenas para a linha de código?

Eu entendi o que ele queria dizer e faz sentido uma vez que ele não se ficou pelo conceito de "uma vez" e expandiu a ideia para ser possível controlar o número de vezes que certo código é corrido. Se eu que não meto os pés em Portugal vai para um ano entendi isto, certamente que alguém que vive aí entenderá melhor, ou não??

bubulindo:
Eh pá, desculpa lá… mas não achas que é um bocado ridículo chamares estupidez ao outro post? Sim, estava bastante incompleto, mas nunca te esqueceu um =??? Leste sequer ao menos o que é sugerido em vez de olhares apenas para a linha de código?

Eu entendi o que ele queria dizer e faz sentido uma vez que ele não se ficou pelo conceito de “uma vez” e expandiu a ideia para ser possível controlar o número de vezes que certo código é corrido. Se eu que não meto os pés em Portugal vai para um ano entendi isto, certamente que alguém que vive aí entenderá melhor, ou não??

Pode ser exagerado (pessoalmente não acho, mas posso aceitar que alguém o considere assim), mas ridículo não. Se um utilizador faz uma pergunta que deixa transparecer que o seu nível de programação não é muito elevado, penso que o menos que se pode fazer é ter o cuidado de fornecer código que funcione, uma vez que ele, possivelmente, não vai ter capacidade de detectar e corrigir o erro. Mas a palavra “estupidez” até nem foi pensada para essa situação, mas sim para a sugestão de colocar o código que não se quer repetir dentro do loop(). Pode fazer-se? Sim, pode. Mas não é por isso que deixa de ser “burrice”.

Conhecendo a estrutura do ficheiro main.cpp dos projectos criados com o IDE do Arduino:

#include <Arduino.h>

int main(void)
{
 init();

#if defined(USBCON)
 USBDevice.attach();
#endif
 
 setup();
    
 for (;;) {
 loop();
 if (serialEventRun) serialEventRun();
 }
        
 return 0;
}

percebe-se que se tiver-mos código que queiramos executar apenas uma vez coloca-mo-lo fora do for ( ; ; ) e se tivermos código que queiramos executar ciclicamente coloca-mo-lo dentro do desse ciclo infinito.

Nota que foi uma sugestão...

Nota também que pode existir a possibilidade de se querer correr código apenas uma vez tendo corrido já parte do loop. Eu não consigo imaginar uma neste preciso momento, mas sou humilde o suficiente para admitir que essa possibilidade pode existir e como tal a sugestão é válida.

Mas pronto... Não vale a pena chatear-me.

Muito obrigado a todos pela ajuda. Amigos o que eu queria era que o arduino leonardo tecla-se F1 em minhas maquinas de musicas toda vez que fossem ligadas por que elas estão resetando muito a bios, que passa aí à pedir F1. Foi resolvido o problema substituindo o Keyboard.write() por Keyboard.press() e também Keyboard.release() dentro do setup mesmo que ai passou a funcionar. Mais uma vez muito obrigado a todos pois esse conhecimento me abriu um leque de possibilidades.

void setup()
{
Keyboard.begin();
Serial.begin(9600);
delay(5000);
Keyboard.press(0xC2);
delay(1000);
Keyboard.release(0xC2);
}

Caros amigos tenho mais uma pergunta... Se eu substituir o cabo usb por um cabo com um pino ps2 para ligar direto na entrada ps2 do pc o arduino será reconhecido como teclado?

Não.

Amigo Bubulindo... Somente carater informativo. Eu pequei um cabo de um teclado ps2 e fiz as devidas ligações direto na saida usb do arduino. Quando liguei o pc o arduino foi reconhecido sim como teclado e esta funcionando perfeitamente.E foi resolvido o meu problema com o F1. Mais uma vez Obrigado a todos por terem aplicado em me ajudar...

Pode fazer-se? Sim, pode. Mas não é por isso que deixa de ser "burrice".

Entao amigos, vamos lá ter calma.
Tambem penso que a idea que do WeiderAju não é nada descabida, eu proprio recorro muito a este "metodo" para controlar o fluxo do meu programa muitas vezes.Se existem milhares de formas de o fazer sim, claro, umas mais eficientes que outras em termos de clareza para o programador-sim claro, portanto tento o Luis sugerido que essa forma é burrice gostaria de saber como é a tua maneira que achas certa de fazer a coisa.
Penso que muitas vezes o programador gosta de ofuscar as coisas desviando-se de escrever codigo limpo e de facil manutenção, que só no primeiro olhar diz claramente o que faz.

Eu pequei um cabo de um teclado ps2 e fiz as devidas ligações direto na saida usb do arduino

Nao é regra mas alguns teclado sim dão desta forma.Antigamente os teclados USB ate traziam um conversor para PS2 mas nem todos dao ...
Bons estudos

Obrigado HugoPT!!!!

Olá galera, tudo bom?
Comecei com arduino a pouco tempo, mas também não entendo o motivo da programação no loop, talvez isso seja por eu nunca ter programado leitura de hardware diretamente, mas tive o mesmo problema que o descrito pelo amigo Vagner.
lembro que eu gostaria de, no meio da programação, fazer um piezo emitir um sinal sonoro, mas me incomodava muito a questão do loop, pois mesmo que eu não percebesse sonoramente, sabia que piezo estava reiniciando seu comando cada vez que passava no loop.
Bom, as perguntas são:
alguém saberia me dizer por qual motivo a IDE do Arduino considera a função loop() como função principal, e não uma função genérica tal como main() que só executa uma vez?
Existe algum motivo específico para que tudo seja feito de forma cíclica?

Outra pergunta é quanto a função goto().
Sempre tive essa função como não recomendada em boas práticas de programação, pois deixava o código ilegível e acabava por produzir erros difíceis de detectar.
mas vejo essa função no Arduino, dentre as poucas implementadas nativamente, então gostaria de saber se e quando é recomendável usá-la e se ela tem um papel de melhoria de desempenho na manipulação da parte de hardware.

Acho que para responder às tuas perguntas devias abrir alguns dos ficheiros do Arduino para perceber o que é que é o Arduino e onde é que o loop, main e setup encaixam uma na outra.

Procura no teu computador pelo ficheiro main.cpp e vais encontrar este pedaço de código:

int main(void)
{
	init();

	initVariant();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

Como podes ver é extremamente parecido com o código que a maior parte das pessoas faz quando programa um microcontrolador em C.
O motivo pelo qual isto é assim é para esconder a "magia" do Arduino do utilizador e também evitar que haja mais dúvidas ou problemas. O setup e loop fazem bem isso e vendo o pedaço de código em cima dá para perceber onde é que o código fica melhor.

Dito isto, o teu exemplo pode ser evitado com um if dentro do loop...