Array of events to add and to clear

Hey guys i have to add each event to the array at the moment that it changes and if typed in the 'c' the array must be cleared could anyone tell me how to add the events and how to clear the array?first part is before the setup and second is a function used in the loop. Thanks in advance

typedef enum {
  stopX,
  slowX,
  goX,
  stopY,
  slowY,
  goY,
  pietonsX,
  pietonsY
} EtatLight;

EtatLight light;
typedef struct {
  int activeButton;
  EtatLight presentState;
  unsigned long timeEvent;
} evenement_t;
evenement_t evenement;
evenement_t event[Size];


void normal_lights() {
  switch (light) {
    case stopX:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeRED) {
        previousmillis = millis();
        light = goY;
      }
      break;
    case slowX:
      digitalWrite(redX, LOW);
      digitalWrite(yellowX, HIGH);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeYELLOW) {
        previousmillis = millis();
        if (pietonWAIT == true) {
          light = pietonsX;
        }
        else
          light = stopX;
      }
      break;
    case goX:
      digitalWrite(redX, LOW);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, HIGH);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeGREEN) {
        previousmillis = millis();
        light = slowX;
      }
      break;
    case stopY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeRED) {
        previousmillis = millis();
        light = goX;
      }
      break;
    case slowY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, LOW);
      digitalWrite(yellowY, HIGH);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeYELLOW) {
        previousmillis = millis();
        if (pietonWAIT == true) {
          light = pietonsY;
        }
        else
          light = stopY;
      }
      break;
    case goY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, LOW);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, HIGH);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeGREEN) {
        previousmillis = millis();
        light = slowY;
      }
      break;
    case pietonsX:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, HIGH);
      if (millis() - previousmillis >= timePIETON) {
        previousmillis = millis();
        light = goY;
        pietonWAIT = false;
      }
      break;
    case pietonsY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, HIGH);
      if (millis() - previousmillis >= timePIETON) {
        previousmillis = millis();
        light = goX;
        pietonWAIT = false;
      }
      break;
  }
}void normal_lights() {
  switch (light) {
    case stopX:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeRED) {
        previousmillis = millis();
        light = goY;
      }
      break;
    case slowX:
      digitalWrite(redX, LOW);
      digitalWrite(yellowX, HIGH);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeYELLOW) {
        previousmillis = millis();
        if (pietonWAIT == true) {
          light = pietonsX;
        }
        else
          light = stopX;
      }
      break;
    case goX:
      digitalWrite(redX, LOW);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, HIGH);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeGREEN) {
        previousmillis = millis();
        light = slowX;
      }
      break;
    case stopY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeRED) {
        previousmillis = millis();
        light = goX;
      }
      break;
    case slowY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, LOW);
      digitalWrite(yellowY, HIGH);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeYELLOW) {
        previousmillis = millis();
        if (pietonWAIT == true) {
          light = pietonsY;
        }
        else
          light = stopY;
      }
      break;
    case goY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, LOW);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, HIGH);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeGREEN) {
        previousmillis = millis();
        light = slowY;
      }
      break;
    case pietonsX:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, HIGH);
      if (millis() - previousmillis >= timePIETON) {
        previousmillis = millis();
        light = goY;
        pietonWAIT = false;
      }
      break;
    case pietonsY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, HIGH);
      if (millis() - previousmillis >= timePIETON) {
        previousmillis = millis();
        light = goX;
        pietonWAIT = false;
      }
      break;
  }
}
  1. Please post your complete sketch
  2. Please provide a description of what your project should do

This is not enough information.

  1. Do you just want to store the event codes or do you need to record a timestamp when the event occurred?
  2. What happens when the event array gets full? Should it wrap around and overwrite the oldest entry?
  3. What is the purpose of recording the event data? Is it to be used for displaying the events?

You should attempt to write code to add and clear the events yourself.

What does this mean? In the serial monitor?

1.I need a timestamp of the event
2.Yes the array should erase oldest item to leave space for new event
3. exactly, each time the events change, i must display the event and the timestamp

The 'c' will be typed in the serial monitor. the array must be completely emptied.

 #define VERSION "version_1.4"

#define Size 50
#define redY 12
#define yellowY 11
#define greenY 10
#define redX 9
#define yellowX 8
#define greenX 7
#define pietXY A0
#define pietonButton 3

unsigned long previousmillis = millis();
char command;
uint16_t timeRED = 1000;
uint16_t timeYELLOW = 1500;
uint16_t timeGREEN = 3000;
uint16_t timePIETON = 3000;
bool pietonWAIT;
typedef enum {
  stopX,
  slowX,
  goX,
  stopY,
  slowY,
  goY,
  pietonsX,
  pietonsY
} EtatLight;

EtatLight light;
typedef struct {
  int activeButton;
  EtatLight presentState;
  unsigned long timeEvent;
} evenement_t;
evenement_t evenement;
evenement_t event[Size];

void setup() {
  Serial.begin(57600);
  pinMode(redX, OUTPUT);
  pinMode(yellowX, OUTPUT);
  pinMode(greenX, OUTPUT);
  pinMode(redY, OUTPUT);
  pinMode(yellowY, OUTPUT);
  pinMode(greenY, OUTPUT);
  pinMode(pietXY, OUTPUT);
  pinMode(pietonButton, INPUT_PULLUP);
}

void loop() {
  bouton_pieton();
  normal_lights();
  readcommand();
  answerCommand();
}

void normal_lights() {
  switch (light) {
    case stopX:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeRED) {
        previousmillis = millis();
        light = goY;
      }
      break;
    case slowX:
      digitalWrite(redX, LOW);
      digitalWrite(yellowX, HIGH);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeYELLOW) {
        previousmillis = millis();
        if (pietonWAIT == true) {
          light = pietonsX;
        }
        else
          light = stopX;
      }
      break;
    case goX:
      digitalWrite(redX, LOW);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, HIGH);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeGREEN) {
        previousmillis = millis();
        light = slowX;
      }
      break;
    case stopY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeRED) {
        previousmillis = millis();
        light = goX;
      }
      break;
    case slowY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, LOW);
      digitalWrite(yellowY, HIGH);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeYELLOW) {
        previousmillis = millis();
        if (pietonWAIT == true) {
          light = pietonsY;
        }
        else
          light = stopY;
      }
      break;
    case goY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, LOW);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, HIGH);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeGREEN) {
        previousmillis = millis();
        light = slowY;
      }
      break;
    case pietonsX:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, HIGH);
      if (millis() - previousmillis >= timePIETON) {
        previousmillis = millis();
        light = goY;
        pietonWAIT = false;
      }
      break;
    case pietonsY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, HIGH);
      if (millis() - previousmillis >= timePIETON) {
        previousmillis = millis();
        light = goX;
        pietonWAIT = false;
      }
      break;
  }
}
void bouton_pieton() {
  if (digitalRead(pietonButton) == 0) {
    pietonWAIT = true;
  }
}
void readcommand() {
  if (Serial.available()) {
    command = Serial.read();
    answerCommand();
    delay(10);
    while (Serial.available()) Serial.read();
  }
}
void answerCommand() {
  switch (command) {
    case 'l':


      Serial.print("\n");
      break;
    case 'v':
      Serial.print(VERSION);
      Serial.print("\n");
      break;
    case 'c':
    
      Serial.print("ARRAY HAS BEEN CLEARED");
      Serial.print("\n");
      break;
    default:
      Serial.print("INVALID COMMAND---- l to print from recent to old---- c to clear array---- v for version");
      Serial.print("\n");
      break;
  }
}

UPDATE
i found out how to clear array and fill it but now I have another problem, whenever I type a character in the serial monitor, it is supposed to print a few characters but only once. For now, it prints it continuously.

#define VERSION "version_1.4"

#define Size 50
#define redY 12
#define yellowY 11
#define greenY 10
#define redX 9
#define yellowX 8
#define greenX 7
#define pietXY A0
#define pietonButton 3

unsigned long time_ = 0;
unsigned long previousmillis = millis();
char command;
uint16_t timeRED = 1000;
uint16_t timeYELLOW = 1500;
uint16_t timeGREEN = 3000;
uint16_t timePIETON = 3000;
bool pietonWAIT;
int indice = 0;
typedef enum {
  stopX,
  slowX,
  goX,
  stopY,
  slowY,
  goY,
  pietonsX,
  pietonsY
} EtatLight;

EtatLight light;
typedef struct {
  char activeButton;
  EtatLight presentState;
  unsigned long timeEvent;
} evenement_t;
evenement_t evenement;
evenement_t event[Size];

void setup() {
  Serial.begin(57600);
  pinMode(redX, OUTPUT);
  pinMode(yellowX, OUTPUT);
  pinMode(greenX, OUTPUT);
  pinMode(redY, OUTPUT);
  pinMode(yellowY, OUTPUT);
  pinMode(greenY, OUTPUT);
  pinMode(pietXY, OUTPUT);
  pinMode(pietonButton, INPUT_PULLUP);
}

