arduino duemilove 328 + sensor ping and matrix

I have a project to create a tool that can display a warning

This tool uses Arduino duemilove ATMega 328, the sensor matrix ping and RG sparkfun with Backpack

the workings of this tool is to capture objects that have been arranged according to distance and if the object tersebuk into the distance sensor then the device will be issued a warning that output will appearance at the matrix

for sensor I've managed to use but results not yet out of view as scrolling text,

how do I control the order matrix is out with the results of scrolling text?

does anyone have a pattern library symbol to display in the matrix?
I use a 16 matrix ..

this code

#include <EEPROM.h>

#define CHIPSELECT 10//ss
#define SPICLOCK 13//sck
#define DATAOUT 11//MOSI
#define DATAIN 12//MISO
#define SENSOR_PIN 7 //Sensor jarak menggunakan ping parallax

#define BLACK 0x00
#define GREEN 0x01
#define RED 0x02
#define ORANGE 0x03
#define WARNA_KOMBINASI_A 0x04
#define WARNA_KOMBINASI_B 0x05

#define MAX_MESSAGE 128 //Jumlah maksimum karakter yang dapat ditampung
#define SCROLL_DELAY 300 //300ms
int warna_led = WARNA_KOMBINASI_A; //simpan warna led dari konfigurasi atau command 'clr'
int sensor_warna_led = RED;
int current_warna_led = GREEN; //warna led untuk di tampilkan di led

int max_sensor_length = 100; //332; //this is maximum PING ultrasonic sensor range 334cm
int min_sensor_length = 2; //this is minimum PING ultrasonic sensor range 2cm

int last_sensor_length;
int sensor_ready = 0;

char default_message [MAX_MESSAGE] = {0};
char sensor_message [MAX_MESSAGE] = {0}; //message untuk ditmpilkan apabila sensor jarak terdeteksi
void showAlphabet(char letter) ;

/* Byte pattern untuk led matrix. Data diambil dari website sparkfun */
byte pattern[] = {

0x18, 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x00, //0:A

0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00, //1:B

0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00, //2:C

0x78, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0x78, 0x00, //3:D

0x7E, 0x60, 0x60, 0x78, 0x60, 0x60, 0x7E, 0x00, //4:E

0x7E, 0x60, 0x60, 0x78, 0x60, 0x60, 0x60, 0x00, //5:F

0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3E, 0x00, //6:G

0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, //7:H

0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, //8:I

0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, 0x00, //9:J

0x66, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0x66, 0x00, //10:K

0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7E, 0x00, //11:L

0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00, //12:M

0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, //13:N

0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, //14:O

0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x00, //15:P

0x3C, 0x66, 0x66, 0x66, 0x6E, 0x3C, 0x0E, 0x00, //16:Q

0x7C, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0x66, 0x00, //17:R

0x3C, 0x66, 0x70, 0x38, 0x0E, 0x66, 0x3C, 0x00, //18:S

0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, //19:T

0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, //20:U

0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, //21:V

0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00, //22:W

0x66, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00, //23:X

0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x00, //24:Y

0xFE, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xFE, 0x00, //25:Z

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //SPACE

0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, //DOT
};

/* Function transfer data lewat SPI */
char spi_transfer(volatile char data)

{

SPDR = data; // Start the transmission

while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission

{

};
return SPDR; // return the received byte

}

void setup()

{
int eeprom_index;

//Set mode pin arduino
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK,OUTPUT);
pinMode(CHIPSELECT,OUTPUT);

//Setup SPI Bus
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1); //Enable SPI HW, Master Mode, divide clock by 16 //SPI Bus setup

//Matikan led matrix
digitalWrite(CHIPSELECT,HIGH);
delayMicroseconds(500);

/* baca message dari eeprom

  • Data yang di set menggunakan command str disimpan dalam eeprom
  • agar bila arduino kehilangan power, message yang sudah di set tidak hilang
    /
    /
    mulai baca dari byte 0 - 127 (MAX_MESSAGE)*/

