Inhaltsverzeichnis:
- Lieferungen
- Schritt 1: Verkabelung
- Schritt 2: Machen Sie Ihre Wägezelle nutzbar
- Schritt 3: Normalisierte Datenbank
- Schritt 4: Codierung der Wägezelle
- Schritt 5: Codieren des Wassersensors
- Schritt 6: Codieren des Näherungssensors
- Schritt 7: Codieren der Schrittmotoren
- Schritt 8: Codieren des LCD
- Schritt 9: Das Ende
Video: AUTOMATISCHER HAUSTIERFUTTERSPENDER - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:15
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
viel kabel hier. Holen Sie Ihre Überbrückungskabel heraus und beginnen Sie mit dem Pinning!
Schritt 2: 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
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
Endergebnis: wie wir es erstellt haben vs. wie es geendet hat.
Empfohlen:
Automatischer Anrufbeantworter V1.0: 17 Schritte (mit Bildern)
Automated Answering System V1.0: Manchmal habe ich einfach keine Lust, ans Telefon zu gehen. Okay, okay… die meiste Zeit ist es mir wirklich egal, ans Telefon zu gehen. Was soll ich sagen, ich bin ein beschäftigter Mann. Ich habe mir schon lange ein System gewünscht, das dem ähnlich ist, das die Telefongesellschaft für die
Automatischer Sucher: 4 Schritte
Auto-Searcher: Also las ich eines Tages Fanfiction in meinem Bett, um meinen Stress abzubauen. Aber ich hatte das Gefühl, dass es ein bisschen mühsam war, die Seite weiter zu scrollen, um weiterzulesen. Ich muss auch klicken, um das nächste Kapitel zu sehen und das Ganze vorher suchen
Automatischer Gartenbewässerer - 3D gedruckt - Arduino: 10 Schritte (mit Bildern)
Automatischer Gartenbewässerer | 3D gedruckt | Arduino: Ich bin ein begeisterter Gärtner, aber Ihre Pflanzen während Trockenperioden von Hand zu gießen, dauert einige Zeit. Dieses Projekt befreit mich vom Gießen, damit ich an meinen anderen Projekten arbeiten kann. Es ist auch großartig, sich um den Garten zu kümmern, während Sie nicht zu Hause sind, und die Pflanze