Hello all!
I am making a Ionizing Radiation Detector project, but my sketch is too big! I would rather not remove any of the functionality I have added, although I may have to if I cannot find another way to lower the sketch size by 2%.
The current sketch size is 29446(102%)bytes. Maximum is 28672 bytes.
The current global variables is 2055(80%)bytes, leaving 505 bytes for local variables. Maximum is 2560 bytes.
Current sketch is 380 lines long.
Sketch:
//Geiger Counter Project / DFRobot
#include <TinyGPS++.h>
#include <SD.h>
#include <SPI.h>
#include <DFRobot_RGBLCD1602.h>
#include <SoftwareSerial.h>
#include <DFRobot_Geiger.h>
#include <EEPROM.h>
#define geigerPin 0//D0
#define vibration 10//D10
#define SDss A0
#define button A1
#define startuSvh 12
#define dangeruSvh 50
#define arrSize(X) sizeof(X) / sizeof(X[0])
int values[] = { 1, 5, 10, 40, 100, 250, 400, 1000, 10000 };
const char* equivalent[] = { "Airport", "Dental", "Norm(1day)", "Flight", "X-Ray", "NPP(1year)", "Mammogram", "Gov Limit", "CT Scan" };
byte hazardChar[8] = {
0b00000,
0b00000,
0b01110,
0b11001,
0b10101,
0b10011,
0b01110,
0b00000
};
byte motor1Char[8] = {
0b00110,
0b00110,
0b00100,
0b01110,
0b01110,
0b01110,
0b01110,
0b01110
};
byte motor2Char[8] = {
0b01100,
0b01100,
0b00100,
0b01110,
0b01110,
0b01110,
0b01110,
0b01110
};
byte fullChar[8] = {
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111
};
int savegeigertime = 300000;//5 min
int savegeigergpstime = 120000; //2 min
static const int RXPin = 1, TXPin = 9;//D1/D9
static const uint32_t GPSBaud = 9600;
int timer1 = 0;
int timer2 = 0;
int timer3 = 0;
int mode = 0;
boolean vib = false;
int count = 0;
int count2 = 0;
int CPM = 0;
int uSvh = 0;
int nSvh = 0;
File myFile;
char fileName[] = "geiger.txt";
char wfileName[] = "warnings.txt";
DFRobot_Geiger geiger(geigerPin);
DFRobot_RGBLCD1602 lcd(/*lcdCols*/16,/*lcdRows*/2);
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
void setup() {
pinMode(button, INPUT_PULLUP);
pinMode(SDss, OUTPUT);
pinMode(vibration, OUTPUT);
ss.begin(GPSBaud);
geiger.start();
lcd.init();
lcd.customSymbol(1,motor1Char);
lcd.customSymbol(2,motor2Char);
lcd.customSymbol(3,hazardChar);
lcd.customSymbol(4,fullChar);
lcd.setCursor(1,4);
lcd.print("Geiger");
lcd.setCursor(2,3);
lcd.print("Counter");
lcd.setRGB(0,255,0);
delay(3000);
for (int i=0;i<17;i++){
lcd.scrollDisplayLeft();
delay(50);
}
if (!SD.begin(SDss)) {
lcd.setRGB(255, 0, 0);
lcd.setCursor(1,1);
lcd.print("SD Init Failed");
delay(3000);
}
lcd.clear();
lcd.setRGB(0,255,0);
EEPROM.get(0,mode);
EEPROM.get(1,vib);
}
void loop() {
geiger.pause();
CPM = geiger.getCPM();
uSvh = geiger.getuSvh();
nSvh = geiger.getnSvh();
geiger.start();
if (button == LOW){
redo:
timer1++;
delay(1);
while (button == LOW){ goto redo;}
if (timer1 <= 1000){
mode = 1;
lcd.setRGB(0, 255, 0);
lcd.setCursor(0,1);
lcd.print("Standard Mode");
delay(3000);
lcd.clear();
}
else if (timer1 > 1500 && timer1 <= 2500){
mode = 2;
lcd.setRGB(0, 255, 255);
lcd.setCursor(3,0);
lcd.print("Bar Mode");
delay(3000);
lcd.clear();
}
else if (timer1 > 2500 && timer1 <= 3500){
mode = 3;
lcd.setRGB(0, 0, 255);
lcd.setCursor(0,1);
lcd.print("Equivalents Mode");
delay(3000);
lcd.clear();
}
else if (timer1 > 3500 && timer1 <= 4500){
vib = !vib;
lcd.setRGB(255, 0, 255);
for (int i=0;i<6;i++){
lcd.setCursor(0,1);
lcd.print("Vibration");
lcd.setCursor(1,6);
lcd.print(vib > 0 ? "On" : "Off");
lcd.setCursor(1,14);
lcd.write(1);
delay(500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Vibration");
lcd.setCursor(6,1);
lcd.print(vib > 0 ? "On" : "Off");
lcd.setCursor(14,1);
lcd.write(2);
delay(500);
lcd.clear();
}
//delay(3000);
lcd.clear();
EEPROM.write(1, vib);
if (mode == 1){
lcd.setRGB(0, 255, 0);
}
else if (mode == 2){
lcd.setRGB(0, 255, 255);
}
else if (mode == 3){
lcd.setRGB(0, 0, 255);
}
}
EEPROM.write(0, mode);
}
lcdDisplayData(uSvh);
if (uSvh > startuSvh && uSvh < (dangeruSvh - 1)){
lcd.setRGB(255, 172, 28);
lcd.setCursor(14,2);
lcd.write(3);
if (vib){
analogWrite(vibration, 128);
}
myFile = SD.open(wfileName, FILE_WRITE);
if (myFile){
myFile.println("---------Warning---------");
myFile.println("------Type=Moderate------");
myFile.println("Time: " + String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()));
myFile.println("Date: " + String(gps.date.month()) + "/" + String(gps.date.day()) + "/" + String(gps.date.year()));
myFile.println("Millis: " + String(millis()));
myFile.println("Geiger (CPM): " + String(CPM));
myFile.println("Geiger (nSvh): " + String(nSvh));
myFile.println("Geiger (uSvh): " + String(uSvh));
myFile.println("----------------------------------------------------------");
myFile.println("");
myFile.close();
}
}
else if (uSvh >= dangeruSvh){
lcd.setRGB(255, 0, 0);
lcd.setCursor(1,14);
lcd.write(3);
if (vib){
analogWrite(vibration, 255);
}
myFile = SD.open(wfileName, FILE_WRITE);
if (myFile){
myFile.println("---------Warning---------");
myFile.println("-------Type=Severe-------");
myFile.println("Time: " + String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()));
myFile.println("Date: " + String(gps.date.month()) + "/" + String(gps.date.day()) + "/" + String(gps.date.year()));
myFile.println("Millis: " + String(millis()));
myFile.println("Geiger (CPM): " + String(CPM));
myFile.println("Geiger (nSvh): " + String(nSvh));
myFile.println("Geiger (uSvh): " + String(uSvh));
myFile.println("----------------------------------------------------------");
myFile.println("");
myFile.close();
}
}
if (mode == 2){
timer2++;
delay(1);
if (timer2 >= savegeigertime){
count++;
myFile = SD.open(fileName, FILE_WRITE);
if (myFile){
myFile.println("Time: " + String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()));
myFile.println("Date: " + String(gps.date.month()) + "/" + String(gps.date.day()) + "/" + String(gps.date.year()));
myFile.println("Count: " + String(count));
myFile.println("Millis: " + String(millis()));
myFile.println("Geiger (CPM): " + String(CPM));
myFile.println("Geiger (nSvh): " + String(nSvh));
myFile.println("Geiger (uSvh): " + String(uSvh));
myFile.println("----------------------------------------------------------");
myFile.println("");
myFile.close();
}
timer2 = 0;
}
}
else if (mode == 3){
timer3++;
delay(1);
if (timer3 >= savegeigergpstime){
count2++;
myFile = SD.open(fileName, FILE_WRITE);
if (myFile){
myFile.println("Time: " + String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()));
myFile.println("Date: " + String(gps.date.month()) + "/" + String(gps.date.day()) + "/" + String(gps.date.year()));
myFile.println("Count: " + String(count2));
myFile.println("Millis: " + String(millis()));
myFile.println("Latitude: " + String(gps.location.lat()));
myFile.println("Longitude: " + String(gps.location.lng()));
myFile.println("Satellites: " + String(gps.satellites.value()));
myFile.println("Altitude: " + String(gps.altitude.feet()));
myFile.println("Course: " + String(gps.course.deg()));
myFile.println("Speed: " + String(gps.speed.mph()));
myFile.println("Geiger (CPM): " + String(CPM));
myFile.println("Geiger (nSvh): " + String(nSvh));
myFile.println("Geiger (uSvh): " + String(uSvh));
myFile.println("----------------------------------------------------------");
myFile.println("");
myFile.close();
}
timer3 = 0;
}
}
delay(1000);
lcd.clear();
}
int nearestEqual(int x, bool sorted = true) {
int idx = 0; // by default near first element
int distance = abs(values[idx] - x);
for (int i = 1; i < arrSize(values); i++) {
int d = abs(values[i] - x);
if (d < distance) {
idx = i;
distance = d;
}
else if (sorted) return idx;
}
return idx;
}
void lcdDisplayData(int re){
if (mode == 1){
lcd.setCursor(0,0);
lcd.print("Geiger Val(nSv):");
lcd.setCursor(4,1);
lcd.print(re);
}
else if (mode == 2){
lcd.setCursor(0,0);
lcd.print("Geiger:");
lcd.setCursor(9,0);
lcd.print(re);
lcd.setCursor(0,1);
lcd.print(equivalent[nearestEqual(re)]);
}
else if (mode == 3){
lcd.setCursor(0,0);
lcd.print("Geiger:");
lcd.setCursor(9,0);
lcd.print(re);
lcd.setCursor(0,1);
lcdBar(re);
}
lcdbacklight(re);
}
void lcdBar(int re){
for (int i=0;i<nearestEqual(re);i++){
lcd.setCursor(i,1);
lcd.write(4);
}
}
void lcdbacklight(int re){
if (nearestEqual(re) == 1 || nearestEqual(re) == 2){//green
lcd.setRGB(0,255,0);
}
else if (nearestEqual(re) == 3){//green/yellow
lcd.setRGB(150,255,0);
}
else if (nearestEqual(re) == 4){//yellow
lcd.setRGB(255,255,0);
}
else if (nearestEqual(re) == 5){//orange
lcd.setRGB(255,180,0);
}
else if (nearestEqual(re) == 6){//orange/red
lcd.setRGB(255,100,0);
}
else if (nearestEqual(re) == 7){//red
lcd.setRGB(255,0,0);
}
else if (nearestEqual(re) == 8){//pink
lcd.setRGB(255,0,150);
}
else if (nearestEqual(re) == 9){//purple
lcd.setRGB(175,0,255);
}
}
Thanks in advance for any advice!