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:

front_of_raspberry_pi Raspberry PI V3, Netzteil und SD-Karte (min 16GB)

(Amazon: LINK)

51xAKfckmGL Arduino Nano V3.0 ATmega328P-AU MCU

(Amazon: LINK)

31ZbrO5wm7L InLine Modular Kupplung, RJ12 Buchse / Buchse

(Amazon: LINK)

mml0 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).

  1. Als erstes brechen wir die RJ12 Kupplung in der Mitte durch (das geht relativ einfach)
  2. Die Kable schwarz, blau und weiß schneiden wir kurz
  3. Nun werden die übrigen kabel mit dem Arduino verlötet:
    1. rot -> A0
    2. gelb -> +5V
    3. grün -> Gnd
  4. Die Buchse und den Arduino mit Tape zusammenkleben (um das lösen der verlöteten Kabel zu vermeiden)
  5. 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.

  1. Die benötigte Software installieren „apt-get install apache2 php5 mysql-server mysql-client php5-mysql“
  2. Arbeitsverzeichnis anlegen „mkdir /home/pi/dba“
  3. Tmp Verzeichnis erstellen „mkdir /home/pi/dba/tmp“
  4. 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&auml;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:

dba