METAR LED Map

For an anniversary gift I ordered and received the following framed map from my wife.

METAR LED map.

It is an aviation map of western Pennsylvania with a multicolor LED placed at each airport location that issues METARs (METeorological Terminal Aviation routine weather Report). The color of each LED indicates the ceiling and visibility.

Color Code

  1. VFR (>3000ft ceilings and >5nm visibility) = Green
  2. MFR (1000-3000ft ceilings and 3-5nm visibility) = Blue
  3. IFR (500-1000ft ceilings and 1-3nm visibility) = Red
  4. LIFR (<500ft ceilings or <1nm visibility) = Purple
  5. Smoke = Gray
  6. METAR older than 6 hours = Blank

METAR data are processed by a Raspberry Pi, a low-cost single-board computer, which is fastened behind the map. Data are received via a WiFi connection every five minutes. The brightness of the LEDs also changes for day/night conditions.

Mail Chime Hack

For several years, I have had a Hanna Products Mail Chime installed on my outdoor mailbox with an indoor receiver. The transmitter is attached to the door of the mailbox. When the door is opened a gravity switch is closed and a signal is sent to the receiver. The receiver sounds an alert and illuminates an LED lamp. The lamp is reset by a momentary contact push-to-close button switch.

I took a receiver apart to see if I could make a simple hack to have a Raspberry Pi sense when the LED lamp was on and then send an email to one of my accounts to indicated the mailbox door had been opened. Another function is to send a signal to a relay module to reset the LED lamp to off.

The project requires some programming skills with Linux and Python, a basic understanding of some electronic components, and some soldering is required. I had my project operating in three short evenings.

Parts List

Hanna Products, Inc. Mail Chime – Amazon $55
Raspberry Pi Model B – Amazon $56
2 1K ohm resisters – Amazon, pack of 100, $6
1 DaFuRui 8Pcs DC 5V 1 Channel Relay Module – Amazon, pack of 8, $13
1 MCP3008 Microchip – Amazon, Pack of 4, $12.50
1 breadboard – Amazon, ELEGOO 3pcs MB-102, $9
Jumper wires – Amazon, Elegoo EL-CP-004, $7

Optional:
Raspberry Pi breakout board and ribbon cable
A case for the Raspberry Pi.

Tools:
Soldering iron and solder
Phillips head screwdriver
Small flathead screwdriver wire stripper

The following is the schematic for the project.

Note the half-moon indentation at one end of the MCP3008 microchip. This will orient the chip to access the correct pins. Also, I used a labeled breakout board for the Raspberry Pi instead of a direct connection.

Begin by opening the bottom of the mail chime. One phillips screw holds the bottom panel to the housing. The printed circuit board is not fastened to the housing. Then solder 4 jumper wires to the printed circuit board inside of the disassembled mail chime as shown.

Mail Chime Printed Circuit Board

Then plugin the MCP3008 Microchip, and the 2 1K ohm resistors to the breadboard. Then connect the various jumper wires on the breadboard, and from the breadboard to the Raspberry Pi, the relay module and the mail chime. Use the schematic and photograph as guidance. I used a Raspberry Pi breakout board to easily identify the Raspberry Pi connections.

The resistors act as a voltage splitter to decrease the voltage going to the MCP3008 CH0 pin.

Mail chime printed circuit board connected to the breadboard. Note that a breakout board is being used for the Raspberry Pi, which s connected to a ribbon cable. The breakout board is labeled to identify the pin connections.
All components connected.

Use the small flathead screwdriver to connect the jumper wires to the relay module.

Python Scripts

UPDATE: Google no longer permits logins from 3rd party software. I have made a few changes to the mail.py script to set it up for alternate domains. Those changes are in red. Note that the proper name for the SMTP Server Name is required.

Python scripts are placed in the following directory on the Raspberry Pi:

/home/pi/projects/mailbox/

Note that the indented lines in the following Python scripts are indented with tabs, not spaces.

read_volt.py

#!/usr/bin/python3
import spidev, time
import time
import datetime
import os
 
#Open SPI bus
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz=1000000

#Function to read SPI data from MCP3008 chip
#Channel must be an integer 0-7
def ReadChannel(channel):
     adc = spi.xfer2([1, (8 + channel) << 4, 0])
     data = ((adc[1]&3) << 8) + adc[2]
     return data
#Function to convert data to voltage level
#rounded to specified number of decimal places
def ConvertVolts(data,places):
     volts = (data * 3.3) / float(1023)
     volts = round(volts,places)
     return volts

mySendMail = '/home/pi/projects/mailbox/mail.py'
myResetChime = '/home/pi/projects/mailbox/reset.py'
print ("Check mail was run.")

reading = ReadChannel(0)
voltage = ConvertVolts(reading,2)
print("Reading=%d\tVoltage=%.2f" % (reading, voltage))

#If voltage is greater than or equal to 0.75 V then send an e-#mail
 
if (voltage >= 0.75):
     os.system(mySendMail)
     now = datetime.datetime.now()
     print("Mailbox was opened at: ")
     print(now.strftime('%H:%M %Y-%m-%d'))
     time.sleep(60)
     os.system(myResetChime)
     print("Mailbox Chime has been reset.")

mail.py

#!/usr/bin/python3
import smtplib
import datetime
MAIL_USER = "user@domain.com"
MAIL_PASS = "password"
now = datetime.datetime.now()
text = 'Your mail box has been opened!!!\n\n'
text = text + 'Time: '+now.strftime("%H:%M:%S %Y-%m-%d")+'\n\n'
sent_from = MAIL_USER 
to = ['bill.smith@verizon.net']
subject = 'Mailbox Alert'
body = text
email_text = """\
From: %s
To: %s
Subject: %s

%s
""" % (sent_from, ", ".join(to), subject, body)

try:
     server = smtplib.SMTP('<SMTP Server Name>', 587)
     server.starttls()
     server.login(MAIL_USER, MAIL_PASS)
     server.sendmail(sent_from, to, email_text)

 except Exception as e:
     print(e)

 finally:
     server.quit()  

reset.py

#/usr/bin/python3
import RPi.GPIO as GPIO
import time
 
in1 = 16

GPIO.setmode(GPIO.BCM)
GPIO.setup(in1, GPIO.OUT)
 
GPIO.output(in1, GPIO.LOW)   
 
time.sleep(0.25)
GPIO.output(in1, GPIO.HIGH)
 
time.sleep(1)
 
GPIO.output(in1, GPIO.LOW)   
 
GPIO.cleanup()

Crontab Settings

Enter the following one line using the crontab -e command.

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /home/pi/projects/mailbox/read_volt.py >> /home/pi/projects/mailbox/mailbox.log 2>&1

Crontab will run the read_volt.py Python script every 5 minutes. Any output to standard output and standard error will be written to the mailbox.log file for troubleshooting purposes. When the mail chime is triggered by the mailbox door sensor, there will be current to the mail chime LED, which is then detected by the MCP3008 microchip at CH0. This in turn triggers the code to send an email, then after 60 seconds, the relay is actuated to reset the mail chime.