Tartalomjegyzék:
- Kellékek
- 1. lépés: Kábelezés
- 2. lépés: Használja a terhelési cellát
- 3. lépés: Normalizált adatbázis
- 4. lépés: A terhelési cella kódolása
- 5. lépés: A vízérzékelő kódolása
- 6. lépés: A közelségérzékelő kódolása
- 7. lépés: A léptetőmotorok kódolása
- 8. lépés: Az LCD kódolása
- 9. lépés: A vége
Videó: AUTOMATIKUS Háziállat -adagoló: 9 lépés
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:39
Valaha is úgy érezte, hogy túl sok időt veszteget a kedvence etetésére? Hívott már valakit, hogy megetesse házi kedvenceit nyaralása alatt? Mindkét problémát megpróbáltam kijavítani a jelenlegi iskolai projektemmel: Petfeed!
Kellékek
Raspberry Pi 3b
Bar Load Cell (10 kg)
HX711 Load Cell erősítő
Vízszint érzékelő (https://www.dfrobot.com/product-1493.html)
Ultrahangos közelségérzékelő
16 tűs LCD
2x léptetőmotor 28byj-48
2x léptetőmotoros meghajtó ULN2003
1. lépés: Kábelezés
sok kábelezés van itt. Vegye ki az áthidaló kábeleket, és kezdje el rögzíteni!
2. lépés: Használja a terhelési cellát
a mérőcella használatához először két tányérra kell rögzítenünk: egy alsó tányérra és egy tányérra, amelyen mérni fogjuk ételeinket.
A szükséges csavarok egy pár M4 csavar megfelelő csavarokkal és egy pár M5 csavar megfelelő csavarokkal. Egy kis fúrót használtam a lyukak elkészítéséhez.
(kép:
3. lépés: Normalizált adatbázis
érzékelőink adatait adatbázisba kell menteni. Ahhoz, hogy a python fájlok csatlakozzanak az adatbázishoz: lásd alább.
akkor szüksége van egy konfigurációs fájlra is:
[connector_python] user = * felhasználónév * host = 127.0.0.1 #if local port = 3306 password = * yourpassword * database = * yourdb * [application_config] driver = 'SQL Server'
4. lépés: A terhelési cella kódolása
importálja az RPi. GPIO -t GPIO -ként importálja a szálazás importálási idejét a hx711 -ből importálja a HX711 -et a helpers -ből. stepperFood importálja a StepperFood -ot a helpers -ből.
Az összes könyvtárunk importálása után (ne feledjük, a HX711 könyvtárat használjuk a terhelési cella meghajtására) elkezdhetjük a tényleges kódunk írását
TARRA_CONSTANT = 80600
GRAM_CONSTANT = 101
Az állandók megállapításához először állítsa be a TARRA_CONSTANT = 0 és a GRAM_CONSTANT = 1 értékeket.
Ezután meg kell találnunk azt az értéket, amelyet a mérőcellánk olvas, amikor nincs mérlegelés. Ez az érték TARRA_CONSTANT lesz.
Ami a GRAM_CONSTANT -t illeti, egyszerűen vegyen egy olyan tárgyat, amelynek súlyát ismeri (én egy csomag spagettit használtam), mérje le, és ossza el a mérőcellák leolvasását az objektum tényleges súlyával. Nekem ez volt a 101.
osztály 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
itt inicializáljuk a LoadCell osztályt és leképezzük a csapokat.
def run (ön):
try: while True: self.hx711.reset () # Mielőtt elkezdenénk, állítsuk vissza a HX711 (nem kötelező) méreteket_avg = összeg (self.hx711.get_raw_data ()) / 5 súly = kerek ((intézkedések_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), kivéve e: print ("Hiba a mérlegeléssel" + str (e))
5. lépés: A vízérzékelő kódolása
időimport szálak importálása a tárolókból. 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) állapot = víz [" állapot "] action = water [" action "] DataRepository.insert_water (str (állapot), 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": érték, "Time": DataRepository.serializeDateTime (actionTime), "action": action}) time.sleep (5), kivéve például: print (ex) print ('hiba a vízérzékelő') def is_water (self): status = GPIO.input (GPIO_Wate r) if self.vorige_status == 0 és status == 1: print ('water gedetecteerd') sensorData = {"status": állapot, "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": állapot, "action": "water aanwezig"} status = GPIO.input (GPIO_Water) if self.vorige_status == 1 és állapot == 0: print ('water we') sensorData = {"status": állapot, "action": "water weg"} self.vorige_status = status status = GPIO.input (GPIO_Water) if self.vorige_status == 0 és állapot == 0: print ('startpositie') állapot = GPIO.input (GPIO_Water) sensorData = {"status": állapot, "action": "startpositie"} return sensorData
6. lépés: A közelségérzékelő kódolása
időimport szálak importálása a tárolókból.. 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): try: last_reading = 0 interval = 5000 while True: if current_milli_time ()> last_reading + interval: dist = self.distance () print ("Mért távolság = %.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 () kivéve a kivételt, mint például: print (ex) de f távolság (saját): # állítsa a Triggert HIGH GPIO -ra. kimenet (GPIO_Trig, True) time.time () # save StartTime while GPIO.input (GPIO_Echo) == 0: StartTime = time.time () # mentési érkezési idő, míg GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # időkülönbség a kezdés és az érkezés között
7. lépés: A léptetőmotorok kódolása
importálja az RPi. GPIO -t GPIO -ként importálja az idő behozatali szálazást GPIO.setmode (GPIO. BCM) GPIO.setwarnings (hamis) control_pins = [12, 16, 20, 21] a pin in control_pins: GPIO.setup (pin, GPIO. OUT) GPIO. output (pin, 0) halfstep_seq =
Ez a kód újra használható a másik léptetőmotorhoz, csak állítsa be a vezérlőcsapok számát a megfelelő csapokra, és nevezze át az osztályt StepperWater -re:
8. lépés: Az LCD kódolása
Sok kód, de majdnem kész.
Az LCD osztály LCD.py fájlként szerepel
segítőktől. 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]) class LCDWrite: def message (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') kivéve: print ("hiba LCDWrite")
9. lépés: A vége
végeredmény: hogyan rajzoltuk meg, és hogyan lett a vége.
Ajánlott:
A mozgó OLOID - Más háziállat különböző időkben: 10 lépés (képekkel)
A mozgó OLOID - más háziállat különböző időkben: A korona megváltoztatta az életünket: fizikai távolságot követel meg tőlünk, ami társadalmi távolságtartáshoz vezet. Tehát mi lehet a megoldás? Talán háziállat? De nem, a korona állatokból származik. Mentsük meg magunkat egy újabb Corona 2.0 -tól. De ha nekünk
Ipari erősségű macska (háziállat) etető: 10 lépés
Ipari erősségű macska (háziállat) etető: Egyszerre sok hétig utazom, és vannak ilyen szabadtéri vadmacskáim, amelyeket etetni kell, amíg távol vagyok. Több éve használok az Amazon -tól vásárolt módosított etetőket, amelyeket málna pi számítógéppel vezérelnek. Annak ellenére, hogy az én
IoT lézer háziállat -játék: 5 lépés
IoT lézer háziállat -játék: Időről időre a konyhám egy unatkozó kutya áldozatává válik. Felügyelet nélkül hagyva a szegélyléceket, kutyaágyakat, konyharuhákat, konyhaszekrényeket és a festéket. Annak érdekében, hogy a bábom szórakozzon munka közben, kifejlesztettem egy IoT -t
Alkoholmentesítő háziállat: 6 lépés
Alkoholtisztító háziállat: Az alkoholt tisztító háziállat egy arduino-alapú vonalkövető robot, amelyet interaktív játékra terveztek a tulajdonosával. A robot az útvonal mentén (fekete szalag) mozog egy hurkon. A tulajdonos minden alkalommal egy lövést kezel a háziállattal az útvonalán. Amikor a
Háziállat -etető gép RasPi -vel és táviratbot -tal: 4 lépés (képekkel)
Pet Feeder Machine RasPi -vel és Telegram Bot -tal: Először is tisztáznom kell, hogy ez nem eredeti Idea Mine, csak frissítse és adaptálja a programozási szkripteket a távirattal való működéshez, egy korábbi utasításban találtam, így a hitelek valóban a szerzője. Láthatta a spanyol