#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
int LightRaw = 0;
int BatteryRaw = 0;
int Sensitivity = 20;
int onTime = 50;
int menuPosition = 0;
int onFlag = 0;
int onCnt = 0;
volatile int millCnt = 0;
int minCnt = 0;
int hourCnt = 0;
int Toggle = HIGH;
float LightVolts = 0;
float BatteryVolts = 0;
void AnalogInputs()
{
display.setTextColor(WHITE, BLACK);
display.setCursor(0, 0);
display.print("LightRaw:");
display.print(LightRaw);
//LightVolts = 5/1023;
LightVolts = 0.0049*LightRaw;
display.setCursor(0, 10);
display.print("LightVolts:");
display.print(LightVolts);
display.setCursor(0, 30);
display.print("BatteryRaw:");
display.print(BatteryRaw);
BatteryVolts = 0.0049*BatteryRaw;
display.setCursor(0, 40);
display.print("BatteryVolts:");
display.print(BatteryVolts);
display.display();
}
ISR(TIMER1_COMPA_vect)
{
millCnt ++;
}
void setup()
{ // OLED display setup
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
// PIN Setup
pinMode(13,OUTPUT);
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(12,OUTPUT);
// Timer 1 Setup
TCCR1A = 0; // normal operation
TCCR1B = bit(WGM12) | bit(CS10); // CTC, no pre-scaling
OCR1A = 999; // compare A register value (1000 * clock speed)
TIMSK1 = bit (OCIE1A); // interrupt on Compare A Match
// Home Screen Setup
display.drawRect(0, 0, 128, 64, WHITE); //Border
display.drawRect(12, 12, 105, 12, WHITE); //Selection box
display.setTextColor(WHITE, BLACK);
display.setCursor(15, 14);
display.print("Sensitivity: ");
display.print("0");
display.print("%");
display.setCursor(15, 29);
display.print("On-Time: ");
display.print("0");
display.print(" Sec");
display.display();
}
void loop()
{
//-----------------------------------------------------------------------------------
//-------------------------------READ ANALOGUE INPUTS--------------------------------
//-----------------------------------------------------------------------------------
LightRaw = analogRead(0);
LightVolts = 0.0049*LightRaw;
BatteryRaw = analogRead(1);
BatteryVolts = 0.0049*BatteryRaw;
//-----------------------------------------------------------------------------------
//-------------------------------UPDATE OLED SCREEN VALUES---------------------------
//-----------------------------------------------------------------------------------
if(menuPosition == 0)
{display.drawRect(12, 12, 105, 12, WHITE);} //Selection box
else
{display.drawRect(12, 27, 105, 12, WHITE);} //Selection box
display.setTextColor(WHITE, BLACK);
display.setCursor(15, 14);
display.print("Sensitivity: ");
display.print(Sensitivity);
display.print("%");
display.setCursor(15, 29);
display.print("On-Time: ");
display.print(onTime/10);
display.print(" Hrs");
//----------------------------------voltages------------------------------------------
display.setCursor(15, 41);
display.print("Battery: ");
display.print(BatteryVolts);
display.print("V");
display.setCursor(15, 52);
display.print("Solar: ");
display.print(LightVolts);
display.print("V");
display.display();
//-----------------------------------------------------------------------------------
//-------------------------------LED OUTPUT CONTROL----------------------------------
//-----------------------------------------------------------------------------------
if(millCnt >= 60000) //count for 1 minute
{minCnt++;
millCnt = 0;} //reset milliseconds counter
if(minCnt >=60) //if 1 hour has been reached
{hourCnt++;
minCnt = 0;}
if(LightRaw<(Sensitivity*10) && BatteryVolts>3.5 && !onFlag)
{digitalWrite(13,HIGH);
onFlag = 1;
millCnt = 0; //Reset Timer counters
minCnt = 0;
hourCnt = 0;}
if(onFlag && hourCnt >= (onTime/10))
{digitalWrite(13,LOW);}
if(LightRaw > (Sensitivity*10))
{onFlag = 0;}
/*if(Toggle)
{digitalWrite(12, HIGH);
Toggle = LOW;}
else
{digitalWrite(12,LOW);
Toggle = HIGH;} */
//-----------------------------------------------------------------------------------
//-------------------------------MENU SELECTION--------------------------------------
//-----------------------------------------------------------------------------------
if(!digitalRead(2) || !digitalRead(4))
{
delay(300);
if(menuPosition == 0)
{menuPosition=1;}
else
{menuPosition=0;}
if(menuPosition == 1)
{
display.drawRect(12, 12, 105, 12, BLACK); //Selection box
digitalWrite(6, LOW);
display.drawRect(12, 27, 105, 12, WHITE); //Selection box
display.display();
}
if(menuPosition == 0)
{digitalWrite(7, HIGH);
display.drawRect(12, 27, 105, 12, BLACK); //Selection box
digitalWrite(7, LOW);
display.drawRect(12, 12, 105, 12, WHITE); //Selection box
display.display();
}
}
//-----------------------------------------------------------------------------------
//-------------------------------MENU 0 = LED ON SENSITIVITY-------------------------
//-----------------------------------------------------------------------------------
int enterButton = digitalRead(3);
if(!enterButton && menuPosition == 0)
{
delay(300);
int exit = 1;
display.clearDisplay();
display.display();
while(exit)
{
display.drawRect(0, 0, 128, 64, WHITE); //Border
display.setCursor(30, 4);
display.print("Sensitivity");
display.drawRect(12, 27, 102, 12, WHITE); //Percentage Bar
display.fillRect(13, 28, Sensitivity,10, WHITE);
display.setCursor(15, 45);
display.print("Sensitivity: ");
display.print(Sensitivity);
display.print("%");
display.display();
if(!digitalRead(3))
{delay(300);
exit=0;}
if(!digitalRead(2))
{Sensitivity += 5;
if(Sensitivity >100)Sensitivity=100;
display.fillRect(13, 28, 100,10, BLACK);
display.fillRect(100, 45, 50,12, BLACK);}
if(!digitalRead(4))
{Sensitivity -= 5;
if(Sensitivity <0)Sensitivity=0;
display.fillRect(13, 28, 100,10, BLACK);
display.fillRect(100, 45, 50,12, BLACK);}
delay(100);
}
display.clearDisplay();
display.display();
}
//-----------------------------------------------------------------------------------
//-------------------------------MENU 1 = LED ON TIME--------------------------------
//-----------------------------------------------------------------------------------
enterButton = digitalRead(3);
if(!enterButton && menuPosition == 1)
{
delay(300);
int exit = 1;
display.clearDisplay();
display.display();
while(exit)
{
display.drawRect(0, 0, 128, 64, WHITE); //Border
display.setCursor(50, 4);
display.print("On Time");
display.drawRect(12, 27, 102, 12, WHITE); //Percentage Bar
display.fillRect(13, 28, onTime,10, WHITE);
display.setCursor(20, 45);
display.print("On Time: ");
display.print(onTime/10);
display.print(" Hrs");
display.display();
if(!digitalRead(3))
{delay(300);
exit=0;}
if(!digitalRead(2))
{onTime += 10;
if(onTime >100)onTime=100;
display.fillRect(13, 28, 100,10, BLACK);
display.fillRect(100, 45, 50,12, BLACK);}
if(!digitalRead(4))
{onTime -= 10;
if(onTime <0)onTime=0;
display.fillRect(13, 28, 100,10, BLACK);
display.fillRect(100, 45, 50,12, BLACK);}
delay(100);
}
display.clearDisplay();
display.display();
}
}
/* display.drawPixel(ball_x, ball_y, BLACK);
display.drawPixel(new_x, new_y, WHITE);
display.clearDisplay();
display.setCursor(40, 28);
display.print(text);
display.display();
display.setTextColor(WHITE, BLACK);
display.setCursor(0, 56);
display.print(mcu_score);
display.setCursor(122, 56);
display.print(player_score);
display.display();
display.drawRect(0, 0, 128, 54, WHITE); */