Inhaltsverzeichnis:

AUTOMATISCHER HAUSTIERFUTTERSPENDER - Gunook
AUTOMATISCHER HAUSTIERFUTTERSPENDER - Gunook

Video: AUTOMATISCHER HAUSTIERFUTTERSPENDER - Gunook

Video: AUTOMATISCHER HAUSTIERFUTTERSPENDER - Gunook
Video: Beste HAUSTIER FUTTERAUTOMATEN 2023 | Top 3 smarte Futterspender Vergleich 2024, Dezember
Anonim
AUTOMATISCHER HAUSTIERFUTTERSPENDER
AUTOMATISCHER HAUSTIERFUTTERSPENDER

Hatten Sie jemals das Gefühl, zu viel Zeit mit dem Füttern Ihres Haustieres zu verschwenden? Mussten Sie schon einmal jemanden anrufen, um Ihre Haustiere zu füttern, während Sie im Urlaub waren? Ich habe versucht, diese beiden Probleme mit meinem aktuellen Schulprojekt zu beheben: Petfeed!

Lieferungen

Raspberry Pi 3b

Stangen-Wägezelle (10kg)

HX711 Wägezellenverstärker

Wasserstandssensor (https://www.dfrobot.com/product-1493.html)

Ultraschall-Näherungssensor

LCD 16-polig

2x Schrittmotor 28byj-48

2x Schrittmotortreiber ULN2003

Schritt 1: Verkabelung

Verdrahtung
Verdrahtung
Verdrahtung
Verdrahtung

viel kabel hier. Holen Sie Ihre Überbrückungskabel heraus und beginnen Sie mit dem Pinning!

Schritt 2: Machen Sie Ihre Wägezelle nutzbar

Machen Sie Ihre Wägezelle nutzbar
Machen Sie Ihre Wägezelle nutzbar

Um die Wägezelle zu verwenden, müssen wir sie zuerst an zwei Platten befestigen: einer Bodenplatte und einer Platte, auf der wir unser Essen wiegen.

Die benötigten Schrauben sind ein Paar M4-Schrauben mit passenden Bolzen und ein Paar M5-Schrauben mit passenden Bolzen. Ich benutzte einen kleinen Bohrer, um die Löcher zu machen.

(Bild:

Schritt 3: Normalisierte Datenbank

Normalisierte Datenbank
Normalisierte Datenbank

Daten unserer Sensoren müssen in einer Datenbank gespeichert werden. Für die Python-Dateien, um eine Verbindung zur Datenbank herzustellen: siehe unten.

dann brauchst du auch eine config-Datei:

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

Schritt 4: Codierung der Wägezelle

import RPi. GPIO als GPIOimport threading import time from hx711 import HX711 from helpers.stepperFood import StepperFood from helpers. LCDWrite import LCDWrite from repositories. DataRepository import DataRepository

Nachdem wir alle unsere Bibliotheken importiert haben (beachten Sie, dass wir die HX711-Bibliothek zum Ansteuern der Wägezelle verwenden), können wir mit dem Schreiben unseres eigentlichen Codes beginnen

TARRA_CONSTANT = 80600

GRAM_CONSTANT = 101

Um unsere Konstanten herauszufinden, setzen Sie zuerst TARRA_CONSTANT = 0 und GRAM_CONSTANT = 1.

Als nächstes müssen wir den Wert herausfinden, den unsere Wägezelle liest, wenn nichts gewogen wird. Dieser Wert ist TARRA_CONSTANT.

Was GRAM_CONSTANT angeht, nehmen Sie einfach ein Objekt, dessen Gewicht Sie kennen (ich habe eine Packung Spaghetti verwendet), wiegen Sie es und teilen Sie die Wägezellenanzeige mit dem tatsächlichen Gewicht des Objekts. Bei mir war das 101.

Klasse LoadCell(threading. Thread):

def _init_(self, socket, lcd): threading. Thread._init_(self) self.hx711 = HX711(dout_pin=5, pd_sck_pin=6, channel='A', gain=64) self.socket = socket self.lcd = LCD

hier initialisieren wir die LoadCell-Klasse und ordnen die Pins zu.

def run(selbst):

try: while True: self.hx711.reset() # Bevor wir beginnen, setzen Sie den HX711 zurück (nicht obligatorisch) measure_avg = sum(self.hx711.get_raw_data()) / 5 weight = round((measures_avg - TARRA_CONSTANT) / GRAM_CONSTANT, 0) print("weight: {0}".format(weight)) 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) außer Ausnahme wie e: print ("Fehler beim Wiegen" + str(e))

Schritt 5: Codieren des Wassersensors

import timeimport threading from repositories. DataRepository import dataRepository 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_(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 = 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, "Time": DataRepository.serializeDateTime(actionTime), "action": action}) time.sleep(5) außer Ausnahme wie zB: print(ex) print('error bij watersensor') def is_water(self): status = GPIO.input(GPIO_Wate r) if self.vorige_status == 0 und 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 und 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 and status == 0: print('startpositie') status = GPIO.input(GPIO_Water) sensorData = {"status": status, "action": "startpositie"} return sensorData

Schritt 6: Codieren des Näherungssensors

import timeimport threading from Repositorys. DataRepository import dataRepository from RPi import GPIO GPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup(GPIO_Trig, GPIO. OUT) GPIO.setup(GPIO_Echo, GPIO_Echo, GPIO. 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("Measured Distance = %.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() außer Ausnahme wie zB: print(ex) de f distance(self): # setze Trigger auf HIGH GPIO.output(GPIO_Trig, True) # setze Trigger nach 0,01ms auf LOW time.sleep(0.00001) GPIO.output(GPIO_Trig, False) StartTime = time.time() StopTime = time.time() # Startzeit speichern während GPIO.input(GPIO_Echo) == 0: StartTime = time.time() # Ankunftszeit speichern während GPIO.input(GPIO_Echo) == 1: StopTime = time.time() # Zeitdifferenz zwischen Start und Ankunft TimeElapsed = StopTime - StartTime # multiplizieren mit der Schallgeschwindigkeit (34300 cm/s) # und dividieren durch 2, da Hin- und Rückweg = (TimeElapsed * 34300) / 2 Rückweg

Schritt 7: Codieren der Schrittmotoren

RPi. GPIO als GPIO importieren Importzeit Threading importieren GPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) control_pins = [12, 16, 20, 21] für Pin in control_pins: GPIO.setup(pin, GPIO. OUT) GPIO.output(pin, 0) halfstep_seq =

Dieser Code ist für den anderen Schrittmotor wiederverwendbar, setzen Sie einfach die Steuerpin-Nummern auf die entsprechenden Pins und benennen Sie die Klasse in StepperWater um:

Schritt 8: Codieren des LCD

Viel Code, aber wir sind fast fertig.

Die LCD-Klasse ist als Datei LCD.py enthalten

von helpers. LCD importieren 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]) Klasse LCDWrite: def message(msg): try: print("try") lcd.init_LCD() lcd.send_instruction(12) lcd.clear_display() lcd.write_message(msg, '1') außer: print("Fehler LCDWrite")

Schritt 9: Das Ende

Das Ende
Das Ende
Das Ende
Das Ende

Endergebnis: wie wir es erstellt haben vs. wie es geendet hat.

Empfohlen: