• Testing the moisture sensor

    borosLab05/14/2019 at 07:11 0 comments

    After testing the sensor just a brief summary.

    The sensor used is a cheap one purchased in china. Has no brand and is labeled as v 1.2. After a brief inspection the sensor seems to be similar to DFRobot's. A capacitive sensor based on a 555 oscilator to measure the capacitance of the pcb tracks on the sensor area:

    Output is measured and confirmed that output is pulled down with a 1M resistor decoupled with a 1uF cap. 

    0. Sensor range: Range is confirmed with documentation. Dry (air dry): 2.8V / Water (humidity saturation) with tap water: 1,44V.  This leave a sensitive range of 1.4V. this range is big enough for a 10-bit ADC. 

    1. Startup time: When the sensor is powered from a bench power supply at 3.3V the output response require some time to output stable voltage for measurement.

    When sensor is submerged in water the response is the following (blue->VCC , yellow-> sensor output):

    On dry air the sensor response is similar but it require more more time as the output voltage is higher:

        This measurements provide a estimation for the response time of the sensor: 150ms

    2. Current drawn: At 3.3V with the sensor floating output the current used by the sensor when power is in line with the specs: 5.3mA.



    3&4: Testing output stability and measure response:
       To test sensor output I carried out simple experiment with a small pot & compost. I logged the sensor output using a Wemos D1 and small sketch to send over TCP every 2 minutes the reading of the sensor. On the server side I used my local node-RED al the readings.

       10 samples of the sensor are measured, the value transmitted is the average of the measure and also the standard deviation of the 10 samples are computed.

    #include <Arduino.h>
    #include <ESP8266WiFi.h>
    #include <math.h>
    
    
    const char *ssid="xxxxx";
    const char *pwd="xxxxx";
    
    // Report every
    //#define  REPORT   10*1000
    #define  REPORT   2*60*1000
    
    
    
    
    
    void connectWiFi() {
      
      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
    
      /* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
         would try to act as both a client and an access-point and could cause
         network-issues with your other WiFi-devices on your WiFi-network. */
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, pwd);
    
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
    
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      digitalWrite(2,1); // Led on initialization
    }
    
    uint32_t order;
    
    void setup() {
    
     pinMode(2,OUTPUT);
     digitalWrite(2,0); // Led on initialization
      
     Serial.begin(115200);
    
      // We start by connecting to a WiFi network
      connectWiFi();
    
      order=0;
    
    }
    
    ADC_MODE(ADC_TOUT)
    
    void measure(uint16_t *m,float *std) {
      const int n=10;
      uint16_t v[n];
      int i,u=0;
      double std_dev=0.0;
      // compute avg
      for(i=0;i<n;i++) {
        v[i]=analogRead(A0);
        u+=v[i];
        delay(1);
      }
      u=u / n; // average
      // compute std dev
      for(i=0;i<n;i++) {
        std_dev += (v[i]-u) * (v[i]-u);
      }
      std_dev = sqrt(std_dev/n); // std_dev
    
      *m=u;
      *std=std_dev;
      Serial.printf("T:%lu, mean:%d, std dev:%f\n",millis(),u,*std);
    }
    
    
    uint32_t last_report=0;
    
    void loop() {
      uint16_t m;
      float std_dev;
    
      if(WiFi.status() != WL_CONNECTED) connectWiFi();
      if((millis()-last_report) > REPORT) {
          digitalWrite(2,0); // Led on initialization
          measure(&m,&std_dev);
          WiFiClient client;
          if(client.connect(IPAddress(192,168,4,1),8266)) {
            Serial.print("Sending...");
            client.printf("%d,%d,%f",order,m,std_dev);
            order++;
            client.flush();
            delay(500);
            client.stop();
            Serial.println("sent!");
          }
        last_report= millis();
        digitalWrite(2,1); // Led on initialization
      }
      
    
    }

     


    1st I dry the compost in the sun to simulate a dry...

    Read more »

  • The Sensor

    borosLab05/13/2019 at 16:18 0 comments

      Selecting the sensor & testing the sensor:

      After some research I decided to go with cheap Capacitive sensors. They are sold for $2 in typical makers maketpaces such ebay or aliexpress. possibly they are not great but for the purpose of the projects accuracy is not a big deal. I expect to be able to control a simple scale of moisture such dry,almost dry, good, wet and very wet. This levels needs to be calibrated in the configuration. But for now this will not be relevant.


      Al details of this kind of sensors can be found here: https://wiki.dfrobot.com/Capacitive_Soil_Moisture_Sensor_SKU_SEN0193

      Schematic: https://github.com/Arduinolibrary/DFRobot_Capacitive_Soil_Moisture_Sensor/blob/master/SEN0193%20%20Capacitive%20Soil%20Moisture%20SensorV1.0.PDF

      Key parameters for this project:

      1. Works with 3.3V as input. The sensor has its own voltage regulator to 3V.
      2. Consumes 5mA in operation. This is not Low power friendly. [power need to be gated]
      3. Analog output is pulled down with a 1M resistor and will be less 3V. The output diode will drop the output voltage 2.8-2.4V.
      4. High voltages  means dry, low voltages means wet. According to the documentation arround 1V range can be managed.

      To test:

      1. Verify power consumption stand alone.
      2. Test response time on power up.
      3. Test variablity of consecutive readings.
      4. Dynamic test: Record one run of the sensor from wet soil to dry soil. To check linearity.