Translate

Kendali Pagar Manual / Otomatis Motor Stepper + Sensor PIR IOT Blynk 2.0

Kendali Pagar Manual / Otomatis Motor Stepper + Sensor PIR IOT Blynk 2.0
  

        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang diginakan sebagai kontroller pagar manual atau otomatis via IOT Blynk. jadi alat ini dikendalikan via internet dan tedapat satu sensor pir untuk kendali otomatisnya. untuk lebih jelasnya berikut koding dan video demo alatnya.
 
 
1. Program Arduino IDE
 
#define BLYNK_TEMPLATE_ID "GHJHGtyuytuvb"
#define BLYNK_TEMPLATE_NAME "PAGAR"
#define BLYNK_AUTH_TOKEN "UYUyixmbmhjhgjTGDGFHHGfhgjhgjhddghfc"
#define BLYNK_PRINT Serial

#include <Wire.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

int PUL = 25; //define Pulse pin
int DIR = 26; //define Direction pin
int ENA = 27; //define Enable Pin

int pinValue1, pinValue2, pinValue3, modex, tanda;
int buzzer = 15;
BlynkTimer timer;

char ssid[] = "hotspotwifi";
char pass[] = "1234567890";


BLYNK_WRITE(V0)
{
  pinValue1 = param.asInt();   

  if((pinValue1 == 1)&&(tanda == 0)){
  buka();
  }
  
  if(pinValue1 == 0) {

  }
  
}

BLYNK_WRITE(V1)
{
  pinValue2 = param.asInt();   

  if((pinValue2 == 1)&&(tanda == 1)){
  tutup();
  }
  
  if(pinValue2 == 0) {

  }
  
}


BLYNK_WRITE(V2)
{
  pinValue3 = param.asInt();   

  if(pinValue3 == 1){
  modex = 1; 
  }
  
  if(pinValue3 == 0) {
  modex = 0;
  }
  
}

void kirimdata()
{

}

void setup() {
  lcd.begin();
  lcd.clear();
  pinMode (PUL, OUTPUT);
  pinMode (DIR, OUTPUT);
  pinMode (ENA, OUTPUT);
  pinMode (buzzer, OUTPUT);
    
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  timer.setInterval(1000L, kirimdata);
}

void loop() {
int pir = analogRead(34);

if((pir > 100)&&(modex == 1)&&(tanda == 0)){
  buka();
  delay(5000);
  tutup();
  }
  
  lcd.setCursor(0,0);
  lcd.print("PIR: ");
  lcd.print(pir);
  lcd.print("   ");

Blynk.run();
timer.run();
}

void tutup(){

  lcd.setCursor(0,1);
  lcd.print("TUTUP  ");
  
  for (int i = 0; i < 6400; i++) // Forward 5000 steps
  {
    digitalWrite(DIR, LOW);
    digitalWrite(ENA, HIGH);
    digitalWrite(PUL, HIGH);
    delayMicroseconds(50);
    digitalWrite(PUL, LOW);
    delayMicroseconds(50);
  }  

  tanda = 0;
}

void buka(){

  digitalWrite(buzzer,HIGH);
  delay(1000);
  digitalWrite(buzzer,LOW);
  
  lcd.setCursor(0,1);
  lcd.print("BUKA   ");
    
  for (int i = 0; i < 6400; i++) // Backward 5000 steps
  {
    digitalWrite(DIR, HIGH);
    digitalWrite(ENA, HIGH);
    digitalWrite(PUL, HIGH);
    delayMicroseconds(50);
    digitalWrite(PUL, LOW);
    delayMicroseconds(50);
  }
  
  tanda = 1;
}
 
 
2. Interface Blynk
 

3. VIDEO HASILNYA
 

 

Modifikasi Door Lock Mobil dengan Arduino

Modifikasi Door Lock Mobil dengan Arduino


      Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuat simulasi dengan tujuan untuk modifikasi pintu mobil atau door lock mobil dengan ketentuan yaitu seperti berikut. Door switch = Trigger (-12V) lampu nyala, timer 5 menit mati Apabila trigger (-12V) hilang, tetap hidup selama 10 detik, Unlock = Trigger pulse (+12V), lampu nyala selama 10 detik, Lock = Trigger pulse (+12V), diatas tidak berfungsi, Kontak ON = Trigger (+12V), timer batal semua.


1. Program Arduino

#include <DS3231.h>
DS3231  rtc(SDA, SCL);
Time  t;

int doorswitch = 2;
int unlock = 3;
int lock = 4;
int kontakon = 5;
int relaylampu = 6;

int doorswitchx;
int unlockx;
int lockx;
int kontakonx;
int tanda = 0;
int kunci;

void setup() {
 Serial.begin(9600); 
 rtc.begin();  
 rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAY
 rtc.setTime(0, 0, 0);     // Set the time to 12:00:00 (24hr format)
 rtc.setDate(1, 1, 2014);   // Set the date to January 1st, 2014

 pinMode(relaylampu,OUTPUT);
}

void loop() {
t = rtc.getTime();

doorswitchx = digitalRead(doorswitch);
unlockx = digitalRead(unlock);
lockx = digitalRead(lock);
kontakonx = digitalRead(kontakon);

if(kontakonx == 1){
kunci = 1;
rtc.setTime(0, 0, 0);
digitalWrite(relaylampu,HIGH); //lampu off
}

if(lockx == 1){
kunci = 1;
}

if(lockx == 0){
kunci = 0;
}

if((unlockx == 1)&&(lockx == 0)){
  digitalWrite(relaylampu,LOW); //lampu on
  delay(10000); //10 detik
  digitalWrite(relaylampu,HIGH); //lampu off
}


if((doorswitchx == 0)&&(tanda == 0)&&(lockx == 0)){
  digitalWrite(relaylampu,HIGH); //lampu off
  rtc.setTime(0, 0, 0);
}

if((doorswitchx == 0)&&(tanda == 1)&&(lockx == 0)){
  digitalWrite(relaylampu,LOW); //lampu on
  delay(10000); //10 detik
  digitalWrite(relaylampu,HIGH); //lampu off
  rtc.setTime(0, 0, 0);
  tanda = 0;
}

if((doorswitchx == 1)&&(tanda == 0)&&(t.min < 5)&&(lockx == 0)){
  digitalWrite(relaylampu,LOW); //lampu on
  t = rtc.getTime();
  tanda = 1;
}

if((doorswitchx == 1)&&(t.min >= 5)&&(lockx == 0)){
  digitalWrite(relaylampu,HIGH); //lampu off
  t = rtc.getTime();
  tanda = 1;
}

  Serial.print(t.hour, DEC);
  Serial.print("/");
  Serial.print(t.min, DEC);
  Serial.print("/");
  Serial.println(t.sec, DEC);  

}


2. VIDEO HASILNYA




Monitor Gula Darah Non Invasive

Monitor Gula Darah Non Invasive
 

          Pada kesempatan kali ini saya akan menjelaskan bagaimana cara membuat sebuah alat yang dapat memonitor gula darah secara non invasive dengan menggunakan Arduino dan tampilan LCD 16x2 I2c, alat ini menggunakan sensor photodioda dan led merah. untuk lebih jelasnya berikut adalah programnya.
 
 
1. Program Arduino IDE
 
#include "Wire.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

int bt = 5;
int btx;
int adcsensor;
float fix;
int datafix;
int cacah;
float kalibrasi;

void setup() {

  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  Serial.begin(9600);
  pinMode(bt,INPUT_PULLUP);
 
}

void loop(){

 lcd.setCursor(0,0);
 lcd.print("TEKAN MULAI");
 lcd.setCursor(0,1);
 lcd.print("mg/dl= ");
 lcd.print(fix);
 lcd.print("      ");

 btx = digitalRead(bt);

 if(btx == 0){
 lcd.clear();
 delay(1000);
 cacah = 0;
 datafix = 0;
 fix = 0;
 proses();
 }

delay(1000);
}

void proses(){
 
adcsensor = analogRead(A0);

 lcd.setCursor(0,0);
 lcd.print("ADC= ");
 lcd.print(adcsensor);
 lcd.print("      ");

 cacah++;

datafix = adcsensor + datafix;

delay(100);

if(cacah > 20){
  fix = datafix / 20.0;
  //kalibrasi = (fix - 1022.1) / 0.0967;
  return;
}

proses();
}    
 
 
 
2. VIDEO HASILNYA
 

 

Alat Pakan Ikan Otomatis dan Monitor PH Turbidity dan Suhu IOT Blynk

Alat Pakan Ikan Otomatis dan Monitor PH Turbidity dan Suhu IOT Blynk
 

        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonito PH Turbidity (Kekeruhan Air) dan suhu serta ada fitur on off pelontar pakan secara otomatis sesuai waktu yang disetting. untuk lebih jelasnya berikut adalah kodingnya.
 
 
1. Program Arduino IDE
 
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
#include <EEPROM.h>
#define ONE_WIRE_BUS 12  
#include <Servo.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 2); // RX pin 2, TX pin 3

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

LiquidCrystal_I2C lcd(0x27,20,4);
DS3231  rtc(SDA, SCL);
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;

int addr1 = 0;
int addr2 = 1;
int addr3 = 2;
int addr4 = 3;
int addr5 = 4;

Time  t;
int jampagi,jamsiang,jamsore;
float TempC;
float pHValue;
int tds;
int adctds;
int adcPH;
int TempCx;
int pHValuex;
int ntux;
float ntufix;
long duration1, distance1;
long duration2, distance2;  
int btset = 7;
int btup = 4;
int btdown = 11;
int btok = 8;
int btsetx;
int btupx;
int btdownx;
int btokx;
float batasamo;
float batasph;
float amoniak;
int relayaerator = A6;
int tanda = 0;
int kolam;
int tinggipakan;

#define TdsSensorPin A1
#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;
int copyIndex = 0;

float averageVoltage = 0;
float tdsValue = 0;
float temperature = 16;       // current temperature for compensation

// median filtering algorithm
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;
}



void setup(){  
  
jampagi = EEPROM.read(addr1);
jamsiang = EEPROM.read(addr2);
jamsore = EEPROM.read(addr3);
batasamo = EEPROM.read(addr4);
batasph = EEPROM.read(addr5);

pinMode(relayaerator,OUTPUT);
digitalWrite(relayaerator,LOW);

pinMode(btset,INPUT_PULLUP);
pinMode(btup,INPUT_PULLUP);
pinMode(btdown,INPUT_PULLUP);
pinMode(btok,INPUT_PULLUP);
pinMode(TdsSensorPin,INPUT);

Wire.begin();  
sensors.begin();
mySerial.begin(9600);
lcd.begin();  
lcd.clear(); 

rtc.begin();
//rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAmy
//rtc.setTime(16, 47, 0);     // Set the time to 12:00:00 (24hr format)
//rtc.setDate(1, 1, 2014);   // Set the date to January 1st, 2014

myservo1.attach(5);
myservo2.attach(6);
myservo3.attach(9);
myservo4.attach(10);

myservo1.write(100);
myservo2.write(100);
myservo3.write(100);
myservo4.write(100);
}

void loop(){

btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

if(btsetx == 0){
delay(1000);
lcd.clear();
setjampagi();
setjamsiang();
setjamsore();
setbatasamo();
setbatasph();
}
  
 t = rtc.getTime();
    
 adcPH = analogRead(A0); //menggunakan pin A0 untuk membaca output sensor pH
 pHValue = (adcPH - 1093.4) / -30.897;

 ambildatatds();
 
 pHValuex = pHValue * 100.0;
 
  sensors.requestTemperatures();
  TempC = sensors.getTempCByIndex(0); // Celcius
  TempCx =  TempC * 100.0;

if(pHValue < 6.5){
  amoniak = (pHValue / TempC) * 0.202; 
}

if(pHValue == 7.0){
  amoniak = (pHValue / TempC) * 1.131; 
}

if(pHValue > 7.0){
  amoniak = (pHValue / TempC) * 3.306; 
}

if(amoniak > batasamo){
  digitalWrite(relayaerator,HIGH);
  }

if(amoniak <= batasamo){
  digitalWrite(relayaerator,LOW);
  }

if((t.hour == jampagi)&&(jampagi > 0)&&(tanda == 0)){
  myservo1.write(150);
  myservo2.write(150);
  myservo3.write(150);
  myservo4.write(150);
  delay(5000);
  myservo1.write(100);
  myservo2.write(100);
  myservo3.write(100);
  myservo4.write(100);
  tanda = 1;
}

if((t.hour == jamsiang)&&(jamsiang > 0)&&(tanda == 1)){
  myservo1.write(150);
  myservo2.write(150);
  myservo3.write(150);
  myservo4.write(150);
  delay(5000);
  myservo1.write(100);
  myservo2.write(100);
  myservo3.write(100);
  myservo4.write(100);
  tanda = 2;
}

if((t.hour == jamsore)&&(jamsore > 0)&&(tanda == 2)){
  myservo1.write(150);
  myservo2.write(150);
  myservo3.write(150);
  myservo4.write(150);
  delay(5000);
  myservo1.write(100);
  myservo2.write(100);
  myservo3.write(100);
  myservo4.write(100);
  tanda = 0;
}

  lcd.setCursor(0,0);
  lcd.print("TDS:");
  lcd.print(tdsValue);
  lcd.print(" ");
 
  lcd.print("PH:");
  lcd.print(pHValue);
  lcd.print(" ");

  lcd.setCursor(0,1);
  lcd.print("T:");
  lcd.print(TempC,1);
  lcd.print("c ");
  
  lcd.print(batasamo,1);
  lcd.print("/");
  lcd.print(batasph,1);
  lcd.print("");

  lcd.setCursor(0,2);
  lcd.print(t.hour, DEC);
  lcd.print(":");
  lcd.print(t.min, DEC);
  lcd.print(":");
  lcd.print(t.sec, DEC);
  lcd.print("  ");
  lcd.print(jampagi);
  lcd.print("/");
  lcd.print(jamsiang);
  lcd.print("/");
  lcd.print(jamsore);
  lcd.print("");

  lcd.setCursor(0,3);
  lcd.print("Mg/l:");
  lcd.print(amoniak);
  lcd.print("");

  mySerial.print("*");
  mySerial.print(pHValue * 100.0);
  mySerial.print(",");
  mySerial.print(tdsValue);
  mySerial.print(",");
  mySerial.print(amoniak * 100.0);
  mySerial.print(",");
  mySerial.print(TempC * 100.0);
  mySerial.println("#");
  
  delay(1000);
}


void ambildatatds(){
  static unsigned long analogSampleTimepoint = millis();
  if(millis()-analogSampleTimepoint > 40U){     //every 40 milliseconds,read the analog value from the ADC
    analogSampleTimepoint = millis();
    analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin);    //read the analog value and store into the buffer
    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];
      
      // read the analog value more stable by the median filtering algorithm, and convert to voltage value
      averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF / 1024.0;
      
      //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0)); 
      float compensationCoefficient = 1.0+0.02*(temperature-25.0);
      //temperature compensation
      float compensationVoltage=averageVoltage/compensationCoefficient;
      
      //convert voltage value to tds value
      tdsValue=(133.42*compensationVoltage*compensationVoltage*compensationVoltage - 255.86*compensationVoltage*compensationVoltage + 857.39*compensationVoltage)*0.5;
      
      //Serial.print("voltage:");
      //Serial.print(averageVoltage,2);
      //Serial.print("V   ");
      //Serial.print("TDS Value:");
      //Serial.print(tdsValue,0);
      //Serial.println("ppm");
    }
  }  
}

void setjampagi(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("Waktu Pakan Pagi");
  lcd.setCursor(0,1);
  lcd.print("Jam: ");
  lcd.print(jampagi);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  jampagi++; 
}

if(btdownx == 0){
  delay(200);
  jampagi--; 
}

if(jampagi > 23){
jampagi = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr1, jampagi);
  return; 
}

setjampagi();  
}

void setjamsiang(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("Waktu Pakan Siang  ");
  lcd.setCursor(0,1);
  lcd.print("Jam: ");
  lcd.print(jamsiang);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  jamsiang++; 
}

if(btdownx == 0){
  delay(200);
  jamsiang--; 
}

if(jamsiang > 23){
jamsiang = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr2, jamsiang);
  return; 
}

setjamsiang();  
}

void setjamsore(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("Waktu Pakan Sore  ");
  lcd.setCursor(0,1);
  lcd.print("Jam: ");
  lcd.print(jamsore);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  jamsore++; 
}

if(btdownx == 0){
  delay(200);
  jamsore--; 
}

if(jamsore > 23){
jamsore = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr3, jamsore);
  return; 
}

setjamsore();  
}

void setbatasamo(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("BATAS AMONIAK  ");
  lcd.setCursor(0,1);
  lcd.print("mg/l: ");
  lcd.print(batasamo);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  batasamo = batasamo + 0.1; 
}

if(btdownx == 0){
  delay(200);
  batasamo = batasamo - 0.1; 
}

if(batasamo > 100.0){
batasamo = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr4, batasamo);
  return; 
}

setbatasamo();  
}

void setbatasph(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("BATAS PH  ");
  lcd.setCursor(0,1);
  lcd.print("PH: ");
  lcd.print(batasph);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  batasph = batasph + 0.1; 
}

if(btdownx == 0){
  delay(200);
  batasph = batasph - 0.1; 
}

if(batasph > 100.0){
batasph = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr5, batasph);
  return; 
}

setbatasph();  
 
 
 
2. Program ESP8266
 
#define BLYNK_TEMPLATE_ID "QWEDSCmjjhhjk"
#define BLYNK_TEMPLATE_NAME "Pakan Ikan"
#define BLYNK_AUTH_TOKEN "yUDKJHBVCNMJHJJHKUGTJYGgh"
#define BLYNK_PRINT Serial  

#define  BLYNK_PRINT Serial  
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

int temp;
int x = 5;
int y;

int value1;
int value2;
int value3;
int value4;

float ph;
int tds;
float amoniak;
float suhu;

int datain1;
int datain2;
int datain3;
int datain4;

String dataIn;
String dt[10];
int i;
boolean parsing = false;
BlynkTimer timer;

char ssid[] = "hotspotwifiku";
char pass[] = "123456789";


void sendSensor()
{
 Blynk.virtualWrite(V0, ph);
 Blynk.virtualWrite(V1, tds);
 Blynk.virtualWrite(V2, amoniak);
 Blynk.virtualWrite(V3, suhu);
 delay(1000);
}

void setup(){  
Serial.begin(9600);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(1000L, sendSensor);
}

void loop() {
        
while(Serial.available()>0) {
//   dataIn="";
    char inChar = (char)Serial.read();
    dataIn += inChar;
    if (inChar == '\n') {
    parsing = true;
  }
}

if(parsing){
    parsingData();

  Blynk.run();
  timer.run();
  delay(200);

}
 
delay(100);
}

