Hi Guys! I'm working on an SMS-based LED Matrix Display board. I'm having problems parsing the String to an Array of Characters. any help please? thanks!
/*
GSM BASED LED MATRIX DISPLAY USING ARDUINO
October 2012
*/
#include "CMAP.h"
#include <SIM900.h>
#include <sms.h>
#include <SoftwareSerial.h>
// ---------- for led display ----------
#define INTEN 6000 //Delay Speed of scroll
int ctr; //counter variable
int charsize; //number of characters in sms
char count; //scan count
char DisplayRam[101]; //32x3 leds + 5 display count
unsigned char shiftcounter;//shift counter for characters
unsigned char mask; //display mask, led on/off
unsigned char charpointer; //character pointer map
// ---------- for sms ----------
char smsbuffer[160]; //holds buffered data
char smsdata[250]; //sms only accept 160 char, remaining for header
char numberRx[20]; //holds sender number
char incomingChar;
boolean checkNum=false; //if valid sender
boolean checkPass=false; //if valid password
boolean started=false;
//---------- registered numbers ----------
String regnum1="639339182267";
String passRx="default#"; //holds password, must be 8 char only! and ends with #
String msgBuff;
String parSMS;
// ---------- define pins - pic to led shield driver ----------
const char CLK = 5;
const char DAT = 6;
const char STR = 7;
const char K0 = A0;
const char K1 = A1;
const char K2 = A2;
const char K3 = A3;
const char K4 = 8;
const char K5 = 9;
const char K6 = 10;
const char K7 = 11;
void setup ()
{
// ---------- initialize board ----------
pinMode(CLK, OUTPUT);
pinMode(DAT, OUTPUT);
pinMode(STR, OUTPUT);
pinMode(K0, OUTPUT);
pinMode(K1, OUTPUT);
pinMode(K2, OUTPUT);
pinMode(K3, OUTPUT);
pinMode(K4, OUTPUT);
pinMode(K5, OUTPUT);
pinMode(K6, OUTPUT);
pinMode(K7, OUTPUT);
// ---------- turn all pins on ----------
digitalWrite(K0,HIGH);
digitalWrite(K1,HIGH);
digitalWrite(K2,HIGH);
digitalWrite(K3,HIGH);
digitalWrite(K4,HIGH);
digitalWrite(K5,HIGH);
digitalWrite(K6,HIGH);
digitalWrite(K7,HIGH);
// ---------- serial port ----------
gsmsetup();
// ---------- loop display 32x3 leds ----------
for (ctr=0;ctr<32;ctr++)
{clock();}
strobe();
ctr=0;
}
void loop ()
{
// ---------- check sms new ----------
checkSMS();
// ---------- loop display ----------
Display();
shift();
}
void gsmsetup(void)
// ---------- serial setup ----------
{
//Serial connection.
Serial.begin(9600);
Serial.println("GSM Shield testing.");
//Start configuration of shield with baudrate.
//For http uses is raccomanded to use 4800 or slower.
if (gsm.begin(4800)){
Serial.println("GSM SHIELD READY");
started=true;
}
else Serial.println("GSM SHIELD IDLE");
}
void checkSMS()
// ---------- check if there is new message ----------
{
if(started){
//Read if there are messages on SIM card and print them.
if(gsm.readSMS(smsbuffer, 160, numberRx, 20))
{
Serial.print("\nFrom: ");
Serial.print(numberRx);
Serial.print("\nMessage: ");
Serial.print(smsbuffer);
Serial.println("\n");
}
delay(1000);
checkSender();
}
}
void checkSender()
{
String numRx(numberRx);
if(numRx.startsWith(regnum1))
{
checkNum=true;
Serial.println("Authorized Sender.");
checkPassword();
}
else
{
Serial.println("Unauthorized Sender.");
}
}
void checkPassword()
{
// ---------- convert array to string -----------
msgBuff.concat(smsbuffer[0]);
for (int i=1;i<=10;i++)
{
msgBuff.concat(smsbuffer[i]);
}
Serial.print("\nMessage Buffer: "); Serial.println(msgBuff);
Serial.print("\nMessage Length: "); Serial.println(msgBuff.length());
// ---------- check for password in string ------------
if(msgBuff.startsWith(passRx))
{
checkPass=true;
Serial.println("Password Correct.");
}
else
{
checkPass=false;
Serial.println("Password inCorrect.");
}
if(checkPass==true)
{
parseSMS();
}
}
void parseSMS()
{
parSMS.concat(smsbuffer[9]);
int i=10;
while(smsbuffer[i]!='\0')
{
parSMS.concat(smsbuffer[i]);
i++;
}
Serial.print("\nParsed SMS: ");
Serial.println(parSMS);
msgBuff=""; // clear message Buffer
// ---------- convert to array ---------
parSMS=""; // clear parsed sms buffer
getSMS();
}
void getSMS()
{
// --------- convert string to array --------
int y;
int stringLen = parSMS.length();
for(y=0;y<=stringLen;y++)
{
smsdata[y]+=parSMS[y];
smsdata[y+1]='\0';
}
Serial.print("\nArray SMS: ");
Serial.println(smsdata);
}
void shift(void)
{
// ---------- DisplayRam[0]~[99] = DisplayRam[1]~[100] ----------
int x;
for(x=0;x<100;x++)
{
DisplayRam[x] = DisplayRam[x+1];
}
// ---------- # value denotes spacing of letters ----------
shiftcounter++;
if(shiftcounter == 8)
{
shiftcounter=0;
//load();
}
}
void Display(void)
{
mask = 0x01;
scan();
digitalWrite(K7,LOW);
for(ctr=0;ctr<INTEN;ctr++){}
digitalWrite(K7,HIGH);
mask = 0x02;
scan();
digitalWrite(K6,LOW);
for(ctr=0;ctr<INTEN;ctr++){}
digitalWrite(K6,HIGH);
mask = 0x04;
scan();
digitalWrite(K5,LOW);
for(ctr=0;ctr<INTEN;ctr++){}
digitalWrite(K5,HIGH);
mask = 0x08;
scan();
digitalWrite(K4,LOW);
for(ctr=0;ctr<INTEN;ctr++){}
digitalWrite(K4,HIGH);
mask = 0x10;
scan();
digitalWrite(K3,LOW);
for(ctr=0;ctr<INTEN;ctr++){}
digitalWrite(K3,HIGH);
mask = 0x20;
scan();
digitalWrite(K2,LOW);
for(ctr=0;ctr<INTEN;ctr++){}
digitalWrite(K2,HIGH);
mask = 0x40;
scan();
digitalWrite(K1,LOW);
for(ctr=0;ctr<INTEN;ctr++){}
digitalWrite(K1,HIGH);
mask = 0x80;
scan();
digitalWrite(K0,LOW);
for(ctr=0;ctr<INTEN;ctr++){}
digitalWrite(K0,HIGH);
}
void load(void)
{
char cctr;
if(smsdata[charpointer+1] == '~')
{
charpointer = 0;
}
for (cctr =0; cctr<5;cctr++)
{
DisplayRam[94 + cctr] = character_data[(smsdata[charpointer] - 0x20)][cctr];
}
DisplayRam[101]=0;
charpointer++;
}
void Clear_Display_Ram(void)
{
unsigned char rcount;
for(rcount = 0; rcount < 101; rcount++)
DisplayRam[rcount] = 0xff;
}
void scan(void)
{
for (count=94;count>(-1);count--){
if ((DisplayRam[count] & mask) == mask)
digitalWrite(DAT,LOW);
else
digitalWrite(DAT,HIGH);
clock();
}
strobe();
}
void clock(void)
{
digitalWrite(CLK,HIGH); // clock hi
digitalWrite(CLK,LOW); // clock low
}
void strobe(void)
{
digitalWrite(STR,HIGH); // strobe hi
digitalWrite(STR,LOW); // strobe low
}