Satura rādītājs:
- Piegādes
- 1. solis: Elektroinstalācija
- 2. darbība. Padariet savu slodzes šūnu lietojamu
- 3. darbība: normalizēta datu bāze
- 4. solis: slodzes šūnas kodēšana
- 5. darbība: ūdens sensora kodēšana
- 6. darbība. Tuvuma sensora kodēšana
- 7. solis: soļu motoru kodēšana
- 8. solis: LCD kodēšana
- 9. solis: beigas
Video: AUTOMĀTISKAIS MĀJDARBĪBAS PĀRTIKAS DOSERIS: 9 soļi
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:51
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
šeit ir daudz kabeļu. Izvelciet džemperu kabeļus un sāciet piespraust!
2. darbība. Padariet savu slodzes šūnu lietojamu
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
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
gala rezultāts: kā mēs to sastādījām, salīdzinot ar to, kā tas beidzās.
Ieteicams:
Arduino mehāniskais pārtikas griezējs: 6 soļi
Arduino mehāniskais pārtikas griezējs: šis ar Arduino darbināmais pārtikas griezējs ir paredzēts, lai palīdzētu jums griezt un sasmalcināt virtuvē. Sākotnēji es ticēju, ka tas spēs sagriezt visus pārtikas produktus, bet es uzzināju, ka mazākā servomotora dēļ tas nespēja izgriezt cauri
Automatizēts pārtikas preču kubs ar MESH IoT blokiem: 4 soļi
Automatizēts pārtikas preču kubs ar MESH IoT blokiem: izveidojiet savu pārtikas preču kubu, izmantojot MESH IoT blokus. Izveidojiet un pārvaldiet automatizētu iepirkumu sarakstu, izmantojot DIY pārtikas preču kubu. Katra kuba puse attēlo jūsu iecienītāko pārtikas preču preci, un jūs varat izsekot un nosūtīt brīdinājumu par iepirkšanos tikai ar uzsitienu vai
POS SISTĒMA VEIKALIEM, PĀRTIKAS UN APKALPOŠANAS CENTRIEM NO EXCEL, izmantojot svītrkodus: 7 soļi
POSISTĒMA VEIKALIEM, PĀRTIKAS PAKALPOJUMU UN APKALPOŠANAS CENTRIEM NO EXCEL Izmantojot svītrkodus: ar šo emuāru es iepazīstinu jūs ar to, kā izveidot vienkāršu POS (tirdzniecības vietu) sistēmu maziem veikaliem, pārtikas preču un pakalpojumu centriem. Izmantojot šo metodi, jūs varat pārvaldīt šādas iespējas bez īpašas programmatūras vai dārgas iekārtas. v Problēma
AUTOMĀTISKAIS PILSĒTU DOSERIS: 14 soļi (ar attēliem)
AUTOMĀTISKAIS PILSĒTU DOSĒTĀJS: tas ir tablešu dozators, kas spēj nodrošināt pacientam pareizo zāļu tablešu daudzumu un veidu. Tabletes dozēšana tiek veikta automātiski pareizajā diennakts laikā, pirms tam tiek parādīts trauksmes signāls. Ja mašīna ir tukša, to ir viegli uzpildīt
Vienkāršs Raspberry Pi kameras slazds, kas izgatavots no pārtikas trauka: 6 soļi (ar attēliem)
Vienkāršs Raspberry Pi kameras slazds, kas izgatavots no pārtikas trauka: " Man šķiet, ka dabiskā pasaule ir lielākais sajūsmas avots, lielākais vizuālā skaistuma avots, lielākais intelektuālās intereses avots. Tas ir lielākais tik daudzu avots dzīvē, kas padara dzīvi dzīvības vērtu. "- D