R. Berry Bash
by zaion on Ott.25, 2012, under Hardware lab
The Raspberry, a pretty interesting piece of hardware (half micro controller, half computer), is here used as a temperature sampler (via I2C sensor). The data collected is then employed to draw a graph and send it to your e-mail account using wifi connection. All this is performed using only some useful open programs and a little bash scripting.
I sadly have one of the first release of raspberry so I had to short the fuses that limit the current through USB and add a capacitor to stabilize the voltage on current peaks. The hardware I used is pretty simple and not even necessary. In a perfboard connected to the GPIO header I soldered a molex connector to power the board from any ATX and some external HD power supply. As you can see in the below image, between 5V and ground there is a LED-RESISTOR-TRANSISTOR series with the base of the PDTC114ET wired to gpio4, only for debug purpose.
The SOIC-8 in the middle of the image is a PCA9517, an I2C buffer from TI, is very interesting because isolate the capacitance of the serial line, source the power instead of the micro and let you select the voltage you desire for the bus, allowing 5V operation (or 3.3, or 2.7, or ..).
The 4 wire line bus is bring out through 4 white wires and soldered to an ps/2 connector of an old mother board. There I used two cable (from mouse and keyboard) to bring the signal to the sensors. The MCP9805 series is here used because I need more than one sampling point and they can be configured with different addresses by pulling high or low some pins. They have a grater precision on high temperature compared to similar one, too.
Once you have set up your OS (wheezy in my case) and internet connection, you need to install few programs in order to achieve bus access and data manipulation.
installation (as root):
edit /etc/modprobe.d/raspi-blacklist.conf and comment line: i2c-bcm2708
edit /etc/modules and add line: i2c-dev
#reboot
#apt-get update
#apt-get install i2c-tools
#apt-get install bc
#apt-get install gnuplot
#apt-get install sendemail
#apt-get install libio-socket-ssl-perl libnet-ssleay-perl perl
#apt-get clean
Sendemail fail with latest versions of “libio-socket-ssl-perl” so you may need to downgrade to an older release. To do this just download “libio-socket-ssl-perl_1.53-1_all.deb” from the web and install it like this:
#dpkg –install libio-socket-ssl-perl_1.53-1_all.deb
Test the i2c bus:
#i2cdetect -y 0
You should get an all-zero table with the address of found devices. In my case I got 0x19 and 0x1A, which I used in the i2c-get command. As from datasheet of MCP9805 the 16-bit temperature register is the number 5, so to get it you must type (w means word, two byte):
i2cget -y 0 0x19 0x05 w
i2cget -y sda-channel device-address register-number [b|w]
I have made three simple bash scripts in order to handle data collection, conversion and to send the email. In “temp.batch” there are the commands for gnuplot with instructions on how to compose the graph from the log file.
Convert the 2-byte data from the sensor to human-like celsius format.
mcp9805_converter.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/bash temp=$1 #estrapolo il segno segno=$(($temp & 0x0010 ? 1 : 0)) if [ "$segno" -eq "0" ]; then echo -n "+" else echo -n "-" fi #faccio la conversione result=$(( (( $temp & 0x000F ) << 8 ) + (($temp & 0xFF00) >> 8 ) )) echo -e "scale=3 \n $result / 16" | bc |
Create an image with the data found in the .log file.
temp.batch
1 2 3 4 5 6 7 8 9 10 11 12 13 | set title 'Temp' set xlabel 'time (20 s)' set ylabel 'Celsius' set grid plot 'temp-1a.log' using 1 with lines title 'Room' replot 'temp-1a.log' using 1 with lines smooth bezier notitle replot 'temp-19.log' using 1 with lines title 'wifi Dongle' replot 'temp-19.log' using 1 with lines smooth bezier notitle set term png size 1024, 768 set output 'temp.png' replot |
Send the image file to my gmail account as an attachment.
mail.sh
1 | sendEmail -f USERID@gmail.com -t USERID@gmail.com -u R. Berry Bash -m "Last temp log" -s smtp.gmail.com -o tls=yes -xu USERID -xp PASSWORD -a temp.png |
Read the data from the sensors every 20s, convert it in celsius, log them in a file. Every 2 hours create an image from the log files and send it to my gmail account.
sample.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #/bin/bash #per sempre while [ true ]; do #pulisco echo -n "" > temp-19.log echo -n "" > temp-1a.log #campiono for i in {1..360} do ./mcp9805_converter.sh $(i2cget -y 0 0x19 0x05 w) >> temp-19.log ./mcp9805_converter.sh $(i2cget -y 0 0x1a 0x05 w) >> temp-1a.log echo -n "s$i" sleep 20 done #faccio il grafico gnuplot temp.batch #mando il grafico per email ./mail.sh done |
And this is the result image found in my mail box.
Simple and effective.
Zaion