belajar parsing data serial dengan menggunakan arduino dan LED
Pada komunikasi serial biasanya kita membutuhkan rutin untuk parsing (memecah) data. Di Arduino kita tidak perlu lagi direpotkan untuk membuat fungsi/rutin sendiri. Arduino telah menyediakan library untuk parsing data. Library yang dapat kita gunakan adalah Messenger, dengan library ini kita dimudahkan dalam memilih data dari kumpulan string yang ada pada buffer serial. Silahkan download librarynya disini.
Berikut merupakan contoh program untuk melakukan parsing data terhadap data integer (bilangan bulat) dari data yang diterima serial port arduino. Sebagai contoh, format data yang akan saya parsing adalah sebagai berikut “A(SPACE)bilangan_bulat”, contohnya “A 23″ (tanpa tanda petik). Program yang saya buat nantinya akan memilih bilangan bulat dari kumpulan string yang diterima dari serial port. Kemudian bilangan bulat tersebut akan dikirimkan kembali ke serial port dengan format “Data Integer = (bilangan)” contohnya “Data Integer = 21″.
Ini adalah skrip program
const int ledPin = 13;
int bataskonter = 0;
String datamasukan;
String datamasukan1;
int batasdelay = 0;
int noinput = 0;
void setup(){
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
Serial.println("masukan data konter = ");
}
void loop(){
if (Serial.available()>0){
//if (noinput == 0){
datamasukan = Serial.readStringUntil('\n');
String data1 = datamasukan.substring(0,2);
String data2 = datamasukan.substring(3,6);
//bataskonter = datamasukan.toInt();
bataskonter = hexToDec(data1);
batasdelay = hexToDec(data2);
Serial.print("Led Berkedip = ");
Serial.print(bataskonter);
Serial.println(" times");
//Serial.println("masukan data delay = ");
//noinput =1; }
//else{
//datamasukan1 = Serial.readStringUntil('\n');
//batasdelay = datamasukan1.toInt();
Serial.print("delay = ");
Serial.print(batasdelay);
Serial.println(" ms");
Serial.print("Processing");
}
for (int konter = 0; konter < bataskonter ; konter++)
{
digitalWrite(ledPin, HIGH);
delay(batasdelay);
digitalWrite(ledPin, LOW);
delay(batasdelay);
Serial.print(".");
}
Serial.println("done!!");
}
unsigned int hexToDec(String hexString){
unsigned int decValue = 0;
int nextInt;
for (int i = 0; i < hexString.length(); i++){
nextInt = int(hexString.charAt(i));
if (nextInt >= 48 && nextInt <=57) nextInt = map(nextInt, 48, 57, 0, 9);
if (nextInt >= 65 && nextInt <=70) nextInt = map(nextInt, 65, 70, 10, 15);
if (nextInt >= 97 && nextInt <=102) nextInt = map(nextInt, 97, 102, 10, 15);
nextInt = constrain(nextInt, 0, 15);
decValue = (decValue * 16) + nextInt;
}
return decValue;
}
const int ledPin = 13; // the number of the LED pin
BalasHapusint bataskonter = 0;
int waktutunggu = 0;
int noinput = 0;
String datamasukan;
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
pinMode(ledPin, OUTPUT);
Serial.println("Masukkan data: ");
}
void loop() {
if (Serial.available() > 0) {
datamasukan = Serial.readStringUntil('\n');
String data1 = datamasukan.substring(0, 2);
String data2 = datamasukan.substring(2, 6);
bataskonter = hexToDec(data1);
waktutunggu = hexToDec(data2);
Serial.print("Led blingking: ");
Serial.print(bataskonter);
Serial.println("times ");
Serial.print("Delay: ");
Serial.print(waktutunggu);
Serial.println("msecond ");
Serial.print("processing");
for (int konter = 0; konter < bataskonter; konter++)
{
digitalWrite(ledPin, HIGH);
delay(waktutunggu);
digitalWrite(ledPin, LOW);
delay(waktutunggu);
Serial.print(" . ");
}
Serial.println("done!!! ");
Serial.println("");
noinput = 0;
Serial.println("Masukkan data: ");
}
}
unsigned int hexToDec(String hexString) {
unsigned int decValue = 0;
int nextInt;
for (int i = 0; i < hexString.length(); i++) {
nextInt = int(hexString.charAt(i));
if (nextInt >= 48 && nextInt <= 57) nextInt = map(nextInt, 48, 57, 0, 9);
if (nextInt >= 65 && nextInt <= 70) nextInt = map(nextInt, 65, 70, 10, 15);
if (nextInt >= 97 && nextInt <= 102) nextInt = map(nextInt, 97, 102, 10, 15);
nextInt = constrain(nextInt, 0, 15);
decValue = (decValue * 16) + nextInt;
}
return decValue;
}