Raspberrypi.solar

Aus OrgaMon Wiki
Zur Navigation springen Zur Suche springen

  • Raspi-Projekt, aktuell in der Entwicklung ...

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:


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

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