- Arduino vejemaskine fungerer
- Komponenter, der kræves til Arduino-baseret vejemaskine
- Arduino-baseret vejemaskine - kredsløbsdiagram
- At lave kredsløbet på en stiplet perfboard
- Opbygning af et kabinet til Arduino-baseret vejemaskine
- Arduino vejemaskine - kode
Digitale belastningsskalaer er endnu et mirakel inden for moderne teknik og design. Ja, vi taler om den vægtning, vi ofte ser i de fleste købmandsforretninger og andre steder, men har du nogensinde spekuleret på, hvordan en vægtskala fungerer? For at besvare dette spørgsmål skal vi se på vejecellen og dens arbejde i dette projekt. Endelig bygger vi en bærbar Arduino-baseret belastningsskala med HX711-vægtsensor, som kan måle vægte op til 10 kg.
Denne vejemaskine er perfekt til lokale butikker, hvor de pakker varer i bulk. Ligesom kommercielle produkter vil vores vægtskala have en nul-knap, der nulstiller skalaen. Det har også en mulighed for at indstille vægten til måling, når målevægten når den indstillede vægt, bipper en summer hurtigt og stopper, når den indstillede vægt er lig med målevægten. På denne måde kan brugeren pakke det bare ved at høre lyden og behøver ikke se på skærmen. Da dette er et meget simpelt projekt, bygger vi dette meget let ved hjælp af komponenter som Arduino og belastningscelle til stregmåler. Så lad os komme lige ind i det uden yderligere forsinkelse.
I en tidligere artikel har vi lavet projekter som Raspberry Pi-baseret vægtsensor og IoT Smart Container med e-mail-alarm og webovervågning ved hjælp af det populære HX711-vejecelleforstærkermodul. Så tjek det, hvis det er dit krav.
Arduino vejemaskine fungerer
Hovedkomponenten i dette projekt er et vejecelle- og HX711-vejecelleforstærkermodul. Som du kan se, er den ene side markeret med ti kg. Du kan også bemærke en slags hvid beskyttende lim over vejecellen, og fire forskellige farver af ledninger kommer ud, vil afsløre hemmeligheden under den hvide beskyttende lim og funktionen af disse firefarvede ledninger senere i artiklen.
En vejecelle er en transducer, der omdanner kraft eller tryk til elektrisk udgang. Det har to sider, lad os sige højre side og venstre side, og det er lavet af aluminiumsblokke. Som du kan se midt i materialet er det tyndt ved at sætte et stort hul. Derfor er det det punkt, der lider af deformation, når en belastning placeres på monteringssiden. Forestil dig nu, at højre sidecelle er monteret på basen, og at venstre side er, hvor belastningen er placeret, denne konfiguration deformerer belastningscellen til belastningsmåler på grund af det kæmpe hul i midten.
Når en last placeres på vejsiden af vejecellen, vil den øverste del blive spændt, og den nederste del vil blive komprimeret. Det er grunden til, at aluminiumsstangen bøjes nedad i venstre side. Hvis vi måler denne deformation, kan vi måle den kraft, der blev påført aluminiumblokken, og det er præcis, hvad vi vil gøre.
Nu er spørgsmålet stadig, hvad der er inde i den hvide beskyttende lim? Inde i denne beskyttende lim finder vi en meget tynd elastisk komponent, der kaldes en stregmåler. En stregmåler er en komponent, der bruges til at måle stamme. Hvis vi ser nærmere på denne komponent, kan vi se to forbindelsespuder, og så har vi et ledende trådmønster med gentagne afbøjninger. Denne ledende ledning har en defineret modstand. Når vi bøjer det, ændres modstandsværdien? Så den ene side af spændingsmåleren er monteret og fastgjort et sted, hvis vi lægger en vægt på den anden side af aluminiumstangen, vil dette tvinge spændingsmåleren til at bøje, hvilket vil medføre en ændring i modstand. Hvordan sker dette egentlig? Det ledende mønster af spændingsmåleren er lavet af kobber, denne ledning vil have et bestemt areal og længde, så disse to enheder vil give ledningens modstand. En lednings modstand modsætter strømmen af strøm. Nu er det indlysende, at hvis området for denne ledning bliver mindre,færre elektroner kunne passere, hvilket betyder en lavere strøm. Hvis vi nu øger arealet, vil det øge ledningens modstand. Hvis der påføres en eller anden kraft på denne ledning, strækker dette området og det bliver mindre på samme tid, modstanden øges. Men denne modstandsvariation er meget lav. Hvis vi strækker spændingsmåleren, øges modstanden, og hvis vi komprimerer den, bliver modstanden lavere. For at måle kraften er vi nødt til at måle modstanden. Det er ikke altid praktisk at måle modstanden direkte, fordi ændringen er meget lille. Så i stedet for at måle modstand kan vi nemt måle spændinger. Så i dette tilfælde er vi nødt til at konvertere måleudgangen fra modstandsværdier til spændingsværdier.Hvis der påføres en eller anden kraft på denne ledning, strækker dette området, og det bliver mindre på samme tid, modstanden øges. Men denne modstandsvariation er meget lav. Hvis vi strækker spændingsmåleren, øges modstanden, og hvis vi komprimerer den, bliver modstanden lavere. For at måle kraften er vi nødt til at måle modstanden. Det er ikke altid praktisk at måle modstanden direkte, fordi ændringen er meget lille. Så i stedet for at måle modstand kan vi nemt måle spændinger. Så i dette tilfælde er vi nødt til at konvertere måleudgangen fra modstandsværdier til spændingsværdier.Hvis der påføres en eller anden kraft på denne ledning, strækker dette området, og det bliver mindre på samme tid, modstanden øges. Men denne modstandsvariation er meget lav. Hvis vi strækker spændingsmåleren, øges modstanden, og hvis vi komprimerer den, bliver modstanden lavere. For at måle kraften er vi nødt til at måle modstanden. Det er ikke altid praktisk at måle modstanden direkte, fordi ændringen er meget lille. Så i stedet for at måle modstand kan vi nemt måle spændinger. Så i dette tilfælde er vi nødt til at konvertere måleudgangen fra modstandsværdier til spændingsværdier.modstanden bliver lavere. For at måle kraften er vi nødt til at måle modstanden. Det er ikke altid praktisk at måle modstanden direkte, fordi ændringen er meget lille. Så i stedet for at måle modstand kan vi nemt måle spændinger. Så i dette tilfælde er vi nødt til at konvertere måleudgangen fra modstandsværdier til spændingsværdier.modstanden bliver lavere. For at måle kraften er vi nødt til at måle modstanden. Det er ikke altid praktisk at måle modstanden direkte, fordi ændringen er meget lille. Så i stedet for at måle modstand kan vi nemt måle spændinger. Så i dette tilfælde er vi nødt til at konvertere måleudgangen fra modstandsværdier til spændingsværdier.
Vi kan gøre dette ved hjælp af Wheatstone-broen. Vi placerer spændingsmåleren i Wheatstone-broen, hvis broen er afbalanceret, spændingen i midterpunktet skal være nul (tidligere har vi bygget et projekt, hvor vi har beskrevet, hvordan en Wheatstone-bro fungerer, du kan tjekke det ud, hvis du vil vide mere om emnet). Når spændingsmåleren ændrer modstand, vil det afbalancere broen, og spændingen vil også ændre sig. Så dette omdanner Wheatstone-broen modstandsvariationer til spændingsværdier.
Men denne spændingsændring er stadig meget lille, så for at øge det skal vi bruge HX711-modulet. HX711 er en 24-bit Differential ADC, på denne måde kunne vi måle meget små spændingsændringer. det giver værdier fra 0 til 2 eksponentielt 24.
Komponenter, der kræves til Arduino-baseret vejemaskine
For at gøre dette projekt så simpelt som muligt har vi brugt meget generiske komponenter, som du kan finde i enhver lokal hobbybutik. Billedet nedenfor giver dig en idé om komponenterne. Desuden har vi Stykliste (BOM), der er anført nedenfor.
- Vejecelle (vi bruger en 10 kg vejecelle)
- HX 711 forstærker modul
- Arduino Nano
- I2C LCD 16X2 - I2C Kompatibel
- 1k modstand -2 Nos
- Lysdioder -2Nr
- Summer
- Fælles printkort
- 7.4V batteri (hvis du vil have det bærbart)
- LM7805 spændingsregulator
Arduino-baseret vejemaskine - kredsløbsdiagram
Vejecellen har fire ledninger, som er røde, sorte, grønne og hvide. Denne farve kan variere alt efter producenterne, så det er bedre at henvise til databladet. Tilslut rødt til E + på HX711-kortet, tilslut sort til E-, tilslut hvidt til A +, og tilslut grønt til henholdsvis A-, Dout og ur til kort tilslutte henholdsvis D4 og D5. Tilslut den ene ende af trykknapperne til D3, D8, D9 og andre ender til jorden. Vi har I2C LCD, så tilslut SDA til A4 og SCL til A5. Forbind jorden på LCD, HX711 og Arduino til jorden, og tilslut også VCC'er til 5Vpin i Arduino. Alle moduler fungerer på 5V, så vi har tilføjet en LM7805 spændingsregulator. Hvis du ikke vil have det som bærbart, kan du strømforsyne Arduino direkte ved hjælp af et USB-kabel.
At lave kredsløbet på en stiplet perfboard
Vi har loddet alle komponenterne på et fælles prikket perfboard. Vi brugte kvindelige overskrifter til at lodde Arduino og ADC med printkortet, og vi har også brugt ledninger til at forbinde alle trykknapper og lysdioder. Når alle lodningsprocesser er afsluttet, har vi sørget for, at korrekt 5V kommer ud af LM7805. Endelig har vi sat en switch til at tænde / slukke for kredsløbet. Når vi alle var færdige, så det ud som billedet nedenfor.
Opbygning af et kabinet til Arduino-baseret vejemaskine
Som du kan se, har vejecellen nogle skruegevind, så vi kunne montere den på en bundplade. Vi bruger et PVC-kort til bunden af vores skala, til det skærer vi først 20 * 20 cm kvadrat og fire 20 * 5 rektangler fra PVC-kortet. Derefter limede vi hvert stykke med hårdt lim og lavede et lille kabinet.
Husk, vi fik ikke den ene side, fordi vi har brug for at placere trykknapper, lysdioder og LCD på den. Derefter brugte vi et plastbræt til toppen af skalaen. Før vi gør denne opsætning permanent, skal vi sørge for, at vi har tilstrækkelig plads fra jorden til vejecellen, så den vil være i stand til at bøje, så vi placerede skruer og møtrikker mellem vejecellen og bunden, også vi tilføjede nogle plastafstandsstykker imellem vejecellen og den øverste del. vi brugte et rundt plastark som den øverste smarte balance.
Derefter placerede vi LCD, LED'er og trykknapper på frontpanelet og alt forbundet med lang isoleret ledning. Når vi er færdige med ledningsføringsprocessen, limede vi frontpanelet til hovedbasen med en vis hældning, så vi nemt kan læse værdierne fra LCD. endelig tilsluttede vi hovedafbryderen til siden af vægten, og det er det. Sådan lavede vi kroppen til vores vægtskala.
Du kan designe med dine ideer, men husk at placere vejecellelignende som på billedet.
Arduino vejemaskine - kode
Da vi nu er færdige med byggeprocessen til vores digitale skala, kan vi gå videre til programmeringsdelen. For nem programmering skal vi bruge HX711-biblioteket, EEPROM-biblioteket og LiquidCrystal-biblioteket. Du kan downloade HX711-biblioteket fra det officielle GitHub-arkiv eller gå til værktøjer > inkluder bibliotek > administrer bibliotek, og søg derefter i biblioteket ved hjælp af nøgleordet HX711, efter at have downloadet biblioteket, skal du installere det i Arduino ide.
Først skal vi kalibrere vejecellen og gemme den værdi på EEPROM. For det skal du gå til fil> eksempler> HX 711_ADC og derefter vælge kalibreringskoden. Før du uploader koden, skal du placere vægten på en stabil plan overflade. Upload derefter koden til Arduino, og åbn den serielle skærm. Skift derefter baudrate til 572600. Bed nu monitoren om at tage vægten, for at vi skal trykke på t og indtaste.
Nu er vi nødt til at placere den kendte vægt på vægten, i mit tilfælde er det 194 gm. Når du har placeret den kendte vægt, skal du skrive vægten på den serielle skærm og trykke på Enter.
Nu spørger den serielle skærm dig, om du vil gemme værdien i EEPROM eller ej, så skriv Y for at vælge ja. Nu kan vi se vægten på den serielle skærm.
Hovedkoden til dette projekt, som vi udviklede ud fra eksemplet på HX711-biblioteket. Du kan downloade koden for dette projekt nedenunder.
I kodningssektionen tilføjede vi først alle tre biblioteker. HX711-biblioteket er beregnet til at tage vejecelleværdierne. EEPROM er det indbyggede bibliotek i Arduino ide, som bruges til at gemme værdier i EEPROM, og LiquidCrystal-biblioteket er til l2C LCD-modulet.
#omfatte
Derefter definerede heltal for forskellige ben og tildelte værdier. HX711_ADC vejecellefunktion er til indstilling af Dout og urstift .
const int HX711_dout = 4; const int HX711_sck = 5; int tpin = 3; HX711_ADC LoadCell (HX711_dout, HX711_sck); const int calVal_eepromAdress = 0; lang t; const int Up_buttonPin = 9; const int Down_buttonPin = 8; float buttonPushCounter = 0; flyde op_knapStat = 0; flyde op_lastButtonState = 0; flyde ned_buttonState = 0; flyde ned_lastButtonState = 0;
I installationssektionen startede vi først den serielle skærm, dette er kun til fejlfinding. Derefter definerede vi pin-tilstande, alle trykknapper er defineret som input. Ved hjælp af Arduino PULL UP-funktionen indstiller vi stifterne til en logisk høj som normalt. Så vi vil ikke bruge nogen eksterne modstande til det.
pinMode (tpin, INPUT_PULLUP); pinMode (6, OUTPUT); pinMode (12, OUTPUT); pinMode (Up_buttonPin, INPUT_PULLUP); pinMode (Down_buttonPin, INPUT_PULLUP);
Følgende kodelinjer er til indstilling af I2C LCD. Først viste vi velkomstteksten ved hjælp af funktionen LCD.print () , efter to sekunder ryddede vi skærmen ved hjælp af lcd.clear () . I starten viser ARDUINO BALANCE som velkomsttekst, og efter to sekunder rydder den og viser målevægten.
lcd.init (); lcd.backlight (); lcd.setCursor (0, 0); lcd.print ("ARDUINO BALANCE"); lcd.setCursor (0, 1); lcd.print ("lad os måle"); forsinkelse (2000); lcd.clear ();
Derefter begyndte at læse værdierne fra loadcell ved hjælp af loadCell.begin () -funktionen, derefter læste vi EEPROM for de kalibrerede værdier, det gør vi ved hjælp af funktionen EEPROM.get () . Det vil sige, at vi allerede har gemt værdien ved hjælp af kalibreringsskitse i EEPROM- adressen, vi genoptager bare den værdi.
LoadCell.begin (); EEPROM.get (calVal_eepromAdress, calibrationValue);
I loop-sektionen kontrollerer vi først, om der findes data fra vejecellen ved hjælp af LoadCell.update (), hvis de er tilgængelige, læser vi og gemmer disse data, til det bruger vi LoadCell.getData () . Dernæst skal vi vise den gemte værdi i LCD. For at gøre det brugte vi funktionen LCD.print () . også, vi udskriver den indstillede vægt. Den indstillede vægt indstilles ved hjælp af trykknappen. Det blev forklaret i sidste afsnit.
hvis (LoadCell.update ()) newDataReady = sand; hvis (newDataReady) { hvis (millis ()> t + serialPrintInterval) { float i = LoadCell.getData (); lcd.setCursor (0, 0); lcd.print ("set wei:"); lcd.setCursor (9, 0); lcd.print (buttonPushCounter); lcd.setCursor (14, 0); lcd.print ("GM"); lcd.setCursor (0, 1); lcd.print ("vægt:"); lcd.setCursor (9, 1); lcd.print (i); lcd.setCursor (14, 1); lcd.print ("GM");
Dernæst indstiller vi taraværdien, for at først læser vi tilstanden for taratrykknappen ved hjælp af funktionen digitalRead () , hvis tilstanden er lav, tarerer vi denne vægt til nul. Tara-funktionen i denne vægtskala er at bringe målingerne til nul. For eksempel, hvis vi har en skål, hvor tingene er fyldt, så vil nettovægten være skålens vægt + tingens vægt. Hvis vi trykker på taraknappen med skålen på vejecellen, inden vi lægger ting i, bliver kurvens vægt negeret, og vi kan måle vægten af tingene alene.
hvis (digitalRead (tpin) == LOW) { LoadCell.tareNoDelay ();
Nu skal vi indstille betingelserne for forskellige indikationer som f.eks. Indstilling af summerens forsinkelse og led-status. Vi gjorde, at bruge , hvis forhold, vi har i alt tre forhold. Først beregner vi forskellen mellem indstillet vægt og målevægt, og gemmer derefter denne værdi i variablen k.
flyde k = buttonPushCounter-i;
1. Hvis forskellen mellem indstillet vægt og målevægt er større end eller lig med 50 g, bipper en summer med en forsinkelse på 200 millisekunder (langsomt).
hvis (k> = 50) { digitalWrite (6, HIGH); forsinkelse (200); digitalWrite (6, LAV); forsinkelse (200); }
2. Hvis forskellen mellem indstillet vægt og målevægt er lavere end 50 og større end 1 gram, bipper summeren med en forsinkelse på 50 millisekunder (hurtigere).
hvis (k <50 && k> 1) { digitalWrite (6, HIGH); forsinkelse (50); digitalWrite (6, LAV); forsinkelse (50); }
3. Når målevægten er lig med eller større end den indstillede værdi, tænder den grønne lysdiode og slukker for summeren og den røde lysdiode.
hvis (i> = buttonPushCounter) { digitalWrite (6, LOW); digitalWrite (12, HIGH); }
Vi har yderligere to ugyldige funktioner () til at indstille den indstillede vægt (til at tælle tryk på knappen).
Funktionen øger den indstillede værdi med 10 gms for hvert tryk. Dette gøres ved hjælp af Arduinos digitalRead- funktion, hvis stiften er lav, betyder det, at der trykkes på knappen, og det øger værdien med 10 gms.
up_buttonState = digitalRead (Up_buttonPin); if (up_buttonState! = up_lastButtonState) { if (up_buttonState == LOW) { bPress = true; buttonPushCounter = buttonPushCounter + 10; }
Tilsvarende
checkdown er til at reducere den indstillede værdi med 10 g for hvert tryk.
down_buttonState = digitalRead (Down_buttonPin); if (down_buttonState! = down_lastButtonState) { if (down_buttonState == LOW) { bPress = true; buttonPushCounter = buttonPushCounter - 10; }
Dette markerer slutningen af programmeringsdelen.
Denne Arduino-baserede elektroniske vægt er perfekt til måling af vægte op til 10 kg (vi kan øge denne grænse ved hjælp af en højere nominel vejecelle). Dette er 99% nøjagtigt i forhold til originale målinger.
Hvis du har spørgsmål vedrørende dette Arduino-baserede LCD vægtbalancemaskinkredsløb, bedes du sende det i kommentarsektionen, tak!