161 lines
3.2 KiB
C
161 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;
|
||
|
}
|