#include #include const char* ssid = "goprohero4"; //Your Wifi name (SSID) const char* password = "password"; //Your WiFi password //Do not modify below this line// const char* host = "10.5.5.9"; //GoPro Hero 4 IP Address //Create variables for 1 channels (can be modified for multiple channels) int RXCH[1]; volatile int RXSG[1]; int RXOK[1]; int PWMSG[1]; int PPMPin = 0; //Input pin of PPM signal (Does not need to be PWM input) int triggerState = 0; int lastTriggerState = 0; int resetCountAt = 10; int pressTimer = 0; int videoStarted = 0; int cammode = 0; //Stores GoPro Camera Mode void setup() { //Start communication to serial port Serial.begin(115200); delay(100); RXCH[0] = PPMPin; //PPM Input Pin pinMode(RXCH[0], INPUT); //Wifi Connect Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void RequestGoProURL(String GoProURL) { WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } //String url = "/gp/gpControl/command/mode?p=2"; client.print(String("GET ") + GoProURL + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); return; } void loop() { // Read RX values for (int i = 0; i < 1; i++){ //for each of the 6 channels: RXSG[i] = pulseIn(RXCH[i], HIGH, 20000); //read the receiver signal if (RXSG[i] == 0) {RXSG[i] = RXOK[i];} else {RXOK[i] = RXSG[i];} //if the signal is good then use it, else use the previous signal PWMSG[i] = map(RXSG[i], 1000, 2000, 0, 511); //substitute the high values to a value between 0 and 511 constrain (PWMSG[i], 0, 511); //make sure that the value stays within the disired boundries // Read trigger state if (PWMSG[0] <= 255) { triggerState = 0; } if (PWMSG[0] >= 256) { triggerState = 1; pressTimer = pressTimer + 1; } if (triggerState != lastTriggerState) { if (triggerState == 0) { if (pressTimer >= 5) { Serial.print("Mode Change To: "); if (cammode == 0) { Serial.print("Photo\r\n"); RequestGoProURL("/gp/gpControl/command/mode?p=1"); cammode = 1; } else if (cammode == 1) { Serial.print("Multishot\r\n"); RequestGoProURL("/gp/gpControl/command/mode?p=2"); cammode = 2; } else if (cammode == 2) { Serial.print("Video\r\n"); RequestGoProURL("/gp/gpControl/command/mode?p=0"); cammode = 0; } else //cammode not exist { Serial.print("Reset to Video"); RequestGoProURL("/gp/gpControl/command/mode?p=0"); } } else { Serial.print("Trigger\r\n"); String baseurl = "/gp/gpControl/command/shutter?p="; String triggerType = "1"; if(videoStarted == 1) { triggerType = "0"; videoStarted = 0; } else { triggerType = "1"; if(cammode == 0) { videoStarted = 1; } } RequestGoProURL(baseurl + triggerType); } pressTimer = 0; } if (triggerState == 1){Serial.print("On\r\n");} } // Print RX values //Serial.print(" || Ch: "); //Serial.print(i+1); //Serial.print(" / PWMSG: "); //Serial.print(PWMSG[i]); //Serial.println(); if(pressTimer > 0){Serial.print(pressTimer);Serial.println();} //Serial.print(" / RXSG: "); //Serial.print(RXSG[i]); delay(100); lastTriggerState = triggerState; } }