Arduino/Mega2560-MiCS6814-Client/Mega2560-MiCS6814-Client.ino
2018-07-23 08:55:13 +02:00

81 lines
2.4 KiB
C++

#include <Wire.h>
#define I2C_ADDR 0x04
// I2C Communication (Taken from Groove sensor, hoping to use the same library on client side)
#define CMD_ADC_NH3 1 // NH3 channel
#define CMD_ADC_CO 2 // CO channel
#define CMD_ADC_NO2 3 // NO2 channel
#define CMD_ADC_ALL 4 // All channels
#define CMD_CHANGE_I2C 5 // I2C address change
#define CMD_READ_EEPROM 6 // Read stored data from EEPROM as unsigned int
#define CMD_SET_R0_ADC 7 // Set R0 ADC value
#define CMD_GET_R0_ADC 8 // Get R0 ADC value
#define CMD_GET_R0_ADC_DEFAULT 9 // Get factory R0 ADC value
#define CMD_CONTROL_LED 10 // Control LED (no LED on my board, but Groove supports is, so ... meh!)
#define CMD_CONTROL_PWR 11 // Heater control
// EEPROM Addresses (Match Groove addresses)
#define EEPROM_INIT_DONE 0
#define EEPROM_DEFAULT_ADC_NH3 2
#define EEPROM_DEFAULT_ADC_CO 4
#define EEPROM_DEFAULT_ADC_NO2 6
#define EEPROM_ADC_NH3 8
#define EEPROM_ADC_CO 10
#define EEPROM_ADC_NO2 12
#define EEPROM_I2C_ADDR 20
void setup() {
Serial.begin(115200);
// Connect to sensor through wire lib directly
Wire.begin();
// Check version
Wire.beginTransmission(I2C_ADDR);
Wire.write(CMD_READ_EEPROM);
Wire.write(EEPROM_INIT_DONE);
Wire.endTransmission();
uint8_t returned = Wire.requestFrom(I2C_ADDR, 2);
if (returned == 2 && Wire.available() == 2) {
uint8_t msb = Wire.read();
uint8_t lsb = Wire.read();
Serial.print("Init data: ");
Serial.println((msb << 8) | lsb);
} else {
Serial.println("ERROR 1234: Unexpected data!");
}
// Activate Heater
Wire.beginTransmission(I2C_ADDR);
Wire.write(CMD_CONTROL_PWR);
Wire.write(1);
Wire.endTransmission();
}
void loop() {
// Grab all data
Wire.beginTransmission(I2C_ADDR);
Wire.write(CMD_ADC_ALL);
Wire.endTransmission();
delayMicroseconds(50);
uint8_t ret = Wire.requestFrom(I2C_ADDR, 6);
if (ret == 6 && Wire.available() == 6) {
uint16_t data[3];
for (uint8_t i = 0; i < 3; ++i) {
uint8_t msb = Wire.read();
uint8_t lsb = Wire.read();
data[i] = (msb << 8) | lsb;
}
Serial.print(data[0]);
Serial.print("\t");
Serial.print(data[1]);
Serial.print("\t");
Serial.println(data[2]);
} else {
Serial.print("Request error! - Returned bytes: ");
Serial.println(ret);
}
delay(50);
}