Cuprins:
- Provizii
- Pasul 1: Cablare
- Pasul 2: Faceți celula de încărcare utilizabilă
- Pasul 3: Baza de date normalizată
- Pasul 4: Codificarea celulei de încărcare
- Pasul 5: Codificarea senzorului de apă
- Pasul 6: Codificarea senzorului de proximitate
- Pasul 7: Codificarea motoarelor pas cu pas
- Pasul 8: Codificarea ecranului LCD
- Pasul 9: Sfârșitul
Video: DISTRIBUITOR AUTOMAT DE ALIMENTE PENTRU ANIMALE PENTRU ANIMALE PENTRU ANIMALE: 9 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:41
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
multe cabluri aici. Scoateți cablurile jumper și începeți să fixați!
Pasul 2: 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ă
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
rezultatul final: cum am elaborat-o vs. cum a ajuns.
Recomandat:
Distribuitor de alimente pentru animale de companie: 3 pași
Pet Food Dispenser: Pentru iubitorii de mascotas, este un proiect care poate fi foarte util! Un alimentator automat care vă permite să observați care este pesajul mâncării, și numai este necesar ca oprimarea unui buton
Distribuitor automat cu scară pentru confirmarea obiectului (Raspberry Pi): 5 pași
Distribuitor automat cu scară pentru confirmarea obiectului (Raspberry Pi): Bun venit coleg producător, pentru un proiect școlar am decis să fac un distribuitor automat de gustări. Misiunea noastră a fost de a crea un dispozitiv recreabil care să utilizeze cel puțin 3 senzori și 1 actuator. M-am dus să fac un automat automat parțial pentru că aveam acces la unele
Proiect Arduino: Distribuitor de alimente pentru pisici: 6 pași
Proiectul Arduino: Dispenser de hrană pentru pisici: Acest instructable a fost creat pentru a îndeplini cerințele proiectului Makecourse de la Universitatea din Florida de Sud (www.makecourse.com)
Catapulta automată pentru aruncarea de alimente pentru animale de companie (câine, pisică, pui, etc.), aruncarea de bile și multe altele !: 4 pași (cu imagini)
Catapulta automată pentru aruncarea de alimente pentru animale de companie (câine, pisică, pui, etc.), aruncarea de bile și multe altele!: Bună ziua și bine ați venit la primul meu instructabil! Am conceput modalități de a încetini acest lucru, de la mingi cu mâncarea înăuntru, până la aruncarea peste tot în curtea din spate. Uimitor, ea este
Distribuitor alimentat cu alimente pentru câini Arduino: 10 pași (cu imagini)
Dispenser alimentat cu alimente pentru câini Arduino: Dacă casa ta este asemănătoare cu a mea, unele sarcini pot fi uitate atunci când te grăbești. Nu lăsați animalul dvs. de companie să fie uitat! Acest distribuitor automat de alimente pentru câini folosește un Arduino pentru a livra cantitatea potrivită de croșetat la momentul potrivit. Toate pa