for(eeprom_index=0; eeprom_index<MAX_MESSAGE; eeprom_index++)
{
default_message[eeprom_index] = EEPROM.read(eeprom_index);
}
Serial.print("\r\nset strsensor: ");
Serial.print(val);
Serial.println("\r\n");
}else
{
Serial.println("set string failed\n ");
}
}
else if(strcmp(cmd,"clr") == 0) //cek command ganti color
{
int color;

if(val!=NULL)
{
warna_led = atoi(val);
EEPROM.write((MAX_MESSAGE*2)+1, warna_led );
Serial.print("\r\nset warna: ");
Serial.print(val);
Serial.println("\r\n");
}
}
else if(strcmp(cmd,"clrsensor") == 0) //cek command ganti color
{
int color;

if(val!=NULL)
{
sensor_warna_led = atoi(val);
EEPROM.write((MAX_MESSAGE*2)+2, sensor_warna_led );
Serial.print("\r\nset warna: ");
Serial.print(val);
Serial.println("\r\n");
}
}
else if(strcmp(cmd,"maxsensor") == 0) //cek command ganti color
{
int color;

if(val!=NULL)
{
max_sensor_length = atoi(val);
EEPROM.write((MAX_MESSAGE*2)+3, max_sensor_length );
Serial.print("\r\nset maxsensor: ");
Serial.print(val);
Serial.println("\r\n");
}
}
else if(strcmp(cmd,"minsensor") == 0) //cek command ganti color
{
int color;

if(val!=NULL)
{
min_sensor_length = atoi(val);
EEPROM.write((MAX_MESSAGE*2)+4, min_sensor_length );
Serial.print("\r\nset minsensor: ");

Serial.print(val);
Serial.println("\r\n");
}
}
else{
//Command tidak si support. Kirimkan message informasi/help

Serial.println("\r\nInvalid Command. Valid Command are: ");
Serial.println("str : To show string on led matrix. String should be in CAPITAL TEXT");
Serial.println("clr : To change color BLACK=0, GREEN=1, RED=2, ORANGE=3");
Serial.println("\r\n");

}

}
/* Fungsi ini mencheck data pada serial port arduino

  • Jika ada data masuk, maka data tersebut akan ditampung dalam sebuah buffer
  • jika data masuk adalah karakter \n (ASCII karakter 13) maka buffer akan diproses di dalam
  • fungsi process_serial_data()
    */

int check_serial_data()
{
int byte = 0;

while(Serial.available() > 0)
{
byte = Serial.read(); //baca data pada serial port

if((char)byte == ';' || byte == -1) //jika karakter \n atau ENTER maka buffer akan diproses
{
serial_data_msg[serial_data_index] = '\0'; //Tambahkan null character pada akhir buffer. String pada bahasa C memerlukan akhiran null character
process_serial_data(serial_data_msg); //panggil fungsi untuk memproses data

serial_data_index = 0;
Serial.println("OK\r\n");

return 1;

}
//Tampung data yang masuk dalam buffer

if(byte >=0 && serial_data_index < MAX_MESSAGE+8)
{
serial_data_msg[serial_data_index] = (char)byte;
serial_data_index++;
Serial.print(byte, BYTE);
}
}

return 0;
}

/* Fungsi ini menampilkan satu karakter ke led matrix
*/
int show_running_text(char c)
{
if(check_serial_data()>0)
{
return 0; //return false karena ada data baru dari serial port
}

if(warna_led == WARNA_KOMBINASI_A) // warna led 4 artinya tampilkan warna led kombinasi hijau,merah,oranye secara bergantian
{
current_warna_led++; //tampilkan warna selanjutnya
if(current_warna_led > 3)
current_warna_led = 1; //kalau warna led lebih dari 3(oranye) balik lagi tampilkan warna hijau
}

showAlphabet(c); //panggil fungsi SPI

return 1; //true
}

long microsecondsToCentimeters(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}

int read_sensor()
{
int cm;
int duration;
int ret = 0;
// The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
// We give a short LOW pulse beforehand to ensure a clean HIGH pulse.
pinMode(SENSOR_PIN, OUTPUT);
digitalWrite(SENSOR_PIN, LOW);
delayMicroseconds(2);
digitalWrite(SENSOR_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(SENSOR_PIN, LOW);

// The same pin is used to read the signal from the PING))): a HIGH
// pulse whose duration is the time (in microseconds) from the sending
// of the ping to the reception of its echo off of an object.
pinMode(SENSOR_PIN, INPUT);
duration = pulseIn(SENSOR_PIN, HIGH);

// convert the time into a distance
//inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);

//Only send sensor data if valid within range of max sensor length and min sensor length
if(cm <= max_sensor_length &&
cm >= min_sensor_length &&
cm != last_sensor_length &&
sensor_ready == 1)
{
last_sensor_length = cm;

ret = 1;
char strSensorResult[32];
sprintf(strSensorResult,"LEN %d",cm);
Serial.println(strSensorResult);
}

return ret;
}

int sensor_ready_index = 0;
/* Fungsi ini adalah fungsi utama yang selalu dipanggil arduino */
void loop()

{
check_serial_data();
char string[MAX_MESSAGE+1]={0};
int str_len;

if(last_sensor_length>0)
{
strncpy(string, sensor_message, MAX_MESSAGE); //Copy string dari buffer message ke buffer sementara
if(sensor_warna_led == WARNA_KOMBINASI_B) // warna led 5 artinya tampilkan warna led kombinasi hijau,merah,oranye secara bergantian setiap satu text selesai
{
current_warna_led++; //tampilkan warna selanjutnya
if(current_warna_led > 3){
current_warna_led = 1; //kalau warna led lebih dari 3(oranye) balik lagi tampilkan warna hijau
}
}
else{
current_warna_led = sensor_warna_led; //copy warna led dari konfigurasi ke variable
}
}else{
strncpy(string, default_message, MAX_MESSAGE); //Copy string dari buffer message ke buffer sementara
if(warna_led == WARNA_KOMBINASI_B) // warna led 5 artinya tampilkan warna led kombinasi hijau,merah,oranye secara bergantian setiap satu text selesai
{
current_warna_led++; //tampilkan warna selanjutnya
if(current_warna_led > 3){
current_warna_led = 1; //kalau warna led lebih dari 3(oranye) balik lagi tampilkan warna hijau
}
}
else{
current_warna_led = warna_led; //copy warna led dari konfigurasi ke variable
}
}

str_len = strlen(string); //cek jumlah karakter

for(int i=0;i<str_len;i++)
{
//tampilkan satu karakter satu per satu
if(show_running_text(string*) == 0)*

  • break;*

_ /* baca sensor jarak hanya led sedang menampilkan text default_
_ */_

  • if(sensor_ready_index >= 2 && sensor_ready>0)*

  • {*

  • sensor_ready_index = 0;*

  • if(read_sensor())*

  • {*

  • sensor_ready = 0;*

  • //break dari loop dan ganti message dengan sensor message*

  • return;*

  • }*

  • delay(SCROLL_DELAY); //delay sebesar 300ms agaar karakter yang ditampilkan tidak terlalu cepat*

  • }else*

  • {*

  • delay(SCROLL_DELAY-10); //delay sebesar 300ms agaar karakter yang ditampilkan tidak terlalu cepat*

  • }*

  • sensor_ready_index++;*

  • }*

  • sensor_ready = 1;*

  • last_sensor_length = 0;*
    }
    void showAlphabet(char letter)
    {

  • if( (letter > 64 && letter < 91) || letter == 32 || letter == '.')*

  • {*

_ int alphabet = (letter - 65)*8;_

  • int index = 0;*

  • digitalWrite(CHIPSELECT,LOW); // enable the ChipSelect on the backpack*

  • delayMicroseconds(500);*

  • if(letter == 32)*

  • {*
    _ alphabet = (('Z' - 65) + 1 )*8;_

  • }*

  • else if (letter == '.')*

  • {*
    _ alphabet = (('Z' - 65) + 2 )*8;_

  • }*

  • for (int i=0;i<8;i++)*

  • { *

  • for (int j=8;j>0;--j)*

  • {*

  • if (bitRead(pattern[alphabet+i],j-1) == 0) //bitRead funcion is used to get each 8 bit of the 8 bytes pattern table (64 bits in total).*

  • {*

  • spi_transfer(BLACK);*

  • } // bit is 0 -> Transfer Black color.*

  • else*

  • {*

  • spi_transfer(current_warna_led);*

  • } // bit is 1 -> Transfer a color choosen in the color test table.*

  • index++;*

  • }*

  • } // 64 bytes should have been transfered to the RGB matrix.*

  • digitalWrite(CHIPSELECT,HIGH); // disable the ChipSelect on the backpack*

  • // What you've send is displayed on the matrix.*

  • delayMicroseconds(500);*

  • }*
    }
    please help me..... ( sorry comand in this project use indonesia language )