Learn Arduino with Olympia Circuits
Learn Arduino
  • Home
    • Get Started
    • How to Use This Site
  • Electronics
    • The Basics
    • Electricity Flows like Water
    • Electronic Components
    • The Arno Board
  • Programming
    • The Basics
    • setup and loop Blocks
    • Variables and Arrays
    • Connecting with the Pins
    • Flow Control >
      • if Statement
      • Loops
      • Delays
    • Functions
    • Serial Communication
    • USB
    • Some Thoughts
  • Projects
    • Projects 1 >
      • 1.01: Blink
      • 1.02 Blink x2
      • 1.03 Blink Faster
      • 1.04 LED Chase!
      • 1.05 Wait To Blink
      • 1.06 Blink a Little Faster Now
      • 1.07 LED Fade
      • 1.08 RGB Blink
      • 1.09 Change RGB Color with SW1
      • 1.10 Fade RGB Colors
      • 1.11 Reaction Time Game
    • Projects 2 >
      • 2.01 Hello World
      • 2.02 Talk Back
      • 2.03 ASCII Values
      • 2.04 Ski Game
      • 2.05 Demonstration of the String Object
    • Projects 3 >
      • 3.01 Read the Potentiometer
      • 3.02 ASCIIbet Soup
      • 3.03 Potentiometer sets LED Brightness
      • 3.04 Potentiometer Sets Blink Rate
      • 3.05 LED Chase, Part II
    • Projects 4 >
      • 4.01 Bringing the Piezo to Life
      • 4.02 Controlling the Piezo with a Function
      • 4.03 Piezo C Major
      • 4.04 Piezo Greensleaves
      • 4.05 Piezo Metronome
      • 4.06 Piezo as an Input
      • 4.07 Piezo as an Input 2
      • 4.08 Metronome II
      • 4.09 Piezo Playback
      • 4.10 Piezo Fireworks
      • 4.11 Piezo Mosquito
    • Projects 5 >
      • 5.01 The Phototransistor
      • 5.02 Light and Sound
      • 5.03 Light and Sound II
    • Projects 6 >
      • 6.01 EEPROM
      • 6.02 I2C Address Scan
      • 6.03 Read the I2C Temperature Sensor
      • 6.04 High Temperature Alarm
    • Projects 7 >
      • 7.01 Arno Phone Home
      • 7.02 Keyboard Alphabet
      • 7.03 Move Mouse
      • 7.04 Draw Squares
    • Special Projects >
      • Bike Light Demo
  • References
    • Arno Pin Key
    • Arno Schematic
    • Project Index

Project 2.02 Talk Back 

The serial monitor works both ways. In this project we send messages to the Arno through the serial monitor. Messages are entered in the box at the top of the serial monitor and sent once the Enter key is hit. Our sketch returns the message through the serial monitor normally and backwards. Let’s look at the code and then see how it works.


Concepts: Serial object, char array

Circuits: none


Select Sketch

///////////////////////////////////////////////////
//Project 12 Read and talk back
long now = 1000;
int nBytes;
void setup(){
Serial.begin(9600);
}
void loop(){
if(now < millis()){
Serial.println(Type a message in the Serial Monitor and hit Enter...);
now = millis() + 5000;
}
delay(500);
nBytes = Serial.available();
if(nBytes > 0){
char getChars[nBytes];
for(int k = 0; k getChars[k] = Serial.read();
}
//print what we just read
Serial.println(getChars);
//now backwards one character at a time
for(int j = nBytes - 1; j > -1; j = j - 1){
Serial.print(getChars[j]);
}
Serial.println();
}
}
///////////////////////////////////////////////////

The sketch queries the user every five seconds. The timer is set by setting the variable now to millis()  + 5000:

  if(now < millis()){

    Serial.println("Type a message in the Serial

                    Monitor and hit Enter...");

    now = millis() + 5000;

  }

When a line is sent through the serial monitor, it is stored temporarily in a buffer. The serial buffer can hold up to 128 bytes (1 character = 1 byte).  Characters can be lost if you try to send more than 128 before reading them with a Serial.read()  statement.  The command Serial.available returns the number of bytes in the buffer.  If the value is greater than zero, it means that there’s a message waiting for us.  The command Serial.read reads the bytes one at a time. We create a char array, getChars, of the appropriate length to hold the bytes:

  nBytes = Serial.available();

  if(nBytes > 0){

    char getChars[nBytes];

    for(int k = 0; k<nBytes;k++){

      getChars[k] = Serial.read();

    }

The array getChar is sent back through the serial monitor in its entirety. Each character, beginning with the last, is then sent individually, but appears on a single line since we use the Serial.print command.  A Serial.println command starts a new line:

    //print what we just read

    Serial.println(getChars);

    //now backwards one character at a time

    for(int j = nBytes - 1; j > -1; j = j - 1){

      Serial.print(getChars[j]);

    }

    Serial.println();

Back to Projects 2

Copyright Olympia Circuits LLC 2014. All Rights Reserved.