Raspberrypi.solar
Vorlauf/Rücklauf Grafik
rsync -av orgamon-2.dyndns.org::srv/*.txt /root/temp
program t;
{$mode objfpc}
uses
Classes, Sysutils;
const
cTemp_IllegalValue = -1000;
cSensorRoot = '/sys/bus/w1/devices/';
cSensorVal = '/w1_slave';
cSensorCPU = '/sys/class/thermal/thermal_zone0/temp';
cValue_Granularity = 5000;
cValue_MessureTime = 750;
cFormat_Revision = 1; //
function rTemp(SensorID: string) : extended;
var
sl : TStringList;
k : Integer;
value: string;
d: extended;
begin
result := cTemp_IllegalValue;
sl := TStringList.create;
sl.loadFromFile(cSensorRoot+SensorID+cSensorVal);
repeat
if (sl.Count<>2) then
break;
if (pos('YES',sl[0])<28) then
break;
k := pos('t=',sl[1]);
if (k<>28) then
break;
value := copy(sl[1],30,MaxInt);
// writeln ('[',value,']');
d := StrToFloat(value);
result := Round(d / 100.0) / 10.0;
until true;
sl.free;
end;
var
temp_TimeStamp : TDateTime;
temp_Vorlauf,
temp_Ruecklauf : extended;
temp_Diff : extended;
LogFile : TextFile;
begin
while true do
begin
// ATOMIC BEGIN
temp_Vorlauf := rTemp('28-000005602b9d');
temp_Ruecklauf := rTemp('28-000005603987');
temp_TimeStamp := now;
// ATOMIC END
// Plausibilisierung
repeat
if (temp_Vorlauf=cTemp_IllegalValue) then
break;
if (temp_Ruecklauf=cTemp_IllegalValue) then
break;
// Berechnungen
temp_Diff := temp_Ruecklauf - temp_Vorlauf;
// Ausgabe
AssignFile(LogFile,'/srv/smb/temp/temperatur-' + FormatDateTime('YYYYMMDD',temp_TimeStamp) + '.log.txt');
{$i-}
append(LogFile);
{$i+}
if (IOresult<>0) then
begin
rewrite(LogFile);
writeln(LogFile,'FORMAT;MOMENT;VORLAUF;RUECKLAUF;DIFFERENZ');
end;
writeln(LogFile,
{} cFormat_Revision,';',
{} FormatDateTime('YYYYMMDD hh:mm:ss', temp_TimeStamp),';',
{} temp_Vorlauf:0:1,';',
{} temp_Ruecklauf:0:1,';',
{} temp_Diff:0:1 );
CloseFile(LogFile);
until true;
sleep(cValue_Granularity - 2 * cValue_MessureTime);
end;
end.
Vorlauf/Rücklauf messung
Drehzahl der Pumpe
Damit ich nicht in die Elektronik der Solarstation eingreifen muss (die Hocheffizienz-Pumpe wird per PWM betrieben) kam mir die Idee die Drehzahl der Pumpe über ihr Geräusch zu bestimmen.
USB Soundkarte
Eine USB Soundkarte für den Raspi und ein Billig-Mikrofon reichen aus. Der Chip Satz heisst CMedia HS100B und wird sofort durch einstecken erkannt und konfiguriert. In den Datenblättern habe ich gelesen dass die Hardware mit 48KHz sampelt die digital-Werte haben dabei eine Breite von 16 Bit. Das Mikrofon kommt in die rosa Buchse.
Tests
Ich mache eine Tonaufnahme um zu sehen ob das auswertbar ist. Das Playback in einer stillen Umgebung lässt mich als Meschein ab ca. 60% Pumpenleistung einen deutlichen Ton vernehmen. Besonders deutlich sind Drehzahländerungen, ab dann "weiss" das Ohr auf was man sich konzentrieren muss und kann die Drehzahl besser raushören. Ok, klar ist, dass man mit einer FFT bzw. einer Spektrum-Analyse viel viel weiter kommt. Ich verwende dazu diese Software:
http://www.qsl.net/dl4yhf/spectra1.html
Und tatsächlich es lassen sich deutliche "Peeks" erkennen und hoffentlich auch später automatisiert auswerten. Schlimm ist der "Brumm" der bei 50,100,150,200 Hz usw. alles andere totbrüllt. Interessant ist das es mehrere Frequenz-Bereiche gibt die bei Pumpenbetrieb ansprechen. Es könnten Oberwellen sein oder Reflektionen. Also ich also auch Frequenzen gesehen, die bei einer Drehzahl Erhöhung sinken. Also Frequenzen die ein Spiegelbild von anderen "realen" Frequenzen sind, die erwartungsgemäss steigen.
OK, wegen dem Übersprechen der 50-Hz-Bereiche muss je nach Drehzahl eine andere Frequenz fokusiert werden, da die Pumpenfrequenz in eines der Störbänder abtaucht und dadurch unsichtbar wird. Eine Herausforderung! Die Aufnahme einer "Stille" also Drehzahl 0% sollte gespeichert werden und immer vom "Nutzsignal" abgezogen werden, bzw. die Stille sollte als Filter dienen um die Brüllfrequenzen auszublenden.
als cron-Job
- Folgender Eintrag in die /etc/crontab macht alle 7 Minuten eine 120 sekündige Aufnahme
- Der Dateiname spiegelt den Aufnahmestart wieder also z.B. "drehzahl-20170331-162800-1.wav"
# sound-Aufnahme */7 * * * * root arecord --use-strftime -f dat -r 48 -D plughw:1,0 -c 1 -d 120 /srv/smb/temp/drehzahl-\%Y\%m\%d-\%H\%M00-1.wav
fft
Für die notwendige Fast-Fourier-Transformation brauche ich eine Software (zunächst auf dem PC, später auf dem Rasp!).
File -> Audio File & Stream Analysis -> Analyse and Play File (With dsp)
Für den Raspi stelle ich mir das so vor, dass er das native bestmögliche Sample der Soundkarte direkt in ein C Programm einliesst und eine schöne FFT durchführt. Ein Filter der Stille drauflegt und dann qualitativ beurteilt, ob es 0,15,20,30,40,50,60,70,80,90,100 Prozent sein könnten, dazu liegen Vergleichs-Peeks vor auf die er fokusiert. Eine Herausforderung!
Counter
gpio readall
- Einen Counter auf einen GPIO Pin setzen (mit wiringpi) und den Wert jede Sekunde in memchached schreiben
- Andere Module können dann des "Herz" Wert aus dem memchached lesen
LiveGraph
http://stackoverflow.com/questions/17354163/dynamically-update-values-of-a-chartjs-chart