Мазмуну:
- Жабдуулар
- 1 -кадам: Кабелдөө
- 2 -кадам: Жүктөө клеткаңызды жарактуу кылыңыз
- 3 -кадам: Нормаланган маалымат базасы
- 4 -кадам: Жүк клеткасын коддоо
- 5 -кадам: Суу сенсорун коддоо
- 6 -кадам: Жакындык сенсорун коддоо
- 7 -кадам: Stepper Motors коддоо
- 8 -кадам: ЖКны коддоо
- 9 -кадам: Акыры
Video: АВТОМАТТЫК ПЕТ ТАМАКТАРДЫН ДИСПЕНСЕРИ: 9 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:36
Сиз качандыр бир убакта үй жаныбарыңызды багууга көп убакыт коротуп жаткандай сезилдиңиз беле? Каникулда үй жаныбарларыңызды багуу үчүн кимдир бирөөгө чалууга туура келди беле? Мен бул эки көйгөйдү учурдагы мектеп долбоорум менен чечүүгө аракет кылдым: 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 -кадам: Акыры
акыркы натыйжа: биз аны кантип тарттык, ал кантип аяктады.
Сунушталууда:
DIY автоматтык кол тазалоочу диспенсери: 6 кадам
DIY автоматтык кол дезинфекциялоочу диспенсери: Бул проектте биз Авто кол тазалоочу каражаттарды курабыз. Бул долбоордо Arduino, Ultrasonic Sensor, Water pump жана Hand Sanitizer колдонулат. УЗИ сенсору дезинфекциялоочу машинанын розеткасынын астындагы колдордун бар экендигин текшерүү үчүн колдонулат
Esp32 менен автоматтык гел спирти диспенсери: 9 кадам
Esp32 менен автоматтык гел спирти диспенсери: Үйрөткүчтө биз толук прототипти кантип жасоону, esp32 менен автоматтык гель спирт диспенсерин чогултууну көрөбүз, ал этап-этабы менен чогултууну, электрондук схеманы, ошондой эле баштапкы кодду түшүндүрөт. кадам
Дарылоо автоматтык диспенсери: 5 кадам
Дарылоо автоматтык диспенсери: Бул долбоор медициналык чөйрөдө колдонууга арналган, анда улгайган бейтаптар дары -дармектерди бөлүштүрүү жана берүү үчүн ишенимдүү жолго ээ болушу керек. Бул түзмөк дары -дармектерди 9 күнгө чейин бөлүштүрүүгө жана автоматтык түрдө таркатууга мүмкүнчүлүк берет
Автоматтык самын диспенсери Arduino аркылуу: 8 кадам
Автоматтык самын диспенсери Arduino менен: Ардуино менен автоматтык самын диспенсери: Ошентип, эй жигит, бул макаланын жаңы макаласына кош келиңиз, биз автоматтык самын диспенсерин жасайбыз, бул самын диспенсерин жасоо абдан оңой Бир нече кадам менен сиз жасай аласыз Бул Автомат самын диспенсерин
Cornflakes автоматтык диспенсери (Cerematic): 14 кадам
Cornflakes автоматтык диспенсери (Cerematic): Менин идеям: Биринчи курстун акыркы долбоору үчүн мага жаккан долбоорду иштеп чыгууга уруксат берилди. Мен үчүн тандоо бат эле жасалды. Мага дан алуучу машинаны алыстан башкара турган автоматташтыруу идеясы көрүндү. Бир аздан кийин