Raspberry Pi Sicherheitssystem mit Ultraschallsensor + Raspi

Du hast eine Idee für ein Projekt?
Antworten
Peter123.
User
Beiträge: 2
Registriert: Dienstag 16. Mai 2017, 16:04

Hallo zusammen,
ich hätte da eine Frage und zwar habe ich ein Projekt am laufen das relativ ähnlich ist mit diesem Post. Es geht um einen Raspberry Pi mit einem Ultraschallsensor in Verbindung mit einer Raspberry Pi Kamera.Es geht halt darum das die Kamera ein Bild aufnehmen soll, sobald eine Bewegung durch den Ultraschallsensor in einer bestimmten Distanz erkannt wird. Anschließend sollte dieses Foto dann auf einen Server hochgeladen werden. Es würde mich sehr freuen wenn mir jemand bei der Interaktion helfen könnte.

Das Programm läuft nun, es macht ein Foto mit einem Zeitstempel sobald die Entfernung weniger als 20 cm beträgt.

Der Code sieht folgendermaßen aus:

CODE: SELECT ALL

Code: Alles auswählen

#Bibliotheken einbinden
import RPi.GPIO as GPIO
import time

#GPIO Modus (BOARD / BCM)
GPIO.setmode(GPIO.BCM)

#GPIO Pins zuweisen
GPIO_TRIGGER = 18
GPIO_ECHO = 24

#Richtung der GPIO-Pins festlegen (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)

def distanz():
   # setze Trigger auf HIGH
   GPIO.output(GPIO_TRIGGER, True)

   # setze Trigger nach 0.01ms aus LOW
   time.sleep(0.00001)
   GPIO.output(GPIO_TRIGGER, False)

   StartZeit = time.time()
   StopZeit = time.time()

   # speichere Startzeit
   while GPIO.input(GPIO_ECHO) == 0:
       StartZeit = time.time()

   # speichere Ankunftszeit
   while GPIO.input(GPIO_ECHO) == 1:
       StopZeit = time.time()

   # Zeit Differenz zwischen Start und Ankunft
   TimeElapsed = StopZeit - StartZeit
   # mit der Schallgeschwindigkeit (34300 cm/s) multiplizieren
   # und durch 2 teilen, da hin und zurueck
   distanz = (TimeElapsed * 34300) / 2

   return distanz

if __name__ == '__main__':
   try:
       while True:
           abstand = distanz()
           print ("Gemessene Entfernung = %.1f cm" % abstand)
           time.sleep(1)

       # Beim Abbruch durch STRG+C resetten
   except KeyboardInterrupt:
       print("Messung vom User gestoppt")
       GPIO.cleanup()
Und der 2. Code

CODE: SELECT ALL

Code: Alles auswählen

# -*- coding: utf-8 -*-
import sys
import os
import picamera
import sensor
import RPi.GPIO as GPIO
import time
import subprocess
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
## hier die Distanz eingeben
leer=20

def main():
  trig_pin = 18 ##GPIO Trigger
  echo_pin = 24 ##GPIO ECHO

  while True:
      value = sensor.distanz()
      print("Gemessene Entfernung =%.1f cm" % value)
      time.sleep(2)
      if value <= 20:
         timestr = time.strftime("%Y%m%d-%H%M%S")
         camera = picamera.PiCamera()
         camera.start_preview()
         time.sleep(5)
         camera.capture('bild_{}.jpg'.format(timestr))
         camera.stop_preview()
         camera.close()
         
            ##p = subprocess.Popen(["./foto2.sh"])
            ##time.sleep(2)
if __name__ == "__main__":
  main()
Ich möchte jetzt, dass das das ganze auf einem Webserver darstellen. Das heißt das Foto soll automatisch auf dem Webserver hochgeladen werden und es soll eine Tabellendarstellung geben auf dem Webserver der z.B. in der ersten Spalte eine Nummerierung hat (1,2,3,4,5 usw) und in der 2. Spalte dann die Dateiname von dem Hochgeladenen Foto also in meinem Fall einfach Timestamp -- Vielleicht muss ich einfach eine CSV Datei erzeugen lassen vom Python Programm. Ich weiß nicht, wie ich vorgehen soll. Könnt ihr mir weiterhelfen, eventuell Code umschreiben ?

Ein Php-code habe ich dazu schon vorbereitet komme aber nicht weiter

CODE: SELECT ALL
[codebox=php file=Unbenannt.php]<?php


$error=0;
// Prüfen ob GET Variable vorhanden
if (isset($_GET)) {
//Daten auslesen
$ts = $_GET[ 'timestamp' ];


//Eingaben überprüfen
// Timestamp Format 2016-05-23-14-54-12
$tsRegex = "/^[0-9]{4}-[0-9]{2}-[0-9]{2}-[0-9]{2}-[0-9]{2}-[0-9]{2}$/";
if (preg_match($tsRegex, $ts)) {
//echo "timestamp in ordnung<br>";
} else {
//echo "timestamp fehlerhaft<br>";
$error=1;
}

}

// Wenn Eingaben in Ordnung CSV Datei schreiben
// Rückgabewert 0 = ok , 1 = Error
if ($error == 0){
$Logdatei='sensordaten.csv';
$Ausgabe="$ts;$ip\n";
$fh=fopen($Logdatei,"a");
fwrite($fh,$Ausgabe);
fclose($fh);
//echo "Kein Error -> $ts log: $Logdatei - $fh - $Ausgabe";
return 0;
} else {
//echo "Error";
return 1;
}
?>[/code]


Fazit
Das PHP-Skript wird über das Python-Programm von dem Raspberry Pi aufgerufen. Der Webservice empfängt über einen Query-String (GET-Methode) eine Zeile mit den Daten. Weiß nicht so genau wie ich es hinbekommen soll.

Danke schonmal :)
Zuletzt geändert von Anonymous am Dienstag 16. Mai 2017, 16:21, insgesamt 1-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich bin ja immer fasziniert von dieser Code-Abgreifer-Mentalitaet im Raspberry PI Lager. Keine Ahnung zu haben ist ja nicht weiter schlimm, aber zu erwarten, andere wuerden einem die gestellte Aufgabe loesen - wo sonst ist das eigentlich so?

Im dazugehoerigen Forum findet sich die Frage ja auch schon: http://www.forum-raspberrypi.de/Thread- ... r-raspicam

Zu deiner Frage: eine CSV-Datei zu schreiben kann man machen, notwendig ist es aber nicht, da die Dateien ja schon alle Informationen haben - es gibt ja das Erstellungsdatum. Siehe die PHP Dateifunktionen:

http://php.net/manual/en/ref.filesystem.php

Da kannst du die Liste der Bilder bekommen, deren Datum rausfinden, danach sortieren - und fertig. Aber da das PHP ist, frag doch auch noch mal in einem Forum dafuer nach :twisted:
Peter123.
User
Beiträge: 2
Registriert: Dienstag 16. Mai 2017, 16:04

__deets__ hat geschrieben:Ich bin ja immer fasziniert von dieser Code-Abgreifer-Mentalitaet im Raspberry PI Lager. Keine Ahnung zu haben ist ja nicht weiter schlimm, aber zu erwarten, andere wuerden einem die gestellte Aufgabe loesen - wo sonst ist das eigentlich so?

Im dazugehoerigen Forum findet sich die Frage ja auch schon: http://www.forum-raspberrypi.de/Thread- ... r-raspicam

Zu deiner Frage: eine CSV-Datei zu schreiben kann man machen, notwendig ist es aber nicht, da die Dateien ja schon alle Informationen haben - es gibt ja das Erstellungsdatum. Siehe die PHP Dateifunktionen:

http://php.net/manual/en/ref.filesystem.php

Da kannst du die Liste der Bilder bekommen, deren Datum rausfinden, danach sortieren - und fertig. Aber da das PHP ist, frag doch auch noch mal in einem Forum dafuer nach :twisted:

Der andere Beitrag in dem anderen Forum wurde auch von mir verfasst :D

Ich danke dir für deine Antwort, so wie ich es verstanden habe lasse ich also einfach alle Bilder auf dem Webserver hochladen und eine Liste erzeugen lassen mit den dazugehörigen Dateinamen. Du hast recht, dann ist keine CSV-Datei erforderlich.
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Du könntest die Sensorabfrage noch verkürzen:
https://gpiozero.readthedocs.io/en/stab ... nce-sensor
Antworten