Kamis, 01 Februari 2018

MENGGABUNGKAN BEBERAPA SKETCH PROGRAM ARDUINO 2 (MODUL PIR, DHT11, RELAY, MP3)

Sepertinya banyak yang pengen tau nih cara gabungin sketch program arduino. Baru contoh Menggabungkan Beberapa Sketch Program Arduino 1 ya. Kayaknya contohnya masih kurang deh. Nih uda kasih lagi contoh yang ke dua. Misalnya uda punya dua sensor nih, satu nya sensor PIR satunya lagi sensor temperatur. Langsung aja kita ambil dari contoh yang pernah uda bikin.
Yang pertama untuk sensor PIR deh. Berikut sketchnya...

const int PIRSensor = A0;
int nilaiPIRSensor    = 0;

void setup()
{
    Serial.begin(9600);
}

void loop()
{
   nilaiPIRSensor = digitalRead(PIRSensor);
    Serial.print(“nilaiPIRSensor:”);
    Serial.println(nilaiPIRSensor);
}

Yang kedua kita ambil dari examplenya librarynya arduino untuk sensor DHT11 yang populer. Uda punya library DHT11 yang dapat di download disini. Kali aja ada yang belum tau cara nambahin library di arduino IDE ya. Lain kali Uda bikini bahasan khusunya deh. Simplenya aja ya bagi yang belum tau, buka Arduino IDE nya, klik sketch, dibawahnya ada include library, disampingnya ada add .ZIP library. Nantinya bakal keluar jendela baru, pilih deh file ZIP librarynya. Tinggal klik Open jadi deh. Ups... lanjut....
Nih contoh dari library

#include < SimpleDHT.h >

//variables for storing values
int pinDHT11 = 2;
SimpleDHT11 dht11;

{
  Serial.begin(115200);
}

void loop()
{
  // start working...
  Serial.println("=================================");
  Serial.println("Sample DHT11...");

  // read without samples.
  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
    return;
  }

  Serial.print("Sample OK: ");
  Serial.print((int)temperature); Serial.print(" *C, ");
  Serial.print((int)humidity); Serial.println(" H");
 
  // DHT11 sampling rate is 1HZ.
  delay(1500);
}

Sebenarnya dari sample diatas ada sedikit masalah tentang variable nilai temperaturnya dan kelembabannya. Variable tersebut di tarok di looping program. Lha apa lagi sih Uda.... jadi variabel yang Uda maksud adalah penamaan register biar kitanya tidak bingung nantinya... Aduuuhhh tambah bingung Udaaaaa... jadi variable tersebut untuk menyimpan nilai atau angka dari pembacaan temperatur dan kelembabannya. Kalau kita Cuma pakai untuk menampilkan nilai yang dibaca ini melalui “Serial Monitor” dari arduino IDE nya. Kalau kita mau gabungin untuk menyalakan kipas ya harusnya kita tarok penamaan variabelnya di pernyataan atau deklarasi program. Jadi programnya kita robah sedikit ya menjadi.

#include < SimpleDHT.h >
SimpleDHT11 dht11;

//variables for storing values
int pinDHT11 = 2;
int temperature = 0;
int humidity = 0;

{
  Serial.begin(115200);
}

void loop()
{
  // start working...
  Serial.println("=================================");
  Serial.println("Sample DHT11...");

  // read without samples.
  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
    return;
  }

  Serial.print("Sample OK: ");
  Serial.print(temperature);
  Serial.print(" *C, ");
  Serial.print(humidity);
  Serial.println(" H");
 
  // DHT11 sampling rate is 1HZ.
  delay(1500);
}


Kita ambil examplenya LiquidCrystal lagi ya. Yang paling familiar aja deh “HelloWord” wusshhhh....
#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup()
{
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop()
{
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}

Lanjuuuuttt....
Sekarang kita asumsiin kita punya LCD 20x4 harus robah yang mana ya dari contoh library diatas?
Coba tukar di bagian “void setup()” pada “lcd.begin(16, 2);” menjadi “lcd.begin(20, 4);”

Sekarang kita mau nyalain kipas angin setelah temperatur terbaca 32°C. Berarti kita butuh satu modul lagi nih. Modul relay deh pada tau dong relay itu buat apaan... buat nyambungin antara arduino dengan kipas angin 220VAC. Gitu deh kira2..
 Modul relay tersebut aktif malah kalau di kasih logika LOW, freak kata anak2 jaman now. Xixixix...

Cara nyalainnya gimana Uda? Ya seperti contoh sketch blink yang ada di arduino, yuk intip.
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
}

Maksudnya gimana Uda...???
Jadi LED_BUILTIN yang tercantum dalam UU.... eh terpasang pada pin 13 akan nyala jika dikasih HIGH, dan mati jika dikasih LOW.  Kita asumsiin sama lah dengan modul relay yang akan kita tambahin di rangkaian kita nantinya. Bedanya pin kita tarok dimana dan aktifnya kalau dikasih LOW.

Tapi uda bermaksud lain. Bagaimana kalau program tersebut kita play di MP3 player. Sepertinya MP3 player arduino yang banyak beredar di pasaran adalah DFPlayerMini, yang librarynya dapat kita download di https://github.com/DFRobot/DFRobotDFPlayerMini. kita ambil ya sample programnya.

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
 
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
 
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

void loop()
{
  static unsigned long timer = millis();
 
  if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }
 
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}

Ini uda ambil dari example get started nya library DFRobotDFplayerMini. Mau kita apakan ya example-example yang kita ambil???

Gini deh... bagaimana kalau setelah temperatur tercapai di atas 30°C. Kipasnya nyala. sekalian Mp3 menyebut (play) “kipas nyala om...”, dan jika temperatur di bawah 30 kipas mati dan MP3 juga memplay file kipas mati. Sensor di sketch paling atas adalah sensor PIR. Jika terdeteksi gerakan, maka modul MP3 memplay file “temperatur sekarang adalah:”, “angka temperaturnya” dan “status kipas”. Semuanya juga di tampilkan di LCD 20x4.

Yuk mulai...
Pertama kita ambil semua inisialisasi dari setiap example program. Bagi yang belum tau. Inisialisasi adalah pernyataan atau deklarasi program supaya gampang dalam pendefinisiannya.... aaaaahhhhh ribet amat. Kita g perlu teori cuy. Kita butuh langsung praktek aja. Yuuuuukkkkk.............

Yang pertama mengkopi bagian library dari setiap modulnya.

#include <SimpleDHT.h>
#include <LiquidCrystal.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

Ok siap. Selanjutnya deklarasi variable yang di gunakan. Langsung Uda gabung sama librarynya ya biar jelas apa yang udah kita gabungin

#include <SimpleDHT.h>
#include <LiquidCrystal.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SimpleDHT11 dht11;

const int PIRSensor = A0;
int nilaiPIRSensor    = 0;
int pinDHT11 = 2;
int temperature = 0;
int humidity = 0;
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
SoftwareSerial mySoftwareSerial(9, 10); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

sip, ready.. sekarang penggabungan bagian setup program

#include <SimpleDHT.h>
#include <LiquidCrystal.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SimpleDHT11 dht11;

const int PIRSensor = A0;
int nilaiPIRSensor    = 0;
int pinDHT11 = 6; //pin 2 terpakai untuk LCD kita pindah ke pin 6 ya
int temperature = 0;
int humidity = 0;
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  Serial.begin(9600);
  lcd.begin(20, 4);
  // Print a message to the LCD.
 lcd.print("hello, world!"); // ganti aja isinya sama yang kita suka aja misalnya ”tamperatur kontrol”

  mySoftwareSerial.begin(9600);
  Serial.begin(115200); //pengaktifan serial yang ini kita hapus ya, biar g bentrok ama yang atas. Kita butuhnya cuman 1 kok (di penyempurnaan di bawah)
 
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
 
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

Penyempurnaan tulisan pada setup biar cocok

#include <SimpleDHT.h>
#include <LiquidCrystal.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SimpleDHT11 dht11;

