Мазмұны:
- Жабдықтар
- 1 -қадам: Сымдарды жалғау
- 2 -қадам: жүктеме ұяшығын қолдануға жарамды етіңіз
- 3 -қадам: нормаланған мәліметтер базасы
- 4 -қадам: жүктеме ұяшығын кодтау
- 5 -қадам: Су датчигін кодтау
- 6 -қадам: Жақындық сенсорын кодтау
- 7 -қадам: Stepper моторларын кодтау
- 8 -қадам: СКД кодтау
- 9 -қадам: Соңы
Бейне: АВТОМАТТЫ АЙЫМДЫҚ АСҚАРУШЫ: 9 қадам
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-30 10:23
Үй жануарыңызды тамақтандыруға тым көп уақыт жоғалтқыңыз келді ме? Демалыс кезінде үй жануарларына тамақ беру үшін біреуге қоңырау шалуға тура келді ме? Мен осы екі мәселені де қазіргі мектеп жобасымен шешуге тырыстым: Petfeed!
Жабдықтар
Raspberry Pi 3b
Штангалық жүктеме ұяшығы (10 кг)
HX711 жүктеме ұяшығының күшейткіші
Су деңгейінің сенсоры (https://www.dfrobot.com/product-1493.html)
Ультрадыбыстық жақындық сенсоры
СКД 16 істікшелері
2x қадамдық қозғалтқыш 28byj-48
ULN2003 2 сатылы мотор жүргізушісі
1 -қадам: Сымдарды жалғау
мұнда көптеген кабельдер. Өткізгіш кабельдерді шығарып, түйреуді бастаңыз!
2 -қадам: жүктеме ұяшығын қолдануға жарамды етіңіз
жүктеме ұяшығын қолдану үшін алдымен оны екі табаққа бекіту керек: астыңғы табақшаға және тағамды өлшейтін табаққа.
Сізге қажет болттары бар M4 бұрандалары мен сәйкес келетін болттары бар M5 бұрандалары қажет. Мен тесіктерді жасау үшін кішкене бұрғы қолдандым.
(сурет:
3 -қадам: нормаланған мәліметтер базасы
сенсорлардан алынған мәліметтер дерекқорда сақталуы керек. Дерекқорға қосылатын python файлдары үшін: төменде қараңыз.
онда сізге конфигурация файлы қажет:
[connector_python] user = * сіздің логиніңіз * хост = 127.0.0.1 #if local port = 3306 password = * yourpassword * database = * yourdb * [application_config] драйвер = '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 _ (self, socket, lcd): threading. Thread._ init _ (self) self.hx711 = HX711 (dout_pin = 5, pd_sck_pin = 6, channel = 'A', пайда = 64) self.socket = socket self.lcd = LCD
мұнда біз LoadCell класын инициализациялаймыз және түйреуіштерді салыстырамыз.
def run (өзінше):
көріңіз: while True: self.hx711.reset () # Біз бастамас бұрын, HX711 (міндетті емес) өлшемдерін қалпына келтіріңіз_avg = sum (self.hx711.get_raw_data ()) / 5 салмақ = дөңгелек ((өлшемдер_авг - TARRA_CONSTANT) / GRAM_CONSTANT, 0) басып шығару («салмақ: {0}». Формат (салмақ)) 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)}) басып шығару («шығарылған») writeWeight = «weight:» + str (db_weight) msg = «PETFEED» LCDWrite.message () if int (db_weight [:-2]) <= 100: StepperFood.run () time.sleep (20), e: print сияқты ерекшеліктерден басқа. («Өлшеу қатесі» + str (e))
5 -қадам: Су датчигін кодтау
репозиторийлерден импорттау уақыты импорттау. DataRepository RPi -ден DataRepository импорттау GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (жалған) GPIO_Water = 18 GPIO.setup (GPIO_Water, GPIO. IN) сынып WaterSensor (threading. Thread): def _init _ self, socket): threading. Thread._ init _ (self) self.socket = socket self.vorige_status = 0 def run (self): көріңіз: while True: water = self.is_water () баспа (су) күйі = су [« күй «] әрекет = су [» әрекет «] DataRepository.insert_water (str (күй), әрекет) data_water = DataRepository.get_data_sensor (2) historyId = data_water [» SensorsHistory «] мән = data_water [» value «] егер мән == «0»: value = «te weinig water» else: value = «genoeg water» actionTime = data_water [«actionTime»] self.socket.emit ('data_water', {«id»: historyId, «value»: мән, «Уақыт»: DataRepository.serializeDateTime (actionTime), «әрекет»: әрекет}) time.sleep (5), мысалы ex жағдайында қоспағанда: print (ex) print ('error bij watersensor') def is_water (self): status = GPIO.кіріс (GPIO_Wate r) егер 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 және 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»} sensorData қайтару
6 -қадам: Жақындық сенсорын кодтау
репозиторийлерден импорттау уақыты импорттау. DataRepository RPi -ден DataRepository импорттау GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (Жалған) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig, GPIO. OUT) GPIO.seto, GPIO_Echo (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: егер current_milli_time ()> last_reading + interval: dist = self.distance () басып шығару («Өлшенген қашықтық = %.1f см» % дист) 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 қашықтық (өздігінен): # Trigger параметрін ЖОҒАРЫ GPIO. шығысына (GPIO_Trig, True) орнатыңыз time.time () # GPIO.input (GPIO_Echo) кезінде StartTime үнемдеу == 0: StartTime = time.time () # келу уақытын үнемдеу GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # басталу мен келу арасындағы уақыт айырмашылығы TimeElapsed = StopTime - StartTime # дыбыстық жылдамдықпен (34300 см / с) # көбейіп, 2 -ге бөлінеді, себебі ол жерде және артқа қашықтық = (Уақыт аяқталды * 34300) / 2 қайтару қашықтығы
7 -қадам: Stepper моторларын кодтау
RPi. GPIO -ны GPIO ретінде импорттау импорттау ағыны GPIO.setmode (GPIO. BCM) GPIO.setwarnings (Жалған) control_pins = [12, 16, 20, 21] pin_de_pin үшін: GPIO.setup (pin, GPIO. OUT) GPIO.өнім (түйреуіш, 0) halfstep_seq =
Бұл кодты басқа қадамдық қозғалтқыш үшін қайта пайдалануға болады, тек бақылау түйреуіштерінің сандарын олардың репекторлық түйреуіштеріне орнатыңыз және классты StepperWater деп өзгертіңіз:
8 -қадам: СКД кодтау
Көптеген кодтар, бірақ біз дерлік аяқтадық.
LCD класы LCD.py файлы ретінде енгізілген
СКД импорттау
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): try: print («try») lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') қоспағанда: басып шығару («LCDWrite қатесі»)
9 -қадам: Соңы
соңғы нәтиже: біз оны қалай құрдық, қалай аяқталды.
Ұсынылған:
Қолды автоматты тазартқыш: 8 қадам
Қолды автоматты тазартқыш: COVID-19 пандемиясы 2020 жылы жұртшылық жиі еститін нәрсеге айналды. «COVID-19» сөзін естіген әрбір азамат бірден «қауіпті», «өлімге әкелетін», «тазалықты сақтаңыз» деген сөзді ойлайды. », Және басқа сөздер. Бұл COVID-19 сонымен қатар
DIY автоматты қолды тазартатын диспенсер: 6 қадам
DIY автоматты қолды тазартатын диспенсер: Бұл жобада біз қолмен тазартатын автоматты диспенсер құрамыз. Бұл жобада Arduino, ультрадыбыстық сенсор, су сорғы және қолды тазартқыш қолданылады. Ультрадыбыстық сенсор дезинфекциялаушы машинаның шығатын жерінің астында қолдардың болуын тексеру үшін қолданылады
Иттерді автоматты түрде тамақтандыру !!: 4 қадам
Иттерді автоматты түрде тамақтандыру !!: оңай, пайдалы және сау
Микро: өсімдіктерді суарудың автоматты жүйесі: 8 қадам (суреттермен)
Микро: бит көмегімен өсімдіктерді автоматты түрде суару жүйесі: Бұл нұсқаулықта мен сізге Micro: bit және басқа да кішкене электронды компоненттердің көмегімен өсімдіктерді автоматты түрде суару жүйесін құруды көрсетемін. өсімдік топырағындағы ылғалдылық деңгейін бақылау үшін
WiFi резервуарлы өсімдіктерді автоматты түрде беру - жабық/ашық ауада өсіру - су қондырғылары қашықтан бақылаумен автоматты түрде: 21 қадам
Резервуарлы WiFi автоматты өсімдік қоректендіргіші - жабық/ашық өсіру қондырғысы - су қондырғылары қашықтан бақылаумен автоматты түрде: Бұл оқулықта біз өсімдіктерді автоматты түрде суаратын және Adosia платформасы арқылы қашықтан бақыланатын жабық/ашық өсімдіктерді тамақтандыратын жүйені қалай орнату керектігін көрсетеміз