Random gebruiken

Arduino specifieke Software
Berichten: 46
Geregistreerd: 13 Jan 2016, 11:00

Random gebruiken

Berichtdoor dinoshop » 17 Apr 2017, 22:07

deze code heb ik opgezet maar allen bij poort 2 gaat die uit en de bedoeling is juist dat men niet kan weten welke pin hem uit zet alleen door te proberen.
Code: Alles selecteren
defusePin = random(WIRE_1, (WIRE_4 + 1));
  detPin = defusePin;
  while (detPin == defusePin) {
  detPin = random(WIRE_1, (WIRE_4 + 1));
  digitalWrite(ledPin1, LOW);


waarom werkt die niet ?

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Random gebruiken

Berichtdoor shooter » 17 Apr 2017, 22:16

waar is de rest van de code? en wat is het probleem.
paul deelen
shooter@home.nl

Berichten: 46
Geregistreerd: 13 Jan 2016, 11:00

Re: Random gebruiken

Berichtdoor dinoshop » 17 Apr 2017, 22:32

Scooter

wat ik zou willen is dat als programma start een uitgang dus 2 3 4 of 5 wordt geselecteerd als diffuse uitgang de rest moet dus niets doen .
waardoor de spanning wordt gecreëerd welke draadje is veilig en welke laat alarm afgaan.
hoop dat je mij begrijpt .

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Random gebruiken

Berichtdoor Koepel » 18 Apr 2017, 07:06

Het stukje code komt niet overeen met je beschrijving. Maar ik begrijp niet helemaal wat je wilt.
Kun je een duidelijkere beschrijving geven ? Wanneer gebeurt er wat ?

Berichten: 46
Geregistreerd: 13 Jan 2016, 11:00

Re: Random gebruiken

Berichtdoor dinoshop » 19 Apr 2017, 09:52

Eigenlijk heel eenvoudig>
4 draden aan nul deze komen uit op ingang 2,3,4,5 van de ardruino uno.
Fuctie`s zijn 1 niets 2 moet de counter time delen door 2 . 3 deze deelt de countertijd door 3 . en 4 laat de alarm afgaan.
maar nu moet het dus willekeurig worden geregeld door de arduino .


dus welke 1 2 3 of 4 wordt. na twee keer spelen word op de oude manier dus voorspelbaar en das niet leuk.
Code: Alles selecteren
#include<Wire.h>
#include <Keypad.h>
#include <Keypad_I2C.h>
#include <LiquidCrystal_I2C.h>
#include <Tone.h>
#define I2CADDR 0x38
#define pound

int WIRE_1 = 2;
int WIRE_2 = 3;
int WIRE_3 = 4;
int WIRE_4 = 5;

//Time game 20 minuten
int Hcount = 00; // count hours
int Mcount = 20; // count minutes
int Scount = 59; // count seconds

int DefuseTimer = 0; // set timer to 0
int detPin = 0;
int defusePin = 0;
long secMillis = 0; // store last time for second add
long interval = 1000; // interval for seconds

char password[4]; // number of characters in our password
int currentLength = 0; //defines which number we are currently writing
int i = 0;
char entered[4];

int ledPin1 = 11; //relay 2
int ledPin2 = 12; //buzzer
int ledPin3 = 13; //relay 1


LiquidCrystal_I2C lcd(0x27, 16, 2);

//define the keypad
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys [ROWS][COLS] =
{ {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {0, 1, 2, 3};
byte colPins[COLS] = {4, 5, 6, 7};

Keypad_I2C customKeypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS, I2CADDR);
char customKey;

void setup()
{
  customKeypad.begin( );
  lcd.init();
  lcd.backlight();
  pinMode(WIRE_1, INPUT_PULLUP);
  pinMode(WIRE_2, INPUT_PULLUP);
  pinMode(WIRE_3, INPUT_PULLUP);
  pinMode(WIRE_4, INPUT_PULLUP);
  digitalWrite(WIRE_1, HIGH);
  digitalWrite(WIRE_2, HIGH);
  digitalWrite(WIRE_3, HIGH);
  digitalWrite(WIRE_4, HIGH);
  pinMode(ledPin1, OUTPUT); // sets the digital pin as output
  pinMode(ledPin2, OUTPUT); // sets the digital pin as output
  pinMode(ledPin3, OUTPUT); // sets the digital pin as output
  digitalWrite(ledPin1, HIGH); // sets the LED
  digitalWrite(ledPin2, HIGH); // sets the LED
  digitalWrite(ledPin3, HIGH); // sets the LED
  lcd.begin(16, 2);
  Serial.begin(9600);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("OfficeTwo");
  lcd.setCursor(0, 1);
  lcd.print("**Game of Rush** ");
  delay (3000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Enter Code: ");
  while (currentLength < 4)  {
    char customKey = customKeypad.getKey();
    if (customKey != NO_KEY) {
      password[currentLength] = customKey;
      currentLength++;
      lcd.setCursor(currentLength + 6, 1);
    }
    else delay(10);
  }

  {
    delay(50);
    digitalWrite(ledPin2, HIGH); // sets the LED
    delay(100);
    digitalWrite(ledPin2, LOW); // sets the LED
    delay (100);
    digitalWrite(ledPin2, HIGH); // sets the LED
    delay(100);
    digitalWrite(ledPin2, LOW); // sets the LED
    lcd.noCursor();
    lcd.clear();
    lcd.home();
    lcd.print("You've Entered: ");
    lcd.setCursor(6, 1);
    lcd.print(password[0]);
    lcd.print(password[1]);
    lcd.print(password[2]);
    lcd.print(password[3]);
    delay(3000);
    lcd.clear();
    currentLength = 0;
  }
}

void loop()
{

  defusePin = random(WIRE_1, (WIRE_4 + 1));
  detPin = defusePin;
  while (detPin == defusePin) {
  detPin = random(WIRE_1, (WIRE_4 + 1));
  digitalWrite(ledPin1, LOW);
    timer();
    char customKey = customKeypad.getKey();
    if (customKey == '*')
    {
      lcd.clear();
      lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Code:          ");

      while (currentLength < 4)
      {

        timer();

        char customKey = customKeypad.getKey();
        if (customKey == '#')
        {
          currentLength = 0;
          lcd.clear();
          lcd.home();
          lcd.setCursor(0, 0);
          lcd.print("Code:           ");
        }
        else if (customKey != NO_KEY) {
          Serial.println(customKey);

          lcd.setCursor(currentLength + 7, 0);
          lcd.cursor();

          lcd.print(customKey);
          entered[currentLength] = customKey;
          currentLength++;

          delay(100);
          lcd.noCursor();
          lcd.setCursor(currentLength + 6, 0);
          lcd.print("*");
          lcd.setCursor(currentLength + 7, 0);
          lcd.cursor();
        }
      }

      if (currentLength == 4 | digitalRead(WIRE_4) == HIGH)
      {
        if (entered[0] == password[0] && entered[1] == password[1] && entered[2] == password[2] && entered[3] == password[3] | digitalRead(WIRE_4) == HIGH)
        {
          lcd.noCursor();
          lcd.clear();
          lcd.home();
          lcd.print("Bomb Defused");
          currentLength = 0;
          digitalWrite(ledPin1, HIGH); // sets the LED
          digitalWrite(ledPin2, HIGH); // sets the LED
          delay(500);
          digitalWrite(ledPin2, LOW); // sets the LED
          delay (100);
          digitalWrite(ledPin2, HIGH); // sets the LED
          delay(100);
          digitalWrite(ledPin2, LOW); // sets the LED
          delay (500);
          digitalWrite(ledPin2, HIGH); // sets the LED
          delay(500);
          digitalWrite(ledPin2, LOW); // sets the LED
          delay (100);
          digitalWrite(ledPin2, HIGH); // sets the LED
          delay(100);
          digitalWrite(ledPin2, LOW); // sets the LED
          delay (500);
          digitalWrite(ledPin2, HIGH); // sets the LED
          delay(500);
          digitalWrite(ledPin2, LOW); // sets the LED
          delay (100);
          digitalWrite(ledPin2, HIGH); // sets the LED
          delay(500);
          digitalWrite(ledPin2, LOW); // sets the LED
          lcd.clear();
          lcd.home();
          lcd.print("Resetting Bomb");
          lcd.setCursor (0, 1);
          lcd.print("Please Wait");
          delay(8000);
          software_Reset();
        }
        else
        {
          lcd.noCursor();
          lcd.clear();
          lcd.home();
          lcd.print("Wrong Password!       ");
          digitalWrite(ledPin2, HIGH); // sets the LED
          delay(50);
          digitalWrite(ledPin2, LOW); // sets the LED
          delay(50);
          digitalWrite(ledPin2, HIGH); // sets the LED
          delay(50);
          digitalWrite(ledPin2, LOW); // sets the LED
          delay (50);
          digitalWrite(ledPin2, HIGH); // sets the LED
          delay(50);
          digitalWrite(ledPin2, LOW); // sets the LED
          delay(50);
          digitalWrite(ledPin2, HIGH); // sets the LED
          delay(50);
          digitalWrite(ledPin2, LOW); // sets the LED
          if (Hcount > 0)
          {
            Hcount = Hcount / 5;
          }

          if (Mcount > 0)
          {
            Mcount = Mcount / 4;
          }
          if (Scount > 0)
          {
            Scount = Scount / 2 ;
          }
          delay(1500);
          currentLength = 0;

        }
      }
    }
  }
}
void timer()
{



  Serial.print(Scount);
  Serial.println();

  if (Hcount <= 0 | digitalRead(WIRE_1) == HIGH )
  {
    if ( Mcount < 0 | digitalRead(WIRE_1) == HIGH )
    { Scount = Scount / 0;
      lcd.noCursor();
      lcd.clear();
      lcd.home();
      lcd.print("The Bomb Has       ");
      lcd.setCursor (0, 1);
      lcd.print("Exploded!         ");
      digitalWrite(ledPin3, LOW); // sets the LED on
      while (Scount == 0)
        digitalWrite(ledPin3, LOW); // sets the LED on
      digitalWrite(ledPin2, HIGH); // sets the LED of
      delay(1000);
      digitalWrite(ledPin2, LOW); // sets the LED of
      delay(500);
      digitalWrite(ledPin2, HIGH); // sets the LED on
      delay(1500);
      digitalWrite(ledPin2, LOW); // sets the LED off
      delay(500);
      digitalWrite(ledPin2, HIGH); // sets the LED on
      delay(1500);
      digitalWrite(ledPin3, HIGH); // sets the LED on
      digitalWrite(ledPin2, LOW); // sets the LED off
      lcd.clear();
      lcd.home();
      lcd.print("Resetting Bomb  ");
      lcd.setCursor (0, 1);
      lcd.print("Please Wait         ");
      delay(10000);
      software_Reset();

    }
  }


  lcd.setCursor (0, 1); // sets cursor to 2nd line
  lcd.print ("Timer:          ");

  if (Hcount >= 10)
  {
    lcd.setCursor (7, 1);
    lcd.print (Hcount);
  }
  if (Hcount < 10)
  {
    lcd.setCursor (7, 1);
    lcd.print ("0");
    lcd.setCursor (8, 1);
    lcd.print (Hcount);
  }

  lcd.print (":");

  if (Mcount >= 10)
  {
    lcd.setCursor (10, 1);
    lcd.print (Mcount);
  }
  if (Mcount < 10)
  {
    lcd.setCursor (10, 1);
    lcd.print ("0");
    lcd.setCursor (11, 1);
    lcd.print (Mcount);
  }

  lcd.print (":");

  if (Scount >= 10)
  {
    lcd.setCursor (13, 1);
    lcd.print (Scount);
  }
  if (Scount < 10)
  {
    lcd.setCursor (13, 1);
    lcd.print ("0");
    lcd.setCursor (14, 1);
    lcd.print (Scount);
  }

  if (Hcount < 0)
  {
    Hcount = 0;
  }

  if (Mcount < 0)
  {
    Hcount --;
    Mcount = 59;
  }

  if (Scount < 1) // if 60 do this operation
  {
    Mcount --; // add 1 to Mcount
    Scount = 59; // reset Scount
  }

  if (Scount > 0) // do this oper. 59 times
  {
    unsigned long currentMillis = millis();

    if (currentMillis - secMillis > interval)
    {

      secMillis = currentMillis;
      Scount --; // add 1 to Scount
      delay (5);


    }
  }
}



void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers
{
  asm volatile ("  jmp 0");
}



Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Random gebruiken

Berichtdoor Koepel » 19 Apr 2017, 12:26

De Arduino functie random (https://www.arduino.cc/en/reference/random) geeft iedere keer dezelfde reeks getallen vanaf het opstarten.
Om dat te voorkomen kun je bij het opstarten een andere 'seed' geven, dan worden de random getallen vanaf die 'seed' berekend (https://www.arduino.cc/en/Reference/randomSeed).

Je kunt analoge ingangen gebruiken, ongeacht of ze open staan of aangesloten zijn. Je kunt ook kijken hoe lang het duurt voordat iemand voor de eerste keer op een knop drukt. Of de tijd van een RTC chip gebruiken. Je mag alles tegelijk doen, en de getallen kun je bij elkaar optellen of XOR er mee doen. Alles mag, zolang er maar iedere keer een ander getal uit komt.

Je zou voor de grap op een internationaal forum kunnen vragen hoe je aan true random komt. Dan krijg je heel wat over je heen, omdat echt random erg lastig is.

Ik gebruik de analoge ingangen. Doe dit voordat je pinnen gaat gebruiken, en ongeacht of ze gebruikt worden of niet.
Is het voor een Arduino Uno ?
Code: Alles selecteren
int total = 0;
for( int i=A0; i<=A5; i++)
{
  total += analogRead( i);
}
randomSeed( total);

Berichten: 46
Geregistreerd: 13 Jan 2016, 11:00

Re: Random gebruiken

Berichtdoor dinoshop » 26 Apr 2017, 09:43

Geacht

dit is een loop dus niet precies wat ik zoek
heel eenvoudig
als ik de verbinding met bv pin drie verbreek moet de timer verspringen naar de helft van de tijd dus bv timer /2
en als ik bv pin 3 verbreek moet hij delen door 4
en als mogelijk is moeten die pinnen door het programma gekozen worden bij opnieuw opstarten
dus nu is bv pin 3 bom gaat af bij de volgende spel moet bv deze één van de andere poorten kiezen. en zo ook met de rest van deze 4 poorten
en pin 4 bv wordt dan timer =timer /2
pin 3 bom diffuse
pin 2 timer = timer /5
pin 1 bom explode
en bij de volgende opstart wordt dit bv
pin 4 bom explode
pin3 timer =timer /5
pin 2 bom diffuse
pin 1 timer = timer / 2
het deel van de timer staat er al in script
nu der est nog

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Random gebruiken

Berichtdoor Koepel » 26 Apr 2017, 10:38

Sorry, ik begrijp het niet meer.
Het optellen van de analoge ingangen is bedoeld om in setup() eenmalig te doen om zo de randomSeed() te zetten. Dan maakt de Arduino na het opstarten iedere keer een andere reeks van random getallen.

Wanneer je geen for-loop wilt gebruiken, kun je ook dit doen:
Code: Alles selecteren
void setup()
{
  int total = analogRead( A0);
  int total += analogRead( A1);
  int total += analogRead( A2);
  int total += analogRead( A3);
  int total += analogRead( A4);
  int total += analogRead( A5);
  randomSeed( total);
Ik neem aan dat dit geen antwoord is op je vraag, maar ik begrijp er echt helemaal niets meer van :(

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Random gebruiken

Berichtdoor Koepel » 26 Apr 2017, 18:09

Bedoel je misschien dat je willekeurig vier verschillende functies wilt toewijzen aan vier Arduino pinnen ?
Dus je probleem is een wiskundig probleem ?

Ik ging er van uit, dat dat deel geen probleem zou zijn. Sorry :oops:

Waarschijnlijn is "random permutation" de meest gangbare naam voor zo'n reeks getallen: https://en.wikipedia.org/wiki/Random_permutation
Daar zijn verschillende wiskundige oplossingen voor, met allerlei vreemde namen.

Maar ik had vandaag geen zin in al die wiskunde. Dan maar 'Quick and Dirty'.
Ik gebruik een array van 4 elementen, en daarin ken ik de functies toe voor de pinnen.
Vervolgens verwissel ik twee elementen, net zo lang totdat het een beetje op random begint te lijken.

cpp code
enum
{
CLEAR = 0, // 0 = niets
DIV2, // 1 = delen door 2
DIV3, // 2 = delen door 3
ALARM // 3 = alarm
} AssignCode; // an 'enum' creates an integer.

char *assignText[] = { "Clear", "Div 2", "Div 3", "Alarm" };

int pins[4] = { 2, 3, 4, 5 };
int pinAssign[4]; // the function that is assigned to a pin.


void setup()
{
Serial.begin( 9600);
while( !Serial); // only for leonardo and micro

Serial.println();
Serial.println( "Assign randomly 4 functions to 4 pins");
Serial.println( "=====================================");

// --------------------------------------------
// Create a random seed
// This will generate a different sequence every time the Arduino starts.
// --------------------------------------------
int total = 0;
for( int i=A0; i<=A5; i++)
{
total += analogRead( i);
}
randomSeed( total);

// --------------------------------------------
// Assign a certain function to the pins.
// This is just a start, it will be randomized later.
// --------------------------------------------
pinAssign[0] = CLEAR;
pinAssign[1] = DIV2;
pinAssign[2] = DIV3;
pinAssign[3] = ALARM;
}


void loop()
{
shuffle(); // continue to shuffle with the shuffled array.
for( int i=0; i<4; i++)
{
Serial.print( "pin ");
Serial.print( pins[i]);
Serial.print( " = ");
Serial.print( assignText[pinAssign[i]]);
Serial.print( ", ");
}
Serial.println();

delay( 5000);
}


// --------------------------------------------
// Shuffle the global 'pinAssign' randomly
// This is the most simple shuffle.
// Two elements are exchanged, many times.
// --------------------------------------------
void shuffle()
{
int n = random( 20, 50); // how many times to shuffle ? more than 10 perhaps ?
for( int i=0; i<n; i++)
{
// Two elements are exchanged.
// They may even be the same element.
int j1 = random( 0, 4);
int j2 = random( 0, 4);
int temporary = pinAssign[j1];
pinAssign[j1] = pinAssign[j2];
pinAssign[j2] = temporary;
}
}

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: uliryij en 19 gasten