const int PIRSensor = A0;
int nilaiPIRSensor    = 0;
int pinDHT11 = 2;
int temperature = 0;
int humidity = 0;
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  Serial.begin(9600);
  lcd.begin(20, 4);
  // Print a message to the LCD.
  lcd.print("hello, world!"); // ganti aja isinya sama yang kita suka aja misalnya ”tamperatur kontrol”
  lcd.print(" Temperatur kontrol "); // ganti aja isinya sama yang kita suka aja misalnya ”tamperatur kontrol”                                         
  lcd.setCursor(0, 1); // tambahin tulisannya di baris kedua
  lcd.print("  kipas angin bro   ”);
  lcd.setCursor(0, 2); // tambahin tulisannya di baris ketiga
  lcd.print("      bikinan       ”);
  lcd.setCursor(0, 3); // tambahin tulisannya di baris ketiga
  lcd.print("  sendiri lhoo...   ”);

  mySoftwareSerial.begin(9600);
 
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
 
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
  delay(3000); // biar tampil tulisan LCD nya agak lamaan dikit
}

Selanjutnya kita gabungin looping programnya...
Tapi kali ini kita tidak memperbaikinya lagi, kita hanya ambil inti dari program tersebut. Soalnya jadi kepanjangan bahasnnya... xixixixi....

#include <SimpleDHT.h>
#include <LiquidCrystal.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SimpleDHT11 dht11;

const int PIRSensor = A0;
const int  pinDHT11 = 2;
const int pinKipas = 7;
int nilaiPIRSensor    = 0;
int temperature = 0;
int temperatur = 0;
int humidity = 0;
int mp3Kipas = 0;
String statusKipas = “”; //penambahan variable untuk penulisan status kipas di LCD
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
SoftwareSerial mySoftwareSerial(9, 10); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  Serial.begin(9600);
  lcd.begin(20, 4);
  // Print a message to the LCD.
  lcd.print("hello, world!"); // ganti aja isinya sama yang kita suka aja misalnya ”tamperatur kontrol”
  lcd.print(" Temperatur kontrol "); // ganti aja isinya sama yang kita suka aja misalnya ”tamperatur kontrol”                                         
  lcd.setCursor(0, 1); // tambahin tulisannya di baris kedua
  lcd.print("  kipas angin bro   ”);
  lcd.setCursor(0, 2); // tambahin tulisannya di baris ketiga
  lcd.print("      bikinan       ”);
  lcd.setCursor(0, 3); // tambahin tulisannya di baris ketiga
  lcd.print("  sendiri lhoo...   ”);

  mySoftwareSerial.begin(9600);
 
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
 
  myDFPlayer.volume(20);  //Set volume value. From 0 to 30
  myDFPlayer.play(93);  //Play the first mp3
  delay(3000); // biar tampil tulisan LCD nya agak lamaan dikit
}

void loop()
{
  //pertama kita atur dulu tampilan di LCDnya
  lcd.clear(); //untuk membersihkan tulisan sebelumnya yang melekat pada LCD
  lcd.setCursor(0, 0);
  lcd.print(“Kipas Kontrol”);
  lcd.setCursor(0, 1);
  lcd.print(“temperatur: ”);
  lcd.print(temperature);
  lcd.setCursor(0, 2);
  lcd.print(“kelembaban: ”);
  lcd.print(humidity);
  lcd.setCursor(0, 3);
  lcd.print(“kipas: ”);
  lcd.print(statusKipas);

  nilaiPIRSensor = digitalRead(PIRSensor);
  Serial.print(“nilaiPIRSensor:”);

  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
    return;
  }

  Serial.print("Sample OK: ");
  Serial.print(temperature);
  Serial.print(" *C, ");
  Serial.print(humidity);
  Serial.println(" H");
 
  temperatur = temperature; //kita masukkan isi variable temperature ke variabel temperatur
  if (temperatur > 30) //logika pengaturan kipas angin dengan aktif low
  {
    digitalWrite (pinKipas, LOW);
    statusKipas = “nyala”;
    mp3Kipas = 91;
  }
  else
  {
    digitalWrite (pinKipas, HIGH);
    statusKipas = “mati”;
    mp3Kipas = 92;
  }

  if(nilaiPIRSensor == 1)
  {
    myDFPlayer.play(94);
    myDFPlayer.play(temperatur);
    myDFPlayer.play(mp3Kipas);
  }
}

Sekarang rekam suara per file. “satu” simpan di file 001 dengan format mp3, selanjutnya “dua” dan simpan di file 002, dan selanjutnya sampai 50. Dengan asumsi temperatur tertinggi hanya sampai 50. Atau sekiranya bro dan bray betah silahkan sampai 90. File 091 isi dengan suara “kipas nyala”, file 092 isi dengan suara “kipas mati”, dan file 093 dengan suara “mesin pengatur kipas otomatis”. Satu lagi, rekam juga MP3 dengan suara "temperatur sekarang adalah" dan simpan di file 094.
Masukkan ke memory dan rangkai sesuai dengan program yang kita buat. Sayang Uda tidak punya program gambar rangkaian di laptop. Lain kali kita update ya gambar rangkaiannya.
Pin yang kita pakai pada arduino yaitu
Pin A0 ke PIR Sensor
Pin 2  ke LCD D7
Pin 3 ke LCD D6
Pin 4 ke LCD D5
Pin 5 ke LCD D4
Pin 6 ke DHT11. Silahkan googling dulu deh mengenai cara pemasangannya. Tutornya nyusul ya bray
Pin 9 ke DFPlayer mini TX
Pin 10 ke DFPlayer mini RX
Pin 11 ke LCD E
Pin 12 ke LCD RS

Satu lagi hal penting nih. Kalau bro dan sis ngopiin koding di atas di jamin error deh. Jadi harus di modif dikit soal penulisan tanda kutip dua (“). Di hapus trus di ketik ulang lagi, atau bisa download di disini Semoga berhasil yaaa.....

Seandainya masih kurang, klik lagi link ini deh brai untuk contoh ke 3

Sekiranya ada kendala dalam rangkaian atau programnya bisa tanya langsung deh di kolom komentar. Uda pasti denga senang hati menjawabnya.


14 komentar:

digital matrix mengatakan...

Mantap gan,bisa contohin 3 relay,2 sensor pir,2 sensor Ultrasonic

rg tech mengatakan...

ok sip mas, di tunggu deh. mas sendiri mau rencana bikin apa nih... tas berjalan ya... xixixixi...
kira2 tengah bulan depan kita update deh, dah lama juga nggak update.

Unknown mengatakan...

Boleh bertanya nggak soal program

rg tech mengatakan...

Boleh kok mas... Mengenai apa ya.?

Radit mengatakan...

Mantep gan ilmunya. Ane boleh tanya gan utk menggabungkan kontrol relay dengan bluetooth dan remot ir dan juga bisa utk kontrol tv itu gmna ya gan ane coba gagal trus mhn bimbingannya gan... Trims

rg tech mengatakan...

Kalau kontrol relay dengan bluetooth masih mungkin om. Tapi kalau IR TV bergantung mereknya om. Lain TV lain pulsa dan frekwemsi yg di gunakan.

Unknown mengatakan...

mas mau tanya, g mna cara menggabungkan sensor PH, TDS, dan suhu biar bisa tampil bersamaan di lcd? sy sdh coba tpi error terus.mksh sblmnya

rg tech mengatakan...

OK. pertama kita ambil pembacaan sensor masing2 pada inisialisasi program.
kemudian kita ambil juga masing2 pada bagian setup() program. lanjut ke bagian looping() program.

pada bagian inisialisasi program perhatikan pin yang di pakai. jangan sampai memakai pin yang sama untuk setiap sensornya.
aktifkan sensor tersebut di bagian setup() program
pada bagian looping() program hilangin dulu semua yang berbau LCD.
nah pada bagian terakhir program baru deh atur bagian LCD. di kolom dan baris ke berapa kita menampilkan nilai sensornya.

maaf, g sempat nulis banyak... :D

Fajareko mengatakan...

Mas bantu buatin program sensor ultrasonic debgan sensor vibration.. gk paham2 gabungin 2 sketch programnya

Nasakun mengatakan...

Lengkap banget brayyy :v.. thangkyu. bisa jadi referensi nih

rg tech mengatakan...

@Nasakun Tengkiu bro...

Hartono mengatakan...

saya mau tanya mas,saya membuat charger solar pwm terus saya mau saya kasih alarm gmn ya mas soalnya udah coba berkali2 koq belum berhasil

Unknown mengatakan...

min boleh nanya ? ada kontak yang aktif ?

Yogi Cell mengatakan...

mas boleh minta tolong,, gmn cara buat coding 2 alat,, fungsinya Running text dan LED.. miniatur lampu lalu lintas yang sekalian pake Running text juga, mohon dibantu Guru ^_^