Senin, 31 Oktober 2016

Interfacing HC-SR04 ultrasonic ranging module NodeMCU V1.0 (Arduino IDE)

Ultrasonic ranging module HC - SR04 menyediakan fungsi pengukuran  jarak 2cm - 400cm, dengan tingkat akurasi sampai dengan 3mm. Module ini terdiri dari pemancar ultrasonic, penerima ultrasonic dan unit kendali.

Gambar 1. Module ultrasonic ranging HC-SR04 


Gambar 2. Prinsip kerja module HC-SR04

Prinsip dasar kerja dari module ini:
  1. Menggunakan IO untuk memicu sinyal High pada  pin Trigger paling sedikitnya 10us
  2. Module secara otomatis mengirimkan delapan pulsa 40 kHz
  3. Module mendeteksi pulsa pantulan balik.
  4. Jika ada pantulan balik, durasi waktu tingkat tinggi adalah mulai dari pengiriman utrasonic sampai dengan sinyal balik dalam ukuran mikro detik, sehingga jarak dapat dihitung dengan formula untuk dalam meter
range (meter) = (high level time×velocity of sound (340,2 m/s)) / 2

atau  dalam centimeter

range (cm) = uS / 58.2

atau inchi


range (inch) = uS / 148


Catatan: kecepatan suara (1 Mach) adalah 340,2 meter/detik 


 Gambar 3. Fungsi Pin pada HC-SR 04

Hal yang perlu diperhatikan:
  1. Tidak disarankan modul pin VCC dipasang langsung ke sumber arus, jika memang harus dilakukan, maka pasang pin GND terlebih dahulu, karena dapat mempengaruhi kerja normal dari modul,
  2. Ukuran area objek pengujian tidak kurang dari 0,5 meter persegi dan permukaan adalah sehalus mungkin karena dapat mempengaruhi hasil pengukuran.
  3. Disarankan untuk menggunakan siklus pengukuran diatas 60 ms, untuk mencegah sinyal trigger mengganggu sinyal echo.

Langkah-langkah:
  1. Hubungkan pin VCC ke sumber tegangan 5volt (dalam hal ini saya menggunakan keluaran dari board 5V pada board Arduino saya), pada beberapa situs memberi contoh VCC ke sumber tegangan 3V3 pada board NodeMCU, ternyata setelah saya coba, sensor tidak memberikan hasil yang benar.
  2. Hubungan pin GND ke GND sumber tegangan
  3. Pin Trigger ke D5 pada board NodeMCU
  4. Pin Echo ke D6 pada board NodeMCU
  5. Lakukan koding berikut ini:
const int triggerPin = D5; // Trigger Pin
const int echoPin = D6;   // Echo Pin

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

int maximumRange = 400; // Maximum range needed adalah 4 meter
int minimumRange = 2; // Minimum range needed adalah 2 cm
float duration, distance; // Duration used to calculate distance

void loop() {
  //trigger pulsa ultrasonic
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPin, HIGH); //mengirim sinyal high selama 10 mikro detik ke pin Trigger

  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW); //hentikan sinyal ke pin Trigger
  

  //baca durasi pantulan ultrasonic
  duration = pulseIn(echoPin, HIGH); //baca durasi dari pin Echo (durasi dalam mikro detik)

  //hitung jarak dalam cm, lihat formulasi untuk centimeter
  distance = duration/58.2;

  if (distance >= maximumRange || distance <= minimumRange){
    Serial.println("HC-SR 04 sensor out of measurement range");
  }
  else {
    Serial.print("Distance:");
    Serial.print(distance);
    Serial.println("cm");
  }
  delay(100); //jarak antar pengukuran diatas 60 ms, mencegah bercampurnya sinyal trigger dan echo
}


6. Lakukan verify
7. Lakukan upload
8. Buka layar serial monitor dengan 9600 baud.



Gambar 4. Hasil monitor

Salam,
Hendra.

Jumat, 28 Oktober 2016

Interfacing LDR photo resistor pada NodeMCU V1.0 (Arduino IDE)

Cadmium sulfide (CdS) atau light dependent resistor (LDR) memiliki resistensi berbanding terbalik dengan jumlah dari cahaya yang jatuh diatasnya, yang juga dikenal sebagai photo resistor, photoconductor, photoconductive cell, atau sederhananya disebut photocell.

Gambar 1. Karakteristik resistensi LDR terhadap intensitas cahaya

Karena memiliki karakteristik resistensi yang berbeda terkait dengan intensitas cahaya, sehingga pemanfaatan LDR pada suatu rangkaian adalah menggunakan teknik voltage divider, sehingga perubahan resistensi dapat diukur berdasarkan perubahan tegangan yang keluar (Vout).

Gambar 2. Voltage Divider dan Formula menghitung Vout

Berdasarkan persamaan tersebut diatas maka dapat dihitung Vout, misalkan Vin adalah 3.3V, RLDR=5ohm, R2=10ohm, maka Vout= 3.3V * 10000/(10000+5000) = 2.2V.

Karena tegangan yang keluar dapat berubah sesuai dengan intensitas cahaya (RLDR), sehingga Vout  harus dihubungkan ke pin analog (bukan digital) pada board NodeMCU. Board NodeMCU memiliki satu pin analog yaitu ADC (Analog-to-digital converter) yang dapat diakses melalui pin A0.

Gambar 3. Pin A0 adalah pin Analog-to-digital converter

Pembacaan pada A0 yang memiliki 10 bit sehingga berkisar antara 0 s/d 1023.

Langkah-langkah:
1. Hubungkan salah satu kaki photoresitor ke 3V3
2. Hubungkan kaki(2) yang lainnya dengan resistor 10ohm ke GND
3. Hubungkan kaki(2) ke pin A0 (membentuk rangkaian voltage divider)

Untuk jelasnya lihat gambar 4.




Gambar 4. Rangkaian photoresitor ke NodeMCU V1.0

Lakukan koding berikut ini:

// the setup routine runs once when you press reset:
const int pinLDR = A0;

void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(pinLDR);
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 3.3V):
  float voltage = sensorValue * (3.3 / 1023.0);
  // print out the value you read:
  Serial.println(voltage);
  delay(500);
}

Lakukan Verify dan Upload.
Salam,
Hendra.



Rabu, 26 Oktober 2016

Kendali 9g servo motor melalui NodeMCU V1.0 (Arduino IDE)

9g Micro Servo merupakan servo motor ringan dengan tenaga keluaran yang besar.  Servo dapat berputar lebih kurang 180 derajat (90 pada masing-masing arah), dan bekerja dengan standard dalam ukuran kecil. Anda dapat menggunakan koding servo apa saja, perangkat keras atau library untuk mengendalikan servo.

Gambar 1. Micro Servo 9g


Cocok untuk pemula yang ingin membuat gerakan tanpa harus merakit pengendali dengan feedback & gear box dengan spesifikasi sebagai berikut:
  • Weight: 9 g 
  • Dimension: 22.2 x 11.8 x 31 mm approx. 
  • Stall torque: 1.8 kgf.cm
  • Operating speed: 0.1 s/60 degree 
  • Operating voltage: 4.8 V (~5V) 
  • Dead band width: 10 μs 
  • Temperature range: 0 ºC – 55 ºC 
Servo motor bekerja dengan sinyal Pulse Wide Modulation  PWM dengan pulse 1 s/d 2 milidetik sebagai berikut:

Gambar 2. Servo motor bekerja dengan PWM

Posisi "0" (1.5 ms pulse) adalah ditengah, "90" (~2 ms pulse) adalah kearah kanan, dan "-90" (~1
ms pulse)adalah kearah kiri.
Dengan aturan perkabelan sebagai berikut ini:

Gambar 2. Aturan perkabelan  Micro Servo 9g

Berdasarkan gambar 2 tersebut diatas, maka adalah jelas bahwa kabel orange dihubungkan ke pin PWM, bukan pin analog yang ada pada board NodeMCU, sedangkan kabel merah adalah ke sumber tegangan 5 Volt dan kabel coklat adalah ke GND. Berikut ini adalah gambaran pin pada board NodeMCU yang dapat beroperasi secara PWM

Gambar 3. Pin pada board NodeMCU yang dapat beroperasi secara PWM

Karena NodeMCU V1.0 tidak memiliki output tegangan 5 volt, sehingga pada percobaan ini saya menggunakan bantuan sumber tegangan dari papan Arduino UNO yang memiliki ouput tegangan 5 Volt. Jika anda tidak memiliki board Arduino atau untuk servo motor yang lebih besar, maka dapat menggunakan sumber tegangan eksternal.

Langkah-langkah:
  1. Hubungkan kabel orange ke pin D5 pada board NodeMCU
  2. Hubungkan kabel merah ke 5V pada board Arduino UNO
  3. Hubungkan kabel coklat ke GND pada board Arduino UNO
  4. Lakukan koding berikut ini:
#include <Servo.h>

Servo myservo; // create servo object to control a servo

int pos = 0; // variable to store the servo position
const int pinServo=D5; //pin PWM pada NodeMCU

void setup() {
  myservo.attach(pinServo); // attaches the servo on pin 9 to the servo object
}

void loop() {
  // put your main code here, to run repeatedly:
  for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
  { // in steps of 1 degree
    myservo.write(pos); // tell servo to go to position in variable 'pos'
    delay(15); // waits 15ms for the servo to reach the position
  }
  for(pos = 180; pos>=1; pos-=1) // goes from 180 degrees to 0 degrees
  {
    myservo.write(pos); // tell servo to go to position in variable 'pos'
    delay(15); // waits 15ms for the servo to reach the position
  }
}

5. Lakukan verify
6. Upload

Salam,
Hendra.

Menambahkan RTC DS3231 pada board NodeMCU V1.0 (Arduino IDE)

DS3231 merupakan suatu I2C RTC murah yang memiliki tingkat akurasi yang tinggi dengan suatu integrated temperature compensated crystal oscillator (TCXO) dan crystal. Alat ini bekerja dengna suatu input baterai, dan menjaga akurasi dari waktu ketika sumber daya utama dari peralatan utama terputus.


 Gambar 1. Tampilan DS3231

Secara internal perangkat NodeMCU V1.0 tidak memiliki RTC yang tetap mencatat perubahan waktu ketika dalam keadaan OFF. Jika proyek anda membutuhkan suatu pencatatan waktu yang akurat, suatu RTC eksternal dapat dipertimbangkan, walaupun sebenarnya anda dapat melakukan sinkronisasi waktu ke suatu server Network Time Protocol (NTP) setiap board NodeMCU diaktifkan, tetapi jika jaringan WIFI anda terganggu, maka sistem anda tidak dapat mengupdate waktu, dan juga hal yang perlu penjadi pertimbangan adalah sinkronisasi melalui WIFI membutuhkan power yang besar.


Gambar 2. Pin pada DS3231

Untuk menggunakan DS3231, anda perlu menghubungkan pin VCC ke sumber tegangan, dan GND ke ground pada board NodeMCU. Pin SCL (Serial Clock) dan SDA (Serial Data) dihubungkan ke pin SCL dan SDA board anda dengan rangkaian sebagai berikut:


Gambar 3. Interface antara DS3231 dengan board NodeMCU V1.0

Pada board NodeMCU V1.0, pin SCL dihubungkan ke pin D1 (GPIO 5), dan pin SDA dihubungkan ke pin D2 (GPIO 4), dan berikut ini adalah tabel pin board NodeMCU V1.0 dan pemanfaatannya.



Gambar 4. Pin pada NodeMCU V1.0 dan Pemanfaatannya 

Langkah-langkah:
  1. Hubungkan pin GND dari DS3231 ke GND pada board NodeMCU
  2. Hubungkan pin VCC dari DS3231 ke 3V3 pada board NodeMCU
  3. Hubungkan pin SCL dari DS3231 ke pin D1 pada board NodeMCU
  4. Hubungkan pin SDA dari DS3231 ke pin D2 pada board NodeMCU
  5. Instalasi RTC by Makuna by Michael C. Miller (Sketch->Include Library->Manage Library), dan pastikan (Tested on esp8266)

Gambar 5. Tampilan Library Manager
  1. Lakukan koding berikut ini:
#include <Wire.h>         //I2C library
#include <RtcDS3231.h>    //RTC library
#include <stdio.h>

RtcDS3231 rtcObject;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  delay(1000);
  rtcObject.Begin();      //Starts I2C
  RtcDateTime currentTime = RtcDateTime(16,10,25,17,33,0);  //manually define date and time object
  rtcObject.SetDateTime(currentTime);                       //configure the RTC with object
}

void loop() {
  // put your main code here, to run repeatedly:
  RtcDateTime currentTime = rtcObject.GetDateTime();    //get the time from the RTC

  char str[15];   //declare a string as an array of chars 

  sprintf(str, "%d/%d/%d %d:%d:%d",     //%d allows to print an integer to the string
                currentTime.Year(),    //get year method
                currentTime.Month(),   //get month method
                currentTime.Day(),     //get day method
                currentTime.Hour(),    //get hour method
                currentTime.Minute(),  //get minute method
                currentTime.Second()   //get second method
  );

  Serial.print("RTC: ");
  Serial.println(str);
  delay(1000);
}
 Gambar 6. Hasil Run Aplikasi


Salam,
Hendra.

Senin, 24 Oktober 2016

Interfacing DHT11 sensor suhu dan kelembaban pada board NodeMCU V1.0 (Arduino IDE)

DHT11 merupakan sensor suhu dan kelembaban dengan suatu kalibrasi nilai output digital. Setiap elemen dHT11 adalah dikalibrasi dilaboratorium, dan koefisien kalibrasi disimpan pada sebagai program pada OTP memori yang digunakan oleh internal sensor memberi sinyal proses deteksi. Panjang kabel serial interface ke sensor dapat mencapai 20 meter sehingga merupakan pilihan yang tepat untuk berbagai aplikasi.

Gambaran umum terkait DHT11 adalah sebagai berikut:
  1. Jangkauan pengukuran : 20 s/d 90% RH, 0 s/d50 derajat celsius
  2. Akurasi kelembaban: lebih kurang 5 %RH
  3. Akurasi temperatur: lebih kurang 2 derajat celsius
  4. Sumber tegangan: 3 - 5.5V
  5. Tidak lebih dari 1 Hz sampling rate (satu kali per-detik)
  6. Stabilitas : < ± 0.5% RH / yr in

Jika anda membutuhkan sensor suhu dan kelembaban dengan tingkat jangkauan dan akurasi yang lebih baik, maka anda dapat mempertimbangkan DHT22 dengan spesifikasi sebagai berikut.
  1. Jangkauan pengukuran : 0 s/d100% RH, -40 s/d 125 derajat celsius
  2. Akurasi kelembaban: lebih kurang 2 s/d 5 %RH
  3. Akurasi temperatur: lebih kurang 0.5 derajat celsius
  4. Sumber tegangan: 3 - 5.5V
  5. Tidak lebih dari 0.5 Hz sampling rate (dua kali per-detik)



Gambar 1. Sensor DHT11 dan DHT22

Gambar 2. Pin pada sensor DHT11

Gambar 3. Aplikasi sensor DH11

Ketika kabel koneksi adalah kurang dari 20 meter, maka suatu resistor 5k pull-up adalah direkomendasikan, ketika kabel adalah lebih dari 20 meter suatu resistor pull-up yang sesuai dibutuhkan.

Ketika dihidupkan, jangan mengirim sinyal apapun ke sensor dalam 1 detik yang pertama untuk melewati status ketidakstabilan. Suatu kapasitor 100uF dapat ditambahkan antara VDD dan GND untuk power filtering.

Langkah-langkah:
1. Buatlah rangkaian dimana hubungkan pin1 sensor ke sumber power 3V3, dan pin 4 ke GND, dan pin 2 ke pin D5 sebagai berikut:

Gambar 4. Interface antara DHT11 dengan board NodeMCU V1.0

Catatan: Sesuai dengan rekomendasi, anda dapat menambahkan tahanan sebesar 5k menghubungkan pin 2 dan VCC untuk pull-up.

2. Download library DHT11 Stable yang dapat diperoleh pada  kemudian di zip
3. Dari menu Sketch, pilih include Library, dan pilih Add .Zip Library, dan pilih DHT11Stable.zip
4. Lakukan koding sebagai berikut:

#include <dht.h>
dht DHT;

const int iPinDHT11 = D5; //pin interface DHT11 data ke pin D5 pada board

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(iPinDHT11, INPUT);
  delay(1000); //tunggu stabilisasi sensor DHT11 sebagaimana datasheet

}

void loop() {
  // put your main code here, to run repeatedly:
  int chk = DHT.read11(iPinDHT11);
  Serial.print("humidity: ");
  Serial.print(DHT.humidity);
  Serial.print("%");
  Serial.print(", suhu: ");
  Serial.print(DHT.temperature);
  Serial.print("C");
  Serial.println(); 
  delay(1000); //tidak lebih dari 1 Hz (satu kali sampling per-detik)
}

5. Klik pada Verify
6. Klik pada Upload
7. Pada menu Tools pilih serial monitor, dan set ke baud rate ke 9600

Gambar 5. Hasil monitoring

Troubleshooting:
Jika pada saat Verify, anda mendapatkan error:

In member function 'int dht::_readSensor(uint8_t, uint8_t)':

error: cannot convert 'volatile uint32_t* {aka volatile unsigned int*}' to 'volatile uint8_t* {aka volatile unsigned char*}' in initialization

 #define portInputRegister(port)     ((volatile uint32_t*) &GPI)

note: in expansion of macro 'portInputRegister'

     volatile uint8_t *PIR = portInputRegister(port);

Using library DHTLib in folder: ...\Arduino\libraries\DHTLib (legacy)
exit status 1
Error compiling for board NodeMCU 1.0 (ESP-12E Module).

Berarti Library DH11 bukanlah versi stable, silakan download ulang dan tambahkan ke Sketch dan verifikasi ulang.

Rangkaian diatas juga telah ditest dengan kabel sepanjang 7 meter (Kabel UTP CAT6) dari sensor ke board, dan dapat bekerja dengan baik.

 Gambar 6. Rangkaian sensor suhu dan kelembaban ditest dengan kabel 7 meter

Salam,
Hendra.


Interfacing HC-SR501 Sensor PIR pada NodeMCU V1.0 (Arduino IDE)

Tulisan ini saya buat setelah mencoba menghubungkan suatu sensor PIR HC-SR501 ke board NodeMCU V1.0, dimana jika sensor mendeteksi adanya pergerakan dalam range (3-7 meter sesuai setting) dan sudut (110 derajat cone angle), maka akan secara menghidupkan LED-BUILTIN.


Gambar 1. Lokasi Led Built-In pada board NodeMCU V1.0


Berdasarkan data dari internet (aliexpress.com) diperoleh data terkait dengan sensor PIR HC-SR501 adalah sebagai berikut ini:
  1. working voltage range :DC 4.5-20V
  2. Quiescent Current :50uA
  3. high output level 3.3 V / Low 0V
  4. Trigger L trigger can not be repeated / H repeated trigger
  5. circuit board dimensions :32 * 24 mm
  6. maximum 110 ° angle sensor
  7. maximum sensing distance 7 meter

Walaupun dari datasheet tertulis DC 4.5-20V, tetapi saya menggambil sumber tegangan dari papan NodeMCU adalah 3.3 volt.


Gambar 2. Pin NodeMCU V1.0


Sebelum kita mulai alangkah baiknya kita melihat dulu melihat hal terkait dengan sensor HC-SR501 terlebih dahulu sebagaimana yang ditampilkan pada Gambar 2 sebagai berikut:



Gambar 3. Tampilan depan sensor, dengan dibuka casing

Gambar 4. Tampilan belakang sensor PIR HC-SR501

Adapun beberapa setting yang dapat dilakukan pada sensor adalah sebagai berikut:
1. Jumper set ke H: Repeat Trigger, nilai output pada sensor adalah HIGH selama waktu delay atau tetap HIGH sampai dengan tidak adanya pergerakan yang terdeteksi.
2. Jumper set ke L: Single Trigger/Non Repeatable: nilai output pada sensor adalah HIGH selama waktu delay, dan set ke LOW setelah waktu delay terlampaui.
3. Time delay adjust, mengatur waktu berapa lama waktu delay (0.3 s/d 5 menit)

Gambar 5. Adjust Time Delay  (0.3 s/d 5 menit)

4. Sensitivity Adjust, mengatur jarak sensitifitas sensor (3-7 meter)

Gambar 6. Adjust Sensitivity (3-7 meter)
Gambar  3. Atur sensitifitas dan time delay (searah jarum jam lebih sensitif/lebih lama)
5. Pin Power, dihubungkan kesumber power, dalam hal ini saya hubungkan ke pin 3V3 pada board nodeMCU.
6. Pin GND, dihubungkan ke GND pada board nodeMCU (sebelah pin 3V3)
7. Pin High/Low Output, dihubungkan ke salah satu pin digital pada board nodeMCU, dalam hal ini saya hubungkan ke pin D1 pada board nodeMCU.
8. Inducting time block, dimana sensor tidak menerima sinyal setelah perubahan output (high ke low)

Catatan: Dalam hal ini jumper saya set ke H.

/*
 * PIR sensor tester
 */

int ledPin = D0;                // choose the pin for the LED-BUILTIN
int inputPin = D1;              // choose the input pin (for PIR sensor)
int pirState = LOW;             // we start, assuming no motion detected
int val = 0;                    // variable for reading the pin status

void setup() {
  pinMode(ledPin, OUTPUT);      // declare LED as output
  pinMode(inputPin, INPUT);     // declare sensor as input

  Serial.begin(9600);
}

void loop(){
  val = digitalRead(inputPin);  // read input value
  if (val == HIGH) {            // check if the input is HIGH
    digitalWrite(ledPin, HIGH);  // turn LED ON
    if (pirState == LOW) {
      // we have just turned on
      Serial.println("Motion detected!");
      // We only want to print on the output change, not state
      pirState = HIGH;
    }
  } else {
    digitalWrite(ledPin, LOW); // turn LED OFF
    if (pirState == HIGH){
      // we have just turned of
      Serial.println("Motion ended!");
      // We only want to print on the output change, not state
      pirState = LOW;
    }
  }
}

Sesaat setelah upload, atau power on, tunggu 60 detik untuk stabilisasi, jika ada terdeteksi pergerakan maka led built-in warna pada board akan menyalah.

Salam,
Hendra. 


Jumat, 21 Oktober 2016

Control LED_BUILTIN pada board ESP8266 NodeMCU V1.0 melalui web (Lua)

Pada contoh ini akan dibuat aplikasi dimana dapat mengaktifkan dan mematikan LED_BUILTIN pada board NodeMCU V1.0 dengan melakukan pull LOW (on), dan pull HIGH(off) yang dikendalikan melakui web.


Gambar 1. Lokasi Led BuiltIn pada board NodeMCU V1.0

Perangkat yang diperlukan:
1. Board ESP8266 NodeMCU V1.0
2. Micro USB Cable
3. Smartphone yang telah diaktifkan fungsi Hotspot
4. CP2102 (USB to Serial Converter) driver yang telah diinstall
6. ESPlorer IDE

Langkah-langkah:
1. Install CP2102 (USB to Serial Converter) driver jika anda belum melakukannya
2. Install Arduino IDE jika anda belum melakukannya
3. Install board manager ESP8266
4. Aktifkan Hotspot pada smartphone anda, tentukan SSID dan Password
Gambar 2. Pengaktifan Hotspot pada smartphone

5. Lakukan koding sebagai berikut:

nama file: credentials.lua

-- Credentials
SSID = "BOLT!Super4G-899A"
PASSWORD = "********"

nama file: application.lua

-- Aplication
print("Server started")
print("Use this URL to connect: ")
print("http://" .. wifi.sta.getip() .. "/") 

ledPin = 0 -- GPIO 16

gpio.mode(ledPin, gpio.OUTPUT)
gpio.write(ledPin, gpio.HIGH)

value = "Off";

srv=net.createServer(net.TCP)

srv:listen(80,function(conn)
    conn:on("receive", function(client,request)
        print("new client")
        local buf = "";
        print(request)

        -- Return the response
        buf = buf .. "HTTP/1.1 200 OK\n"
        buf = buf .. "Content-Type: text/html\n"
        buf = buf .. "\n"
        buf = buf .. "<!DOCTYPE HTML>\n"
        buf = buf .. "<html>\n"
              
        if(string.find(request,"LED=ON") == nil) then
              gpio.write(ledPin, gpio.HIGH)
              value = "Off"
        else
              gpio.write(ledPin, gpio.LOW)
              value = "On"             
        end

        buf = buf .. "Led pin is now:" .. value .. "\n";

        buf = buf .. "<br><br>\n"
        buf = buf .. "<a href=\"/LED=ON\"\"><button>Turn On </button></a>\n"
        buf = buf .. "<a href=\"/LED=OFF\"\"><button>Turn Off </button></a><br />\n"
        buf = buf .. "</html>\n"

        print(buf)
       
        client:send(buf)
        client:close()
        collectgarbage()
    end)
end)

nama file: init.lua
-- Init
-- load credentials, 'SSID' and 'PASSWORD' declared and initialize in there
dofile("credentials.lua")

-- function startup akan diaktifkan secara timer alarm setelah sistem berhasil koneksi ke hotspot dengan

-- jeda waktu 3 detik, sehingga jika terdapat bugs pada application.lua, dapat diintervensi
-- dengan perintah file.remove("application.lua") pada tahapan awal boot
function startup()
    if file.open("init.lua") == nil then
        print("init.lua deleted or renamed")
    else
        print("Running")
        file.close("init.lua")
        -- aplikasi autoexec anda  sekarang adalah 'application.lua'
        if file.open("application.lua") == nil then
            print("application.lua tidak ditemukan, silakan buat application.lua sebagai autoexec.")
        else  
            file.close("application.lua")
            dofile("application.lua")
        end
    end
end

print("Connecting to " .. SSID)
wifi.setmode(wifi.STATION)
wifi.sta.config(SSID, PASSWORD)
-- wifi.sta.connect() not necessary because config() uses auto-connect=true by default

-- timer alarm untuk per tiap detik sampai tmr.stop(1)
tmr.alarm(1, 1000, 1, function()
    if wifi.sta.getip() == nil then
        print(".")
    else

-- berhasil koneksi dan mendapatkan IP Address
        tmr.stop(1)
        print("WiFi connected")
        print("You have 3 seconds to abort")
        print("Waiting...")
-- jalankan fungsi startup setelah 3 detik       
        tmr.alarm(0, 3000, 0, startup)
    end
end)

6. Upload Masing-masing file

 Gambar 3. Masing-masing file pada Editor
7. Lihat hasil eksekusi pada jendela serial monitor
Connecting to BOLT!Super4G-899A
> ...
WiFi connected
You have 3 seconds to abort
Waiting...
Running
Server started
Use this URL to connect:
http://192.168.43.207/

8. Catat Nomor IP Server yang diberikan oleh hotspot
9. Aktifkan browser pada smartphone anda, dan browse ke http://192.168.43.207


Gambar 4. Hasil Browse pada Smartphone

12. Silakan coba klik Turn-on dan Turn-Off
Selamat mencoba.
Salam,
Hendra.



Kamis, 20 Oktober 2016

Control LED_BUILTIN pada board ESP8266 NodeMCU V1.0 melalui web (Arduino IDE)

Pada contoh ini akan dibuat aplikasi dimana dapat mengaktifkan dan mematikan LED_BUILTIN pada board NodeMCU V1.0 dengan melakukan pull LOW (on), dan pull HIGH(off) yang dikendalikan melakui web.

Gambar 1. Lokasi Led BuiltIn pada board NodeMCU V1.0


Perangkat yang diperlukan:
1. Board ESP8266 NodeMCU V1.0
2. Micro USB Cable
3. Smartphone yang telah diaktifkan fungsi Hotspot
4. CP2102 (USB to Serial Converter) driver yang telah diinstall
6. Arduino IDE yang telah diinstalasi board manager ESP8266

Langkah-langkah:
1. Install CP2102 (USB to Serial Converter) driver jika anda belum melakukannya
2. Install Arduino IDE jika anda belum melakukannya
3. Install board manager ESP8266
4. Aktifkan Hotspot pada smartphone anda, tentukan SSID dan Password
Gambar 2. Pengaktifan Hotspot pada smartphone

5. Lakukan parameter setting pada menu Tools


Gambar 3. Hasil Setting untuk membuat aplikasi

6. Lakukan koding sebagai berikut:

#include <ESP8266WiFi.h>

const char* ssid = "isikan SSID hotspot"; //sesuai dengan step 4 diatas
const char* password = "isikan password hotspot"; //sesuai dengan step 4 diatas

int ledPin = D0; //GPIO 16 red led on board inverted logic (LOW=ON, HIGH=OFF)
//int ledPin = D4; //GPIO 2 blue led on board inverted logic (LOW=ON, HIGH=OFF)

WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);

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

  WiFi.begin(ssid, password);

//ulangi koneksi ke Hotspot sampai selesai
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  //start the server
  server.begin();
  Serial.println("Server started");

  // print the IP address, nantinya dimonitor dengan Serial Monitoring
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");

}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }

  // Read the first line of the request
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();

  // Match the request

  int value = LOW;
  if (request.indexOf("/LED=ON") != -1)  {
    digitalWrite(ledPin, LOW);
    value = LOW;
  }
  if (request.indexOf("/LED=OFF") != -1)  {
    digitalWrite(ledPin, HIGH);
    value = HIGH;
  }

//Set ledPin according to the request
//digitalWrite(ledPin, value);

  // Return the response
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");

  client.print("Led pin is now: ");

  if(value == HIGH) {
    client.print("On");
  } else {
    client.print("Off");
  }
  client.println("<br><br>");
  client.println("<a href=\"/LED=ON\"\"><button>Turn On </button></a>");
  client.println("<a href=\"/LED=OFF\"\"><button>Turn Off </button></a><br />"); 
  client.println("</html>");

  delay(1);
  Serial.println("Client disonnected");
  Serial.println("");
}

7. Lakukan verifikasi
8. Lakukan upload

9. Aktifkan Serial monitoring pada Arduino IDE (Tools->Serial Monitor)

Gambar 4. Serial Monitoring Server

10. Catat Nomor IP Server yang diberikan oleh hotspot
11. Aktifkan browser pada smartphone anda, dan browse ke http://192.168.43.207


Gambar 5. Hasil Browse

12. Silakan coba klik Turn-on dan Turn-Off
Selamat mencoba.
Salam,
Hendra.



Pemrograman NodeMCU V1.0 Lua

Setelah melakukan flash firmware NodeMCU Lua ataupun board ESP8266 anda telah tersedia firmware NodeMCU Lua, maka langkah berikutnya adalah bagaimana melakukan pemrograman dengan bahasa Lua?

Langkah-langkah:
1. Instalasi aplikasi ESPlorer yang dapat didownload.
2. Ekstraksi file zip hasil download, dan jalankan Esplorer.bat
3. Tampilan IDE dari ESPlorer adalah sebagai berikut:

 
4. Pilih Port, dan klik pada Open, jika berhasil akan tampil prompt:

NodeMCU 0.9.5 build 20150318  powered by Lua 5.1.4
lua: cannot open init.lua
>  

Jika tampilan respon setelah klik pada Open adalah:

Communication with MCU..Waiting answer from ESP - Timeout reached. Command aborted.]

Maka reset board anda, dengan menekan tombol RST yang ada di board.

Catatan:
lua:cannot open init.lua memberitahukan kepada anda bahwa program init.lua tidak ditemukan di root dari sistem file yang mana akan secara otomatis dieksekusi pada rangkaian boot (fitur standard Lua)

5. Lakuklan koding berikut ini untuk setting SSID dan Password:

-- Credentials
SSID = "isikan SSID hotspot anda"
PASSWORD = "isikan password hotspot anda"


 

Klik pada Save dan beri nama sebagai credentials.lua

6. Lakukan koding berikut ini untuk blink led pada board

-- led warna biru pada board
LED_PIN = 4
US_TO_MS = 1000

gpio.mode(LED_PIN, gpio.OUTPUT)

while true do
   gpio.write(LED_PIN, gpio.HIGH)
   tmr.delay(1000 * US_TO_MS)
   gpio.write(LED_PIN, gpio.LOW)
   tmr.delay(1000 * US_TO_MS)
end
 

7. Lakukan koding untuk sebagai init.lua
init.lua merupakan file yang berisi script yang otomatis akan dijalankan pada rangkaian akhir dari proses booting, sehingga hal yang perlu diperhatikan adalah jika ada bugs pada script pada file init.lua dapat menyebabkan sistem anda terjebak pada restart loop yang tidak terbatas sehingga anda perlu melakukan flash kembali firmware dari awal.

Untuk menghindari kondisi terjebak tersebut diatas, anda perlu membuat aplikasi anda pada file "application.lua" yang berisi script utama anda, sedangkan script pada init.lua akan mengaktifkan "application.lua" secara timer alarm 3 detik, yang memungkinkan anda melakukan intervensi untuk segera menghapus file "application.lua" dengan menggunakan perintah file.remove("application.lua") ada tahapan awal reboot jika terdapat bugs.

Pada umumnya init.lua digunakan untuk melakukan koneksi ke hotspot dan mendapatkan IP address, jika berhasil, maka akan mengaktifkan "application.lua" secara timer alarm 3 detik.

-- load credentials, 'SSID' and 'PASSWORD' declared and initialize in there
dofile("credentials.lua")

-- function startup akan diaktifkan secara timer alarm setelah sistem berhasil koneksi ke hotspot dengan
-- jeda waktu 3 detik, sehingga jika terdapat bugs pada application.lua, dapat diintervensi
-- dengan perintah file.remove("application.lua") pada tahapan awal boot

function startup()
    if file.open("init.lua") == nil then
        print("init.lua deleted or renamed")
    else
        print("Running")
        file.close("init.lua")
        -- aplikasi autoexec anda  sekarang adalah 'application.lua'
        if file.open("application.lua") == nil then
            print("application.lua tidak ditemukan, silakan buat application.lua sebagai autoexec.")
        else   
            file.close("application.lua")
            dofile("application.lua")
        end
    end
end

print("Connecting to WiFi access point...")
wifi.setmode(wifi.STATION)
wifi.sta.config(SSID, PASSWORD)
-- wifi.sta.connect() not necessary because config() uses auto-connect=true by default
-- timer alarm untuk per tiap detik sampai tmr.stop(1)
tmr.alarm(1, 1000, 1, function()
    if wifi.sta.getip() == nil then
        print("Waiting for IP address...")
    else
-- berhasil koneksi dan mendapatkan IP Address
        tmr.stop(1)
        print("WiFi connection established, IP address: " .. wifi.sta.getip())
        print("You have 3 seconds to abort")
        print("Waiting...")
-- jalankan fungsi startup setelah 3 detik
        tmr.alarm(0, 3000, 0, startup)
    end
end)

Simpan script diatas sebagai init.lua.

8. Upload credentials.lua, Uploading to ESP file credentialss.lua...Success
9. Upload application.lua, Uploading to ESP file application.lua...Success
10. Upload init.lua, Uploading to ESP file init.lua...Success
11. Reset board anda, dan jika berhasil

NodeMCU 0.9.5 build 20150318  powered by Lua 5.1.4
Connecting to WiFi access point...
> Waiting for IP address...
Waiting for IP address...
Waiting for IP address...
WiFi connection established, IP address: 192.168.1.105
You have 3 seconds to abort
Waiting...
Running

12. Jika terdapat bugs pada "application.lua", maka reset board anda, dan pada saat booting berikan perintah file.remove("application.lua")

 
 
 Lakukan koreksi script application.lua dan upload kembali.

Salam,
Hendra.