Hi this is my first time posting on here and im pretty new to arduinos so sorry if its in the wrong place...
Im working on a project where a soil moisture sensor turns on valve to water plants... but i want to add a light sensor so it only works in the daytime.
Im having a problem with getting two if statements to work with one thing...
if ( percentage < 75 && (Light >100 ) )
{
digitalWrite(7, HIGH); // WATER ON
}
else if (percentage > 75 && (Light <100 ) )
{
digitalWrite(7, LOW); // WATER OFF
}
Heres the code i've made, it is reading the data and will work to turn on the water when there is enough light, but then when i cover the light sensor it doesnt turn off.
When debugging if/else it is helpful to print the values being tested before testing them to see if they are what you think
Please post your complete program as advised in Read this before posting a programming question so that we can see the context. For instance, where is the value of percentage set, noting that the test of its value is inverted between the if and the else
I think the logic will be easier to manage if you separate the light from the moisture - something like this pseudo code
read the brightness sensor
read the moisture sensor
if it is bright
daytime = true
else
daytime = false
if (daytime == true) {
if it is too dry
turn pump on
else
turn pump off
}
In your code sample, what happens if percentage is exactly 75 or Light is exactly 100 ? You could use >= or <= but Robin’s approach would be a neater way to deal with that problem. That way, if, say, the statement if (Light>100) evaluates to false, then by implication the ‚else’ part must be true. This leaves no room for ambiguity.
#define SensorPin A0
float sensorValue = 0;
int percentage;
const int Psensor = A1;
int map_low = 400;
int map_high = 210;
int Light;
int daytime;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(7, OUTPUT);//watering
pinMode(Psensor, INPUT);
}
void loop() {
{sensorValue = analogRead(SensorPin);
Serial.println(sensorValue);
percentage = map(sensorValue, map_low, map_high, 0, 100);
Serial.print(" | percentage: ");
Serial.print(percentage);
Serial.println("%");}
analogRead(Light);
Serial.println(Light);
Light = analogRead(Psensor);
Serial.println(Light);
delay(1000);
{
daytime = Light > 100;
if (daytime == true) {
if (percentage < 75)
digitalWrite(7,HIGH);
else
digitalWrite(7,LOW);
}
}}
Thanks just added that and it runs, the system is reacting to the change in light and turning on, but when i cover the sensor it still isnt turning off, to test im using an led instead of the watering system. As for the soil moisture sensor its currently reading 17% so shouldnt be effecting anything as its threshold is 75%
if (daytime == true)
{
if (percentage < 75)
digitalWrite(7, HIGH);
else if (daytime == false)
{
if (percentage > 75)
digitalWrite(7, LOW);
}
}
You test whether daytime is true then in the associated code block you test whether daytime is false.
I suspect that you meant
if (daytime == true)
{
if (percentage < 75)
{
digitalWrite(7, HIGH);
}
}
else if (daytime == false)
{
if (percentage > 75)
{
digitalWrite(7, LOW);
}
}
Note the use of { and } around dependant code blocks even when they are single lines. This and Auto format in the IDE makes the code logic easier to see
With 2 parameters there are 4 possible combinations. I am not clear what you are trying to do but you may need to test all of them
Please explain in English what you are trying to do
I don't think that is correct either because it could only turn the pump off when it is dark
@charlieashman, have another look at Reply #2. I think you are making things unnecessarily complicated.
Or else you have not described the requirement fully. I have been relying on this from your Original Post " but i want to add a light sensor so it only works in the daytime."
#define SensorPin A0
float sensorValue = 0;
int percentage;
const int Psensor = A1;
int map_low = 400;
int map_high = 210;
int Light;
int daytime;
int wet;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(7, OUTPUT);//watering
pinMode(Psensor, INPUT);
}
void loop() {
{sensorValue = analogRead(SensorPin);
Serial.println(sensorValue);
percentage = map(sensorValue, map_low, map_high, 0, 100);
Serial.print(" | percentage: ");
Serial.print(percentage);
Serial.println("%");}
//analogRead(Light);
Serial.println(Light);
Light = analogRead(Psensor);
//Serial.println(Light);
delay(1000);
{
wet= percentage < 75;
daytime = Light > 100;
digitalWrite(7, HIGH);
if (daytime == false)
digitalWrite(7, LOW);
}
if (wet == false)
digitalWrite(7, LOW);
}
Hi Robin, you're reply was very useful thanks.
i think iv finally got it working
it is now turning on and off as i turn a light on and off, i just need to test that if the soil moisture percentage goes over 75% it will also still turn off.
PS. i know the code is very messy and horrible but its the best i can do, il try to sort it out a bit...
edit, just tested the moisture sensor aswell, its all working as it shoudl. thanks everyone for the help
It still looks messy to me. I would do it like this
wet = percentage < 75;
daytime = Light > 100;
if (dayTime == true) {
if (wet == false) {
digitalWrite(7, HIGH);
}
else {
digitalWrite(7, LOW);
}
}
else { // make sure the pump is off at night, even if it is dry
digitalWrite(7, LOW);
}
Code should be written so you can easily understand it 6 months later
I think it would also be useful to allow for a deadband between wet and dry and between daylight and dark as illustrated like this. Known as hysteresis - it stops the system hunting between the two states. (By the way I may have the numbers wrong, but you should get the idea)
if (percentage < 75) {
wet = false;
}
if (percentage > 85) {
wet = true;
}