Sisukord:
- Tarvikud
- Samm: juhtmestik
- 2. toiming: muutke oma laadimislahtrit kasutatavaks
- 3. samm: normaliseeritud andmebaas
- 4. samm: koormusanduri kodeerimine
- Samm 5: Veeanduri kodeerimine
- 6. samm: lähedusanduri kodeerimine
- Samm: samm -mootorite kodeerimine
- Samm: LCD -ekraani kodeerimine
- 9. samm: lõpp
Video: Lemmikloomade toiduainete automaatne dosaator: 9 sammu
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:46
Kas olete kunagi tundnud, et raiskaksite liiga palju aega oma lemmiklooma toitmiseks? Kas olete pidanud puhkuse ajal kellelegi helistama, et teie lemmikloomi toita? Olen püüdnud mõlemat probleemi lahendada oma praeguse kooliprojektiga: Petfeed!
Tarvikud
Vaarika Pi 3b
Baarikoormus (10 kg)
HX711 koormusanduri võimendi
Veetaseme andur (https://www.dfrobot.com/product-1493.html)
Ultraheli lähedusandur
LCD 16-kontaktiline
2x samm-mootor 28byj-48
2x samm -mootoriga juht ULN2003
Samm: juhtmestik
siin on palju kaabeldusi. Võtke hüppajakaablid välja ja alustage kinnitamist!
2. toiming: muutke oma laadimislahtrit kasutatavaks
koormusanduri kasutamiseks peame selle esmalt kinnitama kahe taldriku külge: põhjaplaadi ja taldriku, millel kaalume oma toitu.
Vajalikud kruvid on paar M4 kruvi koos sobivate poltidega ja paar M5 kruvi koos sobivate poltidega. Aukude tegemiseks kasutasin väikest puurit.
(pilt:
3. samm: normaliseeritud andmebaas
Andurite andmed tuleb salvestada andmebaasi. Python -failide andmebaasiga ühendamiseks: vaadake allpool.
siis vajate ka konfiguratsioonifaili:
[konnektor_python] kasutaja = * teie kasutajanimi * host = 127.0.0.1 #if kohalik port = 3306 parool = * teie parool * andmebaas = * teiedb * [application_config] draiver = 'SQL Server'
4. samm: koormusanduri kodeerimine
importige RPi. GPIO GPIO -ks impordi keermestamise importimise aeg hx711 -st impordi HX711 abistajatest. stepperFood impordi StepperFood abistajatest. LCD kirjutage impordi LCD -kirjutus hoidlatest. DataRepository import DataRepository
Pärast kõigi meie teekide importimist (pange tähele, et laadimisanduri juhtimiseks kasutame raamatukogu HX711), saame hakata kirjutama oma tegelikku koodi
TARRA_KONSTANT = 80600
GRAM_KONSTANT = 101
Meie konstantide väljaselgitamiseks määrake kõigepealt TARRA_CONSTANT = 0 ja GRAM_CONSTANT = 1.
Järgmisena peame välja selgitama väärtuse, mida meie koormusandur loeb, kui midagi ei kaaluta. See väärtus on TARRA_CONSTANT.
Mis puutub GRAM_CONSTANTi, siis võtke lihtsalt objekt, mille kaalu teate (ma kasutasin spagettide pakki), kaaluge seda ja jagage koormusanduri näit objekti tegeliku kaaluga. Minu jaoks oli see 101.
klassi LoadCell (keermestamine. niit):
def _init _ (ise, pistikupesa, LCD): keermestamine. Teema._ init _ (ise) self.hx711 = HX711 (dout_pin = 5, pd_sck_pin = 6, channel = 'A', gain = 64) self.socket = socket self.lcd = LCD
siin lähtestame LoadCelli klassi ja kaardistame tihvtid.
def run (ise):
try: while True: self.hx711.reset () # Enne alustamist lähtestage HX711 (pole kohustuslik) meetmed_avg = summa (self.hx711.get_raw_data ()) / 5 kaal = ümmargune ((meetmed_avg - TARRA_CONSTANT) / GRAM_CONSTANT, 0) print ("kaal: {0}". Formaat (kaal)) DataRepository.insert_weight (kaal) data_weight = DataRepository.get_data_sensor (3) historyId = data_weight ["SensorsHistory"] db_weight = data_weight ["value"] actionTime = data_weight ["actionTime"] self.socket.emit ('data_weight', {"id": historyId, "Weight": db_weight, "Time": DataRepository.serializeDateTime (actionTime)}) print ("zou moeten emitten") writeWeight = "kaal:" + str (db_kaal) msg = "PETFEED" LCDWrite.message () if int (db_weight [:-2]) <= 100: StepperFood.run () time.sleep (20), välja arvatud erand kui e: print ("Viga kaalumisel" + str (e))
Samm 5: Veeanduri kodeerimine
impordi aegimporti lõimimine hoidlatest. ise, pistikupesa): keermestamine.niit._ init _ (ise) self.socket = pistikupesa self.vorige_status = 0 def run (self): try: while True: water = self.is_water () print (water) status = water [" status "] action = vesi [" action "] DataRepository.insert_water (str (status), action) data_water = DataRepository.get_data_sensor (2) historyId = data_water [" SensorsHistory "] value = data_water [" value "] if value == "0": value = "te weinig water" else: value = "genoeg water" actionTime = data_water ["actionTime"] self.socket.emit ('data_water', {"id": historyId, "value": väärtus, "Aeg": DataRepository.serializeDateTime (actionTime), "action": action}) time.sleep (5), va Erand nagu näiteks: print (ex) print ('error bij vesiensor') def is_water (self): status = GPIO.input (GPIO_Wate r) kui self.vorige_status == 0 ja status == 1: print ('water gedetecteerd') sensorData = {"status": status, "action": "water gedetecteerd"} self.vorige_status = status status = GPIO.input (GPIO_Water) if self.vorige_status == 1 and status == 1: print ('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input (GPIO_Water) if self.vorige_status == 1 ja status == 0: print ('water weg') sensorData = {"status": status, "action": "water weg"} self.vorige_status = status status = GPIO.input (GPIO_Water) if self.vorige_status == 0 ja status == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} return sensorData
6. samm: lähedusanduri kodeerimine
impordi aegimporti lõimimine hoidlatest.. IN) def current_milli_time (): return int (round (time.time () * 1000)) class UltrasonicSensor (threading. Thread): def _init _ (self, socket): threading. Thread._ init _ (self) self.socket = socket def run (ise): try: last_reading = 0 interval = 5000 while True: if current_milli_time ()> last_reading + interval: dist = self.distance () print ("Measured Distance = %.1f cm" % dist) DataRepository. insert_proximity (dist) data_prox = DataRepository.get_data_sensor (1) historyId = data_prox ["SensorsHistory"] prox = data_prox ["value"] actionTime = data_prox ["actionTime"] self.socket.emit ('data_proximity', {"id": historyId, "Proximity": prox, "Time": DataRepository.serializeDateTime (actionTime)}) last_reading = current_milli_time (), välja arvatud erand, näiteks ex: print (ex) de f kaugus (ise): # määrake käivitaja väärtuseks HIGH GPIO. väljund (GPIO_Trig, True) # määrake käivitaja pärast 0,01 ms väärtuseks LOW time.sleep (0,00001) GPIO.output (GPIO_Trig, False) StartTime = time.time () StopTime = time.time () # save StartTime while GPIO.input (GPIO_Echo) == 0: StartTime = time.time () # saabumisaja salvestamine GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # ajavahe alguse ja saabumise vahel TimeElapsed = StopTime - StartTime # korrutatakse helikiirusega (34300 cm / s) # ja jagatakse 2 -ga, sest kaugus sinna ja tagasi = (TimeElapsed * 34300) / 2 tagasisõidu kaugus
Samm: samm -mootorite kodeerimine
RPi. GPIO importimine GPIO -ks Impordi aja importimise lõimimine GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) control_pins = [12, 16, 20, 21] pin in control_pins: GPIO.setup (pin, GPIO. OUT) GPIO.väljund (pin, 0) halfstep_seq =
See kood on teise samm -mootori jaoks korduvkasutatav, määrake lihtsalt juhtnuppude numbrid vastavatele tihvtidele ja nimetage klass ümber StepperWateriks:
Samm: LCD -ekraani kodeerimine
Palju koodi, kuid oleme peaaegu valmis.
LCD -klass kuulub faili LCD.py
abistajatelt. LCD impordi LCD
E = 26 RS = 25 D0 = 19 D1 = 13 D2 = 24 D3 = 22 D4 = 23 D5 = 8 D6 = 7 D7 = 10 lcd = LCD (E, RS, [D0, D1, D2, D3, D4, D5, D6, D7]) klass LCD Kirjutage: def sõnum (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') v.a.: print ("tõrge LCDWrite")
9. samm: lõpp
lõpptulemus: kuidas me selle koostasime ja kuidas see lõppes.
Soovitan:
DIY automaatne kätepuhastusvahendi dosaator: 6 sammu
DIY automaatne kätepuhastusvahendi dosaator: Selles projektis ehitame automaatse käte desinfitseerimisdosaatori. See projekt kasutab Arduino, ultraheli andurit, veepumpa ja käte desinfitseerimisvahendit. Käte olemasolu kontrollimiseks desinfitseerimismasina väljalaskeava all kasutatakse ultrahelisensorit
Automaatne alkoholi dosaator Arduinoga: 6 sammu
Automaatne alkoholi dosaator Arduinoga: see arduino projekt juhendab teid automaatse alkoholiautomaadi valmistamisel. Alkoholi saamiseks ei pea kasutaja midagi puudutama, tulge lihtsalt ultrahelianduri lähedale, alkohol surutakse välja, seejärel esitatakse helifail, et teavitada kasutajat, et ta peaks hoidma
Automaatne kassitoidu dosaator: 7 sammu (piltidega)
Automaatne kassitoidu dosaator: kui te ei kontrolli oma toidu kogust, mida teie kass sööb, võib see põhjustada ülesöömist ja ülekaalulisust. See kehtib eriti siis, kui olete kodust eemal ja jätate kassile lisatoitu oma ajakava järgi tarbimiseks. Muul ajal võite
Pillide automaatne dosaator: 10 sammu (piltidega)
Pillide automaatne dosaator: oleme Brüsseli tehnikateaduskonna (lühidalt " Bruface ") esimesed magistriõppe üliõpilased. See on kahe Brüsseli kesklinnas asuva ülikooli algatus: Université Libre de Bruxelles (UL
Pillide automaatne dosaator: Arjan Westi projekt: 7 sammu (piltidega)
Pillide automaatne dosaator: Arjan Westi projekt: Tere, selles juhendavas juhendis aitan teil valmistada pilliümbrise, mis annab kasutajale teada, millal ta peab pille võtma ja milliseid tablette võtma. See juhtum tuleb koos piezzobuzzeriga, mis teavitab inimest, kui on aeg võtta pill ja 12 LED -i