Friday, May 28, 2010

Beeping Liftmaster 915LM Mod



The Liftmaster 915LM is a wireless garage door monitor that basically blinks an LED whenever it detects an open garage door. I wanted to mod it to give me an audible warning instead of just blinking an LED...


Simple Beep
The easiest way to make it beep is to simply connect a ~5V piezo buzzer between the red LED (-) and the +5V supply. This will make the buzzer beep everytime the red LED blinks on.

I used something like this for a while, and it did work well, but it was also tiring to hear it beep every 1s the door was open.


AVR Beep
Since I recently got an AVRISP mkII and a few ATtiny13s, I thought I would try it out... I used an ATtiny13 to generate a series of short beeps when the door is open, and one long beep when the door is closed. To reduce the annoyance factor, the number of beeps is decreased and the delay between the beeps is increased as time goes on. After a while, the beeping is stopped completely.

The components I used were just the bare minimum needed - the ATtiny13 and a piezo buzzer. They were connected as follows:

[ATtiny13 pin3] --> [Green LED-]
[ATtiny13 pin4] --> [GND]
[ATtiny13 pin5] --> [(+) buzzer (-)] --> [GND]
[ATtiny13 pin8] --> [+5V]

I used the green LED this time because it's constantly off when the door is open. It's easier to detect in the AVR compared to the red blinking LED.


This is what the underside of the 915LM looks like. I have connected 3 wires here: The white wire is connected to the green LED (-), the red is +5V, the brown is GND.

The following is the code I used. It was compiled with AVR Studio/WinAVR...
#define F_CPU 1200000
#include <avr/io.h>
#include <avr/interrupt.h>

#define P_BEEPER  PB0
#define P_SENSOR  PB4

__attribute((noinline))
static void delay_ms(uint16_t ms)
{
  while (ms-- > 0) {
    uint32_t n = F_CPU / 10000;
    do {
      asm (
        "nop\n"
        "nop\n"
        "nop\n"
        "nop\n"
      );
    } while (n--);
  }
}

static void beep(uint16_t d1, uint16_t d2)
{
  PORTB |= _BV(P_BEEPER);
  delay_ms(d1);
  PORTB &= ~_BV(P_BEEPER);
  delay_ms(d2);
}

int main(void)
{
  DDRB = _BV(P_BEEPER);

  delay_ms(1000);
  beep(250, 500);
  
  int8_t count = 0;
  int8_t gon = 0;
  int16_t pause = 1;

  while (1) {  
    delay_ms(100);
    if ((PINB & _BV(P_SENSOR)) == 0) {
      // green LED is on (door is closed)
      if (gon <= 1) {
        if ((gon++ == 1) && (count > 0)) {
          // going to an off state
          beep(800, 100);
          count = 0;
        }
        pause = 1;
      }
    }
    else {
      // green LED is off (door is open)
      gon = 0;
      if (count < 28) {
        if (pause-- <= 0) {
          ++count;

          if (count < 5) beep(100, 100);
          if (count < 20) beep(100, 100);
          beep(100, 1);

          // pause more as time goes on
          pause = count * 25;

          // 20s max pause
          if (pause > 200) pause = 200;
        }
      }
    }
  }

  return 0;
}


And here I just placed it on a scrap perfboard.

Simple and works very well. :)

1 comment:

  1. Nowadays, securing our home has become very important. You can do this with the help of the Garage doors available in the market. In this comparison guide, we are going to compare garage doors from two different very well-known companies that are liftmaster 8500 vs chamberlain rjo20. Here we are going to compare Chamberlain RJ020 and LiftMaster 8500 wall mount garage door lifters have many similarities along with some differences.

    ReplyDelete