Tutorial, Pendidikan, Media Pembelajaran, Ilmu Pengetahuan.

  • How to controller Car With TV remote

    Membuat Mobil Remote Control dengan Remote TV dengan mikrokontroller atmega 328 dan H bridge L293D

  • DIY CNC Machine with DVD room

    Kalau anda dirumah punya rongsokan DVD bekas, anda dapat membuat mini mesin CNC dengan mekanik DVD bekas tersebut.

  • How to controller Car With TV remote

    Membuat Mobil Remote Control dengan Remote TV dengan mikrokontroller atmega 328 dan H bridge L293D

  • DIY PCB Remote Control 4 Channel

    Gambar PCB Remote control 4 channel dengan relay 5 v/5pin,Kontrol peralatan elektronik dengan remote control sangat membantu kita dalam melakukan aktifitas, kita tinggal menekan remote untuk menyalakan dan mematikan alat listrik. Disini saya menggunakan software Arduino IDE, dimana Board Arduino saya adalah Board Arduino UNO R3

  • Timer terprogram esp 8266

    Digunakan untuk menyalakan alat listrik secara otomatis, setting via wifi esp 8266

Thursday, October 24, 2024

Belajar IoT-006- Monitoring Water level dengan Ultrasonic dan protokol MQTT


Postingan kali ini, kita akan membuat water level monitoring, dengan menggunakan Ultrasonic sensor.

dimana nanti hasil pembacaan berupa : Volume air, ketinggian air dan prosentase pengisian, yang ditampilkan di browser seperti ini.

untuk alat dan bahannya :

1. sensor ultrasonic SR-04


2. esp 8266 

3. kabel usb

4. kabel jumper


Rangkaialah rangkaian dengan skema berikut ini :

Kemudian buatlah dashboard atau tampilan website, dengan file html berikut, yang dibuka di browser.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>WATER LEVEL MONITORING</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <!-- Label "Terhubung" -->
  <div class="status">
    <h4> status server</h4>
    <p id="status">Terputus</p>
  </div>

  <div class="status">
    <h2> Monitoring tandon air</h2>

  <div class="container">
    <div class="card">    
    <p class="data"   >Volume air : <b  id="volumeAir">?</b></p>
    </div>
 
  <div class="container">
    <div class="card">  
    <p class="data">Ketinggian Air  <b id="tinggiAir">?</b></p>
   </div>

   <div class="container">
    <div class="card">  
    <p class="data">
      Prosentase isi  <b id="prosentaseAir">?</b></p>
   </div>


     <!-- tampilan air -->
     <div class="tangki">    
     <div class="air" id="tandon" style="width: 100%;  color: black; ">

  </div>




 <!-- script tandon -->
  <style type="text/css">
    .tangki {
      border-style:solid ;
      width:300px ;
      height:200px;
      left:45%;
      transform: translate(-50%);
      position:sticky ;
      border-bottom-left-radius:40px ;
      border-bottom-right-radius:40px ;
    }
    .air{    
      left:50%;
      bottom:0px ;
      transform: translate(-50%);
      position:absolute ;
      border-bottom-left-radius:40px ;
      border-bottom-right-radius:40px ;
      background-color:#87CEFA ;
 
    }
  </style>


 <!-- Label "KONEKSI DENGAN MQTT" -->
<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
    <script>
        const clientId = Math.random().toString(16).substr(2, 8);
        const host = 'wss://broker.emqx.io:8084/mqtt';

        const options = {
          keepalive: 30,
          clientId: clientId,
          protocolId: 'MQTT',
          protocolVersion: 4,
          clean: true,
          reconnectPeriod: 1000,
          connectTimeout: 30 * 1000
        }

        console.log("Menghubungkan ke Broker");
        const client = mqtt.connect(host, options);

        client.on('connect', () => {
          console.log('Terhubung ke broker:' + clientId)
          client.subscribe('rokhmad.com/#', { qos: 1 })
          document.getElementById("status").innerHTML = "Terhubung";
          document.getElementById("status").style.color= "green";
          document.getElementById("tandon").style.backgroundColor= "green";
         
        })
        client.on('message', (topic, message, packet) => {        
          if(topic === "rokhmad.com/tandon"){
          document.getElementById("tandon").style.height= message+"%";
         
          }
          if(topic === "rokhmad.com/liter"){
            document.getElementById("volumeAir").innerHTML= message+" liter";
          }
          if(topic === "rokhmad.com/tinggiAir"){
            document.getElementById("tinggiAir").innerHTML= message+" cm";
          }
          if(topic === "rokhmad.com/prosentaseAir"){
            document.getElementById("prosentaseAir").innerHTML= message+" %";
          }
        })

           
    </script>
