//Globale constanten:
int VTpseraf=1;// Het aantal voertuigen dat per seconde door een stoplicht heen kan
int VTpserbij[12]={4,5,4,3,4,3,4,5,4,3,4,3};
int MWf[16]={10,13,10,10,10,10,10,13,10,10,10,10,9,9,9,9};// meeweegfactor; commagetallen om gelijkspel te voorkomen
float beginPWsl[16]={0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0}; //beginprioriteitswaardewaarde stoplichten
int KPsl[11][4]={ {0,1,6,7},{0,6,7,9},{0,1,3,6},{0,5,6,12},{2,3,9,12},{0,11,6,12},{8,9,3,12},{3,4,9,10},{0,3,9,10},
{3,4,6,9},{0,3,6,9} }; //stoplichtnummers die bij kruispunten horen
//int T[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //tijd
float Avt[13]; //aantal voertuigen
float PWkp[11]; //prioriteitswaarde kruispunt
float PWsl[11];
int k;
int KPmax;//kruispunt met hoogste PW
float T[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
int i=0;
float totPWsl;
int SLnr;
int l;
int j;
void setup() {
//Zet pins 0 t/m 59 op OUTPUT:
for(int i=0; i<=60; i++) {
pinMode(i, OUTPUT);
}
Avt[12]=0;
//***Zet alle rode LEDs aan
for(i=0; i<=11;i++){
digitalWrite(i*5,HIGH);
}
i=0;
Serial.begin(9600);
}
//functie die witte LEDs bestuurt
void witteLEDs(int x){
if(Avt[x]<=0) {
digitalWrite(5*x+2,LOW);
digitalWrite(5*x+3,LOW);
digitalWrite(5*x+4,LOW);
}
if(Avt[x]<=2) {
digitalWrite(5*x+2,HIGH);
digitalWrite(5*x+3,LOW);
digitalWrite(5*x+4,LOW);
}
if(Avt[x]<=5) {
digitalWrite(5*x+2,HIGH);
digitalWrite(5*x+3,HIGH);
digitalWrite(5*x+4,LOW);
}
if(Avt[x]>=6) {
digitalWrite(5*x+2,HIGH);
digitalWrite(5*x+3,HIGH);
digitalWrite(5*x+4,HIGH);
}
}
void loop() {
//***Berekent de prioriteitswaardes(PWsl) van alle stoplichten en voegt de tij (T[i]) toe***
for(int i=0; i<=11; i++){
Avt[i]=random(0,10);
float temp = pow(1.07, T[i]);
PWsl[i]= beginPWsl[i] + temp*Avt[i]*MWf[i]/100;
T[i] = T[i] +10;
//Serial.println(PWsl[i]);
}
i=0;
//Serial.println("- - - - - - - -");
//***Berekent de prioriteitswaarden van kruispunten 0 t/m 10***
for(int i=0; i<=10; i++){ //loopt 11 keer: j van 0 naar 10
for(int j=0; j<=3; j++){ //loopt 4 keer: k van 0 naar 3
//PWkp[i]=PWsl[KPsl[i*4+j]]+PWkp[i]; // Berekend de PW van kruispunt door de PW van het stoplicht van j*4+k te doen, dus 48 keer in totaal.
PWkp[i]=PWkp[i] + PWsl[KPsl[i][j]];
}
//Serial.println(PWkp[i]);
}
i=0;
//***berekent het kruispunt met de hoogste KPpw***
int maximum = PWkp[10];
for (int i=0; i<=10; i++){
if (maximum<PWkp[i]){
maximum = PWkp[i];
KPmax = i;
}}
int i=0;
//Serial.println(KPmax);
//***zet de stoplichten op GROEN***
for(i=0;i<=3;i++){
int SLnr = KPsl[KPmax][i];
digitalWrite(5*SLnr+1,HIGH);
digitalWrite(5*SLnr,LOW);
}
i=0;
//***laat het Avt afnemen bij stoplichten op groen en update de witte LEDs en laat Avt toenemen bij alle stoplichten***
for(i=0;i<=9;i++){
for(int l=0;l<=11;l++){
totPWsl = totPWsl + PWsl[l]; //berekent de totale prioritetiswaarde
}
l=0;
delay(900);
for(int j=0;j<=3;j++){
int SLnr = KPsl[KPmax][j]; //bepaalt 4x per kruispunt welke stoplichten op groen moeten
Avt[SLnr]=Avt[SLnr]-VTpseraf; // laat deze stoplichten afnemen in AV
if (Avt[SLnr]=0||totPWsl>2){//als er geen auto's zijn dan knipperen niet steeds alle stoplichten***
i=9;
}
}
j=0;
for(k=0;k<=11;k++){
Avt[SLnr]=Avt[SLnr]-(VTpserbij[SLnr]*random(0,100)/100);
witteLEDs(k);
if(Avt[k]<1){
T[k]=0; //***Zet de tijd op 0 bij stoplichten waar geen auto's voor stonden te wachten de afgelopen seconde***
}
}
k=0;
totPWsl=0;
}
i=0;
//***zet de stoplichten op rood
for(i=0;i<=3;i++){
int SLnr = KPsl[KPmax][i];
digitalWrite(5*SLnr,HIGH);
digitalWrite(5*SLnr+1,LOW);
}
i=0;
delay(1000);
Serial.println("---------------");
}
Question?