Hello,
I have a very strange problem.
Using the JSON Webclient example i can communicate with my Webservice application, i can retrieve the JSON information.
Based on the result of this information i want to set a digital Pin to High.
This is where the code breaks down.
As soon as i call digitalWrite(RELAY_1, HIGH); after executing the Webclient query, the HTTP GET request fails with a HTTP404 error.
I cant understand why this happens, surly executing the digital write after the HTTP GET request would have no implications on the HTTP GET request.
I have re-written my code several times, i have researched and tried to debug this for 2 straight days. i don't come asking for help without trying myself.
Please see the code snippet below.
Thank you.
#include <ArduinoJson.h>
#include <Ethernet2.h>
#include <SPI.h>
//DEFINE GLOBALS
const char* _machine_id = "001"; //Unit Machine ID
unsigned long v_update_time = 3000; //Webservice Polling Time (ms)
unsigned long v_last_update_time = 0; //Place holder for Last Refresh Time
String v_state; // Current Machine State
IPAddress v_WebService(<REDACTED>); //Webservice IP
#define RELAY_1 5 //Relay 1 ID RED
#define RELAY_2 6 //Relay 2 ID ORANGE
#define RELAY_3 7 //Relay 3 ID GREEN
#define RELAY_4 8 //Relay 4 ID BLUE
EthernetClient client; //Ethernet client connection
void setup() {
//Disable the SD Card
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
//Setup the relays
pinMode(RELAY_1, OUTPUT);
pinMode(RELAY_2, OUTPUT);
pinMode(RELAY_3, OUTPUT);
pinMode(RELAY_4, OUTPUT);
//Inital Set Relays Low
digitalWrite(RELAY_1, HIGH);
digitalWrite(RELAY_2, HIGH);
digitalWrite(RELAY_3, HIGH);
digitalWrite(RELAY_4, HIGH);
//Initialise the serial port
Serial.begin(9600);
while (!Serial) continue;
Test_Lights(); //Initialise Lights
// Initialize Ethernet library
byte mac[] = {<REDACTED>};
if (!Ethernet.begin(mac)) {
Serial.println(F("Failed to configure Ethernet"));
return;
}
delay(1000);
Serial.println(F("Connecting..."));
// Connect to HTTP server
client.setTimeout(10000);
// Disconnect
//client.stop();
}
void loop() {
delay(3000);
v_state = GetMCStatus(); // Call Inital Status UpDate
Serial.println(F("Status Update Done"));
Serial.println(F("Updating Relay..."));
digitalWrite(RELAY_2, HIGH); //*TEST* THIS BREAKS THE HTTP GET!!!!!!!! HELP!!!
//SetRelays(); //THIS ALSO BREAKS THE HTTP GET!!!!!!!! HELP!!!
}
String GetMCStatus() {
char* v_temp_state;
client.stop();
client.setTimeout(10000);
if (!client.connect(v_WebService, 80)) {
Serial.println(F("Connection failed"));
return;
}
Serial.println(F("Connected!"));
// Send HTTP request
client.println(F("GET <REDACTED> HTTP/1.0"));
client.println("Host: " + v_WebService);
client.println(F("Connection: close"));
if (client.println() == 0) {
Serial.println(F("Failed to send request"));
return;
}
// Check HTTP status
char status[32] = {0};
client.readBytesUntil('\r', status, sizeof(status));
if (strcmp(status, "HTTP/1.1 200 OK") != 0) {
Serial.print(F("Unexpected response: "));
Serial.println(status);
return;
}
// Skip HTTP headers
char endOfHeaders[] = "\r\n\r\n";
if (!client.find(endOfHeaders)) {
Serial.println(F("Invalid response"));
return;
}
// Allocate JsonBuffer
// Use arduinojson.org/assistant to compute the capacity.
const size_t capacity = JSON_OBJECT_SIZE(2) + 30;
DynamicJsonBuffer jsonBuffer(capacity);
// Parse JSON object
JsonObject& root = jsonBuffer.parseObject(client);
if (!root.success()) {
Serial.println(F("Parsing failed!"));
return;
}
// Extract values
v_temp_state = root["State"].as<char*>();
Serial.println(F("Response:"));
Serial.println(root["MachineID"].as<char*>());
Serial.println(root["State"].as<char*>());
delay(500);
v_last_update_time = millis(); //Set to current system timeer value
return String(v_temp_state);
}
void SetRelays()
{
int v_run_state = -1; //Set runs code to integer
if(v_state == "RUN")
{
v_run_state = 1;
}
else if (v_state == "WAIT")
{
v_run_state = 2;
}
else if (v_state == "STOP")
{
v_run_state = 0;
}
else if (v_state == "TEST")
{
v_run_state = 3;
}
switch(v_run_state) //set becon light based on status
{
case 2:
digitalWrite(RELAY_4, LOW);
digitalWrite(RELAY_3, LOW);
digitalWrite(RELAY_2, HIGH);
digitalWrite(RELAY_1, LOW);
Serial.println("Relay 2 set.");
break;
case 1:
digitalWrite(RELAY_4, LOW);
digitalWrite(RELAY_3, LOW);
digitalWrite(RELAY_2, LOW);
digitalWrite(RELAY_1, HIGH);
Serial.println("Relay 1 set.");
break;
case 0:
digitalWrite(RELAY_4, LOW);
digitalWrite(RELAY_3, HIGH);
digitalWrite(RELAY_2, LOW);
digitalWrite(RELAY_1, LOW);
Serial.println("Relay 3 set.");
break;
case 3:
digitalWrite(RELAY_4, HIGH);
digitalWrite(RELAY_3, LOW);
digitalWrite(RELAY_2, LOW);
digitalWrite(RELAY_1, LOW);
Serial.println("Relay 4 set.");
break;
default:
digitalWrite(RELAY_4, LOW);
digitalWrite(RELAY_3, LOW);
digitalWrite(RELAY_2, LOW);
digitalWrite(RELAY_1, LOW);
}
}
void Test_Lights()
{
delay(1000);
//Turn all Relays off
digitalWrite(RELAY_4, LOW);
digitalWrite(RELAY_3, LOW);
digitalWrite(RELAY_2, LOW);
digitalWrite(RELAY_1, LOW);
//Sequence test
digitalWrite(RELAY_4, HIGH);
delay(100);
digitalWrite(RELAY_4, LOW);
delay(100);
digitalWrite(RELAY_3, HIGH);
delay(100);
digitalWrite(RELAY_3, LOW);
delay(100);
digitalWrite(RELAY_2, HIGH);
delay(100);
digitalWrite(RELAY_2, LOW);
delay(100);
digitalWrite(RELAY_1, HIGH);
delay(100);
digitalWrite(RELAY_1, LOW);
delay(1000);
//Turn all Relays on
digitalWrite(RELAY_4, HIGH);
digitalWrite(RELAY_3, HIGH);
digitalWrite(RELAY_2, HIGH);
digitalWrite(RELAY_1, HIGH);
delay(1000);
//Turn all Relays off
digitalWrite(RELAY_4, LOW);
digitalWrite(RELAY_3, LOW);
digitalWrite(RELAY_2, LOW);
digitalWrite(RELAY_1, LOW);
}