Мазмуну:

АВТОМАТТЫК ПЕТ ТАМАКТАРДЫН ДИСПЕНСЕРИ: 9 кадам
АВТОМАТТЫК ПЕТ ТАМАКТАРДЫН ДИСПЕНСЕРИ: 9 кадам

Video: АВТОМАТТЫК ПЕТ ТАМАКТАРДЫН ДИСПЕНСЕРИ: 9 кадам

Video: АВТОМАТТЫК ПЕТ ТАМАКТАРДЫН ДИСПЕНСЕРИ: 9 кадам
Video: Каждый может стать владельцем бара. 🍺🍻🍷🍳🍰 - TAVERN MASTER GamePlay 🎮📱 🇷🇺 2024, Июнь
Anonim
АВТОМАТТЫК ПЕТ АЗЫКТАРДЫН ДИСПЕНСЕРИ
АВТОМАТТЫК ПЕТ АЗЫКТАРДЫН ДИСПЕНСЕРИ

Сиз качандыр бир убакта үй жаныбарыңызды багууга көп убакыт коротуп жаткандай сезилдиңиз беле? Каникулда үй жаныбарларыңызды багуу үчүн кимдир бирөөгө чалууга туура келди беле? Мен бул эки көйгөйдү учурдагы мектеп долбоорум менен чечүүгө аракет кылдым: Petfeed!

Жабдуулар

Raspberry Pi 3b

Бар жүктөө клеткасы (10 кг)

HX711 Load Cell Amplifier

Суу деңгээлинин сенсору (https://www.dfrobot.com/product-1493.html)

Ultrasonic Proximity Sensor

LCD 16-пин

2x кадам мотору 28byj-48

2x тепкич мотор айдоочу ULN2003

1 -кадам: Кабелдөө

Электр өткөргүчтөрү
Электр өткөргүчтөрү
Электр өткөргүчтөрү
Электр өткөргүчтөрү

бул жерде көп кабелдер. Өткөргүч кабелдериңизди алып, кадап баштаңыз!

2 -кадам: Жүктөө клеткаңызды жарактуу кылыңыз

Жүктөө клеткаңызды жарактуу кылыңыз
Жүктөө клеткаңызды жарактуу кылыңыз

жүк клеткасын колдонуу үчүн, биз адегенде аны эки табакка бекитишибиз керек: астынкы табак жана тамагыбызды таразалай турган табак.

Сизге керектүү бурамалар - бул болуктору M4 жуптары жана M5 жуптары. Мен тешиктерди жасоо үчүн кичинекей бургулоону колдондум.

(Сүрөт:

3 -кадам: Нормаланган маалымат базасы

Нормаланган маалымат базасы
Нормаланган маалымат базасы

сенсорлордун маалыматтары маалымат базасына сакталууга тийиш. Python файлдары үчүн маалымат базасына туташуу үчүн: төмөндө караңыз.

анда сизге конфигурация файлы да керек:

[connector_python] user = * yourusername * host = 127.0.0.1 #if local port = 3306 password = * yourpassword * database = * yourdb * [application_config] driver = 'SQL Server'

4 -кадам: Жүк клеткасын коддоо

импорттоо RPi.

Бардык китепканаларыбызды импорттогондон кийин (көңүл буруңуз, биз HX711 китепканасын жүктөө клеткасын айдоо үчүн колдонобуз), биз чыныгы кодубузду жаза баштайбыз.

TARRA_CONSTANT = 80600

GRAM_CONSTANT = 101

Туруктууларыбызды билүү үчүн, адегенде TARRA_CONSTANT = 0 жана GRAM_CONSTANT = 1 коюңуз.

Андан кийин биз эч нерсе таразага тартылбаганда, жүк клеткабыздын маанисин билишибиз керек. Бул маани TARRA_CONSTANT болот.

GRAM_CONSTANTге келсек, салмагын билген объектини алыңыз (мен спагетти кутусун колдондум), аны таразалап, жүктүн клеткасынын окулушун объектинин чыныгы салмагына бөлүңүз. Мен үчүн бул 101 болчу.

класс LoadCell (threading. Thread):

def _init _ (өзүн -өзү, розетка, lcd): threading. Thread._ init _ (өзүн -өзү) self.hx711 = HX711 (dout_pin = 5, pd_sck_pin = 6, канал = 'A', пайда = 64) self.socket = розетка өзүн.lcd = lcd

бул жерде биз LoadCell классын баштап, казыктарды картага түшүрөбүз.

def run (өзүнчө):

аракет: while True: өзүнчө 0) басып чыгаруу ("салмагы: {0}". Формат (салмагы)) DataRepository.insert_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) in except Exception as e: print ("Таразага тартуудагы ката" + str (e))

5 -кадам: Суу сенсорун коддоо

репозиторийлерден импорт убактысы импорттоо. DataRepository ImportRepository from RPi import GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Water = 18 GPIO.setup (GPIO_Water, GPIO. IN) class WaterSensor (threading. Thread): def _init _ өзүн, розетка): threading. Thread._ init _ (өзүн) self.socket = розетка self.vorige_status = 0 def run (өз алдынча): аракет кылыңыз: while True: water = self.is_water () print (water) status = water [" status "] action = water [" action "] DataRepository.insert_water (str (status), 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": value, "Убакыт": DataRepository.serializeDateTime (actionTime), "action": action}) time.sleep (5) ex истисносун эске албаганда: print (ex) print ('error bij watersensor') def is_water (self): status = GPIO.кирүү (GPIO_Wate r) if self.vorige_status == 0 жана status == 1: print ('water gedetecteerd') sensorData = {"status": status, "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": status, "action": "water aanwezig"} status = GPIO.input (GPIO_Water) if self.vorige_status == 1 жана status == 0: print ('water weg') sensorData = {"status": status, "action": "water weg"} self.vorige_status = status status = GPIO.input (GPIO_Water) if self.vorige_status == 0 жана status == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} return sensorData

6 -кадам: Жакындык сенсорун коддоо

репозиторийлерден импорт убактысы импорттоо. DataRepository RPiден импорттук DataRepository GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig, GPIO. OUT) GPIO.seto, GPIO_Echo. 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): аракет кылыңыз: last_reading = 0 интервал = 5000, True: if current_milli_time ()> last_reading + interval: dist = self.distance () print ("Ченелген аралык = %.1f см" % 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, "Жакындык": прокси, "Убакыт": DataRepository.serializeDateTime (actionTime)}) last_reading = current_milli_time () ex ex истисносунан тышкары: print (ex) de f расстояние (самое): # триггерди ЖОГОРУ GPIO.output (GPIO_Trig, True) # Триггерди 0.01msден кийин LOW убакытка коюңуз. time.time () # Баштоо убактысын GPIO.input (GPIO_Echo) учурунда сактоо == 0: StartTime = time.time () # келүү убактысын GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # башталыш менен келүүнүн ортосундагы убакыт айырмасы TimeElapsed = StopTime - StartTime # sonic ылдамдыгы менен көбөйөт (34300 см / с) # жана 2ге бөлүңүз, анткени ал жерде жана артка аралык = (TimeElapsed * 34300) / 2 кайтуу аралыгы

7 -кадам: Stepper Motors коддоо

RPi. GPIO импорту GPIO.output (pin, 0) halfstep_seq =

Бул код башка тепкич мотору үчүн кайра колдонууга болот, жөн эле контролдук пин сандарын репектордук казыктарына коюп, класстын атын StepperWater деп өзгөртүңүз:

8 -кадам: ЖКны коддоо

Көптөгөн коддор, бирок биз дээрлик бүттүк.

ЖК классы LCD.py файлы катары киргизилген

LCDден импорттоочу 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]) класс LCDWrite: def билдирүү (msg): аракет: басып чыгаруу ("аракет") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') кошпогондо: басып чыгаруу ("LCDWrite катасы")

9 -кадам: Акыры

Аягы
Аягы
Аягы
Аягы

акыркы натыйжа: биз аны кантип тарттык, ал кантип аяктады.

Сунушталууда: