A simple circuit can be just as accurate as a more complex one. The more complex circuit is more sensitive though.
As for calibration, you're correct in how to get the zero and 100% points.
The simple 'two nails' probe works OK as an experiment, but accuracy degrades, slowly in some cases, rather quickly in others, depending a lot on soil chemistry. The nails corrode, and the use of a DC current aggravates the problem due to electro-migration.
A more practical probe will use an AC measuring current, and use corrosion resistant probes.
The AC measurement technique can be easily done with an Arduino, but it will cost you a two digital pins.
Your 'probe' (the two nails) are in series with a resistor, forming a voltage divider. The center of the divider is connected to an analog input. The voltage divider is connected between two digital outputs.
The following code fragment gives an example.
/*
Connect two nails and a resistor as showndigital 2---*
|
/
\ R1
/
|
|
analog 0----*
|
|
*----> nail 1----> nail 2
|
|
|
digital 3---
*/#define moisture_input 0
#define divider_top 2
#define divider_bottom 3int SoilMoisture(){
int reading;
// set driver pins to outputs
pinMode(divider_top,OUTPUT);
pinMode(divider_bottom,OUTPUT);// drive a current through the divider in one direction
digitalWrite(divider_top,HIGH);
digitalWrite(divider_bottom,LOW);// wait a moment for capacitance effects to settle
delay(1000);// take a reading
reading=analogRead(moisture_input);// reverse the current
digitalWrite(divider_top,LOW);
digitalWrite(divider_bottom,HIGH);// give as much time in 'revers'e as in 'forward'
delay(1000);// stop the current
digitalWrite(divider_bottom,LOW);return reading;
}