Hình 2.12 Lưu đồ thuật toán
2.8 Xây dựng cơ sở dữ liệu
Hình 2.18 Chọn server name cho CSDL
Bước 2: Chọn Database/chuột phải chọn New Database. Đặt tên cho CSDL
Hình 2.19 Đặt tên cho CSDL
Hình 2.20 Tạo một Table mới
Bước 4: Đặt tên cho từng cột, lựa chọn loại định dạng dữ liệu và chọn khóa chính
Hình 2.21 Đặt tên và chọn định dạng dữ liệu
Bước 5: Đặt tên cho Table và lưu Table
Hình 2.22 Đặt tên và lưu bảng
2.9 Xây dựng phần mềm
Bước 1: Khởi động Visual Studio, thiết lập New Project, chọn lập trình Windows Forms Application và đặt tên rồi ấn OK:
Hình 2.23 Windows Forms Application
Hình 2.24 Giao diện lập trình Windows Forms Application
Hình 2.25 Kéo thả Label, Textnox, Button, DataGridView
Bước 3: Liên kết với SCDL
Chọn bindingSource/Add Project Data Source/DataBase/Next/Datas et/Next
Chọn New Connection/chọn Server name/chọn database name
Hình 2.27 Kết nối CSDL
Sau đó nhấn NEXT và tích toàn bộ object cuảng Database
Hình 2.28 Liên kết dataGridView với bảng
Chương 3: Kếp Quả Và Đánh Giá 3.1. Kết quả hệ thống
Hình ảnh sản phẩm
Hình 3.13 Hình ảnh thực tế
Giao diện giám sát
Hình 3.14 Dữ liệu nhận được
Dữ liệu lưu vào sql
Hình 3.15 Dữ liệu tại SQL
3.2. Đánh giá Ưu điểm
• Hệ thống hoạt động ổn định.
• Độ chính xác khi đo của cảm biến tốt. Giao diện dễ sử dụng.
Nhược điểm
• Mạch còn khá to.
• Cảm biến mất nhiều thời gian để thu thâp dữ liệu.
• Hệ thống còn ở dạng mô hình nên còn rất nhiều thiếu sót để áp dụng vào thực tế nên
Phụ lục Code Arduino
#include <Wire.h>
#include <PZEM004Tv30.h> #include "ACS712.h"
ACS712 sensor(ACS712_20A, A0);
PZEM004Tv30 pzem(2,3); int zero; float I;
float I_TB; float tong; float vol_out; float Adc = 0; float Vdc = 0; float v ; float c ; float p ; float e ; float f ; float pf ; int relay = 4; void setup(void) { Serial.begin(9600); pinMode(relay, OUTPUT); zero = sensor.calibrate(); digitalWrite(relay,HIGH); delay (2000); } void loop(void) { delay(500); v = pzem.voltage(); c = 1000 * pzem.current(); p = pzem.power(); e = pzem.energy(); f = pzem.frequency(); pf =
pzem.pf(); for (int i=0; i<=100; i++) { I = sensor.getCurrentDC(); tong = tong + I; } I_TB = tong/100; tong = 0;
Adc = I_TB * 1000; int volt = analogRead(A1); vol_out = ( volt * 5.0 ) / 1024.0; Vdc = float(vol_out / float(993.0/float(10060.0 + 930.0))); if ( Vdc <= 11.5) { digitalWrite(relay, HIGH); } else { digitalWrite(relay, LOW); } v = pzem.voltage(); c = 1000 * pzem.current(); p = pzem.power(); e = pzem.energy(); f = pzem.frequency(); pf = pzem.pf(); if(v >200) {
Serial.println("~" +(String)Vdc + "!" +(String)Adc + "@" + (String)v + "#" + (String)c + "$" + (String)p + "%" + (String)e + "^" + (String)f + "&" + (String)pf + "*" + "---");
} }
Code Form 1 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using
System.Drawing; using
System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; using System.Data.SqlClient;
namespace Giám_sát_tăng_áp_nghcịh_lưu {
public partial class Form1 : Form {
SerialPort port = new SerialPort(); public Form1()
{
InitializeComponent();
this.port.DataReceived += new
System.IO.Ports.SerialDataReceivedEventHandler(port_DataReceived); string[] com = SerialPort.GetPortNames();
cbbcom.Items.AddRange(com); string[] baud = { "4800", "9600", "19200", "38400", "115200" };
cbbbr.Items.AddRange(baud); }
private void Form1_Load(object sender, EventArgs e) {
// TODO: This line of code loads data into the 'doluong2DataSet.gstangap' table. You can move, or remove it, as needed.
this.gstangapTableAdapter.Fill(this.doluong2DataSet.gstangap);
Control.CheckForIllegalCrossThreadCalls = false;
cbbcom.SelectedIndex = 0; cbbbr.SelectedIndex = 1;
hienthi_CSDL(); timer1.Enabled = false; }
string data, Vdc, Idc, Vac, Iac, P, E, F, Pf; private void timer1_Tick(object sender, EventArgs e) {
tbtg.Text = DateTime.Now.ToString("hh.mm.ss dd.MM.yyyy");
KNCSDL kn = new KNCSDL(); kn.them_DL(tbtg.Text, tbudc.Text, tbidc.Text, tbuac.Text, tbiac.Text, tbp.Text, tbe.Text, tbf.Text, tbpf.Text);
hienthi_CSDL(); }
private void btdisconnect_Click(object sender, EventArgs e) { port.Close(); btdisconnect.Enabled = false; btconnect.Enabled = true; MessageBox.Show("Đã Ngắt Kết Nối"); timer1.Enabled = false; }
private void btconnect_Click(object sender, EventArgs e) { try { port.PortName = cbbcom.Text; port.Open(); btconnect.Enabled = false; btdisconnect.Enabled = true; timer1.Enabled = true;
} catch
{
MessageBox.Show("Lỗi Kết Nối", "Thử Lại", MessageBoxButtons.OK, MessageBoxIcon.Error);
} }
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) {
try {
//throw new NotImplementedException(); data = port.ReadExisting(); int start, end; start = data.IndexOf("~"); end =
data.IndexOf("!");
Vdc = data.Substring(start + 1, end - start - 1); tbudc.Text = Vdc; start = end;
end = data.IndexOf("@");
Idc = data.Substring(start + 1, end - start - 1); tbidc.Text = Idc;
start = end; end = data.IndexOf("#");
Vac = data.Substring(start + 1, end - start -
1); tbuac.Text = Vac; start = end; end = data.IndexOf("$");
Iac = data.Substring(start + 1, end - start - 1); tbiac.Text = Iac; start = end; end =
data.IndexOf("%");
P = data.Substring(start + 1, end - start -
1); tbp.Text = P; start = end; end = data.IndexOf("^");
E = data.Substring(start + 1, end - start - 1); tbe.Text = E; start = end; end =
data.IndexOf("&");
F = data.Substring(start + 1, end - start - 1); tbf.Text = F; start = end; end =
data.IndexOf("*");
Pf = data.Substring(start + 1, end - start - 1); tbpf.Text = Pf;
}
catch (Exception ex) { }
}
private void cbbcom_SelectedIndexChanged(object send er, EventArgs e) {
if (port.IsOpen) port.Close(); port.PortName = cbbcom.SelectedIndex.ToString();
}
private void cbbbr_SelectedIndexChanged(object sender, EventArgs e) {
if (port.IsOpen) port.Close(); port.BaudRate = Convert.ToInt16(cbbbr.Text);
}
private void hienthi_CSDL() { KNCSDL kn = new KNCSDL(); kn.hienthi(this.dataGridView1); } } }
Code Class using System; using System.Collections.Generic; using
System.Linq; using System.Text; using System.Data.SqlClient; using System.IO.Ports; using System.Data; using System.Windows.Forms; namespace Giám_sát_tăng_áp_nghcịh_lưu { class KNCSDL {
SqlConnection con = new SqlConnection(@"Data Source=DESKTOPKMPOVST\SQLEXPRESS;Initial
Catalog=doluong2;Integrated Security=True");
public void hienthi(DataGridView _dt) { try
{ con.Open();
string selec = "select * from gstangap";
SqlDataAdapter sql = new SqlDataAdapter(selec, con); DataTable dt = new DataTable(); sql.Fill(dt);
_dt.DataSource = dt; con.Close();
}
catch (Exception es) { }
}
public void them_DL(String thoigian, String vDc, String iDc, String vAc, String iAc, String pw, String en, String fr, String pF)
{ try {
string insertSQL = "INSERT INTO gstangap VALUES(@tg, @udc, @idc, @uac, @iac, @p, @e, @f, @pf)";
SqlCommand Com = new SqlCommand(insertSQL, con); Com.CommandType = CommandType.Text;
Com.Parameters.AddWithValue("tg", SqlDbType.NVarChar).SqlValue = thoigian;
Com.Parameters.AddWithValue("udc", SqlDbType.NChar).SqlValue = vDc; Com.Parameters.AddWithValue("idc", SqlDbType.NChar).SqlValue = iDc; Com.Parameters.AddWithValue("uac", SqlDbType.NChar).SqlValue = vAc; Com.Parameters.AddWithValue("iac", SqlDbType.NChar).SqlValue = iAc; Com.Parameters.AddWithValue("p", SqlDbType.NChar).SqlValue = pw; Com.Parameters.AddWithValue("e", SqlDbType.NChar).SqlValue = en; Com.Parameters.AddWithValue("f", SqlDbType.NChar).SqlValue = fr; Com.Parameters.AddWithValue("pf", SqlDbType.NChar).SqlValue = pF; Com.ExecuteNonQuery(); con.Close();
}
catch (Exception exx) { }
} } }