STM32F103C Web Server Controlling Relay via ENC28J60 Board
/ 12:19
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.
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.
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
EmoticonEmoticon