Satura rādītājs:

AUTOMĀTISKAIS MĀJDARBĪBAS PĀRTIKAS DOSERIS: 9 soļi
AUTOMĀTISKAIS MĀJDARBĪBAS PĀRTIKAS DOSERIS: 9 soļi

Video: AUTOMĀTISKAIS MĀJDARBĪBAS PĀRTIKAS DOSERIS: 9 soļi

Video: AUTOMĀTISKAIS MĀJDARBĪBAS PĀRTIKAS DOSERIS: 9 soļi
Video: 7. Automātiskais satura rādītājs un stili MS Word 2024, Novembris
Anonim
AUTOMĀTISKAIS MĀJDARBĪBAS PĀRTIKAS DOSERIS
AUTOMĀTISKAIS MĀJDARBĪBAS PĀRTIKAS DOSERIS

Vai jums kādreiz šķita, ka tērējat pārāk daudz laika sava mājdzīvnieka barošanai? Vai jums kādreiz brīvdienās bija jāzvana kādam, lai pabarotu jūsu mājdzīvniekus? Esmu mēģinājis novērst abas šīs problēmas ar savu pašreizējo skolas projektu: Petfeed!

Piegādes

Raspberry Pi 3b

Stieņa slodzes šūna (10 kg)

HX711 slodzes šūnu pastiprinātājs