void parsingData(){
int j=0;

//kirim data yang telah diterima sebelumnya
//Serial.print("data masuk : ");
//Serial.print(dataIn);
//Serial.print("\n");

//inisialisasi variabel, (reset isi variabel)
dt[j]="";
//proses parsing data
for(i=1;i<dataIn.length();i++){
//pengecekan tiap karakter dengan karakter (#) dan (,)
if ((dataIn[i] == '#') || (dataIn[i] == ','))
{
//increment variabel j, digunakan untuk merubah index array penampung
j++;
dt[j]="";       //inisialisasi variabel array dt[j]
}
else
{
//proses tampung data saat pengecekan karakter selesai.
dt[j] = dt[j] + dataIn[i];
}
}

 datain1 = dt[0].toInt();
 datain2 = dt[1].toInt();
 datain3 = dt[2].toInt();
 datain4 = dt[3].toInt();

 ph = datain1 / 100.0;
 tds = datain2 / 1;
 amoniak = datain3 / 100.0;
 suhu = datain4 / 100.0;
 
 
 
3. VIDEO HASILNYA
 

  

Alat Penyiraman Kebun / Tanaman Otomatis 4 Waktu dan Monitor Soil Moisture IOT Blynk

Alat Penyiraman Kebun / Tanaman Otomatis  4 Waktu dan Monitor Soil Moisture IOT Blynk
 

         Pada kesempatan kali ini saya akan menjelaskan mengenai sebuah alat yang dapat mengendalikan on off pompa sesuai dengan settingan waktu, jadi ketika waktu sudah sesuai dengan waktu yang di set maka akan menghidupkan pompa melalui SSR yang dipasang. untuk lebih jelasnya berikut adalah kodingnya.  
 
 
1. Skema
 
 
 
2. Program Arduino IDE
 
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
#include <EEPROM.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2); // RX pin 2, TX pin 3

LiquidCrystal_I2C lcd(0x27,16,2);
DS3231  rtc(SDA, SCL);

int addr1 = 0;
int addr2 = 1;
int addr3 = 2;
int addr4 = 3;
int addr5 = 4;

Time  t;
int jampagi,jamsiang,jamsore,jammalam;
int soil, adcsoil; 
int btset = 6;
int btup = 4;
int btdown = 7;
int btok = 5;
int btsetx;
int btupx;
int btdownx;
int btokx;
int relayout = 8;
int tanda;

void setup(){  
  
jampagi = EEPROM.read(addr1);
jamsiang = EEPROM.read(addr2);
jamsore = EEPROM.read(addr3);
jammalam = EEPROM.read(addr4);

pinMode(relayout,OUTPUT);
digitalWrite(relayout,LOW);

pinMode(btset,INPUT_PULLUP);
pinMode(btup,INPUT_PULLUP);
pinMode(btdown,INPUT_PULLUP);
pinMode(btok,INPUT_PULLUP);

mySerial.begin(9600);
lcd.begin();  
lcd.clear(); 

rtc.begin();
//rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAmy
//rtc.setTime(17, 35, 0);     // Set the time to 12:00:00 (24hr format)
//rtc.setDate(1, 1, 2014);   // Set the date to January 1st, 2014

}

void loop(){

btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

if(btsetx == 0){
delay(1000);
lcd.clear();
setjampagi();
setjamsiang();
setjamsore();
setjammalam();
}
  
 t = rtc.getTime();

 adcsoil = analogRead(A0);             
 soil = map(adcsoil, 0, 1023, 100, 0);
 
if((t.hour == jampagi)&&(jampagi > 0)&&(tanda == 0)){
  digitalWrite(relayout,HIGH);
  delay(60000);
  delay(60000);
  delay(60000);
  delay(60000);
  delay(60000);
  digitalWrite(relayout,LOW);
  tanda = 1;
}

if((t.hour == jamsiang)&&(jamsiang > 0)&&(tanda == 1)){
  digitalWrite(relayout,HIGH);
  delay(60000);
  delay(60000);
  delay(60000);
  delay(60000);
  delay(60000);
  digitalWrite(relayout,LOW);
  tanda = 2;
}

if((t.hour == jamsore)&&(jamsore > 0)&&(tanda == 2)){
  digitalWrite(relayout,HIGH);
  delay(60000);
  delay(60000);
  delay(60000);
  delay(60000);
  delay(60000);
  digitalWrite(relayout,LOW);
  tanda = 3;
}

if((t.hour == jammalam)&&(jammalam > 0)&&(tanda == 3)){
  digitalWrite(relayout,HIGH);
  delay(60000);
  delay(60000);
  delay(60000);
  delay(60000);
  delay(60000);
  digitalWrite(relayout,LOW);
  tanda = 0;
}

  lcd.setCursor(0,0);
  lcd.print("S: ");
  lcd.print(soil);
  lcd.print(" %  ");
  lcd.print(jampagi);
  lcd.print("/");
  lcd.print(jamsiang);
  lcd.print(" ");

  lcd.setCursor(0,1);
  lcd.print(t.hour, DEC);
  lcd.print(":");
  lcd.print(t.min, DEC);
  lcd.print(":");
  lcd.print(t.sec, DEC);
  lcd.print(" ");

  lcd.print(jamsore);
  lcd.print("/");
  lcd.print(jammalam);
  lcd.print("  ");
  
  mySerial.println(soil);  
  delay(1000);
}

void setjampagi(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("Waktu Pakan Pagi");
  lcd.setCursor(0,1);
  lcd.print("Jam: ");
  lcd.print(jampagi);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  jampagi++; 
}

if(btdownx == 0){
  delay(200);
  jampagi--; 
}

if(jampagi > 23){
jampagi = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr1, jampagi);
  return; 
}

setjampagi();  
}

void setjamsiang(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("Waktu Pakan Siang  ");
  lcd.setCursor(0,1);
  lcd.print("Jam: ");
  lcd.print(jamsiang);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  jamsiang++; 
}

if(btdownx == 0){
  delay(200);
  jamsiang--; 
}

if(jamsiang > 23){
jamsiang = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr2, jamsiang);
  return; 
}

setjamsiang();  
}

void setjamsore(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("Waktu Pakan Sore  ");
  lcd.setCursor(0,1);
  lcd.print("Jam: ");
  lcd.print(jamsore);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  jamsore++; 
}

if(btdownx == 0){
  delay(200);
  jamsore--; 
}

if(jamsore > 23){
jamsore = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr3, jamsore);
  return; 
}

setjamsore();  
}

void setjammalam(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("Waktu Pakan Malam  ");
  lcd.setCursor(0,1);
  lcd.print("Jam: ");
  lcd.print(jammalam);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  jammalam = jammalam + 1; 
}

if(btdownx == 0){
  delay(200);
  jammalam = jammalam - 1; 
}

if(jammalam > 23){
jammalam = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr4, jammalam);
  return; 
}

setjammalam();  
 
 
 
3. Program ESP8266
 
 #define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "FGHGTTytyuccgJJ"
#define BLYNK_TEMPLATE_NAME "Garden"
#define BLYNK_AUTH_TOKEN "jkjhKJHkJHKJKHETWUIIUYiuyiuyiuytsffc"

#include <SPI.h>
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

BlynkTimer timer;

char ssid[] = "hotspotwifi";
char pass[] = "12345678";

int soil;

void kirimdata()
{
  Blynk.virtualWrite(V0,soil);
}


void setup() {
  Serial.begin(9600);  
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  timer.setInterval(1000L, kirimdata);

}


void loop() {

  if (Serial.available() > 0) {
    soil = Serial.parseInt();
    //Serial.print("Received integer: ");
    //Serial.println(soil);
  }
   
Blynk.run();
timer.run(); // Initiates BlynkTimer

delay(100);
}
 
 
 
4. VIDEO HASILNYA
 

 

Timer Lomba Wireless RF Link 433 Mhz Interface DMD P10

Timer Lomba Wireless RF Link 433 Mhz Interface DMD P10


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara untuk membuat sebuah timer lomba dengan start stop jarak jauh menggunakan modul RF Link 433 Mhz. alat ini menggunakan interface modul dmd p10 dengan sensor jarak sebagai sensornya. untuk lebih jelasnya berikut adalah koding skemanya.


1. Skema


2. Program Transmitter

// RF 433MHz Modules (Transmitter Circuit)

#include <RH_ASK.h>
// Serial Peripheral Interface (SPI)
#include <SPI.h>               // Needed to compile

RH_ASK driver;


// digital pin 2 has a pushbutton attached to it. Give it a name:
int pushButton = 11;

// the setup routine runs once when you press reset:
void setup() {
  Serial.begin (9600);         // Debugging ONLY
  if (!driver.init ())
    Serial.println ("init failed");
  pinMode(pushButton, INPUT_PULLUP);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input pin:
  int buttonState = digitalRead(pushButton);

    if(buttonState == 0){
    const char *msg = "111";
    driver.send((uint8_t *)msg, strlen(msg));
    driver.waitPacketSent();
    }

    if(buttonState == 1){
    const char *msg = "222";
    driver.send((uint8_t *)msg, strlen(msg));
    driver.waitPacketSent();
    }
    
    delay(100);
}


3. Program Receiver RF LINK

#include "Wire.h"
#include <RH_ASK.h>
#include <SPI.h> // Not actualy used but needed to compile

RH_ASK driver;

int relay = 8;

String a;

void setup() {
  Serial.begin(9600);
  pinMode(relay, OUTPUT);

 if (!driver.init())
         Serial.println("init failed");
 
}

void loop() {

 uint8_t buf[12];
    uint8_t buflen = sizeof(buf);
    if (driver.recv(buf, &buflen)) // Non-blocking
    {
      int i;
      // Message with a good checksum received, dump it.
     int nilai = atoi((char*)buf);
     Serial.println(nilai);

     if(nilai == 111){
      digitalWrite(relay,HIGH);
      }

     if(nilai == 222){
      digitalWrite(relay,LOW);
      }
         
    }

  delay(100);


}



4. Program Receiver DMD P10

#include <Wire.h>
#include <SPI.h>        //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise)
#include <DMD.h>        //Library DMD yang menyediakan fungsi penampilan teks, gambar dsb
#include <TimerOne.h>   //Library peripheral Timer1 untuk menjalankan prosedur pindai panel DMD
#include <Time.h>     //Library waktu yang menyediakan tipe data, struktur, dan obyek waktu
#include "Arial_black_16.h"
#include "Arial_Black_16_ISO_8859_1.h"
#include "Arial14.h"
#include "DejaVuSans9.h"
#include "Droid_Sans_12.h"
#include "Droid_Sans_16.h"
#include "DejaVuSansItalic9.h"
#include "Mono5x7.h"
#include "SystemFont5x7.h"

#define DISPLAY_COLUMN_COUNT  2
#define DISPLAY_ROW_COUNT     1

#define PIXELS_PER_COLUMN  32
#define PIXELS_PER_ROW    16

DMD dmd(DISPLAY_COLUMN_COUNT, DISPLAY_ROW_COUNT);
unsigned char show = 0;

char lineBuff[20];
int tombol = 2;
int tombolx;
int lineA;
int lineB;
int lineC;
int mulai;
int seconds;
int cs;
int secondsa;
int csa;
int secondsb;
int csb;
int secondsc;
int csc;
int kecepatan;
int jarak = 5;
long start_time = 0;
int lapa,lapb,lapc;
int finisha = 0;

void ScanDMD()
{
  dmd.scanDisplayBySPI();
}

void setup(void)
{  
pinMode(5,INPUT_PULLUP);
pinMode(tombol,INPUT_PULLUP);

  dmd.clearScreen( true );   //true is normal (all pixels off), false is negative (all pixels on)
  Serial.begin(9600);
   //initialize TimerOne's interrupt/CPU usage used to scan and refresh the display
  Timer1.initialize( 1000 );           //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker.
  Timer1.attachInterrupt( ScanDMD );   //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI()
  //clear/init the DMD pixels held in RAM
  dmd.clearScreen( true );
}

