160 lines
3.2 KiB
C
160 lines
3.2 KiB
C
/*
|
|
* DHT Stuff
|
|
*
|
|
*/
|
|
#define DHTTYPE DHT11
|
|
DHT dht(PINdht, DHTTYPE);
|
|
|
|
|
|
/*
|
|
* Chirp functions
|
|
*/
|
|
void writeI2CRegister8bit(int addr, int value) {
|
|
Wire.beginTransmission(addr);
|
|
Wire.write(value);
|
|
Wire.endTransmission();
|
|
}
|
|
|
|
unsigned int readI2CRegister16bit(int addr, int reg) {
|
|
Wire.beginTransmission(addr);
|
|
Wire.write(reg);
|
|
Wire.endTransmission();
|
|
delay(20);
|
|
Wire.requestFrom(addr, 2);
|
|
unsigned int t = Wire.read() << 8;
|
|
t = t | Wire.read();
|
|
return t;
|
|
}
|
|
|
|
/*
|
|
*
|
|
* Sensor functions
|
|
*
|
|
*/
|
|
|
|
int getWaterlevel() {
|
|
|
|
/*
|
|
* waterlevelRAW
|
|
* ===========
|
|
* 0 - 199 : CRITICAL
|
|
* 200 - 399 : WARNING
|
|
* >400 : OK
|
|
*
|
|
* waterlevel
|
|
* ==========
|
|
* 2 : CRITICAL
|
|
* 1 : WARNING
|
|
* 0 : OK
|
|
*/
|
|
|
|
short waterlevelWARN = 200;
|
|
short waterlevelOK = 400;
|
|
short waterlevelRAW = 0;
|
|
byte waterlevel = 0;
|
|
|
|
// enable Vcc for water level sensor
|
|
digitalWrite(PINwaterlevel, HIGH);
|
|
// wait a bit to let the circuit stabilize
|
|
// TODO: replace delay() with millis()
|
|
delay(100);
|
|
// get the value
|
|
waterlevelRAW = analogRead(PINanalog);
|
|
// disable Vcc for the sensor to prevent electrolysis effect and release analog pin
|
|
digitalWrite(PINwaterlevel, LOW);
|
|
|
|
if( waterlevelRAW >= waterlevelOK) {
|
|
waterlevel = 0;
|
|
} else if( waterlevelRAW >= waterlevelWARN) {
|
|
waterlevel = 1;
|
|
} else {
|
|
waterlevel = 2;
|
|
}
|
|
|
|
return waterlevel;
|
|
}
|
|
|
|
float getTemperature(byte tempSensor) {
|
|
/*
|
|
* tempSensor
|
|
* ==========
|
|
* 1 : DHT11 temp sensor
|
|
* 2 : chirp I2C temp sensor
|
|
*/
|
|
|
|
float temperature = 0;
|
|
|
|
switch(tempSensor) {
|
|
case 1:
|
|
// read temperature from DHT11
|
|
temperature = dht.readTemperature();
|
|
break;
|
|
case 2:
|
|
// read temperature from chrip I2C
|
|
temperature = readI2CRegister16bit(0x20, 5) * 0.10 ;
|
|
break;
|
|
default:
|
|
// if sensor type is not recognized, return 99
|
|
temperature = 99.99;
|
|
}
|
|
|
|
return temperature;
|
|
}
|
|
|
|
float getHumidity() {
|
|
float humidity = dht.readHumidity();
|
|
return humidity;
|
|
}
|
|
|
|
int getSoilmoisture(byte moistureSensor) {
|
|
/*
|
|
* moistureSensor
|
|
* ==============
|
|
* 1 : analog capacitive moisture sensor
|
|
* 2 : chirp I2C moisture sensor
|
|
*/
|
|
|
|
// value to return
|
|
int soilmoisture;
|
|
// value for wet
|
|
int wet;
|
|
// value for dry
|
|
int dry;
|
|
|
|
switch(moistureSensor) {
|
|
case 1:
|
|
// read analog value from analog moisture sensor
|
|
wet = 180;
|
|
dry= 590;
|
|
|
|
digitalWrite(PINsoilmoisture, HIGH);
|
|
// wait a bit to let the circuit stabilize
|
|
delay(100);
|
|
// get analog input value
|
|
soilmoisture = analogRead(PINanalog);
|
|
// disable Vcc for the sensor to release analog pin
|
|
digitalWrite(PINsoilmoisture, LOW);
|
|
break;
|
|
case 2:
|
|
// read soil moisture from chrip I2C
|
|
wet = 560;
|
|
dry= 250;
|
|
|
|
// get raw value from I2C chirp sensor
|
|
soilmoisture = readI2CRegister16bit(0x20, 0);
|
|
break;
|
|
default:
|
|
wet = 0;
|
|
dry = 1;
|
|
soilmoisture = -1;
|
|
}
|
|
|
|
return map(soilmoisture, wet, dry, 100, 0);
|
|
}
|
|
|
|
int getLightchirp() {
|
|
// get the "light value" from I2C chirp module
|
|
writeI2CRegister8bit(0x20, 3); //request light measurement
|
|
int lightchirp = readI2CRegister16bit(0x20, 4);
|
|
return lightchirp;
|
|
}
|