Search code examples
ios5arduinoxcode4.5

Arduino sketch that reads serial characters as a command and does something


Currently I am trying to get a sketch working where the Arduino will read a series of characters as a command, and do something based on the series of characters sent from an iDevice. I am using an iPhone 3GS that is jailbroken to send characters to the Arduino. The method that sends the serial characters looks like the following,

- (IBAction)blinkFlow_A_LED:(id)sender {

    // Method to blink the Flow_A LED on the kegboard-mini Arduino shield (<https://github.com/Kegbot/kegboard>).

    NSLog(@"blink Flow_A btn pressed");

    // Open serial port / interface

    [serial open:B2400];
    NSLog(@"%c", [serial isOpened]);

    // Send serial data (TX)

    char buffer [7];

    buffer[0] = '{';
    buffer[1] = 'b';
    buffer[2] = 'l';
    buffer[3] = 'i';
    buffer[4] = 'n';
    buffer[5] = 'k';
    buffer[6] = '}';

    [serial write:buffer length:7];
}

I have created a simple sketch that blinks the LED on the shield I am using, but I want the LED to blink conditionally when the button is clicked in the iOS app. The sketch that blinks the LED looks like the following,

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
  This sketch is specific to making the kegboard-mini shield.

  http://arduino.cc/forum/index.php?topic=157625.new;topicseen#new

  This example code is in the public domain.
*/

// Pin D4 - should be connected to the flow_A LED

// Give it a name

int led = 4;

// The setup routine runs once when you press reset:

void setup() {
  // Initialize the digital pin as an output.
  pinMode(led, OUTPUT);
}

// The loop routine run over and over again forever:

void loop() {
  digitalWrite(led, HIGH); // Turn the LED on (HIGH is the voltage level)
  delay(1000);              // Wait for one second
  digitalWrite(led, LOW);   // Turn the LED off by making the voltage LOW
  delay(1000);              // Wait for a second
}

Solution

  • I ended putting a simple sketch together like this which allows me to store an array of serial bytes into a String thanks to the SerialEvent example.

    The sketch I am currently working with looks like the following,

    /*
     * kegboard-serial-simple-blink07
     * This code is public domain
     *
     * This sketch sends a receives a multibyte String from the iPhone
     * and performs functions on it.
     *
     * Examples:
     * http://arduino.cc/en/Tutorial/SerialEvent
     * http://arduino.cc/en/Serial/read
     */
    
     // Global variables should be identified with "_"
    
     // flow_A LED
     int led = 4;
    
     // relay_A
     const int RELAY_A = A0;
    
     // Variables from the sketch example
     String inputString = ""; // A string to hold incoming data
     boolean stringComplete = false; // Whether the string is complete
    
     void setup() {
    
       Serial.begin(2400); // Open a serial port. Sets data rate to 2400 bit/s
       Serial.println("Power on test");
       inputString.reserve(200);
    
       pinMode(RELAY_A, OUTPUT);
    }
    
    void open_valve() {
    
      digitalWrite(RELAY_A, HIGH); // Turn RELAY_A on
    }
    
    void close_valve() {
    
      digitalWrite(RELAY_A, LOW); // Turn RELAY_A off
    }
    
    void flow_A_blink() {
    
      digitalWrite(led, HIGH); // Turn the LED on (HIGH is the voltage level)
      delay(1000);             // Wait for one second
      digitalWrite(led, LOW);  // Turn the LED off by making the voltage LOW
      delay(1000);             // Wait for a second
    }
    
    void flow_A_blink_stop() {
    
      digitalWrite(led, LOW);
    }
    
    void loop() {
      // Print the string when newline arrives:
      if (stringComplete) {
        Serial.println(inputString);
    
        // Clear the string:
        inputString = "";
        stringComplete = false;
      }
    
      if (inputString == "{blink_Flow_A}") {
        flow_A_blink();
      }
    }
    
    // SerialEvent occurs whenever a new data comes in the
    // hardware serial RX.  This routine is run between each
    // time loop() runs, so using delay inside loop can delay
    // response.  Multiple bytes of data may be available.
    
    void serialEvent() {
      while(Serial.available()) {
        // Get the new byte:
        char inChar = (char)Serial.read();
    
        // Add it to the inputString:
        inputString += inChar;
    
        // If the incoming character is a newline, set a flag
        // so the main loop can do something about it:
        if (inChar == '\n') {
          stringComplete = true;
        }
      }
    }