Ejemplo n.º 1
0
void Clock::sleep()
{
  if(!sleepOk) sleep_time = 0; else if(!sleepWasOk) awake();
  sleepWasOk = sleepOk;
  if(sleepOk && sleep_time >= (uint16_t) conf.sysOffTime * 10)
  {
//    lcd.off();
/*    attachInterrupt(1,wakeupFunction,LOW);
    sleep_mode();
    detachInterrupt(1);*/
    hardware_off();
    awake();
    wasSleeping = 1;
  }
  else if(backlightVal == 0 && light_time >= (uint16_t) conf.lcdBacklightTime * 10)
  {
    backlightVal = lcd.getBacklight();
    lcd.backlight(0);
  }
  if(hardware_flashlightIsOn())
  {
    if(flashlight_time >= (uint16_t) conf.flashlightOffTime * 10)
    {
      hardware_flashlight(0);
    }
  }
  else
  {
    flashlight_time = 0;
  }
}
Ejemplo n.º 2
0
void hardware_lightning_disable()
{
    EIMSK &= ~_BV(INT6);      // Interrupt disable
    shutter_off();
    hardware_light_disable();
    if(backlightVal > lcd.getBacklight()) 
        lcd.backlight(backlightVal);
}
Ejemplo n.º 3
0
unsigned int hardware_readLight(uint8_t r)
{
  // Need to power off lights //
  hardware_flashlight(0);
  char backlightVal = lcd.getBacklight();
  lcd.backlight(0);
  if(backlightVal > 0) _delay_ms(50);
  if(r > 2) r = 2;
  DDRA &= ~0b00000111; // clear all //
  PORTA &= ~0b00000111; // clear all //
  setBit(r, DDRA); // Powers Sensor //
  clrBit(r, PORTA);
  _delay_ms(50);
  uint16_t light = hardware_analogRead(0);
  clrBit(r, DDRA); // Shuts down Sensor //
  if(backlightVal > lcd.getBacklight()) lcd.backlight(backlightVal);
  return light;
}
Ejemplo n.º 4
0
void Light::stop()
{
   unsigned char I2C_Buf[3];
   I2C_Buf[0] = I2C_ADDR_WRITE;
   I2C_Buf[1] = 0x00;
   I2C_Buf[2] = 0x00;
   TWI_Start_Read_Write(I2C_Buf, 3);
   lcd.backlight(255);
   lastSeconds = 0;
}
Ejemplo n.º 5
0
void Clock::awake()
{
  sleep_time = 0;
  light_time = 0;
//  flashlight_time = 0;

  if(backlightVal)
  {
    lcd.backlight(backlightVal);
    backlightVal = 0;
  }
}
Ejemplo n.º 6
0
unsigned int hardware_readLight(uint8_t r)
{
    // Need to power off lights //
    backlightVal = lcd.getBacklight();
    lcd.backlight(0);
    
    if(backlightVal > 0) 
        _delay_ms(50);
    
    hardware_light_enable(r);
    _delay_ms(50);
    
    uint16_t light = hardware_analogRead(0);

    hardware_light_disable();
    
    if(backlightVal > lcd.getBacklight()) 
        lcd.backlight(backlightVal);
    
    return light;
}
Ejemplo n.º 7
0
void Light::setRangeAuto()
{
    uint8_t range;
    uint16_t reading;
    lcd.backlight(0);
    _delay_ms(10);
    for(range = 0; range < 4; range++)
    {
        setRange(range);
        reading = readRaw();
        if(reading < 45000) break;
    }
}
Ejemplo n.º 8
0
void Light::stop()
{
   unsigned char I2C_Buf[3];
   initialized = 0;
   I2C_Buf[0] = I2C_ADDR_WRITE;
   I2C_Buf[1] = 0x00;
   I2C_Buf[2] = 0x00;
   TWI_Start_Read_Write(I2C_Buf, 3);
   lcd.backlight(255);
   lastSeconds = 0;
   paused = 0;
   lockedSlope = 0.0;
   integrationActive = false;
}
Ejemplo n.º 9
0
float Light::readLux()
{
    uint8_t range;
    uint16_t reading;
    float lux;
    if(!initialized || paused) return 0.0;
    lcd.backlight(0);
    for(range = 0; range < 4; range++)
    {
        setRange(range);
        reading = readRaw();
        if(reading < 45000) break;
    }

    scale = range;

    #define READINGS_COUNT 10
    uint32_t readings = 0;
    uint8_t count = 0;
    if(range == 0)
    {
      for(uint8_t i = 0; i < READINGS_COUNT; i++)
	    {
		    reading = readRaw();
        readings += reading;
        if(reading > 0) count++;
	    }
      if(count == 0) count = 1;
      reading = (uint16_t) (readings / count);
    }
	
    switch(range)
    {
        case 0:
            lux = (float)reading / 524.288;
            break;
        case 1:
            lux = (float)reading / 131.072;
            break;
        case 2:
            lux = (float)reading / 32.768;
            break;
        case 3:
        default:
            lux = (float)reading / 8.192;
            break;
    }
    return lux;
}
Ejemplo n.º 10
0
void hardware_lightning_enable()
{
    // Need to power off lights //
    backlightVal = lcd.getBacklight();
    lcd.backlight(0);
    
    if(backlightVal > 0) 
        _delay_ms(50);

    setIn(LIGHT_SENSE_PIN); // set to input
    setLow(LIGHT_SENSE_PIN); // no pull-up

    uint8_t i = 3;
    while(i--)
    {
        hardware_light_enable(i);
        _delay_ms(50);
        uint16_t reading = hardware_analogRead(0);
        //DEBUG('(');
        //DEBUG(reading);
        //DEBUG(')');
        //DEBUG(':');
        //DEBUG(' ');
        //DEBUG_NL();
        if(reading < 256) break;
    }
    //DEBUG(i);
    //if(getPin(LIGHT_SENSE_PIN)) {
    //    DEBUG(STR("+"));
    //}
    //else
    //{
    //    DEBUG(STR("-"));
    //}

    shutter_half();
    
    EIMSK &= ~_BV(INT6);      // Interrupt disable 
    EICRB |= (1<<ISC61)|(1<<ISC60); // Rising edge
    EIMSK |= _BV(INT6);      // Interrupt enable 
}
Ejemplo n.º 11
0
float Light::readLux()
{
    uint8_t range;
    uint16_t reading;
    float lux;
    lcd.backlight(0);
    for(range = 0; range < 4; range++)
    {
        setRange(range);
        reading = readRaw();
        if(reading < 45000) break;
    }

    if(range == 0)
    {
        for(uint8_t i = 0; i < 5; i++)
	    {
		    uint16_t reading2 = readRaw();
	        if(reading2 < reading) reading = reading2;
	    }	
    }
	
    switch(range)
    {
        case 0:
            lux = (float)reading / 524.288;
            break;
        case 1:
            lux = (float)reading / 131.072;
            break;
        case 2:
            lux = (float)reading / 32.768;
            break;
        case 3:
        default:
            lux = (float)reading / 8.192;
            break;
    }
    return lux;
}
Ejemplo n.º 12
0
void Light::task()
{
	if(!initialized || !integrationActive) return;

  if(skipTask) return;

  if(paused)
  {
    lcd.backlight(255);
    wasPaused = 5;
    return;
  }

  if(wasPaused > 0)
  {
    lcd.backlight(0);
    wasPaused--;
    return;
  }


  if(lastSeconds == 0 || (clock.Seconds() > lastSeconds + (uint32_t)((integration * 60) / LIGHT_INTEGRATION_COUNT)))
  {
    lastSeconds = clock.Seconds();
    for(uint8_t i = 0; i < LIGHT_INTEGRATION_COUNT - 1; i++)
    {
      iev[i] = iev[i + 1];
    }
    iev[LIGHT_INTEGRATION_COUNT - 1] = readEv();
    slope = readIntegratedSlopeMedian();

    if(iev[LIGHT_INTEGRATION_COUNT - 1] <= NIGHT_THRESHOLD)
    {
      underThreshold = true;
      if(lockedSlope == 0.0 && slope) lockedSlope = slope;
    }
    else if(iev[LIGHT_INTEGRATION_COUNT - 1] > NIGHT_THRESHOLD + NIGHT_THRESHOLD_HYSTERESIS)
    {
      underThreshold = false;
      lockedSlope = 0.0;
    }

    median = arrayMedian50(iev, LIGHT_INTEGRATION_COUNT);

    float sum = 0.0;
    for(uint8_t i = 0; i < LIGHT_INTEGRATION_COUNT; i++) sum += iev[i];
    integrated = sum / (float)(LIGHT_INTEGRATION_COUNT);

    if(conf.debugEnabled)
    {
      //DEBUG(STR("\r\nIEV: "));
      //for(uint8_t i = 0; i < LIGHT_INTEGRATION_COUNT; i++)
      //{
      //  DEBUG(iev[i]);
      //  DEBUG(STR(","));
      //}
      //DEBUG_NL();
//
      //DEBUG(STR("#######LOCKED "));
      //DEBUG(lockedSlope);
      //DEBUG(STR(" #######\r\n"));
//
      //DEBUG(STR("####### SLOPE "));
      //DEBUG(slope);
      //DEBUG(STR(" #######\r\n"));
//
//
      //DEBUG(STR("#######   INT "));
      //DEBUG(integrated);
      //DEBUG(STR(" #######\r\n"));
//
      //DEBUG(STR("#######   MED "));
      //DEBUG(median);
      //DEBUG(STR(" #######\r\n"));
//
      //DEBUG(STR("#######    EV "));
      //DEBUG(iev[LIGHT_INTEGRATION_COUNT - 1]);
      //DEBUG(STR(" #######\r\n"));
    }
  }
}
volatile char lightMeter(char key, char first)
{
	static char held = 0;

	if(first)
	{
		lcd.backlight(0);
		hardware_flashlight(0);
	}

	if(!held)
	{
		lcd.cls();

		menu.setTitle(TEXT("Light Meter"));

		if(key == FR_KEY)
		{
			held = 1;
			menu.setBar(TEXT("RETURN"), TEXT("RUN"));
		}
		else
		{
			menu.setBar(TEXT("RETURN"), TEXT("PAUSE"));
		}

		char buf[6] , l;
		uint16_t val;
		char* text;

		val = (uint16_t)hardware_readLight(0);
		int_to_str(val, buf);
		text = buf;
		l = lcd.measureStringTiny(text);
		lcd.writeStringTiny(80 - l, 12 + SY, text);
		lcd.writeStringTiny(3, 12 + SY, TEXT("Level 1:"));

		val = (uint16_t)hardware_readLight(1);
		int_to_str(val, buf);
		text = buf;
		l = lcd.measureStringTiny(text);
		lcd.writeStringTiny(80 - l, 18 + SY, text);
		lcd.writeStringTiny(3, 18 + SY, TEXT("Level 2:"));

		val = (uint16_t)hardware_readLight(2);
		int_to_str(val, buf);
		text = buf;
		l = lcd.measureStringTiny(text);
		lcd.writeStringTiny(80 - l, 24 + SY, text);
		lcd.writeStringTiny(3, 24 + SY, TEXT("Level 3:"));

		lcd.update();
		_delay_ms(10);
	}
	else
	{
		if(key == FR_KEY)
			held = 0;
	}

	if(key == FL_KEY)
	{
		lcd.backlight(255);
		return FN_CANCEL;
	}

	return FN_CONTINUE;
}
volatile char motionTrigger(char key, char first)
{
	uint8_t i;
	uint16_t val;
	static uint16_t lv[3];
	static uint8_t threshold = 2;

	if(key == LEFT_KEY)
	{
		if(threshold > 0) threshold--;
		first = 1;
	}
	if(key == RIGHT_KEY)
	{
		if(threshold < 4) threshold++;
		first = 1;
	}

	if(first)
	{
		sleepOk = 0;
		clock.tare();
		lcd.cls();
		menu.setTitle(TEXT("Motion Sensor"));
		menu.setBar(TEXT("RETURN"), BLANK_STR);

		lcd.drawLine(10, 22, 84-10, 22);
		lcd.drawLine(11, 21, 11, 23);
		lcd.drawLine(84-11, 21, 84-11, 23);
		lcd.drawLine(12, 20, 12, 24);
		lcd.drawLine(84-12, 20, 84-12, 24);
		lcd.drawLine(13, 20, 13, 24);
		lcd.drawLine(84-13, 20, 84-13, 24);
		lcd.setPixel(42, 21);
		lcd.setPixel(42+10, 21);
		lcd.setPixel(42-10, 21);
		lcd.setPixel(42+20, 21);
		lcd.setPixel(42-20, 21);

		i = threshold * 10;
		lcd.drawLine(42-3-20+i, 16, 42+3-20+i, 16);
		lcd.drawLine(42-2-20+i, 17, 42+2-20+i, 17);
		lcd.drawLine(42-1-20+i, 18, 42+1-20+i, 18);
		lcd.setPixel(42-20+i, 19);

		lcd.writeStringTiny(19, 25, TEXT("SENSITIVITY"));

		lcd.update();
		lcd.backlight(0);
		hardware_flashlight(0);
		_delay_ms(50);
		for(i = 0; i < 3; i++)
		{
			lv[i] = (uint16_t)hardware_readLight(i);
		}
	}

	uint8_t thres = 4 - threshold + 2;
	if((4 - threshold) > 2) thres += ((4 - threshold) - 1) * 2;

	for(i = 0; i < 3; i++)
	{
		val = (uint16_t)hardware_readLight(i);
		if(clock.eventMs() > 1000 && val > thres && (val < (lv[i] - thres) || val > (lv[i] + thres)))
		{
			clock.tare();
			shutter_capture();
		}
		lv[i] = val;
	}

	if(key == FL_KEY)
	{
		sleepOk = 1;
		lcd.backlight(255);
		return FN_CANCEL;
	}

	return FN_CONTINUE;
}