Skip to content

Instantly share code, notes, and snippets.

@jasonhejna
Created December 12, 2014 03:31
Show Gist options
  • Save jasonhejna/9554d707cbac6b60f9af to your computer and use it in GitHub Desktop.
Save jasonhejna/9554d707cbac6b60f9af to your computer and use it in GitHub Desktop.
smart nightlight
//#include <EEPROM.h>
int LDR_Pin = A6; //analog pin 0
int PWM_Pin = 4;
void setup(){
//Serial.begin(9600);
pinMode(PWM_Pin, OUTPUT);
//EEPROM.write(0, 250);
//EEPROM.write(1, 15);
}
//float Stored_Light_On = EEPROM.read(0);
unsigned long maintime;
unsigned long time;
float AVG_Light_On = 340;
float AVG_Light_Off = 10;
float Light_On_Check;
float Light_Off_Check;
float AVG_Light_Diff = ((AVG_Light_On - AVG_Light_Off) / 1500) * .50;
void loop(){
float LDRReading = analogRead(LDR_Pin);
float LDRReading_Low = LDRReading;
float LDRReading_High = LDRReading;
float Orig_LDRReading = LDRReading * 1.1;
maintime = millis() + 1410;
while ( millis() < maintime ) {
delay(20);
float LDRReading = analogRead(LDR_Pin);
if(LDRReading < LDRReading_Low){
LDRReading_Low = LDRReading;
}else if(LDRReading > LDRReading_High){
LDRReading_High = LDRReading;
}
float Big_LDRReading_Offset = LDRReading_Low * 1.6;
if(LDRReading_High > Big_LDRReading_Offset){
}
float Light_Diff = (LDRReading_High - LDRReading_Low) / 1500;
if(Light_Diff > 0 && Orig_LDRReading > LDRReading && AVG_Light_Diff < Light_Diff){
TurnOn();
break;
}
}
float LDRReading_Offset = LDRReading_Low * 1.1;
float LDRReading_Diff = LDRReading_High - LDRReading_Low;
if(LDRReading_Diff > 0 && LDRReading_Offset > LDRReading_High){ //means the value of light hasn't change more than 10% in 1.5 seconds
float tmp_AVG_LDRReading = (LDRReading_High + LDRReading_Low) / 2;
Serial.println("tmp_avg");
Serial.println(tmp_AVG_LDRReading);
//add some code to an inverse of this if statement (runs when we get both low, and high), so we know if the light level is low or high
}
}
void TurnOn(){//MOVE THE LIGHT AND READ THE NEW VALUE ON SERIAL
float LDRReading_Before = analogRead(LDR_Pin);
//Serial.println(LDRReading_Before);
digitalWrite(PWM_Pin, HIGH);
float Light_BreakPoint = AVG_Light_On * 0.83;
time = millis() + 300000;
unsigned long start_time = millis();
while(millis() < time){
delay(20);
float three_seconds = millis() - start_time / 3000;
if(three_seconds > 1 && three_seconds <= 1.013){
float LDRReading_SOMETHING = analogRead(LDR_Pin);
}
float LDRReading_On = analogRead(LDR_Pin);
if(LDRReading_On > Light_BreakPoint){
break;
}
}
digitalWrite(PWM_Pin, LOW);
delay(700);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment