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ó:
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:
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://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