Membangun Arduino Timer Relay

Beberapa waktu yang lalu seorang teman meminta untuk dibuatkan sebuah timer relay yang dapat mengendalikan 8 buah peralatan sekaligus. Fungsinya sangat sederhana, hanya menyalakan dan mematikan peralatan yang terhubung pada jam-jam tertentu setiap harinya.

Iseng saya mengupload video alat yang saya buat – yang baru setengah jadi – ke Youtube. Tidak disangka, cukup banyak komentar yang masuk yang menanyakan bagaimana cara membuatnya.

Saya pun mencoba membuat kembali alat itu, tapi sayangnya saya membeli komponen yang salah – modul RTC DS1302, bukannya DS1307. Terpaksa saya harus banyak memodifikasi sketch Arduino yang telah saya buat sebelumnya.

Anda bisa membacanya secara lengkap di halaman proyek Arduino Timer Relay.

Pilihan Power Supply Pada Arduino

Board Arduino dapat disupply dengan 3 cara, yaitu melalui USB, melalui jack power supply, dan melalui pin Vin. Masing-masing cara memiliki kelebihan dan kekurangannya.

Pilihan port power supply pada Arduino Uno.
Pilihan port power supply pada Arduino Uno.

USB

Port USB pada Arduino memiliki dua fungsi, yaitu sebagai port untuk komunikasi serial dan sebagai catu daya untuk menyalakan board Arduino.

Saat Arduino terkoneksi dengan komputer melalui port USB, Arduino secara otomatis mendapatkan supply sebesar 5V dari komputer. Hal ini akan memudahkan kita ketika melakukan pemrograman dan pengujian proyek yang sedang kita buat, karena kita tidak perlu lagi menambahkan power supply eksternal untuk proyek kita.

Namun perlu diperhatikan bahwa kapasitas power supply dari USB sangatlah terbatas, hanya 500 mA saja, sehingga jika proyek kita memerlukan daya yang lebih besar – misalnya untuk menggerakkan motor – maka kita tetap membutuhkan power supply eksternal.

Jack 2.1mm

Jack 2.1mm pada Arduino digunakan sebagai masukan dari power supply eksternal. Arduino dapat menerima tegangan power supply sebesar 7 hingga 20 VDC, dengan tegangan yang direkomendasikan adalah 12 VDC.

Polaritas power supply adalah positif pada pin tengahnya, namun jika kita secara tidak sengaja memasang jack power supply dengan polaritas terbalik, Arduino akan tetap aman, karena board Arduino telah dilengkapi dengan dioda sebagai pengaman terhadap kesalahan polaritas power supply.

Pin Vin

Pin Vin dapat kita manfaatkan jika Arduino akan kita supply menggunakan battery. Pin Vin terhubung dengan jack 2.1mm, namun setelah melewati rangkaian pengaman polaritas. Sehingga jika kita ukur, akan ada selisih sekitar 1 V antara tegangan pada jack 2.1mm dan pin Vin.

Karena pin ini berada setelah rangkaian pengaman polaritas, maka kita tidak boleh terbalik saat menghubungkan power supply ke pin Vin.

Kegunaan lain dari pin Vin adalah sebagai power supply untuk berbagai shield Arduino. Shield dipasang bertumpuk di atas board Arduino dan bisa memanfaatkan pin Vin sebagai power supply.

Menggabungkan 2 power supply

Bagaimana jika kita menggunakan power supply eksternal sekaligus menghubungkan kabel USB ke komputer? Berikut ini pembahasan dari halaman StackExchange.

Supply dari jack 2.1mm akan melewati dioda D1 (sebagai pengaman jika polaritas power supply yang kita gunakan ternyata salah atau terbalik), dan masuk ke regulator NCP1117 yang akan menurunkan tegangan ke 5V untuk mensupply komponen-komponen yang memerlukan tegangan 5V.

Rangkaian power supply Arduino Uno.
Rangkaian power supply Arduino Uno.

Rangkaian untuk power supply dari USB ditunjukkan pada gambar berikut.

Rangkaian supply USB Arduino Uno.
Rangkaian supply USB Arduino Uno.

Power supply dari USB akan masuk ke P-mosfet T1 yang berfungsi sebagai saklar, dan kemudian masuk ke jalur +5V (menjadi satu dengan jalur keluaran 5V seperti ditunjukkan pada rangkaian sebelumnya). 

