Sinkronisasi Waktu Dengan Network Time Protocol (NTP) pada Mikrokontroler ESP32

NTP (Network Time Protocol) adalah protokol komunikasi di jaringan komputer untuk sinkronisasi waktu melalui jaringan komputer. Sinkronisasi waktu ini penting pada aplikasi-aplikasi yang berbasis pewaktuan yang tepat, misalnya pencatatan ataupun untuk koordinasi aktivitas di suatu sistem berbasis IoT (Internet of Things).

ESP32 adalah mikrokontroler yang memiliki fitur Wi-Fi yang memungkinkan untuk tersambung ke jaringan komputer, termasuk ke suatu server NTP. ESP32 dapat menggunakan protokol NTP untuk sinkronisasi waktu dengan server NTP. Proses ini menyederhanakan kalibrasi waktu di ESP32. Alternatif lainnya adalah menggunakan RTC (real time clock) yaitu jam digital yang dibackup dengan baterai, ataupun dengan setting waktu secara manual. Teknik RTC perlu komponen tambahan, sedangkan setting manual memerlukan waktu dan tenaga. Selain itu sumber waktu di ESP32 juga tidak sepresisi sumber waktu di server NTP, sehingga setelah beberapa waktu maka jam di ESP32 akan bergeser dari setting awal.

Untuk mengakses NTP dari ESP32 dapat menggunakan library yang sudah ada, jadi tidak perlu lagi koding protokol secara dari nol. Library yang umum dipakai ada 2 macam yaitu:

  • Arduino Library NTPClient untuk Arduino. Library ini dapat dipakai di semua mikrokontroler Arduino.
  • Arduino ESP32 NTP untuk ESP32. Library ini hanya dapat dipakai untuk ESP32.

Persiapan

Sebelum menjalankan program NTP ini, ada beberapa hal yang perlu diperhatikan:

  • Arduino IDE sudah diinstal di desktop/laptop, dan libraray Arduino-ESP32 sudah diaktifkan
  • Konfigurasi ESP32 sudah diujicoba dengan program sederhana, misalnya lampu kedip (Blink)
  • Wi-Fi akses point dapat mengakses internet tersedia, dan juga sudah disiapkan nama akses point dan passwordnya.
  • Pahami zona waktu tempat anda. NTP memberikan waktu dengan standar GMT+0, jadi perlu disesuaikan jika anda memerlukan waktu lokal.

Arduino NTPClient

Cara pertama adalah menggunakan library NTPClient Arduino. Library ini dicantumkan di laman NTPClient di situs Arduino, namun tidak ada penjelasan sama sekali di situs tersebut. Untuk cara penggunaannya kita perlu melihat repository NTPClient di github. Contoh penggunaan ada di direktori /examples di repository tersebut.

Contoh kode juga dapat diakses dari Arduino IDE, dari menu File -> Examples -> NTPClient. Namun sedikit repot, karena daftar Examples cukup banyak dan urutannya tidak tepat abjad. Berikut ini tampilan menunya di Arduino IDE. (klik untuk gambar yang lebih besar).

Kode yang mudah dipakai adalah yang ‘Basic’ , namun kode ini perlu diubah sedikit seperti pada listing kode berikut ini.

#include <NTPClient.h>
// change next line to use with another board/shield
//#include <ESP8266WiFi.h>
#include <WiFi.h> // for WiFi shield
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
#include <WiFiUdp.h>

const char *ssid = "AP_NAME";
const char *password = "AP_PASSWORD";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  timeClient.begin();
}
void loop() {
  timeClient.update();
  Serial.println(timeClient.getFormattedTime());
  delay(1000);
}

Perubahan yang dilakukan adalah sebagai berikut:

  • Kode ini awalnya untuk ESP8266. Untuk dipakai di ESP32 maka header file mesti diganti, dari “ESP8266WiFi.h” menjadi “WiFi.h”
  • Sesuaikan nama SSID untuk akses point
  • Sesuaikan password untuk mengakses akses point. Perhatikan bahwa program NTP ini hanya dapat berfungsi jika ESP32 tersambung ke internet. Jadi pastikan Wi-Fi access point tersambung ke internet atau bisa juga menggunakan tethering ke smartphone

Berikut ini tampilan output ESP32 di serial monitor Arduino. Waktu adalah GMT+0, sedangkan di Indonesia adalah GMT+7, sehingga jam yang ditampilkan berbeda 7 jam.

Program di atas menampilkan waktu dalam UTC atau GMT+0. Untuk menampilkan dalam waktu lokal seperti WIB (Waktu Indonesia bagian Barat), gunakan fungsi setTimeOffset() untuk menambah/mengurangi waktu yang ditampilkan. Untuk WIB, waktu yang ditambah dalam detik adalah 7 x 60 x 60. Programnya menjadi sebagai berikut:

#include <NTPClient.h>
// change next line to use with another board/shield
//#include <ESP8266WiFi.h>
#include <WiFi.h> // for WiFi shield
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
#include <WiFiUdp.h>

const char *ssid = "AP_NAME";
const char *password = "AP_PASSWORD";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);

void setup() {
  Serial.begin(115200); 
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  timeClient.begin();
  timeClient.setTimeOffset(7*60*60);
}
void loop() {
  timeClient.update();
  Serial.println(timeClient.getFormattedTime());
  delay(1000);
}

Beberapa hal yang dapat diambil/diubah dengan member function di di class NTPClient :

  • SetPoolServerName() : mengubah NTP server dari default pool.ntp.org
  • isTimeSet() : apakah berhasil mengambil waktu dari NTP server
  • getDay() : ambil hari dalam minggu (0 = minggu)
  • getHours() : ambil waktu jam
  • getMinutes() : ambil waktu menit
  • getSeconds() : ambil waktu detik
  • setTimeOffset() : menambah/mengurangi offset waktu yang ditampilkan dalam detik
  • getFormattedTime() : waktu terformat dalam bentuk string
  • getEpochTime() : jumlah detik sejak 1 Januari 1970

Arduino ESP32 NTP Library

Library ini adalah bagian dari Arduino ESP32, jadi hanya dapat dipakai di ESP32.

Fungsi-fungsi penting adalah:

  • getLocalTime() untuk mendapatkan waktu
  • configTime() untuk setting NTP
  • configTzTime() untuk set timezone

Contoh kode diambil dari contoh program SimpleTime.ino di repository arduino-esp32 .

Daftar timezone yang dapat dipakai dapat dilihat di https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h

Berikut ini adalah kode yang sudah dimodifikasi:

// sumber: libraries/ESP32/examples/Time/SimpleTime/SimpleTime.ino
// URL: https://github.com/espressif/arduino-esp32/blob/496b8411773243e1ad88a68652d6982ba2366d6b/libraries/ESP32/examples/Time/SimpleTime/SimpleTime.ino
// dimodifikasi untuk WIB (GMT+7)

#include <WiFi.h>
#include "time.h"
#include "esp_sntp.h"

const char *ssid = "AP_NAME";
const char *password = "AP_PASSWORD";

const char *ntpServer1 = "pool.ntp.org";
const char *ntpServer2 = "time.nist.gov";
const long gmtOffset_sec = 3600;
const int daylightOffset_sec = 3600;

//const char *time_zone = "CET-1CEST,M3.5.0,M10.5.0/3";  // TimeZone rule for Europe/Rome including daylight adjustment rules (optional)
const char *time_zone = "WIB-7";  // Indonesia WIB

void printLocalTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("No time available (yet)");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

// Callback function (gets called when time adjusts via NTP)
void timeavailable(struct timeval *t) {
  Serial.println("Got time adjustment from NTP!");
  printLocalTime();
}

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

  // First step is to configure WiFi STA and connect in order to get the current time and date.
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);

  /**
   * NTP server address could be acquired via DHCP,
   *
   * NOTE: This call should be made BEFORE esp32 acquires IP address via DHCP,
   * otherwise SNTP option 42 would be rejected by default.
   * NOTE: configTime() function call if made AFTER DHCP-client run
   * will OVERRIDE acquired NTP server address
   */
  esp_sntp_servermode_dhcp(1);  // (optional)

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" CONNECTED");

  // set notification call-back function
  sntp_set_time_sync_notification_cb(timeavailable);

  /**
   * This will set configured ntp servers and constant TimeZone/daylightOffset
   * should be OK if your time zone does not need to adjust daylightOffset twice a year,
   * in such a case time adjustment won't be handled automagically.
   */
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2);

  /**
   * A more convenient approach to handle TimeZones with daylightOffset
   * would be to specify a environment variable with TimeZone definition including daylight adjustmnet rules.
   * A list of rules for your zone could be obtained from https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
   */
  configTzTime(time_zone, ntpServer1, ntpServer2);
}

void loop() {
  delay(5000);
  printLocalTime();  // it will take some time to sync time :)
}

Penyesuaian yang dilakukan adalah sebagai berikut:

  • Timezone diganti menjadi Waktu Indonesia bagian Barat (WIB-7)

Berikut ini output program di serial terminal

Kedua library tersebut fungsinya mirip-mirip. Library ESP32 memiliki fitur lebih banyak dan lebih cocok untuk dijalankan di ESP32.

Saran & Penyempurnaan

Contoh program NTP yang disajikan adalah program yang sangat minimalis untuk menunjukkan konsep NTP. Pada kondisi sesungguhnya, sistem mikrokontroler IoT ini akan menghadapi berbagai masalah, sehingga perlu ditambahkan penanganan beberapa kasus berikut:

  • Koneksi ESP32 ke server NTP tidak stabil, baik di local network maupun di internetnya.
  • Pada program perlu ditambahkan error handling jika terjadi koneksi internet putus ataupun koneksi Wi-Fi putus. Jika koneksi Wi-Fi putus, maka perlu ada prosedur untuk melakukan rekoneksi ulang ke akses point Wi-Fi. Jadi tidak perlu reset manual.
  • Pengubahan konfigurasi nama akses point dan password akses point secara software dengan interface tertentu. Pada contoh ini nama dan password dikodekan langsung di source code sehingga tidak dapat diubah. Pada kondisi nyata seharusnya dapat diubah oleh pemakai tanpa perlu mengubah source code.

Literatur

Apakah ada pin analog output di Arduino?

Apakah ada pin analog output di Arduino? Ada Arduino yang memiliki analog output sesungguhnya, ada yang tidak. Analog output yang sesungguhnya menggunakan DAC (Digital to Analog Converter). Pada Arduino yang tidak ada DAC, analog output dapat ditiru menggunakan output PWM (Pulse Width Modulation) / Modulasi Lebar Pulsa.

Apa bedanya sinyal output dari DAC dan dari PWM? Sinyal DAC berupa tegangan tertentu yang dapat diatur tegangannya sesuai dengan parameter yang diberikan. Sinyal PWM berupa tegangan HIGH (biasanya 5 volt) dan LOW (0 volt), dengan perbandingan antara HIGH dan LOW mengikuti suatu perbandingan tertentu.

Berikut ini contoh sinyal PWM

Arduino yang memiliki DAC adalah di antaranya sebagai berikut:

Arduino yang tidak memiliki DAC di antaranya sebagai berikut:

  • Arduino Nano dengan prosessor ATmega328P
  • Arduino UNO dengan prosessor ATmega328P
  • Arduino UNO mini dengan prosessor ATmega328P
  • Arduino Mega 2560 Rev3
  • Arduino UNO WiFI Rev2 dengan prosesor ATmega4809 
  • Arduino Micro dengan prosesor ATmega32U4
  • Arduino Leonardo dengan prosesor ATmega32U4

Berikut ini Arduino Zero yang memiliki output analog dengan DAC:

Referensi

Arduino SIM

Apakah itu Arduino SIM?

Arduino SIM adalah kartu SIM GSM dari Arduino yang menawarkan konektivitas global di seluruh dunia. Arduino SIM cocok dipakai untuk perangkat yang memerlukan akses ke Arduino IoT Cloud di tempat-tempat yang tidak memiliki akses IoT lain seperti Wifi

Arduino SIM
Arduino SIM

Arduino SIM kompatibel dengan produk MKR GSM 1400 dari Arduino. Pada papan Arduino ini terdapat konektor untuk memasukkan SIM card.

Arduino MKR GSM 1400
Arduino MKR GSM 1400

 

Arduino IoT Cloud

Arduino SIM memungkinkan akses ke Arduino IoT Cloud. Pada saat ini papan Arduino yang mendukung Arduino SIM adalah  MKR GSM 1400

Berikut ini foto perangkat pengukur tekanan menggunakan Arduino MKR GSM 1400 yang terhubung ke Arduino Cloud dan Google Sheets

IoT Pressure Sensor: MKR GSM + Arduino Cloud + Google Sheets
IoT Pressure Sensor

Dataplan

SIM Arduino hanya mengirimkan data ke Arduino IoT Cloud. Dengan cara ini, kami memberi Anda saluran komunikasi yang aman dari perangkat ke dasbor. Setelah data mencapai Arduino IoT Cloud, data dapat dijembatani ke platform dan layanan lain melalui webhook atau Arduino IoT API. Setelah aktivasi kartu SIM, Anda mendapatkan 10MB data gratis hingga 90 hari (5MB per bulan seharga $1,50 USD setelahnya). Fitur utama paket ini adalah:

  • Konektivitas seluler langsung ke Arduino IoT Cloud
  • HANYA kompatibel dengan Arduino IoT Cloud
  • Data dapat dijembatani dari Arduino IoT Cloud ke platform dan layanan lain menggunakan webhook atau Arduino IoT API
  • Profil roaming global – satu paket data sederhana beroperasi di lebih dari 100 negara. Periksa di sini cakupannya berdasarkan negara
  • Paket SIM Arduino bulanan dapat disewa di seluruh dunia kecuali Brasil
  • Data gratis awal akan kedaluwarsa setelah 90 hari atau ketika Anda telah menggunakan data gratis 10 MB, mana saja yang lebih dulu
  • Anda dapat menjeda dan memulai ulang SIM Anda di sini. Harap perhatikan bahwa SIM Anda dapat dijeda selama maksimal 6 bulan dan ada biaya jeda berkelanjutan sebesar $0,30 USD per bulan ditambah pajak yang berlaku. SIM tidak dapat dijeda selama masa uji coba gratis 90 hari Anda
  • Jumlah lalu lintas data yang sama dengan harga yang sama di mana pun Anda mengoperasikan perangkat di seluruh dunia
  • Layanan seluler terukur dari Konektivitas Arm® Pelion™ – cocok untuk sejumlah besar perangkat di masa depan

Pertanyaan yang Sering Diajukan

Dapatkah Arduino SIM Terhubung ke Internet?

Awalnya Arduino SIM akan terbatas pada konektivitas ke Arduino IoT Cloud saja – dengan kemampuan untuk menjembatani Internet yang lebih luas menggunakan webhook dan API yang akan hadir pada akhir tahun ini.

BAGAIMANA CARA MENJEDA SIM SAYA?

Anda dapat menjeda dan memulai ulang SIM Anda di sini. Harap perhatikan bahwa SIM Anda dapat dijeda selama maksimal 6 bulan dan ada biaya jeda berkelanjutan sebesar $0,30 USD per bulan ditambah pajak yang berlaku. (n.b. SIM tidak dapat dijeda selama masa uji coba gratis 90 hari Anda).
DIMANA SIM SAYA AKAN BEROPERASI?
Anda akan dapat terhubung ke cloud Arduino IoT dari lebih dari 100 negara, memungkinkan Anda menggunakan perangkat Anda di seluruh dunia –

PAPAN APA YANG SIM AKAN BEKERJA?

Awalnya Arduino SIM akan mendukung Arduino MKR GSM 1400 (3G dengan fallback 2G). Ada peta jalan untuk mendukung Arduino MKR NB 1500 (LTE Cat-M dan NB-IoT) yang akan datang. Akhirnya kami berencana untuk membukanya untuk dewan pihak ketiga juga.

Dapatkah Saya Menggunakan SIM Lain?

Ya! Anda bebas menggunakan layanan seluler apa pun yang Anda sukai, dan memasukkan SIM apa pun yang Anda suka ke papan seluler Arduino Anda.

Saya Mengalami Masalah Dengan SIM Arduino Saya

Jika Anda mengalami masalah teknis saat menghubungkan perangkat Anda, pastikan untuk memeriksa forum SIM.

Referensi

  • Arduino MKR GSM 1400 https://store-usa.arduino.cc/products/arduino-mkr-gsm-1400?selectedStore=us

 

 

Rangkaian Motor Servo Arduino

Berikut ini beberapa rangkaian sederhana untuk mengendalikan motor servo dengan Arduino. Motor servo yang dimaksud di sini adalah motor servo radio control. Motor servo radio control memiliki 3 terminal: VCC, GND dan PWM.

Berikut ini contoh motor servo yang dipakai

Kendali Servo Dengan Potensiometer

Pada contoh ini posisi motor servo dikendalikan dengan sebuah potensiometer. Posisi potensiometer dibaca dengan membaca tegangan output dari potensiometer tersebut. Angka tersebut kemudian dipakai untuk mengendalikan posisi motor servo .

Rangkaian motor servo sebagai berikut:

Penjelasan Rangkaian:

Terminal VCC dari motor servo disambung ke catu daya motor

Terminal GND dari motor servo disambung ke GND catu daya motor dan GND Arduino

Terminal PWM dari motor servo disambung ke port 9 pada Arduino

Terminal pinggir Potensiometer disambung ke VCC dan GND pada Arduino

Terminal tengah potensiometer disambung ke pin A0 pada Arduino. Tegangan dari potensiometer akan dibaca sebagai tegangan analog, sehingga harus menggunakan pin input analog dari Arduino.

Sumber tegangan untuk Arduino UNO dapat menggunakan USB ataupun dari POWER PIN. Sumber tegangan untuk motor servo menggunakan baterai ataupun adaptor terpisah. Tegangan baterai untuk motor servo disesuaikan dengan spesifikasi motor servo. Catu daya untuk Arduino dipisah dengan catu daya untuk motor servo, karena biasanya arus yang ditarik oleh motor servo cukup besar sehingga dapat mengganggu tegangan catu daya yang terhubung ke motor servo.

Motor servo seperti HS-311 memerlukan tegangan catu daya antara 4,8 volt sampai 6 volt dengan arus maksimum 800 mA. Jadi pastikan tegangan catu daya dan arusnya sesuai untuk motor servo yang dipakai.

Perangkat lunak untuk Arduino adalah sebagai berikut:

#include <Servo.h>
Servo myservo;  // create servo object to control a servo
int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin
void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}
void loop() {
  val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}

Cara kerja perangkat lunak

Library yang dipakai untuk mengendalikan motor adalah Arduino Servo Library.

Pada bagian setup, pin 9 diset sebagai output motor servo.

Pada fungsi loop() dilakukan proses sebagai berikut:

  • membaca tegangan dari pin A0 untuk mengetahui posisi dari potensiometer dengan fungsi analogRead()
  • angka ini skalanya adalah 0 sampai 1023, sedangkan input motor servo adalah 0 sampai 180, sehingga perlu dilakuan penskalaan dengan fungsi map()
  • tuliskan angka hasil penskalaan ke motor servo
  • tunggu 15 milidetik untuk memberi waktu motor bergerak

Fungsi loop() akan dilakukan berulang-ulang , sehingga posisi motor servo akan mengikuti posisi di potensiometer.

Kendali Servo Bolak-Balik

Pada contoh ini, posisi motor servo beralih dari 0 ke 180 derajat, kemudian kembali ke 0 derajat berulang-ulang.

Rangkaian sebagai berikut

Penjelasan Rangkaian:

Terminal VCC dari motor servo disambung ke catu daya motor

Terminal GND dari motor servo disambung ke GND catu daya motor dan GND Arduino

Terminal PWM dari motor servo disambung ke port 9 pada Arduino

Terminal pinggir Potensiometer disambung ke VCC dan GND pada Arduino

Kode sebagai berikut

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}
void loop() {
  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 >= 0; 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
  }
}

Cara kerja perangkat lunak

Pada fungsi loop(), dilakukan hal berikut:

  • buat suatu for() loop untuk menggerakkan motor dari 0 derajat ke 180 derajat dengan langkah sebesar 1 derajat. Tiap kali geser 1 derajat, lakukan penundaan selama 15 milidetik untuk menunggu motor bergerak.
  • buat suatu for() loop untuk menggerakkan motor dari 0 derajat ke 180 derajat dengan langkah sebesar 1 derajat. Tiap kali geser 1 derajat, lakukan penundaan selama 15 milidetik untuk menunggu motor bergerak.

Referensi

 

Berapa Tegangan Kerja Arduino

Berapakah tegangan kerja Arduino?

Tegangan kerja untuk Arduino Nano dan Arduino UNO adalah 5 volt. Tegangan yang dapat diberikan ke pin-pin Arduino adalah minimum 0 volt, maksimum 5 volt. Perkecualian adalah sebagai berikut: pin RESET dapat menerima tegangan sampai 13 volt. Pin VIN dapat menerima tegangan sampai 20 volt karena di pin tersebut ada regulator DC untuk mengubah tegangan masuk menjadi 5 volt.

Arduino Nano dan Arduino UNO menggunakan prosesor ATmega328. Batas maksimum tegangan pada ATmega328 dapat dilihat di datasheet prosesor ATmega328, di bagian “Absolute Maximum Ratings”. Kutipannya sebagai berikut:

ATmega328 absolute maximum rating
ATmega328 absolute maximum rating

Tegangan pada VIN atau POWER IN tidak langsung dihubungkan ke prosesor ATmega328, melainkan melalui regulator DC. Jadi tegangan maksimumnya tergantung komponen regulator DC yang dipakai.

Pin POWER IN dihubungkan ke regulator 5 volt (NCP1117 pada Arduino UNO dan UA78M05 pada Arduino Nano). NCP1117 maksimal menerima tegangan input 20 volt. UA7805 maksimal menerima input 25 volt. Jika tegangan POWER IN melebihi batas ini, maka regulator 5 volt tersebut akan rusak.

Batas tegangan maksimum pada NCP1117 dapat dibaca pada datasheetnya sebagai berikut:

Tegangan maksimum pada NCP1117
Tegangan maksimum pada NCP1117

Batas tegangan maksimum pada UA78M05 dapat dibaca pada datasheetnya sebagai berikut:

Tegangan maksimal pada UA7805
Tegangan maksimal pada UA7805


Referensi

Apa fungsi pin pada Arduino?

Fungsi pin pada Arduino adalah menghubungkan sinyal-sinyal dari dalam modul Arduino ke luar dan sinyal dari luar Arduino ke dalam.  Setiap pin pada Arduino memiliki fungsi tertentu.

Berikut ini fungsi-fungsi pin pada Arduino UNO

Nama Port Fungsi Utama
Fungsi Lain
Power Jack catu daya 7 sampai 12 volt  
USB type B catu daya 5 volt & komunikasi serial  
IOREF referensi ADC  
RESET pin reset pada ATmega328  
3V3 supply 3,3 volt  
+5V supply 5 volt  
GND ground  
VIN tegangan masuk 7 sampai 12 volt  
A0 input analog & I/O digital  
A1 input analog & I/O digital  
A2 input analog & I/O digital  
A3 input analog & I/O digital  
A4 input analog & I/O digital SDA untuk I2C
A5 input analog & I/O digital SCL untuk I2C
D19 I/O digital  
D18 I/O digital  
AREF Pin referensi ADC (Analog to Digital Converter)  
D13 I/O digital  
D12 I/O digital  
D11 I/O digital OC2A , MOSI
D10 I/O digital OC1B, SS
D9 I/O digital IC1A
D8 I/O digital CLK0 , ICP1
D7 I/O digital AIN1
D6 I/O digital AIN0
D5 I/O digital T1
D4 I/O digital T0
D3 I/O digital INT1
D2 I/O digital INT0
D1 I/O digital TXD
D0 I/O digital RXD
 

Berikut ini daftar pin pada Arduino UNO R3

Pinout Arduino UNO
Pinout Arduino UNO

Apa fungsi pin analog pada Arduino?

  • Pin analog pada Arduino berfungsi menerima sinyal listrik berupa tegangan analog. Tegangan ini diubah oleh ADC (Analog to Digital Converter) menjadi angka digital. ADC pada Arduino UNO dan Arduino Nano memiliki resolusi 10 bit, jadi tegangan analog tersebut akan dibaca oleh perangkat lunak sebagai angka integer 0 sampai dengan 1023.
  • Pin analog pada Arduino UNO hanya ada 6 buah, yaitu A0 , A1, A2, A3, A4 dan A5

Apa fungsi pin digital pada Arduino?

  • Pin digital pada Arduino berfungsi menerima atau mengirim sinyal listrik digital. Tegangan pada pin digital akan dibaca oleh perangkat lunak sebagai angka 0 (jika input tegangan rendah mendekati 0 volt) atau 1 (jika input tegangan tinggi mendekati 5 volt). Fungsi untuk membaca tegangan pada pin digital adalah digitalRead(). Tegangan pada pin digital juga dapat diubah oleh perangkat lunak Arduino dengan fungsi digitalWrite().
  • Semua port pada Arduino dapat difungsikan sebagai input digital maupun output digital.

 

 

Apa perbedaan fungsi void setup () dan void loop ()?

Perbedaan antara fungsi ‘void setup()’ dan ‘void loop()’ pada Arduino adalah sebagai berikut:

  • ‘void setup()’ berisi kode/program yang hanya dijalankan sekali ketika Arduino dinyalakan. Biasanya fungsi setup() ini berisi inisialisasi hardware dan inisialisasi variabel global.
  • ‘void loop()’ berisi kode /program yang dijalankan berulang-ulang tanpa ada berhenti. Biasanya menjalankan fungsi utama dari Arduino tersebut.

Selain setup() dan loop(), sebenarnya ada juga fungsi interupsi yang hanya dijalankan ketika interupsi tertentu diaktifkan. Interupsi eksternal dapat diaktifkan dengan fungsi attachInterrupt(). Interupsi timer dapat diaktifkan dengan library TimerInterrupt.

Sebagai contoh adalah program lampu kedip sederhana dari Arduino sebagai berikut:

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW
  delay(1000);                      // wait for a second
}

Pada program tersebut, setup() berisi inisialisasi pin output untuk lampu LED.

loop() berisi pekerjaan utama sistem mikrokontroler Arduino tersebut, yaitu menyalakan dan mematikan lampu LED berulang-ulang tanpa berhenti.

Referensi

Apa perbedaan pin analog dan digital pada Arduino?

Berikut ini perbedaan pin analog dan digital pada Arduino adalah sebagai berikut:

  • Pin analog menerima sinyal listrik berupa tegangan analog. Tegangan ini diubah oleh ADC (Analog to Digital Converter) menjadi angka digital. ADC pada Arduino UNO dan Arduino Nano memiliki resolusi 10 bit, jadi tegangan analog tersebut akan dibaca oleh perangkat lunak sebagai angka integer 0 sampai dengan 1023.
  • Pin digital pada Arduino menerima sinyal listrik digital. Tegangan pada pin digital akan dibaca oleh perangkat lunak sebagai angka 0 (jika input tegangan rendah mendekati 0 volt) atau 1 (jika input tegangan tinggi mendekati 5 volt).

Sinyal input pada pin analog dibaca dengan fungsi analogRead(), hasilnya adalah angka integer dari 0 sampai 1023.

Sinyal input pada pin digital dibaca dengan fungsi digitalRead(), hasilnya adalah angka 0 atau 1.

Pin analog pada Arduino UNO dan Nano dapat difungsikan sebagai input analog maupun digital.

Pin digital pada Arduino UNO dan Nano hanya dapat difungsikan sebagai input digital.

Referensi

Berapa banyak pin analog pada Arduino UNO?

Berapa banyak pin analog pada Arduino UNO?

Jawab: jumlah pin analog pada Arduino UNO adalah 6 buah yaitu A0, A1, A2 A3, A4 dan A5

Berikut ini posisi pin-pin pada Arduino UNO:

Daftar pin pada Arduino UNO R3
Daftar pin pada Arduino UNO R3

Pin analog terdapat pada bagian kiri bawah. Pin analog tersebut multi fungsi , yaitu dapat berfungsi sebagai pin analog (input) maupun pin digital (input dan output).

Apa yang dimaksud dengan pin pada Arduino?

Yang dimaksud dengan pin pada Arduino adalah kontak elektrik yang terdapat pada modul Arduino. Kontak elektrik ini berfungsi untuk menyambungkan sinyal listrik dari modul Arduino ke perangkat lain di luar Arduino.

Berikut ini foto pin berbentuk batang-batang serupa jarum pada Arduino Nano

Arduino Nano tampak samping
Arduino Nano tampak samping

Setiap pin pada Arduino tersebut memiliki fungsi tertentu yang berbeda-beda. Untuk mengetahui fungsinya kita mesti membaca datasheet dari modul Arduino tersebut.

Berikut ini adalah daftar fungsi setiap pin pada Arduino Nano

Kontak elektrik pada Arduino UNO menggunakan lubang-lubang, bukan berupa pin. Berikut ini foto Arduino UNO dengan kontak elektrik berupa plastik hitam yang di dalamnya terdapat kontak elektrik.

Referensi

  • Arduino Nano Pinout https://docs.arduino.cc/hardware/nano
  • Datasheet Arduino Nano https://docs.arduino.cc/resources/datasheets/A000005-datasheet.pdf
  • Electrical Connector https://en.wikipedia.org/wiki/Electrical_connector

 

 

 

 

Pengukuran Frekuensi ADC pada Arduino Nano ATmega328

Pengukuran Frekuensi ADC internal pada Arduino Nano ATmega328

berikut ini kode yang dipakai untuk pengukuran

int counter;  // how many iterations
int time_begin = 0;
int time_end = 0;
int duration;

int sensorPin = A0;   // select the input pin for the potentiometer
int ledPin = 13;      // select the pin for the LED

void setup() {
  Serial.begin(115200);
  counter = 0;
  pinMode(2, OUTPUT);
  Serial.println("start benchmark");
}
//---------------------------------------------------
void loop() {
  int value;  // angka yang ditulis
  value = 0;  // minimum value
  analogRead(sensorPin);
  PORTD=0; // langsung akses port supaya lebih cepat
  analogRead(sensorPin);
  PORTD=255;
  counter = counter + 1;
  if (counter >= 10000) {
    float period;
    int time_now = millis();
    counter = 0;
    duration = time_now - time_begin;
    period = duration / 10000.0 /2;
    Serial.print("period (ms): ");
    Serial.println(period);
    //  prepare next round
    time_begin = time_now;
  }
}

Hasil Pengukuran

Pengukuran output pada pin D2 dengan osiloskop menghasilkan sinyal berikut

Dari data port serial, didapatkan angka perioda 0,11 ms

start benchmark
period (ms): 0.11
period (ms): 0.11
period (ms): 0.11
period (ms): 0.11
period (ms): 0.11

Dengan osiloskop didapatkan sinyal kotak dengan frekuensi 4,45532 kHz . Artinya frekuensi ADC adalah dua kalinya, yaitu 8,91064 kHz

Angka 8900 Hz ini sesuai dengan pengukuran di artikel lain: https://chisight.wordpress.com/2016/03/25/speeding-up-the-adc-on-an-arduino-atmega-328p/

Kesimpulan

Frekuensi ADC adalah 8,91064 kHz

Frekuensi ini jauh di bawah kecepatan teoritis. Kemungkinan kelambatan karena library yang dipakai.

Referensi

  • Open Music Labs : ATmega ADC
  • https://www.ee-diary.com/2022/08/programming-atmega328p-adc-in-c.html#
  • https://chisight.wordpress.com/2016/03/25/speeding-up-the-adc-on-an-arduino-atmega-328p/
  • Kode di https://github.com/waskita/embedded/tree/master/nano-adc

Frekuensi DAC MCP4725 pada Arduino Nano ATmega328

Pada percobaan ini diukur frekuensi & perioda konversi DAC (Digital to Analog Converter) tipe MCP4725  pada modul Arduino Nano dengan prosesor ATmega328.

Rangkaian sistem adalah sebagai berikut

 

Kode yang dipakai untuk pengujian adalah sebagai berikut:

// idea from https://learn.sparkfun.com/tutorials/mcp4725-digital-to-analog-converter-hookup-guide/all
#define MCP4725_ADDR 0x60
#include <Wire.h>  //Include the Wire library to talk I2C

int counter;  // how many iterations
int time_begin = 0;
int time_end = 0;
int duration;
void setup() {
  Wire.begin();
  Serial.begin(115200);
  counter = 0;
  Serial.println("start benchmark");
}
//---------------------------------------------------
void loop() {
  int value;  // angka yang ditulis
  value = 0;  // minimum value
  Wire.beginTransmission(MCP4725_ADDR);
  Wire.write(64);                 // cmd to update the DAC
  Wire.write(value >> 4);         // the 8 most significant bits...
  Wire.write((value & 15) << 4);  // the 4 least significant bits...
  Wire.endTransmission();

  value = 4095;  // maximum value
  Wire.beginTransmission(MCP4725_ADDR);
  Wire.write(64);                 // cmd to update the DAC
  Wire.write(value >> 4);         // the 8 most significant bits...
  Wire.write((value & 15) << 4);  // the 4 least significant bits...
  Wire.endTransmission();

  counter = counter + 1;
  if (counter >= 10000) {
    float  period;
    int time_now = millis();
      counter = 0;
    duration = time_now - time_begin;
    period = duration / 10000.0 / 2.0 ;
    Serial.print("period (ms): ");
    Serial.println(period);
    //  prepare next round
    time_begin = time_now;
  }
}

I2C 100 kHz

ATmega328 menggunakan 2 frekuensi I2C: 100 kHz dan 400 kHz. Percoban pertama menggunakan kecepatan default adalah 100 kHz.

Sinyal yang dihasilkan pada output MCP4725 adalah sebagai berikut:

Tampilan pada serial monitor adalah sebagai berikut:

start benchmark
period (ms): 0.43
period (ms): 0.43
period (ms): 0.43
period (ms): 0.43
period (ms): 0.43
period (ms): 0.43

Pengukuran dengan osiloskop menunjukkan sinyal persegi dengan frekuensi 1,166 kHz

Jumlah transisi adalah 2x frekuensi ini, jadi frekuensi konversi adalah 1,166 x 2 = 2,332 kHz

I2C 400 kHz

Pada pengukuran ini, kecepatan I2C dinaikkan menjadi 400 kHz. Caranya menggunakan fungsi Wire.setClock()

Perioda menjadi 0,15 ms

start benchmark
period (ms): 0.15
period (ms): 0.15
period (ms): 0.15
period (ms): 0.15
period (ms): 0.15

Output DAC diukur dengan osiloskop, dengan hasil sebagai berikut

Frekuensi output adalah 3,41733 kHz, sehingga frekuensi DAC adalah 2x 3,417 = 6,834 kHz

Kesimpulan

Dengan clock I2C 100 kHz, didapatkan

  • Perioda konversi ADC adalah 0,43 ms
  • frekuensi konversi ADC adalah 2,332 kHz

Dengan clock I2C 400 kHz, didapatkan

  • Perioda konversi ADC adalah 0,15 ms
  • frekuensi konversi ADC adalah 6,384 kHz

Referensi

Komunikasi Nirkabel untuk Mikrokontroler

Komunikasi Nirkabel (wireless) untuk mikrokontroler/mikroprosesor pada pita frekuensi ISM (Industrial Scientific Medical).

Frekuensi 433 MHz

Modul CC1101

Chip CC1101 ini adalah buatan Texas Instruments. Berikut ini contoh modul wireless yang menggunakan chip CC1101

Modul CC1101
Modul CC1101

Datasheet CC1101: https://www.ti.com/product/CC1101

Modul HC-12

Datasheet HC-12: http://statics3.seeedstudio.com/assets/file/bazaar/product/HC-12_english_datasheets.pdf

Frekuensi 915 MHz

LORA

Modul LORA

Referensi: https://en.wikipedia.org/wiki/LoRa

Frekuensi 2,4 GHz

Protokol WiFi (IEEE 802.11)

Contoh perangkat dengan WiFi yang populer adalah ESP32 dan ESP8266

ESP8266 NodeMCU (kiri), ESP32 DevkitC (tengah), ESP32 Lolin32 Lite (kanan)
ESP8266 NodeMCU (kiri), ESP32 DevkitC (tengah), ESP32 Lolin32 Lite (kanan)

Protokol Bluetooth

Perangkat mikrokontroler dengan protokol bluetooth misalnya adalah ESP32

Protokol lain

Contoh protokol di frekuensi 2,4 GHz lainnya adalah NRF24L01 buatan Nordic Semiconductor

Datasheet: https://www.mouser.com/datasheet/2/297/nRF24L01_Product_Specification_v2_0-9199.pdf

Situs resmi NRF24: https://www.nordicsemi.com/Products/nRF24-series

 

 

Lampu On Off dengan 2 Tombol

Pada artikel ini diuraikan lampu kedip yang dapat dimatikan dan dinyalakan dengan 2 buah tombol push button.

Deskripsi sistem

Proses menggunakan input 2 tombol pushbutton, pb1 dan pb2. Lalu ada output 1 buah LED. Jika pb1 ditekan, maka LED menyala selama 10 detik, kemudian padam sendiri. Jika pb2 ditekan, maka LED langsung padam, meskipun dia menyala kurang dari 10 menit.

Model State Chart / Finite State Machine

Berikut ini model FSM dari sistem tersebut

FSM ini menggunakan konsep mesin Mealy, artinya output berubah tergantung input dan state saat itu. Jadi perubahan output mesti dinyatakan secara eksplisit pada setiap transisi.

FSM yang dipakai menggunakan konsep ‘extended state machine’ untuk memungkinkan delay 10 menit. Delay 10 menit kalau dibuat dengan FSM biasa akan memerlukan banyak sekali state. Untuk menghemat jumlah state, maka digunakan variabel ‘counter’ untuk menggantikan state yang banyak.

Kondisi awal sistem adalah LED mati (OFF), untuk itu ditandai dengan trainsisi “true / LED=OFF”. ‘true’ artinya transisi ini terjadi tanpa syarat. ‘LED=OFF’ artinya LED mati.

Ada 2 state pada sistem, yaitu OFF dan ON. OFF artinya lampu mati, ON artinya lampu menyala.

Pada state OFF, lampu tetap mati selama tombol PB1 tidak ditekan. Hal ini ditandai dengan transisi ‘PB=0 / LED=OFF’. PB=0 adalah syarat transisi tersebut.

Pada state OFF, jika tombol PB1 ditekan maka akan terjadi transisi ke state ON, dan lampu menyala. Hal ini dinyatakan dengan transisi ‘PB1=1 / LED=ON’. Transisi ini juga mereset variabel ‘counter’ menjadi 0 , untuk persiapan memulai proses menunggu maksimum 10 menit.

Setelah lampu menyala, maka lampu akan menyala selama 10 menit jika tombol PB2 tidak ditekan. Hal ini dilakukan dengan transisi ‘PB2=0 / LED=0, counter=counter+1’. Tiap kali tombol PB2 tidak ditekan, angka pada counter dinaikkan 1. Jika angka counter sudah melewati batas tertentu (10 menit), maka terjadi transisi ke state OFF. Hal ini dilakukan dengan transisi ‘counter>10*60 / LED=OFF’, artinya ini adalah transisi bersyarat nilai variabel ‘counter’. Perubahan ke state OFF juga dapat terjadi jika tombol PB2 ditekan. Untuk itu ditambahkan ‘or’ pada syarat transisi dari ON ke OFF.

Perangkat Keras

Rangkaian lampu on-off  dengan breadboard. Mikroprosesor Arduino Nano ATmega328,  2 buah push button, 1 buah LED dengan resistor 1k
Rangkaian lampu on-off
  • Prosesor menggunakan Arduino Nano ATmega328
  • Lampu dengan LED merah, diseri dengan resistor 1 kilo ohm
  • Input 2 buah push button dengan konfigurasi active low.

Perangkat Lunak

Versi Interupsi

// lampu on-off dengan 2 tombol model FSM dan timer one
// https://www.arduino.cc/reference/en/libraries/timerone/
// To install, cari library timerone dari Sketch -> Include Library -> Manage Libraries

#include <TimerOne.h>
#define STATE_INITIAL    100
#define STATE_ON    101
#define STATE_OFF   102
#define SWITCH_PB1 3
#define SWITCH_PB2 2
#define LED_OUTPUT 4

#define TIMEOUT 100
int state = STATE_INITIAL;
int counter=0;

void setup() {
  int output = 0;
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(LED_OUTPUT, OUTPUT);
  pinMode(SWITCH_PB1, INPUT_PULLUP);
  pinMode(SWITCH_PB2, INPUT_PULLUP);
  Serial.begin(115200);
  Serial.println(__FILE__);
  fsm_output(output);
  Timer1.initialize(100000); // delay dalam microsecond
  Timer1.attachInterrupt(ISR_Timer1);
}

void loop() {
}

void fsm(int  *state, int *out, int pb1, int pb2, int *counter) {
  switch (*state) {
    case STATE_INITIAL: { // initial state
        *state = STATE_OFF;
        *out = 0;
        break;
      }
    case STATE_ON: {
        if (pb2 == 0) {
          // tetap
          if (*counter >= TIMEOUT) {
            *state = STATE_OFF;
            *out = 0;
          } else {
            *counter = *counter + 1; // tunggu timeout
            *state = STATE_ON;
            *out = 1;
          }
        } else {
          *state = STATE_OFF;
          *out = 0;
        }
        break;
      }
    case STATE_OFF: {
        if (pb1 == 0) {
          // tetap
          *state = STATE_OFF;
          *out = 0;
        } else {
          *counter = 0;
          *state = STATE_ON;
          *out = 1;
        }
        break;
      }
  }
}

void fsm_output(int output_value) {
  if (output_value == 1) {
    digitalWrite(LED_OUTPUT, HIGH);
  } else {
    digitalWrite(LED_OUTPUT, LOW);
  }
}

void ISR_Timer1(void)
{
  int output = 0;
  int pb1, pb2, switch1, switch2;
  switch1 = digitalRead(SWITCH_PB1);
  switch2 = digitalRead(SWITCH_PB2);
  if (switch1 == 1)
    pb1 = 0;
  else {
    pb1 = 1;
  }
  if (switch2 == 1)
    pb2 = 0;
  else {
    pb2 = 1;
  }
  fsm(&state, &output, pb1, pb2, &counter);
  fsm_output(output);
  Serial.print("state: ");
  Serial.print(state);
  Serial.print(" pb1: ");
  Serial.print( pb1);
  Serial.print(" pb2: ");
  Serial.print( pb2);
  Serial.print(" counter: ");
  Serial.print( counter);
  Serial.print(" output: ");
  Serial.print( output);
  Serial.println();
}

Versi Delay

Berikut ini code tanpa interupsi, hanya menggunakan delay()

// lampu on-off dengan 2 tombol model FSM dan delay

#define STATE_INITIAL    100
#define STATE_ON    101
#define STATE_OFF   102
#define SWITCH_PB1 3
#define SWITCH_PB2 2
#define LED_OUTPUT 4
#define PERIOD_MS 10 // perioda delay dalam milisecond
#define TIMEOUT 10 // TIMEOUT dalam detik
int state = STATE_INITIAL;
int counter = 0;

void setup() {
  int output = 0;
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(LED_OUTPUT, OUTPUT);
  pinMode(SWITCH_PB1, INPUT_PULLUP);
  pinMode(SWITCH_PB2, INPUT_PULLUP);
  Serial.begin(115200);
  Serial.println(__FILE__);
  fsm_output(output);
}

void loop() {
  mainloop();
  delay(PERIOD_MS);
}

void fsm(int  *state, int *out, int pb1, int pb2, int *counter) {
  switch (*state) {
    case STATE_INITIAL: { // initial state
        *state = STATE_OFF;
        *out = 0;
        break;
      }
    case STATE_ON: {
        if (pb2 == 0) {
          // tetap
          if (*counter >= TIMEOUT * 1000 / PERIOD_MS) {
            *state = STATE_OFF;
            *out = 0;
          } else {
            *counter = *counter + 1; // tunggu timeout
            *state = STATE_ON;
            *out = 1;
          }
        } else {
          *state = STATE_OFF;
          *out = 0;
        }
        break;
      }
    case STATE_OFF: {
        if (pb1 == 0) {
          // tetap
          *state = STATE_OFF;
          *out = 0;
        } else {
          *counter = 0;
          *state = STATE_ON;
          *out = 1;
        }
        break;
      }
  }
}

void fsm_output(int output_value) {
  if (output_value == 1) {
    digitalWrite(LED_OUTPUT, HIGH);
  } else {
    digitalWrite(LED_OUTPUT, LOW);
  }
}

void mainloop(void)
{
  int output = 0;
  int pb1, pb2, switch1, switch2;
  switch1 = digitalRead(SWITCH_PB1);
  switch2 = digitalRead(SWITCH_PB2);
  if (switch1 == 1)
    pb1 = 0;
  else {
    pb1 = 1;
  }
  if (switch2 == 1)
    pb2 = 0;
  else {
    pb2 = 1;
  }
  fsm(&state, &output, pb1, pb2, &counter);
  fsm_output(output);


  // cetak jika ada perubahan state , atau sudah 1 detik berlalu
  static int prev_state = 0;
  static int display_counter = 0;

  if (prev_state != state || display_counter > 1000 / PERIOD_MS) {
    Serial.print("state: ");
    if (state == STATE_ON) {
      Serial.print("ON  ");
    } else if (state == STATE_OFF) {
      Serial.print("OFF ");
    } else {
      Serial.print(state);
    }

    Serial.print(" pb1: ");
    Serial.print(pb1);
    Serial.print(" pb2: ");
    Serial.print(pb2);
    Serial.print(" c: ");
    Serial.print( counter);
    Serial.print(" out: ");
    Serial.print(output);
    Serial.println();
    prev_state = state;
    display_counter = 0;
  }
  display_counter++;

}

Demonstrasi

demonstrasi versi 1

Demonstrasi versi 2

Contoh lain sistem mikrokontroler dengan finite state machine: https://elektrologi.iptek.web.id/contoh-implementasi-finite-state-machine-dengan-mikrokontroler/

Perbedaan Arduino dan Programmable Logic Controller (PLC)

Arduino adalah kerangka kerja untuk membuat sistem elektronik open-source yang meliputi sejumlah perangkat keras dan perangkat lunak. Sebagian perangkat keras Arduino menggunakan prosesor/mikrokontroler dari keluarga ATmega. Perangkat keras yang kompatibel dengan Arduino meliputi modul mikrokontroler buatan Arduino serta berbagai modul mikrokontroler lain yang sudah dibuat librarynya supaya kompatibel dengan Arduino. Bahasa pemrograman yang dipakai untuk mengembangkan aplikasi pada Arduino adalah C/C++.

PLC atau Programmable Logic Controller atau terjemahannya “pengontrol yang dapat diprogram” adalah komputer untuk keperluan industri yang telah dibuat kokoh dan disesuaikan untuk mengontrol proses manufaktur di pabrik, seperti jalur perakitan, mesin-mesin pabrik, perangkat robot, atau aktivitas apa pun yang memerlukan keandalan tinggi, kemudahan pemrograman, dan diagnosa jika ada kesalahan proses.

Perangkat PLC untuk monitoring pabrik farmasi
Perangkat PLC untuk monitoring pabrik farmasi

Tabel Perbedaan Arduino dan Programmable Logic Controller

Aspek Arduino PLC
Keandalan tergantung implementasi hardware & software tinggi sesuai standar industri NEMA/IEC dan sebagainya
Ukuran relatif kecil relatif besar
Aplikasi bebas, fleksibel industri, otomasi
Bahasa pemrograman Relatif rendah: C dan C++

Relatif tinggi, seperti:

  • Ladder Diagram
  • Instruction List
  • Structured Text
  • Function Block Diagram
  • Sequential Function Chart
Skalabilitas Untuk sistem yang besar, perlu proses rekayasa yang cukup kompleks. mudah untuk dikembangkan, modul-modul sudah tersedia
Real Time Perlu rekayasa di antaranya dengan menggunakan sistem operasi real time (RTOS) sudah dirancang real-time
Mikrokontroler menggunakan berbagai macam mikrokontroler yang berpengaruh terhadap proses rekayasa sistem. Secara internal menggunakan mikrokontroler / mikroprosesor, namun pemakai tidak dipusingkan oleh jenis mikrokontroler yang dipakai.
Fleksibilitas Sangat fleksibel tergantung kreatifitas perekayasa / pembuat konfigurasi sesuai dengan modul yang tersedia dari pabrikan
Komputasi fleksibel tergantung jenis mikrokontroler yang dipakai relatif lambat
Biaya murah untuk sistem yang sederhana harga lebih mahal terutama untuk sistem yang sederhana
Bentuk & Ukuran bentuk bebas, karena Arduino hanya mikrokontrolernya saja Bentuk sudah tertentu, karena umumnya untuk dipasang di rak dengan standar ukuran tertentu
Arsitektur software semua periferal dan memori pada Arduino dapat diatur secara bebas. Arsitektur software bebas. sudah tertentu

Referensi