Basic tutorial of how to setup a Capacitive Soil Moisture Sensor with the Raspberry Pi via an ADS1115 ADC.
PREREQUISITE: https://www.piddlerintheroot.com/analog-to-digital-converter/
CALIBRATION EQUIPMENT:
Small cup of water
CALIBRATION PROCESS:
1. Place soil sensor on dry surface
2. Run cap_calibration script, enter ‘y’ on first prompt
3. Place soil sensor in small cup of water
4. Enter ‘y’ on second prompt
5. Verify cap_config.json text file was successfully generated
CODE:
cap_calibration.py
import time import json import board import busio import adafruit_ads1x15.ads1015 as ADS from adafruit_ads1x15.analog_in import AnalogIn max_val = None min_val = None # Create the I2C bus i2c = busio.I2C(board.SCL, board.SDA) # Create the ADC object using the I2C bus ads = ADS.ADS1015(i2c) # Create single-ended input on channel 0 chan = AnalogIn(ads, ADS.P0) baseline_check = input("Is Capacitive Sensor Dry? (enter 'y' to proceed): ") if baseline_check == 'y': max_val = chan.value print("------{:>5}\t{:>5}".format("raw", "v")) for x in range(0, 10): if chan.value > max_val: max_val = chan.value print("CHAN 0: "+"{:>5}\t{:>5.3f}".format(chan.value, chan.voltage)) time.sleep(0.5) print('\n') water_check = input("Is Capacitive Sensor in Water? (enter 'y' to proceed): ") if water_check == 'y': min_val = chan.value print("------{:>5}\t{:>5}".format("raw", "v")) for x in range(0, 10): if chan.value < min_val: min_val = chan.value print("CHAN 0: "+"{:>5}\t{:>5.3f}".format(chan.value, chan.voltage)) time.sleep(0.5) config_data = dict() config_data["full_saturation"] = min_val config_data["zero_saturation"] = max_val with open('cap_config.json', 'w') as outfile: json.dump(config_data, outfile) print('\n') print(config_data) time.sleep(0.5)
soil_saturation.py
import time import json import board import busio import adafruit_ads1x15.ads1015 as ADS from adafruit_ads1x15.analog_in import AnalogIn # Create the I2C bus i2c = busio.I2C(board.SCL, board.SDA) # Create the ADC object using the I2C bus ads = ADS.ADS1015(i2c) # Create single-ended input on channel 0 chan = AnalogIn(ads, ADS.P0) with open("cap_config.json") as json_data_file: config_data = json.load(json_data_file) # print(json.dumps(config_data)) def percent_translation(raw_val): per_val = abs((raw_val- config_data["zero_saturation"])/(config_data["full_saturation"]-config_data["zero_saturation"]))*100 return round(per_val, 3) if __name__ == '__main__': print("---------- {:>5}\t{:>5}".format("Saturation", "Voltage\n")) while True: try: print("SOIL SENSOR: " + "{:>5}%\t{:>5.3f}".format(percent_translation(chan.value), chan.voltage)) except Exception as error: raise error except KeyboardInterrupt: print('exiting script') time.sleep(1)