Data drop when using 12c and softwareserial

Hi everyone,

I’m making a controller to handle some motors and am running into a slight issue.
I’m using two arduino pro minis communicating via wire.
The flow of the program is essentially this:
the “master” reads button and joystick states and prints them via the bluetooth software serial.
If there are any commands coming into the bluetooth, it opens the wire command and sends the char along. The “slave” arduino then updates an oled based on the char it sees.

My issue is that sometimes ( not every time) the string stream will stop while the oled draws the bmp.
In my motor plc logic, this instigates an estop because it believes the controller has lost comms.

I thought that I’d fixed this by opening wire comms, sending the char, then closing wire comms.

Does anyone have any ideas on how I could make this more solid?

Thanks in advance for any help!

Master code:

#include <SoftwareSerial.h>
#include <SD.h>
#include <SPI.h>
#include <Wire.h>



/////////////////////////Controller Name//////////////////////////////////

char controllername[5] = {'0', '0', '0', '6'} ; // To be changed with every controller.

///////////////////////////Serial Declaration//////////////////////////////
int bluetoothTx = 2;  // TX-O pin of bluetooth mate
int bluetoothRx = 3;  // RX-I pin of bluetooth mate
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);


///////////////////Inputs//////////////////////////

#define VERT  A6 // analog SHOULD BE A4
#define HORIZ  A7 // analog

#define Deadman  4
#define Estop  5
#define Zaxis  6
#define Sync  7
//const int AccelX = A1;
//const int AccelY = A2;
#define AccelZ  A3

int indicatorled = 13;
//////////////////Global Variables/////////////////

int battVolts;   // made global for wider avaliblity throughout a sketch if needed, example a low voltage alarm, etc
int DeadmanState = 0;
int SyncState = 0 ;
int ZaxisState = 0;
int EstopState = 0;
int upperlimit = 1; //Counter for Toggle bit
int lowerlimit = 0; //Counter for Toggle bit
int count; // for the Toggle bit
int bluetoothcounter = 0; //This increases when nothing is sent to the contoller and resets when a command is recieved. Used to test connection.
int previousbtc = 0;
int ppbtc = 0;
int screencount = 0;

int btcount = 101;
char CurrentScreenState = '0';

int notconnected = 0;

void setup() {


  int previousbtc = 0;
  int btc = 0;


  Wire.begin();
  Serial.begin(9600);
  bluetooth.begin(19200);

  pinMode(Sync, INPUT);
  pinMode(Deadman, INPUT);
  pinMode(Zaxis, INPUT);
  pinMode(Estop, INPUT);
  pinMode(indicatorled, OUTPUT);
  delay (5000);
}
void loop() {



  bluetoothcounter = 0;
  if (count < upperlimit) {
    (count ++);
  }
  else if (count > lowerlimit) {
    (count --);
  }


  int bluetoothread = bluetooth.read();

  if (bluetoothread != -1) {
    btcount = 0;
  }
  if (bluetoothread == -1) {
    btcount ++;

    if (btcount == 100 ) {
      Wire.beginTransmission(1);
      Wire.write('H');
      Wire.endTransmission();
      CurrentScreenState = 'H';

    }
  }

  if (bluetoothread != previousbtc && bluetoothread < 100 || bluetoothread == -1  ) {
    previousbtc = bluetoothread;
    screencount = 0;
  }
  if (bluetoothread == previousbtc && bluetoothread < 100 && bluetoothread > -1 ) {

    previousbtc = bluetoothread;
    screencount ++;
  }







  if (screencount == 3 && bluetoothread < 100) {

    if (bluetoothread == ppbtc) {
      screencount = 0;
    } else {

      int btc = bluetoothread;

      Wire.beginTransmission(1);
      Wire.write(btc);
      Wire.endTransmission();
      if (btc == 'E' || btc == 'F')
      {} else {
        CurrentScreenState = btc;
      }

      ppbtc = bluetoothread;
      previousbtc = bluetoothread;
    }


  }

  //////////////////////Joy Stick Read/////////////////////////////
  String vertical, horizontal ;   // read all values from the joystick

  vertical = ((map (analogRead(VERT), 0, 1023, 1023, 0) + 10000)); // will be 0-1023
  horizontal = (analogRead(HORIZ) + 10000); // will be 0-1023



  ///////////////////// Button State Read////////////////////////
  char DeadmanState; //= digitalRead(Deadman);
  char ZaxisState; //= digitalRead(Zaxis);
  char EstopState; //= digitalRead(Estop);
  char CountState;
  if (digitalRead(Deadman) == 1) {
    DeadmanState = 'F';
  } else if (digitalRead(Deadman) == 0) {
    DeadmanState = 'N';
  }
  if (digitalRead(Zaxis) == 1) {
    ZaxisState = 'F';
  } else if (digitalRead(Zaxis) == 0) {
    ZaxisState = 'N';
  }
  if (digitalRead(Estop) == 1) {
    EstopState = 'N';
  } else if (digitalRead(Estop) == 0) {
    EstopState = 'F';
  }
  if (count == 1) {
    CountState = 'N';
  } else if (count == 0) {
    CountState = 'F';
  }





  /////////////Toggle Bit///////////////////////////


  ///////////////////////////////////////PrintValues/////////////////////

  String packet = String("V" + vertical + "v" + "H" + horizontal + "h" + "Z" + ZaxisState + "z" + "D" + DeadmanState + "d" + "E" + EstopState + "e" + "C" + CountState + "c" + "J" + controllername + "j" + "S" + CurrentScreenState + "s");
  bluetooth.println(packet);




 

}


////////////////////////////////////END OF LOOP////////////////////////////////

And here’s the slave code:

#include <Wire.h>

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1351.h>
#include <SD.h>
#include <SPI.h>
#include <Fonts/FreeMonoBoldOblique12pt7b.h>
///////////////////OLED Things////////////////////////

#define sclk 13
#define mosi 11
#define dc   A1
#define cs   9
#define rst  A0
#define miso   12
#define SD_CS 10

// Color definitions
#define BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0  
#define WHITE           0xFFFF

Adafruit_SSD1351 tft = Adafruit_SSD1351(cs, dc, rst);

File bmpFile;

int bmpWidth, bmpHeight;
uint8_t bmpDepth, bmpImageoffset;


  int btx = 55;
  int bty = 100;



  unsigned long currenttime=millis();
  unsigned long lasttime;
/////////////////////////Controller Name//////////////////////////////////

 

///////////////////////////Serial Declaration//////////////////////////////
#define button 2
#define xAxisPin A3
#define yAxisPin A2




char ScreenState = 0;
///////////////////Inputs//////////////////////////





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


void setup()
  {
    Serial.begin(9600);
    Wire.begin(1);
    Wire.onReceive(Icon);
  
    
    pinMode(cs, OUTPUT);
    digitalWrite(cs, HIGH);
  
    tft.begin();
  
    tft.fillScreen(BLACK);
    delay(500);
    if (!SD.begin(SD_CS))   // Check SD Card
      { 
          tft.setCursor(30, 60);
          tft.setTextColor(RED);  
          tft.setTextSize(1.85);
          Serial.println("SD Failed");
          return;
      }
    Serial.println("SD OK!");  
    tft.setRotation(2);    // Sets the rotation of the Bitmap images 0,1,2,3,4
     
     tft.fillScreen(BLACK);
                bmpDraw("blue.bmp", 36, 25);
                tft.setCursor(29, 90);
                tft.setTextColor(BLUE);  
                tft.setTextSize(1);
                tft.println("No Connection");
     
    
     Battery();
  }


void loop()
  {
   
    int voltage=getBandgap();
    unsigned long currenttime=millis(); 
   if (currenttime-lasttime >= 300000){
        lasttime=currenttime;    
        Battery();
       }
      
  }

void Icon()
 {  
//int voltage=getBandgap();
  char btc = Wire.read();
  //char ScreenState = 0;

  
  ScreenState = btc;

  int myWidth = tft.width();
  int myHeight = tft.height();

  
  //Wire.onRequest(ScreenState);

        switch (ScreenState)   // Actions to be done when message recieved from Beckoff
          {
              case '0':
                
              break;
        
              case '1':
               
                    tft.fillScreen(BLACK);
                    bmpDraw("height.bmp", 33, 25);
                    tft.setCursor(30, 03);
                    tft.setTextColor(BLUE);  
                    tft.setTextSize(1.85);
                    tft.println("Height Mode");
                    
                    Battery();
                  
                    break;
                
              
 
        
              case '2':
               
                tft.fillScreen(BLACK);
                bmpDraw("home.bmp", 36, 25);
                tft.setCursor(30, 03);
                tft.setTextColor(BLUE);  
                tft.setTextSize(1);
                tft.println("Homing Mode");
                   
                Battery();
                break;
               
              
              case '3':
                tft.fillScreen(BLACK);
                bmpDraw("error.bmp", 36, 25);
                tft.setCursor(53, 3);
                tft.setTextColor(BLUE);  
                tft.setTextSize(1);
                tft.println("Error");
                    
                 Battery();
              break;
              
              case '4':
                tft.fillScreen(BLACK);
                bmpDraw("path.bmp", 33, 25);
                tft.setCursor(36, 3);
                tft.setTextColor(BLUE);  
                tft.setTextSize(1.85);
                tft.println("Path Mode");
                    
                 Battery();
              break;
              
              case '5':
                tft.fillScreen(BLACK);
                bmpDraw("reset.bmp", 33, 25);
                tft.setCursor(32, 3);
                tft.setTextColor(BLUE);  
                tft.setTextSize(1.85);
                tft.println("Path Reset");
                   
                Battery();
              break;
            
              case '6':
                tft.fillScreen(BLACK);
                bmpDraw("shortcut.bmp", 36, 25);
                tft.setCursor(25, 3);
                tft.setTextColor(BLUE);  
                tft.setTextSize(1.85);
                tft.println("Shortcut Mode");
                   
                Battery();
              break;
            
              case '7':
                tft.fillScreen(BLACK);
                bmpDraw("storage.bmp", 36, 25);
                tft.setCursor(25, 0);
                tft.setTextColor(BLUE);  
                tft.setTextSize(1.85);
                tft.println("Storage Mode");
                   
                Battery();
              break;
      
      
              case '8':
                tft.fillScreen(BLACK);                
                tft.setCursor(30, 03);
                tft.setTextColor(BLUE);  
                tft.setTextSize(1);
                tft.println("Homing Mode");
                tft.setCursor(36, 14);
                tft.setTextColor(BLUE);  
                tft.setTextSize(1);
                tft.println("Tracking");
                bmpDraw("home.bmp", 33, 25);
                tft.setCursor(0, 87);
                tft.setTextColor(BLUE);  
                tft.setTextSize(1);
                tft.println("Carrier");
                tft.setCursor(98, 87);
                tft.setTextColor(BLUE);  
                tft.setTextSize(1);
                tft.println("Lock");
                bmpDraw("carrier.bmp", 0, 100);
                bmpDraw("lock.bmp", 93, 100);
                tft.fillCircle(33,113, 5,RED);
                tft.fillCircle(120,113,5,RED);
                   
                Battery();
              break;
              
              case 'A':
              //bmpDraw("carrier.bmp" , 0 , 100);
              //bmpDraw("lock.bmp"    , 93, 100);
                tft.fillCircle(33,113, 5,RED);
                tft.fillCircle(120,113,5,RED);
                    
              break;
             
              case 'B':
              //bmpDraw("carrier.bmp", 0, 100);
              //bmpDraw("lock.bmp", 93, 100);
                tft.fillCircle(33,113, 5,GREEN);
                tft.fillCircle(120,113,5,GREEN);
                    
              break;
              
              case 'C':
              //bmpDraw("carrier.bmp", 0, 100);
              //bmpDraw("lock.bmp", 93, 100);
                tft.fillCircle(33,113, 5,GREEN);
                tft.fillCircle(120,113,5,RED);
                    
              break;
             
              case 'D':
              //bmpDraw("carrier.bmp", 0, 100);
              //bmpDraw("lock.bmp", 93, 100);
                tft.fillCircle(33,113, 5,RED);
                tft.fillCircle(120,113,5,GREEN);
                    
              break;
              
              case 'E':      //grey circle
              //bmpDraw("carrier.bmp", 0, 100);
              //bmpDraw("lock.bmp", 93, 100);
                tft.fillCircle(120,9, 5,0x7777);
              break;
              
              case 'F':     //blue circle 
             //bmpDraw  ("carrier.bmp", 0, 100);
             // bmpDraw ("lock.bmp", 93, 100);
                tft.fillCircle(120,9, 5,BLUE);
              break;

              case 'G':     //bluetooth on 
                
                  
              break;

              case 'H':     //bluetooth off 
                
                tft.fillScreen(BLACK);
                bmpDraw("blue.bmp", 36, 25);
                tft.setCursor(29, 90);
                tft.setTextColor(BLUE);  
                tft.setTextSize(1);
                tft.println("No Connection");
                
                  Battery();
              break;

              
              
             
             
            
             case '9':
             break;
             
            default:
            break;
           //bluetoothcounter ++;
           //if (bluetoothcounter >10)
           //{
           //}
           
    }
 }