Мазмұны:

АВТОМАТТЫ АЙЫМДЫҚ АСҚАРУШЫ: 9 қадам
АВТОМАТТЫ АЙЫМДЫҚ АСҚАРУШЫ: 9 қадам

Бейне: АВТОМАТТЫ АЙЫМДЫҚ АСҚАРУШЫ: 9 қадам

Бейне: АВТОМАТТЫ АЙЫМДЫҚ АСҚАРУШЫ: 9 қадам
Бейне: Автоматты бұзамыз!!! Арманыма қалай қол жеткіземін десеңіз көріңіз 2024, Желтоқсан
Anonim
АВТОМАТТЫ үй жануарларына арналған тағамдық диспенсер
АВТОМАТТЫ үй жануарларына арналған тағамдық диспенсер

Үй жануарыңызды тамақтандыруға тым көп уақыт жоғалтқыңыз келді ме? Демалыс кезінде үй жануарларына тамақ беру үшін біреуге қоңырау шалуға тура келді ме? Мен осы екі мәселені де қазіргі мектеп жобасымен шешуге тырыстым: 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 -қадам: Соңы

Соңы
Соңы
Соңы
Соңы

соңғы нәтиже: біз оны қалай құрдық, қалай аяқталды.

Ұсынылған: