/*
*** Fernbedienung einer Action-Kamera (SJ4000 und Clones) via 3 Taster 1 Videoaufnahmekontroll-LED und OTA ***
SJ4000.ino
Code compatible with ESP8266 Boards Version 3.0.0 or above
(see in Tools > Boards > Boards Manager > Generic ESP8266 Module)
Dank an Funduino GmbH - Ralf Snieders https://funduino.de/nr-5-taster-am-arduino
und an die vielen aktiven User (Berater, Rater, Probierer etc.) aus dem https://forum.arduino.cc/
Thx to Nutchanon Wetchasit @ https://sj4000programming.sourceforge.net/0.7.0/html/book.html
*/
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ArduinoOTA.h>
#include "zugangsdaten.h"
#define DEBUGGING // Auskommentieren, wenn keine serielle Ausgabe erwünscht wird
#ifdef DEBUGGING
#define debugBegin(...) Serial.begin(__VA_ARGS__)
#define debugPrint(...) Serial.print(__VA_ARGS__)
#define debugPrintln(...) Serial.println(__VA_ARGS__)
#else
#define debugBegin(...)
#define debugPrint(...)
#define debugPrintln(...)
#endif
WiFiClient client;
HTTPClient http;
ESP8266WiFiMulti wifiMulti;
String ServerName1 = "http://192.168.1.254/?custom=1&cmd=";
String ServerName2 = "http://192.168.100.1/?custom=1&cmd=";
String ServerName3 = "http://192.168.0.1";
String ServerName = "http://";
// Pinbelegung
const int LEDVideo = 14; //Das Wort „LEDVideo“ steht jetzt für den Pin D5 PGIO 14.
const int TastViAn = 12; //Das Wort „TastViAn“ steht jetzt für den Pin D6 GPIO 12.
bool TastStatus1 = 0; //Das Wort „TastStatus1“ steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable gespeichert, ob der Taster gedrückt ist oder nicht.
const int TastViAus = 13; //Das Wort „TastViAus“ steht jetzt für den Pin D7 GPIO 13.
bool TastStatus2 = 0; //Das Wort „TastStatus2“ steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable gespeichert, ob der Taster gedrückt ist oder nicht.
const int TastFoto = 15; //Das Wort „TastFoto“ steht jetzt für den Pin D8 GPIO 15.
bool TastStatus3 = 0; //Das Wort „TastStatus3“ steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable gespeichert, ob der Taster gedrückt ist oder nicht.
// GET Übergaben
const char* VideoFunc = "3001&par=1"; //http://192.168.1.254/?custom=1&cmd=3001&par=1 VIDEOMODUS
const char* VideoAn = "2001&par=1"; //http://192.168.1.254/?custom=1&cmd=2001&par=1 Video starten
const char* VideoAus = "2001&par=0"; //http://192.168.1.254/?custom=1&cmd=2001&par=0 Video stoppen
const char* FotoFunc = "3001&par=0"; //http://192.168.1.254/?custom=1&cmd=3001&par=0 FOTOMODUS
const char* FotoAn = "1001"; //http://192.168.1.254/?custom=1&cmd=1001 Foto machen
char buf[160] = { "\0" };
// WLAN Verbindungs-Timeout pro AP. Erhöhen, wenn Zeit zum verbinden länger dauert.
const uint32_t connectTimeoutMs = 9000;
void setup() {
Serial.begin(115200);
delay(500);
pinMode(LEDVideo, OUTPUT); //Der Pin mit der LED (D5) ist jetzt ein Ausgang.
pinMode(TastViAn, INPUT); //Der Pin mit dem Taster (D6) ist jetzt ein Eingang.
pinMode(TastViAus, INPUT); //Der Pin mit dem Taster (D7) ist jetzt ein Eingang.
pinMode(TastFoto, INPUT); //Der Pin mit dem Taster (D8) ist jetzt ein Eingang.
WiFi.mode(WIFI_STA);
// Speichern der WLAN-Konfiguration im Flashspeicher - optional
WiFi.persistent(false);
Serial.begin(115200);
Serial.println("\nESP8266 Suche nach Kamera- oder OTA-Verbindung");
// WLAN Verbindungsdaten in zugagangsdaten.h eingeben/erweitern
wifiMulti.addAP(SSID_Cam1, PASS_Cam1); //SJ4000
wifiMulti.addAP(SSID_Cam2, PASS_Cam2); //Beatfoxx
wifiMulti.addAP(SSID_OTA1, PASS_OTA1); //OTA
// Mehr Verbindungen sind möglich
} //Mit dieser letzten Klammer wird void setup geschlossen.
void WLANScan() {
// WLAN-Verbindung herstellen und Variable ServerName festlegen
if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED) {
Serial.print("WiFi connected: ");
Serial.print(WiFi.SSID());
if (WiFi.SSID() == SSID_OTA1) {
Serial.println(F("\nVerbunden mit OTA-Server, warte auf Updates")); //OTA
Serial.println(WiFi.localIP());
ArduinoOTA.begin();
} else {
if (WiFi.SSID() == SSID_Cam2) {
Serial.println(F("\nVerbunden mit Cam2")); //Beatfoxx
ServerName.replace(ServerName, ServerName2);
Serial.println(ServerName);
Serial.println(WiFi.localIP());
} else {
if (WiFi.SSID() == SSID_Cam1) {
Serial.println(F("\nVerbunden mit Cam1")); //SJ4000
ServerName.replace(ServerName, ServerName1);
Serial.println(ServerName);
Serial.println(WiFi.localIP());
}
}
}
} else {
Serial.println("WLAN nicht verbunden!");
}
delay(1000);
}
void VideoAN_F() { //Mit dieser Klammer wird die Funktion VideoAn_F geöffnet.
TastStatus1 = digitalRead(TastViAn); //Hier wird der Pin D6 ausgelesen (Befehl:digitalRead). Das Ergebnis wird unter der Variable „TastStatus1“ mit dem Wert „HIGH“ für 5Volt oder „LOW“ für 0Volt gespeichert.
if (TastStatus1 == HIGH) //Verarbeitung: Wenn der Taster gedrückt ist (Das Spannungssignal ist hoch)
{ //Programmabschnitt des IF-Befehls öffnen.
digitalWrite(LEDVideo, HIGH); //dann soll die LED leuchten
/*
snprintf(buf, sizeof(buf), "%s%s", ServerName, VideoFunc);
Serial.println(buf);
*/
String VideoUmschalter = ServerName+VideoFunc;
// GET Übergaben
//http.begin(client, buf);
http.begin(client, VideoUmschalter);
{
delay(300);
Serial.println("Ich schalte auf Videofunktion um... ");
}
// HTTP GET request senden
int httpResponseCode5 = http.GET();
if (httpResponseCode5 > 0) {
Serial.print("Videofunktion an! ");
//Serial.println(httpResponseCode5);
String payload = http.getString();
//Serial.println(payload);
} else {
Serial.print("Error code: ");
Serial.println(httpResponseCode5);
}
/*
snprintf(buf, sizeof(buf), "%s%s", ServerName, VideoAn);
Serial.println(buf);
*/
// GET Übergaben
//http.begin(client, buf);
String VideoAnschalter = ServerName+VideoAn;
http.begin(client, VideoAnschalter);
{
delay(300);
Serial.println("Aufnahme wird gestartet... ");
}
// HTTP GET request senden
int httpResponseCode6 = http.GET();
if (httpResponseCode6 > 0) {
Serial.print("Aufnahme läuft! ");
//Serial.println(httpResponseCode6);
String payload = http.getString();
//Serial.println(payload);
} else {
Serial.print("Error code: ");
Serial.println(httpResponseCode6);
}
http.end();
} //Programmabschnitt des IF-Befehls schließen.
} //Mit dieser letzten Klammer wird die Funktion VideoAn_F geschlossen.
void VideoAUS_F() { //Mit dieser Klammer wird die Funktion VideoAus_F geöffnet.
TastStatus2 = digitalRead(TastViAus); //Hier wird der Pin D7 ausgelesen (Befehl:digitalRead). Das Ergebnis wird unter der Variable „TastStatus2“ mit dem Wert „HIGH“ für 5Volt oder „LOW“ für 0Volt gespeichert.
if (TastStatus2 == HIGH) //Verarbeitung: Wenn der Taster gedrückt ist (Das Spannungssignal ist hoch)
{ //Programmabschnitt des IF-Befehls öffnen.
digitalWrite(LEDVideo, LOW); //dann soll die LED ausgehen
/* snprintf(buf, sizeof(buf), "%s%s", ServerName, VideoFunc);
Serial.println(buf);
*/
// GET Übergaben
//http.begin(client, buf);
String VideoUmschalter = ServerName+VideoFunc;
http.begin(client, VideoUmschalter);
{
delay(300);
Serial.println("Ich schalte auf Videofunktion um...");
}
// HTTP GET request senden
int httpResponseCode3 = http.GET();
if (httpResponseCode3 > 0) {
Serial.print("Videofunktion an! ");
//Serial.println(httpResponseCode3);
String payload = http.getString();
//Serial.println(payload);
} else {
Serial.print("Error code: ");
Serial.println(httpResponseCode3);
}
/*
snprintf(buf, sizeof(buf), "%s%s", ServerName, VideoAus);
Serial.println(buf);
*/
// GET Übergaben
//http.begin(client, buf);
String VideoAusschalter = ServerName+VideoAus;
http.begin(client, VideoAusschalter);
{
delay(300);
Serial.println("Aufnahme wird beendet... ");
}
// HTTP GET request senden
int httpResponseCode4 = http.GET();
if (httpResponseCode4 > 0) {
Serial.print("Aufnahme beendet! ");
//Serial.println(httpResponseCode4);
String payload = http.getString();
//Serial.println(payload);
} else {
Serial.print("Error code: ");
Serial.println(httpResponseCode4);
}
// Free resources
http.end();
}
} //Mit dieser letzten Klammer wird die Funktion VideoAus_F geschlossen.
void Foto_F() { //Mit dieser Klammer wird die Funktion Foto_F geöffnet.
TastStatus3 = digitalRead(TastFoto); //Hier wird der Pin D8 ausgelesen (Befehl:digitalRead). Das Ergebnis wird unter der Variable „TastStatus3“ mit dem Wert „HIGH“ für 5Volt oder „LOW“ für 0Volt gespeichert.
if (TastStatus3 == HIGH) //Verarbeitung: Wenn der Taster gedrückt ist (Das Spannungssignal ist hoch)
{ //Programmabschnitt des IF-Befehls öffnen.
digitalWrite(LEDVideo, LOW); //dann soll die LED ausgehen
// GET Übergaben
/*
snprintf(buf, sizeof(buf), "%s%s", ServerName, VideoAus);
Serial.println(buf);
*/
// GET Übergaben
//http.begin(client, buf); // zur Sicherheit falls Videoaufnahme läuft
String VideoAusschalter = ServerName+VideoAus;
http.begin(client, VideoAusschalter);
{
delay(300);
Serial.println("Ich stoppe zur Sicherheit Videoaufnahme... ");
}
// HTTP GET request senden
int httpResponseCode0 = http.GET();
if (httpResponseCode0 > 0) {
Serial.print("Videoaufnahme beendet! ");
//Serial.println(httpResponseCode0);
String payload = http.getString();
//Serial.println(payload);
} else {
Serial.print("Error code: ");
Serial.println(httpResponseCode0);
}
/*
snprintf(buf, sizeof(buf), "%s%s", ServerName, FotoFunc);
Serial.println(buf);
*/
// GET Übergaben
//http.begin(client, buf);
String FotoUmschalter = ServerName+FotoFunc;
http.begin(client, FotoUmschalter);
{
delay(300);
Serial.println("Ich schalte auf Fotofunktion um... ");
}
// HTTP GET request senden
int httpResponseCode1 = http.GET();
if (httpResponseCode1 > 0) {
Serial.print("Fotofunktion an! ");
//Serial.println(httpResponseCode1);
String payload = http.getString();
//Serial.println(payload);
} else {
Serial.print("Error code: ");
Serial.println(httpResponseCode1);
}
/*
snprintf(buf, sizeof(buf), "%s%s", ServerName, FotoAn);
Serial.println(buf);
*/
// GET Übergaben
//http.begin(client, buf);
String FotoAnschalter = ServerName+FotoAn;
http.begin(client, FotoAnschalter);
{
delay(100);
Serial.println("Ich mache ein Foto... ");
}
// HTTP GET request senden
int httpResponseCode2 = http.GET();
if (httpResponseCode2 > 0) {
Serial.print("Foto aufgenommen! ");
//Serial.println(httpResponseCode2);
String payload = http.getString();
//Serial.println(payload);
} else {
Serial.print("Error code: ");
Serial.println(httpResponseCode2);
}
// Free resources
http.end();
} //Programmabschnitt des IF-Befehls schließen.
} //Mit dieser letzten Klammer wird die Funktion Foto_F geschlossen.
void loop() {
WLANScan();
VideoAN_F();
VideoAUS_F();
Foto_F();
if (WiFi.SSID() == SSID_OTA1) ArduinoOTA.handle(); // OTA abhandeln
}
Nachdem mich der Forumbot so nett angeschrieben, versucht hatte mich zu ermuntern doch mal meinen ersten Beitrag zu verfassen und ich mich auch mal bedanken wollte, kommt hier nun mein erster Beitrag.
Zu meinem Projekt:
Nachdem die damals beigefügte Fernbedienung meiner SJ 4000 ihren Geist aufgegeben hatte und es scheinbar keinen Ersatz zu geben schien, entschloss ich mich etwas mit einem ESP in Angriff zu nehmen. Da ich wusste das die Kamera auch über den Browser via http get request zu steuern ist, habe ich mich hier und anderswo belesen.
Die Idee war die Kamera, welche sich auf meinem Helm befindet mittels Taster an meinem Quad und einer WLAN-Verbindung zu steuern. (Video starten/beenden, Foto aufnehmen).
Zu mir, ich habe eigentlich überhaupt keine Ahnung von Programmierung, wo ich "fortgeschrittene" Anfängerkenntnisse ist im php-scripten, das half mir aber nur insoweit, das mir die Klammerstruktur bekannt vorkam, ich also wusste bzw. annahm, wo welche Klammer geöffnet oder geschlossen werden und wo welcher Codeschnipsel hingehören musste. Meine Vorgehensweise ist im folgendermaßen, ich suche etwas, was im Kern annähernd zu meinem Projekt passt, baue es auf, teste es und funktioniert es, lese, lese und nochmals lese und erweitere es Stück für Stück und versuche zu begreifen woran es scheitert... (was sehr oft war)
Daher weiss ich auch garnicht mehr bei wem ich mich hier alles bdeanken sollte, weil ich meinen Codeschnipsel, meist aus den unterschiedlichsten Projekten "zusammengklaut", modifiziert und eingebaut wurden. Dennoch möchte ich ein großes Danke sagen, da mein Projekt ohne all den aktiven und hilfsbereiten Mitgliedern hier nicht machbar gewesen wäre.
Verbaut wurde:
- 1 x D1 Mini NodeMCU mit ESP8266
- 3 x Taster mit je 1 x 1KOhm Widerstand geerdet (Pulldown)
- 1 x Kontroll LED
- 1x 12 auf 5 V Spannungswandler als Spannungsquelle
Vielleicht sucht ja jemand genau sowas und kann es sich nachbauen, es funktioniert und kann auch angepasst werden. Für mich erfüllt es auch soweit meine Bedürfnisse, eventuell setze ich mich auch nochmals davor und werde noch ein paar Stunden damit verbringen, zu versuchen die LED blinken zu lassen, wenn die WLAN-Verbindung zur Kamera verloren geht.
Wie gesagt, wenn jemand nen Codeschnipsel von sich erkennt -- Danke.
Aja vielleicht eine Bitte noch an alle aktiven Experten, vielleicht hat ja der ein oder andere Zeit mal drüber zu schauen und mir eventuell nen Tip geben, falls da noch etwas einzukürzen oder zu verbessern gebe?!
MfG André
PS: Ich werd mal die Tage ein zwei Bilder machen, wie ichs verbaut habe.
