Inhoudsopgave:
- Stap 1: Opsamling Af-gegevens voor Vægt Samt Registratie Af UID
- Stap 2: Arduino-programma
- Stap 3: Node-RED, achterblijvende gegevens I-database
- Stap 4: Database-ontwerp
- Stap 5: Patelog
- Stap 6: Besteltabel
- Stap 7: Klantentabel
- Stap 8: Rangetable
- Stap 9: C#-programma
Video: EAL-Industri4.0-RFID Dataopsamling naar database - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:19
Dette projekt omhandler opsamling van vægtdata, registrering van identiteter vha. RFID, achterblijvende data i en MySQL database vha. node-RED, samt fremvisning en behandling van de opsamlede data i et C# programma i form van en Windows Form Application. Vi forestiller os følgende:
Vi har en produktionslinje som producerer leverpostej i 200g foliebakker. Alle færdigbagte leverpostejer udstyres na afkøling med et RFID-tag i plasticlåget/labelen, som indeholder et unikt ID (UID = Unique Identifier, er en 32 bits kode, 8 hexadecimale karakterer) voor entydig identifikation af hver enkelt bakke leverpostej. Da færdigvægten af hver enkelt bakke leverpostej kan svinge (afhængig af råvarer, fordampning i ovn mm), en da kunderne hver har et specifikt krav færdigvægten, brugge UID tagget til at knytte hver enkelt leverpostifiek til en der lag lager leverpostejer til én specifik kunde. Kunderne er supermarkedskæder:
1. Irma. Vgten på Irmas luksus leverpostej skal holde sig inden voor +/- 5%, altså minimum 190g en maksimum 210g.
2. Bruggen. Vgten op Brugsens leverpostej skal holde sig inden voor +/- 10%, altså minimum 180g en maksimum 220g.
3. Aldi. Vgten på Aldis discount leverpostej skal holde sig inden voor +/- 15%, altså minimum 170g en maksimum 230g.
Der er således følgende sorteringer:
Bereik0: buiten bereik
Bereik1: minimaal 190g/maximaal210g
Bereik2: minimaal 180g/maximaal220g
Bereik3: minimaal 170g/maximaal230g
Stap 1: Opsamling Af-gegevens voor Vægt Samt Registratie Af UID
Tot opsamling van gegevens voor vægt, samen registreren van RFID-tags op anvendt en Arduino MEGA2560 med en RFID-RC522 reader/writer. Da vi ikke har nogen vægt, simulerer vi data for vægten med et potmeter tilsluttet en analog indgang på Arduinoen.
Følgende opstilling er anvendt:
1 stk potmeter 25k lijnært. Yder-benene er tilsluttet hhv. GND en +5V, midterbenet er tilsluttet AN0
RFID-RC522 is uitgerust met Arduino-boardets SPI-poort heeft een volgende stap:
SDA -> pin 53
SCK -> pin52
MOSI ->pin51
MISO->pin50
IRQ ->NC
GND ->GND
RST -> pin5
3.3V -> 3.3V
De opsamlede gegevens, voor hhv. UID og vægten, sendes på den serielle port som en komma-separeret textstreng videre til node-Red som står for den efterfølgende præsentation på et dashboard en lagring i en database.
Stap 2: Arduino-programma
I Arduino programmeert inkluderes de naar biblioteker SPI.h og MFRC522.h voor op kunne bruge RFID læseren. Ik start af programma initialiseres de anvendte variabele. Der laves en instans af MFRC522. I Setup blokken initialiseres den serielle forbindelse, SPI porten en MFRC522. Derefter scant na RFID-tags. For ikke at sende det samme UID afsted flere gange efter hinanden, er der lavet en stump kode som tjekker for dette. Nr der scannet en UID-tag, laadt willekeurige nyUID met de netop bovenste UID. Hvis-array nyUID is niet beschikbaar voor oude UID en kan geen enkele UID verzenden naar een seriele poort. Hvis nyUID en oldUID er ens, er der tale om samme UID-tag en UID'et skal negeerres. Hvis der er tale om et nyt UID, verzendt UID'et naar de serielle port samen met de laatste værdi fra den serielle port. De analoge weergave van de skaleres tot omrdet 150-250. Data stuurt som en komma-separeret tekststerkte. Sommige delen van de oude UID = nyUID, således bij koden klart til bij læse et nyt RFID-tag. Funktionen returnerer true hvis array'ne er ens, en false hvis array'ne er forskellige.
#erbij betrekken
#include // Dit programma scant RFID-kaarten met behulp van het RDIF-RC522-lezer/schrijver-bord. // UID wordt gelezen, een analoge pin wordt gelezen. Analoge waarde 0-1023 wordt geschaald naar 150-250. // UID en analoge waarde worden verzonden als door komma's gescheiden tekst op seriële poort met behulp van 9600, N, 8, 1. // Er is voor gezorgd dat elke UID slechts één keer achter elkaar wordt verzonden, // een nieuwe UID moet worden aanwezig zijn voordat dezelfde UID opnieuw kan worden verzonden. // Deze functie is geïmplementeerd in de code door arrays te vergelijken: oldUIDnyUID in functie array_cmp(oldUID, nyUID)
constexpr uint8_t RST_PIN = 5;
constexpr uint8_t SS_PIN = 53; int sensorPin = A0; int Waarde = 0; String StringValue = "0000"; byte oudeUID[4] = {}; byte nyUID[4] = {};
MFRC522 mfrc522(SS_PIN, RST_PIN); // Maak een MFRC522-instantie.
ongeldige setup()
{ Serieel.begin(9600); // Start een seriële communicatie SPI.begin(); // Start SPI-bus mfrc522. PCD_Init(); // Start MFRC522}
lege lus()
{ // Zoek naar nieuwe kaarten if (! mfrc522. PICC_IsNewCardPresent()) { return; } // Selecteer een van de kaarten als (! mfrc522. PICC_ReadCardSerial()) { return; } // laad nyUID met UID-tag voor (byte i = 0; i <mfrc522.uid.size; i++) {nyUID = mfrc522.uid.uidByte; } // if oldUID nyUID if (!array_cmp(oldUID, nyUID)) { // stuur UID-tag op seriële poort voor (byte i = 0; i 1000) { Value = 1000; } Waarde = (Waarde/10) + 150; // stuur geschaalde analoge waarde Serial.print (Value); // stuur nieuwe regel Serial.println (); //set oldUID = nyUID voor (byte z = 0; z < 4; z++) oldUID [z] = nyUID [z]; } // wacht 1 sec vertraging (1000); }
// vergelijk 2 arrays…
boolean array_cmp(byte a, byte b) { bool test = true; // test elk element om hetzelfde te zijn. als er maar één niet is, retourneer dan false voor (byte n = 0; n < 4; n++) { if (a[n] != b[n]) test = false; // als op byte niet gelijk is, test = false } if (test == true) return true; anders vals retourneren; }
Stap 3: Node-RED, achterblijvende gegevens I-database
Følgende flow er lavet i node-RED:
COM4 er den serielle forbindelse hvor data modtages fra Arduino boardet. Functies "Split and Get value" en "Split and Get UID" splitter teksstrengen ved kommaet en returnere hhv vægten en UID. Bekijk brugge til fremvisning på dashboardet i et linechart og en scale. UID fremviseert en tekstvilt. Funktionen test_sound advarer verbalt med sætningen "Buiten bereik", hvis vægten er onder 170g of meer dan 230g, dvs i bereik 0.
Splitsen en waarde ophalen:
var output = msg.payload.split(', ');
temp = {payload:(output[1])}; retourtemperatuur;
Splitsen en UID krijgen:
var output = msg.payload.split(", ");
temp = {payload:output[0]}; retourtemperatuur;
test_geluid:
var nummer = parseInt(msg.payload);
if (getal>230 ||getal<170) { newMsg = {payload:"Buiten bereik"}; retourneer nieuweMsg; } else { newMsg = {payload:""}; retourneer nieuweMsg; }
Functies Split string ", " indsætter en timestamp, UID en vægten in en database patedb.patelog.
var output = msg.payload.split(", "); //split msg.payload door komma in array
UIDtag = uitvoer [0]; // eerste deel in eerste positie [0] ValueTag = output [1]; // tweede deel naar tweede positie [1]
var m = {
topic: "INSERT INTO patedb.patelog (tijdstempel, UID, gewicht) VALUES('"+new Date().toISOString()+"', '"+ UIDtag +"', '"+ValueTag+"');" }; retour m;
patelog er nl MySQL database forbindelse some er zat op me følgende parameter:
Host: localhost
Poort: 3306
Gebruiker:root
Database: patedb
Stap 4: Database-ontwerp
Databasen patedb indeholder 4 tabeller
patelog er dataopsamlingstabellen, tilskrives data af node-RED en C# programmat
besteltabel en tabel enkele indeholder data om de genemførte order, tilskrives data van C# programt
klantentabel er et kunderegister
rangetable er en tabel som indeholder grænseværdierne voor de i C# programmat benyttede bereiken.
Stap 5: Patelog
Tabellen patelog indeholder folgende 6 kolonner:
pateID (int) er primaire sleutel en inkrementeres automatisk.
Tijdstempel, UID & vægt er af typen varchar (med forskellig max længde)
rangeNr er af typen tinyint (beregnes og tilføjes van C# programt)
orderID er af typen int (orderID tilføjes van C# programmat)
Node-RED tilføjer ikke værdier til kolonnerne rangeNr en orderID. rangeNr en orderID tillader NULL værdier, det bruges i C# programt til at detektere de rækker som skal tilskrives værdier for rangeNr en orderID
Stap 6: Besteltabel
besteltabel indeholder 5 kolonner:
orderID (int) er det aktuelle ordernummer
orderQuant (mediumint) er ordens pålydende antal
quantProduced (mediumint) er antal der rent faktisk er produceret på ordren. (Tlles af C# programmat)
commentaar (tinytext) er en eventueel kommentar til ordren.
klant-ID (int) er det aktuelle kundenummer på ordren.
Stap 7: Klantentabel
klantentabel indeholder 6 kolonner:
customerID (int) er primaire sleutel en auto inc.
naam, adres, telefoon, e-mail (varchar) med forskellig max længde
bereikNr (int)
Stap 8: Rangetable
rangetable indeholder 3 kolonner:
rangeNr (int) er primaire sleutel en auto inc.
bereikMin (int)
bereikMax (int)
Stap 9: C#-programma
Nr der producers en ordre leverpostej, er proceduren følgende:
Kundenummer, ordernummer, ordreantal en eventueel kommentar indtastes i C# programmet på et transportbånd) Samhørende værdier af UID en den aktuelle vægt verzendt serielt til node-RED, sommige viser de opsamlede data på dashboard 'et. Samtidig skrives timestamp, UID en vægt i en ny række i patedb.pålog tov. tidspunkt ikke tilskrives værdier til rangeNr en orderID vil de have værdien NULL.
Med et timerinterval undersøger C# programt patedb.patelogtabellen voor nieuwe tilkomne rækker me NULL værdier i rangeNr kolonnen. Nr der er detekteret en række med NULL værdi, beregnes rangeNr en det tilføjes samen met de aktuelle orderID. Når en order er produceret, afsluttes ordren ved tryk på”stop”- knappen. Nr ordren afsluttes, tilføjes en række til patedb.ordertable med de aktuelle ordredata. Nr en ordre er afsluttet, kan de opsamlede data en patelog tabellen fremvises ved at trykke op de forskellige knapper en gruppen Update DataGridview. besteltabel kan også vises, en der kan søges orderdata på individuele UID'er eller kundedata på individuele order.
met behulp van System;met behulp van System. Collections. Generic; met behulp van System. ComponentModel; met behulp van systeemgegevens; met behulp van System. Drawing; met behulp van System. Linq; met behulp van System. Text; met behulp van System. Threading. Tasks; met behulp van System. Windows. Forms; met behulp van MySql. Data. MySqlClient;
naamruimte show_data_from_database
{ openbare gedeeltelijke klasse Form1: Form { MySqlConnection-verbinding = nieuwe MySqlConnection ("datasource=localhost; gebruikersnaam=root; wachtwoord=''"); int Rijnummer = 0; // Variabele voor het opslaan van pateID-waarde int RangeNumber = 0; // Variabele voor het opslaan van bereiknummer int weight = 0; // Variabele voor het opslaan van het gewicht int OrderNr = 0; // Variabele voor het opslaan van OrderNR int QuantProduced = 0; // Variabele voor het opslaan van geproduceerde hoeveelheid int NumberOfRows = 0; // aantal rijen met nulls.. bool ProdRunning = false; //Variabele die aangeeft of de start- en stopknoppen zijn geactiveerd int limits = new int[6];// initialize array int CustomerID; // Variabele voor het opslaan van customerID public Form1() { InitializeComponent(); load_table(); // bel load_table }
void load_table()
{ MySqlCommand-opdracht = nieuwe MySqlCommand ("SELECT * FROM patedb.patelog ORDER BY timestamp DESC;", verbinding); probeer { MySqlDataAdapter-adapter = nieuwe MySqlDataAdapter(); adapter. SelectCommand = opdracht; DataTable dbdataset = nieuwe DataTable(); adapter. Fill (dbdataset); BindingSource bsource = nieuwe BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bron; SetRijOrder(); adapter. Update(dbdataset); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } }
privé leegte SetRowOrder()
{ dataGridView1. Columns ["pateID"]. DisplayIndex = 0; // Haar kan worden gevonden door kolonner en dataGridView1. Columns["timestamp"]. DisplayIndex = 1; // Haar kan worden gevonden door kolonner en dataGridView1. Columns["UID"]. DisplayIndex = 2; // Haar kan rækkefølgen door kolonner ændres dataGridView1. Columns["weight"]. DisplayIndex = 3; // Haar kan worden gevonden door kolonner en dataGridView1. Columns["rangeNr"]. DisplayIndex = 4; // Haar kan worden gevonden door kolonner en dataGridView1. Columns["orderID"]. DisplayIndex = 5; // Haar kan rækkefølgen door kolonner ændres }
private void GetData_Click (objectafzender, EventArgs e) // Leest databasetabel en bestellingen op tijdstempel
{ load_table(); }
private void btnRefreshUID_Click (objectafzender, EventArgs e) //
{ string timeStr = "SELECTEER * VAN patedb.patelog BESTELLEN DOOR UID;"; MySqlCommand-opdracht = nieuwe MySqlCommand (timeStr, verbinding); probeer { MySqlDataAdapter-adapter = nieuwe MySqlDataAdapter(); adapter. SelectCommand = opdracht; DataTable dbdataset = nieuwe DataTable(); adapter. Fill (dbdataset); BindingSource bsource = nieuwe BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bron; SetRijvolgorde(); adapter. Update(dbdataset); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } }
private void btnRefreshValue_Click (objectafzender, EventArgs e)
{ string weightSort = "SELECTEER * VAN patedb.patelog ORDER DOOR CAST (gewicht ALS ONDERTEKEND INTEGER);"; MySqlCommand-opdracht = nieuw MySqlCommand (weightSort, verbinding); probeer { MySqlDataAdapter-adapter = nieuwe MySqlDataAdapter(); adapter. SelectCommand = opdracht; DataTable dbdataset = nieuwe DataTable(); adapter. Fill (dbdataset); BindingSource bsource = nieuwe BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bron; SetRijvolgorde(); adapter. Update(dbdataset); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } }
private void ChkNullBtn_Click (objectafzender, EventArgs e)
{if (ProdRunning) { CheckTableForNull(); load_table(); } }
privé ongeldig CheckTableForNull()
{ //Controleer/stel timerinterval minimaal 100 ms int i; int. TryParse(textTimer1. Text, uit i); if (i <100) { timer1. Stop(); ik = 100; timer1. Interval = ik; MessageBox. Show("Minimumwaarde i 100mS"); timer1. Start(); } else { timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString(); //Controleer of er rijen met null beschikbaar zijn in de tabel, retourneert het aantal rijen in de variabele: NumberOfRows string weightStr = ""; string chkNull = "SELECT COUNT(*) FROM patedb.patelog WAAR rangeNR NULL IS ORDER DOOR pateID LIMIT 1;"; MySqlCommand-opdracht = nieuwe MySqlCommand (chkNull, verbinding); probeer { verbinding. Open(); NumberOfRows = Convert. ToInt32(command. ExecuteScalar()); verbinding. Sluiten(); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } eindelijk {if (NumberOfRows!= 0) {try {//Selecteert het laagste pateID-nummer waarbij rangeNr NULL is string readID = "SELECT pateID FROM patedb.patelog WAAR rangeNR NULL IS ORDER DOOR pateID ASC LIMIT 1;"; MySqlCommand cmdID = nieuwe MySqlCommand (readID, verbinding); { verbinding. Open(); Rijnummer = (int)cmdID. ExecuteScalar(); //geheel getal!! verbinding. Sluiten(); } listPateID. Text = RowNumber. ToString(); // lees het geselecteerde PateID-nummer uit // Selecteert het gewicht uit het geselecteerde rijnummer string rij = RowNumber. ToString(); string readweight = "SELECT weight FROM patedb.patelog WHERE pateID=" + rij; MySqlCommand cmdweight = nieuw MySqlCommand (leesgewicht, verbinding); { verbinding. Open(); weightStr = (string)cmdweight. ExecuteScalar(); //Snaar !! verbinding. Sluiten(); } gewicht = int. Parse(weightStr); // converteren naar int txtWeight. Text = weight. ToString(); // print int RangeNumber = 0; if (gewicht>= limieten[0] && gewicht = limieten[2] && gewicht = limieten[4] && gewicht <= limieten[5]) { RangeNumber = 3; } } txtRange. Text = RangeNumber. ToString(); UpdateLog(); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } QuantProduced = QuantProduced + 1; } } } private void btnStart_Click (object afzender, EventArgs e) {if (ProdRunning == false) {int valtest; probeer { CustomerID = int. Parse(txtCustomerNr. Text); //lees klant-ID } catch { MessageBox. Show ("Voer productiegegevens in en druk op de 'start'-knop."); }
string test = "SELECT COUNT(*) FROM patedb.customertable WHERE customerID ="+CustomerID;
MySqlCommand cmdtestcustomer = nieuw MySqlCommand (test, verbinding); { verbinding. Open(); valtest = Convert. ToInt32(cmdtestcustomer. ExecuteScalar()); // retourneert 0 als de klant niet bestaat connection. Close(); } if (valtest==1) // als de klant in de database bestaat - start de productie { probeer { OrderNr = int. Parse(txtOrderNumber. Text); ProdRunning = waar; timer1. Start(); textTimer1. Text = timer1. Interval. ToString(); Leeslimieten(); } catch (uitzondering ex) { MessageBox. Show("Voer productiegegevens in en druk op de 'start'-knop."); } } else MessageBox. Show("Klant niet in database, probeer het opnieuw"); } //Leeslimieten(); }
privé leegte ReadLimits()
{// Leest limieten van bereiktabel, bereik 1 tot 3 int-teller = 0; for (int rangeNr = 1; rangeNr < 4; rangeNr++) { string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr=" + rangeNr; MySqlCommand cmdmin = nieuw MySqlCommand (readmin, verbinding); { verbinding. Open(); limieten[teller] = (int)cmdmin. ExecuteScalar(); teller = teller + 1; verbinding. Sluiten(); } // MessageBox. Show(counter. ToString()); string readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr=" + rangeNr; MySqlCommand cmdmax = nieuw MySqlCommand (readmax, verbinding); { verbinding. Open(); limieten[teller] = (int)cmdmax. ExecuteScalar(); teller = teller + 1; verbinding. Sluiten(); } } // einde voor lus }
privé ongeldig UpdateLog()
{ // UPDATE rangeNR & orderID string Range = RangeNumber. ToString(); string Order = OrderNr. ToString(); string update = "UPDATE patedb.patelog SET rangeNr= "+Bereik+', ' + "orderID= "+OrderNr+" WHERE pateID="+RowNumber; MySqlCommand updatecmd = nieuw MySqlCommand (update, verbinding); probeer { verbinding. Open(); updatecmd. ExecuteNonQuery(); verbinding. Sluiten(); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } }
private void btnStop_Click (objectafzender, EventArgs e)
{if (ProdRunning == true) { timer1. Stop(); ProdRunning = onwaar; UpdateOrdertabel(); } else { MessageBox. Show("Er is nog geen productie gestart. Voer de gegevens in en druk op de 'start'-knop"); } }
privé leegte 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 = nieuwe MySqlCommand (invoegen, verbinding); probeer { verbinding. Open(); insertcmd. ExecuteNonQuery(); verbinding. Sluiten(); QuantGeproduceerd = 0; } catch (uitzondering ex) { MessageBox. Show (ex. Message); } }
private void timer1_Tick (objectafzender, EventArgs e)
{ CheckTableForNull(); load_table(); }
private void btnShowOrderTable_Click (objectafzender, EventArgs e)
{if (ProdRunning == false) { MySqlCommand-opdracht = nieuwe MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", verbinding); probeer { MySqlDataAdapter-adapter = nieuwe MySqlDataAdapter(); adapter. SelectCommand = opdracht; DataTable dbdataset = nieuwe DataTable(); adapter. Fill (dbdataset); BindingSource bsource = nieuwe BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bron; adapter. Update(dbdataset); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } } else { MessageBox. Show("Druk op stop om orderTable te bekijken"); } }
private void btnShowOrderDetails_Click (objectafzender, EventArgs e)
{if (ProdRunning == false) { string test = ("SELECT patedb.ordertable.orderID, orderQuant, quantProduced, comment, customerID FROM patedb.ordertable BINNENLANDSE JOIN patedb.patelog OP patedb.patelog.orderID= patedb.ordertable.orderID WHERE patedb.patelog. UID = '" + txtShowOrderDetails. Text + "'"); MySqlCommand-opdracht = nieuw MySqlCommand (test, verbinding); probeer { verbinding. Open(); MySqlDataAdapter-adapter = nieuwe MySqlDataAdapter(); adapter. SelectCommand = opdracht; DataTable dbdataset = nieuwe DataTable(); adapter. Fill (dbdataset); BindingSource bsource = nieuwe BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bron; adapter. Update(dbdataset); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } verbinding. Sluiten(); } else { MessageBox. Show("Druk op stop om de details van de bestelling te bekijken"); } }
private void btnShowCustomerDetails_Click (objectafzender, EventArgs e)
{if (ProdRunning == false) { string test = ("SELECT patedb.customertable.customerID, naam, adres, telefoon, e-mail, rangeNr VAN patedb.customertable INNERLIJKE JOIN patedb.ordertable ON patedb.ordertable.customerID= patedb.customertable. klant-ID WAAR patedb.ordertable.orderID = '" + txtShowCustomerDetails. Text + "'"); MySqlCommand-opdracht = nieuw MySqlCommand (test, verbinding); probeer { MySqlDataAdapter-adapter = nieuwe MySqlDataAdapter(); adapter. SelectCommand = opdracht; DataTable dbdataset = nieuwe DataTable(); adapter. Fill (dbdataset); BindingSource bsource = nieuwe BindingSource(); bsource. DataSource = dbdataset; dataGridView1. DataSource = bron; adapter. Update(dbdataset); } catch (uitzondering ex) { MessageBox. Show (ex. Message); } } else { MessageBox. Show("Druk op stop om klantgegevens te bekijken"); } } }
}
Aanbevolen:
Hoe NodeMCU ESP8266 te verbinden met MySQL-database: 7 stappen
Hoe NodeMCU ESP8266 te verbinden met MySQL-database: MySQL is een veelgebruikt relationeel databasebeheersysteem (RDBMS) dat gebruikmaakt van gestructureerde querytaal (SQL). Op een gegeven moment wilt u misschien Arduino/NodeMCU-sensorgegevens uploaden naar de MySQL-database. In deze Instructable zullen we zien hoe verbinding te maken
NODEMCU LUA ESP8266 Verbinding maken met MySQL-database: 6 stappen
NODEMCU LUA ESP8266 Maak verbinding met MySQL-database: deze instructable is niet voor angsthazen omdat het XAMPP (Apache, MySQL & PHP), HTML en natuurlijk LUA gebruikt. Als je er zeker van bent om deze aan te pakken, lees dan verder! Ik gebruik XAMPP omdat het kan worden ingesteld op een pen drive of je harde schijf en het is geconfigureerd
Games uploaden naar Arduboy en 500 games naar Flash-cart: 8 stappen
Spellen uploaden naar Arduboy en 500 spellen naar Flash-cart: Ik heb een zelfgemaakte Arduboy gemaakt met serieel Flash-geheugen dat maximaal 500 spellen kan opslaan om onderweg te spelen. Ik hoop te delen hoe je games kunt laden, inclusief hoe je games opslaat in het seriële flash-geheugen en je eigen geconsolideerde gamepakket kunt maken
Flash AT Command Firmware naar ESP01-module (vereist een USB-naar-TTL-adapter): 5 stappen
Flash AT Command Firmware naar ESP01-module (vereist een USB-naar-TTL-adapter): door Jay Amiel AjocGensan PHfacebook.com/geeamealyoutube.com/jayamielajoc
12v naar USB-adapter 12v naar 5v transformator (ideaal voor auto's): 6 stappen
12v naar USB-adapter 12v naar 5v-transformator (ideaal voor auto's): hier wordt uitgelegd hoe u een 12v-naar-USB (5v)-adapter maakt. Het meest voor de hand liggende gebruik hiervan is voor 12v-autoadapters, maar overal waar je 12v hebt, kun je het gebruiken! Als je 5v nodig hebt voor iets anders dan USB, sla dan gewoon de stappen over het toevoegen van de USB-poorten over