Így érdemes:

Ha teljesen laikus vagy, akkor az első résztől olvasd el a honlapot, mert egymásra vannak építve az oldalak! Jobbra a menü... Magyar az, aki aktívan tesz valamit, bármit, akármit a magyarság megmaradásáért! Mindenki más csak valami más, bármit is állítson magáról..

Heat engine Watt monitor

Frissítve : 2020.11.22. Volt egy hiba a szoftverbe, de most már javítva!

A cél, hogy egy hőerőgép modell elektromos kimenetének adatait (Watt, Amper, Volt) megmérjük, és a számítógépre továbbítsuk, hogy nagyobb méretben megjelenítsük, és akár további feldolgozásra is kerülhessenek. 

A hőerőgép:

Termoakusztikus hőerőgép videó:

https://youtu.be/JnX2IvRMYHU

A generátor:

A termoakusztikus hőerőgép rezegő mozgását lineáris generátorral hasznosítom, tehát egy (két) tekercs, és mágnes vagy nagy mélynyomó hangfal. 

Ezekről itt további info:

http://www.creative-science.org.uk/gensimple1.html

https://www.youtube.com/watch?v=XU_OHh2JR1c

A lineáris generátor áramköre:

Mivel a lineáris generátor váltakozó áramot állít elő, az INA219 szenzor pedig egyenáramot mér, valamint a legtöbb elektromos berendezés is egyenáramot igényel, ezen kívül,  közvetlenül a váltakozó áramot nehezebb mérni (https://www.youtube.com/watch?v=Vb9-pbLdsfQ&t=2s), mint az egyenfeszültséget, ezért is, előbb egyenirányítom, és kiegyenlítem. Erről itt bővebb infó:

http://www.creative-science.org.uk/gensimple2.html

A Watt monitor:

Hozzávalók:

-Arduino nano

-INA219 szenzor,

-próbapanel,

Az INA219 szenzor:

Egyenáramot mér egy 0.1 ohm %1-os sönt ellenállása és a matematika segítségével, beállítástól függően viszonylag jó pontossággal, max. 26V és max. 3.2 A alatti tartományban. Az arduino kódjával be lehet kalibrálni pontosabb beállításokat is, de most csak az alapbeállítást használjuk, így nincs semmi dolgunk, és így is elég pontos!

 Hagyományos módon általában úgy mérjük egy ilyen stirling modell generátor teljesítményét, hogy egy állítható ellenállást (fogyasztó vagy sönt), vagyis egy potmétert kötünk rá, és egyszerre két mérőműszert használunk. Egy feszültségmérőt, amit az ellenállásosunkkal  párhuzamosan kötünk be, és a másikkal, amit az ellenállással és feszültségmérővel sorosan csatlakoztatunk, mérjük az áramerősséget. A kettő, vagyis az áramerősség és a feszültség szorzata adja meg az ellenállás teljesítményét (fogyasztását). A potmétert  aztán elkezdjük csavargatni, és megkeressük azt az értéket, amikor a teljesítmény a legnagyobb, és ekkor kapjuk meg a generátor teljesítményét. Tehát folyamatos számolgatást is igényel a dolog. 

A wattmonitorok azonban leveszik ezt a terhet a vállunkról! Itt van egy másik típus (200A DC Watt Meter), nagyobb teljesítményekhez, nem csak játékhoz, de sajnos ez csak körülbelül 500mA felett kezd el mérni: https://www.ebay.com/itm/200A-DC-LCD-Digital-Monitor-Amp-Watt-Meter-RC-Battery-Solar-Power-Analyser-Tool/193243850524?hash=item2cfe3b271c:g:tiEAAOSwcDBd6io3

Az INA219 ötféle adatot mutat:

1 Söntfeszültség: feszültségesés a söntellenálláson

2. Buszfeszültség: a vizsgált áramkör által látott teljes feszültség. (tápfeszültség - söntfeszültség).

3. Áram: Ohm-törvény alapján származtatható a mért sönt feszültségből

4. Teljesítmény: az áram szorozva a busz feszültségével

5. Terhelési feszültség = buszfeszültség + (shuntfeszültség / 1000);



Amire nekünk szükségünk van, az a buszfeszültség, az áramerősség, és a teljesítmény.

A busz feszültség nem lehet alacsonyabb, mint a terhelési feszültség, ha mégis, akkor valami nem kóser...

bővebben itt:

https://www.youtube.com/watch?v=cG8moaufmQs


Áramkör:

A különböző típusú arduinoknak más számozású óra (SCL), és adat (SDA) lábai (pins) vannak. A nanonak az SCL pinje a A4 az SCL az A5. Ezeken kommunikál I2C protokollal. Egy arduinora közvetlenül négy ilyen szenzort köthetsz, de akkor állítanod kell az alapcím beállításukat, de ez most nem fontos. 



A más típusú arduino bekötését megtalálod ezen az oldalon:

https://diyi0t.com/ina219-tutorial-for-arduino-and-esp/

Az ina219 áramköre:



(Ha a földelést nem használod, akkor mindig 1V körül mutat alapba, tehát ne felejts el!)

A heat engine power monitor teljes áramköre:


Ha ezt a graetz-hídat használod, akkor csak 1.5A a max.! A potenciométerrel keresheted meg azt, ahol a legnagyobb teljesítményt mutatja a rendszer, ez a generátorod elektromos teljesítménye. Az elektrolit kondenzátor kapacitása legalább kb. 10 000µF legyen.

Arduino INA219 könyvtár telepítése:

Az arduino kódhoz szükséged van az Adafruit INA219.h könyvtár telepítésére. Ezt ki tudod keresni az arduino IDE könyvtár kezelő keresőjében, és a telepítés gomb megnyomásával.

Ha nem tudod hogyan kell így könyvtárat telepíteni, akkor itt van leírva:

https://diyi0t.com/how-to-install-a-library-in-the-arduino-ide/

Arduino (nano!)kódja:

------------------------------------------------

#include <Wire.h>

#include <Adafruit_INA219.h>


Adafruit_INA219 ina219;


  float voltage_V = 0,shuntVoltage_mV,busVoltage_V;

  float current_mA = 0;

  float power_mW = 0;

  float energy_Wh=0;

  long time_s=0;


void setup(void) 

{

  Serial.begin(9600);

  uint32_t currentFrequency;

  ina219.begin();

  Serial.println("Measuring voltage and current with INA219");

}


void loop(void) 

{

  getData();

  delay(2000);

}


void getData(){

  

 time_s=millis()/(1000); // convert time to sec

 busVoltage_V = ina219.getBusVoltage_V();

 shuntVoltage_mV = ina219.getShuntVoltage_mV();

 voltage_V = busVoltage_V + (shuntVoltage_mV / 1000);

 current_mA = ina219.getCurrent_mA();

 //power_mW = ina219.getPower_mW(); 

 power_mW=current_mA*voltage_V; 

 energy_Wh=(power_mW*time_s)/3600;   //energy in watt hour

   

  

  Serial.print("Bus Voltage:   "); Serial.print(busVoltage_V); Serial.println(" V");

  Serial.print("Shunt Voltage: "); Serial.print(shuntVoltage_mV); Serial.println(" mV");

  Serial.print("Load Voltage:  "); Serial.print(voltage_V); Serial.println(" V");

  Serial.print("Current:       "); Serial.print(current_mA); Serial.println(" mA");

  Serial.print("Power:         "); Serial.print(power_mW); Serial.println(" mW");  

  Serial.print("Energy:        "); Serial.print(energy_Wh); Serial.println(" mWh");

  Serial.println("----------------------------------------------------------------------------");

}


-----------------------------------------------

Másold be az arduino IDE-ba és töltsd fel az eszközre!

Megnyitva az arduino IDE soros monitorát, máris láthatjuk  adatokat a számítógép monitorján.


Visual Basic soros monitor:

Azért, hogy ezekkel az adatokat a számítógépen jobban láthatóan meg tudjuk jeleníteni, majd fel tudjuk esetleg dolgozni, csináltam egy nagyon kezdetleges soros monitort.:



A kódoláshoz a Visual Studio 2015-ös verzióját használtam..

Ha nem akarsz kódolni, akkor innen letöltheted a programot Windows operációs rendszerhez:

https://drive.google.com/file/d/1C9xawQI5ck8HC9kXyYy5voHTv9vaGEGB/view?usp=sharing

Vagy a projektfájlját innen: 

https://drive.google.com/file/d/1AjAwAeqgHiTFLppHVUkiZCJLOBPEqTps/view?usp=sharing

A visual basic, windows form kódja:

Van a form-on egy timer (1000-re állítva), és egy serialPort is, valamint egy combobox, egy button, és vagy 10 label....

A VB kódhoz egyéb beállítások:

Timer1 = 1000

Serial port beállítás:

RtsEnable True

DtrEnable True

Modifiers Friend

Port name COM1

----------------------------------------------------

Imports System.IO.Ports

Imports System.Threading


Public Class Form1


    Dim comPORT As String

    Dim receivedData As String = ""

    Dim watt As Integer

    Dim volt As Integer

    Dim ampere As Integer

    Dim marker As Integer = 1


    Dim volt2 As Single = 0

    Dim ampere2 As Single = 0

    Dim watt2 As Integer = 0




    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Timer1.Enabled = False


        comPORT = ""

        For Each sp As String In My.Computer.Ports.SerialPortNames

            ComboBox1.Items.Add(sp)

        Next


    End Sub


    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged

        If (ComboBox1.SelectedItem <> "") Then

            comPORT = ComboBox1.SelectedItem

        End If

    End Sub


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        If (Button1.Text = "START") Then

            If (comPORT <> "") Then

                SerialPort1.Close()

                SerialPort1.PortName = comPORT

                SerialPort1.BaudRate = 9600

                SerialPort1.DataBits = 8

                SerialPort1.Parity = Parity.None

                SerialPort1.StopBits = StopBits.One

                SerialPort1.Handshake = Handshake.None

                SerialPort1.Encoding = System.Text.Encoding.Default 'very important!

                SerialPort1.ReadTimeout = 10000


                SerialPort1.Open()

                Button1.Text = "STOP"

                ComboBox1.Enabled = False

                Timer1.Enabled = True


            Else

                MsgBox("Select a COM port first")

            End If

        Else

            Timer1.Enabled = False


            SerialPort1.Close()

            Button1.Text = "Start"

            ComboBox1.Enabled = True

            ComboBox1.Text = String.Empty

        End If

    End Sub


    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

        receivedData = ReceiveSerialData()

        If ((receivedData.Contains("<") And receivedData.Contains(">"))) Then

            parseData()

        End If


        Label5.Text = volt / 100

        Label6.Text = ampere / 100

        volt2 = Label5.Text

        ampere2 = Label6.Text

        watt = Convert.ToInt32(Label5.Text * Label6.Text)

        Label4.Text = watt




        If (marker = 2) Then



            If (Label15.Text < volt2) Then

                Label15.Text = volt2

            End If


            If (Label16.Text < ampere2) Then

                Label16.Text = ampere2

            End If


            If (Label14.Text < watt) Then

                Label14.Text = watt

            End If



        Else

            Label14.Text = 0

            Label15.Text = 0

            Label16.Text = 0

        End If


        If (Label5.Text > 22) Then

            Label5.ForeColor = Color.Red

        Else

            Label5.ForeColor = Color.Black

        End If


        If (Label6.Text > 3000) Then

            Label6.ForeColor = Color.Red

        Else

            Label6.ForeColor = Color.Black

        End If


    End Sub


    Function ReceiveSerialData() As String

        Dim Incoming As String

        Try

            Incoming = SerialPort1.ReadExisting()

            If Incoming Is Nothing Then

                Return "nothing" & vbCrLf

            Else

                Return Incoming

            End If

        Catch ex As TimeoutException

            Return "Error: Serial Port read timed out."

        End Try


    End Function


    Function parseData()


        Dim pos1 As Integer

        Dim pos2 As Integer

        Dim length As Integer

        Dim newCommand As String

        Dim done As Boolean = False


        While (Not done)


            pos1 = receivedData.IndexOf("<") + 1

            pos2 = receivedData.IndexOf(">") + 1


            If (pos2 < pos1) Then

                receivedData = Microsoft.VisualBasic.Mid(receivedData, pos2 + 1)

                pos1 = receivedData.IndexOf("<") + 1

                pos2 = receivedData.IndexOf(">") + 1

            End If


            If (pos1 = 0 Or pos2 = 0) Then


                done = True


            Else


                length = pos2 - pos1 + 1

                If (length > 0) Then

                    newCommand = Mid(receivedData, pos1 + 1, length - 2)

                    receivedData = Mid(receivedData, pos2 + 1)



                    If (newCommand.Substring(0, 1) = "v") Then

                        volt = newCommand.Substring(1, 6)


                    End If


                    If (newCommand.Substring(0, 1) = "a") Then

                        ampere = newCommand.Substring(1, 6)


                    End If


                End If


            End If


        End While


    End Function



    Private Sub Label3_Click(sender As Object, e As EventArgs) Handles Label3.Click


    End Sub


    Private Sub Label8_Click(sender As Object, e As EventArgs) Handles Label8.Click


    End Sub


    Private Sub Label9_Click(sender As Object, e As EventArgs) Handles Label9.Click


    End Sub


    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        If (Button2.Text = "MAX.START") Then

            marker = 2

            Button2.Text = "MAX.DELETE"

        Else


            Button2.Text = "MAX.DELETE"

            marker = 1

            Button2.Text = "MAX.START"

        End If



    End Sub


    Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click


    End Sub


    Private Sub Label16_Click(sender As Object, e As EventArgs) Handles Label16.Click


    End Sub

End Class




----------------------------------------------------

Az arduino (nano!) módosított kódja hozzá:

#include <Wire.h>


#include <Adafruit_INA219.h>


Adafruit_INA219 ina219;


const boolean DEBUG = true;


char karakterhossz[10];


  float voltage_V = 0,shuntVoltage_mV,busVoltage_V;


  float voltage_V2 =0 ;


  float current_mA = 0;


  float current_mA2 =0;


 int volt = 0;


 int amper = 0;


void setup(void) 


{


  Serial.begin(9600);


  uint32_t currentFrequency;


  ina219.begin();


}


void loop(void) 


{


  getData();


  delay(1000);


}


void formatNumber( unsigned int number, byte digits)


{


    char visitorString[10] = "\0";


    strcpy(karakterhossz, visitorString);


    itoa (number, visitorString, 10);


    byte numZeros = digits - strlen(visitorString) ;


    if (numZeros > 0)


    {


       for (int i=1; i <= numZeros; i++)    { strcat(karakterhossz,"0");  }


    }


    strcat(karakterhossz,visitorString);


}


void getData(){


 busVoltage_V = ina219.getBusVoltage_V();


 shuntVoltage_mV = ina219.getShuntVoltage_mV();


 voltage_V = busVoltage_V + (shuntVoltage_mV / 1000);


 current_mA = ina219.getCurrent_mA();


 voltage_V2 = voltage_V * 100;


 current_mA2 = current_mA * 100;


 volt = abs((int)voltage_V2);


 amper = abs((int)current_mA2);


formatNumber( volt, 6);


       Serial.print("<v");


       Serial.print(karakterhossz);


       Serial.print(">");


       if (DEBUG) { Serial.println("");  }


        formatNumber( amper, 6);


       Serial.print("<a");


       Serial.print(karakterhossz);


       Serial.print(">");


       if (DEBUG) { Serial.println("");  }


}

  


Ezeket az oldalakat néztem át a projekthez, és voltak a segítségemre, illetve a források:

https://www.nn-digital.com/en/blog/2019/11/05/learn-ina219-current-voltage-power-sensor-modules-with-arduino/

https://diyi0t.com/ina219-tutorial-for-arduino-and-esp/

https://makecademy.com/power-monitoring-arduino-ina219

https://www.aranacorp.com/en/power-measurement-with-arduino-and-ina219/

https://e-radionica.com/en/blog/hum-digital-ammeter-voltmeter-ina219/

https://wiki.dfrobot.com/Gravity:%20I2C%20Digital%20Wattmeter%20SKU:%20SEN0291

https://www.youtube.com/watch?v=Vb9-pbLdsfQ