How to: soil moisture measurement?

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 shown

digital 2---*
|

/
\ R1
/
|
|
analog 0----*
|
|
*----> nail 1

----> nail 2
|
|
|
digital 3---

*/

#define moisture_input 0
#define divider_top 2
#define divider_bottom 3

int 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;

}