2.8 Xây dựng cơ sở dữ liệu
Bước 1:Chọn server name cho CSDL
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
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
Bước 2: Kéo thả các toolbox và đặt tên cho các toolbox
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/Dataset/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
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.
Mạch còn khá to.
Linh kiện công suất nhỏ nên bị giới hạn về công suất. 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;
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 sender, 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=DESKTOP- KMPOVST\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 {
con.Open();
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) { }
} } }