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.
system
Closed
8
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.