Indholdsfortegnelse:
- Forbrugsvarer
- Trin 1: Ledningsføring
- Trin 2: Gør din vejecelle brugbar
- Trin 3: Normaliseret database
- Trin 4: Kodning af vejecellen
- Trin 5: Kodning af vandføleren
- Trin 6: Kodning af nærhedssensor
- Trin 7: Kodning af trinmotorer
- Trin 8: Kodning af LCD -skærmen
- Trin 9: Slutningen
Video: AUTOMATISK FODDISPENSOR: 9 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:25
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
masser af kabelføring her. Tag dine jumperkabler ud, og begynd at klemme!
Trin 2: 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
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
slutresultat: hvordan vi tegnede det vs. hvordan det endte.
Anbefalede:
Automatisk håndrensemiddel: 8 trin
Automatisk håndrensemiddel: COVID-19-pandemien er blevet noget, som offentligheden har hørt meget ofte i løbet af 2020. Enhver borger, der hører ordet "COVID-19", vil straks tænke på ordet "Farligt", "Dødeligt", "Hold rent”Og andre ord. Denne COVID-19 har også
DIY automatisk håndrensemiddel: 6 trin
DIY automatisk hånddesinfektionsdispenser: I dette projekt bygger vi en automatisk håndrensemiddel. Dette projekt vil bruge Arduino, ultralydssensor, vandpumpe og håndrensemiddel. En ultralydssensor bruges til at kontrollere tilstedeværelsen af hænder under stikkontakten til desinfektionsmaskinen
Automatisk gelalkoholautomat med Esp32: 9 trin
Automatisk gelalkoholautomat med Esp32: I vejledningen vil vi se, hvordan man laver en komplet prototype, til at samle en automatisk gelalkooldispenser med esp32, det vil omfatte trinvis montering, elektronisk kredsløb og også kildekoden forklaret trin for trin trin
Automatisk hundefoder !!: 4 trin
Automatisk hundefoder !!: Let, hjælpsom og sund
Automatisk WiFi -planteføder med reservoir - Indendørs/udendørs dyrkningssætning - Vandplanter automatisk med fjernovervågning: 21 trin
Automatisk WiFi -planteføder med reservoir - Indendørs/udendørs dyrkningssætning - Vandplanter automatisk med fjernovervågning: I denne vejledning vil vi demonstrere, hvordan du konfigurerer et brugerdefineret indendørs/udendørs planteføderanlæg, der automatisk vanner planter og kan overvåges eksternt ved hjælp af Adosia -platformen