hulp nodig bij het maken van een scanner voor codes

hallo, iedereen
ik ben bezig met een eigengemaakte bar code scanner. ik gebruik daarvoor de arduino mega2560. De bedoeling is dat de scanner de zwart witte blokjes leest met 2 line tracking sensoren.
eentje is om waar te nemen dat de blokjes veranderen en de andere is voor de daadwerkelijke code.
het zijn in het totaal acht blokjes, Zodat ik de output kan gebruiken als een binaire code en die om te zetten in decimalen.
om de codes automatisch te lezen heb ik een papiertje met 4 codes vastgemaakt aan een band van een robot.
die band laat ik rond draaien en zo komen de codes langs de sensor.
dit alles werkt nog.
nu heb ik er iets ingezet waardoor hij een opdracht krijgt om te stoppen op een willekeurig nummer. van 1 t/m 3 (het horen er 4 te zijn maar ik heb per ongeluk 2x de binaire code 1 uitgeprint)
dus er zijn 2 mogelijkheden voor 1. ook dat doet hij netjes, als hij gestopt heeft krijgt hij een nieuw willekeurig nummer ook die vind ie op en stopt hij netjes na alle 8 blokjes.
maar nu wil ik er nog iets aan toevoegen. Namelijk dat hij nog een willekeurig nummer binnekrijgt en die bepaalt na hoeveel blokjes hij stopt. bijvoorbeeld: dat hij de code die hij heeft binnen gekregen bijvoorbeeld 2.
daar zou hij dan naar toe moeten rijden en dan inplaats van te stoppen zijn vaart halveren en stoppen bij de volgende code bij een willekeurig aantal blokjes bijvoorbeeld 5.
dus dan zou hij moeten stoppen nadat hij 2 heeft gelezen en nog 5 blokjes. Ook heb ik hier een lcd aan vastgemaakt om een paar handige dingen te kunnen zien die zijn niet relevant voor mijn vraag en hoeft ook niet naar gekeken te worden. ik heb hier de code met uitleg:

///Arduino Sample Code
#include <Wire.h>                     //voor de lcd
#include <LiquidCrystal_I2C.h>
#include <Time.h>  
#define TIME_MSG_LEN  11
#define TIME_HEADER  'T'
#define TIME_REQUEST  7  
int oldval=1;                          //om te zien of de bovenste rij veranderd
int count=0;                           //veranderd elke keer als de onderste rij veranderd, elke keer als hij veranderd komt er 1 bij tot hij bij 8 komt dan word hij ge reset
int val = 1;                           //word gebruikt om binary om te zetten in decimal
int maxnum=8;                          //het maximale dat een count kan doen voor word gereset
int pos = 0;                           //word gebruikt om binary om te zetten in decimal
int scans = 0;                         //variable die veranderd elke keer dat hij een code leest
int E2 = 9;                            //voor het motortje
int M2 = 10;                           //voor het motortje
//int change = 0;                       
long randNumber;                       //een willekeurig nummer die word gebruikt voor de bovenste rij. van 1 t/m 3
long randCount;                        //een willekeurig nummer van 0-7 die word gebruikt voor de onderste rij
//int displayval = 0;                  

LiquidCrystal_I2C lcd(0x27,20,4);      //voor het lcd scherm


