collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Escolher led random  (Lida 5064 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Escolher led random
« em: 26 de Setembro de 2010, 19:21 »
Boas pessoal

Estou a tentar fazer o arduino acender um led random durante um tempo random, tenho o codigo feito, excepto escolher o led random.

Vai uma ajudinha?

Cod:

int ledPin5 =  5;
int ledPin6 =  6;
int ledPin7 =  7;
int ledPin8 =  8;
int ledPin9 =  9;
int ledPin10 =  10;
int ledPin11 =  11;
int ledPin12 =  12;
int ledPin13 =  13;
long randOn = 0;                  // Initialize a variable for the ON time
long randOff = 0;                 // Initialize a variable for the OFF time

void setup()   {               
  // initialize the digital pin as an output:
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(ledPin7, OUTPUT);
  pinMode(ledPin8, OUTPUT);
  pinMode(ledPin9, OUTPUT);
  pinMode(ledPin10, OUTPUT);
  pinMode(ledPin11, OUTPUT);
  pinMode(ledPin12, OUTPUT);
  pinMode(ledPin13, OUTPUT);
 
}
void loop()                       // run over and over again
{
 randOn = random (100, 1200);    // generate ON time between 0.1 and 1.2 seconds
 randOff = random (200, 900);    // generate OFF time between 0.2 and 0.9 seconds
   digitalWrite(ledPin5, HIGH);   // sets the LED on
   delay(randOn);                // waits for a random time while ON
   digitalWrite(ledPin5, LOW);    // sets the LED off
   delay(randOff);               // waits for a random time while OFF
}

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.631
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re: Escolher led random
« Responder #1 em: 26 de Setembro de 2010, 19:45 »
Incializa os LEDs num array e depois faz random a uma variável, e mete essa variável a acender os leds.

tipo

int myLeds[8]={5,6,7,8,9,10,11,12,13};

....

random(X);

digitalWrite(myLeds[X], HIGH);

myLeds[0] será o led no pin 5, e myLeds[8] será o led no pino 13.

PS: O random no arduino não é random, é uma sequencia grande, se quiseres random "do bom" vai buscar a random seed a um pino analógico a flutuar, ou seja que não esteja ligado a nada.
« Última modificação: 26 de Setembro de 2010, 19:47 por amando96 »

Offline Cynary

  • Mini Robot
  • *
  • Mensagens: 182
Re: Escolher led random
« Responder #2 em: 26 de Setembro de 2010, 19:49 »
Em vez de configurares os pinos em variáveis separadas, configura todos juntos numa array, por exemplo:

Código: (c) [Seleccione]
int ledpins[9] = {5,6,7,8,9,10,11,12,13};
Depois, para seleccionares o pino a usar, é só usar o resultado de random(9) como o índice do array:

Código: (c) [Seleccione]
#define LEDs 9
int ledPins[LEDs] = {5,6,7,8,9,10,11,12,13};
int randOn = 0;                  // Initialize a variable for the ON time
int randOff = 0;                 // Initialize a variable for the OFF time
int cur_led = 0;

void setup()   {               
  // initialize the digital pin as an output:
  int i;
  for(i = 0; i < LEDs; ++i) {
    pinMode(ledPins[i], OUTPUT);
}
void loop()                       // run over and over again
{
 randOn = random (100, 1200);    // generate ON time between 0.1 and 1.2 seconds
 randOff = random (200, 900);    // generate OFF time between 0.2 and 0.9 seconds
 cur_led = random(LEDs);
   digitalWrite(ledPins[cur_led], HIGH);   // sets the LED on
   delay(randOn);                // waits for a random time while ON
   digitalWrite(ledPins[cur_led], LOW);    // sets the LED off
   delay(randOff);               // waits for a random time while OFF
}

PS: randOn e randOff não precisam de ser long.
No teu caso, bastava fazeres random(5,14), mas visto que podes mudar os pinos a usar, e o número de LEDs, é muito mais fácil de mudar o código se definires uma constante LEDs, com esse número, e uma array com os pinos.

PS: tenta usar as tags code, já que torna o código mais legível.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Escolher led random
« Responder #3 em: 26 de Setembro de 2010, 22:27 »
E o ledsPin e o cur_led e o i do for até podem ser chars, sempre poupas na ram..
Avr fanboy

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Escolher led random
« Responder #4 em: 26 de Setembro de 2010, 22:49 »
Boas, eu ainda sou muito novo nisto, estou a iniciar este projecto pa ver se me começo a dar mais com isto, muitas das expressoes que usam nao percebo. lol

O que fiz até agora foi a pegar em exemplos e juntar, ja tinha tambem tido a ideia em juntar os "ini ledpin" em grupos, mas nao sabia como fazer.

Em relação ao segunda resposta, podiam explicar para que serve o
 " void setup()   {               
  // initialize the digital pin as an output:
  int i;
  for(i = 0; i < LEDs; ++i) {
    pinMode(ledPins, OUTPUT);" ?

e o cur_led?

queria perceber isto :)

ah,.e a compilar esse codigo, da-me erro na linha asseguir ao voidloop.

Obrigadºao a todos

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Escolher led random
« Responder #5 em: 26 de Setembro de 2010, 22:56 »
Código: [Seleccione]
#define LEDs 9
char ledPins[LEDs] = {5,6,7,8,9,10,11,12,13};
int randOn = 0;                  // Initialize a variable for the ON time
int randOff = 0;                 // Initialize a variable for the OFF time
uint8_t cur_led = 0;             // Variavel que guarda o valor do led que vai ser ligado
uint8_t i=0;                     // Variavel usada no for

void setup()   {               
  // initialize the digital pin as an output:
  for(i = 0; i < LEDs; ++i) { 
    pinMode(ledPins[i], OUTPUT);}    //usando i como indice no array(tabela) ledPins configura todos esses pinos como saidas
}
void loop()                       // run over and over again
{
 randOn = random (100, 1200);    // generate ON time between 0.1 and 1.2 seconds
 randOff = random (200, 900);    // generate OFF time between 0.2 and 0.9 seconds
 cur_led = random(LEDs);
   digitalWrite(ledPins[cur_led], HIGH);   // sets the LED on
   delay(randOn);                // waits for a random time while ON
   digitalWrite(ledPins[cur_led], LOW);    // sets the LED off
   delay(randOff);               // waits for a random time while OFF
}

Assim já compila, se tens tudo preparado experimenta o código.
Avr fanboy

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Escolher led random
« Responder #6 em: 26 de Setembro de 2010, 23:47 »
Muit0 obrigado, estou so a espera de uns led's, ja agora, tenho que utilizar uma resistencia de 330 em cada pino digital, certo?


E poderia explicar para que servem estas duas frases no codigo? apesar do comentario, nao consegui perceber.

uint8_t cur_led = 0;             // Variavel que guarda o valor do led que vai ser ligado
uint8_t i=0;                     // Variavel usada no for

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Escolher led random
« Responder #7 em: 26 de Setembro de 2010, 23:51 »
uint8_t é uma variavel de 8bits para guardar numeros que variem entre 0 e 255, é o mesmo que usar unsigned char, mas char pode-te confundir por pensares que é um caracter.
Avr fanboy

Offline Cynary

  • Mini Robot
  • *
  • Mensagens: 182
Re: Escolher led random
« Responder #8 em: 26 de Setembro de 2010, 23:51 »
Obrigado pela correcção no código (foi mesmo distracção ter-me esquecido do '}' :S), e sugestões de gestão de memória, senso.

Quanto ao que não percebes, joaopedrocmp:
Usei um loop for para inicializar os pinos todos separadamente. Fiz isso para tornar o código mais facilmente alterável.
Por exemplo, imagina que adicionavas dois LEDs. Tinhas de adicionar mais dois "pinMode(led, OUTPUT)". E depois alteravas novamente, e assim sucessivamente.
É sempre uma boa ideia programar de forma a considerar que se vai reutilizar o código :)
Em termos de performance, o compilador pode optimizar um loop com iterações conhecidas para um conjunto de instruções separadas, ou manter o loop, de acordo com o que ele achar ser o melhor rácio tamanho/performance do programa.
Quanto ao cur_pin: guardei todos os pinos numa array. Como são 9 pinos, essa array terá um index de 0 a 8. cur_pin irá conter um valor aleatório ao longo do programa, entre 0 e 8, inclusive (através da instrução random(9)). Assim, usamos esse valor como o índice da array. Não usei o random(9) directamente, pois tens de usar o mesmo valor duas vezes.
O cur_led já expliquei, o 'i' é a variável para ser iterada durante o setup().
Quanto à resistência, sim, tens de usar.

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Escolher led random
« Responder #9 em: 26 de Setembro de 2010, 23:58 »
:) muito obrigado pela explicação.

