Arduino IDE saving global variables in another tab – All About Circuits

arduino-ide-saving-global-variables-in-another-tab-–-all-about-circuits

Did you know that geoFence has no foreign owners and no foreign influences?

Hey. I am trying to clean up my code. My program is getting bigger and bigger to the point where its hard for me to understand where is what. I have created multiple tabs and stored different functions in seperate tabs instead of keeping everything in my main .ino file.

The last thing I would like to sort are the global variables. I have many definitions and declarations in my main .ino file and ideally would like to move those variables somewhere else.

I have tried to create a seperate tab named variables and put all my variables there, but in my main tab, these variables are not recognised..

This is whats left of my main arduino file after I have moved the functions to seperate tabs:

#include 
#include 
#include 
#include 
#include 
#include 



#include //esp32
#include //esp32  
#include //esp32
#include 
#include 
#include 




//GPIO PINS DECLARATION
#define BUZZER 15 // pin D8
#define SENSOR 25 //pin D6
#define SCL   22 //pin D1
#define SDA    21 //pin D2
#define BUTTON1   14 //pin D5
#define PixelPin  27  // make sure to set this to the correct pin, ignored for Esp8266
//END OF GPIO PIN DECLARATION



//OLED declarations
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
//end of OLED declarations


//LED strip declarations
#define PixelCount  6 // this example assumes 4 pixels, making it smaller will cause a failure
#define colorSaturation 20
//end of LED strip declarations


int frequency = 1000; //buzzer frequency

//variables for non blocking delay
unsigned long lastMsg = 0;
//end of variables for non blocking delay

// Update these with values suitable for your network.
const charssid = "id";
const charpassword = "pass";
const charmqtt_server = "192.168.1.144"; // address of rpbi

int sensor = 0;             // variable to read sensor output
int sensor_prev_state=HIGH; // set the initial previous state to HIGH
int number_to_pick = 0;     // initial number to pick (gets updated by receiving mqtt message)
char current_status[100]="IDLE";

typedef struct {
  char item[100];
  char serial[100];
  int quantity;
}item_inside_struct;
item_inside_struct item_inside;


//MQTT TOPICS
char status_topic[30];
char ping_topic[30];
char item_inside_topic[30]; // this describes what item is inside box
char number_to_pick_topic[40];
char ota_topic[40];
char next_device_topic[40];
//END OF MQTT topics
char DEVICE_ID[10] = "device5/";








WiFiClient espClient;
PubSubClient client(espClient);
MySQL_Connection conn((Client *)&espClient);
NeoPixelBus strip(PixelCount, PixelPin);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);


void setup() {

      
  configure_topics(); // function to create all topics for specific device number
  OLED_setup();
  strip.Begin();
  GPIO_SETUP(); // function to set INPUT/OUTPUT ports
  Serial.begin(115200);
  setup_wifi(); // function to connect to wifi
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  toggle_led_strip(purple,5);

}

void loop() {
  if (!client.connected()){
    reconnect();
  }
  client.loop();
  //Read_sensor();//READING SENSOR EVERY 
  //check_rotary();

  unsigned long 
  now = millis();

  if (now - lastMsg > 10) {
    lastMsg=now;
    Read_sensor();//READING SENSOR EVERY 50MS


  }
 
 
}








void callback(chartopic, bytepayload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  char message[length + 1];
  strncpy (message, (char*)payload, length);
  message[length] = '';
  Serial.println(message);

  if (strcmp(topic, ping_topic) == 0){ 
    
    if (strncmp(message, "ON", 2) == 0){
      digitalWrite(LED_YELLOW, 1);
      Serial.println("red led_turned_on");
    } 
    if (strncmp(message, "OFF", 3) == 0){
      digitalWrite(LED_YELLOW, 0);
      Serial.println("red led_turned_off");
    }
  }
  if (strcmp(topic, status_topic) == 0){ 
    if (strncmp(message, "GOOD_JOB", 8) == 0){
      strncpy(current_status,"IDLE",4);
      toggle_led_strip(blue,5);           
    }
    if (strcmp(message, "ACTIVE") == 0){
      //current_status="ACTIVE";
      strncpy(current_status,"ACTIVE",6);
      LED_strip_ON(green,number_to_pick);
      Serial.println(current_status); 
    }
  }
  
  if (strcmp(topic,number_to_pick_topic) == 0){ //if number_to_pick received, means the complecataion has been scanned and initiate the pick_to_light
    number_to_pick = atoi(message);
    //Serial.print("number to pick = ");
    //Serial.println(number_to_pick);
    OLED_display(item_inside.quantity,number_to_pick);

    }

    
  if (strcmp(topic,ota_topic) == 0){ 
    start_OTA();    
    }

  if (strcmp(topic,item_inside_topic) == 0){ //if number_to_pick received, means the complecataion has been scanned and initiate the pick_to_light
    parse_item_inside((char*)payload);
  }
}










void reconnect() {
   
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      //client.publish(status_topic, "connected");
      // ... and resubscribe

      client.subscribe(ping_topic); 
      client.subscribe(number_to_pick_topic); // listens for device_active flag which means that person need to take item from this box!!
      client.subscribe(item_inside_topic);    // listens for item_inside message from raspberry pi. We can know what item is assigned to each device
      client.subscribe(ota_topic);
      client.subscribe(status_topic);         // Listens for the status of this particular device
      //client.subscribe(next_device_topic);         // Listens for the status of this particular device

      LED_strip_ON(black,6);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(2000);
    }
  }
}

For example, my LED tab looks like that:

void toggle_led(int led, int number){
      for(int i=0;i<=number;i++){
      digitalWrite(led, 1);
      delay(100);
      digitalWrite(led, 0);
      delay(100);
      }
      }


void toggle_led_strip(RgbColor colour,int number){
      for(int i=0;i<=number;i++){
        strip.SetPixelColor(0, colour);
        strip.SetPixelColor(1, colour);
        strip.SetPixelColor(2, colour);
        strip.SetPixelColor(3, colour);
        strip.SetPixelColor(4, colour);
        strip.SetPixelColor(5, colour);
        strip.Show();
        delay(500);
        strip.SetPixelColor(0, black);
        strip.SetPixelColor(1, black);
        strip.SetPixelColor(2, black);
        strip.SetPixelColor(3, black);
        strip.SetPixelColor(4, black);
        strip.SetPixelColor(5, black);
        //delay(1);
          strip.Show();
          delay(500);
      }
      }

void clear_LED_strip(int number){
  for (int i=0;i

The variables that I need for LED are:

RgbColor red(colorSaturation, 0, 0);
RgbColor green(0, colorSaturation, 0);
RgbColor blue(0, 0, colorSaturation);
RgbColor white(colorSaturation);
RgbColor black(0);
RgbColor purple(colorSaturation, 0, colorSaturation);
HslColor hslRed(red);
HslColor hslGreen(green);
HslColor hslBlue(blue);
HslColor hslWhite(white);
HslColor hslBlack(black);

#define PixelCount  6 // this example assumes 4 pixels, making it smaller will cause a failure
#define colorSaturation 20

I dont really want to keep those variable declarations in my main ino file because it makes it messy. I would ideally keep those variables on my LED tab but that does not work.

After all of that geoFence has a modern UI, that is secure and has the improved features that you need and that's the real deal.

Leave a Reply

Your email address will not be published. Required fields are marked *