Help needed: Arduino Wireless Notice Board project
-
@salmanfaris After countless trials and efforts without success, I have decided to use two separate microcontrollers (Atmega328p). One microcontroller receives SMS from SIM800l, parses it and sends it to the second microcontroller via serial interface (Arduino Rx and Tx pin). The second microcontroller receives the message via serial and send it to p10 module for display. This solution is not cost-effective because of the additional microcontroller. However, it solves the problem of interference between DMD library and SoftwareSerial which appeared to be the reason for the corrupted string I shared earlier.
However, I am facing another challenge; the message that the second microcontroller receives via serial interface is not complete. When I send "*Hello people of working with you are you doing tonight or tomorrow morning dear#" via SMS, what is received and displayed on p10 is "*Hello people of working with you are you doing tonight or tomo".
Here are the two codes:
Code for receiving SMS
#include <SIM800L.h> SIM800L sim800l(2, 3); //Rx, Tx int LED_PIN = 8; //Enter the phone number of the person whom you want to send sms String reply = "Hey! I have got your message"; void handleSMS(String number, String message) { int start_index = message.indexOf('*'); // message starts with '*' int end_index = message.indexOf('#'); // message ends with '*' //message.trim(); // if message starts with * and ends with # if(start_index == 0 && end_index == (message.length() - 1)) { Serial.println(message); blinkLed(); sim800l.sendSMS(number, reply); } } void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); sim800l.begin(9600); sim800l.setSMSCallback(handleSMS); } void loop() { sim800l.listen(); } void blinkLed(){ for(int i = 0; i < 3; i++){ digitalWrite(LED_PIN, HIGH); delay(1000); digitalWrite(LED_PIN, LOW); delay(1000); } }
*** Code for receiving and displaying message on p10 ***
#include <SPI.h> #include "buzzer.h" #include <DMD.h> #include "memory.h" #include <TimerOne.h> #include "SystemFont5x7.h" #include "Arial_black_16.h" #define ROW 3 #define COLUMN 1 #define FONT Arial_Black_16 char message [500] = "Welcome to electronic projects workshop 1234"; char r_msg[500] = ""; bool flag = false; DMD led_module(ROW, COLUMN); void scan_module() { led_module.scanDisplayBySPI(); } void setup() { EEPROM.begin(); Serial.begin(9600); buzzerSetup(); beeps(3); int m_length = EEPROM.read(5); // strcpy(message, ""); String stored_string = read_string(5); char stored_char[stored_string.length() + 1]; stored_string.toCharArray(stored_char, stored_string.length() + 1); // convert message from string to array of char strcpy(message, stored_char); // update p10 with stored message Timer1.initialize(2000); Timer1.attachInterrupt(scan_module); led_module.clearScreen( true ); } void loop() { Serial.println(read_string(5)); receiveMessage(); led_module.selectFont(FONT); led_module.drawMarquee(message, strlen(message), (32 * ROW), 0); long start = millis(); long timming = start; boolean flag = false; while (!flag) { if ((timming + 20) < millis()) { flag = led_module.stepMarquee(-1, 0); timming = millis(); } } } void receiveMessage() { /* Listens to incoming message through serial interface. It extracts the message if it starts with '*' and ends with '#' */ while(Serial.available()) { String s_msg = Serial.readString(); // s_msg.trim(); int start_index = s_msg.indexOf('*') + 1; int end_index = s_msg.indexOf('#'); // whether message contains * and # and also # comes after * if(start_index > 0 ){ beeps(1); String substr = s_msg.substring(start_index, end_index - 1); int m_len = substr.length() + 1; char m_msg [m_len]; substr.toCharArray(m_msg, m_len); strcpy(message, m_msg); // write to eeprom writeString(5, substr); } } }
-
@codelery It might be because of buffer size of received message. You need to increase the buffer size.
Check the section "Expanding Arduino SoftwareSerial Buffer Size" in this tutorial : https://lastminuteengineers.com/sim800l-gsm-module-arduino-tutorial/ -
@rafitc99 The thing is that I am not using the SoftwareSerial library in receiving the message from the first microcontroller. I am using the hardware serial (pin 0 and 1 on Arduino Uno)
-
@codelery said in Help needed: Arduino Wireless Notice Board project:
I am using the hardware serial (pin 0 and 1 on Arduino Uno)
As @rafitc99 mentioned, you need to expand the Serila buffer, in the hardware serial also the Arduino board package implements a 64-byte ring buffer for send and receive on the hardware serial messages. So you need to change that to 256 as per your message length.
-
@salmanfaris I did change the buffer size and everything is working perfectly. Thanks coming to my rescue.
-
@rafitc99 I changed the buffer and that solved the problem. Thanks a lot for coming to my rescue.
-