Tartalomjegyzék:

AUTOMATIKUS Háziállat -adagoló: 9 lépés
AUTOMATIKUS Háziállat -adagoló: 9 lépés

Videó: AUTOMATIKUS Háziállat -adagoló: 9 lépés

Videó: AUTOMATIKUS Háziállat -adagoló: 9 lépés
Videó: 08 - Az automatikus kitöltés 2024, Június
Anonim
AUTOMATIKUS Háziállat -étel adagoló
AUTOMATIKUS Háziállat -étel adagoló

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

Vezeték
Vezeték
Vezeték
Vezeték

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

Használja a terhelési cellát
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

Normalizált adatbázis
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ége
Vége
Vége
Vége

végeredmény: hogyan rajzoltuk meg, és hogyan lett a vége.

Ajánlott: