Cuprins:

DISTRIBUITOR AUTOMAT DE ALIMENTE PENTRU ANIMALE PENTRU ANIMALE PENTRU ANIMALE: 9 pași
DISTRIBUITOR AUTOMAT DE ALIMENTE PENTRU ANIMALE PENTRU ANIMALE PENTRU ANIMALE: 9 pași

Video: DISTRIBUITOR AUTOMAT DE ALIMENTE PENTRU ANIMALE PENTRU ANIMALE PENTRU ANIMALE: 9 pași

Video: DISTRIBUITOR AUTOMAT DE ALIMENTE PENTRU ANIMALE PENTRU ANIMALE PENTRU ANIMALE: 9 pași
Video: Am fost la Agroland MEGA să cumpăr hrănitori, adăpători, vitamine și hrană pentru animale 2024, Septembrie
Anonim
DISTRIBUITOR AUTOMAT DE ALIMENTE PENTRU ANIMALE PENTRU ANIMALE PENTRU ANIMALE
DISTRIBUITOR AUTOMAT DE ALIMENTE PENTRU ANIMALE PENTRU ANIMALE PENTRU ANIMALE

Ai simțit vreodată că ai pierdut prea mult timp hrănindu-ți animalul de companie? A trebuit vreodată să suni pe cineva să-ți hrănească animalele de companie în timp ce erai în vacanță? Am încercat să rezolv aceste două probleme cu proiectul meu actual de școală: Petfeed!

Provizii

Raspberry Pi 3b

Celulă de încărcare a barei (10 kg)

HX711 Amplificator de celule de încărcare

Senzor nivel apă (https://www.dfrobot.com/product-1493.html)

Senzor de proximitate cu ultrasunete

LCD cu 16 pini

2x motor pas cu pas 28byj-48

2x driver motor pas cu pas ULN2003

Pasul 1: Cablare

Cablare
Cablare
Cablare
Cablare

multe cabluri aici. Scoateți cablurile jumper și începeți să fixați!

Pasul 2: Faceți celula de încărcare utilizabilă

Faceți celula de încărcare utilizabilă
Faceți celula de încărcare utilizabilă

pentru a folosi celula de încărcare, trebuie mai întâi să o atașăm la două farfurii: o farfurie de jos și o farfurie pe care ne vom cântări mâncarea.

Șuruburile de care aveți nevoie sunt o pereche de șuruburi M4 cu șuruburi potrivite și o pereche de șuruburi M5 cu șuruburi potrivite. Am folosit un burghiu mic pentru a face găurile.

(pic:

Pasul 3: Baza de date normalizată

Baza de date normalizată
Baza de date normalizată

datele de la senzorii noștri trebuie să fie salvate într-o bază de date. Pentru ca fișierele python să se conecteze la baza de date: consultați mai jos.

atunci aveți nevoie și de un fișier de configurare:

[connector_python] user = * yourusername * host = 127.0.0.1 #if port local = 3306 password = * yourpassword * database = * yourdb * [application_config] driver = 'SQL Server'

Pasul 4: Codificarea celulei de încărcare

import RPi. GPIO ca GPIO import filetare timp de import din hx711 import HX711 din helpers.stepperFood import StepperFood din helpers. LCDWrite import LCDWrite din depozite. DataRepository import DataRepository

După importarea tuturor bibliotecilor noastre (rețineți, folosim Biblioteca HX711 pentru a conduce celula de încărcare) putem începe să scriem codul nostru real

TARRA_CONSTANT = 80600

GRAM_CONSTANT = 101

Pentru a afla constantele noastre, setați mai întâi TARRA_CONSTANT = 0 și GRAM_CONSTANT = 1.

În continuare, trebuie să aflăm valoarea pe care o citește celula noastră de încărcare atunci când nu se cântărește nimic. Această valoare va fi TARRA_CONSTANT.

În ceea ce privește GRAM_CONSTANT, pur și simplu luați un obiect despre care știți greutatea (am folosit un pachet de spaghete), cântăriți-l și împărțiți citirea celulei de încărcare cu greutatea reală a obiectului. Pentru mine a fost 101.

clasa LoadCell (threading. Thread):

def _init _ (self, socket, lcd): threading. Thread._ init _ (self) self.hx711 = HX711 (dout_pin = 5, pd_sck_pin = 6, channel = 'A', gain = 64) self.socket = socket self.lcd = lcd

aici inițializăm clasa LoadCell și mapăm pinii.

def run (auto):

try: while True: self.hx711.reset () # Înainte de a începe, resetați HX711 (nu este obligatoriu) mesures_avg = sum (self.hx711.get_raw_data ()) / 5 weight = round ((mesures_avg - TARRA_CONSTANT) / GRAM_CONSTANT, 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) cu excepția excepției ca e: print („Eroare la cântărire” + str (e))

Pasul 5: Codificarea senzorului de apă

import time import threading from reposities. DataRepository import DataRepository from RPi import GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Water = 18 GPIO.setup (GPIO_Water, GPIO. IN) clasa WaterSensor (threading. Thread): def _init_ 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 = water [" 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 "] if value == "0": value = "te weinig water" else: value = "genoeg water" actionTime = data_water ["actionTime"] self.socket.emit ('data_water', {"id": historyId, "value": value, "Time": DataRepository.serializeDateTime (actionTime), "action": action}) time.sleep (5) exceptie Exception as ex: print (ex) print ('error bij watersensor') def is_water (self): status = GPIO.input (GPIO_Wate r) if self.vorige_status == 0 and 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 and status == 0: print ('water weg') sensorData = {"status": status, "action": "water weg"} self.vorige_status = status status = GPIO.input (GPIO_Water) dacă self.vorige_status == 0 și status == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} return sensorData

Pasul 6: Codificarea senzorului de proximitate

import timp import filare din depozite. DataRepository import DataRepository din RPi import GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig, GPIO. OUT) GPIO.setup (GPIO_Echo, GPIO. 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 (auto): try: last_reading = 0 interval = 5000 while True: if current_milli_time ()> last_reading + interval: dist = self.distance () print ("Distanță măsurată =%.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 () cu excepția Exception as ex: print (ex) de f distanță (auto): # set Trigger la HIGH GPIO.output (GPIO_Trig, True) # set Trigger după 0,01ms la 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 () # save time of arrival while GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # diferența de timp între start și sosire TimeElapsed = StopTime - StartTime # multiplicați cu viteza sonică (34300 cm / s) # și împărțiți la 2, deoarece distanța dintre spate și spate = (TimeElapsed * 34300) / 2 distanță de retur

Pasul 7: Codificarea motoarelor pas cu pas

import RPi. GPIO ca GPIO import timp filetare GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) control_pins = [12, 16, 20, 21] pentru pin în control_pins: GPIO.setup (pin, GPIO. OUT) GPIO.output (pin, 0) halfstep_seq =

Acest cod este reutilizabil pentru celălalt motor pas cu pas, pur și simplu setați numerele pinului de control la pinii lor respectivi și redenumiți clasa la StepperWater:

Pasul 8: Codificarea ecranului LCD

O mulțime de cod, dar aproape am terminat.

Clasa LCD este inclusă ca fișier LCD.py

de la ajutoare. LCD de import 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]) clasa LCDWrite: mesaj def (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') cu excepția: print ("eroare LCDWrite")

Pasul 9: Sfârșitul

Sfârșitul
Sfârșitul
Sfârșitul
Sfârșitul

rezultatul final: cum am elaborat-o vs. cum a ajuns.

Recomandat: