Translate

Menampilkan Longitude dan Latitude GPS Neo 6M Ublox ke LCD OLED ARDUINO

Menampilkan Longitude dan Latitude GPS Neo 6M Ublox ke LCD OLED ARDUINO

         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang bisa mendeteksi lokasi menggunakan modul GPS Neo Ublok 6M yang ditampilkan ke lcd OLED berupa latitude dan longitudenya. untuk lebih jelasnya berikut adalah komponen dan programnya.


a. Komponen yang dipakai



b. Program Arduino IDE

 //vcc pada GPS modul adalah 3,3 volt
/*********************
 *10 to GPS Module TX*
 *09 to GPS Module RX*
 *********************/

#include <Wire.h>  // i2C Conection Library
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include "Adafruit_GFX.h"
#include "OakOLED.h"

SoftwareSerial mySerial(10, 11);
TinyGPS gps;

OakOLED oled;

int dataadc;
long lat, lon;
float flat, flon;
unsigned long age, date, time, chars;
int year;
byte month, day, hour, minute, second, hundredths;
unsigned short sentences, failed;

void gpsdump(TinyGPS &gps);
void printFloat(double f, int digits = 2);

void setup()
{
    oled.begin();
    oled.display();
    
   // Oploen serial communications and wait for port to open:
  Serial.begin(9600);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  delay(1000);
  Serial.println("uBlox Neo 6M");
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = ");
  Serial.println(sizeof(TinyGPS));
  Serial.println();
}

void loop() // run over and over
{

  dataadc = analogRead(A0);
 
  bool newdata = false;
  unsigned long start = millis();
  // Every 5 seconds we print an update
  while (millis() - start < 5000)
  {
    if (mySerial.available())
    {
      char c = mySerial.read();
      //Serial.print(c);  // uncomment to see raw GPS data
      if (gps.encode(c))
      {
        newdata = true;
        break;  // uncomment to print new data immediately!
      }
    }
  }
  if (newdata)
  {
    Serial.println("Acquired Data");
    Serial.println("-------------");
    gpsdump(gps);
    Serial.println("-------------");
    Serial.println();
  }
}

void gpsdump(TinyGPS &gps)
{
 
  gps.get_position(&lat, &lon, &age);
  Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
  gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  //oled.clearDisplay();
  oled.setTextSize(1);
  oled.setTextColor(1);
  oled.setCursor(0, 0);
  oled.print("LAT: ");
  oled.println(flat, 5);

  oled.setTextSize(1);
  oled.setTextColor(1);
  oled.setCursor(0, 16);
  oled.print("LONG: ");
  oled.println(flon, 5);

  oled.setTextSize(1);
  oled.setTextColor(1);
  oled.setCursor(0, 32);
  oled.print("HUM: ");
  oled.println(dataadc);
  oled.display();

}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0)
  {
     Serial.print('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
  rounding /= 10.0;
  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    Serial.print(".");

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint;
  }
}



c. VIDEO HASILNYA



 

DETEKSI LAMPU PLN ON/OFF LALU HIDUPKAN RELAY ON/OFF

DETEKSI LAMPU PLN ON/OFF LALU HIDUPKAN RELAY ON/OFF

         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mendeteksi tegangan PLN 220v yang mana jika nanti listrik PLN off maka akan menghidupkan relay, lalu dari relay tersebut dapat dihubungkan ke lampu emergency atau genset. untuk lebih jelasnya berikut adalah koding dan komponenya.

 

a. Komponen yang dipakai


 

b. Program Arduino IDE

#include <PZEM004Tv30.h>
#include <Wire.h>  
#include <LiquidCrystal_I2C.h>  
PZEM004Tv30 pzem(2, 3);
LiquidCrystal_I2C lcd(0x27, 16, 2);

int relay1 = 4;
int voltage;

int tegangan;
int arus;
int daya;
int kwh;

void setup() {
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  pinMode(relay1,OUTPUT);
  digitalWrite(relay1,HIGH); //off
}

void loop() {

  voltage = pzem.voltage();

  lcd.setCursor(0, 0);
  lcd.print("V: ");
  lcd.print(voltage);
  lcd.print("   ");

if(voltage >= 100){
  digitalWrite(relay1,HIGH); //off
}

if(voltage <= 100){
  digitalWrite(relay1,LOW); //on
}


delay(1000);
}

 

 

c. VIDEO HASILNYA


Monitor Suhu Kelembaban ONLINE 2 Node ESP8266 Thingspeak Penampil DMD P10 Arduino

Monitor Suhu Kelembaban ONLINE 2 Node ESP8266 Thingspeak Penampil DMD P10 Arduino

         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor 2 ruangan yang jaraknya berjauhan,  parameter yang dimonitor adalah suhu dan kelembaban ruangan, tampilan angka berada di ruang kontrol yang jaraknya juga berjauhan dengan ruangan yang dimonitor untuk itu project ini menggunakan internet dan server Thingspeak untuk transfer datanya. untuk lebih jelasnya berikut adalah koding dan komponennya.

 

a. Komponen yang dipakai


b. Program Receiver Arduino Uno

#include <Wire.h>
#include <Keypad.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"
#include <DS3231.h>
#include <LiquidCrystal_I2C.h>  
LiquidCrystal_I2C lcd(0x27, 16, 2);

#define WAKTU_TAMPIL_JAM      10    //detik
#define WAKTU_TAMPIL_KALENDAR 5     //detik

//Isi dengan jumlah panel DMD yang di susun dalam kolom dan baris
#define DISPLAY_COLUMN_COUNT  4
#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];
char lineBuff2[20];
 
char customKey;
const byte ROWS = 4;
const byte COLS = 4;

