Indholdsfortegnelse:

AUTOMATISK FODDISPENSOR: 9 trin
AUTOMATISK FODDISPENSOR: 9 trin

Video: AUTOMATISK FODDISPENSOR: 9 trin

Video: AUTOMATISK FODDISPENSOR: 9 trin
Video: Molo - Automatisk (Lyrics) 2024, Juni
Anonim
AUTOMATISK PET -FODDISPENSER
AUTOMATISK PET -FODDISPENSER

Har du nogensinde haft lyst til at spilde for meget tid på at fodre dit kæledyr? Har du nogensinde været nødt til at ringe til nogen for at fodre dine kæledyr, mens du var på ferie? Jeg har forsøgt at løse begge disse problemer med mit nuværende skoleprojekt: Petfeed!

Forbrugsvarer

Raspberry Pi 3b

Stanglastcelle (10 kg)

HX711 belastningscelleforstærker

Vandstandssensor (https://www.dfrobot.com/product-1493.html)

Ultralyd nærhedssensor

LCD 16-pins

2x trinmotor 28byj-48

2x trinmotor driver ULN2003

Trin 1: Ledningsføring

Ledninger
Ledninger
Ledninger
Ledninger

masser af kabelføring her. Tag dine jumperkabler ud, og begynd at klemme!

Trin 2: Gør din vejecelle brugbar

Gør din vejecelle brugbar
Gør din vejecelle brugbar

For at bruge vejecellen skal vi først fastgøre den til to tallerkener: en bundplade og en tallerken, som vi vil veje vores mad på.

De skruer, du har brug for, er et par M4 -skruer med matchende bolte og et par M5 -skruer med matchende bolte. Jeg brugte en lille boremaskine til at lave hullerne.

(billede:

Trin 3: Normaliseret database

Normaliseret database
Normaliseret database

data fra vores sensorer skal gemmes i en database. For at få forbindelse til pythonfilerne til databasen: se nedenfor.

så har du også brug for en konfigurationsfil:

[connector_python] bruger = * ditbrugernavn * host = 127.0.0.1 #if lokal port = 3306 adgangskode = * dit kodeord * database = * yourdb * [application_config] driver = 'SQL Server'

Trin 4: Kodning af vejecellen

import RPi. GPIO som GPIOimporttråd importtid fra hx711 import HX711 fra helpers.stepperFood import Stepper Food fra helpers. LCDWrite import LCDWrite fra depoter. DataRepository import DataRepository

Efter at have importeret alle vores biblioteker (Bemærk, vi bruger HX711 -biblioteket til at drive vejecellen) kan vi begynde at skrive vores faktiske kode

TARRA_CONSTANT = 80600

GRAM_CONSTANT = 101

For at finde ud af vores konstanter skal du først indstille TARRA_CONSTANT = 0 og GRAM_CONSTANT = 1.

Dernæst skal vi finde ud af den værdi, vores vejecelle læser, når der ikke vejes noget. Denne værdi vil være TARRA_CONSTANT.

Hvad angår GRAM_CONSTANT, skal du blot tage et objekt, du kender vægten af (jeg brugte en pakke spaghetti), veje det og opdele læsningen af vejecellerne med objektets faktiske vægt. For mig var dette 101.

klasse 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

her initialiserer vi LoadCell -klassen og kortlægger stifterne.

def løb (selv):

prøv: mens True: self.hx711.reset () # Inden vi starter, skal du nulstille HX711 (ikke obligatorisk) Measures_avg = sum (self.hx711.get_raw_data ()) / 5 weight = round ((Measures_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 skulle emitten") writeWeight = "weight:" + str (db_weight) msg = "PETFEED" LCDWrite.message () if int (db_weight [:-2]) <= 100: StepperFood.run () time.sleep (20) undtagen Undtagelse som e: print ("Fejl ved vejning" + str (e))

Trin 5: Kodning af vandføleren

import timeimport threading from repositories. DataRepository import DataRepository from RPi import GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Water = 18 GPIO.setup (GPIO_Water, GPIO. IN) class WaterSensor (threading. Thread): def_ 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 "] handling = vand [" handling "] DataRepository.insert_water (str (status), handling) data_water = DataRepository.get_data_sensor (2) historyId = data_water [" SensorsHistory "] value = data_water [" værdi "] hvis værdi == "0": value = "te weinig water" else: value = "nok vand" actionTime = data_water ["actionTime"] self.socket.emit ('data_water', {"id": historyId, "value": value, "Time": DataRepository.serializeDateTime (actionTime), "action": action}) time.sleep (5) undtagen Undtagelse som 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) hvis self.vorige_status == 1 og status == 1: print ('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input (GPIO_Water) if self.vorige_status == 1 og status == 0: print ('vand weg') sensorData = {"status": status, "action": "vand weg"} self.vorige_status = status status = GPIO.input (GPIO_Water) hvis self.vorige_status == 0 og status == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} returner sensorData

Trin 6: Kodning af nærhedssensor

import timeimport threading from repositories. DataRepository import DataRepository from 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_cho. 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 (self): prøv: last_reading = 0 interval = 5000 mens 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 () undtagen Undtagelse som ex: print (ex) de f afstand (selv): # sæt Trigger til HIGH GPIO.output (GPIO_Trig, True) # sæt Trigger efter 0,01 ms til LOW time.sleep (0,00001) GPIO.output (GPIO_Trig, False) StartTime = time.time () StopTime = time.time () # gem StartTime mens GPIO.input (GPIO_Echo) == 0: StartTime = time.time () # gem ankomsttid, mens GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # tidsforskel mellem start og ankomst TimeElapsed = StopTime - StartTime # multipliceres med sonisk hastighed (34300 cm / s) # og divideres med 2, fordi der og tilbage afstand = (TimeElapsed * 34300) / 2 returafstand

Trin 7: Kodning af trinmotorer

importer RPi. GPIO som GPIOimport tid import trådning GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) control_pins = [12, 16, 20, 21] for pin i control_pins: GPIO.setup (pin, GPIO. OUT) GPIO.output (pin, 0) halfstep_seq =

Denne kode kan genanvendes til den anden stepper motor, bare indstil kontrol pin numre til deres repective pins og omdøb klassen til StepperWater:

Trin 8: Kodning af LCD -skærmen

Masser af kode, men vi er næsten færdige.

LCD -klassen er inkluderet som fil LCD.py

fra helpers. LCD 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]) klasse LCDWrite: def -besked (msg): try: print ("prøv") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') undtagen: print ("fejl LCDWrite")

Trin 9: Slutningen

Slutningen
Slutningen
Slutningen
Slutningen

slutresultat: hvordan vi tegnede det vs. hvordan det endte.

Anbefalede: