Sunday, December 28, 2014

Raspberry Pi Weather Station

My latest Pi project involves creating a weather station in a way very different from most others. I will cover various parts of this project in my next several posts.
The weather station completed and mounted outdoors.
The  most common way that a Raspberry Pi (or any other computer) is interfaced is via a pre-built system that has a serial or USB connection. This is the fastest and easiest way to do this. But what fun is doing things the way everyone else does?

I had an old weather station that was relatively cheap (less than $100) and did not have any drivers for Linux. I ran it on an old PC for several years, but it finally stopped working. The wireless part was never very reliable and it was a pain to keep replacing batteries. I was able to salvage the anemometer (wind speed) and rain gauge and hack them into my new system.

For temperature and humidity readings I use the AM2315 from adafruit. For barometric pressure I use the MPL115A2, also from adafruit. Both of the devices interface via the I2C bus. I have to give a plug for adafruit. It's a great place to get parts to connect to the Raspberry Pi.

The interface board and Pi on a mounting plate.
The anemometer and rain gauge are simple contact closure interfaces. Each tiny bucket of rain and each rotation of the anemometer produce a single pulse. These are connected simply through GPIO pins and drive interrupts which count the pulses.

The interface board that connects to the Pi is actually very simple. It mostly just passes GPIO pins to screw terminals. The MPL115A2 is the tiny blue board next to the ribbon connector.

Adafruit also provided the perfect weatherproof enclosure. I will have to drill holes to feed wires in, but those will be sealed with silicone.

In the near future I will write up posts on some of the problems I had to overcome to complete this project.
  • Handling GPIO interrupts
  • Interfacing to the AM2315 via I2C
  • Interfacing to the MPL115A2 via I2C
  • Calibrating the rain and wind sensors
  • Logging to my MySQL database server
  • Logging to Weather Underground
  • Providing a nice web interface to display the weather data
Also, I will post my source code for others to use and/or learn from.

This has been a very fun project and I expect to use the weather station for many years to come.

Of course, Murphy had to strike - when I went to mount the system outdoors, it was raining!

Sunday, December 14, 2014

My New System Checklist

I recently had need to create a new Raspbian system for a project and decided to record all the things I did after the system image first boots. Frequently, I forget one or two of these, so this will become a checklist that I follow when I create a new system.

There are many guides to creating a system for the Raspberry Pi and this post is not an attempt to create another. I am putting this here for my own reference as much as to share.  To make it helpful to beginners, I have added some explanations.  You may prefer nano over vi as the file editor.

Please feel free to use the comments section to let people know what customization you like to make for your Pi systems.

Load image as usual
raspi-config runs first time
- expand file system
- Internationalization -> set locale -> TZ = US-Eastern
- Internationalization -> Keyboard = English(US)
- advanced -> hostname (RasPi-##-Purpose)
- advanced -> mem split 16 for GPU
- advanced -> enable SPI and I2C and Serial
reboot, and log in as pi (raspberry)

CPU overclocking would also be set up in raspi-config, but I haven't had any need to do this.

All of the following commands require root privilege.  You can either put sudo before each command or enter sudo -i and run a shell as root.

Create a new user for myself, give it sudoer privilege.
adduser ted 
echo "ted ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers

Update the package database and upgrade all installed packages.
apt-get update 
apt-get upgrade

Install some new packages.
apt-get install samba screen libmysqlclient-dev libi2c-dev

Configure Samba (Windows file sharing)
vi /etc/samba/smb.conf
uncomment "socket options = TCP_NODELAY"
delete all shares and add:
   comment = opt
   writable = yes
   locking = no
   path = /opt
   public = yes

Restart the Samba service
service samba restart  

Edit the SSH server config.  Turning off DNS reverse lookups will speed up the connection process when to log in through SSH.
vi /etc/ssh/sshd_config
add "UseDNS no"

Edit the netwrok configuration and set static IP address and wifi config.  The interface name for the wifi will be used below in the supplicant file.
vi /etc/network/interfaces
iface eth0 inet static
iface home inet static 

Edit the wifi supplicant file.  The "id_str" setting connects back to the name used above.
vi /etc/wpa_supplicant/wpa_supplicant.conf

Install Gordon's WiringPi library.  I use this extensively in my C programming.
cd ~
git clone git://
cd wiringPi
git pull origin
gpio -v
gpio readall

Edit the kernel module configuration to enable SPI, I2C, and 1-Wire.
vi /etc/modprobe.d/raspi-blacklist.conf
uncomment SPI and I2C devices

vi /etc/modules
add this
# SPI devices  
# I2C devices  
# 1-Wire devices  
# 1-Wire thermometer devices  

Finally, reboot the system again.  Then log on as the new user you created and  remove the default user.
userdel pi

If you don't do this last step and your system is accessible from the internet, then it will not be long (sometimes only hours or minutes) before a hacker finds it and does bad things.  My firewall log shows constant attempts to brute force a login via SSH and "pi" is a common user name that is tried.

Tuesday, December 9, 2014

Wifi Router Case Mod

In my previous post I showed how to use the case from an old LinkSys router as a case for a Raspberry Pi.  Today I decided that it needed a little improvement.  Bring on the blinking lights.  Isn't everything better with blinking lights?

I showed in the posts Server Box with Utilization Displays and CPU and I/O Utilization Display - Details how to use LEDs for a utilization display.  This project is a little smaller scale - only six LEDs instead of twenty.

The circuit is very simple.  The positive lead to each LED is connected to a resistor.  All of the resistors are connected to 5V.  The negative lead of each LED is connected to a GPIO pin.  A low signal on the GPIO pin turns the LED on.

This inverts the logic, but that can be handled in software.  This has the benefit of being able to push more current through the LEDs than would be possible if the GPIO line was connected to the positive lead of the LED.

This PCB layout shows a close approximation of how I made the circuit.  I didn't make a printed circuit board, but I have been designing some for work this week, so I did this drawing using PCB Artist.  I definitely plan to create some PCBs for my Pi hobby, once I decide what to make next.

All the wires are connected directly to a ribbon cable. I created a real power plug while I was at it.

The LED circuit is pushed into the front part of the case and through some holes that I drilled.  It is held in place by friction and a little tape.

My latest Raspberry Pi creation is stacked with the modem and router with all their blinking lights.

Now maybe it will not feel inadequate.

Sunday, December 7, 2014

Raspberry Pi Case From Wifi Router

You have most likely seen one of these somewhere before.

This case style is very common.  If you happen to get your hands on one, you can make a great case for the Raspberry Pi.

(Or, you can re-load the router firmware.  See for more information.)

I had two in my huge pile of junk, so I though I'd have some fun. This was literally a ten minute project.

The case pops apart easily, if you know the trick.  Grab the blue front part and pull apart from the rear part.  After that, the top and bottom will come apart. A couple of screws later and you have prime case material.

I drilled two holes to mount the Pi and trimmed the rear opening just a little. It needs a better power connector.

One good thing about these cases, they stack very nicely.

Now to search the pile of junk for a hard drive. There is enough room to add one in this case.

Works Great!