Sisällysluettelo:
- Tarvikkeet
- Vaihe 1: Johdotus
- Vaihe 2: Tee lataussolustasi käyttökelpoinen
- Vaihe 3: Normalisoitu tietokanta
- Vaihe 4: Kuormituskennon koodaus
- Vaihe 5: Vesianturin koodaus
- Vaihe 6: Läheisyysanturin koodaus
- Vaihe 7: Askelmoottorien koodaus
- Vaihe 8: Nestekidenäytön koodaus
- Vaihe 9: Loppu
Video: AUTOMAATTINEN Lemmikkieläinten ruokien annostelija: 9 vaihetta
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 08:59
Oletko koskaan tuntenut, että tuhlaat liikaa aikaa lemmikkisi ruokintaan? Oletko koskaan joutunut soittamaan jollekin ruokkimaan lemmikkejäsi lomalla ollessasi? Olen yrittänyt korjata molemmat ongelmat nykyisellä kouluprojektillani: Petfeed!
Tarvikkeet
Vadelma Pi 3b
Tangokuormitus (10 kg)
HX711 Load Cell -vahvistin
Vesitason anturi (https://www.dfrobot.com/product-1493.html)
Ultraääni -läheisyysanturi
LCD 16-nastainen
2x askelmoottori 28byj-48
2x askelmoottorin kuljettaja ULN2003
Vaihe 1: Johdotus
paljon kaapelointia täällä. Ota hyppyjohtimet irti ja aloita kiinnitys!
Vaihe 2: Tee lataussolustasi käyttökelpoinen
käyttääksesi punnitusanturia, meidän on ensin kiinnitettävä se kahteen lautanen: pohjalevyyn ja levyyn, jolla punnitsemme ruokamme.
Tarvittavat ruuvit ovat pari M4 -ruuvia, joissa on vastaavat pultit, ja pari M5 -ruuvia, joissa on vastaavat pultit. Reikien tekemiseen käytin pientä poraa.
(kuva:
Vaihe 3: Normalisoitu tietokanta
anturien tiedot on tallennettava tietokantaan. Python -tiedostojen yhdistäminen tietokantaan: katso alla.
sitten tarvitset myös kokoonpanotiedoston:
[connector_python] user = * käyttäjänimesi * isäntä = 127.0.0.1 #if local port = 3306 password = * yourpassword * database = * yourdb * [application_config] driver = 'SQL Server'
Vaihe 4: Kuormituskennon koodaus
tuoda RPi. GPIO GPIO: na tuoda pujotusajan tuonnin hx711: stä tuoda HX711: stä helpers.stepperFoodista tuoda StepperFood helpersista.
Kun olemme tuoneet kaikki kirjastomme (huomaa, käytämme HX711 -kirjastoa ohjaamaan kuormituskennoa), voimme alkaa kirjoittaa todellista koodiamme
TARRA_CONSTANT = 80600
GRAM_CONSTANT = 101
Selvittääksemme vakiomme, aseta ensin TARRA_CONSTANT = 0 ja GRAM_CONSTANT = 1.
Seuraavaksi meidän on selvitettävä arvo, jonka punnituskennomme lukee, kun mitään ei punnita. Tämä arvo on TARRA_CONSTANT.
Mitä tulee GRAM_CONSTANT: iin, ota vain esine, jonka paino tiedät (käytin spagettipakkausta), punnitse se ja jaa punnituskennon lukema kohteen todellisen painon kanssa. Minulle tämä oli 101.
LoadCell -luokka (kierteitys):
def _init _ (itse, pistorasia, lcd): kierteitys. Lanka._ init _ (itse) self.hx711 = HX711 (dout_pin = 5, pd_sck_pin = 6, channel = 'A', gain = 64) self.socket = socket self.lcd = lcd
tässä alustamme LoadCell -luokan ja kartoitamme nastat.
def run (itse):
try: while True: self.hx711.reset () # Ennen kuin aloitamme, nollaa HX711 (ei pakollinen) 0) print ("weight: {0}". Format (weight)) DataRepository.insert_weight (weight) 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 = "weight:" + str (db_weight) msg = "PETFEED" LCDWrite.message () if int (db_weight [:-2]) <= 100: StepperFood.run () time.sleep (20) paitsi Poikkeus e: print ("Punnitusvirhe" + str (e))
Vaihe 5: Vesianturin koodaus
tuoda aikaimportin säietuotteita arkistoista. self, socket): threading. Thread._ init _ (self) self.socket = socket self.vorige_status = 0 def run (self): try: while True: water = self.is_water () print (water) status = vesi [" status "] action = water [" action "] DataRepository.insert_water (str (status), action) data_water = DataRepository.get_data_sensor (2) historyId = data_water [" SensorsHistory "] value = data_water [" value "] jos arvo == "0": value = "te weinig water" else: value = "genoeg water" actionTime = data_water ["actionTime"] self.socket.emit ('data_water', {"id": historyId, "value": arvo, "Aika": DataRepository.serializeDateTime (actionTime), "action": action}) time.sleep (5) paitsi Poikkeus esim..input (GPIO_Wate r) jos 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
Vaihe 6: Läheisyysanturin koodaus
tuoda aikaimporttiketjutus säilöistä. DataRepository tuoda DataRepository RPi: stä tuoda GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig, GPIO. OUT) GPIO.setup,. 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 = pistorasia def run (itse): 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 () paitsi Poikkeus kuten ex: print (ex) de f etäisyys (itse): # aseta liipaisimen arvoksi HIGH GPIO.output (GPIO_Trig, True) # aseta liipaisin 0,01 ms: n jälkeen 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 () # säästä saapumisaika GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # aikaero alkamisen ja saapumisen välillä TimeElapsed = StopTime - StartTime # kerrotaan ääninopeudella (34300 cm / s) # ja jaetaan 2: lla, koska edestakainen etäisyys = (TimeElapsed * 34300) / 2 paluumatka
Vaihe 7: Askelmoottorien koodaus
tuoda RPi. GPIO GPIO -muotoon tuoda ajan tuontiketju GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) control_pins = [12, 16, 20, 21] pin in control_pins: GPIO.setup (pin, GPIO. OUT) GPIO. output (pin, 0) halfstep_seq =
Tämä koodi on uudelleenkäytettävä toiselle askelmoottorille, aseta vain ohjausnastan numerot vastaaviin nastoihin ja nimeä luokka uudelleen StepperWateriksi:
Vaihe 8: Nestekidenäytön koodaus
Paljon koodia, mutta olemme melkein valmiita.
LCD -luokka sisältyy tiedostoon LCD.py
LCD -tuonti -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]) luokka LCD Kirjoita: def viesti (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') paitsi: tulosta ("virhe LCDWrite")
Vaihe 9: Loppu
lopputulos: miten me teimme sen ja miten se päättyi.
Suositeltava:
DIY automaattinen käsidesin annostelija: 6 vaihetta
DIY automaattinen käsidesin annostelija: Tässä projektissa rakennamme automaattisen käsidesin annostelijan. Tässä projektissa käytetään Arduinoa, ultraäänianturia, vesipumppua ja käsidesiä. Ultraäänianturia käytetään käsien läsnäolon tarkistamiseen desinfiointikoneen ulostulon alla
Lemmikkieläinten ruoan annostelija: 3 vaihetta
Lemmikkieläinten ruoan annostelija: Para los amantes de mascotas, este es un proyecto que les puede ser muy útil! Un alimentador automático que te permite observar cual es el pesaje de la comida, y solo es necesario que oprimas un botón.Un mecanismo sencillo que podrás armar desde tu
DIY Yksinkertaisin automaattinen lemmikkieläinten syöttölaite Arduinolla: 3 vaihetta
DIY Yksinkertaisin automaattinen lemmikkieläinten syöttölaite Arduinolla: Hei lemmikkien ystävät! Me kaikki syvällä sisimmässämme haluamme saada kotoa söpön pennun tai kissanpennun tai luultavasti jopa kalaperheen. Mutta kiireisen elämämme vuoksi epäilemme usein itseämme: 'Pystynkö hoitamaan lemmikkiäni?' Päävastuu
Automaattinen lemmikkieläinten syöttölaite vanhan digitaalisen kellon avulla: 10 vaihetta (kuvilla)
Automaattinen lemmikkieläinten syöttölaite vanhan digitaalisen kellon avulla: Hei, tässä ohjeessa näytän sinulle, kuinka tein automaattisen lemmikkieläinten syöttölaitteen vanhan digitaalisen kellon avulla. Olen myös upottanut videon siitä, miten tein tämän syöttölaitteen. Tämä opettavainen osallistuu PCB -kilpailuun ja suosittelen palvelukseksi
Automaattinen katapultti lemmikkieläinten ruoan (koira, kissa, kana jne.) Heittämiseen, pallojen heittämiseen ja muihin!: 4 vaihetta (kuvilla)
Automaattinen katapultti lemmikkieläinten ruoan (koira, kissa, kana jne.) Heittämiseen, pallojen heittämiseen ja muuhun !: Hei ja tervetuloa ensimmäiseen Instructable -tuotteeseen! Koiramme rakastaa ruokaa, hän syö kirjaimellisesti kaiken muutamassa sekunnissa. Olen keksinyt tapoja hidastaa tätä, palloista, joissa on ruokaa sisällä, heittäen sen koko takapihalle. Hämmästyttävää, hän on