Ūdens līmeņa sensors (https://www.dfrobot.com/product-1493.html)

Ultraskaņas tuvuma sensors

LCD 16 tapas

2x pakāpju motors 28byj-48

2x pakāpju motora vadītājs ULN2003

1. solis: Elektroinstalācija

Elektroinstalācija
Elektroinstalācija
Elektroinstalācija
Elektroinstalācija

šeit ir daudz kabeļu. Izvelciet džemperu kabeļus un sāciet piespraust!

2. darbība. Padariet savu slodzes šūnu lietojamu

Padariet savu slodzes šūnu izmantojamu
Padariet savu slodzes šūnu izmantojamu

lai izmantotu slodzes mērītāju, mums tas vispirms jāpiestiprina pie divām plāksnēm: apakšējās plāksnes un plāksnes, uz kuras mēs nosvērsim savu ēdienu.

Nepieciešamās skrūves ir pāris M4 skrūves ar atbilstošām skrūvēm un pāris M5 skrūves ar atbilstošām skrūvēm. Lai izveidotu caurumus, es izmantoju nelielu urbi.

(attēls:

3. darbība: normalizēta datu bāze

Normalizēta datu bāze
Normalizēta datu bāze

dati no mūsu sensoriem ir jāsaglabā datu bāzē. Lai python faili izveidotu savienojumu ar datu bāzi: skatiet zemāk.

tad jums ir nepieciešams arī konfigurācijas fails:

[savienotāja_python] lietotājs = * jūsu lietotājvārds * saimniekdators = 127.0.0.1 #ja vietējais ports = 3306 parole = * jūsu parole * datu bāze = * jūsu disks * [lietojumprogrammas_konfigūra] draiveris = 'SQL serveris'

4. solis: slodzes šūnas kodēšana

importēt RPi. GPIO kā GPIO importēt pavedienu importēšanas laiku no hx711 importēt HX711 no helperiem. stepperFood importēt StepperFood no palīgiem. LCD rakstīt importēt LCD rakstīt no krātuvēm. DataRepository importēt DataRepository

Pēc visu mūsu bibliotēku importēšanas (ņemiet vērā, ka slodzes šūnas vadīšanai izmantojam HX711 bibliotēku), mēs varam sākt rakstīt savu faktisko kodu

TARRA_CONSTANT = 80600

GRAM_KONSTANTS = 101

Lai uzzinātu mūsu konstantes, vispirms iestatiet TARRA_CONSTANT = 0 un GRAM_CONSTANT = 1.

Tālāk mums jānoskaidro vērtība, ko nolasa mūsu slodzes mērītājs, kad nekas netiek nosvērts. Šī vērtība būs TARRA_CONSTANT.

Kas attiecas uz GRAM_CONSTANT, vienkārši paņemiet objektu, kura svars jums ir zināms (es izmantoju spageti iepakojumu), nosveriet to un sadaliet slodzes elementa rādījumu ar faktisko objekta svaru. Man tas bija 101.

klases LoadCell (vītņošana. pavediens):

def _init _ (self, socket, lcd): vītņošana. Vītne._ init _ (self) self.hx711 = HX711 (dout_pin = 5, pd_sck_pin = 6, channel = 'A', gain = 64) self.socket = socket self.lcd = LCD

šeit mēs inicializējam LoadCell klasi un kartējam tapas.

def run (self):

try: while True: self.hx711.reset () # Pirms sākam, atiestatiet HX711 (nav obligāti) 0) print ("svars: {0}". Formāts (svars)) 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), izņemot izņēmumu kā e: print ("Kļūda svēršanā" + str. E))

5. darbība: ūdens sensora kodēšana

importēt laikaimportēšanas pavedienus no repozitorijiem. 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 = ūdens [" statuss "] darbība = ūdens [" darbība "] DataRepository.insert_water (str (statuss), darbība) data_water = DataRepository.get_data_sensor (2) historyId = data_water [" SensorsHistory "] value = data_water [" value "], ja vērtība == "0": value = "te weinig water" else: value = "genoeg water" actionTime = data_water ["actionTime"] self.socket.emit ('data_water', {"id": historyId ", value": "Laiks": DataRepository.serializeDateTime (actionTime), "action": action}) time.sleep (5), izņemot izņēmumu, piemēram, piemēram: print (ex) print ('kļūda pēc densensor') def is_water (self): status = GPIO.input (GPIO_Wate r) ja self.vorige_status == 0 un statuss == 1: print ('water gedetecteerd') sensorData = {"status": status, "action": "water gedetecteerd"} self.vorige_status = statusa statuss = GPIO.input (GPIO_Water), ja self.vorige_status == 1 un statuss == 1: print ('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input (GPIO_Water) if self.vorige_status == 1 un status == 0: print ('water weg') sensorData = {"status": status, "action": "water weg"} self.vorige_status = statusa statuss = GPIO.input (GPIO_Water) if self.vorige_status == 0 un status == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} return sensorData

6. darbība. Tuvuma sensora kodēšana

importēt laikuimportēt pavedienus no repozitorijiem.. 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 ("Izmērītais attālums = %.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 () izņemot izņēmumu, piemēram, ex: print (ex) de f distance (self): # iestatīt Trigger uz HIGH GPIO.output (GPIO_Trig, True) # iestatīt Trigger pēc 0.01ms uz 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 () # ietaupīt ierašanās laiku, kamēr GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # laika starpība starp sākuma un ierašanās laiku TimeElapsed = StopTime - StartTime # reiziniet ar skaņas ātrumu (34300 cm / s) # un daliet ar 2, jo attālums turp un atpakaļ = (TimeElapsed * 34300) / 2 atgriešanās attālums

7. solis: soļu motoru kodēšana

importēt RPi. GPIO kā GPIOimportēt laika importēšanas pavedienu GPIO.setmode (GPIO. BCM) GPIO.setwarnings (nepatiess) control_pins = [12, 16, 20, 21] tapai in control_pins: GPIO.setup (pin, GPIO. OUT) GPIO.izvade (pin, 0) halfstep_seq =

Šis kods ir atkārtoti lietojams otram pakāpju motoram, vienkārši iestatiet vadības tapu numurus uz attiecīgajām tapām un pārdēvējiet klasi par StepperWater:

8. solis: LCD kodēšana

Daudz kodu, bet mēs esam gandrīz pabeiguši.

LCD klase ir iekļauta kā fails LCD.py

no palīgiem. LCD importa 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]) klases LCD Rakstīt: def ziņojums (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1'), izņemot: drukāt ("kļūda LCDWrite")

9. solis: beigas

Beigas
Beigas
Beigas
Beigas

gala rezultāts: kā mēs to sastādījām, salīdzinot ar to, kā tas beidzās.

Ieteicams: