Oleh Muhammad Ilyasaa dalam Tutorial Arduino
Tahap Kesukaran : Pertengahan, Mempunyai Asas Arduino

Belum mempunyai asas arduino? Jika Ya, lakukan tutorial yang lebih mudah dahulu

>> Arduino Mengawal Kontras Paparan LCD 16×2 Menggunakan Perintang Boleh Laras

Sistem di bawah ini tidaklah direka untuk kegunaan Sistem Digital AmMeter Komersial. Ianya direka untuk tujuan pembelajaran reka cipta elektronik. Walau bagaimanapun, konsep ini boleh diguna pakai dalam membina Sistem Digital AmMeter Komersial yang sebenar.

>> pengenalan <<

Untuk projek DIY kali ini, kita akan membuat satu sistem yang boleh memperlihatkan bacaan arus DC. Di mana kita akan membina satu sistem pengawal yang bertindak untuk membaca bacaan sensor arus dan menunjukkan bacaan tersebut pada paparan LCD 20×4. Sensor arus DC tersebut akan membaca bacaan arus yang melalui motor DC yang bertindak sebagai beban elektronik.

Projek DIY digital amMeter mengukur arus DC ini dibahagikan kepada beberapa tutorial kecil bagi memudahkan pembaca untuk membuat sistem DIY ini :

  1. Persediaan paparan LCD 20×4
  2. Penambahan fungsi bacaan analog
  3. Penambahan litar motor sebagai beban
  4. Penambahan sensor arus DC
  5. Penukaran nilai digital kepada ampere
  6. Semakkan bacaan menggunakan multimeter

>> Komponen Apa yang anda perlukan <<

Untuk projek DIY digital amMeter mengukur arus DC ini, anda perlukan :

>> Persediaan Paparan LCD 20×4 <<

Kita akan membuat litar untuk menghubungkan bekalan kuasa luar 9V, papan Arduino Uno dan paparan LCD 20×4. Anda bebas untuk membuat sambungan sama ada terus di atas papan prototaip atau papan projek. Di dalam penulisan ini, saya akan menggunakan papan projek.

Paparan LCD merupakan antara komponen elektronik yang amat penting. Ini kerana pengguna dapat mengetahui apa yang sedang berlaku di dalam mikropengawal melalui perantaraan paparan LCD. Dalam penulisan ini, kita akan menggunakan paparan LCD 20×4 bagi melihat nilai :

  1. Nilai tetapan offset voltan VCC dalam unit digital (0 sehingga 1023)
  2. Nilai tetapan kelajuan dalam unit digital (0 sehingga 1023)
  3. Nilai bacaan sensor arus dalam unit digital (0 sehingga 1023)
  4. Nilai bacaan arus dalam unit Ampere (-2.5A sehingga 2.5A)

Fail Fritzing : 00_arduino_acs712_part_LCD.fzz

Litar sambungan persediaan paparan LCD 20×4

#include <LiquidCrystal.h>

const int rs = 2, en = 4, d4 = 8, d5 = 9, d6 = 10, d7 = 11;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() 
{
  lcd.begin(20, 4);
}

void loop() 
{
  lcd.setCursor(0, 0); 
  lcd.print("XXXXXXXXXXXXXXXXXXXX");
  lcd.setCursor(0, 1); 
  lcd.print("XXXXXXXXXXXXXXXXXXXX");
  lcd.setCursor(0, 2); 
  lcd.print("XXXXXXXXXXXXXXXXXXXX");
  lcd.setCursor(0, 3); 
  lcd.print("XXXXXXXXXXXXXXXXXXXX");     

  delay(2000);

  lcd.setCursor(0, 0); 
  lcd.print("ZZZZZZZZZZZZZZZZZZZZ");
  lcd.setCursor(0, 1); 
  lcd.print("ZZZZZZZZZZZZZZZZZZZZ");
  lcd.setCursor(0, 2); 
  lcd.print("ZZZZZZZZZZZZZZZZZZZZ");
  lcd.setCursor(0, 3); 
  lcd.print("ZZZZZZZZZZZZZZZZZZZZ");

  delay(2000);
}

Kod Arduino persediaan paparan LCD 20×4

Siapakan litar dan mula untuk memuat naik kod tutorial Persediaan paparan LCD 20×4 di atas ke dalam papan Arduino Uno. Selepas berjaya memuat naik, jangan lupa untuk hubungkan Female DC Jack Adapter kepada bekalan kuasa luar 9V.

Hal ini kerana di tutorial Penambahan litar motor sebagai beban kelak memerlukan bekalan kuasa yang tinggi. USB port yang terdapat pada komputer atau laptop hanya mampu membekalkan bekalan kuasa yang rendah jika dibandingkan dengan bekalan kuasa luar yang mampu membekalkan arus yang lebih tinggi.

Anda juga mesti melaraskan kontras paparan LCD kepda paras yang bersesuaian, gunakan pemutar skru untuk melaraskan komponen perintang boleh laras. Jika anda menyambung litar dan memasukan kod dengan betul serta melaraskan paras kontras pada tahap yang bersesuaian, paparan LCD 20×4 akan berselang seli menunjukkan huruf X dan huruf Z.

Di bawah adalah versi video bagi tutorial persediaan paparan LCD 20×4. Video menunjukkan paparan LCD 20×4 sedang berselang seli menunjukkan huruf X dan huruf Z.

Jika anda perasan, terdapat ralat pada tajuk di dalam video berkenaan. Abaikannya!

>> Penambahan fungsi bacaan analog <<

Paparan LCD 20×4 kita sudah berjaya dihidupkan dan berfungsi. Kita akan meneruskan projek DIY kita dengan menambah fungi pada kod kita untuk membaca bacaan analog yang akan diperolah daripada dua biji komponen perintang boleh laras. Kita akan menambah dua lagi perintang boleh laras pada litar yang akan digunakan bagi :

  1. Menetapkan nilai tetapan offset voltan VCC
  2. Menetapkan nilai tetapan kelajuan

Fail Fritzing : 01_arduino_acs712_part_Analog.fzz

Litar sambungan penambahan fungsi bacaan analog

#include <LiquidCrystal.h>

const int rs = 2, en = 4, d4 = 8, d5 = 9, d6 = 10, d7 = 11;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

int offsetPin = A0;
int offsetValue = 0;

int speedPin = A1;
int speedValue = 0;

void setup() 
{
  lcd.begin(20, 4);
  
  lcd.clear();
  lcd.home();
  
  lcd.setCursor(0, 0); 
  lcd.print("Offset Value  :");
  lcd.setCursor(0, 1); 
  lcd.print("Speed Value   :");
  lcd.setCursor(0, 2); 
  lcd.print("Reading Value :");
  lcd.setCursor(0, 3); 
  lcd.print("Current Value :");          
}

void loop() 
{
  offsetValue = analogRead(offsetPin);
  speedValue = analogRead(speedPin);

  lcd.setCursor(16, 0);   
  lcd.print("    ");  
  lcd.setCursor(16, 0); 
  lcd.print(offsetValue);
  lcd.setCursor(16, 1);   
  lcd.print("    ");    
  lcd.setCursor(16, 1); 
  lcd.print(speedValue);     

  delay(50);
}

Kod Arduino penambahan fungsi bacaan analog

Siapakan litar dan mula untuk memuat naik kod tutorial Penambahan fungsi bacaan analog di atas ke dalam papan Arduino Uno. Selepas berjaya memuat naik, paparan LCD 20×4 akan menunjukkan perkataan seperti gambar di bawah.

Nilai yang ditunjukkan disebelah “Offset Value” adalah nilai yang digunakan untuk mengimbangi nilai VCC 5V yang tidak tepat manakala nilai yang ditunjukkan disebelah “Speed Value” adalah nilai yang digunakan untuk mengawal kelajuan motor arus terus.

Perintang boleh laras yang ditunjukkan oleh anak panah bewarna merah adalah perintang untuk menetapkan nilai tetapan Offset manakala perintang boleh laras yang ditunjukkan oleh anak panah bewarna biru adalah perintang untuk menetapkan nilai tetapan kelajuan motor arus terus. Video di bawah menunjukkan paparan LCD 20×4 memaparkan nilai perintang boleh laras.

>> Penambahan litar motor sebagai beban <<

Sekarang kita akan membuat litar yang boleh mengawal kelajuan motor arus terus. Dengan kata lain, semakin laju kelajuan motor arus terus, semakin tinggi arus yang digunakan oleh motor arus terus.

Fail Fritzing : 02_arduino_acs712_part_Motor.fzz

Litar sambungan penambahan litar motor sebagai beban

#include <LiquidCrystal.h>

const int rs = 2, en = 4, d4 = 8, d5 = 9, d6 = 10, d7 = 11;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

int offsetPin = A0;
long int offsetValue = 0;

int speedPin = A1;
long int speedValue = 0;

int speedControlPin = 6;
int speedControlValue = 0;

int avarageValue = 1000;
int resetLCD = 10;
int counterLCD = resetLCD - 1;
int maxSpeed = 150;

void setup() 
{
  lcd.begin(20, 4);
  
  lcd.clear();
  lcd.home();
}

void loop() 
{
  delay(50);
  counterLCD++;

  if( counterLCD == resetLCD )
  {
    counterLCD = 0;
    
    lcd.begin(20, 4);
    lcd.setCursor(0, 0); 
    lcd.print("Offset Value  :");
    lcd.setCursor(0, 1); 
    lcd.print("Speed Value   :");
    lcd.setCursor(0, 2); 
    lcd.print("Reading Value :");
    lcd.setCursor(0, 3); 
    lcd.print("Current Value :");  
  }
  
  offsetValue = 0;
  for(int i=0; i<avarageValue; i++ )
  {
    offsetValue = offsetValue + analogRead(offsetPin);
  }
  offsetValue = offsetValue / avarageValue;

  speedValue = 0;
  for(int i=0; i<avarageValue; i++ )
  {  
    speedValue = speedValue + analogRead(speedPin);
  }
  speedValue = speedValue / avarageValue;

  speedControlValue = map(speedValue, 0, 1023, 0, maxSpeed);
  analogWrite(speedControlPin, speedControlValue);

  lcd.setCursor(16, 0);   
  lcd.print("    ");  
  lcd.setCursor(16, 0); 
  lcd.print(offsetValue);
  lcd.setCursor(16, 1);   
  lcd.print("    ");    
  lcd.setCursor(16, 1); 
  lcd.print(speedValue);             
}

Kod Arduino penambahan litar motor sebagai beban

Siapakan litar dan mula untuk memuat naik kod tutorial Penambahan litar motor sebagai beban di atas ke dalam papan Arduino Uno. Selepas berjaya memuat naik, kini anda boleh mengawal kelajuan motor arus terus dengan menggunakan perintang boleh laras yang boleh menetapakan nilai kelajuan motor arus terus. Video di bawah menunjukkan bagaimana kelajuan motor arus terus boleh dikawal melalui isyarat perintang boleh laras.

>> Penambahan sensor arus DC <<

Kita akan menambah sensor arus DC untuk mengukur arus yang melalui motor arus terus. Gambar di atas menunjukkan laluan arus dari terminal positif bekalan punca kuasa 9V melalui motor arus terus dan kembali ke terminal negatif bekalan punca kuasa 9V. Sensor arus DC akan diletakkan pada laluan arus ini.

Fail Fritzing : 03_arduino_acs712_part_ACS712.fzz

Litar sambungan penambahan sensor arus DC

#include <LiquidCrystal.h>

const int rs = 2, en = 4, d4 = 8, d5 = 9, d6 = 10, d7 = 11;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

int offsetPin = A0;
long int offsetValue = 0;

int speedPin = A1;
long int speedValue = 0;

int readingPin = A5;
long int readingValue = 0;

int speedControlPin = 6;
int speedControlValue = 0;

int avarageValue = 1000;
int resetLCD = 10;
int counterLCD = resetLCD - 1;
int maxSpeed = 150;

void setup() 
{
  lcd.begin(20, 4);
  
  lcd.clear();
  lcd.home();
}

void loop() 
{
  delay(50);
  counterLCD++;

  if( counterLCD == resetLCD )
  {
    counterLCD = 0;
    
    lcd.begin(20, 4);
    lcd.setCursor(0, 0); 
    lcd.print("Offset Value  :");
    lcd.setCursor(0, 1); 
    lcd.print("Speed Value   :");
    lcd.setCursor(0, 2); 
    lcd.print("Reading Value :");
    lcd.setCursor(0, 3); 
    lcd.print("Current Value :");  
  }
  
  offsetValue = 0;
  for(int i=0; i<avarageValue; i++ )
  {
    offsetValue = offsetValue + analogRead(offsetPin);
  }
  offsetValue = offsetValue / avarageValue;

  speedValue = 0;
  for(int i=0; i<avarageValue; i++ )
  {  
    speedValue = speedValue + analogRead(speedPin);
  }
  speedValue = speedValue / avarageValue;

  speedControlValue = map(speedValue, 0, 1023, 0, maxSpeed);
  analogWrite(speedControlPin, speedControlValue);

  readingValue = 0;
  for(int i=0; i<avarageValue; i++ )
  {  
    readingValue = readingValue + analogRead(readingPin);
  }
  readingValue = readingValue / avarageValue;


  lcd.setCursor(16, 0);   
  lcd.print("    ");  
  lcd.setCursor(16, 0); 
  lcd.print(offsetValue);
  lcd.setCursor(16, 1);   
  lcd.print("    ");    
  lcd.setCursor(16, 1); 
  lcd.print(speedValue);             
  lcd.setCursor(16, 2);   
  lcd.print("    ");    
  lcd.setCursor(16, 2); 
  lcd.print(readingValue);            
}

Kod Arduino penambahan sensor arus DC

Siapakan litar dan mula untuk memuat naik kod tutorial Penambahan sensor arus DC sebagai beban di atas ke dalam papan Arduino Uno. Selepas berjaya memuat naik, kini anda boleh melihat bacaan arus dalam bentuk digital (nilai di sebelah “Reading Value“) apabila kelajuan motor arus terus dinaikkan menggunakan perintang boleh laras.

Video di bawah menunjukkan bagaimana bacaan arus yang melalui motor arus terus bertindak balas terhadap peningkatan kelajuan motor arus terus yang dikawal melalui isyarat perintang boleh laras.

Jika anda perasan (pada awal video), nilai bacaan digital ketika tiada arus adalah sepatutnya 1024 dibahgi dengan 2 iaitu 512 ataupun nilai bacaan voltan VCC (5V) dibahagi 2 iaitu 2.5V. Walau bagaimanapun, VCC di dunia sebenar tidaklah tepat berada pada paras 5V, selalunya atau kebiasaanya adalah 4.8V atau 4.9V atau 5.1V. Jarang sekali ianya tepat berada pada paras 5V.

>> Penukaran nilai digital kepada ampere <<

readingValueInVolt = ( (readingValue / 1024.0) * 5000
offsetValueInVolt = ( (offsetValue / 1024.0) * 5000
actualCurrent = ((readingValueInVolt – offsetValueInVolt) / mVperAmp)

Di tutorial penambahan sensor arus sebelum ini kita telah melihat bacaan arus terus dalam bentuk digital. Sekarang kita akan tukarkan nilai digital tersebut kepada unit ampere. Kita akan menggunakan formula di atas untuk menukarkan nilai digital kepada nilai ampere.

Fail Fritzing : 04_arduino_acs712_part_current.fzz

Litar sambungan penukaran nilai digital kepada ampere

#include <LiquidCrystal.h>

const int rs = 2, en = 4, d4 = 8, d5 = 9, d6 = 10, d7 = 11;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

int offsetPin = A0;
long int offsetValue = 0;
float offsetValueInVolt = 0;

int speedPin = A1;
long int speedValue = 0;

int readingPin = A5;
long int readingValue = 0;
float readingValueInVolt = 0;

float mVperAmp = 185;
float actualCurrent = 0;

int speedControlPin = 6;
int speedControlValue = 0;

int avarageValue = 1000;
int resetLCD = 10;
int counterLCD = resetLCD - 1;
int maxSpeed = 150;

void setup() 
{
  lcd.begin(20, 4);
  
  lcd.clear();
  lcd.home();
}

void loop() 
{
  delay(50);
  counterLCD++;

  if( counterLCD == resetLCD )
  {
    counterLCD = 0;
    
    lcd.begin(20, 4);
    lcd.setCursor(0, 0); 
    lcd.print("Offset Value  :");
    lcd.setCursor(0, 1); 
    lcd.print("Speed Value   :");
    lcd.setCursor(0, 2); 
    lcd.print("Reading Value :");
    lcd.setCursor(0, 3); 
    lcd.print("Amp Value :");  
  }
  
  offsetValue = 0;
  for(int i=0; i<avarageValue; i++ )
  {
    offsetValue = offsetValue + analogRead(offsetPin);
  }
  offsetValue = offsetValue / avarageValue;

  speedValue = 0;
  for(int i=0; i<avarageValue; i++ )
  {  
    speedValue = speedValue + analogRead(speedPin);
  }
  speedValue = speedValue / avarageValue;

  speedControlValue = map(speedValue, 0, 1023, 0, maxSpeed);
  analogWrite(speedControlPin, speedControlValue);

  readingValue = 0;
  for(int i=0; i<avarageValue; i++ )
  {  
    readingValue = readingValue + analogRead(readingPin);
  }
  readingValue = readingValue / avarageValue;

  readingValueInVolt = ( (float)readingValue / 1024.0) * 5000 ;
  offsetValueInVolt = ( (float)offsetValue / 1024.0) * 5000 ;

  actualCurrent = ((readingValueInVolt - offsetValueInVolt) / mVperAmp);

  lcd.setCursor(16, 0);   
  lcd.print("    ");  
  lcd.setCursor(16, 0); 
  lcd.print(offsetValue);
  lcd.setCursor(16, 1);   
  lcd.print("    ");    
  lcd.setCursor(16, 1); 
  lcd.print(speedValue);             
  lcd.setCursor(16, 2);   
  lcd.print("    ");    
  lcd.setCursor(16, 2); 
  lcd.print(readingValue);  
  lcd.setCursor(12, 3);   
  lcd.print("    ");    
  lcd.setCursor(12, 3); 
  lcd.print(actualCurrent);               
}

Kod Arduino penukaran nilai digital kepada ampere

Siapakan litar dan mula untuk memuat naik kod tutorial penukaran nilai digital kepada ampere di atas ke dalam papan Arduino Uno. Selepas berjaya memuat naik, kini anda boleh melihat bacaan arus dalam bentuk ampere (nilai di sebelah “Amp Value“) apabila kelajuan motor arus terus dinaikkan menggunakan perintang boleh laras.

Video di bawah menunjukkan bagaimana bacaan arus yang melalui motor arus terus bertindak balas terhadap peningkatan kelajuan motor arus terus yang dikawal melalui isyarat perintang boleh laras.

Jika anda perasan (pada awal video), nilai “Amp Value” tidak kosong (sepatutnya kosong) ketika “Speed Value” bernilai kosong. Anda perlu mengosongkan nilai “Amp Value” kepada kosong ketika “Speed Value” bernilai kosong dengan memusing perintang boleh laras yang mengawal tetapan Offset.

>> SemakKan bacaan menggunakan multimeter <<

Sekarang kita akan melakukan semakkan nilai arus yang dipaparkan di paparan LCD 20×4 dengan bacaan daripada multimeter yang berada dalam mod dan sambugan untuk mengukur arus DC.

Fail Fritzing : 05_arduino_acs712_part_multimeter.fzz

Model Multimeter Fritzing : Multimeter-Part.fzpz

Litar sambungan semakkan bacaan menggunakan multimeter

Siapakan litar semakkan bacaan menggunakan multimeter di atas. Objektif kita adalah untuk melihat seberapa tepat nilai bacaan sistem kita dibandingkan dengan sistem multimeter komersial. Video di bawah menunjukkan bagaimana bacaan daripada sistem sensor arus DC kita jika dibandingkan dengan multimeter.

Jika anda perasan, terdapat sedikit perbezaan di antara sistem yang kita lakukan dengan multimeter yang digunakan. Mungkin ianya disebabkan nilai tetapan offset yang tidak begitu tepat!

>> Tahniah, anda hebat <<

Anda telah berjaya menyelesaikan Projek Digital AmMeter Mengukur Arus DC. Sekarang cuba anda tepatkan bacaan sistem digital AmMeter yang kita baru cipta tadi. Selepas itu, cuba bermain dengan litar lain untuk dijadikan beban sistem elektronik anda dan cuba untuk mengukur arus DC nya.

>> selamat mencuba <<

Kunjungi sekarang kedai Arduino Pulau Pinang di

Nadi Eleczone Solutions
Lot 1667, Tingkat 1, Jalan Teluk Air Tawar, Taman Air Tawar Indah, 13050 Butterworth, Penang
019 – 249 3264

TINGGALKAN JAWAPAN BALAS ANDA

Sila masukkan ulasan anda!
Sila masukkan nama anda di sini