SMS to Morse Code

I’ve just finished a new project using a GSM shield to translate text messages to Morse Code. A shout out to learningelectronics youtube which was a very helpful reference.

The project works and I’ve posted the code for reference.

I still have a glitch I have to work out where the text repeats word by word. This is how it appears in the Serial Monitor:

SMS Messages Receiver
GSM initialized
Waiting for messages
Message received from:
+1647000000
T
Te
Tes
Test

END OF MESSAGE
MESSAGE DELETED

I think I’ll need to store the entire character string and include an ‘\n’ but every time I test something I lose the message altogether. If anyone has a suggestion on that it would be appreciated.

The code for the entire project ( minus the lowercase Morse Code):

// include the GSM library
#include <GSM.h>

// PIN Number for the SIM
#define PINNUMBER ""

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

// Array to hold the number a SMS is retreived from
char senderNumber[20];  // name for char array.  holds up to 20 characters


String mCode = "";   // string to store char input
byte mCodeLength = 0;   // byte to store length of mCode
long pause = 50;  // delay on dots ( dash*3, between letters*3, between words*7 )
char i; // stores current character


/////////////////////////////////////////////////////////////////////////

void setup() {


Serial.begin(9600);   
pinMode(12, OUTPUT);

mCode = "";

  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.println("SMS Messages Receiver");

  // connection state
  boolean notConnected = true;

  // Start GSM connection
  while (notConnected) {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
      notConnected = false;
    } else {
      Serial.println("Not connected");
      delay(500);
    }
  }

  Serial.println("GSM initialized");
  Serial.println("Waiting for messages");
}

/////////////////////////////////////////////////////////////////


void loop() {

 
  // If there are any SMSs available()
  if (sms.available()) { // checks to see if there is a message on the SIM 
    Serial.println("Message received from:");
    
    // Get remote number
   sms.remoteNumber(senderNumber, 20);
   Serial.println(senderNumber);

    // An example of message disposal
    // Any messages starting with # should be discarded
    if (sms.peek() == '#') {
      Serial.println("Discarded SMS");
      sms.flush();
      
    }

      while(char inChar = (char)sms.read()){
    
      mCode += inChar;
      Serial.println(mCode);// serial print for debugging
      doString(); 
      }  
      
   
    Serial.println("\nEND OF MESSAGE");

    
    sms.flush();  // Delete message from modem memory
    mCode = "";
    Serial.println("MESSAGE DELETED");
  
}
}

/////////////////////////////////////////////////////////////////////

void dot(){

  digitalWrite(12, HIGH); // ON
  delay(pause);
  digitalWrite(12, LOW); // OFF
  delay(pause);
}

void dash(){

  digitalWrite(12, HIGH); // ON
  delay(pause*3);
  digitalWrite(12, LOW); // OFF
  delay(pause);
}

void doString(){
  mCodeLength = mCode.length();           // get the length of string
  for( int x=0; x<=mCodeLength; x++){  // loop this until end of string is reached
  i = mCode.charAt(x);                    // get char at pos x.  x now becomes i
  translate();                            // run through translate into Morse Code function
}
}

void translate(){

  switch(i){
    case 'A':    // if it is A ( CHAR IN '', STRING IN "" )
    dot();        // do dot
    dash();       // do dash 
    break;
    
    case 'B':    
    dash();        
    dot();   
    dot();    
    dot();         
    break;

    case 'C':    
    dash();        
    dot();   
    dash();      
    dot();         
    break;

    case 'D':    
    dash();        
    dot();   
    dot();         
    break;  

    case 'E':           
    dot();        
    break; 

    case 'F':            
    dot();   
    dot();
    dash();
    dot();         
    break; 

    case 'G':               
    dash();
    dash();
    dot();         
    break; 

    case 'H':            
    dot();   
    dot();
    dot();
    dot();         
    break; 

    case 'I':            
    dot();   
    dot();         
    break; 

    case 'J':            
    dot();   
    dash();
    dash();
    dash();         
    break; 

    case 'K':            
    dash();   
    dot();
    dash();
    dot();         
    break; 

    case 'L':            
    dot();   
    dash();
    dot();
    dot();         
    break; 

    case 'M':            
    dash();   
    dash();        
    break; 

    case 'N':            
    dot();   
    dash();         
    break;
    
    case 'O':            
    dash();   
    dash();
    dash();
    dash();         
    break; 

    case 'P':            
    dot();   
    dash();
    dash();
    dot();         
    break; 

    case 'Q':            
    dash();   
    dash();
    dot();
    dash();         
    break; 

    case 'R':            
    dot();   
    dash();
    dot();         
    break; 

    case 'S':            
    dot();   
    dot();
    dot();         
    break; 

    case 'T':              
    dash();         
    break; 

    case 'U':            
    dot();   
    dot();
    dash();         
    break; 

    case 'V':            
    dot();   
    dot();
    dot();
    dash();         
    break; 

    case 'W':            
    dot();   
    dash();
    dash();        
    break; 
    
    case 'X':            
    dash();   
    dot();
    dot();
    dash();         
    break; 
    
    case 'Y':            
    dash();   
    dot();
    dash();
    dash();         
    break; 

    case 'Z':            
    dash();   
    dash();
    dot();
    dot();         
    break; 

    case '1':    
    dot();        
    dash();   
    dash();    
    dash(); 
    dash();         
    break;

    case '2':    
    dot();        
    dot();   
    dash();    
    dash(); 
    dash();           
    break;

    case '3':    
    dot();        
    dot();   
    dot();    
    dash(); 
    dash();        
    break;

    case '4':    
    dot();        
    dot();   
    dot();    
    dot(); 
    dash();         
    break;

    case '5':    
    dot();        
    dot();   
    dot();    
    dot(); 
    dot();       
    break;

    case '6':    
    dash();        
    dot();   
    dot();    
    dot(); 
    dot();        
    break;

    case '7':    
    dash();        
    dash();   
    dot();    
    dot(); 
    dot();         
    break;

    case '8':    
    dash(); 
    dash();
    dash();         
    dot();    
    dot();         
    break;

    case '9':    
    dash(); 
    dash();
    dash();         
    dash();    
    dot();           
    break;

    case '0':    
    dash(); 
    dash();
    dash();         
    dash();    
    dash();           
    break;

    case '!':    
    dash(); 
    dot();
    dash();         
    dash();    
    dash();           
    break;
    
    default: // between words
    delay(pause*7);
    break;
  }

  delay(pause*3);   // delay between letters 
}

These two statements:

      Serial.println(mCode);// serial print for debugging
      doString();

should be after the while loop.

You might eventually run into problems with garbled output caused by using Strings instead of null-terminted C strings.

Pete

That did it. Thanks el_supremo.