Advertise here

Rabu, 13 Maret 2019


Introducing

Dengan berkembangnya jaringan komputer komunikasi manusia dengan manusia semakin mudah tanpa mengenal jarak dan waktu, dimanapun dan kapanpun kita dapat berkomunikasi selama jaringan komputer masih bisa terjangkau. 

Seiring perkembangannya komunikasi manusia dengan manusia menjadi biasa, tapi bagaimana jika manusia bisa berkomunikais dengan mesin atau mesin dengan mesin layaknya seperti komunikasi yang dilakukan manusia dengan jarak yang jauh. 

Dari sinilah  Ide itu muncul, ketika kita berada pada jarak yang jauh apakah kita dapat mengendalikan sebuah peralatan yang ada dirumah? contoh saja lampu rumah, kipas angin, Televisi atau alat apapun yang perlu dikendalikan dirumah. 

Dengan bantuan alat ini anda dapat mengendalikannya dari mana saja dan kapan saja yang anda mau. Pada percobaan kali ini saya mencoba pada jaringan komputer lokal, jika anda ingin menerapkan kepada jaringan internet publik, anda harus membeli layanan hosting dan domain, atau anda dapat mencari cari layanan yang gratis.

Prinsip kerja dari alat ini berbasis web server, jadi alat yang digunakan sebagai kendali memiliki halaman web tersendiri yang di desain untuk sistem pengendalian, kemudian klien dari jaringan lokal dapat mengakses halaman web yang ada diserver melalui web browser. 

Jadi web browser digunakan sebagai interface antara manusia dengan mesin. Untuk melanjutkan proyek ini anda harus mengerti dengan dasar jaringan komputer dan dasar elektronika.

Bill Of Material
  • Board STM32F103C Blue Pill
  • Board ENC28J60 12Pin
  • Bread Board 400 dot point
  •  4 Channel Relay Module SMD
  • Dan beberapa kabel Jumper Female to Male, dan Male to Male
  • Liblary EtherCard_STM.h yang dapat di unduh pada link berikut  http://opensource.org/licenses/mit-license.php


Circuit Wiring


               Tabel Pin Koneksi
ENC28J60 PIN
BLUE PILL PIN
5V
5V
GND
G
SCK
PA5
SO
PA6
SI
PA7
CS
PA8
PIN RELAY Module

CH1
PB6
CH2
PB7
CH3
PB8
CH4
PB9


Program

Jalankan arduino IDE dan buat sketsa baru lalu kopikan program dibawah ini ke workspace, kemudian kopi folder  liblary
EtherCard_STM  yang sudah anda download kedalam directory C:\Users\PC_Home\Documents\Arduino\libraries. Lakukan verify pada program arduino IDE, jika tidak ada kesalahan maka anda dapat melakukan upload, tapi perlu diingat anda harus merubah posisi jumper boot0 dalam mode pemograman, sebelum melakukan upload.

#include <SPI.h>
#include <EtherCard_STM.h>

// Set 1 for Static IP, Set 0 for DHCP IP
#define STATIC 1
#define LedPins1 PB6
#define LedPins2 PB7
#define LedPins3 PB8
#define LedPins4 PB9

#if STATIC 
// Set the static IP address
static byte myip[] = {192,168,95,6};
static byte gwip[] = {192,168,95,1};
static byte dnsip[] = {8,8,8,8};
#endif

// Set mac address to unique value on the network host
static byte mymac[] = {0x54, 0x34, 0x41, 0x30, 0x30, 0x31};

// Set value for receive buffer
byte Ethernet::buffer[900];
BufferFiller bfill;

// Set the number pin for output
//int LedPins[] = {1,2,3,4,5};
boolean tmpPin;
boolean tmpLogin;
boolean PinStatus1;
boolean PinStatus2;
boolean PinStatus3;
boolean PinStatus4;
int stsRelay;
//-------------

const char http_OK[] PROGMEM =
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n\r\n";

const char http_Found[] PROGMEM =
"HTTP/1.0 302 Found\r\n"
"Location: /\r\n\r\n";

const char http_Unauthorized[] PROGMEM =
"HTTP/1.0 401 Unauthorized\r\n"
"Content-Type: text/html\r\n\r\n"
"<h3>401 Page Request Note Found...</h3>";

//------------
const char homePage[] PROGMEM =
    "<input name='button' type=submit value='RELAY 1'><br><br>"
    "<input name='button' type=submit value='RELAY 2'><br><br>"
    "<input name='button' type=submit value='RELAY 3'><br><br>"
    "<input name='button' type=submit value='RELAY 4'><br><br>";       

//------------------------
const char pageStart[] PROGMEM =
"<HTML>"
"<HEAD>"
"<TITLE>Relay Control</TITLE>"
"</HEAD>"
  "<BODY>"
  "<CENTER>"
     "<H1><font color=\"blue\">Control Relay Web Server</font></H1><hr />"
     "<H3><font color=\"red\">MCU STM32F103C ARDUINO IDE<br> For Implementation IoT</font></H3>"
     "<form>";
            
//------------------------            
const char pageEnd[] PROGMEM =
     "</form>"
     "<a href=\"/?MainMenu\"\">Main Menu</a>" " | "
     "<a href=\"/?GetStatus\"\">Get Status</a>" " | "
     "<a href=\"/?LogOut\"\">Log Out</a>" "<br>"
     "Created by Hendrikherdian <br>Blog: stm32projects.blogspot.com" 
     "<br />"
  "</CENTER>"
  "</BODY>"
"</HTML>";

//------------------------
const char pageLogin[] PROGMEM =
"<html><head>"
"<title>Login User</title></head>"
"<body>"
"<center>"
  "<form>"
  "<H3><font color=\"blue\">PLEASE LOGIN FIRST</font></H3><hr />"
  "Enter Username: <input type=text name=username><br><br>"
  "Enter Password: <input type=password name=password><br><br>"
  "<input name= 'login' type='submit' id='login' value='Login' />"
  "<hr/><br>"
  "</form>"
"</body></html>"; 
           
void setup()
{
  //=======================================================
  Serial.begin(115200);
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0); // set pin PA8 to CS
  #if STATIC
  // Set the IP ethernet ENC28J60
  ether.staticSetup(myip, gwip, dnsip);
  #else
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");
  #endif
  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip); 
  ether.printIp("DNS: ", ether.dnsip);
  tmpLogin = false;

  //Setup Pin arduino as output Procedure
  pinMode(LedPins1,OUTPUT);
  pinMode(LedPins2,OUTPUT);
  pinMode(LedPins3,OUTPUT);
  pinMode(LedPins4,OUTPUT);

  digitalWrite(LedPins1,LOW);
  digitalWrite(LedPins2,LOW);
  digitalWrite(LedPins3,LOW);
  digitalWrite(LedPins4,LOW);
}

// --------------------------------------

void loop()
{
  delay(1); //
  word len = ether.packetReceive();   // check for ethernet packet
  word pos = ether.packetLoop(len);   // check for tcp packet

  if (pos) {
    bfill = ether.tcpOffset();
    // var "data" contain sending data to http request
    char *data = (char *) Ethernet::buffer + pos;
    if (strncmp("GET /", data, 5) != 0) {
      bfill.emit_p(http_Unauthorized);
    }
    else {
      data += 5;
      if (data[0] == ' ') {
      // Insert the main page here or index.html      
        if (tmpLogin==false){
        bfill.emit_p(pageLogin);}
        else {
        bfill.emit_p(pageStart);
        bfill.emit_p(homePage);
        bfill.emit_p(pageEnd);
        }
      }
 //================================================================

      // "16" = totaly string on char "?ArduinoPIN1=on ".
      else if (strncmp("?button=RELAY+1 ", data, 16) == 0) {
        tmpPin = digitalRead(LedPins1);
        if (tmpPin==false){digitalWrite(LedPins1,HIGH);}
        else{digitalWrite(LedPins1,LOW);}     
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?button=RELAY+2 ", data, 16) == 0) {
        tmpPin = digitalRead(LedPins2);
        if (tmpPin==false){digitalWrite(LedPins2,HIGH);}
        else{digitalWrite(LedPins2,LOW);}      
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?button=RELAY+3 ", data, 16) == 0) {
        tmpPin = digitalRead(LedPins3);
        if (tmpPin==false){digitalWrite(LedPins3,HIGH);}
        else{digitalWrite(LedPins3,LOW);}      
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?button=RELAY+4 ", data, 16) == 0) {
        tmpPin = digitalRead(LedPins4);
        if (tmpPin==false){digitalWrite(LedPins4,HIGH);}
        else{digitalWrite(LedPins4,LOW);}     
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?GetStatus ", data, 11) == 0) {
        // Write code here to page link
        PinStatus1=digitalRead (LedPins1);
        PinStatus2=digitalRead (LedPins2);
        PinStatus3=digitalRead (LedPins3);
        PinStatus4=digitalRead (LedPins4); 
       
        bfill.emit_p(pageStart);
        // use macro PSTR, letter $F to define string which print
        bfill.emit_p(PSTR(
        "Lamp 1 : $F<br><br>"
        "Lamp 2 : $F<br><br>"
        "Lamp 3 : $F<br><br>"
        "Lamp 4 : $F<br><br>"),
        PinStatus1?PSTR("<font color=\"red\">ON</font>"):PSTR("OFF"),
        PinStatus2?PSTR("<font color=\"red\">ON</font>"):PSTR("OFF"),
        PinStatus3?PSTR("<font color=\"red\">ON</font>"):PSTR("OFF"),
        PinStatus4?PSTR("<font color=\"red\">ON</font>"):PSTR("OFF"));
        bfill.emit_p(pageEnd); 
    }
      else if (strncmp("?MainMenu ", data, 10) == 0) {
        bfill.emit_p(pageStart);
        bfill.emit_p(homePage);
        bfill.emit_p(pageEnd);
      }
      else if (strncmp("?LogOut ", data, 8) == 0) {
        tmpLogin = false;
        bfill.emit_p(pageLogin);
      }
      else if (strncmp("?username=hendrik&password=12345&login=Login ", data, 45) == 0) {
        tmpLogin = true;
        bfill.emit_p(pageStart);
        bfill.emit_p(homePage);
        bfill.emit_p(pageEnd);
      }
      else {
        // Page not found
        bfill.emit_p(pageLogin);
      }
    }
    ether.httpServerReply(bfill.position()); // send http response
  }
}

Penjelasan Program

Pada program ini, jika anda memiliki layanan IP secara otomatis atau DHCP, anda cukup memberi nilai pada baris program  #define STATIC 0  dan jika anda menginginkan alamat IP static maka #define STATIC 1
Dan untuk merubah alamat ip static anda cukup memberikan alamat ip pada baris program berikut

static byte myip[] = {192,168,95,6};
static byte gwip[] = {192,168,95,1};
static byte dnsip[] = {8,8,8,8};

Untuk pin output dari MCU yang dihubungkan ke input modul relay adalah PB6, PB7, PB8, dan PB9 anda dapat merubah pin output ini dengan sesuka hati anda, yang penting pin yang sudah dipakai untuk komunikasi serial UART PA9 dan PA10 serta Pin yang dipakai untuk komunikasi SPI PA8, PA7, PA6, dan PA5 tidak dipakai.

#define LedPins1 PB6
#define LedPins2 PB7
#define LedPins3 PB8
#define LedPins4 PB9

Semua halaman web disimpan dalam format html yang dimasukan kedalam flash memori MCU menggunakan pengarah PROGMEM, contohnya seperti standar pengiriman header web ketika klien request seperti baris program berikut:

const char http_OK[] PROGMEM =
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n\r\n";

Test & Result
Pertama kali browser dijalankan, masukan alamat ip address server kontrol relay kemudian akan ada tampilan login untuk masuk ke menu pengendalian. Masukan Username hendrik password 12345, dan tekan tombol login.

Setelah tampil menu pengendalian, untuk uji cobanya anda cukup tekan tombol Relay 1 sampai Relay 4 dan perhatikan apakah relay bekerja dengan memperhatikan indikator LED menyala (ON) dan mati (OFF). Tipe tombol yang digunakan ini adalah toggle button atau tombol Push ON dan Push OFF.




Uji coba yang selanjutnya adalah melihat status kondisi relay apakah posisi relay dalam keadaan ON atau OFF, dalam hal ini anda cukup klik hyperlink “Get Status”








Comments 0

Advetise banner