char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {A3,A2,A1,A0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

long batasmaxtemp;
long batasmaxtemp2;
long batasmintemp;
long batasmintemp2;

long batashum;
int suhu1;
int kelembaban1;
int suhu2;
int kelembaban2;

int savesuhu1;
int savekelembaban1;
int savesuhu2;
int savekelembaban2;

String dataIn;
String dt[10];
int i;
boolean parsing=false;
int datain1;
int datain2;
int datain3;
int datain4;
int relay = 10;
int relay2 = 12;
char lineBuffx1[20];
char lineBuffx2[20];
char lineBuffz1[20];
char lineBuffz2[20];

DS3231  rtc(SDA, SCL);
Time  t;

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

void setup(){
 
lcd.begin();
lcd.noCursor();
lcd.clear();
Serial.begin(9600);
dataIn="";

pinMode(relay,OUTPUT);
digitalWrite(relay,HIGH);
pinMode(12,OUTPUT);
digitalWrite(12,HIGH);

dmd.clearScreen( true );   //true is normal (all pixels off), false is negative (all pixels on)

//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 );
//clear/init the DMD pixels held in RAM
dmd.clearScreen( true );
rtc.begin();
//rtc.setDOW(FRIDAY);     // Set Day-of-Week to SUNDAY
//rtc.setTime(15, 17, 0);     // Set the time to 12:00:00 (24hr format)
//rtc.setDate(20, 1, 2022);    
}


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

customKey = customKeypad.getKey();

if(customKey == 'A'){
lcd.clear();
delay(200);
batasmaxtemp = 0;
batasmintemp = 0;
inputbatasmaxsuhu();
inputbatasminsuhu();
}

if(customKey == 'B'){
lcd.clear();
delay(200);
batasmaxtemp2 = 0;
batasmintemp2 = 0;
inputbatasmaxsuhu2();
inputbatasminsuhu2();
}

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

if(parsing){
  parsingData();
}

lcd.setCursor(0,0);
lcd.print("S1:");
lcd.print(savesuhu1);
lcd.print("/");
lcd.print(savekelembaban1);
lcd.print(" ");
lcd.print(batasmintemp);
lcd.print("/");
lcd.print(batasmaxtemp);

lcd.setCursor(0,1);
lcd.print("S2:");
lcd.print(savesuhu2);
lcd.print("/");
lcd.print(savekelembaban2);
lcd.print(" ");
lcd.print(batasmintemp2);
lcd.print("/");
lcd.print(batasmaxtemp2);

sprintf(lineBuff2, "%d:%d ", savesuhu1, savekelembaban1);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);

sprintf(lineBuff, "%d:%d ", savesuhu2, savekelembaban2);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 37,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  

sprintf(lineBuffx1, "%d:%d", t.hour, t.min);
sprintf(lineBuffx2, "%d ", t.sec);

dmd.selectFont(DejaVuSans9);
dmd.selectFont(Mono5x7);
dmd.drawString( 65,  1, lineBuffx1, strlen(lineBuffx1), GRAPHICS_NORMAL);  
dmd.drawString( 75,  8, lineBuffx2, strlen(lineBuffx2), GRAPHICS_NORMAL);

sprintf(lineBuffz1,"RUANG");
sprintf(lineBuffz2,"OBAT");
dmd.selectFont(DejaVuSans9);
dmd.selectFont(Mono5x7);
dmd.drawString( 95,  1, lineBuffz1, strlen(lineBuffz1), GRAPHICS_NORMAL);  
dmd.drawString( 95,  8, lineBuffz2, strlen(lineBuffz2), GRAPHICS_NORMAL);  

 
if((savesuhu1 > batasmaxtemp)&&(batasmaxtemp > 0)){
  digitalWrite(relay,LOW);
}

if((savesuhu1 < batasmintemp)&&(batasmintemp > 0)){
  digitalWrite(relay,LOW);
}

if((savesuhu2 > batasmaxtemp2)&&(batasmaxtemp2 > 0)){
  digitalWrite(relay,LOW);
}

if((savesuhu2 < batasmintemp2)&&(batasmintemp2 > 0)){
  digitalWrite(relay,LOW);
}

if((savesuhu1 > batasmintemp)&&(savesuhu1 < batasmaxtemp)&&(savesuhu2 > batasmintemp2)&&(savesuhu2 < batasmaxtemp2)){
  digitalWrite(relay,HIGH);
}

delay(1000);
//dmd.clearScreen( true );   //true is normal (all pixels off), false is negative (all pixels on)

}


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

/*
//kirim data hasil parsing
Serial.print("data 1 : ");
Serial.print(datain1);
Serial.print("\n");
Serial.print("data 2 : ");
Serial.print(datain2);
Serial.print("\n");
Serial.print("data 3 : ");
Serial.print(datain3);
Serial.print("\n");
Serial.print("data 4 : ");
Serial.print(datain4);
Serial.print("\n");
*/

suhu1 = datain1 / 1;
kelembaban1 = datain2 / 1;
suhu2 = datain3 / 1;
kelembaban2 = datain4 / 1;

if(suhu1 > 0){
  savesuhu1 = suhu1;
}

if(kelembaban1 > 0){
  savekelembaban1 = kelembaban1;
}

if(suhu2 > 0){
  savesuhu2 = suhu2;
}

if(kelembaban2 > 0){
  savekelembaban2 = kelembaban2;
}

 
}



void inputbatasmaxsuhu(){
 
lcd.setCursor(0,0);
lcd.print("MAX Suhu 1:");
        
customKey = customKeypad.getKey();

if(customKey >= '0' && customKey <= '9')
  {
      batasmaxtemp = batasmaxtemp * 10 + (customKey - '0');
      lcd.setCursor(0,1);
      lcd.print(batasmaxtemp);
  }

if(customKey == 'D'){
lcd.clear();
delay(200);  
return;
}

if(customKey == 'C'){
lcd.clear();
delay(200);
batasmaxtemp = 0;
}
 
delay(200);
   
inputbatasmaxsuhu();  
}


void inputbatasminsuhu(){
 
lcd.setCursor(0,0);
lcd.print("MIN Suhu 1:");
        
customKey = customKeypad.getKey();

if(customKey >= '0' && customKey <= '9')
  {
      batasmintemp = batasmintemp * 10 + (customKey - '0');
      lcd.setCursor(0,1);
      lcd.print(batasmintemp);
  }

if(customKey == 'D'){
lcd.clear();
delay(200);  
return;
}

if(customKey == 'C'){
lcd.clear();
delay(200);
batasmintemp = 0;
}

delay(200);
   
inputbatasminsuhu();  
}


void inputbatasmaxsuhu2(){
 
lcd.setCursor(0,0);
lcd.print("MAX Suhu 2:");
        
customKey = customKeypad.getKey();

if(customKey >= '0' && customKey <= '9')
  {
      batasmaxtemp2 = batasmaxtemp2 * 10 + (customKey - '0');
      lcd.setCursor(0,1);
      lcd.print(batasmaxtemp2);
  }

if(customKey == 'D'){
lcd.clear();
delay(200);  
return;
}

if(customKey == 'C'){
lcd.clear();
delay(200);
batasmaxtemp2 = 0;
}
 
delay(200);
   
inputbatasmaxsuhu2();  
}


void inputbatasminsuhu2(){
 
lcd.setCursor(0,0);
lcd.print("MIN Suhu 2:");
        
customKey = customKeypad.getKey();

if(customKey >= '0' && customKey <= '9')
  {
      batasmintemp2 = batasmintemp2 * 10 + (customKey - '0');
      lcd.setCursor(0,1);
      lcd.print(batasmintemp2);
  }

if(customKey == 'D'){
lcd.clear();
delay(200);  
return;
}

if(customKey == 'C'){
lcd.clear();
delay(200);
batasmintemp2 = 0;
}
 
delay(200);
   
inputbatasminsuhu2();  
}
 


c. Program Receiver Nodemcu ESP8266

#include <Wire.h>
#include "ThingSpeak.h"
#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>  
LiquidCrystal_I2C lcd(0x27, 16, 2);

unsigned long channel = 1740399;

String apiKey = "76HGJHE437KJLH98H";     
const char* resource = "/update?api_key=";

const char *ssid =  "wifikujoss";     
const char *pass =  "123456789";
const char* server = "api.thingspeak.com";

int suhu1;
int kelembaban1;
int suhu2;
int kelembaban2;

WiFiClient client;


void setup(){
 
lcd.begin();
lcd.noCursor();
lcd.clear();
Serial.begin(9600);

// Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

while (WiFi.status() != WL_CONNECTED)
     {
            delay(500);
            Serial.print(".");
     }
      Serial.println("");
      Serial.println("WiFi connected");
      delay(100);

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("Netmask: ");
Serial.println(WiFi.subnetMask());
Serial.print("Gateway: ");
Serial.println(WiFi.gatewayIP());
ThingSpeak.begin(client);
}


void loop(){

suhu1 = ThingSpeak.readFloatField(channel, 1);
kelembaban1 = ThingSpeak.readFloatField(channel, 2);
suhu2 = ThingSpeak.readFloatField(channel, 3);
kelembaban2 = ThingSpeak.readFloatField(channel, 4);

Serial.print("*");
Serial.print(suhu1);
Serial.print(",");
Serial.print(kelembaban1);
Serial.print(",");
Serial.print(suhu2);
Serial.print(",");
Serial.print(kelembaban2);
Serial.println("#");

delay(1000);  
}


 

d. Program Transmitter Ruangan 1

#include <Wire.h>
#include "ThingSpeak.h"
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>

#define DHTPIN 0         // PIN D3 (GPIO 0) dari NodeMCU terhubung dengan PIN Data dari DHT22
#define DHTTYPE DHT22     // Kita menggunakan tipe DHT22
DHT dht(DHTPIN, DHTTYPE); // Inisialisasi DHT22

LiquidCrystal_I2C lcd(0x27,16,2);

unsigned long channel = 1233456;

String apiKey = "76HGJHE437KJLH98H";     //  Enter your Write API key from ThingSpeak
const char* resource = "/update?api_key=";

const char *ssid =  "wifikujoss";     // replace with your wifi ssid and wpa2 key
const char *pass =  "123456789";
const char* server = "api.thingspeak.com";

float h;
float t;

WiFiClient client;

void setup(){

Serial.begin(115200);
delay(10);
lcd.begin(); //set lcd i2c
lcd.noCursor(); //biar gak ada cursor di lcd
lcd.clear(); //clear lcd
dht.begin();

       Serial.println("Connecting to ");
       Serial.println(ssid);

// Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

while (WiFi.status() != WL_CONNECTED)
     {
            delay(500);
            Serial.print(".");
     }
      Serial.println("");
      Serial.println("WiFi connected");
      delay(100);

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("Netmask: ");
Serial.println(WiFi.subnetMask());
Serial.print("Gateway: ");
Serial.println(WiFi.gatewayIP());
ThingSpeak.begin(client);
}



void loop(){

  h = dht.readHumidity();
  t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit

lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C   ");
lcd.setCursor(0, 1);
lcd.print("Humi: ");
lcd.print(h);
lcd.print(" %   ");

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }


if (client.connect(server,80))   //   "184.106.153.149" or api.thingspeak.com
{
                            
                             String postStr = apiKey;
                             postStr +="&field1=";
                             postStr += String(t);
                             postStr += "\r\n\r\n";

                             client.print(String("GET ") + resource + apiKey + "&field1=" + t + "&field2=" + h + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n");
                             //client.print(String("GET ") + resource + apiKey + "&field1=" + t + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n");                             
                                        
                             client.print("Host: api.thingspeak.com\n");
                             client.print("Connection: close\n");
                             client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
                             client.print("Content-Type: application/x-www-form-urlencoded\n");
                             client.print("Content-Length: ");
                             client.print(postStr.length());
                             client.print("\n\n");
                             client.print(postStr);
                             
                             Serial.print("Temperature: ");
                             Serial.print(t);
                             Serial.print(" humidity: ");
                             Serial.print(h);
                             Serial.println(". Send to Thingspeak.");
                        }
                        
          client.stop();

          Serial.println("Waiting...");
// thingspeak needs minimum 15 sec delay between updates, i've set it to 30 seconds
  delay(5000);

}



e. Program Transmitter Ruangan 2

#include <Wire.h>
#include "ThingSpeak.h"
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>

#define DHTPIN 0         // PIN D3 (GPIO 0) dari NodeMCU terhubung dengan PIN Data dari DHT22
#define DHTTYPE DHT22     // Kita menggunakan tipe DHT22
DHT dht(DHTPIN, DHTTYPE); // Inisialisasi DHT22

LiquidCrystal_I2C lcd(0x27,16,2);

unsigned long channel = 1233456;

String apiKey = "76HGJHE437KJLH98H";     //  Enter your Write API key from ThingSpeak
const char* resource = "/update?api_key=";

const char *ssid =  "wifikujoss";     // replace with your wifi ssid and wpa2 key
const char *pass =  "123456789";
const char* server = "api.thingspeak.com";

float h;
float t;

WiFiClient client;

void setup(){

Serial.begin(115200);
delay(10);
lcd.begin(); //set lcd i2c
lcd.noCursor(); //biar gak ada cursor di lcd
lcd.clear(); //clear lcd
dht.begin();

       Serial.println("Connecting to ");
       Serial.println(ssid);

// Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

while (WiFi.status() != WL_CONNECTED)
     {
            delay(500);
            Serial.print(".");
     }
      Serial.println("");
      Serial.println("WiFi connected");
      delay(100);

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("Netmask: ");
Serial.println(WiFi.subnetMask());
Serial.print("Gateway: ");
Serial.println(WiFi.gatewayIP());
ThingSpeak.begin(client);
}



void loop(){

  h = dht.readHumidity();
  t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit

lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C   ");
lcd.setCursor(0, 1);
lcd.print("Humi: ");
lcd.print(h);
lcd.print(" %   ");

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }


if (client.connect(server,80))   //   "184.106.153.149" or api.thingspeak.com
{
                            
                             String postStr = apiKey;
                             postStr +="&field3=";
                             postStr += String(t);
                             postStr += "\r\n\r\n";

                             client.print(String("GET ") + resource + apiKey + "&field3=" + t + "&field4=" + h + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n");
                             //client.print(String("GET ") + resource + apiKey + "&field1=" + t + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n");                             
                                        
                             client.print("Host: api.thingspeak.com\n");
                             client.print("Connection: close\n");
                             client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
                             client.print("Content-Type: application/x-www-form-urlencoded\n");
                             client.print("Content-Length: ");
                             client.print(postStr.length());
                             client.print("\n\n");
                             client.print(postStr);
                             
                             Serial.print("Temperature: ");
                             Serial.print(t);
                             Serial.print(" humidity: ");
                             Serial.print(h);
                             Serial.println(". Send to Thingspeak.");
                        }
                        
          client.stop();

          Serial.println("Waiting...");
// thingspeak needs minimum 15 sec delay between updates, i've set it to 30 seconds
  delay(5000);

}


 

f. VIDEO HASILNYA



Alat Monitor Kecepatan Angin (Anemometer) dann Arus DC INA219 Arduino

Alat Monitor Kecepatan Angin  (Anemometer) dann Arus DC INA219 Arduino
 

        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat digunakan untuk memonitor kecepatan angin dan arus dc dengan menggunakan Arduino, sensor yang digunakan yaitu sensor kecepatan angin dan INA219 untuk arus DC.untuk lebih jelasnya berikut adalah program dan komponennya.
 
 
 
a. Komponen yang dipakai


 
 
b. Program arduino IDE

#include <Wire.h>  // i2C Conection Library
#include <LiquidCrystal_I2C.h>  //i2C LCD Library
#include <Adafruit_INA219.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

const int INA_addr = 0x40;
Adafruit_INA219 ina219(INA_addr);

// anemometer parameters
volatile byte rpmcount; // count signals
volatile unsigned long last_micros;
unsigned long timeold;
unsigned long timemeasure = 2.00; // seconds
int timetoSleep = 1;               // minutes
unsigned long sleepTime = 15;      // minutes
unsigned long timeNow;
int countThing = 0;
int GPIO_pulse = 2; // Arduino = D2
float rpm, rps;     // frequencies
float radius = 0.1; // meters - measure of the lenght of each the anemometer wing
float velocity_kmh; // km/h
float velocity_ms;  //m/s
float omega = 0;    // rad/s
float calibration_value = 2.0;
int buzm = 11; //pin buzzer
float arusdc;


void setup() {

Serial.begin(9600);
lcd.begin();
lcd.clear();
lcd.noCursor();
ina219.begin();
pinMode(buzm,OUTPUT);
digitalWrite(buzm,LOW);
pinMode(GPIO_pulse, INPUT_PULLUP);
digitalWrite(GPIO_pulse, LOW);

  detachInterrupt(digitalPinToInterrupt(GPIO_pulse));                         // force to initiate Interrupt on zero
  attachInterrupt(digitalPinToInterrupt(GPIO_pulse), rpm_anemometer, RISING); //Initialize the intterrupt pin
  rpmcount = 0;
  rpm = 0;
  timeold = 0;
  timeNow = 0;
}


void loop()
{
  //Measure RPM
  if ((millis() - timeold) >= timemeasure * 1000)
  {
    //countThing++;
    detachInterrupt(digitalPinToInterrupt(GPIO_pulse)); // Disable interrupt when calculating
    rps = float(rpmcount) / float(timemeasure);         // rotations per second
    rpm = 60 * rps;                                     // rotations per minute
    omega = 2 * PI * rps;                               // rad/s
    velocity_ms = omega * radius * calibration_value;   // m/s
    velocity_kmh = velocity_ms * 3.6;                   // km/h
        
    timeold = millis();
    rpmcount = 0;
    attachInterrupt(digitalPinToInterrupt(GPIO_pulse), rpm_anemometer, RISING); // enable interrupt
  }

arusdc = ina219.getCurrent_mA();
arusdc = arusdc /1000.0;
    
  lcd.setCursor(0, 0);
  lcd.print("Kec=");
  lcd.print(velocity_ms);
  lcd.print(" m/s ");

  lcd.setCursor(0, 1);
  lcd.print("I=");
  lcd.print(arusdc);
  lcd.print(" mA ");
 
delay(200);
}

void rpm_anemometer()
{
  if (long(micros() - last_micros) >= 5000)
  { // time to debounce measures
    rpmcount++;
    last_micros = micros();
  }
}


 
c. VIDEO HASILNYA
 

 
 
 

Monitor Suhu Kelembaban dan Kendali Lampu IOT Thingspeak

Monitor Suhu Kelembaban dan Kendali Lampu IOT Thingspeak
 

         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor suhu dan kelembaban serta bisa mengendalikan lampu atau device lain melalui ONLINE dengan server Thingspeak. untuk lebih jelasnya berikut adalah program dan komponennya.
 
 
a. Komponen
 

 
 
b. Program Arduino IDE
 
#include <Wire.h>
#include "ThingSpeak.h"
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>

#define DHTPIN 0         // PIN D3 (GPIO 0) dari NodeMCU terhubung dengan PIN Data dari DHT22
#define DHTTYPE DHT22     // Kita menggunakan tipe DHT22
DHT dht(DHTPIN, DHTTYPE); // Inisialisasi DHT22

LiquidCrystal_I2C lcd(0x27,16,2);

//change your channel number here
unsigned long channel = 2233667;

String apiKey = "HGKJ67576HJF3HGFJ7H";     //  Enter your Write API key from ThingSpeak
const char* resource = "/update?api_key=";

const char *ssid =  "hotspothpku";     // replace with your wifi ssid and wpa2 key
const char *pass =  "123456789";
const char* server = "api.thingspeak.com";

//2,3 and 4 are channel fields in thingspeak.
unsigned int flampu1 = 3;
unsigned int flampu2 = 4;
unsigned int fpompa1 = 5;
unsigned int fpompa2 = 6;

float h;
float t;
int led_1;
int led_2;
int led_3;
int led_4;

WiFiClient client;

void setup(){

pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(16, OUTPUT);
pinMode(14, OUTPUT);

Serial.begin(115200);
delay(10);
lcd.begin(); //set lcd i2c
lcd.noCursor(); //biar gak ada cursor di lcd
lcd.clear(); //clear lcd
dht.begin();

       Serial.println("Connecting to ");
       Serial.println(ssid);

// Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

while (WiFi.status() != WL_CONNECTED)
     {
            delay(500);
            Serial.print(".");
     }
      Serial.println("");
      Serial.println("WiFi connected");
      delay(100);

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("Netmask: ");
Serial.println(WiFi.subnetMask());
Serial.print("Gateway: ");
Serial.println(WiFi.gatewayIP());
ThingSpeak.begin(client);
}

void loop(){

  h = dht.readHumidity();
  t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit

lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C   ");
lcd.setCursor(0, 1);
lcd.print("Humi: ");
lcd.print(h);
lcd.print(" %   ");

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }


if (client.connect(server,80))   //   "184.106.153.149" or api.thingspeak.com
{
                            
                             String postStr = apiKey;
                             postStr +="&field1=";
                             postStr += String(t);
                             postStr += "\r\n\r\n";

                             client.print(String("GET ") + resource + apiKey + "&field1=" + t + "&field2=" + h + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n");
                             //client.print(String("GET ") + resource + apiKey + "&field1=" + t + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n");                             
                                        
                             client.print("Host: api.thingspeak.com\n");
                             client.print("Connection: close\n");
                             client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
                             client.print("Content-Type: application/x-www-form-urlencoded\n");
                             client.print("Content-Length: ");
                             client.print(postStr.length());
                             client.print("\n\n");
                             client.print(postStr);
                             
                             Serial.print("Temperature: ");
                             Serial.print(t);
                             Serial.print(" humidity: ");
                             Serial.print(h);
                             Serial.println(". Send to Thingspeak.");
                        }
                        
          client.stop();

          Serial.println("Waiting...");
// thingspeak needs minimum 15 sec delay between updates, i've set it to 30 seconds
  delay(5000);

kendali();
delay(5000);
}


void kendali(){

  //get the last data of the fields
  led_1 = ThingSpeak.readFloatField(channel, 3);
  led_2 = ThingSpeak.readFloatField(channel, 4);
  led_3 = ThingSpeak.readFloatField(channel, 5);
  led_4 = ThingSpeak.readFloatField(channel, 6);
 
  if(led_1 == 1){
    digitalWrite(13,HIGH);
    Serial.println("lampu1 is On..!");
  }
  else if(led_1 == 0){
    digitalWrite(13,LOW);
    Serial.println("lampu1 is OFF");
  }

  if(led_2 == 1){
    digitalWrite(12,HIGH);
    Serial.println("lampu2 is On..!");
  }
  else if(led_2 == 0){
    digitalWrite(12,LOW);
    Serial.println("lampu2 is OFF");
  }

  if(led_3 == 1){
    digitalWrite(16,HIGH);
    Serial.println("POMPA1 is On..!");
  }
  else if(led_3 == 0){
    digitalWrite(16,LOW);
    Serial.println("POMPA1 is OFF");
  }

  if(led_4 == 1){
    digitalWrite(14,HIGH);
    Serial.println("POMPA2 is On..!");
  }
  else if(led_4 == 0){
    digitalWrite(14,LOW);
    Serial.println("POMPA2 is OFF");
  }
 
}



c. Tampilan Interface Web

d. Program index.php Website

<html>
<head>
<title>LED ON/OFF</title>
</head>
<body>

<p align="center">
<font size="8">

<b>LAMPU 1 = &nbsp <a href="https://api.thingspeak.com/update?api_key=HGKJ67576HJF3HGFJ7H&field3=1">ON </a></b> /
<b><a href="https://api.thingspeak.com/update?api_key=HGKJ67576HJF3HGFJ7H&field3=0">OFF</a></b>
<br>
<b>LAMPU 2 = &nbsp <a href="https://api.thingspeak.com/update?api_key=HGKJ67576HJF3HGFJ7H&field4=1">ON </a></b> /
<b><a href="https://api.thingspeak.com/update?api_key=HGKJ67576HJF3HGFJ7H&field4=0">OFF</a></b>
<br>
<b>POMPA 1 = &nbsp <a href="https://api.thingspeak.com/update?api_key=HGKJ67576HJF3HGFJ7H&field5=1">ON </a></b> /
<b><a href="https://api.thingspeak.com/update?api_key=HGKJ67576HJF3HGFJ7H&field5=0">OFF</a></b>
<br>
<b>POMPA 2 = &nbsp <a href="https://api.thingspeak.com/update?api_key=HGKJ67576HJF3HGFJ7H&field6=1">ON </a></b> /
<b><a href="https://api.thingspeak.com/update?api_key=HGKJ67576HJF3HGFJ7H&field6=0">OFF</a></b>
<br>

</font>
</p>

</body>
</html>



e. VIDEO HASILNYA
 

 
 

Timer Counter Balapan Mini 4WD RACING TAMIYA

Timer Counter Balapan Mini 4WD RACING


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat menghitung waktu dalam satuan detik dan milidetik, sehingga dapat diaplikasikan ke balapan mobil mini 4WD atau sejenisnya. untuk lebih jelasnya berikut adalah program dan komponennya.


a. Komponen




b. Program Arduino IDE

#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 WAKTU_TAMPIL_JAM      10    //detik
#define WAKTU_TAMPIL_KALENDAR 5     //detik

#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];
char lineBuff2[20];

int lineA;
int lineB;
int lineC;
int mulai;
int seconds;
int cs;
long start_time = 0;
int lapa,lapb,lapc;

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


void setup(void)
{
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
  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(2);
lineB = digitalRead(3);
lineC = digitalRead(4);

if((lineA == 0)&&(lineB == 1)&&(lineC == 1)&&(mulai == 1)){
lapa++;
delay(100);
}

if((lineA == 1)&&(lineB == 0)&&(lineC == 1)&&(mulai == 1)){
lapb++;
delay(100);
}

if((lineA == 1)&&(lineB == 1)&&(lineC == 0)&&(mulai == 1)){
lapc++;
delay(100);
}

if((lineA == 0)&&(lineB == 0)&&(lineC == 1)&&(mulai == 1)){
lapa++;
lapb++;
delay(100);
}

if((lineA == 0)&&(lineB == 1)&&(lineC == 0)&&(mulai == 1)){
lapa++;
lapc++;
delay(100);
}

if((lineA == 1)&&(lineB == 0)&&(lineC == 0)&&(mulai == 1)){
lapb++;
lapc++;
delay(100);
}

if((lineA == 0)&&(lineB == 0)&&(lineC == 0)&&(mulai == 1)){
lapa++;
lapb++;
lapc++;
delay(100);
}

//=============================================
if(lapa > 2){
dmd.clearScreen( true );   
sprintf(lineBuff2, "WIN", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
delay(2000);
dmd.clearScreen( true );  
hasila();  
}

if(lapb > 2){
dmd.clearScreen( true );   
sprintf(lineBuff2, "WIN", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
delay(2000);
dmd.clearScreen( true );  
hasilb();  
}

if(lapc > 2){
dmd.clearScreen( true );   
sprintf(lineBuff2, "WIN", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
delay(2000);
dmd.clearScreen( true );  
hasilc();  
}

//=============================================
lineA = digitalRead(2);

if((lineA == 0)&&(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( 37,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  

sprintf(lineBuff2, "%d/%d/%d ", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
//===========================================================================

}


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

sprintf(lineBuff2, " A", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  

hasila();  
}


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

sprintf(lineBuff2, " B", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  

hasilb();  
}


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

sprintf(lineBuff2, " C", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  

hasilc();  
}




c. VIDEO HASILNYA




Arduino Smart Home

Arduino Smart Home 


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang digunakan untuk mengendalikan beberapa device di peralatan rumah seperti halnya pintu / door lock, kipas, lampu dan lain-lain. alat ini menggunakan beberapa sensor untuk memonitoring kondisi didalam rumah seperti kondisi gas, api, dan yang lainya. untuk lebih jelasnya berikut adalah komponen dan programnya.



a. Komponen



 

b. Program Arduino IDE

#include <Wire.h>
#include <SPI.h>
#include <Keypad.h>
#include <Adafruit_PN532.h>
#include "DHT.h"  //library dht11
#include <LiquidCrystal_I2C.h>  //i2C LCD Library
#include <DS3231.h>
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //library i2c lcd 16x2
LiquidCrystal_I2C lcd2(0x3E, 20, 4); //library i2c lcd 16x2
SoftwareSerial mySerial(10,11); // RX, TX
#define DHTPIN 28     // pin digital untuk dht11
#define DHTTYPE DHT11   // set dht11
#define trigPin 37
#define echoPin 35
DHT dht(DHTPIN, DHTTYPE);  //set dht11
// If using the breakout with SPI, define the pins for SPI communication.
#define PN532_SCK  (2)
#define PN532_MOSI (3)
#define PN532_SS   (4)
#define PN532_MISO (5)
#define IRQ   (2)
#define RESET (3)
Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);
//Adafruit_NFCShield_I2C nfc(IRQ, RESET);
int sw1 = A3;
int sw2 = A5;
int sw3 = A7;
int sw1x;
int sw2x;
int sw3x;
float h;
float t;
long duration, distance;
int mq6,mq3;
int suara;
int api;
int hujan;
int pir;
int ledm = 23;
int ledk = 25;
int ledh = 27;
long first;
int relaykipas1 = 31;
int relaykipas2 = 29;
int buzzer = 16;
char customKey;
const byte ROWS = 4;
const byte COLS = 4;
DS3231  rtc(SDA, SCL);
char keys[ROWS][COLS] = {
{'/', 'C', '-', '+'},
{'=', '9', '6', '3'},
{'0', '8', '5', '2'},
{'*', '7', '4', '1'}
};
byte rowPins[ROWS] = {32,A14,A12,A10}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {A8,A6,A4,A2}; //connect to the column pinouts of the keypad
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup() {  
  pinMode(sw1,INPUT_PULLUP); 
  pinMode(sw2,INPUT_PULLUP); 
  pinMode(sw3,INPUT_PULLUP);        
  Serial.begin(9600);
  //Serial.println("Hello!");
  nfc.begin();
  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    //Serial.print("Didn't find PN53x board");
    while (1); // halt
  }
  // Got ok data, print it out!
  //Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  //Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  //Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
  
  // configure board to read RFID tags
  nfc.SAMConfig();
  
  //Serial.println("Waiting for an ISO14443A Card ...");
        
  //Serial.begin(9600);
  lcd.begin(); //set lcd i2c
  lcd.noCursor(); //biar gak ada cursor di lcd
  lcd.clear(); //clear lcd 
  lcd2.begin(); //set lcd i2c
  lcd2.noCursor(); //biar gak ada cursor di lcd
  lcd2.clear(); //clear lcd 
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(suara, INPUT);
  pinMode(api, INPUT);
  pinMode(hujan, INPUT);
  pinMode(pir, INPUT);
  pinMode(ledm, OUTPUT);
  pinMode(ledk, OUTPUT);
  pinMode(ledh, OUTPUT);
  digitalWrite(ledm,LOW);
  digitalWrite(ledk,HIGH);
  digitalWrite(ledh,LOW);
  pinMode(buzzer, OUTPUT);
  digitalWrite(buzzer,LOW);
  
  pinMode(relaykipas1, OUTPUT);
  pinMode(relaykipas2, OUTPUT);
  digitalWrite(relaykipas1,HIGH);
  digitalWrite(relaykipas2,HIGH);
      
  rtc.begin();
  
  // The following lines can be uncommented to set the date and time
  //rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(10, 22, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(12, 14, 2022);   // Set the date to January 1st, 2014
  mySerial.begin(9600);
  mp3_set_serial(mySerial);  //set softwareSerial for DFPlayer-mini mp3 module
  delay(1);  //wait 1ms for mp3 module to set volume
  mp3_set_volume(30);  //volume 0-30
  inputkartu();
  inputpasswd();
  
}

void loop() {
customKey = customKeypad.getKey();
switch(customKey)
{
 case 'B':
 inputpasswd();
 break;
}
  
suara = digitalRead(18);
api = digitalRead(26);
hujan = digitalRead(24);
pir = digitalRead(30);
 mq6 = analogRead(A0);
 mq3 = analogRead(A1);
 
 h = dht.readHumidity();  //ambil data humidity
 t = dht.readTemperature();  //ambil data suhu c
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
sw1x = digitalRead(sw1);
sw2x = digitalRead(sw2);
sw3x = digitalRead(sw3);
lcd.setCursor(0,0);
lcd.print("LOGIN");
lcd2.setCursor(0,0);
lcd2.print("T/H:");
lcd2.print(t,0);lcd2.print("/");lcd2.print(h,0);lcd2.print(" ");
lcd2.print("S:");
lcd2.print(distance);lcd2.print("  ");
lcd2.setCursor(0,1);
lcd2.print("Q6:");lcd2.print(mq6);lcd2.print(" ");
lcd2.print("Q3:");lcd2.print(mq3);lcd2.print(" ");
lcd2.setCursor(0,2);
lcd2.print("S/A/H/P:");lcd2.print(suara);lcd2.print("/");lcd2.print(api);lcd2.print("/");lcd2.print(hujan);lcd2.print("/");lcd2.print(pir);
lcd2.setCursor(0,3);
lcd2.print(rtc.getTimeStr());
lcd2.print(" ");
lcd2.print(sw1x);
lcd2.print(sw2x);
lcd2.print(sw3x);
Serial.print("*");
Serial.print(t);
Serial.print(",");
Serial.print(h);
Serial.print(",");
Serial.print(distance);
Serial.print(",");
Serial.print(mq6);
Serial.print(",");
Serial.print(mq3);
Serial.print(",");
Serial.print(suara);
Serial.print(",");
Serial.print(api);
Serial.print(",");
Serial.print(hujan);
Serial.print(",");
Serial.print(pir);
Serial.println("#");
delay(1000);
}


void inputpasswd(){
lcd.setCursor(0,0);
lcd.print("INPUT PASSWD");
    
customKey = customKeypad.getKey();
  switch(customKey)
  {
  case '0' ... '9': // This keeps collecting the first value until a operator is pressed "+-*/"
    lcd.setCursor(0,1);
    first = first * 10 + (customKey - '0');
    lcd.print(first);
    break;
  case 'C':
      if(first == 1234){
      lcd.clear();
      lcd.setCursor(0,1);
      lcd.print("BENAR");
      mp3_play(1);  //play music file 0001.mp3
      delay(10000);
      mp3_stop();
      digitalWrite(relaykipas1,LOW);
      digitalWrite(relaykipas2,LOW);
      lcd.clear();
      return;
     }
    first = 0;
    lcd.clear();
    break;
  }
inputpasswd();  
}


void inputkartu(void){
lcd.setCursor(0,0);
lcd.print("DEKATKAN KARTU");
   
 uint8_t success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
  uint8_t uidLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
    
  // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
  // 'uid' will be populated with the UID, and uidLength will indicate
  // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
  
  if (success) {
    lcd.clear();
    // Display some basic information about the card
    //Serial.println("Found an ISO14443A card");
    //Serial.print("  UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
    //Serial.print("  UID Value: ");
    //nfc.PrintHex(uid, uidLength);
    
    if (uidLength == 4)
    {
      // We probably have a Mifare Classic card ... 
      uint32_t cardid = uid[0];
      cardid <<= 8;
      cardid |= uid[1];
      cardid <<= 8;
      cardid |= uid[2];  
      cardid <<= 8;
      cardid |= uid[3]; 
      //Serial.print("Seems to be a Mifare Classic card #");
      //Serial.println(cardid); //3495259931
      lcd.setCursor(0,0);
      lcd.print(cardid);
      delay(2000);
      
      if(cardid == 3495259931){
      lcd.clear();
      lcd.setCursor(0,1);
      lcd.print("BENAR");
      digitalWrite(ledm,LOW);
      digitalWrite(ledk,LOW);
      digitalWrite(ledh,HIGH);
      digitalWrite(buzzer,HIGH);
      delay(100);
      digitalWrite(buzzer,LOW);
      delay(100);
      digitalWrite(buzzer,HIGH);
      delay(100);
      digitalWrite(buzzer,LOW);
      delay(2000);
      lcd.clear();
      return;
      }
      else{
      digitalWrite(ledm,HIGH);
      digitalWrite(ledk,LOW);
      digitalWrite(ledh,LOW); 
      digitalWrite(buzzer,HIGH);
      delay(100);
      digitalWrite(buzzer,LOW);
      delay(100);
      digitalWrite(buzzer,HIGH);
      delay(100);
      digitalWrite(buzzer,LOW);
      delay(100);
      digitalWrite(buzzer,HIGH);
      delay(100);
      digitalWrite(buzzer,LOW);      
      digitalWrite(ledm,LOW);
      digitalWrite(ledk,HIGH);
      digitalWrite(ledh,LOW);
      delay(2000); 
      }
    
    //Serial.println("");
  }
  }
  
inputkartu();  
}



c. Program NodeMCU ESP8266

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

int temp;
int x = 5;
int y;

int value1;
int value2;

int t = 0;
int h = 0;
int distance = 0;
int mq6 = 0;
int mq3 = 0;
int suara = 0;
int api = 0;
int hujan = 0;
int pir = 0;

float datain1;
float datain2;
float datain3;
float datain4;
float datain5;
float datain6;
float datain7;
float datain8;
float datain9;

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

char auth[] = "jkjbgjhgauyfgc6756fghbjhbjhcvghaoih78";
char ssid[] = "wifihpku";
char pass[] = "123456789";

SimpleTimer timer;

void sendSensor()
{
 Blynk.virtualWrite(V1, t);
 Blynk.virtualWrite(V2, h);
 Blynk.virtualWrite(V3, distance);
 Blynk.virtualWrite(V4, mq6);
 Blynk.virtualWrite(V5, mq3);
 Blynk.virtualWrite(V6, suara);
 Blynk.virtualWrite(V7, api);
 Blynk.virtualWrite(V8, hujan);
 Blynk.virtualWrite(V9, pir);
 delay(1000);
}

void setup()
{  
  Serial.begin(9600);
  Blynk.begin(auth, 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();
}

}


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();
datain9 = dt[8].toInt();

//kirim data hasil parsing

Serial.print("data 1 : ");
Serial.print(datain1);
Serial.print("\n");
Serial.print("data 2 : ");
Serial.print(datain2);
Serial.print("\n");
Serial.print("data 3 : ");
Serial.print(datain3);
Serial.print("\n");
Serial.print("data 4 : ");
Serial.print(datain4);
Serial.print("\n");
Serial.print("data 5 : ");
Serial.print(datain5);
Serial.print("\n");
Serial.print("data 6 : ");
Serial.print(datain6);
Serial.print("\n");
Serial.print("data 7 : ");
Serial.print(datain7);
Serial.print("\n");
Serial.print("data 8 : ");
Serial.print(datain8);
Serial.print("\n");
Serial.print("data 9 : ");
Serial.print(datain9);
Serial.print("\n");

//Serial.print("data 3 : ");
//Serial.print(dt[2].toInt());
//Serial.print("\n\n");

t = datain1 / 1;
h = datain2 / 1;
distance = datain3 / 1;
mq6 = datain4 / 1;
mq3 = datain5 / 1;
suara = datain6 / 1;
api = datain7 / 1;
hujan = datain8 / 1;
pir = datain9 / 1;
}



d. VIDEO HASILNYA