Hello, I have a project I'm working on that I got most of the code off another project page, however the code it came with didn't seem to function completely. I tried changing around the autoControlPlantation function but what I tried doesn't seem to fix it even though the logic of my fix seems to make sense to me.
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
WidgetLED PUMP(V0);
#include "DHT.h"
#define DHTPIN 4 // pin DATA with D4
#define SOIL_MOIST_1_PIN A0 // pin A0 with A0
#define PUMP_PIN 1 // PUMP RELAY
#define DHTTYPE DHT11
#define DRY_SOIL 23
#define WET_SOIL 50
#define TIME_PUMP_ON 15
#define READ_SOIL_HUM_TM 10L
#define READ_AIR_DATA_TM 2L
#define SEND_UP_DATA_TM 10L
#define AUTO_CTRL_TM 60L
char auth[] = "";
char ssid[] = "i";
char pass[] = "";
float humDHT = 0;
float tempDHT = 0;
int soilMoist = 0;
boolean pumpStatus = 0;
int timePumpOn = 1;
long sampleTimingSeconds = 20;
long startTiming = 0;
long elapsedTime = 0;
SimpleTimer timer;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
pinMode(PUMP_PIN, OUTPUT);
aplyCmd();
Serial.begin(115200);
dht.begin();
Blynk.begin( auth, ssid , pass );
PUMP.off();
startTimers();
}
void loop() {
timer.run();
Blynk.run();
}
BLYNK_WRITE(3)
{
int i = param.asInt();
if (i == 1)
{
pumpStatus = !pumpStatus;
aplyCmd();
}
}
void getSoilMoist(void)
{
int i = 0;
soilMoist = 0;
for (i = 0; i < 10; i++) //
{
soilMoist += analogRead(SOIL_MOIST_1_PIN);
delay(20);
}
soilMoist = soilMoist / (i);
soilMoist = map(soilMoist, 0, 1023, 0, 100);
}
void getDhtData(void)
{
tempDHT = dht.readTemperature();
humDHT = dht.readHumidity();
if (isnan(humDHT) || isnan(tempDHT))
{
Serial.println("Failed to read from DHT sensor!");
return;
}
}
void aplyCmd()
{
if (pumpStatus == 1)
{
Blynk.notify("pump ON");
PUMP.on();
}
else {
digitalWrite(PUMP_PIN, HIGH);
PUMP.off();
}
}
void autoControlPlantation(void)
{
if (soilMoist < DRY_SOIL) //check soil
{
digitalWrite(PUMP_PIN, HIGH); //turn on pump??
}
else (soilMoist > WET_SOIL); //check soil
{
digitalWrite(PUMP_PIN, LOW); //turn off pump??
}
}
void startTimers(void)
{
timer.setInterval(READ_AIR_DATA_TM * 1000, getDhtData);
timer.setInterval(READ_SOIL_HUM_TM * 1000, getSoilMoist);
timer.setInterval(SEND_UP_DATA_TM * 1000, sendUptime);
timer.setInterval(AUTO_CTRL_TM * 1000, autoControlPlantation);
}
void sendUptime()
{
Blynk.virtualWrite(1, tempDHT);
Blynk.virtualWrite(2, humDHT);
Blynk.virtualWrite(3, soilMoist);
}
Here is the original code from the project to see what I changed
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
WidgetLED PUMP(V0);
#include "DHT.h"
#include <SimpleTimer.h>
#define DHTPIN 4 // pin DATA with D4
#define SOIL_MOIST_1_PIN A0 // pin A0 with A0
#define PUMP_PIN 13 // PUMP RELAY
#define DHTTYPE DHT11
#define DRY_SOIL 68
#define WET_SOIL 90
#define TIME_PUMP_ON 15
#define READ_SOIL_HUM_TM 10L
#define READ_AIR_DATA_TM 2L
#define SEND_UP_DATA_TM 10L
#define AUTO_CTRL_TM 60L
char auth[] = "Blynk token";
char ssid[] = "wifi name";
char pass[] = "wifi password";
float humDHT = 0;
float tempDHT = 0;
int soilMoist = 0;
boolean pumpStatus = 0;
int timePumpOn = 1;
long sampleTimingSeconds = 20;
long startTiming = 0;
long elapsedTime = 0;
SimpleTimer timer;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
pinMode(PUMP_PIN, OUTPUT);
aplyCmd();
Serial.begin(115200);
dht.begin();
Blynk.begin( auth, ssid , pass );
PUMP.off();
startTimers();
}
void loop() {
timer.run();
Blynk.run();
}
BLYNK_WRITE(3)
{
int i = param.asInt();
if (i == 1)
{
pumpStatus = !pumpStatus;
aplyCmd();
}
}
void getSoilMoist(void)
{
int i = 0;
soilMoist = 0;
for (i = 0; i < 10; i++) //
{
soilMoist += analogRead(SOIL_MOIST_1_PIN);
delay(20);
}
soilMoist = soilMoist / (i);
soilMoist = map(soilMoist, 1023, 0, 0, 100);
}
void getDhtData(void)
{
tempDHT = dht.readTemperature();
humDHT = dht.readHumidity();
if (isnan(humDHT) || isnan(tempDHT))
{
Serial.println("Failed to read from DHT sensor!");
return;
}
}
void aplyCmd()
{
if (pumpStatus == 1)
{
Blynk.notify("pump ON");
digitalWrite(PUMP_PIN, LOW);
PUMP.on();
}
else {
digitalWrite(PUMP_PIN, HIGH);
PUMP.off();
}
}
void autoControlPlantation(void)
{
if (soilMoist < DRY_SOIL)
{
turnPumpOn();
}
}
void turnPumpOn()
{
pumpStatus = 1;
aplyCmd();
delay (TIME_PUMP_ON * 1000);
pumpStatus = 0;
aplyCmd();
}
void startTimers(void)
{
timer.setInterval(READ_AIR_DATA_TM * 1000, getDhtData);
timer.setInterval(READ_SOIL_HUM_TM * 1000, getSoilMoist);
timer.setInterval(SEND_UP_DATA_TM * 1000, sendUptime);
timer.setInterval(AUTO_CTRL_TM * 1000, autoControlPlantation);
}
void sendUptime()
{
Blynk.virtualWrite(1, tempDHT);
Blynk.virtualWrite(2, humDHT);
Blynk.virtualWrite(3, soilMoist);
}
the aplyCmd doesn't make sense to me, and I opted to change the autoControlPlantation because the 1 second pump on time didn't make sense to begive with, it made more sense to me to make it turn off and on based on the moisture value.
Any suggestions? Thanks in advance.