db(A) logger mit dem Raspberry PI
Für unser alljährliches Festival ( ROCKFREUNDE.DE )
wollte ich interessehalber mal eine Auswertung des Geräuschpegels auf unserem Festivalgelände machen.
Daraus entstand dann folgendes Projekt.
Ziel ist das speichern und auswerten von Lautstärkewerten über einen längeren Zeitraum
Was wir benötigen:
Raspberry PI V3, Netzteil und SD-Karte (min 16GB)
(Amazon: LINK) |
|
---|---|
Arduino Nano V3.0 ATmega328P-AU MCU
(Amazon: LINK) |
|
InLine Modular Kupplung, RJ12 Buchse / Buchse
(Amazon: LINK) |
|
Messmodul Lärm
(LINK) |
Lautstärke berechnen:
Beim aufbau des Moduls zur Berechnung der Lautstärke werte halten wir uns weitgehend an diese Anleitung (LINK).
- Als erstes brechen wir die RJ12 Kupplung in der Mitte durch (das geht relativ einfach)
- Die Kable schwarz, blau und weiß schneiden wir kurz
- Nun werden die übrigen kabel mit dem Arduino verlötet:
- rot -> A0
- gelb -> +5V
- grün -> Gnd
- Die Buchse und den Arduino mit Tape zusammenkleben (um das lösen der verlöteten Kabel zu vermeiden)
- Die benötigte Software auf den Arduino spielen (wie das geht wird in der Anleitung oben beschrieben)
- die in der Anleitung Beschriebene Software für den Arduino muss für unsere Zwecke leicht angepasst werden. Hier ein die angepasste Software (LINK)
Danach sollte der Arduino über den seriellen Port (Baudrate 9600) die aktuelle Lautstärke (dbA) ausgeben.
Raspberry vorbereiten:
In meinem Bespiel habe ich das Raspberry PI Raspian Jessie benutzt.
- Die benötigte Software installieren „apt-get install apache2 php5 mysql-server mysql-client php5-mysql“
- Arbeitsverzeichnis anlegen „mkdir /home/pi/dba“
- Tmp Verzeichnis erstellen „mkdir /home/pi/dba/tmp“
- MYSQL:
Nun erstellen wir eine MYSQL Datenbank in der unsere werte später gespeichert werden.
Zuerst verbinden wir uns zu unserem DBMS (Datenbankmanagementsystem):
mysql -p
Dann erstellen wir eine Datenbank:
CREATE DATABASE test;
Nun wählen wir die Datenbank aus:
USE test;
Jetzt wird die Tabelle erstellt:
CREATE TABLE `dba` ( `time` varchar(50) DEFAULT NULL, `se` varchar(50) DEFAULT NULL, `mi` varchar(50) DEFAULT NULL, `h` varchar(50) DEFAULT NULL, `j` varchar(50) DEFAULT NULL, `m` varchar(50) DEFAULT NULL, `t` varchar(50) DEFAULT NULL, `id` int(11) NOT NULL AUTO_INCREMENT, `timespan` varchar(200) DEFAULT NULL, `dba` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2817225 DEFAULT CHARSET=latin1;
Zum Schluss verlassen wir die MYSQL Session:
\q
Scripte für das Logging:
Als erstes das Autostart Script „/etc/init.d/auto.sh“
Nachdem wir das Script erstell haben muss es Ausführbar gemacht werden und in den Autostart genommen werden,
dies machen wir mit: „chmod 777 /etc/innit.d/auto.sh“ und „insserv /etc/innit.d/auto.sh„
#! /bin/bash case "$1" in start) /home/pi/dba/start & # Anweisungen zum Starten hier eingeben ;; stop) # Anweisungen zum Stoppen hier eingeben ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop|restart}" ;; esac
Dann brauchen wir das Startscript „/home/pi/dba/start“
-> sudo chmod 777 /home/pi/dba/start
Das Startscript liest den Arduino in einer Schleife aus und startet die arb.php
stty -F /dev/ttyUSB0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts sleep 2 cat /dev/ttyUSB0 >/home/pi/dba/tmp/slog & sleep 5 COUNTER=0 while [ true ] ; do php /home/pi/dba/arb.php let COUNTER=COUNTER+1 if [ $COUNTER -eq 5000 ] then :>/home/pi/dba/tmp/slog COUNTER=0 fi done
Die arb.php „/home/pi/dba/arb.php“
-> sudo chmod 777 /home/pi/dba/arb.php
In der arb.php werden die ausgelesenen Daten in die MYSQL-Datenbank geschrieben.
<?php $x = "0" ; $x = shell_exec('tail -n1 /home/pi/dba/tmp/slog'); $x = preg_replace ( '/[^0-9 ]/i', '', $x ); $x = str_replace(' ','',$x); $x = str_replace('/r','',$x); //echo $x; if (!$x) { exit; } if ($x == "") { exit; } if ($x == " ") { exit; } if (isset($var)) { exit; } if (empty($var)) { $y = "44"; //$handle = fopen ("/home/pi/dba/akt", 'w'); //fwrite ($handle, $y); //fclose ($handle); $timestamp = time(); //$w1=shell_exec('date +"%m.%d.%Y %H:%M:%S"'); $t=$datum = date("d", $timestamp); $m=$datum = date("m", $timestamp); $j=$datum = date("Y", $timestamp); $h=$datum = date("H", $timestamp); $mi=$datum = date("i", $timestamp); $se=$datum = date("s", $timestamp); $w1=$t.".".$m.".".$j; $w2=$h.":".$mi.":".$se; //echo $w1; $servername = "localhost"; $username = "root"; $password = "EUER PASSWORT"; $dbname = "test"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO dba (timespan, dba, t, m, j, h, mi, se, time ) VALUES ('$w1', '$x', '$t', '$m', '$j', '$h', '$mi', '$se', '$w2')"; if ($conn->query($sql) === TRUE) { // echo "New record created successfully"; } else { // echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); } ?>
Webseite zum auswerten:
Die index.php „/var/www/html/index.php“
hier wird die Auswahl des zu zeigenden tags getroffen
<table border=3><tr><th>Jahr</th><th>Monat</th><th>Tag (minutengenau)</th></tr> <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <th> <select name="ccdx1"> <option value="2011">2011</option> <option <?php if($y == "2012"){ echo "selected='selected'" ;} ?>value="2012">2012</option> <option <?php if($y == "2013"){ echo "selected='selected'" ;} ?>value="2013">2013</option> <option <?php if($y == "2014"){ echo "selected='selected'" ;} ?>value="2014">2014</option> <option <?php if($y == "2015"){ echo "selected='selected'" ;} ?>value="2015">2015</option> <option <?php if($y == "2016"){ echo "selected='selected'" ;} ?>value="2016">2016</option> <option <?php if($y == "2017"){ echo "selected='selected'" ;} ?>value="2017">2017</option> <option <?php if($y == "2018"){ echo "selected='selected'" ;} ?>value="2018">2018</option></select> </th> <th> <select name="ccdx2"> <option <?php if($m == "01"){ echo "selected='selected'" ;} ?>value="01">Januar</option> <option <?php if($m == "02"){ echo "selected='selected'" ;} ?>value="02">Februar</option> <option <?php if($m == "03"){ echo "selected='selected'" ;} ?>value="03">März</option> <option <?php if($m == "04"){ echo "selected='selected'" ;} ?>value="04">April</option> <option <?php if($m == "05"){ echo "selected='selected'" ;} ?>value="05">Mai</option> <option <?php if($m == "06"){ echo "selected='selected'" ;} ?>value="06">Juni</option> <option <?php if($m == "07"){ echo "selected='selected'" ;} ?>value="07">Juli</option> <option <?php if($m == "08"){ echo "selected='selected'" ;} ?>value="08">August</option> <option <?php if($m == "09"){ echo "selected='selected'" ;} ?>value="09">September</option> <option <?php if($m == "10"){ echo "selected='selected'" ;} ?>value="10">Oktober</option> <option <?php if($m == "11"){ echo "selected='selected'" ;} ?>value="11">November</option> <option <?php if($m == "12"){ echo "selected='selected'" ;} ?>value="12">Dezember</option></select>: </th> <th> <select name="ccdx3"> <option <?php if($d == "01"){ echo "selected='selected'" ;} ?>value="01">1</option> <option <?php if($d == "02"){ echo "selected='selected'" ;} ?>value="02">2</option> <option <?php if($d == "03"){ echo "selected='selected'" ;} ?>value="03">3</option> <option <?php if($d == "04"){ echo "selected='selected'" ;} ?>value="04">4</option> <option <?php if($d == "05"){ echo "selected='selected'" ;} ?>value="05">5</option> <option <?php if($d == "06"){ echo "selected='selected'" ;} ?>value="06">6</option> <option <?php if($d == "07"){ echo "selected='selected'" ;} ?>value="07">7</option> <option <?php if($d == "08"){ echo "selected='selected'" ;} ?>value="08">8</option> <option <?php if($d == "09"){ echo "selected='selected'" ;} ?>value="09">9</option> <option <?php if($d == "10"){ echo "selected='selected'" ;} ?>value="10">10</option> <option <?php if($d == "11"){ echo "selected='selected'" ;} ?>value="11">11</option> <option <?php if($d == "12"){ echo "selected='selected'" ;} ?>value="12">12</option> <option <?php if($d == "13"){ echo "selected='selected'" ;} ?>value="13">13</option> <option <?php if($d == "14"){ echo "selected='selected'" ;} ?>value="14">14</option> <option <?php if($d == "15"){ echo "selected='selected'" ;} ?>value="15">15</option> <option <?php if($d == "16"){ echo "selected='selected'" ;} ?>value="16">16</option> <option <?php if($d == "17"){ echo "selected='selected'" ;} ?>value="17">17</option> <option <?php if($d == "18"){ echo "selected='selected'" ;} ?>value="18">18</option> <option <?php if($d == "19"){ echo "selected='selected'" ;} ?>value="19">19</option> <option <?php if($d == "20"){ echo "selected='selected'" ;} ?>value="20">20</option> <option <?php if($d == "21"){ echo "selected='selected'" ;} ?>value="21">21</option> <option <?php if($d == "22"){ echo "selected='selected'" ;} ?>value="22">22</option> <option <?php if($d == "23"){ echo "selected='selected'" ;} ?>value="23">23</option> <option <?php if($d == "24"){ echo "selected='selected'" ;} ?>value="24">24</option> <option <?php if($d == "25"){ echo "selected='selected'" ;} ?>value="25">25</option> <option <?php if($d == "26"){ echo "selected='selected'" ;} ?>value="26">26</option> <option <?php if($d == "27"){ echo "selected='selected'" ;} ?>value="27">27</option> <option <?php if($d == "28"){ echo "selected='selected'" ;} ?>value="28">28</option> <option <?php if($d == "29"){ echo "selected='selected'" ;} ?>value="29">29</option> <option <?php if($d == "30"){ echo "selected='selected'" ;} ?>value="30">30</option> <option <?php if($d == "31"){ echo "selected='selected'" ;} ?>value="31">31</option></select> </th> </th> </table> <input type='submit' name='submitcc' value='Grafik erzeugen' align='right'> </form> <br><br><br> <?php if ($_POST['submitcc']) { $cd1 = $_POST['ccdx1']; $cd2 = $_POST['ccdx2']; $cd3 = $_POST['ccdx3']; $dq=shell_exec('echo '.$cd1.' > wdx/j'); $dw=shell_exec('echo '.$cd2.' > wdx/m'); $de=shell_exec('echo '.$cd3.' > wdx/t'); echo "<a href=wdx/index.php?j=$c1&m=$c2&d=$c3&h=$c4 target=neu><font size =5><b>Grafik anzeigen Tag</b></font></a>"; } ?>
Um die Werte in einem Graph darzustellen erstellen wir zuerst einen Ordner und machen diesen beschreibbar:
sudo mkdir /var/www/html/wdx
sudo chmod -R 777 /var/www/html/wdx
Außerdem benötigen wir einige Javascripts, diese findet ihr hier (LINK)
Einfach mit tar xvf js.tar entpacken und unter /var/www/html/wdx/js speichern.
Zudem brauchen wir noch das jquerry-Script welches nach /var/www/html/wdx/ muss.
Zum auslesen und aufbereiten der Daten aus der MYSQL-Datenbank brauchen wir die data.php „/var/www/html/wdx/data.php“
<?php $j=shell_exec('cat j'); $j=str_replace(' ','',$j); $j = preg_replace("#[\r\n]#", '', $j); $m=shell_exec('cat m'); $m=str_replace(' ','',$m); $m = preg_replace("#[\r\n]#", '', $m); $t=shell_exec('cat t'); $t=str_replace(' ','',$t); $t = preg_replace("#[\r\n]#", '', $t); $h=shell_exec('cat h'); $h=str_replace(' ','',$h); $h = preg_replace("#[\r\n]#", '', $h); $con = mysql_connect("localhost","root","EUER PASSWORT"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("test", $con); $result = mysql_query("SELECT j, m, t, h, mi, se, MAX(dba),MIN(dba), ROUND(AVG(dba)) FROM dba WHERE j = '$j' AND m = '$m' AND t = '$t' group by j, m, t, h, mi;"); while($row = mysql_fetch_array($result)) { $nw=$row['j'].",".$row['m'].",".$row['t'].",".$row['h'].",".$row['mi'].",".$row['se'].",". $row['MAX(dba)'].",". $row['MIN(dba)'].",".$row['ROUND(AVG(dba))']; $nw = preg_replace("#[\r\n]#", '', $nw); $nw = preg_replace("%(\r\n)|(\r)%", "", $nw)."\n"; $nw = preg_replace('#,#', ', ', $nw); echo $nw; } mysql_close($con); ?>
Und zu guter letzt noch die anzeige des Graph index.php „/var/www/html/wdx/index.php“
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Using Highcharts with PHP and MySQL</title> <script type="text/javascript" src="js/jquery-1.7.1.min.js" ></script> <script type="text/javascript" src="js/highcharts.js" ></script> <script type="text/javascript" src="js/themes/gray.js"></script> <script type="text/javascript"> var chart; $(document).ready(function() { var options = { chart: { renderTo: 'container', defaultSeriesType: 'line', marginRight: 130, marginBottom: 25 }, title: { text: 'dbA', x: -20 //center }, subtitle: { text: '', x: -20 }, xAxis: { type: 'datetime', tickInterval: 3600 * 1000, // one hour tickWidth: 0, gridLineWidth: 1, labels: { align: 'center', x: -3, y: 20, formatter: function() { return Highcharts.dateFormat('%H:%M', this.value); } } }, yAxis: { title: { text: 'dbA' }, plotLines: [{ value: 0, width: 1, color: '#808080' }] }, tooltip: { formatter: function() { return Highcharts.dateFormat('', this.x-(1000*3600)) +''+ Highcharts.dateFormat('%H:%M', this.x) +' - <b>'+ this.y + 'dbA</b>'; } }, legend: { layout: 'vertical', align: 'right', verticalAlign: 'top', x: -10, y: 100, borderWidth: 0 }, series: [{ name: 'L01 (Maximalwert)' }, { name: 'L95 (Minimalwer)' }, { name: 'Leq (Mittelwert)' }] } // Load data asynchronously using jQuery. On success, add the data // to the options and initiate the chart. // This data is obtained by exporting a GA custom report to TSV. // http://api.jquery.com/jQuery.get/ jQuery.get('data.php', null, function(tsv) { var lines = []; traffic = []; trafficc = []; trafficcc = []; try { // split the data return into lines and parse them tsv = tsv.split(/\n/g); jQuery.each(tsv, function(i, line) { line = line.split(/,/); date = Date.UTC(line[0],line[1],line[2],line[3],line[4],line[5]); traffic.push([ date, parseInt(line[6].replace(',', ''), 10) ]); trafficc.push([ date, parseInt(line[7].replace(',', ''), 10) ]); trafficcc.push([ date, parseInt(line[8].replace(',', ''), 10) ]); }); } catch (e) { } options.series[0].data = traffic; options.series[1].data = trafficc; options.series[2].data = trafficcc; chart = new Highcharts.Chart(options); }); }); </script> </head> <body> <?php $j=shell_exec('cat j'); $j=str_replace(' ','',$j); $j = preg_replace("#[\r\n]#", '', $j); $m=shell_exec('cat m'); $m=str_replace(' ','',$m); $m = preg_replace("#[\r\n]#", '', $m); $t=shell_exec('cat t'); $t=str_replace(' ','',$t); $t = preg_replace("#[\r\n]#", '', $t); $h=shell_exec('cat h'); $h=str_replace(' ','',$h); $h = preg_replace("#[\r\n]#", '', $h); echo "<center><b><font size=6>Messung vom: ".$j.".".$m.".".$t; ?> <div id="container" style="width: 100%; height: 400px; margin: 0 auto"></div> </body> </html>
Nach einem Neustart des Raspberry PI sollte dann die Aufzeichnung automatisch starten
Das Ergebnis könnte etwa so aussehen: