Hello all. I’m trying to integrate the heatcam example sketches(Github) related to the Grid Eye Qwiik breakout from Sparkfun, into a bigger project, but am not able to it running reliably on it’s own. When it works, it works just fine and I am seeing the results from both the Arduino and Processing sides are operating as expected. Here are the example sketches:
Arduino
/*
Visualizing the Panasonic Grid-EYE Sensor Data using Processing
By: Nick Poole
SparkFun Electronics
Date: January 12th, 2018
MIT License: Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Feel like supporting our work? Buy a board from SparkFun!
https://www.sparkfun.com/products/14568
This example is intended as a companion sketch to the Processing sketch found in the same folder.
Once this code is running on your hardware, open the accompanying Processing sketch and run it
as well. The Processing sketch will receive the comma separated values generated by this code and
use them to generate a thermal image. If you don't have Processing, you can download it here:
https://processing.org/
Hardware Connections:
Attach the Qwiic Shield to your Arduino/Photon/ESP32 or other
Plug the sensor onto the shield
*/
#include <Wire.h>
#include <SparkFun_GridEYE_Arduino_Library.h>
GridEYE grideye;
void setup() {
// Start your preferred I2C object
Wire.begin();
// Library assumes "Wire" for I2C but you can pass something else with begin() if you like
grideye.begin();
// Pour a bowl of serial
Serial.begin(115200);
}
void loop() {
// Print the temperature value of each pixel in floating point degrees Celsius
// separated by commas
for(unsigned char i = 0; i < 64; i++){
Serial.print(grideye.getPixelTemperature(i));
Serial.print(",");
}
// End each frame with a linefeed
Serial.println();
// Give Processing time to chew
delay(100);
}
Processing
/*
Visualizing the Panasonic Grid-EYE Sensor Data using Processing
By: Nick Poole
SparkFun Electronics
Date: January 12th, 2018
MIT License: Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Feel like supporting our work? Buy a board from SparkFun!
https://www.sparkfun.com/products/14568
This example is intended as a companion sketch to the Arduino sketch found in the same folder.
Once the accompanying code is running on your hardware, run this Processing sketch.
This Processing sketch will receive the comma separated values generated by the Arduino code and
use them to generate a thermal image.
Hardware Connections:
Attach the Qwiic Shield to your Arduino/Photon/ESP32 or other
Plug the sensor onto the shield
*/
import processing.serial.*;
String myString = null;
Serial myPort; // The serial port
float[] temps = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// The statements in the setup() function
// execute once when the program begins
void setup() {
size(400, 400); // Size must be the first statement
noStroke();
frameRate(30);
// Print a list of connected serial devices in the console
printArray(Serial.list());
// Depending on where your GridEYE falls on this list, you
// may need to change Serial.list()[0] to a different number
myPort = new Serial(this, Serial.list()[2], 115200);
myPort.clear();
// Throw out the first chunk in case we caught it in the
// middle of a frame
myString = myPort.readStringUntil(13);
myString = null;
// change to HSB color mode, this will make it easier to color
// code the temperature data
colorMode(HSB, 360, 100, 100);
}
// The statements in draw() are executed until the
// program is stopped. Each statement is executed in
// sequence and after the last line is read, the first
// line is executed again.
void draw() {
// When there is a sizeable amount of data on the serial port
// read everything up to the first linefeed
if(myPort.available() > 64){
//delay(100);
myString = myPort.readStringUntil(13);
// generate an array of strings that contains each of the comma
// separated values
if (myString !=null) // had to enclose the following in this if statement to solve null pointer exception errors
{
String splitString[] = splitTokens(myString, ",");
printArray(splitString);
// for each of the 64 values, map the temperatures between 20C and 40C
// to the blue through red portion of the color space
for(int q = 0; q < 64; q++){
temps[q] = map(float(splitString[q]), 35, 39, 100, 360);
}
}
}
// Prepare variables needed to draw our heatmap
int x = 0;
int y = 0;
int i = 0;
background(0); // Clear the screen with a black background
// each GridEYE pixel will be represented by a 50px square:
// because 50 x 8 = 400, we draw squares until our y location
// is 400
while(y < 400){
// for each increment in the y direction, draw 8 boxes in the
// x direction, creating a 64 pixel matrix
while(x < 400){
// before drawing each pixel, set our paintcan color to the
// appropriate mapped color value
fill(temps[i], 100, 100);
rect(x,y,50,50);
x = x + 50;
i++;
}
y = y + 50;
x = 0;
}
// Add a gaussian blur to the canvas in order to create a rough
// visual interpolation between pixels.
filter(BLUR,10);
}
However, I have to start the Processing sketch many times before it does behave- I have probably a 30% success rate every time. When it does not work, I get the following error (Not always 23):
map(NaN, 35, 39, 100, 360) called, which returns NaN (not a number)
ArrayIndexOutOfBoundsException: 23
I put a printArray
right after the String splitString[] = splitTokens(myString, ",");
And this is what is in the console when it throws the error:
[0] "COM1"
[1] "COM3"
[2] "COM4"
[0] "16.25"
[1] "16.75"
[2] "16.25"
[3] "16.00"
[4] ".00"
[5] "17.50"
[6] "17.50"
[7] "17.25"
[8] "17.50"
[9] "18.00"
[10] "18.50"
[11] "18.50"
[12] "18.75"
[13] "19.50"
[14] "18.00"
[15] "18.00"
[16] "17.25"
[17] "18.00"
[18] "18.00"
[19] "18.00"
[20] "19.00"
[21] "19.00"
[22] "
"
map(NaN, 35, 39, 100, 360) called, which returns NaN (not a number)
ArrayIndexOutOfBoundsException: 23
I’ve tried solutions from the issues section of the github as well as some from other posts both here and in the Arduino forum but I just can’t figure out what is wrong.