Skip to content

Instantly share code, notes, and snippets.

@alanmsmxyz
Created June 30, 2022 13:51
Show Gist options
  • Save alanmsmxyz/2c41b14ce1736ccb41be8e0a400114dc to your computer and use it in GitHub Desktop.
Save alanmsmxyz/2c41b14ce1736ccb41be8e0a400114dc to your computer and use it in GitHub Desktop.
#include "DHT.h"'
#include <ESP8266WiFi.h>
#include "ThingSpeak.h"
// LOOP CONFIG
#define LOOP_DELAY 5000 // equal to 50
// WIFI AUTH
#define WIFI_SSID "[REPLACE]"
#define WIFI_PASSWORD "[REPLACE]"
// THINGSPEAK CONFIG
#define TS_WRITE_API_KEY "[REPLACE]"
#define TS_CHANNEL_NUMBER "[REPLACE]"
#define TS_AIR_TEMPERATURE_FIELD 1
#define TS_AIR_HUMIDITY_FIELD 2
#define TS_SOIL_MOISTURE_FIELD 3
#define TS_PUMP_ON_FIELD 4
#define TS_LAMP_ON_FIELD 5
// SENSOR PIN
#define DHT11_PIN D2
#define SOIL_MOISTURE_PIN A0
// ACTUATOR PIN
#define PUMP_RELAY_PIN D0
#define LAMP_RELAY_PIN D1
// CALIBRATION DATA
#define SOIL_MOISTURE_AIR 6 // equal to 0% humidity
#define SOIL_MOISTURE_WATER 497 // equal to 100% humidity
// SOIL HUMIDITY THRESHOLD (%)
#define MIN_SOIL_MOISTURE 20
#define MAX_SOIL_MOISTURE 60
// AIR TEMPERATURE THRESHOLD (C)
#define MIN_AIR_TEMPERATURE 21
#define MAX_AIR_TEMPERATURE 24
// DHT SENSOR INIT
DHT dht(DHT11_PIN, DHT11);
// WIFI INIT
WiFiClient client;
// ACTUATOR VARIABLE INIT
bool shouldPumpOn;
bool shouldLampOn;
void setup() {
// INIT PIN MODE
pinMode(SOIL_MOISTURE_PIN, INPUT);
pinMode(PUMP_RELAY_PIN, OUTPUT);
pinMode(LAMP_RELAY_PIN, OUTPUT);
// INIT ACTUATOR STATE
// HIGH = OFF | LOW = ON
digitalWrite(PUMP_RELAY_PIN, HIGH);
digitalWrite(LAMP_RELAY_PIN, HIGH);
// INIT DHT11 SENSOR
dht.begin();
// INIT WIFI
WiFi.mode(WIFI_STA);
// INIT THINGSPEAK
ThingSpeak.begin(client);
// INIT SERIAL
Serial.begin(9600);
// INIT ACTUATOR VARIABLES VALUE
shouldPumpOn = false;
shouldLampOn = false;
delay(5000);
}
void loop() {
// VERIFY WIFI CONNECTION
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Conneting WiFi... ");
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
delay(5000);
}
Serial.println("Connected.");
}
// READ SENSOR VALUES
float airHumidity = dht.readHumidity();
float airTemperature = dht.readTemperature();
int soilMoistureValue = analogRead(SOIL_MOISTURE_PIN);
int soilMoisture = map(soilMoistureValue, SOIL_MOISTURE_AIR, SOIL_MOISTURE_WATER, 0, 100);
// DETERMINE ACTUATOR VARIABLES VALUE
if (airTemperature < MIN_AIR_TEMPERATURE) {
shouldLampOn = true;
} else if (airTemperature > MAX_AIR_TEMPERATURE) {
shouldLampOn = false;
}
if (soilMoisture < MIN_SOIL_MOISTURE) {
shouldPumpOn = true;
} else if (soilMoisture > MAX_SOIL_MOISTURE) {
shouldPumpOn = false;
}
// ACTUATE BASED ON ACTUATOR VARIBLES VALUE
// HIGH = OFF | LOW = ON
if (shouldPumpOn) {
digitalWrite(PUMP_RELAY_PIN, LOW);
} else {
digitalWrite(PUMP_RELAY_PIN, HIGH);
}
if (shouldLampOn) {
digitalWrite(LAMP_RELAY_PIN, LOW);
} else {
digitalWrite(LAMP_RELAY_PIN, HIGH);
}
// SEND DATA TO THINGSPEAK
ThingSpeak.setField(TS_AIR_TEMPERATURE_FIELD, airTemperature);
ThingSpeak.setField(TS_AIR_HUMIDITY_FIELD, airHumidity);
ThingSpeak.setField(TS_SOIL_MOISTURE_FIELD, soilMoisture);
ThingSpeak.setField(TS_PUMP_ON_FIELD, shouldPumpOn);
ThingSpeak.setField(TS_LAMP_ON_FIELD, shouldLampOn);
int responseCode = ThingSpeak.writeFields(TS_CHANNEL_NUMBER, TS_WRITE_API_KEY);
// LOG TO SERIAL
Serial.println("---");
Serial.print("Temperature (C): ");
Serial.print(airTemperature);
Serial.print(" | Air Humidity (%): ");
Serial.print(airHumidity);
Serial.print(" | Soil Moisture (%): ");
Serial.println(soilMoisture);
Serial.print("shouldPumpOn: ");
Serial.print(shouldPumpOn);
Serial.print(" | shouldLampOn: ");
Serial.println(shouldLampOn);
if (responseCode == 200) {
Serial.println("SUBMITTED TO THINGSPEAK");
}
Serial.println("---");
// DELAY FOR NEXT LOOP
delay(LOOP_DELAY);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment