Can't read Atlas Scientific colour detector

I'm trying to read from the Atlas Scientific colour detector ENV-RGB, which is supposed to return a string. Using the demo software I get nothing back. I tweaked the software a little bit and it seems to be returning something, but just random characters rather than the "rrr, ggg, bbb" string that's in the spec. Has anyone used this sensor? Is it tricky?

I tweaked the software a little bit

...but you didn't think to post it, or give any reference to the sensor?

Thank you so much. Clearly friendliness is not one of the things you are moderating for. I'm sorry I joined.

But still no code?

Clearly friendliness is not one of the things you are moderating for.

"My car wouldn't start this morning. It's a white car. What is wrong?".

See why we ask the questions we ask?

but just random characters rather than the "rrr, ggg, bbb" string that's in the spec

This might point to wrong communication setting or so. Is it a string of digits or a string of bytes (I have not read the datasheet) as typically every color would fit into one byte (and yes these may appear as the complete alphabet and more if interpreted as digits in a string.

I found the sensor after some googling here - http://atlas-scientific.com/product_pages/sensors/env-rgb.html -

Many questions pop up, the top 6:
What settings do you use in your code?
baud rate?
parity?
etc
Can you see the comma's appearing in the output?
Do you synchronize upon the character in your code?
Did you double check TX & RX?

I bought one of these sensors a week ago and struggling to get it working properly. The code they provided did not work.

Ive managed to get a reading through the serial, digital 0, 1 pins and then entering this code:

void setup() {}
void loop(){}

opening the serial reader and entering "C" to start taking a reading at 620ms. you should get something like this.

14,8,414,14,1410,10,1413,18,18

What I would like to know is how can you use soft serial and strings to be able to take a reading that arduino can then do something with.

From the specs I've seen, this should do a basic capture. Give it a try

#include <NewSoftSerial.h>

NewSoftSerial mySerial(2, 3);  

void setup()  
{
  Serial.begin(115200);
  Serial.println("Start color sensor");

  // set the data rate for the NewSoftSerial port
  mySerial.begin(38400);
  mySerial.write('C');
}

void loop()
{
  char c;
  if (mySerial.available()) 
  {
    char c = mySerial.read()
    Serial.print(c);
    if (c == ',') Serial.println(); // split the R G and B
    if (c == 13) Serial.println(); // extra newline
  }
}

Thanks for that,

ive just tried verify this and get the following error:

'NewSoftSerial' does not name a type.

im running 1.0.3

Cheers,

Phil

Use "SoftwareSerial" instead.

I'm sorry I joined.

Members from IP (range) xx.xxx.xxx.xx
IP address Display name
xx.xxx.xxx.xx Summersgill, summersgillb

So sorry, you joined twice?

Sorry, retry

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3);  

void setup()  
{
  Serial.begin(115200);
  Serial.println("Start color sensor");

  // set the data rate for the NewSoftSerial port
  mySerial.begin(38400);
  mySerial.print('C');
}

void loop()
{
  if (mySerial.available()) 
  {
    char c = mySerial.read();
    Serial.print(c);
    if (c == ',') Serial.println(); // split the R G and B
    if (c == 13) Serial.println(); // extra newline
  }
}

thanks for that,

I open up the serial monitor and get this...

͹ÙL

(values change when i close and re-open the monitor) for example:

Ô»Ðó
ݽùÌ

that looks like some ascii code very promising (said the optimist)

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3);  

void setup()  
{
  Serial.begin(115200);
  Serial.println("Start color sensor");

  // set the data rate for the NewSoftSerial port
  mySerial.begin(38400);
  mySerial.print('C');
}

void loop()
{
  if (mySerial.available()) 
  {
    char c = mySerial.read();
    Serial.print(c, DEC);  // <<<<<<<<<<<<<<<<<<<<<<<<<<<<< line changed
    if (c == ',') Serial.println(); // split the R G and B
    if (c == 13) Serial.println(); // extra newline
  }
}

can you give it a try?

cool,

im getting a new reading roughly every second now...

ɵÁ\?Ё?p?aà°?ÁY`1?aÿ?ðÉÜp?aàЁ?£p?#à°???¡p?#øÐÅ?£p?#àðÉ??!p?øÌùñ	0?apÀ̹±?á cøÐÅ?£p?#à°?ÁK°cà?Ùpcà

There are coming to much bytes, could also be a loose wire(!)

Have you try alternative baud rates?
9600, 19200, 38400 (already tested), 115200?

Thanks, robtillaart. I tried your code, too, but I still don't get anything back.

ah yes, that makes sense then sensor runs at 38400,

changing that shows this

b,Start color sensor
495253-84494853-84494857-115495250-84494850-84494854-115495253-84494853-844948-75-115495253-84494853-84494853-115545344
-76-105-108-103-104-122544944
-108-99-106-102-102-122

what is unusual,

I can only start the readings when I pull out the 5v and ground and reinsert into the arduino. The sensor also works without the 5v wire.

added 2 extra lines

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3);  

void setup()  
{
  Serial.begin(115200);
  Serial.println("Start color sensor");

  // set the data rate for the NewSoftSerial port
  mySerial.begin(38400);
  mySerial.print('C');
}

void loop()
{
  if (mySerial.available()) 
  {
    char c = mySerial.read();
    Serial.print("<");  // <<<<<<<<<<<<<<<<<<<<<<<<<<<<< line added
    Serial.print(c, DEC);  
    Serial.print(">"); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<< line added
    if (c == ',') Serial.println(); // split the R G and B
    if (c == 13) Serial.println(); // extra newline
  }
}

please give it a try

I just updated your code

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3);  

void setup()  
{
  Serial.begin(38400); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<< changed to 38400
  Serial.println("Start color sensor");

  // set the data rate for the NewSoftSerial port
  mySerial.begin(38400);
  mySerial.print('C');
}

void loop()
{
  if (mySerial.available()) 
  {
    char c = mySerial.read();
    Serial.print("<"); 
    Serial.print(c, DEC);  
    Serial.print(">"); 
    if (c == ',') Serial.println(); // split the R G and B
    if (c == 13) Serial.println(); // extra newline
  }
}

That gives me this

b,¡¡¤%¥¡%%%Start color sensor
<52><51><44>
<-77><-108><-106><-103><-102><-122><50><53><44>
<-79><-107><-106><-104><-103><-122><50><53><44>
<-78><-111><-108><-103><-104><-122><50><53><44>
<-78><-103><-106><-103><-104><-122><50><49><44>
<-79><-104><-108><-104><-100><-122><50><52><44>
<-79><-103><-106><-102><-103><-122><52><51><44>
<-77><-111><-106><-103><-102><-122><52><48><44>
<-78><-104><-106><-103><-103><-122><49><48><44>
<-79><-104><-106><-102><-103><-122><51><50><44>
<-78><-104><-106><-103><-103><-122>

You should not be using a signed type for the print.
Try a "(unsigned char)" cast.