Both the camera and the A+ were mounted underneath the roof. The light which reaches through the loophole in to the box isn’t enough for a decent picture quality. Therefore I mounted four standard IR LED around the PiNoir camera.
Since each LED has an IF of 100 mA, they cannot be powered from the 3.3 V pin of the Raspberry. Instead, I used a LF33CV voltage converter and four BC547 transistors with 1 kΩ base resistors to drive the LEDs. The circuit was build on a small break-out board.
The LEDs have a VF of 1.3 V and thus require a 20 Ω series resistor each (on the board above I used 2 x 10 Ω for each LED; please note that the resistors are not correctly labeled).
The IR LEDs can be controlled using a simple Python script. It is planned to add a switch to motioneye. Meanwhile it turned out that two LEDs are enough for illuminating the interior of the box.
A nesting box that “twitters”
In order to receive notifications upon arrival of birds, I connected the nesting box to my Twitter account, using the Tywython package. To get started, I registered my application at https://dev.twitter.com/apps and grabbed my Consumer Key
and Consumer Secret.
Then, I installed Twython via pip
$ pip install twython
and imported Twython
<span class="pl-k">from</span> twython <span class="pl-k">import</span> Twython
Since birds can be very active, I limited the number of tweets to one per day. The Python script below twitters the latest picture taken by the PiNoir camera.
#!/usr/bin/env python
import os
import time
from twython import Twython
# API credentials
CONSUMER_KEY = 'INSERT CONSUMER KEY HERE'
CONSUMER_SECRET = 'INSERT CONSUMER SECRET HERE'
ACCESS_KEY = 'INSERT ACCESS KEY HERE'
ACCESS_SECRET = 'INSERT ACCESS SECRET HERE'
api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)
# write unixtime to file
def w_timestamp():
filename = '/home/pi/tweet/timestamp'
file = open(filename, "w")
now = time.time()
file.write(str(now))
file.close()
# read unixtime from file
def r_timestamp():
filename = '/home/pi/tweet/timestamp'
file = open(filename, "r")
for line in file:
lasttweet = line.rstrip()
file.close()
return lasttweet
def autotweet():
path = '/var/lib/motioneye/'
directory = os.listdir(path)
directory.sort()
file = os.listdir(path + directory[-1])
file.sort()
photo = open(path + directory[-1] + '/' + file[-1],'rb')
api.update_status_with_media(media=photo, status='BirdPi Twython Bot: A visitor has arrived to my #nestingbox')
w_timestamp()
# limit tweets to 1 per day
def main():
time.sleep(5)
if ( int(time.time() - float(r_timestamp())) >= 86400 ):
autotweet()
else:
return 0
if __name__ == '__main__':
main()
The script is triggered each time when motioneye detects activity inside the box. In order to avoid empty frames, I configured motioneye to skip frames before and after a motion events.