Hello Experts,
i need support, i am working on project which will perform the below,
- Control the light using LDR sensor with the help of relays to connect to high voltage
- Control Pump motor On and Off State
- the arduino is connected to router using ethernet shield with web page which enable controlling the previous mentioned cases
the Issue
the LDR is working without no issues, however the webpage some times is working and sometimes not , i donot know the actual reason for this...
it is working once i power it ON but after some time the the ping is not working nor the webpage
i am using SD card as well for two images that is displayed on the webpage
this is my code on the arduino
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ 60
// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 10); // IP address, may need to change depending on network
byte subnet[] = { 255, 255, 255, 0 };
IPAddress gateway(192, 168, 1, 1); // assign Gateway to the ethernet
IPAddress dns(8, 8, 8, 8);
EthernetServer server(80); // create a server at port 80
File webFile; // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = { 0 }; // buffered HTTP request stored as null terminated string
char req_index = 0; // index into HTTP_req buffer
boolean LED_state[2] = { 0 }; // stores the states of the LEDs
int sensorReading = 0;
int LDR = 0;
int Interrupt = 0;
int Motor_state = 0;
int Night_counter=0 ;
int Day_counter=0 ;
void setup()
{
// disable Ethernet chip
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);
SD.begin(4); // initializing SD card for usage
// Serial.begin(9600); // for debugging
// initialize SD card
// Serial.println("Initializing SD card...");
// if (!SD.begin(4)) {
// Serial.println("ERROR - SD card initialization failed!");
// return; // init failed
// }
// Serial.println("SUCCESS - SD card initialized.");
// // check for index.htm file
// if (!SD.exists("index.htm")) {
// Serial.println("ERROR - Can't find index.htm file!");
// return; // can't find index file
// }
// Serial.println("SUCCESS - Found index.htm file.");
// switches
pinMode(2, INPUT);
pinMode(3, INPUT);
// LEDs
pinMode(8, OUTPUT); // to force light on in the morning ,, it can be connected to ULN2003 and same output point as pin 5
pinMode(5, OUTPUT); // Normal LDR relay
pinMode(6, OUTPUT); // to force light off in the morning
pinMode(7, OUTPUT); // used to turn ON motor
pinMode(A5, OUTPUT); // used to turn OFF motor
pinMode(A4, OUTPUT); // used as help to make one relay up and ethernet chip start working while some relay is up
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
digitalWrite(7, HIGH);
digitalWrite(A5, HIGH);
digitalWrite(A4, HIGH);
// Ethernet.begin(mac, ip); // initialize Ethernet device
Ethernet.begin(mac,ip,gateway,subnet);
server.begin(); // start to listen for clients
}
void loop()
{
LDR_Reading();
MotorInputState();
digitalWrite(A4, LOW);
EthernetClient client = server.available(); // try to get client
if (client) { // got client?
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) { // client data available to read
char c = client.read(); // read 1 byte (character) from client
// limit the size of the stored received HTTP request
// buffer first part of HTTP request in HTTP_req array (string)
// leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
if (req_index < (REQ_BUF_SZ - 1)) {
HTTP_req[req_index] = c; // save HTTP request character
req_index++;
}
// last line of client request is blank and ends with \n
// respond to client only after last line received
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
// remainder of header follows below, depending on if
// web page or XML page is requested
// Ajax request - send XML file
if (StrContains(HTTP_req, "motor.jpg")) {
webFile = SD.open("motor.jpg");
client.println("Cache-Control: public,max-age=31536000,immutable");
client.println("Content-Type: image/jpeg");
client.println("Connection: keep-alive");
client.println();
if (webFile) {
while (webFile.available()) {
client.write(webFile.read()); // send web page to client
}
webFile.close();
}
}
else if (StrContains(HTTP_req, "lamp.jpg")) {
webFile = SD.open("lamp.jpg");
client.println("Cache-Control: public,max-age=31536000,immutable");
client.println("Content-Type: image/jpeg");
client.println("Connection: keep-alive");
client.println();
if (webFile) {
while (webFile.available()) {
client.write(webFile.read()); // send web page to client
}
webFile.close();
}
}
else if (StrContains(HTTP_req, "ajax_inputs")) {
// send rest of HTTP header
client.println("Content-Type: text/xml");
client.println("Connection: keep-alive");
client.println();
SetLEDs();
// send XML file containing input states
XML_response(client);
}
else { // web page request
// send rest of HTTP header
client.println("Content-Type: text/html");
client.println("Connection: keep-alive");
client.println();
// send web page
webFile = SD.open("index.htm"); // open web page file
if (webFile) {
while (webFile.available()) {
client.write(webFile.read()); // send web page to client
}
webFile.close();
}
}
// display received HTTP request on serial port
// Serial.print(HTTP_req);
// reset buffer index and all buffer elements to 0
req_index = 0;
StrClear(HTTP_req, REQ_BUF_SZ);
break;
}
// every line of text received from the client ends with \r\n
if (c == '\n') {
// last character on line of received text
// starting new line with next character read
currentLineIsBlank = true;
}
else if (c != '\r') {
// a text character was received from client
currentLineIsBlank = false;
}
} // end if (client.available())
} // end while (client.connected())
delay(1); // give the web browser time to receive the data
client.stop(); // close the connection
} // end if (client)
// check the Input values
LDR_State_Checker();
}
void LDR_Reading(void)
{
int ldr = A0;
sensorReading = analogRead(ldr);
}
void LDR_State_Checker(void)
{
if (sensorReading < 300 && Interrupt == 0)
{ // LED_state[0] = 1; // save LED state
Night_counter++ ;
LED_state[0] = 1;
LDR = 1;
if (Night_counter > 5000) {digitalWrite(5, LOW); //Makes the LED glow in Dark
}
}
else if (sensorReading > 300 && Interrupt == 0)
{ // LED_state[0] = 0; // save LED state
Day_counter++;
LED_state[0] = 0;
LDR = 0;
if (Day_counter > 5000) {digitalWrite(5, HIGH); //Turns the LED OFF in Light.
}
}
if (Day_counter == 8000){
Day_counter = 0;
}
if (Night_counter == 8000){
Night_counter = 0;
}
}
void MotorInputState(void)
{
int MotorInputReading = digitalRead(3);
if (MotorInputReading == 1)
{
LED_state[1] = 1;
Motor_state = 1;
}
else if (MotorInputReading == 0)
{
LED_state[1] = 0;
Motor_state = 0;
}
}
// checks if received HTTP request is switching on/off LEDs
// also saves the state of the LEDs
void SetLEDs(void)
{
// LED 1 (pin 6)
if (StrContains(HTTP_req, "LED1=1") && LDR == 1) {
LED_state[0] = 1; // save LED state
digitalWrite(6, HIGH); // will make LDR continue working at night
Interrupt = 0;
}
else if (StrContains(HTTP_req, "LED1=1") && LDR == 0) {
LED_state[0] = 1; // save LED state
digitalWrite(8, LOW); // will force light to turn up at daylight by admin
Interrupt = 1;
}
else if (StrContains(HTTP_req, "LED1=0") && LDR == 1) {
LED_state[0] = 0; // save LED state
digitalWrite(6, LOW); // will turn on the light at night by admin
Interrupt = 1;
}
else if (StrContains(HTTP_req, "LED1=0") && LDR == 0) {
LED_state[0] = 0; // save LED state
digitalWrite(8, HIGH);
Interrupt = 0;
}
// LED 2 (pin 7)
if (StrContains(HTTP_req, "LED2=1") && Motor_state == 0) { // here to control web page to power on motor by contacting relay 3 sec then disconnect it
LED_state[1] = 1; // save LED state for revealing this motor state on the webpage
Motor_state == 1; // bec the next connection need the actual state of the motor in the program
digitalWrite(7, LOW);
delay(2000);
digitalWrite(7, HIGH);
}
else if (StrContains(HTTP_req, "LED2=1") && Motor_state == 1) {
LED_state[1] = 1; // save LED state
Motor_state == 1;
}
else if (StrContains(HTTP_req, "LED2=0") && Motor_state == 1) {
LED_state[1] = 0; // save LED state for revealing this motor state on the webpage
Motor_state == 0; // bec the next connection need the actual state of the motor in the program
digitalWrite(A5, LOW);
delay(2000);
digitalWrite(A5, HIGH);
}
else if (StrContains(HTTP_req, "LED2=0") && Motor_state == 0) {
LED_state[1] = 0; // save LED state
Motor_state == 0;
}
}
// send the XML file with analog values, switch status
// and LED status
void XML_response(EthernetClient cl)
{
int analog_val; // stores value read from analog inputs
int count; // used by 'for' loops
int sw_arr[] = { 2, 3 }; // pins interfaced to switches
cl.print("<?xml version = \"1.0\" ?>");
cl.print("<inputs>");
// checkbox LED states
// LED1
cl.print("<LED>");
if (LED_state[0] == 1) {
cl.print("checked");
}
else if (LED_state[0] == 0) {
cl.print("unchecked");
}
cl.println("</LED>");
// button LED states
// LED3
cl.print("<LED>");
if (LED_state[1]) {
cl.print("on");
}
else {
cl.print("off");
}
cl.println("</LED>");
cl.print("</inputs>");
}
// sets every element of str to 0 (clears array)
void StrClear(char* str, char length)
{
for (int i = 0; i < length; i++) {
str[i] = 0;
}
}
// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char* str, char* sfind)
{
char found = 0;
char index = 0;
char len;
len = strlen(str);
if (strlen(sfind) > len) {
return 0;
}
while (index < len) {
if (str[index] == sfind[found]) {
found++;
if (strlen(sfind) == found) {
return 1;
}
}
else {
found = 0;
}
index++;
}
return 0;
}
</>
And the below is the SD web page file
<!DOCTYPE html>
<html>
<head>
<title>Arduino Ajax LED Button Control</title>
<script>
strLED1 = "";
strLED2 = "";
var LED2_state = 0;
function GetArduinoIO()
{
nocache = "&nocache=" + Math.random() * 1000000;
var request = new XMLHttpRequest();
request.onreadystatechange = function()
{
if (this.readyState == 4) {
if (this.status == 200) {
if (this.responseXML != null) {
// XML file received - contains analog values, switch values and LED states
var count;
// LED 1
if (this.responseXML.getElementsByTagName('LED')[0].childNodes[0].nodeValue === "checked") {
document.LED_form.LED1.checked = true;
}
else {
document.LED_form.LED1.checked = false;
}
// LED 2
if (this.responseXML.getElementsByTagName('LED')[1].childNodes[0].nodeValue === "on") {
document.getElementById("LED2").innerHTML = "LED 2 is ON (D7)";
LED2_state = 1;
}
else {
document.getElementById("LED2").innerHTML = "LED 2 is OFF (D7)";
LED2_state = 0;
}
}
}
}
}
// send HTTP GET request with LEDs to switch on/off if any
request.open("GET", "ajax_inputs" + strLED1 + strLED2 + nocache, true);
request.send(null);
setTimeout('GetArduinoIO()', 1000);
strLED1 = "";
strLED2 = "";
}
// service LEDs when checkbox checked/unchecked
function GetCheck()
{
if (LED_form.LED1.checked) {
strLED1 = "&LED1=1";
}
else {
strLED1 = "&LED1=0";
}
}
function GetButton1()
{
if (LED2_state === 1) {
LED2_state = 0;
strLED2 = "&LED2=0";
}
else {
LED2_state = 1;
strLED2 = "&LED2=1";
}
}
</script>
<style>
.IO_box {
float: left;
margin: 0 20px 20px 0;
border: 1px solid blue;
padding: 0 5px 0 5px;
width: 120px;
}
h1 {
font-size: 120%;
color: blue;
margin: 0 0 10px 0;
}
h2 {
font-size: 85%;
color: #5734E6;
margin: 5px 0 5px 0;
}
p, form, button {
font-size: 80%;
color: #252525;
}
.small_text {
font-size: 70%;
color: #737373;
}
</style>
</head>
<body onload="GetArduinoIO()">
<h1>Arduino Ajax LED Button Control</h1>
<div class="IO_box">
<h2>LED Using Checkbox</h2>
<form id="check_LEDs" name="LED_form">
<input type="checkbox" name="LED1" value="0" onclick="GetCheck()" />Motor is OFF click to turn ON<br /><br />
</form>
</div>
<div class="IO_box">
<h2>Light Status</h2>
<button type="button" id="LED2" onclick="GetButton1()">Light is OFF Click to turn ON</button><br /><br />
</div>
</body>
</html>