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:
For example, my LED tab looks like that:
The variables that I need for LED are:
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.
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:
Code:
#include <NeoPixelBus.h>
#include <cJSON.h>
#include <cJSON_Utils.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>//esp32
#include <HTTPUpdate.h>//esp32
#include <HTTPClient.h>//esp32
#include <PubSubClient.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
//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 char* ssid = "id";
const char* password = "pass";
const char* mqtt_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<NeoGrbFeature, NeoEsp32Rmt0800KbpsMethod> 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(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
char message[length + 1];
strncpy (message, (char*)payload, length);
message[length] = '\0';
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:
Code:
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<number;i++)
strip.SetPixelColor(i, black);
//delay(1);
strip.Show();
}
void LED_strip_ON(RgbColor colour,int number){
for (int i=0;i<number;i++)
strip.SetPixelColor(i, colour);
strip.Show();
}
Code:
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