Daftar Isi:
- Langkah 1: Opsamling Data Af untuk Pendaftaran Samt Vgt Af UID
- Langkah 2: Program Arduino
- Langkah 3: Node-RED, Lagring Af Data I Database
- Langkah 4: Desain basis data
- Langkah 5: Patolog
- Langkah 6: Dapat dipesan
- Langkah 7: Meja Pelanggan
- Langkah 8: Rangetable
- Langkah 9: Program C#
Video: EAL-Industri4.0-RFID Dataopsamling Sampai Database: 10 Langkah (dengan Gambar)
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:58
Dette projekt omhandler opsamling af vægtdata, mendaftar af identiteter vha. RFID, data tertinggal dalam database MySQL vha. node-RED, samt fremvisning og menangani data de opsamlede i et C# program i form af en Windows Form Application. Vi forestiller os følgende:
Vi har en produksilinje som produser leverpostej i 200g foliebakker. Semua pengaturan leverpostejer udstyres efter afkøling med et RFID tag i plasticlåget/labelen, som indeholder et unikt ID (UID = Unique Identifier, er en kode 32 bit, 8 karakterer heksadesimal) untuk identifikasi entydig af hverpost enkelt bakke. la færdigvægten af hver enkelt bakke leverpostej kan svinge (afhængig af råvarer, fordampning i ovn mm), og da kunderne hver har et specifikt krav færdigvægten, bruges tag UID hingga spesifikasi enposthver enknytte leverpostejer til én specifik kunde. Kunderne er supermarkedskæder:
1. Irma. Vægten på Irmas luksus leverpostej skal holde sig inden untuk +/- 5%, altså minimum 190g dan maksimum 210g.
2. Brugsen. Vægten på Brugsen leverpostej skal holde sig inden untuk +/- 10%, altså minimum 180g atau maksimum 220g.
3. Aldi. Vægten på Aldis discount leverpostej skal holde sig inden untuk +/- 15%, altså minimum 170g dan maksimum 230g.
Penyortir der er således følgende:
Range0: di luar jangkauan
Rentang1: minimum 190g/maksimum210g
Range2: minimum 180g/maksimum220g
Range3: minimum 170g/maksimum230g
Langkah 1: Opsamling Data Af untuk Pendaftaran Samt Vgt Af UID
Sampai opsamling data untuk vægt, pendaftaran samt untuk tag RFID dan penemuan Arduino MEGA2560 dengan pembaca/penulis RFID-RC522. Da vi ikke har nogen vægt, simulerer vi data untuk vægten med et potmeter tilsluttet en analog indgang på Arduinoen.
Følgende opstilling er anvendt:
1 stk potmeter 25k lineært. Yder-benene er tilsluttet hhv. GND dan +5V, midterbenet er tilsluttet AN0
RFID-RC522 er tilsluttet Arduino boardet SPI port på følgende måde:
SDA -> pin 53
SCK -> pin52
MOSI -> pin51
MISO->pin50
IRQ -> NC
GND -> GND
RST -> pin5
3.3V -> 3.3V
Data de opsamlede, untuk hhv. UID og vægten, kirim på den serielle port som en komma-separeret tekststreng videre til node-Red som står for den efterfølgende presentation på et dashboard og lagring i en database.
Langkah 2: Program Arduino
I Arduino memprogram inkluderes de ke biblioteker SPI.h dan MFRC522.h untuk di kunne bruge læseren RFID. Saya memulai dengan program initialiseres de anvendte variabel. Der laves en instans af MFRC522. I Setup blokken initialiseres den serielle forbindelse, port SPI dan MFRC522. Derifter memindai setelah tag RFID. Untuk ikke di sende det samme UID afsted flere gange efter hinanden, er der lavet en stump kode som tjekker untuk dette. Di bawah scannet dan tag UID, memuat arary nyUID med det netop læste UID. Hvis array nyUID er forskellig fra oldUID er der tale om et nyt UID som kan sendes på den serielle port. Hvis nyUID dan oldUID er ens, er der cerita om samme UID tag dan UID'et skal diabaikan. Hvis der er tale om et nyt UID, kirim UID'et på den serielle port sammen med en læst værdi fra den serielle port. Tetap analog værdi skaleres til området 150-250. Data terkirim beberapa en komma-separeret tekststreng. Som det sidste sættes oldUID = nyUID, sledes di koden klart sampai di læse dan nyt tag RFID.. Fungsi sidste saya memprogram dan menjalankan beberapa sammenligner 2 array. Pengembalian funktionen true hvis array'ne er ens, og false hvis array'ne er forskellige.
#termasuk
#include // Program ini memindai kartu RFID menggunakan papan pembaca/penulis RDIF-RC522. // UID dibaca, pin analog dibaca. Nilai analog 0-1023 diskalakan menjadi 150-250. // UID dan nilai analog dikirim sebagai teks yang dipisahkan koma pada port serial menggunakan 9600, N, 8, 1. // Perhatian telah diambil untuk hanya mengirim setiap UID satu kali berturut-turut, // UID baru harus hadir sebelum UID yang sama dapat dikirim lagi. // Fungsi ini diimplementasikan dalam kode dengan membandingkan array: oldUIDnyUID dalam fungsi array_cmp(oldUID, nyUID)
constexpr uint8_t RST_PIN = 5;
constexpr uint8_t SS_PIN = 53; int sensorPin = A0; int Nilai = 0; String StringValue = "0000"; byte oldUID[4] = {}; byte nyUID[4] = {};
MFRC522 mfrc522(SS_PIN, RST_PIN); // Buat instance MFRC522.
batalkan pengaturan()
{ Serial.begin(9600); // Memulai komunikasi serial SPI.begin(); // Memulai bus SPI mfrc522. PCD_Init(); // Mulai MFRC522 }
lingkaran kosong()
{ // Cari kartu baru if (! mfrc522. PICC_IsNewCardPresent()) { return; } // Pilih salah satu kartu jika (! mfrc522. PICC_ReadCardSerial()) { return; } //muat nyUID dengan tag UID untuk (byte i = 0; i < mfrc522.uid.size; i++) { nyUID = mfrc522.uid.uidByte; } // if oldUIDnyUID if (!array_cmp(oldUID, nyUID)) { // kirim tag UID pada port serial untuk (byte i = 0; i 1000) { Nilai = 1000; } Nilai = (Nilai / 10) + 150; // kirim nilai analog berskala Serial.print(Value); // kirim baris baru Serial.println(); //set oldUID = nyUID untuk (byte z = 0; z < 4; z++) oldUID[z] = nyUID[z]; } // tunggu 1 detik delay(1000); }
// membandingkan 2 array…
boolean array_cmp(byte a, byte b) { tes bool = true; //menguji setiap elemen agar sama. jika hanya satu yang tidak, kembalikan false for (byte n = 0; n < 4; n++) { if (a[n] != b[n]) test = false; // jika pada byte tidak sama, test = false } if (test == true) return true; lain kembali salah; }
Langkah 3: Node-RED, Lagring Af Data I Database
Følgende flow er lavet i node-RED:
COM4 er den serielle forbindelse hvor data modtages untuk boardet Arduino. Fungsi "Pisahkan dan Dapatkan nilai" og "Split and Get UID" splitter teksstrengen ved kommaet og returnere hhv vægten og UID. Vægten bruges til fremvisning på dashboardet i et linechart dan skala. UID fremvises saya dan tekstfelt. Funktionen test_sound advarer verbalt med sætningen "Di luar jangkauan", hvis vægten er di bawah 170g eller lebih dari 230g, dvs i range 0.
Pisahkan dan Dapatkan nilai:
var keluaran = msg.payload.split(', ');
temp = {muatan:(keluaran[1])}; kembali suhu;
Pisahkan dan Dapatkan UID:
var keluaran = msg.payload.split(", ");
suhu = {payload:output[0]}; kembali suhu;
tes_suara:
var nomor = parseInt(msg.payload);
if (angka >230 || angka<170) { newMsg = {payload:"Di luar jangkauan"}; kembali pesan baru; } else { pesan baru = {payload:""}; kembali pesan baru; }
Funktionen Split string "," indsætter dan timestamp, UID og vægten i en database patedb.patelog.
var keluaran = msg.payload.split(", "); //bagi msg.payload dengan koma ke dalam array
UIDTag = keluaran[0]; //bagian pertama ke posisi pertama [0] ValueTag = output[1]; //bagian kedua ke posisi kedua [1]
var m = {
topic: "INSERT INTO patedb.patelog (timestamp, UID, weight) VALUES('"+new Date().toISOString()+"', '"+ UIDTag +"', '"+ValueTag+"');" }; kembali m;
patelog er en database MySQL untuk beberapa parameter sat op med følgende:
Tuan rumah: localhost
Pelabuhan: 3306
Pengguna: root
Basis data: patedb
Langkah 4: Desain basis data
Database patedb indeholder 4 tabeller
patelog er dataopsamlingstabellen, tilskrives data dari node-RED dan program C#
ordertable er en tabel beberapa data pemegang saham om de genemførte order, data tilskrives dari program C#
meja pelanggan er et kunderregister
rangetable er en tabel som indeholder grænseværdierne untuk de i C# program benyttede range.
Langkah 5: Patolog
Tabellen patelog pemegang folgende 6 kolonner:
pateID (int) er primary key dan inkrementeres automatisk.
Stempel waktu, UID & vægt er af typen varchar (med forskellig max længde)
rangeNr er af typen tinyint (beregnes og tilføjes af program C#)
orderID er af typen int (orderID tilføjes af C# program)
Node-RED tilføjer ikke værdier til kolonnerne rangeNr og orderID. rangeNr og orderID tillader NULL værdier, det bruges i C# program hingga di detektere de rækker som skal tilskrives værdier untuk rangeNr og orderID
Langkah 6: Dapat dipesan
indeholder yang dapat dipesan 5 kolonner:
orderID (int) er det aktuelle ordrenummer
orderQuant (sedang) er ordens pålydende antal
quantProduced (mediumint) er antal der rent faktisk er producer på ordren. (Tlles af program C#)
komentar (tinytext) er en akhirnya kommentar til ordren.
customerID (int) er det aktuelle kundenummer på ordren.
Langkah 7: Meja Pelanggan
customertable indeholder 6 kolonner:
customerID (int) er primary key dan auto inc.
nama, alamat, telepon, email (varchar) med forskellig max længde
rentangNr (int)
Langkah 8: Rangetable
rangetable indeholder 3 kolonner:
rangeNr (int) er kunci utama dan auto inc.
rentangMin (int)
rentangMaks (int)
Langkah 9: Program C#
Når der produceres en ordre leverpostej, er proceduren følgende:
(Kundenummer, ordrenummer, ordreantal og en eventuel kommentar indtastes i C# program (saya praksis overføres det digitalt fra virksomhedens ordresystem. Produktionen start nu ved tryk på 'start'- knappen. Når en leverpostigproduceer fæ på et transportbånd) Samhørende værdier af UID dan aktuelle vægt kirim serielt til node-RED, som viser de opsamlede data på dashboard 'et. Samtidig skrives timestamp, UID dan vægt i en ny pated række daftar tidspunkt ikke tilskrives værdier til rangeNr og orderID vil de have værdien NULL.
Med et timerinterval undersøger C# program dipatenkanb.patelogtabellen untuk nye tilkomne rækker med NULL værdier i rangeNr kolonnen. Når der er detekteret en række med NULL værdi, beregnes rangeNr og det tilføjes sammen med det aktuelle orderID. Når en ordre er producer, afsluttes ordren ved tryk på”stop”- knappen. Når ordren afsluttes, tilføjes en række til patedb.ordertable med de aktuelle ordredata. Nr en ordre er afsluttet, kan kan de opsamlede data i patelog tablelen fremvises ved at trykke på de forskellige knapper i gruppen Update DataGridview. dapat dipesan kan også vises, og der kan sges ordredata på individualeller UID'er eller kundedata på individualelle order.
menggunakan Sistem;menggunakan System. Collections. Generic; menggunakan System. ComponentModel; menggunakan System. Data; menggunakan System. Drawing; menggunakan System. Linq; menggunakan System. Text; menggunakan System. Threading. Tasks; menggunakan System. Windows. Forms; menggunakan MySql. Data. MySqlClient;
namespace show_data_from_database
{ public partial class Form1: Form { MySqlConnection connection = new MySqlConnection("datasource=localhost; username=root; password=''"); int NomorBaris = 0; // Variabel untuk menyimpan nilai pateID int RangeNumber = 0; //Variabel untuk menyimpan rangenumber int weight =0; // Variabel untuk menyimpan bobot int OrderNr = 0; // Variabel untuk menyimpan OrderNR int QuantProduced = 0; //Variabel untuk menyimpan kuantitas yang dihasilkan int NumberOfRows = 0; //jumlah baris dengan nulls.. bool ProdRunning = false; //Variabel yang menunjukkan apakah tombol start & stop telah diaktifkan int limit = new int[6];// initialize array int CustomerID; // Variabel untuk menyimpan customerID public Form1() { InitializeComponent(); beban_tabel(); // panggil load_table }
batalkan beban_tabel()
{ Perintah MySqlCommand = new MySqlCommand("SELECT * FROM patedb.patelog ORDER BY timestamp DESC;", koneksi); coba { Adaptor MySqlDataAdapter = new MySqlDataAdapter(); adapter. SelectCommand = perintah; DataTable dbdataset = DataTable baru(); adaptor. Isi(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = kumpulan data; dataGridView1. DataSource = bsumber; SetRowOrder(); adaptor. Pembaruan(dbdataset); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } }
kekosongan pribadi SetRowOrder()
{ dataGridView1. Columns["pateID"]. DisplayIndex = 0; // Her kan rækkefølgen af kolonner ndres dataGridView1. Columns["timestamp"]. DisplayIndex = 1; // Her kan rækkefølgen af kolonner ndres dataGridView1. Columns["UID"]. DisplayIndex = 2; // Kan rækkefølgen af kolonner ændres dataGridView1. Columns["weight"]. DisplayIndex = 3; // Kan rækkefølgen af kolonner ndres dataGridView1. Columns["rangeNr"]. DisplayIndex = 4; // Kan rækkefølgen af kolonner ændres dataGridView1. Columns["orderID"]. DisplayIndex = 5; // Her kan rækkefølgen af kolonner ndres }
private void GetData_Click(pengirim objek, EventArgs e) // Membaca tabel database dan pesanan berdasarkan Timestamp
{ memuat_tabel(); }
private void btnRefreshUID_Click(pengirim objek, EventArgs e) //
{ string timeStr = "PILIH * DARI patedb.patelog ORDER OLEH UID;"; Perintah MySqlCommand = new MySqlCommand(timeStr, koneksi); coba { Adaptor MySqlDataAdapter = new MySqlDataAdapter(); adapter. SelectCommand = perintah; DataTable dbdataset = new DataTable(); adaptor. Isi(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = kumpulan data; dataGridView1. DataSource = bsumber; SetRowOrder(); adaptor. Pembaruan(dbdataset); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } }
private void btnRefreshValue_Click(pengirim objek, EventArgs e)
{ string weightSort = "PILIH * FROM patedb.patelog ORDER BY CAST(berat SEBAGAI INTEGER YANG DITANDATANGANI);"; Perintah MySqlCommand = new MySqlCommand(weightSort, koneksi); coba { Adaptor MySqlDataAdapter = new MySqlDataAdapter(); adapter. SelectCommand = perintah; DataTable dbdataset = new DataTable(); adaptor. Isi(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = kumpulan data; dataGridView1. DataSource = bsumber; SetRowOrder(); adaptor. Pembaruan(dbdataset); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } }
private void ChkNullBtn_Click(pengirim objek, EventArgs e)
{ if (ProdRunning) { CheckTableForNull(); beban_tabel(); } }
kekosongan pribadi CheckTableForNull()
{ //Check/set timerinterval minimum 100 ms int i; int. TryParse(textTimer1. Text, keluar i); if (i <100) { timer1. Stop(); saya = 100; timer1. Interval = i; MessageBox. Show("Nilai minimum i 100mS"); timer1. Mulai(); } else { timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString(); //Periksa apakah ada baris dengan null yang tersedia di tabel, mengembalikan jumlah baris dalam variabel:NumberOfRows string weightStr = ""; string chkNull = "PILIH JUMLAH(*) FROM patedb.patelog WHERE rangeNR IS NULL ORDER BY pateID LIMIT 1;"; Perintah MySqlCommand = new MySqlCommand(chkNull, koneksi); coba { koneksi. Buka(); NumberOfRows = Convert. ToInt32(command. ExecuteScalar()); koneksi. Tutup(); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } akhirnya { if (NumberOfRows != 0) { try { //Memilih nomor pateID terendah di mana rangeNr is NULL string readID = "SELECT pateID FROM patedb.patelog WHERE rangeNR IS NULL ORDER BY pateID ASC LIMIT 1;"; MySqlCommand cmdID = new MySqlCommand(readID, koneksi); { koneksi. Buka(); RowNumber = (int)cmdID. ExecuteScalar(); //bilangan bulat!! koneksi. Tutup(); } listPateID. Text = RowNumber. ToString(); // membaca nomor PateID yang dipilih // Memilih bobot dari nomor baris yang dipilih baris string = RowNumber. ToString(); string readweight = "PILIH bobot FROM patedb.patelog WHERE pateID=" + baris; MySqlCommand cmdweight = new MySqlCommand(berat baca, koneksi); { koneksi. Buka(); weightStr = (string)cmdweight. ExecuteScalar(); //Rangkaian !! koneksi. Tutup(); } berat = int. Parse(weightStr); // konversi ke int txtWeight. Text = weight. ToString(); // cetak int RangeNumber = 0; if (berat>= batas[0] && berat = batas[2] && berat = batas[4] && berat <= batas[5]) { RangeNumber = 3; } } txtRange. Text = RangeNumber. ToString(); Perbarui Log(); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } QuantProduced = QuantProduced + 1; } } } private void btnStart_Click(pengirim objek, EventArgs e) { if (ProdRunning == false) { int valtest; coba { CustomerID = int. Parse(txtCustomerNr. Text); //read customerID } catch { MessageBox. Show("Masukkan data produksi dan tekan tombol 'mulai'."); }
string test = "SELECT COUNT(*) FROM patedb.customertable WHERE customerID ="+CustomerID;
MySqlCommand cmdtestcustomer = new MySqlCommand(tes, koneksi); { koneksi. Buka(); valtest = Convert. ToInt32(cmdtestcustomer. ExecuteScalar()); // mengembalikan 0 jika pelanggan tidak ada koneksi. Tutup(); } if (valtest==1) // jika pelanggan ada di database - mulai produksi { try { OrderNr = int. Parse(txtOrderNumber. Text); ProdRunning = benar; timer1. Mulai(); textTimer1. Text = timer1. Interval. ToString(); Batas Baca(); } catch (Exception ex) { MessageBox. Show("Masukkan data produksi dan tekan tombol 'mulai'."); } } else MessageBox. Show("Pelanggan tidak ada di database, coba lagi"); } //Batas Baca(); }
kekosongan pribadi ReadLimits()
{ // Membaca batas dari rangetable, range 1 sampai 3 int counter = 0; for (int rangeNr = 1; rangeNr < 4; rangeNr++) { string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr=" + rangeNr; MySqlCommand cmdmin = new MySqlCommand(admin ulang, koneksi); { koneksi. Buka(); batas[penghitung] = (int)cmdmin. ExecuteScalar(); penghitung = penghitung + 1; koneksi. Tutup(); } // MessageBox. Show(counter. ToString()); string readmax = "PILIH rangeMax FROM patedb.rangetable WHERE rangeNr=" + rangeNr; MySqlCommand cmdmax = new MySqlCommand(readmax, koneksi); { koneksi. Buka(); batas[penghitung] = (int)cmdmax. ExecuteScalar(); penghitung = penghitung + 1; koneksi. Tutup(); } } // akhir untuk loop }
kekosongan pribadi UpdateLog()
{ // UPDATE rangeNR & orderID string Range = RangeNumber. ToString(); string Urutan = OrderNr. ToString(); string update = "PERBARUI patedb.patelog SET rangeNr= "+Range+', ' + "orderID= "+OrderNr+" WHERE pateID="+RowNumber; MySqlCommand updatecmd = new MySqlCommand(perbarui, koneksi); coba { koneksi. Buka(); updatecmd. ExecuteNonQuery(); koneksi. Tutup(); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } }
private void btnStop_Click(pengirim objek, EventArgs e)
{ if (ProdRunning == true) { timer1. Stop(); ProdRunning = salah; UpdateOrderTable(); } else { MessageBox. Show("Belum ada produksi yang dimulai. Masukkan data dan tekan tombol 'mulai'"); } }
kekosongan pribadi UpdateOrderTable()
{ string insert = "INSERT INTO patedb.ordertable (orderID, orderQuant, quantProduced, comment, customerID) VALUES ('" + this.txtOrderNumber. Text + "', '" + this.txtOrderQuant. Text + "', '"+ QuantProduced. ToString()+"', '"+this.txtComment. Text+"', '"+this.txtCustomerNr. Text+"');"; MySqlCommand insertcmd = new MySqlCommand(masukkan, koneksi); coba { koneksi. Buka(); insertcmd. ExecuteNonQuery(); koneksi. Tutup(); Jumlah yang Dihasilkan = 0; } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } }
private void timer1_Tick(pengirim objek, EventArgs e)
{ CheckTableForNull(); beban_tabel(); }
private void btnShowOrderTable_Click(pengirim objek, EventArgs e)
{ if (ProdRunning == false) { Perintah MySqlCommand = new MySqlCommand("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", koneksi); coba { Adaptor MySqlDataAdapter = new MySqlDataAdapter(); adapter. SelectCommand = perintah; DataTable dbdataset = new DataTable(); adaptor. Isi(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = kumpulan data; dataGridView1. DataSource = bsumber; adaptor. Pembaruan(dbdataset); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } } else { MessageBox. Show("Tekan berhenti untuk wiev orderTable"); } }
private void btnShowOrderDetails_Click(pengirim objek, EventArgs e)
{ if (ProdRunning == false) { string test = ("SELECT patedb.ordertable.orderID, orderQuant, quantProduced, comment, customerID FROM patedb.ordertable INNER JOIN patedb.patelog ON patedb.patelog.orderID= patedb.ordertable.orderID WHERE patedb.patelog. UID = '" + txtShowOrderDetails. Text + "'"); Perintah MySqlCommand = new MySqlCommand(tes, koneksi); coba { koneksi. Buka(); Adaptor MySqlDataAdapter = baru MySqlDataAdapter(); adapter. SelectCommand = perintah; DataTable dbdataset = new DataTable(); adaptor. Isi(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = kumpulan data; dataGridView1. DataSource = bsumber; adaptor. Pembaruan(dbdataset); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } koneksi. Tutup(); } else { MessageBox. Show("Tekan berhenti untuk melihat detail pesanan"); } }
private void btnShowCustomerDetails_Click(pengirim objek, EventArgs e)
{ if (ProdRunning == false) { string test = ("SELECT patedb.customertable.customerID, name, address, phone, email, rangeNr FROM patedb.customertable INNER JOIN patedb.ordertable ON patedb.ordertable.customerID= patedb.customertable. customerID WHERE patedb.ordertable.orderID = '" + txtShowCustomerDetails. Text + "'"); Perintah MySqlCommand = new MySqlCommand(tes, koneksi); coba { Adaptor MySqlDataAdapter = new MySqlDataAdapter(); adapter. SelectCommand = perintah; DataTable dbdataset = new DataTable(); adaptor. Isi(dbdataset); BindingSource bsource = new BindingSource(); bsource. DataSource = kumpulan data; dataGridView1. DataSource = bsumber; adaptor. Pembaruan(dbdataset); } catch (Pengecualian ex) { MessageBox. Show(ex. Message); } } else { MessageBox. Show("Tekan berhenti untuk melihat detail pelanggan"); } } }
}
Direkomendasikan:
E-dice - Arduino Die/dadu 1 sampai 6 Dadu + D4, D5, D8, D10, D12, D20, D24 dan D30: 6 Langkah (dengan Gambar)
E-dadu - Arduino Die/dadu 1 sampai 6 Dadu + D4, D5, D8, D10, D12, D20, D24 dan D30: Ini adalah proyek arduino sederhana untuk membuat dadu elektronik. Dimungkinkan untuk memilih 1 hingga 6 dadu atau 1 dari 8 dadu khusus. Pilihan dibuat hanya dengan memutar encoder putar. Ini adalah fitur-fiturnya: 1 dadu: menunjukkan titik-titik besar 2-6 dadu: menampilkan titik-titik
UCL-IIOT - Sistem Alarm Dengan Database dan Node-red: 7 Langkah
UCL-IIOT - Sistem Alarm Dengan Database dan Node-red: Tujuan dari build ini adalah untuk mengajarkan tentang menghubungkan Arduino dengan Node-red dan database, sehingga Anda dapat mencatat data dan juga mengumpulkannya untuk digunakan nanti. Untuk build ini saya menggunakan sistem alarm arduino sederhana yang mengeluarkan 5 nomor data, masing-masing dipisahkan dengan
Membuat Database Dengan XAMPP: 4 Langkah
Membuat Database Dengan XAMPP: XAMPP adalah distribusi Apache gratis yang berisi MariaDB, PHP, dan Perl. XAMPP menyediakan antarmuka grafis untuk SQL, memungkinkan Anda untuk menyimpan informasi dalam database yang akan kita buat hari ini. Ketika saya pertama kali mulai menggunakan database untuk proyek
EAL-Industri 4.0-Smart Rocket: 8 Langkah (dengan Gambar)
EAL-Industry 4.0-Smart Rocket: Ini adalah proyek sekolah, dibuat di Erhversakademiet Lillebælt di Denmark.Proyek ini dibuat di kelas yang disebut "Industri 4.0".Tugasnya adalah mengimplementasikan sistem otomatis dari industri 4.0 prinsip. Sistem harus mampu
Cara Menghitung Dari 0 Sampai 99 Menggunakan Mikrokontroler 8051 Dengan Tampilan 7 Segmen: 5 Langkah (Dengan Gambar)
Cara Menghitung Dari 0 sampai 99 Menggunakan Mikrokontroler 8051 Dengan Tampilan 7 Segmen: Halo semuanya, Dalam tutorial ini kami akan memberi tahu Anda tentang cara menghitung dari 0 hingga 99 menggunakan dua tampilan 7 segmen