Sisällysluettelo:

AUTOMAATTINEN Lemmikkieläinten ruokien annostelija: 9 vaihetta
AUTOMAATTINEN Lemmikkieläinten ruokien annostelija: 9 vaihetta

Video: AUTOMAATTINEN Lemmikkieläinten ruokien annostelija: 9 vaihetta

Video: AUTOMAATTINEN Lemmikkieläinten ruokien annostelija: 9 vaihetta
Video: Zeitgeist: Moving Forward (2011) 2024, Kesäkuu
Anonim
AUTOMAATTINEN Lemmikkieläinten ruokien annostelija
AUTOMAATTINEN Lemmikkieläinten ruokien annostelija

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

Johdotus
Johdotus
Johdotus
Johdotus

paljon kaapelointia täällä. Ota hyppyjohtimet irti ja aloita kiinnitys!

Vaihe 2: Tee lataussolustasi käyttökelpoinen

Tee punnituskennosta käyttökelpoinen
Tee punnituskennosta 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

Normalisoitu tietokanta
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

Loppu
Loppu
Loppu
Loppu

lopputulos: miten me teimme sen ja miten se päättyi.

Suositeltava: