0

Iklan Tengah Artikel 1

Home  ›  Arduino  ›  Iot

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
Theme
Share
Additional JS