/* My own Linux to Arduino project with simple communication protocol on /dev/ttyUSB0 V1.01 (c) 2016 Andreas Schuster */ String inputString = ""; // a string to hold incoming data String cmdString = ""; String valueString = ""; boolean stringComplete = false; // whether the string is complete boolean cmdComplete = false; boolean valueComplete = false; const int ledPin = 13; int ledstatus = 0; int startcmd = 0; int valuecmd = 0; int endcmd = 0; int serialcounter = 0; int timer = 0; int pin = 0; int val = 0; int freq = 0; void setup() { // initialize serial: Serial.begin(38400); // reserve 200 bytes for the inputString: inputString.reserve(200); cmdString.reserve(40); valueString.reserve(40); pinMode(ledPin, OUTPUT); } void loop() { // change the onboard LED when a newline arrives: if (stringComplete) { //Serial.print(inputString); //Serial.print("\n"); timer = 0; if (ledstatus == 0) { digitalWrite(ledPin, HIGH); ledstatus = 1; } else { digitalWrite(ledPin, LOW); ledstatus = 0; } // handle cmdString & valueString if (cmdComplete) { // Serial.print("cmd="); // Serial.print(cmdString); // Serial.print(";"); } if (valueComplete) { // Serial.print("value="); // Serial.print(valueString); // Serial.print(";"); } pin = 255; // false pin at start if (cmdString.length() >= 6) { // typical command "out_d4" or "out_d12" if (cmdString.substring(0, 4) == "out_") { // found an output command if (cmdString.charAt(4) == 'd') { // found to write to a digital pin if (isAlphaNumeric(cmdString.charAt(5))) { pin = cmdString.charAt(5) - char('0'); if (cmdString.length() >= 7) { if (isAlphaNumeric(cmdString.charAt(6))) { pin = (pin * 10) + (cmdString.charAt(6) - char('0')); } } // write to pin if (pin < 100) { if (valueString == "HIGH") { pinMode(pin, OUTPUT); digitalWrite(pin, HIGH); } else if (valueString == "LOW") { pinMode(pin, OUTPUT); digitalWrite(pin, LOW); } else { Serial.print("ERROR:cannot understand value!\n"); } Serial.print("OK:"); Serial.print(cmdString); Serial.print(" set to "); Serial.print(valueString); Serial.print("\n"); } else { Serial.print("ERROR:cannot detect pin number!\n"); } } } } } if (cmdString.length() >= 5) { // typical command "in_d4" or "in_d12" if (cmdString.substring(0, 3) == "in_") { // found an input command if (cmdString.charAt(3) == 'd') { // found to write to a digital pin if (isAlphaNumeric(cmdString.charAt(4))) { pin = cmdString.charAt(4) - char('0'); if (cmdString.length() >= 6) { if (isAlphaNumeric(cmdString.charAt(5))) { pin = (pin * 10) + (cmdString.charAt(5) - char('0')); } } // readpin here if (pin < 100) { pinMode(pin, INPUT); val = digitalRead(pin); if (val == HIGH) { Serial.print("HIGH\n"); } else if (val == LOW) { Serial.print("LOW\n"); } else { Serial.print("undefined\n"); } } else { Serial.print("ERROR:cannot detect pin number!\n"); } } } } } if (cmdString == "tone") { freq = valueString.toInt(); if (freq < 40) { freq = 2600; } Serial.print("OK:play tone "); Serial.print(freq,DEC); Serial.print("\n"); tone(3, freq, 2000); } if (inputString == "help\n") { Serial.print("output commands:\n"); Serial.print(" ^out_d[pin]%[HIGH|LOW]$\n"); Serial.print(" return: none\n"); Serial.print("input commands:\n"); Serial.print(" ^in_d[pin]$\n"); Serial.print(" return: HIGH | LOW\n"); Serial.print("tone command (only pin 3!):\n"); Serial.print(" ^tone$ or ^tone%[frequency]$\n"); Serial.print(" return: none\n"); } serialcounter = 0; startcmd = 0; valuecmd = 0; endcmd = 0; // clear the string: inputString = ""; cmdString = ""; valueString = ""; stringComplete = false; cmdComplete = false; valueComplete = false; } delay(2); timer++; if (timer > 5000) { //periodically change the onboard LED timer = 0; if (ledstatus == 0) { digitalWrite(ledPin, HIGH); ledstatus = 1; } else { digitalWrite(ledPin, LOW); ledstatus = 0; } } } void serialEvent() { /* seperate a typical serial command e.g. "^out_d4%HIGH$" into cmdString = "out_d4" value = "HIGH" */ while (Serial.available()) { // get the new byte: serialcounter++; char inChar = (char)Serial.read(); // add it to the inputString: //Serial.print(inChar); inputString += inChar; // if the incoming character is a newline, set a flag // so the main loop can do something about it: if (startcmd > 0 && inChar != '%' && inChar != '$') { cmdString += inChar; } if (valuecmd > 0 && inChar != '$') { valueString += inChar; } if (inChar == '^') { startcmd = serialcounter; valuecmd = 0; } if (inChar == '%') { cmdComplete = true; valuecmd = serialcounter; startcmd = 0; } if (inChar == '$') { valuecmd = 0; startcmd = 0; cmdComplete = true; valueComplete = true; endcmd = serialcounter; } if (inChar == '\n') { stringComplete = true; } } }