Hello, has anyone had issues with an analog sensor's voltage moving up and down in accordance with a the turning of a dial on a potentiometer? And if so, what is happening?
In the following sketch, whenever I adjust the potentiometer, the reading from the sensor moves up or down in tandem with the reading from the potentiometer.
// ----- Plant watering system with knob ----- //
int potPin = A0; // pot pin on pin A0
int sensorPin = A4; // soil sensor on pin A1
int pumpPin = 8; // water pump on pin 8
float sensorValue = 0; // value read from soil sensor
float potValue = 0; // value from potPin
void setup() {
pinMode(potPin,INPUT);
pinMode(sensorPin,INPUT);
pinMode(pumpPin,OUTPUT);
Serial.begin(9600);
}
void loop() {
for(int i=0; i<=100; i++){ // counter to 100
sensorValue = sensorValue + analogRead(sensorPin); // add new reading from the moisture to the float sensorValue
potValue = potValue + analogRead(potPin); // add new reading from the pot pinto float potValue
delay(1);
}
sensorValue = sensorValue/100.0; // divide the total for sensorValue by 100 and display results - this will give the average of 100 readings
potValue = potValue/100.0; // average the potValue
if(sensorValue >= potValue){ // if the soil is drier than the set point from the pot
digitalWrite(pumpPin,HIGH); // turn on the pump for 2 minutes
delay(2000);
digitalWrite(pumpPin,LOW); // turn pump off
delay(2000);
}
Serial.print("Sensor Value: ");
Serial.print(sensorValue); // print moisture level
Serial.print(" Pot Value: ");
Serial.println(potValue); // print the moisture setting
delay(300);
sensorValue = 0;
potValue = 0;
}
It's probably a hardware/wiring problem but you can try moving delay() to between the two analog readings. There is only one shared analog-to-digital converter and it takes a little time to "settle".
If the output impedance of the analog sensor is high, there may not be enough time to charge and discharge the sample and hold capacitor charged by the POT.
Since the sample and hold capacitor is not intentionally discharged by uC between each measurement, it can be solved by sandwiching the GND measurement so that it is connected to GND once between measurements, or by connecting a buffer to the output of the your analog sensor.
The following post is not wrote in English, but I have explained something similar in the past.
It may help if you can read it with using Google Translator.
for(int i=0; i<=100; i++){ // counter to 100
sensorValue = sensorValue + analogRead(sensorPin); // add new reading from the moisture to the float sensorValue
potValue = potValue + analogRead(potPin); // add new reading from the pot pinto float potValue
delay(1);
}
You dont say which ardiuino module you are using; however reading the values alternately in rapid succession is not good practise - you need to let the adc input settle to the new value.
Also for smoothing it makes more sense to use a power of two (eg 64) - microcomputers dont count on their fingers.
You dont need float resolution so you can keep all in integers.
As you are using a soil sensor you dont need a fast response so perhaps try something like this
unsigned int sensorValue = 0; // value read from soil sensor
unsigned int potValue = 0; // value from potPin
void loop() {
for(int i=0; i<=64; i++){ // counter to 64
sensorValue = sensorValue + analogRead(sensorPin); // add new reading from the moisture sensor
delay(8); //this counted loop takes 64*8 msec = 512 msec
}
for(int i=0; i<=64; i++){ // counter to 64
potValue = potValue + analogRead(potPin); // add new reading from the pot pin
delay(8); //this counted loop takes 64*8 msec = 512 msec
}
//all above takes about 1 second
sensorValue = sensorValue/64; // divide the total for sensorValue by 64 and display results - this will give the average of 64 readings
potValue = potValue/64;
If both pot and sensor have output impedance of 10k or less this should not be a problem. If you provide full details of the hardware we can figure this out.
The sensor might be ratiometric or not - this can be an issue - again full details of the sensor please - and circuit of course.
If your Arduino uses an 8-bit AVR microcontroller you need to use long for sensorValue and potValue as int on these Arduinos cannot count beyond 32767,
and you are summing 100 lots of a value in the range 0..1023, which could be upto 102300