void setup()
{
  Serial.begin(9600);
  int ledPin = 8;                      // veranderd pin 8 naar 5v
  pinMode(ledPin, OUTPUT);  
  digitalWrite(ledPin, HIGH);
  int ledPin2 = 7;                     // veranderd pin 7 naar 5v
  pinMode(ledPin2, OUTPUT);
  digitalWrite(ledPin2, HIGH);
  int ledPin3 = 4;                     // veranderd pin 4 naar 5v
  pinMode(ledPin3, OUTPUT);
  digitalWrite(ledPin3, HIGH);         
  attachInterrupt(0, Poort, CHANGE);   //de attachinterrupt (0 = pin2 zit vast aan de onderste scanner) die word gebruikt om te zien of de onderste rij veranderd zodat ie weet of hij naar de bovenste rij moet kijken
  lcd.init();                          //om de lcd aan te houden
  lcd.backlight();                     //om het achtergrond liht van het lcd scherm aan te houden
  randNumber = random(1, 4);           //maakt een willekeurig nummer aan 1 t/m 3

  analogWrite (E2,75);                 //om de motor te laten draaien
  digitalWrite(M2,HIGH); 

  lcd.setCursor(15,3);                 //voor het lcd scherm
  lcd.print(randNumber);           
  lcd.setCursor(13,2);
  lcd.print("Dest:");
  lcd.setCursor(0,0);
  lcd.print("Aantal Gescanned:");
  lcd.setCursor(0,1);
  lcd.print(scans);
  lcd.setCursor(0,2);
  lcd.print("Waarde: ");
}

void loop(){    

  if (count == 7)                      //als de count 7 heeft bereikt print hij iets op het lcd scherm
  {
    lcd.setCursor(0,3);  
    lcd.print(pos);
    lcd.print(" ");
    scans++;                           //een scan erbij als count 7 is
    lcd.setCursor(0,1);
    lcd.print(scans);                 //print scans
  }
  if (pos == randNumber)              // als de binary code is veranderd in decimal word die opgeslagen in pos als pos gelijk is aan het willekeurig nummer laat het de motor langzamer rijden
  {
    analogWrite (E2,110);
    lcd.setCursor(15,3);              //print scans en de bestemming
    lcd.print(randNumber);
    randCount = random(0, 7);
    if (randCount == count)          //als het willekeurige nummer voor randomcount gelijk is aan count
    {
      analogWrite (E2, 200);  
      randNumber = random(1, 4);
      delay(3000);
      randCount = random(0, 7);
      analogWrite (E2, 75);          //na 3 seconde begint de loop opnieuw
    }
  }
}

void Poort(){                        //de interrupt waarin de hij ziet of de onderste rij veranderd en zet binary om in decimal
  Serial.print(count);
  Serial.print(" - ");
  Serial.print(digitalRead(2));
  Serial.print(" - ");
  Serial.print(digitalRead(3));
  Serial.print(" - ");  
  Serial.print(randCount);
  Serial.print(" - ");
  Serial.print(randNumber);
  Serial.print(" - ");

  count++;                                     //veranderd elke keer dat de onderste rij veranderd +1
  pos = pos + (val * (1-digitalRead(3)));      //zet binary om naar decimal
  val = val * 2;                               //zet binary om naar decimal

  Serial.print(pos);                           //output van de berekening naar monitor
  Serial.println(" ");


  if (count == maxnum)                         //als de count 8 is zet hij de nosige variablen terug
  {
    count = 0;
    pos = 0;
    val = 1;

  }
}

ik hoop dat jullie hier iets van snappen als er vragen zijn alsjeblieft stel ze.

ik heb ook nog een me seriele monitor na 1 rondje
eerste rij: de "count" telt elke keer tot 7 vanaf 0 dus dat is 8 (werkt)
tweede rij: de onderste sensor zijn output die zwart,wit,zwart,wit leest (werkt)
derde rij: de bovenste rij voor de daadwerkelijke code (werkt, Fouten liggen aan de sensor niet aan de code)
vierde rij: laat de randCount zien dit is de willekeurige waarde om te stoppen op het aantal blokjes (werkt niet)
vijfde rij: laat de randNumber zien die bepaalt waar hij moet vertragen (werkt alleen hij vertraagd niet)
zesde rij: laat de "pos" zien de decimale waarde die is omgerekend van binair

