I'm trying to use particle photon with k30 co2 sensor but I end up with the following error message when running the code (which works on arduino):
SoftwareSerial.cpp:41:27: fatal error: avr/interrupt.h: No such file or directory #include <avr/interrupt.h>
which I suspect is based on the hardware-library compatibility. Any ideas how I should move on? I could either use an arduino and somehow connect it to photon I suppose and subsequently send the data through particle cloud...'
Thanks! I added serial1 to the code - it works, but the values are returning 0. In the case of SoftwareSerial the ports are virtual i.e. port 12 to Rx and port 13 for Tx on Arduino. What would be the equivalent using Serial1 - how does it ‘know’ what port is which, or is it assumed when using Serial1?
Edit: I am now receiving results, but very unreliable. Either 0,0,0… 65280, 0,0,0,2560,0,0 etc
/*
Basic Arduino example for K-Series sensor
Created by Jason Berger
Co2meter.com
*/
/*
Edited by kosmonaut
*/
//SoftwareSerial K_30_Serial(rx,tx); //Sets up a virtual serial port
//Using pin 12 for Rx and pin 13 for Tx
byte readCO2[] = {0xFE, 0X44, 0X00, 0X08, 0X02, 0X9F, 0X25}; //Command packet to read Co2 (see app note)
byte response[] = {0,0,0,0,0,0,0}; //create an array to store the response
//multiplier for value. default is 1. set to 3 for K-30 3% and 10 for K-33 ICB
int valMultiplier = 1;
void setup()
{
// put your setup code here, to run once:
Serial1.begin(9600); //Opens the main serial port to communicate with the computer
//K_30_Serial.begin(9600); //Opens the virtual serial port with a baud of 9600
}
void loop()
{
sendRequest(readCO2);
unsigned long valCO2 = getValue(response);
Serial1.print("Co2 ppm = ");
Serial1.println(valCO2);
delay(2000);
String str_co2 = String(valCO2);
Particle.publish("co2", str_co2);
}
void sendRequest(byte packet[])
{
while(!Serial1.available()) //keep sending request until we start to get a response
{
Serial1.write(readCO2,7);
delay(50);
}
int timeout=0; //set a timeoute counter
while(Serial1.available() < 7 ) //Wait to get a 7 byte response
{
timeout++;
if(timeout > 10) //if it takes to long there was probably an error
{
while(Serial1.available()) //flush whatever we have
Serial1.read();
break; //exit and try again
}
delay(50);
}
for (int i=0; i < 7; i++)
{
response[i] = Serial1.read();
}
}
unsigned long getValue(byte packet[])
{
int high = packet[3]; //high byte for value is 4th byte in packet in the packet
int low = packet[4]; //low byte for value is 5th byte in the packet
unsigned long val = high*256 + low; //Combine high byte and low byte with this formula to get value
return val* valMultiplier;
}
I guess you want that text sent to USB Serial, but that would be SerialnotSerial1.
Have another look at the link I provided above for Serial1 (it also talks about Serial and the differences).
Your setup should be
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200); // Opens the main serial port to communicate with the computer
Serial1.begin(9600); // Opens the virtual serial port with a baud of 9600
}
And in the rest of your code use the respective interfaces.