</html>




Tampilan file HTML diatas adalah seperti berikut :


Kemudian masukan sketch ke esp 8266 lolin. dengan sketch berikut ini, modiflah topic sesuai dengan kebutuhan kamu ya, 


#include <ESP8266WiFi.h>

#include <PubSubClient.h>

#define LED 13 // GPIO13 (D7) for LED


#define triggerPin 12 //d6

#define echoPin 14//d5

long durasi;


int tandon, tinggi = 0;


bool ledState = false;

// WiFi settings

const char *ssid = "Rohmad.com";             // Replace with your WiFi name

const char *password = "1122334455";    // Replace with your WiFi password

// MQTT Broker settings

const char *mqtt_broker = "broker.emqx.io";  // EMQX broker endpoint

const char *mqtt_topic = "rokhmad.com/#";     // MQTT topic

const char *mqtt_username = "emqx";  // MQTT username for authentication

const char *mqtt_password = "public";  // MQTT password for authentication

const int mqtt_port = 1883;  // MQTT port (TCP)

WiFiClient espClient;

PubSubClient mqtt_client(espClient);

void connectToWiFi();

void connectToMQTTBroker();

void mqttCallback(char *topic, byte *payload, unsigned int length);

void setup() {

  Serial.begin(115200);

  pinMode (echoPin, INPUT);

  pinMode (triggerPin, OUTPUT);

  connectToWiFi();

  mqtt_client.setServer(mqtt_broker, mqtt_port);

  mqtt_client.setCallback(mqttCallback);

  pinMode(LED, OUTPUT);

  connectToMQTTBroker();

}

void connectToWiFi() {

  WiFi.begin(ssid, password);

  Serial.print("Connecting to WiFi");

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  Serial.println("\nConnected to the WiFi network");

}

void connectToMQTTBroker() {

  while (!mqtt_client.connected()) {

    String client_id = "esp8266-client-" + String(WiFi.macAddress());

    Serial.printf("Connecting to MQTT Broker as %s.....\n", client_id.c_str());

    if (mqtt_client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {

      Serial.println("Connected to MQTT broker");

      mqtt_client.subscribe(mqtt_topic);

      // Publish message upon successful connection

    } else {

      Serial.print("Failed to connect to MQTT broker, rc=");

      Serial.print(mqtt_client.state());

      Serial.println(" try again in 5 seconds");

      delay(5000);

    }

  }

}

void mqttCallback(char *topic, byte *payload, unsigned int length) {

  Serial.print("Message received on topic: ");

  Serial.println(topic);

  Serial.print("Message:");

  String message;

  for (int i = 0; i < length; i++) {

    message += (char) payload[i];  // Convert *byte to string

  }

  // Control the LED based on the message received

  if (message == "on" && !ledState) {

    digitalWrite(LED, HIGH);  // Turn on the LED

    ledState = true;

    Serial.println("LED is turned on");

  }

  if (message == "off" && ledState) {

    digitalWrite(LED, LOW); // Turn off the LED

    ledState = false;

    Serial.println("LED is turned off");

  }


  Serial.println(message);

  Serial.println();

  Serial.println("-----------------------");

}

void loop() {

  if (!mqtt_client.connected()) {

    connectToMQTTBroker();

  }


  digitalWrite (triggerPin, LOW);

  delayMicroseconds(2);

  digitalWrite (triggerPin, HIGH);

  delayMicroseconds(10);

  digitalWrite (triggerPin, LOW);

  durasi = pulseIn(echoPin, HIGH);

  tinggi = durasi * 0.034 / 2;

  delay(1000);

  ///////////////


  float tinggi_max_tangki = 40; //tinggi tangki dlm cm

  float jari2 = 1; //jari2 dalam meter

  float phi = 3.14; //volume

  float tinggi_air = tinggi_max_tangki - tinggi;

  float prosentase_tinggi_air = (tinggi_air / tinggi_max_tangki) * 100; //hasil persen

  float volume = phi * (jari2 * jari2) * (tinggi_air / 100);

  float liter = volume * 1000;

  //////////////////


  ///////////////




  if (tandon != tinggi) {

    mqtt_client.subscribe("rokhmad.com/tandon");

    mqtt_client.publish("rokhmad.com/tandon", String (prosentase_tinggi_air).c_str());

    mqtt_client.subscribe("rokhmad.com/liter");

    mqtt_client.publish("rokhmad.com/liter", String (liter).c_str());

    mqtt_client.subscribe("rokhmad.com/tinggiAir");

    mqtt_client.publish("rokhmad.com/tinggiAir", String (tinggi_air).c_str());

        mqtt_client.subscribe("rokhmad.com/prosentaseAir");

    mqtt_client.publish("rokhmad.com/prosentaseAir", String (prosentase_tinggi_air).c_str());

    Serial.println("mqtt uplod");

    Serial.print("tinggi air; ");

    Serial.println(tinggi_air);

    Serial.print("tinggi max air : ");

    Serial.println(tinggi_max_tangki);

    Serial.print("prosentasetinggi air: ");

    Serial.println(prosentase_tinggi_air);

    Serial.print("volume air :");

    Serial.println(volume);

    Serial.print("Liter air: ");

    Serial.println(liter);

    Serial.print("tinggi ultra sonic: ");

    Serial.println(tinggi);

    tinggi = tandon;

  }

  mqtt_client.loop();

}






Hasil akhirnya adalah, kita dapat memantau level air secara realtime dengan browser seperti gambar diatas.



Share:

Tuesday, October 22, 2024

Belajar IoT-005- edit teks LCD 16x2 IoT via browser dengan protokol MQTT

 Pada proyek Iot Kali ini, kita akan membuat projet dengan menggunakan LCD 16x2 yang tulisannya bisa dirubah via Browser, dan bisa diganti tulisannya secara jarak jauh. Dengan membuat ini, kita bisa membuat Pager (heheh.... yang kelahiran 80an pasti kenal apa itu Pager).dengan esp 8266+LCD 16x32.

langkah pertama rangkaian LCD 16x2 dengan esp 8266 seperti gambar berikut.


Kemudian buatlah file html, yang berfungsi sebagai dashboard, untuk mengirim teks ke LCD 16x2

berikut kode HTML nya :

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Data Sensor</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <!-- Label "Terhubung" -->
  <div class="status">
    <p id="status">Terputus</p>
  </div>

      <!-- Card baru untuk mengirim teks ke LCD -->
       <p>======</p>
     
    <div class="card">
      <h2>Kirim Teks ke LCD</h2>
      <input type="text" id="lcd-text" placeholder="Masukkan teks"/>
      <button id="send-btn" onclick="sendLCD()">Kirim</button>
    </div>
  </div>

</body>

<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
    <script>
        const clientId = Math.random().toString(16).substr(2, 8);
        const host = 'wss://broker.emqx.io:8084/mqtt';

        const options = {
          keepalive: 30,
          clientId: clientId,
          protocolId: 'MQTT',
          protocolVersion: 4,
          clean: true,
          reconnectPeriod: 1000,
          connectTimeout: 30 * 1000
        }

        console.log("Menghubungkan ke Broker");
        const client = mqtt.connect(host, options);

        client.on('connect', () => {
          console.log('Terhubung ke broker:' + clientId)
          client.subscribe('rokhmad.com/#', { qos: 1 })
          document.getElementById("status").innerHTML = "Terhubung";
        })

        client.on('message', (topic, message, packet) => {
       
          if(topic === "rokhmad.com/lcd"){
            document.getElementById("lcd-text").value = message;
          }        
           
        })

       
        function sendLCD(){
          var valueLCD = document.getElementById("lcd-text").value;
          client.publish("rokhmad.com/lcd", valueLCD, {qos: 1, retain: true});
        }
    </script>
</html>


kemudian kode HTML tersebut jika dijalankan di browser maka hasilnya sebagai berikut :



Ketika kita klik tombol kirim, jika kita cek di aplikasi MQTTX maka akan tampil sebagai berikut (BELUM TAHU APA ITU MQTT ?? KUNJUNGI Postingan saya disini : https://www.rokhmad.com/2024/10/belajar-iot-001-mengenal-komunikasi.html)

MQTT dengan topic : rokhmad.com/lcd
pesan yang dikirim : mardiyatun makan


kemudian pesan yang masuk di MQTT, akan dipanggil oleh esp8266 dengan menggunakan sketch :


#include <ESP8266WiFi.h>
#include <PubSubClient.h>

//////////////////
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
//atau 0x3F
// WiFi settings
const char *ssid = "R.MEETING";             // Replace with your WiFi name
const char *password = "smktwosra123";    // Replace with your WiFi password

// MQTT Broker settings
const char *mqtt_broker = "broker.emqx.io";  // EMQX broker endpoint
const char *mqtt_topic = "rokhmad.com/#";     // MQTT topic
const char *mqtt_username = "emqx";  // MQTT username for authentication
const char *mqtt_password = "public";  // MQTT password for authentication
const int mqtt_port = 1883;  // MQTT port (TCP)

WiFiClient espClient;
PubSubClient mqtt_client(espClient);
void connectToWiFi();
void connectToMQTTBroker();
void mqttCallback(char *topic, byte *payload, unsigned int length);

void setup() {
  lcd.init();
  // Turn on the blacklight and print a message.
  lcd.backlight();
  Serial.begin(115200);
  connectToWiFi();
  mqtt_client.setServer(mqtt_broker, mqtt_port);
  mqtt_client.setCallback(mqttCallback);
  connectToMQTTBroker();
}

void connectToWiFi() {
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nConnected to the WiFi network");
}

void connectToMQTTBroker() {
  while (!mqtt_client.connected()) {
    String client_id = "esp8266-client-" + String(WiFi.macAddress());
    Serial.printf("Connecting to MQTT Broker as %s.....\n", client_id.c_str());
    if (mqtt_client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
      Serial.println("Connected to MQTT broker");
      mqtt_client.subscribe(mqtt_topic);
      // Publish message upon successful connection
    } else {
      Serial.print("Failed to connect to MQTT broker, rc=");
      Serial.print(mqtt_client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

void mqttCallback(char *topic, byte *payload, unsigned int length) {
  Serial.print("Message received on topic: ");
  Serial.println(topic);
  Serial.print("Message:");
  String message;
  for (int i = 0; i < length; i++) {
    message += (char) payload[i];  // Convert *byte to string
  }
 if (String (topic) == "rokhmad.com/lcd") {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("---twosra IoT---");
    lcd.setCursor(0, 1);
    lcd.print(message);
  }
  Serial.println(message);
  Serial.println();
  Serial.println("-----------------------");
}
void loop() {
  if (!mqtt_client.connected()) {
    connectToMQTTBroker();
  }
  mqtt_client.loop();
}


Akhirnya dan hasilnya seperti berikut ini :







Share:

Aksi Nyata "Menyebarkan Pemahaman Tentang Merdeka Belajar"

Merdeka belajar merupakan upaya untuk memerdekakan manusis untuk berfikir dan berekspresi.

Program medeka belajar bertujuan untuk memerdekakan guru dan siswa, yang sejalan dengan semangat dari Ki Hajar Dewantara yaitu memerdekakan manusis, khususnya dalam hal pendidikan, yuk simak ulasannya !

































Share:

Saturday, October 19, 2024

belajar IoT- 004- Mengendalikan Servo Jarak Jauh, dengan Protokol Mqtt

Artikel belajar IoT kali ini, kita akan belajar mengendalikan Servo Jarak Jauh, dengan memanfaatkan Protokol MQTT. apa itu protokol MQTT ?? baca saya dulu disini !

Langkah pertama kamu rangkai servo dan esp 8266 dengan skema seperti ini.


kemudian siapkan dashboard file html, untuk mengendalikan servo jarak jauh. dashboard ini fungsinya untuk mengirimkan pesan melalui mqtt dengan topic tertentu.
disini topic yang kita gunakan adalah : rokhmad.com/servo



File html sebagai dashboard,  
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Data Sensor</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <!-- Label "Terhubung" -->
  <div class="status">
    <p id="status">Terputus</p>
  </div>
    
  <!-- Card baru untuk mengirim teks ke servo -->
  <br></br>
  <h1>KENDALI SERVO</h1> 
    <br></br>
      <div class="card">
      <div class="slidecontainer">
   
      <h2>Putar Servo</h2> 
      <input type="range" min="0" max="180" value="demo"  id="myRange"  onchange=sendServo()>
      <p>sudut : <span id="demo"></span></p>
 </div>
 </div>
</body>
 <!-- koneksi ke mqtt  -->
<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
    <script>
        const clientId = Math.random().toString(16).substr(2, 8);
        const host = 'wss://broker.emqx.io:8084/mqtt';

        const options = {
          keepalive: 30,
          clientId: clientId,
          protocolId: 'MQTT',
          protocolVersion: 4,
          clean: true,
          reconnectPeriod: 1000,
          connectTimeout: 30 * 1000
        }

        console.log("Menghubungkan ke Broker");
        const client = mqtt.connect(host, options);

        client.on('connect', () => {
          console.log('Terhubung ke broker:' + clientId)
          client.subscribe('rokhmad.com/#', { qos: 1 })
          document.getElementById("status").innerHTML = "Terhubung";
     
        })
<!-- baca topic dari mqtt -->
        client.on('message', (topic, message, packet) => {
              
          if(topic === "rokhmad.com/servo"){
            document.getElementById("myRange").value = message;  
            document.getElementById("demo").innerHTML = message;                             
            var demo = document.querySelector('.sliderr');    
            }      
            })
      
        function sendServo(){
          var sliderr = document.getElementById("myRange");
        var output = document.getElementById("demo");
        output.innerHTML = myRange.value;     
        sliderr.oninput = function() {
        output.innerHTML = this.value;
          sendServo()
        }
          var sliderr = document.getElementById("myRange").value;
          client.publish("rokhmad.com/servo", sliderr, {qos: 1, retain: true});
         sliderr.addEventListener("input",function(e)
            {
            demo=sliderr.value;
            });
        }
       
    </script>
</html>



ketika dibuka di browser chrome hasilnya seperti ini :
Ketika slider kita geser, maka akan mengirim topic : rokhmad.com/servo/(disini sudut servo) dikirimkan. digambar diatas posisi slider di 23, maka dkn terkirim topik : rokhmad.com/servo/ dengan pesan 23.


Pesan yang masuk di broker MQTT ini, (disini saya menggunakan broker.emqx.io)  kemudian akan dipanggil oleh esp 8266, dan kemudian diguanakan untuk menggerakkan servo, sesuai dengan sudut yang dikirimkan.

berikut sketchnya: 

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Servo.h>
////
Servo myservo;
int posLama;
int posBaru;
//////////////////
// WiFi settings
const char *ssid = "Rohmad.com";             // Replace with your WiFi name
const char *password = "1122334455";    // Replace with your WiFi password
// MQTT Broker settings
const char *mqtt_broker = "broker.emqx.io";  // EMQX broker endpoint
const char *mqtt_topic = "rokhmad.com/#";     // MQTT topic
const char *mqtt_topic5 = "rokhmad.com/servo";     // MQTT topic
const char *mqtt_username = "emqx";  // MQTT username for authentication
const char *mqtt_password = "public";  // MQTT password for authentication
const int mqtt_port = 1883;  // MQTT port (TCP)

WiFiClient espClient;
PubSubClient mqtt_client(espClient);
void connectToWiFi();
void connectToMQTTBroker();
void mqttCallback(char *topic, byte *payload, unsigned int length);
void setup() {
myservo.attach(4);
int posLama = posBaru;
  Serial.begin(115200);
  connectToWiFi();
  mqtt_client.setServer(mqtt_broker, mqtt_port);
  mqtt_client.setCallback(mqttCallback);
  connectToMQTTBroker();
}
void connectToWiFi() {
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nConnected to the WiFi network");
}
void connectToMQTTBroker() {
  while (!mqtt_client.connected()) {
    String client_id = "esp8266-client-" + String(WiFi.macAddress());
    Serial.printf("Connecting to MQTT Broker as %s.....\n", client_id.c_str());
    if (mqtt_client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
      Serial.println("Connected to MQTT broker");
      mqtt_client.subscribe(mqtt_topic);
      // Publish message upon successful connection
      mqtt_client.publish(mqtt_topic, "12345A");

    } else {
      Serial.print("Failed to connect to MQTT broker, rc=");
      Serial.print(mqtt_client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}
void mqttCallback(char *topic, byte *payload, unsigned int length) {
  Serial.print("Message received on topic: ");
  Serial.println(topic);
  //Serial.print("Message:");
  String message;
  for (int i = 0; i < length; i++) {
    message += (char) payload[i];  // Convert *byte to string
  }
 ///////////////////////////////////
 if (String (topic) == "rokhmad.com/servo") {   
   posBaru=message.toInt();
    if (posLama < posBaru ) {
      while (posLama < posBaru ) {
        posLama++;
        myservo.write(posLama);  
      Serial.println("servo duputar");  
        delay(20);
      }
    } else if (posLama > posBaru) {
      while (posLama > posBaru ) {
        posLama--;
          myservo.write(posLama);  
      Serial.println("servo duputar");  
          delay(20);
        }      }
 int posLama = posBaru;
    }
 /////////////////////////
  Serial.println(message);
  Serial.println();
  Serial.println("-----------------------");
}
void loop() {
  if (!mqtt_client.connected()) {
    connectToMQTTBroker();
  }
  mqtt_client.loop();

}


===================================
untuk project lengkap silahkan unduh disini
===================================








Share:

About me

About me
Tentang Saya

www.rokhmad.com

Blog edukasi Tutorial, Pendidikan, Media Pembelajaran, Ilmu Pengetahuan.

toko Online

SKETCH JWSD ESP

VIDEO PERAKITAN JWSD WIFI

Unduh Library Project jws 1000m

kumpulan sketch JWSD 1000 M

kumpulan sketch JWSD 1000 M
kumpulan sketch JWSD 1000 M

Kumpulan Sketch JWSD

JWSD 2 Panel Full Bluetooth

JWSD 2 Panel Full Bluetooth
JWSD 2 Panel Bluetooth

JWSD 3 panel Bluetooth

JWSD 3 panel Bluetooth
JWSD 3 panel Bluetooth

Sketch JWS 4 Panel, Bluetooth Kontrolled

Sketch JWS 4 Panel, Bluetooth Kontrolled
JWSD- 2019 NEW ! !

Sketch Jam Sholat 1 Panel

Sketch Jam Sholat 1 Panel
Jam sholat 1 Panel

Sketch Jam Sholat 2 Panel

Sketch Jam Sholat 2 Panel
Jam dua panel

Sketch Jam Sholat 3 Panel

Sketch Jam Sholat 3 Panel
Sketch Jam Sholat 3 Panel

Sketch Jam Sholat 5 Panel

Sketch Jam Sholat 5 Panel
Jam Sholat 5 Panel

Toko Kami

Daftar isi

Blog Archive

Tryout UNBK

e-learning

e-learning
Belajar mudah, dimana saja

my Edmodo

Buku Digital

Buku Tamu

Komentar Terkini

Live Traffic

Donasi

Donasi
Donasi

Total Pengunjung