Created
September 29, 2020 18:56
-
-
Save dwblair/310acc6f8dafa8f82af713200ceda577 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Basic Arduino example for K-Series sensor | |
Created by Jason Berger | |
Co2meter.com | |
*/ | |
#include <SPI.h> | |
#include <Wire.h> | |
#include <Adafruit_GFX.h> | |
#include <Adafruit_SSD1306.h> | |
#define SCREEN_WIDTH 128 // OLED display width, in pixels | |
#define SCREEN_HEIGHT 64 // OLED display height, in pixels | |
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) | |
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) | |
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); | |
#include "SoftwareSerial.h" | |
SoftwareSerial K_30_Serial(3,4); //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: | |
Serial.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 | |
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64 | |
Serial.println(F("SSD1306 allocation failed")); | |
for(;;); // Don't proceed, loop forever | |
} | |
display.clearDisplay(); | |
display.setTextSize(1); // Normal 1:1 pixel scale | |
display.setTextColor(SSD1306_WHITE); // Draw white text | |
} | |
void loop() | |
{ | |
sendRequest(readCO2); | |
unsigned long valCO2 = getValue(response); | |
//Serial.print("Co2 ppm = "); | |
Serial.println(valCO2); | |
display.clearDisplay(); | |
display.setTextSize(1); // Normal 1:1 pixel scale | |
display.setTextColor(SSD1306_WHITE); // Draw white text | |
display.setCursor(0, 0); // Start at top-left corner | |
display.println("K30 CO2 Test"); | |
display.setTextSize(2); // Normal 1:1 pixel scale | |
display.println(); | |
display.print("PPM: "); | |
display.println(valCO2); | |
display.display(); | |
delay(2000); | |
} | |
void sendRequest(byte packet[]) | |
{ | |
while(!K_30_Serial.available()) //keep sending request until we start to get a response | |
{ | |
K_30_Serial.write(readCO2,7); | |
delay(50); | |
} | |
int timeout=0; //set a timeoute counter | |
while(K_30_Serial.available() < 7 ) //Wait to get a 7 byte response | |
{ | |
timeout++; | |
if(timeout > 10) //if it takes to long there was probably an error | |
{ | |
while(K_30_Serial.available()) //flush whatever we have | |
K_30_Serial.read(); | |
break; //exit and try again | |
} | |
delay(50); | |
} | |
for (int i=0; i < 7; i++) | |
{ | |
response[i] = K_30_Serial.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; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment