Moin zusammen,
wie in der Ü-Schrift bereits vermittelt, habe ich an einem RPI 3b+ eine "IR Camera" angeschlossen, die von einem PIR IR Sensor bei Bewegung ein Video Clip mit 20 Sekunden Länge aufnimmt. Das funktioniert mit einem "C" Script, das ich im Internet gefunden habe.
Das Problem, wie bei allen anderen IR Camera Anfragen hier im Forum ist, dass ich gerne die IR LEDs nur dann zugeschaltet haben möchte, wenn ein wegen der Auslösung des PIR Sensors auch ein Video Clip aufgezeichnet wird.
In der /boot/config.txt habe ich nachfolgende Versuche gestartet:
Bei keiner der beiden Optionen sind die IR LEDs mittlerweile aus. Die einzig sichere Methode die IR LEDs auszuschalten ist, diese abmontiert zu lassen. Dabei habe ich festgestellt, dass es bei Nacht nur schwarzen Bildschirm gibt.
Also nix mit IR Video von der IR Camera :o)
Bei dem Hersteller "Waveshare" der die IR-CUT Camera vertreibt, ist ein Modul Layout zu sehen, das einen GPIO "Port" beschreibt, der den "High - Low" Level erkennen können soll.
Das Layout Bildchen ist hier zu sehen:
File:Rpi-ir-cut-camera-faq-4.jpg - Waveshare Wiki
Ich verstehe mit meinen unzureichenden Elektronik Kenntnissen, dass mit dem GPIO die Zuschaltung der IR LEDs gesteuert werden könnte.
Meine Frage an die Spezialisten hier ist:
Wie geht das.
Kann ich das mit in das Script einbauen?
Das Script ist ein "C" Quellcode. Meine Programmierkenntisse beschränken sich auf PHP, (etwas) PERL, HTML5, CSS, (etwas) Python, Bash Scripting.
// Nachfolgend die Hilfe, wie das Script compiliert werden muss
// gcc -Wall -o inputFILE outputFILE.c -l wiringPi (<-Directory)
//
#include <time.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wiringPi.h>
struct tm tmdatim; time_t now;
char buf1[21], buf2[21], tstr[127];
int err = 0, pin = 7; FILE *logFile = NULL;
volatile sig_atomic_t done = 0; volatile int inInt = 0;
void pinInt(void) { ++inInt; }
void sigterm(int signum) { done = 1; }
void dateTime(void) {
now = time(0); tmdatim = *localtime(&now);
strftime(buf1, sizeof(buf1), "%d-%m-%Y.%H%M%S", &tmdatim);
}
void fileLog(char *str) {
dateTime(); fprintf(logFile, "%s - %s\n", buf1, str); fflush(logFile);
}
int Err(char* str) {
err = errno; sprintf(tstr, "%s", str);
if (errno) { sprintf(tstr, "Error: %s. Msg: %s", str, strerror(errno)); }
fileLog(tstr); errno = 0; return err;
}
int main(void) {
struct sigaction sigact; memset(&sigact, 0, sizeof(struct sigaction));
sigact.sa_handler = sigterm; sigaction(SIGTERM, &sigact, NULL); errno = 0;
logFile = fopen("/var/log/camera.log", "a");
if (!Err("Opening /var/log/camera.log")) { wiringPiSetup();
if (!Err("Initialising wiringPiLib")) { wiringPiISR(pin, INT_EDGE_RISING, &pinInt);
if (!Err("Setting wiringPiIntSR")) {
while (!done) {
if (inInt) {
dateTime(); sprintf(buf2, "%s", buf1);
sprintf(tstr, "raspivid -o /$home/Videos/vid.%s.h264 -t 20000 -fps 30 -hf > /dev/null", buf2);
fileLog("Recording 20 seconds video..."); system(tstr);
//
// Nachfolgend auskommentierte Anweisungen sind unwichtig, da genug Speicher Platz auf dem RPI 3b+ vorhanden
// sprintf(tstr, "MP4Box -fps 30 -add /$home/Videos/vid.%s.h264 /$home/mp4-v/vid.%s.mp4 > /dev/null", buf2, buf2);
// fileLog("Converting video to MP4....."); system(tstr);
// sprintf(tstr, "rsync -az /$home/Videos/vid.%s.mp4 /$home/mp4-v/vid.%s.mp4 > /dev/null", buf2, buf2);
// fileLog("Copying video to directory....."); system(tstr);
inInt = 0; sleep(0);
}
else sleep(0);
}
fileLog("Stopping Program...");
}
}
}
if (logFile) { fclose(logFile); } return errno;
}
Alles anzeigen
Was ich vermeiden möchte ist, um meine unzureichenden Elektronik Kenntnisse noch einmal zu erwähnen, eine zusätzlich externe Schaltung dafür.
Ich habe zwar Breadboards, diverse Jumper Kabel, Widerstände und ein Paar Transistoren aus einem Raspi / Arduino Bastelkasten hier, möchte aber wirklich vermeiden Zusatzbasteleien wie Arduino oder ZeroPI einzusetzen.
Danke für eure Antworten