Começar a fazer isto sem bases é um bocadinho complicado, mas tem que se trabahar :P

Agora o proximo passo é fazer um contador, em que cada vez que a leitura de um pino for "HIGH" vai adicionar uma unidade no display. e juntar um codigo no outro, em que cada vez que o led "x" ligar, e o switch for primido, vai contar mais um no display.

:)

Vou tentar fazer o counter sozinho. brevemente digo alguma coisa ;)

Obrigado mais uma vez

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Escolher led random
« Responder #10 em: 27 de Setembro de 2010, 01:50 »
Ora ca está, acho que este counter irá funcionar.

Código: [Seleccione]
int switchPin = 4;              // switch is connected to pin 4
int val;                        // variable for reading the pin status
int buttonState;                // variable to hold the button state
int buttonPresses = 0;          // how many times the button has been pressed

void setup() {

  pinMode(switchPin, INPUT);    // Set the switch pin as input
  Serial.begin(9600);


  buttonState = digitalRead(switchPin);   // read the initial state
  }

void loop(){

  val = digitalRead(switchPin);      // read input value and store it in val

 if (val != buttonState)           // the button state has changed!
    if (val == HIGH)              // check if the button is pressed
      buttonPresses++;               // increment the buttonPresses variable
 

             Serial.print("Count:");
        Serial.print(buttonPresses);

axam que deva começar a juntar um codigo com o outro?

Offline Cynary

  • Mini Robot
  • *
  • Mensagens: 182
Re: Escolher led random
« Responder #11 em: 27 de Setembro de 2010, 01:57 »
O contador que fizeste está bom.
No entanto, tens de ter em contas as características físicas do próprio botão, e o efeito de bounce.
Quando estás a largar um botão, algumas cargas eléctricas podem "saltar", colocando o botão em HIGH e LOW alternadamente, muito depressa. Assim o contador incrementa mais do que uma vez.
Uma forma de evitares isso é esperares um pouco após leres o utilizador a carregar o botão, antes de leres novamente. (isto é a presumir que não ficas a carregar no botão durante algum tempo, antes de o largares).
Outra forma é efectuares várias leituras com um pequeno intervalo de distância, e verificar se são todas iguais (se forem, não está a ocorrer o efeito de bounce).

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Escolher led random
« Responder #12 em: 27 de Setembro de 2010, 02:10 »
A intenção é fazer um dispositivo(sensor),que atraves de um impacto, emita um sinal para o pino 3.

Ja agora, visto que quero quero que o counter conte apenas quando está um led ligado, posso ir buscar esse sinal ao pino positivo de cada led, passando cada um por um desses dispositivos(sensors), ligando depois todos ao pino3 certo? tipo isto:

<script src='http://img444.imageshack.us/shareable/?i=arduin.jpg&p=tl' type='text/javascript'></script><noscript></noscript>

Neste caso os simbolos de switch, seriam os sensores.
« Última modificação: 27 de Setembro de 2010, 02:12 por joaopedrocmp »

Offline Cynary

  • Mini Robot
  • *
  • Mensagens: 182
Re: Escolher led random
« Responder #13 em: 27 de Setembro de 2010, 13:24 »
Se é um sensor de impacto, vais ter provavelmente os mesmo problemas com as suas características físicas que tinhas com o switch, tendo-se de eliminar o bouncing de qualquer forma.
Esse esquema que fizeste, penso que não precisas de tantos sensores (e se usares só um, só incrementava o counter caso o LED que ligava a esse estivesse ligado), basta-te um.
A ideia é ligares o output de todos os pinos, em paralelo, a um sensor. Assim, basta um LED estar ligado para contar o sinal. (não tenho a certeza disto, alguém pode confirmar? uns díodos entre os pinos e o sensor, também seriam bons, para garantir que a corrente corre apenas para o pino 3).

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Escolher led random
« Responder #14 em: 27 de Setembro de 2010, 20:44 »
Nao, a ideia principal, é fazer um conjunto de "x" alvos, que activam random ,num tempo random, e que leva o sensor, para contar o numero de vezes atingido. para treinar a reacção. Por isso cada led tem que ter o seu sensor. o diagrama que fiz em cima, garante-me que so conta quando acerto no led que esta aceso.

Confirma la :)

quanto ao efeito bounce,ja sei como resolver, cada vez que o contador recebe o primeiro impulso, vai reiniciar o random dos led's. como demora sempre algum tempo até acender o proximo, nao me vai contar mais vez nenhuma.

Resultará?