void loop() {
  bouton_pieton();
  normal_lights();
  readcommand();
  answerCommand();
}

void normal_lights() {
  switch (light) {
    case stopX:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeRED) {
        previousmillis = millis();
        tableau();
        light = goY;
      }
      break;
    case slowX:
      digitalWrite(redX, LOW);
      digitalWrite(yellowX, HIGH);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeYELLOW) {
        previousmillis = millis();
        tableau();
        if (pietonWAIT == true) {
          light = pietonsX;
        }
        else
          light = stopX;
      }
      break;
    case goX:
      digitalWrite(redX, LOW);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, HIGH);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeGREEN) {
        previousmillis = millis();
        tableau();
        light = slowX;
      }
      break;
    case stopY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeRED) {
        previousmillis = millis();
        tableau();
        light = goX;
      }
      break;
    case slowY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, LOW);
      digitalWrite(yellowY, HIGH);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeYELLOW) {
        previousmillis = millis();
        tableau();
        if (pietonWAIT == true) {
          light = pietonsY;
        }
        else
          light = stopY;
      }
      break;
    case goY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, LOW);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, HIGH);
      digitalWrite(pietXY, LOW);
      if (millis() - previousmillis >= timeGREEN) {
        previousmillis = millis();
        tableau();
        light = slowY;
      }
      break;
    case pietonsX:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, HIGH);
      if (millis() - previousmillis >= timePIETON) {
        previousmillis = millis();
        tableau();
        light = goY;
        pietonWAIT = false;
      }
      break;
    case pietonsY:
      digitalWrite(redX, HIGH);
      digitalWrite(yellowX, LOW);
      digitalWrite(greenX, LOW);
      digitalWrite(redY, HIGH);
      digitalWrite(yellowY, LOW);
      digitalWrite(greenY, LOW);
      digitalWrite(pietXY, HIGH);
      if (millis() - previousmillis >= timePIETON) {
        previousmillis = millis();
        tableau();
        light = goX;
        pietonWAIT = false;
      }
      break;
  }
}
void bouton_pieton() {
  if (digitalRead(pietonButton) == 0) {
    pietonWAIT = true;
    evenement.activeButton = "PIETONS";
  }
}
void tableau() {
  event[indice].activeButton = evenement.activeButton;
  evenement.timeEvent = millis() - time_;
  event[indice].timeEvent = evenement.timeEvent;
  evenement.presentState = light;
  event[indice].presentState = evenement.presentState;
  switch (evenement.presentState) {
    case 0:
      Serial.print("red X");
      break;
    case 1:
      Serial.print("yellow X");
      break;
    case 2:
      Serial.print("green X");
      break;
    case 3:
      Serial.print("red Y");
      break;
    case 4:
      Serial.print("yellow Y");
      break;
    case 5:
      Serial.print("green Y");
      break;
    case 6:
      Serial.print("pedestrians");
      break;
    case 7:
      Serial.print("pedestrians");
      break;
  }
  Serial.print("\t");
  Serial.print(event[indice].activeButton);
  Serial.print("\t");
  Serial.print(event[indice].timeEvent);
  Serial.println("ms");
  indice++;
  if (indice > 49) {
    indice = 0;
  }
}
void readcommand() {
  if (Serial.available()) {
    command = Serial.read();
    answerCommand();
    delay(10);
    while (Serial.available()) Serial.read();
  }
}
void answerCommand() {
  switch (command) {
    case 'l':


      Serial.print("\n");
      break;
    case 'v':
      Serial.print(VERSION);
      Serial.print("\n");
      break;
    case 'c':
      for (int i = 0; i < Size - 1; i++) {
        event[i].activeButton = 0 ;
        event[i].presentState = 0;
        event[i].timeEvent = 0;
      }
      time_ = millis();
      Serial.print("ARRAY HAS BEEN CLEARED");
      Serial.print("\n");
      break;
      /*default:
          Serial.print("INVALID COMMAND---- l to print from recent to old---- c to clear array---- v for version");
          Serial.print("\n");
          break;*/
      command = 0;
  }
}

You are calling answerCommand() from loop() and readcommand(). Is that what you intended? Since it is called every time loop() executes it is processing the command over and over.

How should i write it to only execute it once?

Well... readcommand() only calls it when there is a command to process. I suppose you can just remove it from loop().

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.