Run code if serial connection is idle for X min

Here is my code. I have a simple ANDON light that I want to do a certain function when it doesn't receive serial input after x min.

int red = 11;
int green = 12;
int yellow = 13;
String readString;

void setup() {
  Serial.begin(9600);
  pinMode(red, OUTPUT); 
  pinMode(green, OUTPUT);
  pinMode(yellow, OUTPUT); 
  Serial.println("serial on/off test 0021"); // so I can keep track
}

void loop() {

  while (Serial.available()) {
    delay(3);  
    char c = Serial.read();
    readString += c; 
  }

  if (readString.length() >0) {
    Serial.println(readString);

    if(readString.indexOf("0") >=0)
    {
      digitalWrite(red, LOW);
      digitalWrite(green, LOW);
      digitalWrite(yellow, LOW);
      Serial.println("ALL OFF");
    }

    if(readString.indexOf("1") >=0)
    {
      digitalWrite(red, HIGH);
      digitalWrite(green, LOW);
      digitalWrite(yellow, LOW);
      Serial.println("RED ON");
    }
        if(readString.indexOf("2") >=0)
    {
      digitalWrite(red, LOW);
      digitalWrite(green, HIGH);
      digitalWrite(yellow, LOW);
      Serial.println("GREEN ON");
    }
            if(readString.indexOf("3") >=0)
    {
      digitalWrite(red, LOW);
      digitalWrite(green, LOW);
      digitalWrite(yellow, HIGH);
      Serial.println("YELLOW ON");
    }

    readString="";
  } 
}

Ok does this look good?

Im not getting any luck. Sorry if I did it wrong

int red = 11;
int green = 12;
int yellow = 13;
String readString;
unsigned long timeSinceLastSerial;
unsigned long timeout = 10000;  // One minute


void setup() {
  Serial.begin(9600);
  pinMode(red, OUTPUT); 
  pinMode(green, OUTPUT);
  pinMode(yellow, OUTPUT); 
  Serial.println("Connection Established");
  
}

void loop() {

  if(timeSinceLastSerial > timeout){
      digitalWrite(red, HIGH);
      digitalWrite(green, HIGH);
      digitalWrite(yellow, HIGH);
      Serial.println("ALL ON"); // DO your thing here
   }
  while (Serial.available()) {
    delay(3);  
    char c = Serial.read();
    readString += c; 
  }

  if (readString.length() >0) {
    Serial.println(readString);

    if(readString.indexOf("0") >=0)
    {
      digitalWrite(red, LOW);
      digitalWrite(green, LOW);
      digitalWrite(yellow, LOW);
      Serial.println("ALL OFF");
    }

    if(readString.indexOf("1") >=0)
    {
      digitalWrite(red, HIGH);
      digitalWrite(green, LOW);
      digitalWrite(yellow, LOW);
      Serial.println("RED ON");
    }
        if(readString.indexOf("2") >=0)
    {
      digitalWrite(red, LOW);
      digitalWrite(green, HIGH);
      digitalWrite(yellow, LOW);
      Serial.println("GREEN ON");
    }
            if(readString.indexOf("3") >=0)
    {
      digitalWrite(red, LOW);
      digitalWrite(green, LOW);
      digitalWrite(yellow, HIGH);
      Serial.println("YELLOW ON");
    }

    readString="";
  } 
}

Sorry the goal is when the Arduino doesn't receive any input from the PC it will run the code to get all the lights on.

A simple way to read a line, and do something with it.

In my simple example, I just print the line.

After 30 seconds of no serial reception, I print a message.

const byte maxMsgLen = 16;

const byte cbLF = 10;
const byte cbCR = 13;

void setup() {
  Serial.begin(115200);
  Serial.println(F("echo lines with timeout"));
}

uint32_t lastReception;

void loop() {
  if (handleSerial()) {
    lastReception = millis();
  }
  if (millis() - lastReception >= 30000) {
    Serial.println(F("30 seconds no reception."));
    lastReception = millis();
  }
}

void oneLineReceived(const char * buffer) {
  Serial.println(buffer);
}

bool handleSerial() {
  static uint8_t bIndex;
  static uint8_t buffer[maxMsgLen + 1];
  bool lineReady = false;
  if (Serial.available()) {
    uint8_t inChar = Serial.read();
    if (inChar != cbLF) {
      if (inChar == cbCR) {
        lineReady = true;
      } else {
        buffer[bIndex++] = inChar;
        lineReady = (bIndex == maxMsgLen);
      }
      if (lineReady) {
        buffer[bIndex] = 0;
        oneLineReceived((const char*)buffer);
        bIndex = 0;
      }
    }
    return true;
  }
  return false;
}
23:07:53.892 -> echo lines with timeout
23:07:59.313 -> one
23:08:03.313 -> two
23:08:06.873 -> three
23:08:36.902 -> 30 seconds no reception.

Thanks. I was able to take what you sent and work through. I was able to correct my issue.

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