void loop(void)
{

//============================================
lineA = digitalRead(5);
Serial.println(lineA);
if(lineA == 1){
secondsa = seconds;
csa = cs;
finisha = 1;
dmd.clearScreen( true );
hasil();
dmd.clearScreen( true );
hasil2();
}

//=============================================
tombolx = digitalRead(tombol);

if((tombolx == 1)&&(mulai == 0)){
  delay(200);
  mulai = 1;
  start_time = millis();  
}  

if(mulai == 1){
seconds = (millis() - start_time) / 1000;
cs = ((millis() - start_time) / 10) % 100;;
}

//===========================================================================  
sprintf(lineBuff, "%d:%d ", seconds, cs);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 35,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  
//===========================================================================

delay(1);
}

void hasil(){

sprintf(lineBuff, "%d:%d  ", secondsa, csa);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 35,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  
delay(5000);
}


void hasil2(){
kecepatan = jarak / secondsa;
sprintf(lineBuff, "%d  ", kecepatan);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 35,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  

hasil2();
}



5. VIDEO HASILNYA





Stirer Kendali Jarak Jauh Online Blynk 2.0



        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yaitu Stirer Kendali Jarak Jauh Online Blynk yang mana fungsinya yaitu untuk mencampurkan cairan dan juga mengaduk secara otomatis dengan timer. alat ini diinput menggunakan aplikasi Blynk 2.0 secara online jarak jauh sehingga memuahkan penggunaan. untuk lebih jelasnya berikut adalah koding dan skemanya.  


1. Komponen



2. Program Arduino Uno

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DS3231.h>

LiquidCrystal_I2C lcd(0x27,20,4);

DS3231  rtc(SDA, SCL);

// Init a Time-data structure
Time  t;

#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void(* resetFunc) (void) = 0;

int temp;
int x = 5;
int y;
int tanda;

float TempC;
int ssr = 7;
int motor1 = 5;
int motor2 = 6;

int waktu;
int value1;
int value2;
int value3;
int value4;
int value5;
int value6;
int value7;

int pompa1 = 2;
int pompa2 = 3;
int pompa3 = 9;
int pompa4 = 10;
int pompa;
int motor;
int suhu;
int jam;
int menit;
int detik;
int tombol;
int sampling;

int datain1;
int datain2;
int datain3;
int datain4;
int datain5;
int datain6;
int datain7;
int datain8;

String dataIn;
String dt[10];
int i;
boolean parsing = false;

void setup()
{
 
  dataIn="";
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  delay(10);
  
  Wire.begin();
  sensors.begin();
  rtc.begin();
  pinMode(ssr,OUTPUT);
  pinMode(pompa1,OUTPUT);
  pinMode(pompa2,OUTPUT); 
  pinMode(pompa3,OUTPUT);
  pinMode(pompa4,OUTPUT);   
  pinMode(motor1,OUTPUT);
  pinMode(motor2,OUTPUT); 
  digitalWrite(motor1,LOW);
  digitalWrite(motor2,LOW); 
  // The following lines can be uncommented to set the date and time
  //rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAY
  rtc.setTime(0, 0, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(1, 1, 2014); 

}

void loop()
{

while(Serial.available()>0) {
//   dataIn="";
    char inChar = (char)Serial.read();
    dataIn += inChar;
    if (inChar == '\n') {
    parsing = true;
  }
}

if(parsing){
       
  lcd.setCursor(0,0);
  lcd.print("pompa:");
  lcd.print(pompa);
  lcd.print(" ml/s  ");
  lcd.setCursor(0,1);
  lcd.print("motor:");
  lcd.print(motor);
  lcd.print(" rpm   ");
  lcd.setCursor(0,2);
  lcd.print("suhu:");
  lcd.print(suhu);
  lcd.print(" c  ");
  lcd.setCursor(0,3);
  lcd.print("waktu:");
  lcd.print(jam);
  lcd.print(":");
  lcd.print(menit);
  lcd.print(":");
  lcd.print(detik);
  lcd.print("   ");
  lcd.setCursor(18,0);
  lcd.print(sampling);
  lcd.print(" ");

 delay(1000);

if(tombol == 1){
  datain7 = 0;
  delay(1000);
  lcd.clear();
  setsuhu();
  rtc.setTime(0, 0, 0);
  mulai();
  selesai();
}
 
parsingData();
  
 }
}

void parsingData(){
int j=0;

//kirim data yang telah diterima sebelumnya
//Serial.print("data masuk : ");
//Serial.print(dataIn);
//Serial.print("\n");

//inisialisasi variabel, (reset isi variabel)
dt[j]="";
//proses parsing data
for(i=1;i<dataIn.length();i++){
//pengecekan tiap karakter dengan karakter (#) dan (,)
if ((dataIn[i] == '#') || (dataIn[i] == ','))
{
//increment variabel j, digunakan untuk merubah index array penampung
j++;
dt[j]="";       //inisialisasi variabel array dt[j]
}
else
{
//proses tampung data saat pengecekan karakter selesai.
dt[j] = dt[j] + dataIn[i];
}
}

 datain1 = dt[0].toInt();
 datain2 = dt[1].toInt();
 datain3 = dt[2].toInt();
 datain4 = dt[3].toInt();
 datain5 = dt[4].toInt();
 datain6 = dt[5].toInt();
 datain7 = dt[6].toInt();
 datain8 = dt[7].toInt();
 
 pompa = datain1 / 1;
 motor = datain2 / 1;
 suhu = datain3 / 1;
 jam = datain4 / 1;
 menit = datain5 / 1;
 detik = datain6 / 1;
 sampling = datain7 / 1;
 tombol = datain8 / 1;
 
}

void mulai(){

analogWrite(motor1,motor);
analogWrite(motor2,motor);
  
t = rtc.getTime();
sensors.requestTemperatures();
TempC = sensors.getTempCByIndex(0); // Celcius

  lcd.setCursor(0,0);
  lcd.print("pompa:");
  lcd.print(pompa);
  lcd.print(" ml/s  ");
  lcd.setCursor(0,1);
  lcd.print("motor:");
  lcd.print(motor);
  lcd.print(" Rpm   ");
  lcd.setCursor(0,2);
  lcd.print("suhu:");
  lcd.print(TempC);
  lcd.print(" / ");
  lcd.print(suhu);
  lcd.print(" c  ");
  lcd.setCursor(0,3);
  lcd.print("waktu:");
  lcd.print(t.hour, DEC);
  lcd.print(":");
  lcd.print(t.min, DEC);
  lcd.print(":");
  lcd.print(t.sec, DEC);
  lcd.print("   ");

if((t.hour == jam)&&(t.min == menit)&&(t.sec == detik)){
lcd.clear();
delay(3000);
return;  
}

if(t.sec == 59){ 
waktu++;
delay(1000);  
}

if(waktu == sampling){ 
digitalWrite(pompa1,HIGH);
digitalWrite(pompa2,HIGH); 
delay(pompa); 
digitalWrite(pompa1,LOW);
digitalWrite(pompa2,LOW); 
delay(pompa);  
digitalWrite(pompa3,HIGH);
digitalWrite(pompa4,HIGH); 
delay(pompa); 
digitalWrite(pompa3,LOW);
digitalWrite(pompa4,LOW);
delay(1000);   
waktu = 0;  
}
  
if(TempC >= suhu){
  digitalWrite(ssr,LOW);
}

if(TempC < suhu){
  digitalWrite(ssr,HIGH);
}

mulai();  
}

void selesai(){
lcd.setCursor(0,0);
lcd.print("selesai");  
datain7 = 0;
tanda = 0;
digitalWrite(motor1,LOW);
digitalWrite(motor2,LOW);
delay(5000);
resetFunc();
}

void setsuhu(){
sensors.requestTemperatures();
TempC = sensors.getTempCByIndex(0); // Celcius
  
  lcd.setCursor(0,0);
  lcd.print("suhu:");
  lcd.print(TempC);
  lcd.print(" / ");
  lcd.print(suhu);
  lcd.print(" c  ");

digitalWrite(ssr,HIGH);

if(TempC >= suhu){
  delay(1000);
  lcd.clear();
  return;  
}

setsuhu();  
}



3. Program ESP8266

#define BLYNK_TEMPLATE_ID "RTYHVHKFCDhjk"
#define BLYNK_TEMPLATE_NAME "stirer projek"
#define BLYNK_AUTH_TOKEN "HGGVHGCHFGDKJHKJGJVGCGcfhgvghchgh"

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

char ssid[] = "hotspothpku";       
char pass[] = "123456789";

int pompa;
int motor;
int suhu;
int jam;
int menit;
int detik;
int tombol;
int sampling;
int x = 0;

// function to assign value to variable Slider_Value
BLYNK_WRITE(V0)   
{
  pompa = param.asInt(); // assigning incoming value from pin V0 to a variable 
}

BLYNK_WRITE(V1)
{
  motor = param.asInt(); // assigning incoming value from pin V0 to a variable
}

BLYNK_WRITE(V2)
{
  suhu = param.asInt(); // assigning incoming value from pin V0 to a variable 
}

BLYNK_WRITE(V3)
{
  jam = param.asInt(); // assigning incoming value from pin V0 to a variable 
}

BLYNK_WRITE(V4)
{
  menit = param.asInt(); // assigning incoming value from pin V0 to a variable 
}

BLYNK_WRITE(V5)
{
  detik = param.asInt(); // assigning incoming value from pin V0 to a variable 
}

BLYNK_WRITE(V6)
{
  sampling = param.asInt(); // assigning incoming value from pin V0 to a variable 
}

BLYNK_WRITE(V7)
{
  tombol = param.asInt(); // assigning incoming value from pin V0 to a variable 
}

void setup()
{   
  Serial.begin(9600);
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
}

void loop()
{             
  Serial.print("*");
  Serial.print(pompa);
  Serial.print(",");
  Serial.print(motor);
  Serial.print(",");
  Serial.print(suhu);
  Serial.print(",");
  Serial.print(jam);
  Serial.print(",");
  Serial.print(menit);
  Serial.print(",");
  Serial.print(detik);
  Serial.print(",");
  Serial.print(sampling);
  Serial.print(",");
  Serial.print(tombol);
  Serial.println("#");   
  
  Blynk.run();

delay(200);  
}



4. VIDEO HASILNYA