Program alat penyiram tanaman otomtatis monitoring via ubidots
/* ==================== */
/* TKJ */
/* ==================== */
//WIFI
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include "ADS1X15.h"
#include "UbidotsESPMQTT.h"
ADS1115 ADS(0x48);
//SERVO
#include <Servo.h>
#define ssid "Internetsiswav8"
#define password "28oktober"
#define UBIDOTS_TOKEN "BBFF-atB7UbhDkfe52d7wIH2GlZmFi4j87j"
Ubidots client(UBIDOTS_TOKEN);
//TDS
#define TdsSensorPin A0
#define VREF 5.0 // analog reference voltage(Volt) of the ADC
#define SCOUNT 30 // sum of sample point
int analogBuffer[SCOUNT]; // store the analog value in the array, read from ADC
int analogBufferTemp[SCOUNT];
int analogBufferIndex = 0,copyIndex = 0;
float averageVoltage = 0,tdsValue = 0,temperature = 25;
//SERVO
Servo myservo;
int buka= 90;
int tutup=180;
//RELAY
const int relay1 = D4; //1 selenoid/pompa ke pupuk
const int relay2 = D5; //1 pompa ke tanaman
const int relay3 = D0;//2 pompa ke penampung air
int relayON = HIGH;
int relayOFF = LOW;
//ULTRASONIK
const int trigPin = D7;
const int echoPin = D8;
long duration, jarak;
//TANAH
int adc;
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i=0;i<length;i++) {
Serial.print((char)payload[i]);
}
Serial.println();
if ((char)payload[0]=='1'){
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);
digitalWrite(relay3, HIGH);
}
else if ((char)payload[0]=='0'){
digitalWrite(relay1, LOW);
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
}
}
void setup()
{
Serial.begin(9600);
//MENGHUBUNGKAN KE WIFI
Serial.print("Menghubungkan ke WIFI... ");
client.wifiConnection(ssid, password);
Serial.print(".");
Serial.println("");
Serial.println("WiFi terkoneksi");
Serial.print("Alamat IP : ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.print("/");
client.setDebug(true);
client.begin(callback);
//RELAY
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
digitalWrite(relay1, relayOFF);
digitalWrite(relay2, relayOFF);
digitalWrite(relay3, relayOFF);
//ULTRASONIK
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
//SERVO
myservo.attach(D3);
//tds
pinMode(TdsSensorPin,INPUT);
//ads
ADS.begin();
client.ubidotsSubscribe("tds","relay1");
client.ubidotsSubscribe("relay2","relay2");
client.ubidotsSubscribe("relay3","relay3");
}
void loop(){
if(!client.connected()){
client.reconnect();
}
ADS.setGain(0);
//SENSOR ULTRASONIK
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
jarak = (duration/2)/29.1;//rumus
Serial.print("Ketinggian air: ");
Serial.print(jarak);
Serial.print(" cm");
client.add("ketinggian-air", jarak);
client.ubidotsPublish("ketinggian-air");
if (jarak>30){
//relay hidup
Serial.print("pompa air hidup dari penampung");
digitalWrite(relay3, relayON);
}
else{
Serial.print("pompa air mati dari penampung");
digitalWrite(relay3, relayOFF);
}
delay(1000);
//sensor tanah
int16_t val_0 = ADS.readADC(0);
float f = ADS.toVoltage(1); // voltage factor
Serial.println();
int adc = val_0;
float tegangan = adc * (5.0 / 1023.0);
Serial.print("Kelembapan tanah: ");
Serial.print(adc);
Serial.print(" | ");
Serial.print("tegangan:");
Serial.print(tegangan, 2);
Serial.println("");
client.add("soil-moistture", adc);
client.ubidotsPublish("kelembapan-tanah");
if (adc<1200){
//relay hidup
Serial.print("tanah kering, pompa air hidup");
digitalWrite(relay2, relayON);
}
else{
Serial.print("tanah lembab, pompa mati");
digitalWrite(relay2, relayOFF);
}
//sensor tds
static unsigned long analogSampleTimepoint = millis();
if(millis()-analogSampleTimepoint > 40U)
{
analogSampleTimepoint = millis();
analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin);
analogBufferIndex++;
if(analogBufferIndex == SCOUNT)
analogBufferIndex = 0;
}
static unsigned long printTimepoint = millis();
if(millis()-printTimepoint > 800U)
{
printTimepoint = millis();
for(copyIndex=0;copyIndex<SCOUNT;copyIndex++)
analogBufferTemp[copyIndex]= analogBuffer[copyIndex];
averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF / 1024.0;
float compensationCoefficient=1.0+0.02*(temperature-25.0);
float compensationVolatge=averageVoltage/compensationCoefficient;
tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5;
//Serial.print("voltage:");
//Serial.print(averageVoltage,2);
//Serial.print("V ");
Serial.print("Kadar nutrisi:");
Serial.print(tdsValue,0);
Serial.println("ppm");
client.add("tds", tdsValue);
client.ubidotsPublish("tds-nutrisi");
}
if (tdsValue <1200){
Serial.print("nutrisi kurang, Selenoid nutrisi hidup");
digitalWrite(relay1, relayON);
myservo.write(buka);
myservo.write(tutup);
myservo.write(buka);
myservo.write(tutup);
}
else {
Serial.print("nutrisi cukup, Selenoid nutrisi mati");
digitalWrite(relay1, relayOFF);
}
client.ubidotsSubscribe("tds-nutrisi","relay1");
client.ubidotsSubscribe("relay2","relay2");
client.ubidotsSubscribe("relay3","relay3");
}
int getMedianNum(int bArray[], int iFilterLen)
{
int bTab[iFilterLen];
for (byte i = 0; i<iFilterLen; i++)
bTab[i] = bArray[i];
int i, j, bTemp;
for (j = 0; j < iFilterLen - 1; j++)
{
for (i = 0; i < iFilterLen - j - 1; i++)
{
if (bTab[i] > bTab[i + 1])
{
bTemp = bTab[i];
bTab[i] = bTab[i + 1];
bTab[i + 1] = bTemp;
}
}
}
if ((iFilterLen & 1) > 0)
bTemp = bTab[(iFilterLen - 1) / 2];
else
bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
return bTemp;
delay(1000);
client.loop();
}