Smart Plant Care! Build a Qwiic Soil Moisture Sensor System

Pages
Contributors: Chowdah
Favorited Favorite 0

Code

The code for this project is really simple, just download the Arduino libraries for the products used and past the code below into the terminal! Make sure to adjust the moisture values to suit your plant's needs. The values used below seem to work pretty well for my money tree, which is a pretty low-fuss plant.

#include <Wire.h>
#include <SparkFun_Qwiic_OLED.h>
#include <res/qw_fnt_5x7.h>

QwiicMicroOLED myOLED;

#define COMMAND_GET_VALUE   0x05
const uint8_t qwiicAddress = 0x28;
uint16_t ADC_VALUE = 0;


const int dryValue = 1023;
const int wetValue = 400;

void setup() {
    Serial.begin(115200);
    Wire.begin();

    while (myOLED.begin() == false) {
        Serial.println("OLED not connected, check wiring!");
        delay(1000);
    }

    testForConnectivity();
}

void loop() {
    int moistureValue = getMoisture();
    displayMoisture(moistureValue);
    delay(1000);
}

int getMoisture() {
    get_value();
    return map(ADC_VALUE, dryValue, wetValue, 0, 100);
}

void get_value() {
    Wire.beginTransmission(qwiicAddress);
    Wire.write(COMMAND_GET_VALUE);
    Wire.endTransmission();

    Wire.requestFrom((uint8_t)qwiicAddress, (uint8_t)2);

    if (Wire.available() >= 2) {
        uint8_t ADC_VALUE_L = Wire.read();
        uint8_t ADC_VALUE_H = Wire.read();
        ADC_VALUE = (ADC_VALUE_H << 8) | ADC_VALUE_L;
    }
}

void displayMoisture(int moistureValue) {
    myOLED.erase();

    if (moistureValue < 30) {
        // Happy Face when well-watered
        myOLED.line(20, 0, 30, 0);   // Left eye
        myOLED.line(40, 0, 50, 0);   // Right eye

        // Smile: \__/
        myOLED.line(20, 20, 30, 10);   // Left smile
        myOLED.line(30, 10, 40, 10);   // Bottom of smile
        myOLED.line(40, 10, 50, 20);   // Right smile
    } else if (moistureValue >= 50 && moistureValue < 70) {
        // Neutral Face
        myOLED.line(20, 0, 30, 0);   // Left eye
        myOLED.line(40, 0, 50, 0);   // Right eye
        myOLED.line(20, 20, 50, 20);   // Neutral line
    } else {
        // Sad Face when dry
        myOLED.line(20, 0, 30, 0);   // Left eye
        myOLED.line(40, 0, 50, 0);   // Right eye

        // Sad mouth: /--\
        myOLED.line(20, 10, 30, 20);   // Left sad
        myOLED.line(30, 20, 40, 20);   // Bottom of sad
        myOLED.line(40, 20, 50, 10);   // Right sad
    }

    myOLED.display();

    Serial.print("Moisture: ");
    Serial.print(moistureValue);
    Serial.println("%");
}

void testForConnectivity() {
    Wire.beginTransmission(qwiicAddress);
    if (Wire.endTransmission() != 0) {
        Serial.println("Check connections. No soil sensor found.");
        while (1);
    }
}