//Program created by IsmaLB //Values can be accessed via I2C internal address //0 soil moisture value -> 16 bit value high byte first //2 water moisture value -> 16 bit value high byte first #include // #define "__AVR_DEV_LIB_NAME__=tn1614", // #define DEBUG_SERIAL_ENABLED #define I2C_PERIPHERAL_ADDR 9 //define pins #define WATER_WAVE_PIN 0 #define SOIL_WAVE_PIN 5 #define WATER_SENSOR_PIN 2 #define SOIL_SENSOR_PIN 3 //sensor calibation values #define WATER_FILLED_VALUE 532 #define WATER_EMPTY_VALUE 809 #define SOIL_WATER_VALUE 653 #define SOIL_AIR_VALUE 804 int waterLevelValue = 1024; int waterLevelValueRaw = 1024; unsigned int soilMoistureValue = 1024; unsigned int soilMoistureValueRaw = 1024; uint8_t currentInternalAddress = 0; uint8_t numberOfSamples = 10; void setup() { #ifdef DEBUG_SERIAL_ENABLED Serial.swap(1); Serial.begin(9600); #else Wire.swap(1); Wire.begin(I2C_PERIPHERAL_ADDR); Wire.onReceive(onReceive); Wire.onRequest(onRequest); #endif pinMode(SOIL_SENSOR_PIN,INPUT); pinMode(WATER_SENSOR_PIN,INPUT); pinMode(SOIL_WAVE_PIN,OUTPUT); pinMode(WATER_WAVE_PIN,OUTPUT); ADC0.CTRLC |= ADC_PRESC_DIV128_gc; // set the ADC prescaler to 128 const uint8_t wavePeriod = 20; TCA0.SPLIT.CTRLA = 0; //disable TCA0 TCA0.SPLIT.CTRLD = TCA_SPLIT_ENABLE_bm; // sets the split mode TCA0.SPLIT.CTRLB = TCA_SPLIT_HCMP1EN_bm | TCA_SPLIT_LCMP2EN_bm; // Select WO2/WO4 as output TCA0.SPLIT.HPER = wavePeriod - 1; // Setting the TOP value to 8 TCA0.SPLIT.LPER = wavePeriod - 1; // Setting the TOP value to 8 TCA0.SPLIT.HCMP1 = (wavePeriod / 2)-1 ; //50% duty cycle TCA0.SPLIT.LCMP2 = (wavePeriod / 2)-1 ; //50% duty cycle TCA0.SPLIT.CTRLA |= 1; //enable TCA0 analogSampleDuration(31); } void loop() { //meassure the values for (uint8_t i = 0; i < numberOfSamples; i++) { waterLevelValueRaw += analogRead(WATER_SENSOR_PIN); soilMoistureValueRaw += analogRead(SOIL_SENSOR_PIN); } waterLevelValueRaw /= numberOfSamples; soilMoistureValueRaw /= numberOfSamples; #ifdef DEBUG_SERIAL_ENABLED Serial.print(" water: "); Serial.print(waterLevelValueRaw); Serial.print(" soil: "); Serial.print(soilMoistureValueRaw); Serial.print('\n'); #endif //map the values to persentages waterLevelValueRaw = map(waterLevelValueRaw,WATER_EMPTY_VALUE,WATER_FILLED_VALUE,0,100); soilMoistureValueRaw = map(soilMoistureValueRaw,SOIL_AIR_VALUE,SOIL_WATER_VALUE,0,100); waterLevelValue = constrain(waterLevelValueRaw,0,100); soilMoistureValue = constrain(soilMoistureValueRaw,0,100); delay(10); } void onReceive(int howMany){ while (Wire.available() > 1) { Wire.read(); } currentInternalAddress = Wire.read(); } void onRequest(){ if(currentInternalAddress == 0){ Wire.write(highByte(soilMoistureValue)); Wire.write(lowByte(soilMoistureValue)); } else if(currentInternalAddress == 2){ Wire.write(highByte(waterLevelValue)); Wire.write(lowByte(waterLevelValue)); } else{ Wire.write(highByte(127)); Wire.write(lowByte(127)); } }