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();

}





 

Posting Komentar

Cookie Consent
We serve cookies on this site to analyze traffic, remember your preferences, and optimize your experience.
Oops!
It seems there is something wrong with your internet connection. Please connect to the internet and start browsing again.