Innholdsfortegnelse:
- Trinn 1: Opsamling Af Data for Vægt Samt Registrering Af UID
- Trinn 2: Arduino-program
- Trinn 3: Node-RED, Lagring Af Data I Database
- Trinn 4: Database-design
- Trinn 5: Patelog
- Trinn 6: Ordertable
- Trinn 7: Tilpassbar
- Trinn 8: Rangetable
- Trinn 9: C# -program
Video: EAL-Industri4.0-RFID Dataopsamling Til Database: 10 Steps (with Pictures)
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:25
Dette prosjektet omhandler opsamling av vektdata, registrering av identiteter vha. RFID, lagring av data i en MySQL database vha. node-RED, samt fremvisning og behandling av de opsamlede dataene i et C# -program i form av en Windows Form Application. Vi forestiller oss følgende:
Vi har en produktionslinje som produsentleverpost i 200g foliebakker. Alle færdigbagte leverpostejer utstyres etter avkøling med et RFID -tag i plastlåget/etiketter, som inneholder et unikt ID (UID = Unique Identifier, er en 32 bits kode, 8 hexadecimale karakterer) for entydig identifikasjon av hver enkelt bakke leverpostej. Da færdigvægten av hver enkelt bakke leverpostej kan svinge (ansvarig av råvarer, fordampning i ovn mm), og da kunderne hver har og spesifikt krav færdigvægten, bruker UID -tagget til at knute hver enkelt leverpostej til en spesifikk lagerlokasjon på lageret, hvor det kan lagres leverpostejer til én spesifikke kunde. Kunderne er supermarkedskæder:
1. Irma. Vægten på Irmas luksus leverpostej skal holde sig inne for +/- 5%, altså minimum 190g og maksimum 210g.
2. Brugsen. Vægten på Brugsens leverpostej skal holde sig inne for +/- 10%, altså minimum 180g og maksimum 220g.
3. Aldi. Vægten på Aldis rabattpakke skal holde seg inne for +/- 15%, altså minimum 170g og maksimum 230g.
Der er således følgende sorteringer:
Område 0: utenfor rekkevidde
Område 1: minimum 190g/maksimum 210g
Rekkevidde2: minimum 180g/maksimum220g
Rekkevidde3: minimum 170g/maksimum 230g
Trinn 1: Opsamling Af Data for Vægt Samt Registrering Af UID
Til innsamling av data for vekt, samt registrering av RFID-koder er anvendt på Arduino MEGA2560 med en RFID-RC522 leser/skribent. Da vi ikke har noen vekt, simulerer vi data for vægten med et potmeter tilsluttet en analog inngang på Arduinoen.
Følgende innstilling er anvendt:
1 stk potmeter 25k lineært. Yder-benene er tilsluttet hhv. GND og +5V, midterbenet er tilsluttet AN0
RFID-RC522 er tilsluttet Arduino-bord SPI-port på følgende måte:
SDA -> pin 53
SCK -> pin52
MOSI -> pin51
MISO-> pin50
IRQ -> NC
GND -> GND
RST -> pin5
3,3V -> 3,3V
De opsamlede data, for hhv. UID og vægten, sender på den serielle porten som en kommaseparert tekststreng videre til node-Red som står for den etterfølgende presentasjonen på et dashbord og lagring i en database.
Trinn 2: Arduino-program
I Arduino programmet inkluderer de to biblioteker SPI.h og MFRC522.h for at kunne bruke RFID læseren. Jeg starter av programmet initialiseres de anvendte variabelen. Der laves en instans av MFRC522. I Setup blokken initialiseres den serielle forbindelse, SPI porten og MFRC522. Derefter scannes etter RFID -koder. For ikke at sende det samme UID flere ganger etter hverandre, er der laget en stump kode som tjekker for dette. Når der er scannet et UID tag, loades arary nyUID med det nettopp læste UID. Hvis array nyUID er forskellig fra oldUID er der tale om et nytt UID som kan sendes på den serielle porten. Hvis nyUID og oldUID er ens, er der tale om samme UID -tag og UID'et skal ignoreres. Hvis der er tale om et nytt UID, sender UID'et på den serielle porten sammen med en verdi fra den serielle porten. Den analoge verdien skaleres til området 150-250. Data sender som en komma-separeret tekststreng. Som det siste ble satt oldUID = nyUID, således at koden klart kan lese og nyt RFID -tag.. Den siste funksjonen i programmet er den funksjonen som sammenligner 2 matriser. Funksjonene returnerer true hvis array'ne er ens, og false hvis array'ne er forskjellige.
#inkludere
#include // Dette programmet skanner RFID-kort ved hjelp av RDIF-RC522 leser/skriverkort. // UID leses, en analog pin leses. Analog verdi 0-1023 skaleres til 150-250. // UID og analog verdi sendes som kommaseparert tekst på seriell port ved bruk av 9600, N, 8, 1. // Det er tatt vare på å bare sende hver UID én gang på rad, // en ny UID må være tilstede før samme UID kan sendes på nytt. // Denne funksjonen implementeres i koden ved å sammenligne matriser: oldUID nyUID i funksjon array_cmp (oldUID , nyUID )
constexpr uint8_t RST_PIN = 5;
constexpr uint8_t SS_PIN = 53; int sensorPin = A0; int Verdi = 0; String StringValue = "0000"; byte oldUID [4] = {}; byte nyUID [4] = {};
MFRC522 mfrc522 (SS_PIN, RST_PIN); // Lag MFRC522 -forekomst.
ugyldig oppsett ()
{Serial.begin (9600); // Start en seriell kommunikasjon SPI.begin (); // Start SPI -buss mfrc522. PCD_Init (); // Start MFRC522}
hulrom ()
{// Se etter nye kort hvis (! Mfrc522. PICC_IsNewCardPresent ()) {return; } // Velg ett av kortene hvis (! Mfrc522. PICC_ReadCardSerial ()) {return; } // last nyUID med UID -tag for (byte i = 0; i <mfrc522.uid.size; i ++) {nyUID = mfrc522.uid.uidByte ; } // if oldUID nyUID if (! array_cmp (oldUID, nyUID)) {// send UID -tag på seriell port for (byte i = 0; i 1000) {Value = 1000; } Verdi = (Verdi / 10) + 150; // send skalert analog verdi Serial.print (verdi); // send ny linje Serial.println (); // sett oldUID = nyUID for (byte z = 0; z <4; z ++) oldUID [z] = nyUID [z]; } // vent 1 sek forsinkelse (1000); }
// sammenligne 2 matriser …
boolsk array_cmp (byte a , byte b ) {bool test = true; // test hvert element for å være det samme. hvis bare en ikke er det, returner du false for (byte n = 0; n <4; n ++) {if (a [n]! = b [n]) test = false; // hvis på byte ikke er lik, test = false} if (test == true) return true; ellers returner usann; }
Trinn 3: Node-RED, Lagring Af Data I Database
Følgende flyt er laget i node-RED:
COM4 er den serielle forbindelsen hvor data mottas fra Arduino bord. Funksjoner "Split and Get value" og "Split and Get UID" splitter tekststrengen ved kommaet og returnere hhv vægten og UID. Vægten bruker til fremvisning på dashboardet i et linechart og en skala. UID fremvises i et tekstfelt. Funksjoner test_sound advarer verbalt med sætningen "Out of range", hvis vægten er under 170g eller over 230g, dvs i område 0.
Del og få verdi:
var output = msg.payload.split (',');
temp = {nyttelast: (utgang [1])}; retur temp;
Del og få UID:
var output = msg.payload.split (",");
temp = {nyttelast: utgang [0]}; retur temp;
test_lyd:
var number = parseInt (msg.payload);
if (tall> 230 || nummer <170) {newMsg = {nyttelast: "Utenfor område"}; returner newMsg; } annet {newMsg = {nyttelast: ""}; returner newMsg; }
Funksjoner Split string "," indsætter et tidsstempel, UID og vægten i en database patedb.patelog.
var output = msg.payload.split (","); // del msg. payload med komma i array
UIDTag = output [0]; // første del til første posisjon [0] ValueTag = output [1]; // andre del til andre posisjon [1]
var m = {
emne: "INSERT INTO patedb.patelog (tidsstempel, UID, vekt) VERDIER ('"+ny dato (). toISOString ()+"', '"+UIDTag+"', '"+ValueTag+"');" }; retur m;
patelog er en MySQL database forbindelse som er satt med følgende parametre:
Vert: lokal vert
Havn: 3306
Bruker: root
Database: patedb
Trinn 4: Database-design
Databasen patedb inneholder 4 tabeller
patelog er dataopsamlingstabellen, tilskrives data af node-RED og C# program
ordertable er en tabell som inneholder data om de genemførte ordrer, tilskrives data av C# programmet
kundetilpasset er og kundeegister
rangetable er en tabell som inneholder grønneværdierne for de i C# programmet benyttede områder.
Trinn 5: Patelog
Tabellen inneholder følgende 6 kolonner:
pateID (int) er primærnøkkel og inkrementeres automatisk.
Tidsstempel, UID og vekt er av typen varchar (med forskellig max lengde)
rangeNr er av typen tinyint (beregnes og tilføjes av C# program)
orderID er av typen int (orderID tilføjes af C# program)
Node-RØD tilføyer ikke verdier til kolonnerne rangeNr og orderID. rangeNr og orderID tillader NULL verdier, det brukes i C# program til at detektere de rækker som skal tilskrives verdier for rangeNr og orderID
Trinn 6: Ordertable
ordertable inneholder 5 kolonner:
orderID (int) er det aktuelle ordrenummer
orderQuant (mediumint) er ordens pålydende antal
quantProduced (mediumint) er antall der rent faktisk er produceret på ordren. (Tælles af C# program)
comment (tinytext) er en eventuel kommentar til ordren.
customerID (int) er det aktuelle kundenummer på ordren.
Trinn 7: Tilpassbar
tilpasset inneholder 6 kolonner:
customerID (int) er primærnøkkel og auto inc.
navn, adresse, telefon, e -post (varchar) med forskellig max lengde
rangeNr (int)
Trinn 8: Rangetable
rangetable inneholder 3 kolonner:
rangeNr (int) er primærnøkkel og auto inc.
rangeMin (int)
rangeMax (int)
Trinn 9: C# -program
Når der produses en ordre leverpostej, er prosedyrer følgende:
Kundenummer, ordrenummer, ordreantal og en eventuel kommentar indtastes i C# program (i praksis overføres det digitalt fra virksomheten ordresystem. Produksjonen starter nå ved trykk på 'start'- knappen. Når en leverpostej er færdigproduceret og låget er montert, vejes den av Arduinoen (på et transportbånd) Samhørende verdier av UID og den aktuelle vekten sender serielt til node-RED, som viser de opsamlede dataene på dashbordet 'og samtidig skrives tidsstempel, UID og vekt i en ny rekke i patedb.patelog tabellen. tidspunkt ikke tilskrives verdier til rangeNr og orderID vil ha verdier NULL.
Med et timerinterval undersøger C# program patedb.patelogtabellen for nye tilkomne rækker med NULL verdier i rangeNr kolonnen. Når der er detektering en rekke med NULL verdi, beregnes rangeNr og det tilføjes sammen med aktuelle orderID. Når en ordre er produceret, avsluttes ordren ved trykk på”stop”- knappen. Når ordren avsluttes, tilføjes en rekke til patedb.ordertable med de aktuelle ordredata. Når en ordre er avsluttet, kan jeg samle data i patellog tabellen fremvises ved å trykke på de forskjellige knapper i gruppen Oppdater DataGridview. ordertable kan også vises, og der kan søges ordredata på individueller UID'er eller kundedata på individuelle ordrer.
bruker System; bruker System. Collections. Generic; bruker System. ComponentModel; bruker System. Data; bruker System. Drawing; bruker System. Linq; bruker System. Text; bruk av System. Threading. Tasks; bruker System. Windows. Forms; bruker MySql. Data. MySqlClient;
navneområde show_data_from_database
{offentlig delklasse Form1: Skjema {MySqlConnection tilkobling = ny MySqlConnection ("datasource = localhost; brukernavn = root; passord = ''"); int RowNumber = 0; // Variabel for lagring av pateID -verdi int RangeNumber = 0; // Variabel for lagring av rangenumber int vekt = 0; // Variabel for lagring av vekten int OrderNr = 0; // Variabel for lagring av OrderNR int QuantProduced = 0; // Variabel for lagring av produsert mengde int NumberOfRows = 0; // antall rader med null.. bool ProdRunning = false; // Variabel som indikerer om start- og stoppknappene har blitt aktivert int limits = new int [6]; // initialize array int CustomerID; // Variabel for lagring av kunde -ID offentlig skjema1 () {InitializeComponent (); load_table (); // ring load_table}
ugyldig load_table ()
{MySqlCommand -kommando = ny MySqlCommand ("SELECT * FRA patedb.patelog ORDER BY tidsstempel DESC;", tilkobling); prøv {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = kommando; DataTable dbdataset = nytt DataTable (); adapter. Fyll (dbdataset); BindingSource bsource = ny BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Oppdater (dbdataset); } fangst (unntak ex) {MessageBox. Show (eks. melding); }}
private void SetRowOrder ()
{dataGridView1. Columns ["pateID"]. DisplayIndex = 0; // Her kan rekkefølgen av kolonner endres dataGridView1. Columns ["tidsstempel"]. DisplayIndex = 1; // Her kan rekkefølgen av kolonner endres dataGridView1. Columns ["UID"]. DisplayIndex = 2; // Her kan rekkefølgen av kolonner endres dataGridView1. Columns ["weight"]. DisplayIndex = 3; // Her kan rekkefølgen av kolonner endres dataGridView1. Columns ["rangeNr"]. DisplayIndex = 4; // Her kan rekkefølgen av kolonner endres dataGridView1. Columns ["orderID"]. DisplayIndex = 5; // Her kan rekkefølgen av kolonner endres}
private void GetData_Click (objektavsender, EventArgs e) // Leser databasetabell og bestillinger etter tidsstempel
{load_table (); }
private void btnRefreshUID_Click (objektavsender, EventArgs e) //
{string timeStr = "SELECT * FROM patedb.patelog ORDER BY UID;"; MySqlCommand -kommando = ny MySqlCommand (timeStr, tilkobling); prøv {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = kommando; DataTable dbdataset = nytt DataTable (); adapter. Fyll (dbdataset); BindingSource bsource = ny BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Oppdater (dbdataset); } fangst (unntak ex) {MessageBox. Show (eks. melding); }}
private void btnRefreshValue_Click (objektavsender, EventArgs e)
{string weightSort = "SELECT * FRA patedb.patelog ORDER BY CAST (weight AS SIGNED INTEGER);"; MySqlCommand -kommando = ny MySqlCommand (weightSort, tilkobling); prøv {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = kommando; DataTable dbdataset = nytt DataTable (); adapter. Fyll (dbdataset); BindingSource bsource = ny BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Oppdater (dbdataset); } fangst (unntak ex) {MessageBox. Show (eks. melding); }}
private void ChkNullBtn_Click (objektavsender, EventArgs e)
{if (ProdRunning) {CheckTableForNull (); load_table (); }}
private void CheckTableForNull ()
{// Sjekk/sett tidsintervallet minimum 100 ms int i; int. TryParse (textTimer1. Text, ut i); hvis (i <100) {timer1. Stop (); i = 100; timer1. Interval = i; MessageBox. Show ("Minimumsverdi i 100mS"); timer1. Start (); } annet {timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString (); // Kontroller om noen rader med null er tilgjengelig i tabellen, returnerer antall rader i variabelen: NumberOfRows streng weightStr = ""; string chkNull = "VELG TELLE (*) FRA patedb.patelog HVOR rangeNR ER NULL ORDER AV pateID LIMIT 1;"; MySqlCommand -kommando = ny MySqlCommand (chkNull, tilkobling); prøv {connection. Open (); NumberOfRows = Convert. ToInt32 (command. ExecuteScalar ()); tilkobling. Lukk (); } fangst (unntak ex) {MessageBox. Show (eks. melding); } endelig {if (NumberOfRows! = 0) {try {// Velger laveste pateID -nummer der rangeNr er NULL string readID = "SELECT pateID FROM patedb.patelog WHERE rangeNR IS NULL ORDER BY pateID ASC LIMIT 1;"; MySqlCommand cmdID = nytt MySqlCommand (readID, tilkobling); {connection. Open (); RowNumber = (int) cmdID. ExecuteScalar (); // heltall !! tilkobling. Lukk (); } listPateID. Text = RowNumber. ToString (); // lese opp valgt PateID -nummer // Velger vekt fra valgt radnummer for radnummer = RowNumber. ToString (); string readweight = "VELG vekt FRA patedb.patelog WHERE pateID =" + rad; MySqlCommand cmdweight = ny MySqlCommand (lesevekt, tilkobling); {connection. Open (); weightStr = (streng) cmdweight. ExecuteScalar (); // streng !! tilkobling. Lukk (); } vekt = int. Parse (weightStr); // konvertere til int txtWeight. Text = weight. ToString (); // print int RangeNumber = 0; hvis (vekt> = grenser [0] && vekt = grenser [2] && vekt = grenser [4] && vekt <= grenser [5]) {RangeNumber = 3; }} txtRange. Text = RangeNumber. ToString (); UpdateLog (); } fangst (unntak ex) {MessageBox. Show (eks. melding); } QuantProduced = QuantProduced + 1; }}} private void btnStart_Click (objektavsender, EventArgs e) {if (ProdRunning == false) {int valtest; prøv {CustomerID = int. Parse (txtCustomerNr. Text); // read customerID} catch {MessageBox. Show ("Skriv inn produksjonsdata og trykk" start "-knappen."); }
string test = "SELECT COUNT (*) FRA patedb.customertable WHERE customerID ="+CustomerID;
MySqlCommand cmdtestcustomer = ny MySqlCommand (test, tilkobling); {connection. Open (); valtest = Convert. ToInt32 (cmdtestcustomer. ExecuteScalar ()); // returnerer 0 hvis kunden ikke har forbindelse. Close (); } if (valtest == 1) // hvis kunden finnes i databasen - start produksjonen {prøv {OrderNr = int. Parse (txtOrderNumber. Text); ProdRunning = true; timer1. Start (); textTimer1. Text = timer1. Interval. ToString (); ReadLimits (); } catch (Unntak ex) {MessageBox. Show ("Skriv inn produksjonsdata og trykk på" start "-knappen."); }} else MessageBox. Show ("Kunden er ikke i databasen, prøv igjen"); } // ReadLimits (); }
private void ReadLimits ()
{// Leser grenser fra rangetable, område 1 til 3 int counter = 0; for (int rangeNr = 1; rangeNr <4; rangeNr ++) {string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr ="+rangeNr; MySqlCommand cmdmin = nytt MySqlCommand (readmin, tilkobling); {connection. Open (); grenser [teller] = (int) cmdmin. ExecuteScalar (); teller = teller + 1; tilkobling. Lukk (); } // MessageBox. Show (counter. ToString ()); string readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmax = ny MySqlCommand (readmax, tilkobling); {connection. Open (); grenser [teller] = (int) cmdmax. ExecuteScalar (); teller = teller + 1; tilkobling. Lukk (); }} // end for loop}
private void UpdateLog ()
{// UPDATE rangeNR & orderID string Range = RangeNumber. ToString (); string Order = OrderNr. ToString (); string update = "UPDATE patedb.patelog SET rangeNr ="+Range+','+"orderID ="+OrderNr+"WHERE pateID ="+RowNumber; MySqlCommand updatecmd = ny MySqlCommand (oppdatering, tilkobling); prøv {connection. Open (); updatecmd. ExecuteNonQuery (); tilkobling. Lukk (); } fangst (unntak ex) {MessageBox. Show (eks. melding); }}
private void btnStop_Click (objektavsender, EventArgs e)
{if (ProdRunning == true) {timer1. Stop (); ProdRunning = false; UpdateOrderTable (); } else {MessageBox. Show ("Ingen produksjon startet ennå. Skriv inn data og trykk på" start "-knappen"); }}
private void 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 = nytt MySqlCommand (sett inn, tilkobling); prøv {connection. Open (); insertcmd. ExecuteNonQuery (); tilkobling. Lukk (); QuantProduced = 0; } fangst (unntak ex) {MessageBox. Show (eks. melding); }}
private void timer1_Tick (objektavsender, EventArgs e)
{CheckTableForNull (); load_table (); }
private void btnShowOrderTable_Click (objektavsender, EventArgs e)
{if (ProdRunning == false) {MySqlCommand command = new MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", tilkobling); prøv {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = kommando; DataTable dbdataset = nytt DataTable (); adapter. Fyll (dbdataset); BindingSource bsource = ny BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Oppdater (dbdataset); } fangst (unntak ex) {MessageBox. Show (eks. melding); }} else {MessageBox. Show ("Trykk på stopp for å se ordreTabell"); }}
private void btnShowOrderDetails_Click (objektavsender, 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 +"' "); MySqlCommand -kommando = ny MySqlCommand (test, tilkobling); prøv {connection. Open (); MySqlDataAdapter adapter = ny MySqlDataAdapter (); adapter. SelectCommand = kommando; DataTable dbdataset = nytt DataTable (); adapter. Fyll (dbdataset); BindingSource bsource = ny BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Oppdater (dbdataset); } fangst (unntak ex) {MessageBox. Show (eks. melding); } tilkobling. Lukk (); } annet {MessageBox. Show ("Trykk på stopp for å se bestillingsdetaljer"); }}
private void btnShowCustomerDetails_Click (objektavsender, 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 +"' "); MySqlCommand -kommando = ny MySqlCommand (test, tilkobling); prøv {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = kommando; DataTable dbdataset = nytt DataTable (); adapter. Fyll (dbdataset); BindingSource bsource = ny BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Oppdater (dbdataset); } fangst (unntak ex) {MessageBox. Show (eks. melding); }} else {MessageBox. Show ("Trykk på stopp for å se kundedetaljer"); }}}
}
Anbefalt:
Slik kobler du NodeMCU ESP8266 til MySQL -database: 7 trinn
Slik kobler du NodeMCU ESP8266 til MySQL -database: MySQL er et mye brukt relasjonsdatabasehåndteringssystem (RDBMS) som bruker strukturert spørrespråk (SQL). På et tidspunkt vil du kanskje laste opp Arduino/NodeMCU sensordata til MySQL -databasen. I denne instruksen vil vi se hvordan du kobler til
Lag MS Access Database Software for å forberede lønn i din bedrift: 6 trinn
Lag Ms Access Database Software for å forberede lønn i din bedrift: Jeg gir deg den korte instruksjonen for å opprette et lønningssystem med MS -tilgang for å generere månedslønn og enkelt skrive ut lønnsslipper med dette. På denne måten kan du beholde hver månedslønnsoppføringer under databasen og kan redigere eller se sent
NODEMCU LUA ESP8266 Koble til MySQL -database: 6 trinn
NODEMCU LUA ESP8266 Koble til MySQL -database: Denne instruksen er ikke for svakhjertet da den bruker XAMPP (Apache, MySQL og PHP), HTML og selvfølgelig LUA. Hvis du er trygg på å takle disse, kan du lese videre! Jeg bruker XAMPP da den kan konfigureres på en penn eller harddisken, og den er konfigurert
Dataopsamling Af Tyverialarm IIOT 4.0: 8 trinn
Dataopsamling Af Tyverialarm IIOT 4.0: Dette prosjektet i faget IIOT er en videreudvikling av entyverialarm, som jeg har laget på en Arduino i et tidligere prosjekt. Der er dette prosjektet blitt fokusert på lagring av data, jeg får fra min tyverialarm, samt at lave og brukerinterface. D
UCL-IIOT-Alarmsystem med database og noderød: 7 trinn
UCL-IIOT-Alarmsystem med database og node-rødt: Formålet med denne bygningen er å lære om å koble Arduino med Node-red og en database, slik at du kan logge data og også samle dem for senere bruk. For denne bygningen bruker jeg et enkelt arduino alarmsystem som sender ut 5 datanumre, hver atskilt med en