Serial Read from Arduino

You can post your problem related to Arduino Projects here. We will try our best to help you out.
Post Reply
Brown
Posts: 8
Joined: Fri Mar 03, 2017 1:10 pm

Serial Read from Arduino

Post by Brown » Fri Mar 03, 2017 1:47 pm

I'm trying to et the Processing sketch to read Serial input from an Arduino PhotoCell sensor. The Arduino is sending readings from 1-100. The Processing Sketch is working. It is getting something from the serial read but the numbers coming in are very different (7,53,13, 57, 48, 13, 10, 57, 53, 13, 10, 49, 48, 48, 13, 10, 49, 48, 48, 13)…..

Can anyone help me understand how to get the Processing sketch to read the numbers that are coming from the Arduino exactly. I plan to eventually make the processing sketch load then fade and remove images when they are within a particular range from the sensor .

Code: Select all

int photoRPin = 0; 
int minLight;
int maxLight;
int lightLevel;
int adjustedLightLevel;

void setup() {
 Serial.begin(9600);
 
 //Setup the starting light level limits
 lightLevel=analogRead(photoRPin);
 minLight=lightLevel-20;
 maxLight=lightLevel;
}

void loop(){
 //auto-adjust the minimum and maximum limits in real time
 lightLevel=analogRead(photoRPin);
 if(minLight>lightLevel){
 minLight=lightLevel;
 }
 if(maxLight<lightLevel){
 maxLight=lightLevel;
 }
 
 //Adjust the light level to produce a result between 0 and 100.
 adjustedLightLevel = map(lightLevel, minLight, maxLight, 0, 100); 
 

 Serial.println(adjustedLightLevel);
 
 delay(450);
}
Processing Code (……so far)

Code: Select all

import processing.serial.*;

Serial myPort;  // Create object from Serial class

PImage bear;
int rand;
int xPos;
int yPos;
int state;

void setup() {
 size(displayWidth, displayHeight);

  myPort = new Serial(this, "/dev/tty.usbmodemfa131", 9600);

 rand = int(random(0,9));                
 takerandomimage("bear_" + nf(rand, 3) + ".jpg");     
                             
}

void takerandomimage(String fn) {
   bear = loadImage(fn);                 

}

void draw() {
  /*if (mousePressed) {
     xPos = int(random(100,800));
     yPos = int(random(100,600));
    image(bear,xPos,yPos);
    mousePressed = false;
  }*/ 
  
   while (myPort.available() > 0) {

    state = myPort.read();
     println(state);
 
   }
  
  if (state >=0 && state <= 70){
    
     xPos = int(random(100,800));
     yPos = int(random(100,600));
    
 image(bear,xPos,yPos);
    
     } else if (state >=71 && state <= 100) {
    image(bear,0,0);
  } 
   
}
(and I did try turning off the Arduino Serial. Still the weird non-correspondance....)

Junaid_Shahid
Posts: 110
Joined: Tue Feb 14, 2017 9:00 am

Re: Serial Read from Arduino

Post by Junaid_Shahid » Fri Mar 03, 2017 1:51 pm

Brown wrote:
Fri Mar 03, 2017 1:47 pm
I'm trying to et the Processing sketch to read Serial input from an Arduino PhotoCell sensor. The Arduino is sending readings from 1-100. The Processing Sketch is working. It is getting something from the serial read but the numbers coming in are very different (7,53,13, 57, 48, 13, 10, 57, 53, 13, 10, 49, 48, 48, 13, 10, 49, 48, 48, 13)…..

Can anyone help me understand how to get the Processing sketch to read the numbers that are coming from the Arduino exactly. I plan to eventually make the processing sketch load then fade and remove images when they are within a particular range from the sensor .

Code: Select all

int photoRPin = 0; 
int minLight;
int maxLight;
int lightLevel;
int adjustedLightLevel;

void setup() {
 Serial.begin(9600);
 
 //Setup the starting light level limits
 lightLevel=analogRead(photoRPin);
 minLight=lightLevel-20;
 maxLight=lightLevel;
}

void loop(){
 //auto-adjust the minimum and maximum limits in real time
 lightLevel=analogRead(photoRPin);
 if(minLight>lightLevel){
 minLight=lightLevel;
 }
 if(maxLight<lightLevel){
 maxLight=lightLevel;
 }
 
 //Adjust the light level to produce a result between 0 and 100.
 adjustedLightLevel = map(lightLevel, minLight, maxLight, 0, 100); 
 

 Serial.println(adjustedLightLevel);
 
 delay(450);
}
Processing Code (……so far)

Code: Select all

import processing.serial.*;

Serial myPort;  // Create object from Serial class

PImage bear;
int rand;
int xPos;
int yPos;
int state;

void setup() {
 size(displayWidth, displayHeight);

  myPort = new Serial(this, "/dev/tty.usbmodemfa131", 9600);

 rand = int(random(0,9));                
 takerandomimage("bear_" + nf(rand, 3) + ".jpg");     
                             
}

void takerandomimage(String fn) {
   bear = loadImage(fn);                 

}

void draw() {
  /*if (mousePressed) {
     xPos = int(random(100,800));
     yPos = int(random(100,600));
    image(bear,xPos,yPos);
    mousePressed = false;
  }*/ 
  
   while (myPort.available() > 0) {

    state = myPort.read();
     println(state);
 
   }
  
  if (state >=0 && state <= 70){
    
     xPos = int(random(100,800));
     yPos = int(random(100,600));
    
 image(bear,xPos,yPos);
    
     } else if (state >=71 && state <= 100) {
    image(bear,0,0);
  } 
   
}
(and I did try turning off the Arduino Serial. Still the weird non-correspondance....)
You are getting the correct data, just in the wrong format. By using Arduino println() function you are sending ascii text lines terminated with new lines (13, 10).
Every value is separated by the new line (13, 10). For example, the sequence you receive below is really the value 100, but sent as text, not binary.

49, 48, 48, 13, 10
'1' '0' '0' CR LF
And the value 95 comes through like this:
57, 53, 13, 10
'9' '5' CR LF
To send binary data you can't use Serial.print() functions, you need to use Serial.write(). It will then work as expected.
Recommended:
HOW TO USE ARDUINO SERIAL READ ?

Post Reply