Advertise here

Rabu, 13 Maret 2019


Introducing

Teknologi mobile yang terus berkembang semakin memudahkan dalam urusan berkomunikasi data dengan adanya teknologi jaringan tanpa kabel (wireless) ini, kita cukup menggunakan paket data dari operator selular atau menggunakan hotspot wifi yang tersedia di lingkungan sekitar kita untuk melakukan komunikasi.

Betapa luar biasanya perkembangan teknologi ini, karena setiap orang memungkinkan memiliki komputer genggam yang biasa di sebut smart phone yang didalamnya memiliki berbagai macam aplikasi yang dibutuhkan.

Dari kebiasaan orang yang selalu bermain-main dengan smart phonenya dikala waktu senggang dan berkomunikasi, setidaknya smart phone yang ada ditangan kita ini dapat dimanfaatkan untuk mengendalikan peralatan seperti anda menggunakan remote pada televisi. 

Cukup praktis bukan?

Proyek pengembangan selanjutnya yaitu memanfaatkan smart phone untuk mengendalikan alat dengan menggunakan modul WIFI ESP01-8266 yang memiliki harga yang murah.

ESP8266 merupakan wifi module yang didalamnya sudah memiliki MCU ESP8266 yang dapat di program menggunakan arduino.

Tapi dalam hal ini kita tidak membahas pemograman ESP8266, jadi hanya memanfaatkan   ESP8266 sebagai modul wifi saja yang dapat di akses dengan perintah AT command. 

Perintah perintah yang digunakan pada proyek ini adalah perintah dasar untuk mengoperasikan modul wifi melalui komunikasi serial, perintah dasarnya adalah sebagai berikut:

No
Command
Deskripsi
1
AT+RST
Mereset modul ESP01
2
AT+CWMODE
Mengaktifkan ESP01 menjadi AP, STATION, AP-STATION
3
AT+CWSAP
Memberi nama SSID, Kunci Keamanan, Jenis Kunci, Channel Frekuensi, dan Jenis sistem keamanan yang dipakai
4
AT+CIPMUX
Konfigurasi perangkat sebagai single koneksi atau multi koneksi
5
AT+CIPSERVER
Membuka koneksi port yang dibuat, misal port 80 untuk webserver
6
AT+CIPSEND
Mengirim data yang akan dikirim, dalam hal ini adalah halaman berupa tag html
7
AT+CIPCLOSE
Menutup koneksi apa bila telah dilakukan pengiriman data

Lebih lengkap belajar mengenai AT Command anda dapat membacanya pada link disini https://www.espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf

Melalui perintah-perintah AT-COMMAND di atas maka cukuplah mudah mengkomunikasikan  data dari MCU STM32F103 ke modul wifi hanya dengan menggunakan komunikasi serial. 

Secara defaultnya ESP01 memiliki 2 versi, ada yang versi lama dengan default baudrate 9600 bps dan versi kedua memiliki default baud rate 115200bps. Sekarang modul yang anda miliki versi berapa? Anda cukup menyesuaikan saja.


Bill Of Material
  • Board STM32F103C Blue Pill
  • Board ESP01-8266 Pin Out 6
  • Bread Board 400 dot point
  • 4 Channel Relay Module SMD
  • Dan beberapa kabel Jumper Female to Male, dan Male to Male
Circuit Wiring

            Tabel Pin Koneksi
ESP8266
STM32
 VCC
3.3V
GND
G
CH_PD
3.3V
TX
PA3
RX
PA2
                                                                               

Program

//Define Conversion Char to String
#define FPSTR(pstr_pointer) (reinterpret_cast <const __FlashStringHelper *>(pstr_pointer))
#define F(string_literal) (FPSTR(PSTR(string_literal)))
#define debug Serial

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

// Buffer
#define BUFFER_SIZE 512
// communication serial to esp8266 via USART2
HardwareSerial esp8266(USART2);
char buffer[BUFFER_SIZE];

boolean tmpPin;
boolean tmpLogin;
//boolean PinStatus[] = {4,5,6,7,8};
int stsRelay;
//-------------

// page constant save to flash memory with PROGMEM function
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><html lang ='en-us'>"
"<head >"
"<meta name ='viewport' content='width=device-width, initial-scale=1.0'>"
"<TITLE>Home Controlling Lamp</TITLE>"
"</HEAD>"
  "<BODY>"
  "<CENTER>"
     "<H1><font color=\"blue\">Wireless Control</font></H1><hr />"
     "<H3><font color=\"red\">Arduino ESP8266 Web Server<br> For Implementation IoT</font></H3>"
     "<form>";
            
//------------------------            
const char pageEnd[] PROGMEM =
     "</form>"
     "Created by Hendrik Herdian <br>blog: stm32projects.blogger.com" 
     "<br />"
  "</CENTER>"
  "</BODY>"
"</HTML>";

void setup()
{
// Setup Baud rate for debug
debug.begin(115200);
esp8266.begin(115200); // your esp's baud rate might be different   

// Setup ESP8266 Mode
debug.println(sendData("AT+RST\r\n",1000)); // reset module   
debug.println(sendData("AT+CWMODE=2\r\n",1000)); // configure as access point
debug.println(sendData("AT+CWSAP=\"WIFI_ESP8266\",\"12345678\",1,0\r\n",1000));
debug.println(sendData("AT+CIPMUX=1\r\n",1000)); // configure for multiple connections
debug.println(sendData("AT+CIPSERVER=1,80\r\n",1000)); // turn on server on port 80
debug.println(sendData("AT+CIFSR\r\n",1000)); // get ip address

//Setup Pin arduino as output
   
  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()
{
  int ch_id, packet_len;
  char *data;

if(esp8266.available()) // check if the esp is sending a message
  {
    esp8266.readBytesUntil('\n', buffer, BUFFER_SIZE);
    if(strncmp(buffer, "+IPD,", 5)==0) {
    // request: +IPD,ch,len:data
    sscanf(buffer+5, "%d,%d", &ch_id, &packet_len);
    if (packet_len > 0)
      {
        // read debug until packet_len character received
        // start from :
        data = buffer + 5;
        while(*data != '/') data++;
        data++;
        debug.println(data);
        delay(1000);
       
        if (strncmp(data, "?button=RELAY+1 ", 16) == 0)
        {
            tmpPin = digitalRead(LedPins1);
            if (tmpPin==false){digitalWrite(LedPins1,HIGH);}
            else{digitalWrite(LedPins1,LOW);} 
               
        }
        else if (strncmp(data, "?button=RELAY+2 ", 16) == 0)
        {
            tmpPin = digitalRead(LedPins2);
            if (tmpPin==false){digitalWrite(LedPins2,HIGH);}
            else{digitalWrite(LedPins2,LOW);}
          
        }
        else if (strncmp(data, "?button=RELAY+3 ", 16) == 0)
        {
            tmpPin = digitalRead(LedPins3);
            if (tmpPin==false){digitalWrite(LedPins3,HIGH);}
            else{digitalWrite(LedPins3,LOW);}
           
        }
        else if (strncmp(data, "?button=RELAY+4 ", 16) == 0)
        {
            tmpPin = digitalRead(LedPins4);
            if (tmpPin==false){digitalWrite(LedPins4,HIGH);}
            else{digitalWrite(LedPins4,LOW);}
           
        }
        else if (strncmp(data, "?GetStatus ", 11) == 0)
        {
        }
        else if (strncmp(data, "?MainMenu ", 10) == 0)
        {
        }
        else if (strncmp(data, "?LogOut ", 8) == 0)
        {
        }
       
        // Insert the main page here or index.html
          pageSend(FPSTR(http_OK),ch_id);
          pageSend(FPSTR(pageStart),ch_id);
          pageSend(FPSTR(homePage),ch_id);
          pageSend(FPSTR(pageEnd),ch_id);
          delay(100);
          closeConnection(ch_id);
          clearSerialBuffer();
}}}}

String sendData(String command, int timeout)
{
    String response="";
    esp8266.print(command); // send the read character to the esp8266
    long int time = millis(); 
    while( (time+timeout) > millis())
    {
        while (esp8266.available())
        {
          char c = esp8266.read();
          response +=c;
        }
    }
   //debug.println(response);
   return response;
}

void clearSerialBuffer(void) {
   while (esp8266.available() > 0) {
     esp8266.read();
   }
}

void clearBuffer(void) {
   for (int i =0;i<BUFFER_SIZE;i++ ) {
     buffer[i]=0;
   }
}

void pageSend(String page, int ch_id )
    {
    int ii=0;
    String cipSend = "AT+CIPSEND=";
    cipSend += ch_id;
    cipSend += ",";
    cipSend += page.length();
    cipSend +="\r\n";
    sendData(cipSend,1000);
    sendData(page,1000);
}

void closeConnection(int ch_id){
    String closeCommand = "AT+CIPCLOSE=";
    closeCommand+=ch_id; // append connection id
    closeCommand+="\r\n";
    sendData(closeCommand,100);
}



Test & Result

Setelah seluruhnya selesai, saatnya anda melakukan uji coba. Pertama ambil smartphone anda dan aktifkan wifi, jika pada koneksi wifi terdapat SSID nama board WIFI_ESP8266 maka lakukan koneksi dan kemudian akan diminta kunci keamanan, masukan saja 12345678.

Jika telah terkoneksi maka Smartphone anda telah mendapatkan alamat IP default dari modul ESP01 yaitu 192.168.4.1. 

Langkah selanjutnya adalah buka browser dan ketikan pada kolom addresse url dengan alaamt IP default, dan selamat jika tampilan halaman web anda telah muncul di layar smart phone anda. 

Sekarang anda dapat menekan tombol RELAY1 sampai RELAY4 untuk mengeraakan relay secara ON dan OFF.


Comments 0

Advetise banner