0% found this document useful (0 votes)
2 views10 pages

C# Serial Port LED Control App

Uploaded by

thanhtb0344
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views10 pages

C# Serial Port LED Control App

Uploaded by

thanhtb0344
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

C#

using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using OfficeOpenXml;
using [Link];
namespace final
{
public partial class Form1 : Form
{
SerialPort SerCom = new SerialPort();
bool led1State = false, led2State = false, led3State = false;
private readonly string logFolder = @"F:\Download";
private readonly string logFile = @"F:\Download\[Link]";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
[Link] = [Link];
// Khởi tạo các ComboBox
[Link](new[] { "Manual", "Timer", "ON Delay",
"OFF Delay", "ON/OFF Delay" });
[Link] = 0;
[Link](new[] { "Thiết Bị 1", "Thiết Bị 2",
"Thiết Bị 3" });
[Link](new[] { "ON", "OFF", "None" });
[Link] = 2;
[Link](new[] { "Giờ", "Phút", "Giây" });
[Link](new[] { "Giờ", "Phút", "Giây" });
[Link](new[] { "COM3", "COM4", "COM5" });
[Link](new object[] { "9600", "19200", "38400",
"57600", "115200" });
[Link] = 0;
[Link] = [Link];
[Link] = "dd/MM/yyyy - HH:mm:ss";
[Link] = false;
[Link] = "Vui Lòng Kết Nối COM";
[Link]();
UpdateButtonState();
if (![Link](logFolder))
[Link](logFolder);
}
private void GhiLogExcel(string thietBi, string trangThai)
{
try
{
var file = new FileInfo(logFile);
using (var package = new ExcelPackage(file))
{
var ws = [Link]["LichSu"] ??
[Link]("LichSu");
if ([Link] == null)
{
[Link][1, 1].Value = "Thời gian";
[Link][1, 2].Value = "Thiết bị";
[Link][1, 3].Value = "Trạng thái";
using (var h = [Link][1, 1, 1, 3])
{
[Link] = true;
[Link] = [Link];

[Link]([Link](0, 102, 204));


[Link]([Link]);
[Link] =
[Link];
}
[Link](1).Width = 22;
[Link](2).Width = 16;
[Link](3).Width = 12;
}
int row = [Link]?.[Link] + 1 ?? 2;
[Link][row, 1].Value = [Link]("dd/MM/yyyy
HH:mm:ss");
[Link][row, 2].Value = thietBi;
[Link][row, 3].Value = trangThai;
var fill = [Link][row, 1, row, 3].[Link];
[Link] = [Link];
[Link](trangThai == "ON" ?
[Link] : [Link]);
[Link]();
}
}
catch { }
}
private void SerCom_DataReceived(object sender,
SerialDataReceivedEventArgs e)
{
try
{
string data = [Link]().Trim();
[Link]((MethodInvoker)(() => XuLyLenh(data)));
}
catch { }
}
private void XuLyLenh(string data)
{
bool thayDoi = false;
if (data == "LED1=1" && !led1State) { led1State = true;
GhiLogExcel("Thiết Bị 1", "ON"); thayDoi = true; }
if (data == "LED1=0" && led1State) { led1State = false;
GhiLogExcel("Thiết Bị 1", "OFF"); thayDoi = true; }
if (data == "LED2=1" && !led2State) { led2State = true;
GhiLogExcel("Thiết Bị 2", "ON"); thayDoi = true; }
if (data == "LED2=0" && led2State) { led2State = false;
GhiLogExcel("Thiết Bị 2", "OFF"); thayDoi = true; }
if (data == "LED3=1" && !led3State) { led3State = true;
GhiLogExcel("Thiết Bị 3", "ON"); thayDoi = true; }
if (data == "LED3=0" && led3State) { led3State = false;
GhiLogExcel("Thiết Bị 3", "OFF"); thayDoi = true; }
if (thayDoi)
{
[Link] = led1State ? [Link] : [Link];
[Link] = led2State ? [Link] : [Link];
[Link] = led3State ? [Link] : [Link];
[Link] = led1State ? [Link] :
[Link];
[Link] = led2State ? [Link] :
[Link];
[Link] = led3State ? [Link] :
[Link];
}
}
private void comboBox1_SelectedIndexChanged_1(object sender, EventArgs
e)
{
UpdateButtonState();
}
private void UpdateButtonState()
{
string mode = [Link]?.ToString() ?? "";
bool isManual = (mode == "Manual");
bool isTimer = (mode == "Timer");
bool isOnDelay = (mode == "ON Delay");
bool isOffDelay = (mode == "OFF Delay");
bool isOnOffDelay = (mode == "ON/OFF Delay");
[Link] = isManual;
[Link] = isManual;
[Link] = isManual;
[Link] = isTimer || isOnDelay || isOffDelay ||
isOnOffDelay;
[Link] = isTimer || isOnDelay || isOffDelay ||
isOnOffDelay;
[Link] = isTimer;
[Link] = isTimer || isOnDelay || isOffDelay ||
isOnOffDelay;
[Link] = isTimer || isOnDelay || isOffDelay ||
isOnOffDelay;
[Link] = isOnDelay || isOnOffDelay;
[Link] = isOffDelay || isOnOffDelay;
[Link] = isOnDelay || isOnOffDelay;
[Link] = isOffDelay || isOnOffDelay;
if (isOnDelay || isOffDelay || isOnOffDelay)
[Link] = 2; // None
}
private void button1_Click_1(object sender, EventArgs e) =>
[Link]();
private void button2_Click(object sender, EventArgs e)
{
if ([Link])
{
[Link]();
[Link] = "Connect";
[Link] = [Link];
[Link] = "Vui Lòng Kết Nối COM";
[Link] = false;
}
else
{
try
{
[Link] = [Link]();
[Link] =
[Link]([Link]());
[Link]();
[Link] += SerCom_DataReceived;
[Link]("STATE?");
[Link] = "Disconnect";
[Link] = [Link];
[Link] = "Đã kết nối " + [Link];
[Link] = true;
[Link]("Đã Kết nối: " + [Link]);
}
catch (Exception ex)
{
[Link]("Lỗi kết nối: " + [Link]);
[Link] = [Link];
}
}
}
private void button3_Click(object sender, EventArgs e)
{
if ([Link])
[Link](led1State ? "T1" : "B1");
}
private void button4_Click(object sender, EventArgs e)
{
if ([Link])
[Link](led2State ? "T2" : "B2");
}
private void button5_Click(object sender, EventArgs e)
{
if ([Link])
[Link](led3State ? "T3" : "B3");
}
private void button6_Click(object sender, EventArgs e)
{
if ([Link] == -1) return;
string mode = [Link];
string thietBi = [Link];
if (mode == "Timer")
{
if ([Link] == "None") { [Link]("Chọn
ON/OFF!"); return; }
if ([Link] <= [Link]) {
[Link]("Chọn thời gian tương lai!"); return; }
ThemTimerLenh(thietBi, [Link], [Link]);
}
else if (mode == "ON Delay")
{
if (![Link]([Link], out int n) || n <= 0) {
[Link]("Nhập số dương!"); return; }
ThemOnDelay(thietBi, n, [Link]);
}
else if (mode == "OFF Delay")
{
if (![Link]([Link], out int n) || n <= 0) {
[Link]("Nhập số dương!"); return; }
ThemOffDelay(thietBi, n, [Link]);
}
else if (mode == "ON/OFF Delay")
{
if (![Link]([Link], out int on) || on <= 0 || !
[Link]([Link], out int off) || off <= 0)
{ [Link]("Nhập thời gian hợp lệ!"); return; }
ThemOnOffDelay(thietBi, on, [Link], off,
[Link]);
}
}
private void button7_Click(object sender, EventArgs e)
{
if ([Link] >= 0 && [Link]("Xóa nhiệm vụ
này?", "Xác nhận", [Link]) == [Link])
[Link]([Link]);
}
private void GuiLenh(string thietBi, string action)
{
if (![Link]) return;
string lenh = "";
if (thietBi == "Thiết Bị 1") lenh = (action == "B") ? "B1" : "T1";
if (thietBi == "Thiết Bị 2") lenh = (action == "B") ? "B2" : "T2";
if (thietBi == "Thiết Bị 3") lenh = (action == "B") ? "B3" : "T3";
if (lenh != "")
{
try { [Link](lenh); }
catch (Exception ex) { [Link]("COM Error: " +
[Link]); }
}
}
private void ThemOnDelay(string thietBi, int soLuong, string donVi)
{
DateTime batSau = [Link];
if (donVi == "Giờ") batSau = [Link](soLuong);
else if (donVi == "Phút") batSau = [Link](soLuong);
else batSau = [Link](soLuong);
[Link]($"{thietBi} | ON | {batSau:dd/MM/yyyy -
HH:mm:ss} | {soLuong},{donVi}");
GuiLenh(thietBi, "T"); // Tắt ngay
[Link]($"{thietBi} tắt ngay → bật sau {soLuong}
{donVi}");
}
private void ThemOffDelay(string thietBi, int soLuong, string donVi)
{
DateTime tatSau = [Link];
if (donVi == "Giờ") tatSau = [Link](soLuong);
else if (donVi == "Phút") tatSau = [Link](soLuong);
else tatSau = [Link](soLuong);
[Link]($"{thietBi} | OFF | {tatSau:dd/MM/yyyy -
HH:mm:ss} | {soLuong},{donVi}");
GuiLenh(thietBi, "B"); // Bật ngay
[Link]($"{thietBi} bật ngay → tắt sau {soLuong}
{donVi}");
}
private void ThemOnOffDelay(string thietBi, int onSo, string onDv, int
offSo, string offDv)
{
DateTime dauTien = [Link](onDv == "Giờ" ?
[Link](onSo) :
onDv == "Phút" ?
[Link](onSo) :
[Link](onSo));
[Link]($"{thietBi} | ONOFF | {dauTien:dd/MM/yyyy -
HH:mm:ss} | {onSo},{onDv},{offSo},{offDv} | Stage=ON");
GuiLenh(thietBi, "B");
[Link]($"{thietBi} bắt đầu chu kỳ ON/OFF");
}
private void ThemTimerLenh(string thietBi, string trangThai, DateTime
thoiGian)
{
[Link]($"{thietBi} | {trangThai} |
{thoiGian:dd/MM/yyyy - HH:mm:ss}");
[Link]($"{thietBi} sẽ {trangThai} vào
{thoiGian:dd/MM/yyyy - HH:mm:ss}");
}
private void timer1_Tick(object sender, EventArgs e)
{
[Link] = [Link]("dd/MM/yyyy - HH:mm:ss");
if (![Link] || [Link] == 0) return;
DateTime now = [Link];
for (int i = [Link] - 1; i >= 0; i--)
{
string[] p = [Link][i].ToString().Split('|');
if ([Link] < 3) continue;
string thietBi = p[0].Trim();
string cheDo = p[1].Trim();
if (![Link](p[2].Trim(), "dd/MM/yyyy -
HH:mm:ss", null, [Link], out DateTime target))
continue;
if ([Link]((now - target).TotalSeconds) > 1) continue;
if (cheDo == "ON" || cheDo == "OFF")
{
GuiLenh(thietBi, cheDo == "ON" ? "B" : "T");
[Link](i);
}
else if (cheDo == "ONOFF" && [Link] >= 5)
{
string[] d = p[3].Trim().Split(',');
if ([Link] < 4) continue;
if (![Link](d[0], out int tOn) || !
[Link](d[2], out int tOff)) continue;
string stage = p[4].Contains("ON") ? "ON" : "OFF";
string nextStage = stage == "ON" ? "OFF" : "ON";
int nextTime = stage == "ON" ? tOff : tOn;
string nextDv = stage == "ON" ? d[3].Trim() : d[1].Trim();
GuiLenh(thietBi, nextStage == "ON" ? "B" : "T");
DateTime next = [Link](nextDv == "Giờ" ?
[Link](nextTime) :
nextDv == "Phút" ?
[Link](nextTime) :
[Link](nextTime));
[Link][i] = $"{thietBi} | ONOFF | {next:dd/MM/yyyy
- HH:mm:ss} | {tOn},{d[1]},{tOff},{d[3]} | Stage={nextStage}";
}
}
}
}
}

You might also like