Mosfet dikendalikan oleh op-amp LMV358 yang bekerja sebagai komparator. Tegangan input op-amp terhubung dengan jalur 3.3V dan input positif diambil dari rangkaian pembagi tegangan, yang besarnya setengah dari tegangan pada jalur VIN.

Saat tegangan VIN > 6.6V maka input positif op-amp menjadi lebih besar dari input negatif, dan op-amp akan mematikan mosfet.
Saat tegangan VIN < 6.6V maka input positif op-amp akan menjadi lebih rendah daripada input negatif, dan op-amp akan mengaktifkan mosfet.

Ingat bahwa jalur VIN berada setelah dioda input sehingga tegangannya 0.6V lebih rendah daripada tegangan power supply eksternal. Jika tegangan power supply eksternal lebih besar dari 6.6V+0.6V (dimana 0.6V adalah drop tegangan pada dioda D1), maka power supply dari USB akan diputus (karena mosfet tidak aktif) dan tegangan diambil dari power supply eksternal.

Dengan demikian, tidak akan ada perbedaan jika kita menghubungkan dan mencabut kabel USB pada saat Arduino terhubung dengan power supply eksternal. Power supply akan berpindah ke USB hanya jika tegangan power supply eksternal turun di bawah level tegangan yang diperbolehkan (sekitar 6.6V+0.6V=7.2V).

Koneksi Arduino + ESP8266 ke ThingSpeak

ThingSpeak adalah platform Internet of Things yang dapat digunakan secara gratis untuk menampilkan chart suatu peralatan IoT. Pada percobaan kali ini saya tidak menggunakan sensor. Saya hanya mengirimkan data secara random ke server ThingSpeak.

ESP8266 terhubung pada pin 10 dan 11 pada Arduino, dan berkomunikasi dengan menggunakan library SoftwareSerial. Port Serial pada Arduino digunakan untuk berkomunikasi dengan Serial Monitor, untuk memudahkan debugging.

Rangkaian Arduino + ESP8266.
Rangkaian Arduino + ESP8266.

Berikut sketch yang saya gunakan.

#include 
SoftwareSerial ESP8266(10, 11); //RX,TX

#define IP "184.106.153.149" // thingspeak.com IP address
String GET = "GET /update?api_key=D6CWT4BXXXXXXXXX&field"; // API key

void setup() {
  Serial.begin(9600); // Hardware serial (serial monitor)
  ESP8266.begin(9600); // Software serial (komunikasi dengan ESP8266)
  ESP8266.println("AT+RST"); // Reset ESP8266
  delay(2000);
  ESP8266.println("AT");
  delay(5000);
  if (ESP8266.find("OK")) {
    Serial.println("Connected to ESP8266");
  }
  else {
    Serial.println("Not connected to ESP8266");
  }
}

void loop() {
  delay(2000);
  ESP8266.println("AT+RST"); // Reset setiap akan mengirim data
  delay(7000);

  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += IP;
  cmd += "\",80";

  ESP8266.println(cmd);
  delay(5000);

  if (ESP8266.find("Error")) {
    Serial.println("AT+CIPSTART Error");
    return;
  }
  else {
    Serial.println("AT+CIPSTART Success");
  }
  cmd = GET;
  cmd += "1=";
  cmd += random(300);
  cmd += "&2=";
  cmd += random(300);
  cmd += "\r\n\r\n";
  ESP8266.print("AT+CIPSEND=");
  ESP8266.println(cmd.length());
  delay(10000);

  if (ESP8266.find(">")) { // Perintah AT+CIPSEND akan menampilkan prompt ">"
    ESP8266.print(cmd);
    Serial.println("Data sent");
  }
  else
  {
    Serial.println("AT+CIPSEND error");
  }
}

Berikut hasil akuisisi data pada server ThingSpeak.

Hasil akuisisi data di ThingSpeak.
Hasil akuisisi data di ThingSpeak.

Pengalaman Pertama Dengan ESP8266

ESP8266 adalah modul WIFI untuk menghubungkan peralatan mikrokontroler ke Internet. Modul ESP8266 berukuran sangat kecil, dan menggunakan tegangan 3,3V. Ada banyak varian modul ESP8266 yang tersedia di pasaran. Saya menggunakan modul ESP-01.

Kita akan mencoba berkomunikasi dengan modul ini. Komunikasi dengan modul ini menggunakan serial port dengan perintah berupa AT Command, seperti pada modul GPRS. Arduino digunakan sebagai power supply 3,3V bagi ESP8266 dan sebagai penghubung antara komputer dengan ESP8266.

Rangkaian percobaan koneksi ESP8266 dengan ke komputer dengan perantara Arduino.
Rangkaian percobaan koneksi ESP8266 dengan ke komputer dengan perantara Arduino.

Karena kita memanfaatkan Arduino hanya sebagai penghubung antara ESP8266 dengan komputer, maka kita tidak memerlukan sketch apapun. Saya mengisikan sketch kosong ke dalam Arduino.

void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}

Setelah sketch kosong diupload ke Arduino, saya mencoba-coba perintah AT melalui Serial Monitor.

Perintah AT

AT
OK

Perintah AT digunakan untuk meyakinkan kita bahwa AT Command dapat diterima dengan baik oleh ESP8266.

Perintah reset

AT+RST

OK

ets Jan 8 2013,rst cause:2, boot mode:(3,7)

load 0x40100000, len 1396, room 16
tail 4
chksum 0x89
load 0x3ffe8000, len 776, room 4
tail 4
chksum 0xe8
load 0x3ffe8308, len 540, room 4
tail 8
chksum 0xc0
csum 0xc0

2nd boot version : 1.4(b1)
SPI Speed : 40MHz
SPI Mode : DIO
SPI Flash Size &amp; Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000

�n't use rtc mem data
rl��sl��
Ai-Thinker Technology Co.,Ltd.

ready

Memeriksa versi firmware

AT+GMR

AT version:0.40.0.0(Aug 8 2015 14:45:58)
SDK version:1.3.0
Ai-Thinker Technology Co.,Ltd.
Build:1.3.0.2 Sep 11 2015 11:48:04
OK

Memeriksa jaringan WIFI yang tersedia

AT+CWLAP

+CWLAP:(3,"myWifi",-47,"d8:5d:4c:a9:7c:90",1,-46)
+CWLAP:(0,"PDCenter",-91,"00:27:22:e4:11:c3",11,-51)

OK

Bergabung dengan jaringan WIFI

AT+CWJAP="myWifi","password"

WIFI CONNECTED
WIFI GOT IP

OK

Ketika device kita matikan, setting koneksi WIFI akan tetap tersimpan, sehingga pada saat device kita nyalakan kembali, ESP8266 akan secara otomatis melakukan koneksi.

Memeriksa alamat IP

AT+CIFSR

+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"5e:cf:7f:11:d3:bc"
+CIFSR:STAIP,"192.168.1.104"
+CIFSR:STAMAC,"5c:cf:7f:11:d3:bc"

OK

Mengaktifkan multiple connection

AT+CIPMUX=1

OK

Mengakses halaman web

AT+CIPSTART=4,"TCP","yahoo.com",80

4,CONNECT

OK

Mengirimkan HTTP GET

AT+CIPSEND=4,18

OK
> (Di sini saya menulis GET /HTTP/1.0)
Recv 18 bytes

SEND OK

+IPD,4,259:HTTP/1.0 400 Host Header Required
Date: Sat, 14 Nov 2015 07:49:15 GMT
Via: http/1.1 ir35.fp.ne1.yahoo.com (ApacheTrafficServer)
Server: ATS
Cache-Control: no-store
Content-Type: text/html
Content-Language: en
Content-Length: 1784
Connection: close

+IPD,4,1201:

<!-- status code : 400 -->
<!-- Host Header Required -->
<!-- host machine: ir35.fp.ne1.yahoo.com -->
<!-- timestamp: 1447487355.000 -->
<table>
<tbody>
<tr>
<td><img src="https://s.yimg.com/nn/img/yahoo-logo-201402200629.png" alt="Yahoo Logo" />
<h1 style="margin-top: 20px;">Will be right back...</h1>
Thank you for your patience.
Our engineers are working quickly to resolve the issue.
</td>
</tr>
</tbody>
</table>

4,CLOSED