0 - 0 - 0 - 0 - 2 - 1 
1 - 1 - 1 - 0 - 2 - 1 
2 - 0 - 1 - 0 - 2 - 1 
3 - 1 - 1 - 0 - 2 - 1 
4 - 0 - 1 - 0 - 2 - 1 
5 - 1 - 1 - 0 - 2 - 1 
6 - 0 - 1 - 0 - 2 - 1 
7 - 1 - 1 - 0 - 2 - 1 
0 - 0 - 0 - 0 - 2 - 1 
1 - 1 - 0 - 0 - 2 - 3 
2 - 0 - 1 - 0 - 2 - 3 
3 - 1 - 1 - 0 - 2 - 3 
4 - 0 - 1 - 0 - 2 - 3 
5 - 1 - 1 - 0 - 2 - 3 
6 - 0 - 1 - 0 - 2 - 3 
7 - 1 - 1 - 0 - 2 - 3 
0 - 0 - 0 - 0 - 2 - 1 
1 - 1 - 1 - 0 - 2 - 1 
2 - 0 - 1 - 0 - 2 - 1 
3 - 1 - 1 - 0 - 2 - 1 
4 - 0 - 1 - 0 - 2 - 1 
5 - 1 - 1 - 0 - 2 - 1 
6 - 0 - 1 - 0 - 2 - 1 
7 - 1 - 1 - 0 - 2 - 1 
0 - 0 - 1 - 0 - 2 - 0 
1 - 1 - 0 - 0 - 2 - 2 
2 - 0 - 1 - 2 - 3 - 2 
3 - 1 - 1 - 6 - 3 - 2 
4 - 0 - 1 - 6 - 3 - 2 
5 - 1 - 1 - 6 - 3 - 2 
6 - 0 - 1 - 6 - 3 - 2 
7 - 1 - 1 - 6 - 3 - 2

ik ben geen expert met de arduino en ben pas 16 als jullie mij zouden kunnen helpen zou ik heel blij zijn alvast bedankt!
als je meer informatie nodig hebt vraag er naar!

Dag Chocolatee
Ik heb effe naar je code gekeken en ik vermoed dat het probleem in een redeneer fout zit.
Meer specifiek in dit gedeelte

void loop()
{
 ....
if (pos == randNumber)              // als de binary code is veranderd in decimal word die opgeslagen in pos als 
  {
   .....
    if (randCount == count)          //als het willekeurige nummer voor randomcount gelijk is aan count
    {
    ......;
    }
  }

Het is moeilijk om in woorden uit te leggen maar ik doe toch een poging.
Je hebt 2 gegevens: pos kan en zal steeds veranderen van waarde. De functie loop() wordt ook steeds aangeroepen.
Als je die 2 bij elkaar legt krijg je de eerste keer dat pos==randNumber datde test "if (randCount == count) " uitvoert wordt.
Bij de volgende aanroep van loop() kan het zijn dat pos al veranderd is en dus zal hij die 2de test niet uitvoeren.
De kans dat de voorwaarde (pos==randNumber) voldaan is samen met (randCount == count) is onbestaand
Ik hoop dat je het begrijpt
Met vriendelijke groet
Jantje

Bedankt jantje,
had het al veranderd voor ik dit zag. toch heel erg bedankt voor de moeite om de codes door te lezen. ik heb het opgelost door een nieuwe waarde toe toevoegen de "pos" maar dan word ie pas bij gewerkt als de count 7 is die word gebruikt voor de if. Hij loopt nog steeds niet soepel dus ga daar nog even goed naar kijken als ik er niet uitkom laat ik wel weer iets horen.

Dag Chocolatee
Goed gedaan dus :slight_smile:
Wat je best doet is een vlag zetten die zegt waar je bent. Zo iets als

int Vlag =0;
void loop()
{
....
if (pos == randNumber) // als de binary code is veranderd in decimal word die opgeslagen in pos als
{
Vlag=1;
.....

}
if ((Vlag==1) & (randCount == count)) //als het willekeurige nummer voor randomcount gelijk is aan count
{
Vlag=0;
......;
}

Met vriendelijke groet
Jantje