Problem with Char and Char Pointer.

Hi! I’m working on a SMS-based LED Matrix display. I want to send messages to the Arduino and Display them on the LED Matrix along with other defined strings. Both work well independently, but when I combined the codes, there are errors. Here’s what i have been working on:

#include "cmap.h"
#include <SIM900.h>
#include <sms.h>
#include <SoftwareSerial.h>

#define INTEN 6500      //speed the higher the value, the slower the scroll

//-------------------GSM VARIABLES-----------------------

boolean started = false;
char regnum[] = "639339182267";
char passRx[] = "default#";           //holds password, must be 8 char only! and ends with #
char smsdata[160];         //sms only accept 160 char, remaining for header
char numberRx[20];         //holds sender number
char LED_DATA[] = " Hello! ";

//-----------------LED MATRIX VARIABLES------------------

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;

char Display_Ram[38];
char count;	
unsigned char char_pointer = 0x00;
unsigned char mask;
unsigned char shift_counter;
int message_no;
int pins[] = { CLK, DAT, STR, K0, K1, K2, K3, K4, K5, K6, K7 };
int mask_data[] = {0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
unsigned int d;

void setup() 
{ 
  gsmsetup();
  pinsetup(); 
}

void loop()
{
//  checkSMS();
  Display();
  shift(); 
}


void gsmsetup(void)
// ---------- serial setup ----------
{
  Serial.begin(9600);
  gsm.begin(4800);  
}

void pinsetup()
{
  for (int x=0;x<=10;x++){  
    pinMode(pins[x], OUTPUT);     
  } 
  
  for (int y=3;y<=10;y++){
    digitalWrite(pins[y],HIGH);  
  }  

  for(d=0;d<32;d++){
    clock();
  }
  strobe();
  d = 0;
}

void checkSMS()
// ---------- check if there is new message ----------
{
  int i;
  gsm.readSMS(smsdata, 160, numberRx, 20);
  delay(1000);
  if (strncmp (numberRx, regnum, 11) == 0)
    {
      if (strncmp (smsdata, passRx, 8) == 0)
      {
        while (smsdata[i] != '~')
        {
          smsdata[i] = smsdata[i+9];     
          i++; 
        }
        i = 0;
 //       Serial.print("\nParsed SMS: ");
        
        while (smsdata[i] != '~')
        {
//          Serial.print(smsdata[i]);
          i++; 
        }
 //       Serial.println("");
      }
    }
}

void Display(void)
{
  mask = 0x01;
  scan();
  digitalWrite(K7,LOW);
  for(d=0;d<INTEN;d++){}
  digitalWrite(K7,HIGH);

  mask = 0x02;
  scan();
  digitalWrite(K6,LOW);
  for(d=0;d<INTEN;d++){}
  digitalWrite(K6,HIGH);

  mask = 0x04;
  scan();
  digitalWrite(K5,LOW);
  for(d=0;d<INTEN;d++){}
  digitalWrite(K5,HIGH);

  mask = 0x08;
  scan();
  digitalWrite(K4,LOW);
  for(d=0;d<INTEN;d++){}
  digitalWrite(K4,HIGH);

  mask = 0x10;
  scan();
  digitalWrite(K3,LOW);
  for(d=0;d<INTEN;d++){}
  digitalWrite(K3,HIGH);

  mask = 0x20;
  scan();
  digitalWrite(K2,LOW);
  for(d=0;d<INTEN;d++){}
  digitalWrite(K2,HIGH);

  mask = 0x40;
  scan();
  digitalWrite(K1,LOW);
  for(d=0;d<INTEN;d++){}
  digitalWrite(K1,HIGH);

  mask = 0x80;
  scan();
  digitalWrite(K0,LOW);
  for(d=0;d<INTEN;d++){}
  digitalWrite(K0,HIGH);
}

void scan(void){
  for (count=32;count>(-1);count--){
    if ((Display_Ram[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
}

void shift(void) 
{
  for (int val=0; val<37; val++)
  {
    Display_Ram[val] = Display_Ram[val+1];
  }
  
  shift_counter++;
  if(shift_counter == 6){
    shift_counter = 0;
    load();
  }
}

void load(void)
{
  char counter1;
  char *smsdata= announcement(message_no);                   
  Serial.println(smsdata);
  if(smsdata[char_pointer]  == '~' || smsdata[char_pointer]  == '\0')
  {
    char_pointer = 0;
    message_no++;   
    goto exit;
  }

  for(counter1 = 0; counter1 < 5; counter1++)
  {
    Display_Ram[32 + counter1] = character_data[(smsdata[char_pointer] - 0x20)][counter1];
  }
  Display_Ram[37] = 00;	
  char_pointer++;
  exit:
  counter1++;
}

There’s a user-defined library called CMAP.H, i’d post them in the next reply. i ran out of characters.

The problem is, i can’t display the text messages. It only displays the message (with a ton of weird ASCII characters) when message_no1 overflows. Any help guys? thanks. :slight_smile:

maskinao:
There's a user-defined library called CMAP.H, i'd post them in the next reply. i ran out of characters.

You can attach files. Click on "Additional Options".

Also please show what the problems/errors are.

Here’s CMAP.h

const unsigned char character_data[][6] =
{
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },       //20-
    { 0x00, 0x00, 0x00, 0xF2, 0x00, 0x00 },       //21-!
    { 0x00, 0x00, 0xE0, 0x00, 0xE0, 0x00 },       //22-"
    { 0x28, 0xFE, 0x28, 0xFE, 0x28, 0x00 },       //23-#
    { 0x24, 0x54, 0x7E, 0x54, 0x48, 0x00 },       //24-$
    { 0xC4, 0xC4, 0x10, 0x26, 0x46, 0x00 },       //25-%
    { 0x6C, 0x92, 0xAA, 0x44, 0x1A, 0x00 },       //26-&
    { 0x00, 0x00, 0xA0, 0xC0, 0x00, 0x00 },       //27-'
    { 0x00, 0x00, 0x38, 0x44, 0x82, 0x00 },       //28-(
    { 0x00, 0x82, 0x44, 0x38, 0x00, 0x00 },       //29-)
    { 0x28, 0x10, 0x6C, 0x10, 0x28, 0x00 },       //2A-*
    { 0x10, 0x10, 0x6C, 0x10, 0x10, 0x00 },       //2B-+
    { 0x00, 0x00, 0x0A, 0x0C, 0x00, 0x00 },       //2C-,
    { 0x10, 0x10, 0x10, 0x10, 0x10, 0x00 },       //2D--
    { 0x00, 0x00, 0x06, 0x06, 0x00, 0x00 },       //2E-.
    { 0x04, 0x08, 0x10, 0x20, 0x40, 0x00 },       //2F-/
    { 0x7C, 0x82, 0x82, 0x82, 0x7C, 0x00 },       //30
    { 0x00, 0x42, 0xFE, 0x02, 0x00, 0x00 },       //31
    { 0x42, 0x86, 0x8A, 0x92, 0x62, 0x00 },       //32
    { 0x84, 0x82, 0xA2, 0xD2, 0x8C, 0x00 },       //33
    { 0x18, 0x28, 0x48, 0xFE, 0x08, 0x00 },       //34
    { 0xE4, 0xA2, 0xA2, 0xA2, 0x9C, 0x00 },       //35
    { 0x3C, 0x52, 0x92, 0x92, 0x0C, 0x00 },       //36
    { 0x80, 0x8E, 0x90, 0xA0, 0xC0, 0x00 },       //37
    { 0x6C, 0x92, 0x92, 0x92, 0x6C, 0x00 },       //38
    { 0x60, 0x92, 0x92, 0x94, 0x78, 0x00 },       //39
    { 0x00, 0x00, 0x6C, 0x6C, 0x00, 0x00 },       //3A-:
    { 0x00, 0x00, 0x6A, 0x6C, 0x00, 0x00 },       //3B-//
    { 0x00, 0x10, 0x28, 0x44, 0x82, 0x00 },       //3C-<
    { 0x28, 0x28, 0x28, 0x28, 0x28, 0x00 },       //3D-=
    { 0x00, 0x82, 0x44, 0x28, 0x10, 0x00 },       //3E->
    { 0x40, 0x80, 0x8A, 0x90, 0x60, 0x00 },       //3F-?
    { 0x7C, 0x82, 0xBA, 0xAA, 0xBA, 0x70 },       //40-@
    { 0x7E, 0x88, 0x88, 0x88, 0x7E, 0x00 },       //41-A
    { 0xFE, 0x92, 0x92, 0x92, 0x6C, 0x00 },       //42-B
    { 0x7C, 0x82, 0x82, 0x82, 0x44, 0x00 },       //43-C
    { 0xFE, 0x82, 0x82, 0x44, 0x38, 0x00 },       //44-D
    { 0xFE, 0x92, 0x92, 0x92, 0x82, 0x00 },       //45-E
    { 0xFE, 0x90, 0x90, 0x90, 0x80, 0x00 },       //46-F
    { 0x7C, 0x82, 0x92, 0x92, 0x5E, 0x00 },       //47-G
    { 0xFE, 0x10, 0x10, 0x10, 0xFE, 0x00 },       //48-H
    { 0x00, 0x82, 0xFE, 0x82, 0x00, 0x00 },       //49-I
    { 0x04, 0x02, 0x82, 0xFC, 0x80, 0x00 },       //4A-J
    { 0xFE, 0x10, 0x28, 0x44, 0x82, 0x00 },       //4B-K
    { 0xFE, 0x02, 0x02, 0x02, 0x02, 0x00 },       //4C-L
    { 0xFE, 0x40, 0x30, 0x40, 0xFE, 0x00 },       //4D-M
    { 0xFE, 0x20, 0x10, 0x08, 0xFE, 0x00 },       //4E-N
    { 0x7C, 0x82, 0x82, 0x82, 0x7C, 0x00 },       //4F-O
    { 0xFE, 0x90, 0x90, 0x90, 0x60, 0x00 },       //50-P
    { 0x7C, 0x82, 0x8A, 0x84, 0x7A, 0x00 },       //51-Q
    { 0xFE, 0x90, 0x98, 0x94, 0x62, 0x00 },       //52-R
    { 0x62, 0x92, 0x92, 0x92, 0x8C, 0x00 },       //53-S
    { 0x80, 0x80, 0xFE, 0x80, 0x80, 0x00 },       //54-T
    { 0xFC, 0x02, 0x02, 0x02, 0xFC, 0x00 },       //55-U
    { 0xF8, 0x04, 0x02, 0x04, 0xF8, 0x00 },       //56-V
    { 0xFC, 0x02, 0x1C, 0x02, 0xFC, 0x00 },       //57-W
    { 0xC6, 0x28, 0x10, 0x28, 0xC6, 0x00 },       //58-X
    { 0xE0, 0x10, 0x0E, 0x10, 0xE0, 0x00 },       //59-Y
    { 0x86, 0x8A, 0x92, 0xA2, 0xC2, 0x00 },       //5A-Z
    { 0x00, 0x00, 0xFE, 0x82, 0x82, 0x00 },       //5B-[
    { 0x40, 0x20, 0x10, 0x08, 0x04, 0x00 },       //5C-\

    { 0x00, 0x82, 0x82, 0xFE, 0x00, 0x00 },       //5D-]
    { 0x20, 0x40, 0xFE, 0x40, 0x20, 0x00 },       //5E-^
    { 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 },       //5F-_
    { 0x80, 0x40, 0x20, 0x00, 0x00, 0x00 },       //60-`
    { 0x04, 0x2A, 0x2A, 0x2A, 0x1E, 0x00 },       //61-a
    { 0xFE, 0x12, 0x22, 0x22, 0x1C, 0x00 },       //62-b
    { 0x1C, 0x22, 0x22, 0x22, 0x04, 0x00 },       //63-c
    { 0x1C, 0x22, 0x22, 0x12, 0xFE, 0x00 },       //64-d
    { 0x1C, 0x2A, 0x2A, 0x2A, 0x18, 0x00 },       //65-e
    { 0x08, 0x3F, 0x48, 0x40, 0x20, 0x00 },       //66-f
    { 0x18, 0x25, 0x25, 0x25, 0x3E, 0x00 },       //67-g
    { 0xFE, 0x10, 0x20, 0x20, 0x1E, 0x00 },       //68-h
    { 0x00, 0x22, 0xBE, 0x02, 0x00, 0x00 },       //69-i
    { 0x02, 0x01, 0x21, 0xBE, 0x00, 0x00 },       //6A-j
    { 0x00, 0xFE, 0x08, 0x14, 0x22, 0x00 },       //6B-k
    { 0x00, 0x82, 0xFE, 0x02, 0x00, 0x00 },       //6C-l
    { 0x3E, 0x20, 0x18, 0x20, 0x1E, 0x00 },       //6D-m
    { 0x3E, 0x10, 0x20, 0x20, 0x1E, 0x00 },       //6E-n
    { 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00 },       //6F-o
    { 0x3F, 0x24, 0x24, 0x24, 0x18, 0x00 },       //70-p
    { 0x18, 0x24, 0x24, 0x14, 0x3F, 0x00 },       //71-q
    { 0x3E, 0x10, 0x20, 0x20, 0x10, 0x00 },       //72-r
    { 0x12, 0x2A, 0x2A, 0x2A, 0x04, 0x00 },       //73-s
    { 0x20, 0xFC, 0x22, 0x02, 0x04, 0x00 },       //74-t
    { 0x3C, 0x02, 0x02, 0x04, 0x3E, 0x00 },       //75-u
    { 0x38, 0x04, 0x02, 0x04, 0x38, 0x00 },       //76-v
    { 0x3C, 0x02, 0x0C, 0x02, 0x3C, 0x00 },       //77-w
    { 0x22, 0x14, 0x08, 0x14, 0x22, 0x00 },       //78-x
    { 0x38, 0x05, 0x05, 0x05, 0x3E, 0x00 },       //79-y
    { 0x22, 0x26, 0x2A, 0x32, 0x22, 0x00 },       //7A-z
    { 0x00, 0x10, 0x6C, 0x82, 0x00, 0x00 },       //7B-{
    { 0x00 },                                     //7C-|-BLANK BAR
    { 0x00, 0x82, 0x6C, 0x10, 0x00, 0x00 },       //7D-}
    { 0x18, 0x24, 0x7E, 0x24, 0x08, 0x00 },
    { 0 }                                         //7F-DO NOT USE

};

char *announcement(int message_no1)
{
  char *LED_message[]={"LCoES Announcements         "};
      
  return LED_message[message_no1];
}

You can attach files. Click on "Additional Options".

Also please show what the problems/errors are.

Sorry, there were errors in attaching the file.

The problem is, i does not display the messages correctly. there are a bunch of ASCII characters displaying together with the message.

It is very possible that you ran out of arduino memory. Do you have an arduino MEGA? If not, try to trim your CMAP to only, say 10 characters and try to display a message composed with only those 10 characters.

Hello :slight_smile:

Sorry, I have to tell you this: your program is a mess! You should consider rewriting it.

Anyway...maybe this will help you:

int announcement(char dest[], byte idx)
{    
  const char LED_message[] = "LCoES Announcements         ";
  return sprintf( dest, "%s", &LED_message[idx] );
}
char smsdata[32];
announcement( smsdata, message_no );
Serial.println( smsdata );

Edit: Or maybe I didn't understand correctly and you want to return only one character at a time?

Then:

char announcement(byte message_no1)
{
  const char LED_message[] = "LCoES Announcements         ";     
  return LED_message[message_no1];
}
char smsdata = announcement( message_no );                   
Serial.println( smsdata );

guix:
Hello :slight_smile:

Sorry, I have to tell you this: your program is a mess! You should consider rewriting it.

ahaha. sorry. :stuck_out_tongue: can't really grasp the idea of using pointers in C++. i get really confused by it. thanks for all the comments! :slight_smile: i'll try your advices. thanks!

liudr:
It is very possible that you ran out of arduino memory. Do you have an arduino MEGA? If not, try to trim your CMAP to only, say 10 characters and try to display a message composed with only those 10 characters.

This is only an Arduino Uno. I'll try it out. :smiley: thanks! :slight_smile: i'll post a new code if i see any progress.